Plan only — nothing is being built yet. Gera reviews this, then we act.
2026-08-30 · requested by Gera in the Smith thread · plan owner: Smith
The change: when Smith kicks off work in a thread, the post shrinks to one line + one agentflow link. The full phase table (summary / started / agents / temporal / plan / PR / review / merged / deployed / post-updates / verdict) stops being posted into Slack and instead renders inside the /agents close-up page for that task, live. Slack carries the pointer; agentflow carries the state.
Kickoff posts an 11-row markdown table into the thread. It is a snapshot: stale the moment it posts, re-posted wholesale to update, and on threads with no bound task it renders 11 rows of "no signal" noise (the exact post Gera linked). One copy per thread, no single place to watch.
Kickoff posts: Kicked off <task> — track it here: propflowai.co/agents?item=<sid>. The close-up page grows a Phases card that renders the same 11 rows from the live event log — always current, one URL per task, same place the Decisions tab already lives.
agent-smith/src/agent_smith/phase_table.py — 11 rows resolved from a per-task EventLog (task_events.py) + evidence (PR events, deploy probe via deploy_state.py, post-updates receipts, verdict/closure). The renderer is Slack-markdown; the resolution logic is already separate from the rendering, which is what makes this move cheap.phase_table.session_cell deliberately refuses to emit an /agents deep link when the thread has no registered session — a Smith reply turn is ephemeral, no roster row, so a link would be dead by construction. That doctrine is the hard constraint this plan is built around.?item=<sid>), a Decisions tab, and a Preview card — there is an existing pattern for adding a card to the close-up.Unverified inference, to confirm in step 0: the exact transport the /agents board uses to read mini-side state (roster sync vs API). The plan's data-path step depends on which it is.
| # | Step | Where | What |
|---|---|---|---|
| 0 | Discovery (½ day) | — | Confirm how the /agents close-up reads state today (roster store vs API), and pick the phase-snapshot transport: preferred shape is agent-smith publishing a phase snapshot row per task (JSON, versioned) that the board reads — signals, not scraping, per ADR-0003. |
| 1 | Binding rule | agent-smith | A kickoff that starts real work must bind the thread to a task/operator sid at the moment of kickoff (start-operator already prints one). No sid → no link → the kickoff falls back to one honest line ("no task bound yet"), never a dead link and never an 11-row no-signal table. This kills the linked post's failure mode outright. |
| 2 | Phases card UI | propflowai (/agents close-up) | New card on the close-up rendering the 11 phase rows from the snapshot: same states (✅ done / 🟡 active / 🔴 blocked / — no signal), same evidence strings, PR + decision links clickable. Arsenal components, PageBody rules, drift test pinning row set ↔ phase_table.PHASES so the two ends can't diverge silently. |
| 3 | Cutover | agent-smith | Kickoff post becomes one line + one link (ONE SOURCE OF TRUTH — the Slack table path is deleted in the same PR, not left as a fallback). Thread progress updates keep working as today; only the kickoff table moves. |
start-operator printed.