← reconciliation report · audit trail

Implementation ADR — Self-updating Reconciliation Dashboard

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.

Status: ACCEPTED (design) Date: 2026-07-14 Scope: opendeviationbar-py Step 1: laptop only

Context — the problem

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.

Decision

Build a self-updating page from three engines feeding one source-of-truth HTML file:

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.

Flowchart

launchd timer · LAPTOP · every 5 minutes On EON network? Tailscale up · bigblack reachable NO exit silently — nothing runs YES ENGINE A · COLLECT (deterministic, no AI) • parse every campaign HTML → status / verdict • scan all ccmax-claude procs + bigblack loops • list git worktrees + staleness heuristics state.json facts + verdicts + coach store ASYNC FEEDERS (own triggers) ENGINE B · JUDGE — daily Claude scores fuzzy calls → verdicts ENGINE C · COACH — per session Claude grades your prompts → lessons RENDER (templating, no AI) → ONE index.html · the SSoT file GIT — never commits to main fetch → reset --hard → regenerate → commit → push → ensure ONE open PR (on-host gh) → you squash-merge when back DEPLOY — rsync over Tailscale → bigblack:/home/nasimubd/sites/opendeviationbar-py/ reconciliation/ (sibling of dashboard/ — never --deleted) SERVE — Caddy → Cloudflare zero-trust → You odb.epatner.com · authorized personnel only

Consequences

KindDetail
PositiveAlways-fresh; honest (separates running from working); actionable (red = your decisions, click-through to evidence); safe by construction; self-improving via the coach.
CostDaily + per-session model tokens (scoped to keep it cheap); the 5-min / 15-min path is deterministic and ~free.
ComplexityTwo 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.

Alternatives considered

Build order — Step 1 is laptop-only (safe)

  1. scripts/reconcile/{collect,render,judge,coach} + the prompt-quality rubric + a secret-redaction pass.
  2. mise reconcile namespace: collect · render · judge · coach · deploy · run · doctor · check-full + .claude/commands/reconcile/* wrappers.
  3. Git/PR "ensure exactly one open PR" helper (idempotent, on-host gh).
  4. [operator go] laptop launchd 5-min agent (EON-gated) + wire the Coach into the session-monitor Stop hook.
  5. [operator go] bigblack systemd 15-min + daily judge timers + create the protected deploy dir.

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.

Reference: reconciliation report · audit trail (hub-and-spoke) · end-to-end diagram
Implementation ADR · reconciliation dashboard · opendeviationbar-py · 2026-07-14.