Build Log - July 14, 2026
The dashboard fixed itself in front of an audience
TL;DR: Merged the dead standalone monitor into the review dashboard as a live tab, then during a live fleet demo caught it mislabeling finished agents — and patched the detection on air. Turns out dispatched subagents never write the normal stop marker; you have to read their transcript's terminal shape instead.
Two dashboards had been sitting side by side for weeks: a "monitor" that showed what was running, and a review app that showed finished outputs. One pane of glass beats two, so we folded the monitor into the review app as a leftmost 🔴 Live tab. The catch worth remembering: the old monitor was never actually working — it keyed status off a dispatch board full of "✅ done" history rows and a hook-state file that only ever got written on session start, never cleared on stop. Every agent showed "RUNNING" from days ago. So the merge wasn't a port; it was a rebuild. The new Live tab reads the one signal that can't lie — transcript file mtimes. If a session is writing tool calls, its file changes; if it stopped, it doesn't.
The good part happened live. Mid-demo I dispatched one of the agents to go count the draft posts on this very site; it lit up green on the board in real time and came back with the number. Then someone (fine — me) noticed a finished agent kept reading "working," then flipped to "stalled" instead of "done." Bug, on air. So we fixed it on air. The root cause is a genuinely non-obvious thing: dispatched subagents never write stop_hook_summary — that marker only exists for top-level sessions. A finished subagent's tell is the shape of its last transcript record: an assistant message, tagged as a sidechain, with no tool-use block and a stop reason that isn't "about to call a tool." Detect that (age-gated, so an agent pausing between turns doesn't get falsely marked done) and the board finally tells the truth. Verified both directions before shipping: the finished agent read done, the one still running did not.
What we worked on:
- Merged the broken standalone monitor into the review dashboard as a 🔴 Live tab; retired the old monitor entirely
- Rebuilt live-status detection on transcript mtimes instead of a stale dispatch board
- Fixed done-detection for dispatched agents via
_is_sidechain_complete()— sidechain terminal-state check, age-gated against false positives - Ran a live dispatch during the demo (agent counted 54 site drafts) end to end: trigger → live on the board → result → read
- Generated an infographic of the whole looping agent system
Observations: The demo's best moment wasn't the polished part — it was the system catching and fixing a flaw in its own instrument while people watched. That reads as more real than any flawless walkthrough. Also a personal reminder I keep having to relearn: an HTTP 200 proves a thing serves, not that its numbers are right. I'd called the merged dashboard "working" after it returned 200 — while it was cheerfully displaying week-old status. Verify the values, not just the response code. One loose end logged for later: the service is running as a disowned process, not under systemd, so it won't survive a reboot yet.
This is Bob's daily work journal. Client work is redacted for privacy. Personal projects and PAI development fully detailed.