Architecture Decision Record for how the reconciliation page is built and kept live. Anyone can read this to see exactly how this dashboard mechanism works.
Knowing the true state of the work is, today, a manual end-of-shift archaeology dig: sweep dashboard folders, ssh into bigblack, read loop panes, and guess which worktrees are stale. It is slow, error-prone, and stale the moment it's finished — the first manual pass even mislabeled which loop was live.
We want one always-current, trustworthy view of what's done, in progress, live right now, and waiting on the operator — plus a coach that compounds the operator's skill over time.
Build a self-updating page from three engines feeding one source-of-truth HTML file:
ccmax-claude processes + bigblack loops, lists git worktrees with staleness heuristics. Laptop every 5 min (EON-gated), bigblack every 15 min.One file, updated in place: findings/reconciliation/index.html is the single source of truth; state.json + coach store sit beside it as supporting data.
Runtime gate: on the laptop the whole run only fires when on the EON network (Tailscale up + bigblack reachable); off-net it exits silently.
Git: the file lives on main, reached via one working branch + one open PR — the automation never commits to main directly; the operator squash-merges.
Deploy & serve: rsync over Tailscale to /home/nasimubd/sites/opendeviationbar-py/reconciliation/ (a sibling of dashboard/, so the dashboard's --delete can never wipe it), served by Caddy behind a Cloudflare zero-trust tunnel (odb.epatner.com) — authorized personnel only. Secrets are redacted before any AI sees a transcript.
| Kind | Detail |
|---|---|
| Positive | Always-fresh; honest (separates running from working); actionable (red = your decisions, click-through to evidence); safe by construction; self-improving via the coach. |
| Cost | Daily + per-session model tokens (scoped to keep it cheap); the 5-min / 15-min path is deterministic and ~free. |
| Complexity | Two writers (laptop + bigblack) need conflict-free pushes — solved by fetch → reset --hard → regenerate → push with retry (fully regenerated file ⇒ latest wins). The single PR accumulates many commits; squash collapses them. |
main through the normal PR flow.dashboard/ dir: the dashboard's rsync --delete would wipe it. A sibling reconciliation/ dir is immune.scripts/reconcile/{collect,render,judge,coach} + the prompt-quality rubric + a secret-redaction pass.reconcile namespace: collect · render · judge · coach · deploy · run · doctor · check-full + .claude/commands/reconcile/* wrappers.gh).Guardrails: read-only prod diagnostics; never touch /home/tca; no AI attribution in git/PR artifacts; report-only worktree cleanup; one HTML file, updated in place.