Context — field experience (kntnt-extractor, 2026-07-22, orchestrate 0.16.1)
An orchestrate run is a 6–12 hour unattended process, but the only live views of its progress are inside the Claude Code TUI: the /workflows progress tree and the agent view (arrow-left). In the field this is worse than inconvenient — entering the agent view to check on progress and leaving it again is precisely the interaction that has repeatedly killed the background workflow mid-run (a compaction prompt appears on exit; by then the run is already dead — see the companion resume ticket). So today the maintainer must choose between flying blind for hours and risking the run by peeking.
What the maintainer actually needs, continuously and out of band (no TUI interaction): which issues are done, which issue is in flight, and where in its lifecycle it stands (implement / verify / fix round k of N / reconcile / integrate / parked), plus coarse run-level facts (agents spent, waves remaining).
What exists today
- The engine
log()s wave/fix-round events — but those render only in the in-session progress tree, the exact place peeking is dangerous.
- The Workflow harness already persists
journal.jsonl in the run's transcript dir, with one started/result line per agent — durable, on disk, updated live. In the 2026-07-22 recovery this journal was sufficient to reconstruct the full run state by hand (which issue landed at which SHA, which lens was outstanding).
- Workflow scripts have no filesystem access, so the engine cannot write a progress file itself; sub-agents, however, run with full tools.
Decision R1 — reporting channel(s)
(a) Deterministic status command (recommended core). A new orchestrate.py status mode that reads the run's journal.jsonl (plus the plan) and renders the current per-issue lifecycle position, timestamps, and agent counts. Zero tokens, pure code, watchable from any plain terminal (watch -n 60 …) with no TUI interaction. Requires the engine's journal entries to be self-describing — today the journal records agentId + result but the human-readable label/phase lives only in the per-agent meta.json; either the harness journals labels or status joins against the meta files.
(b) Durable GitHub milestone comments (recommended complement). Post one comment per lifecycle milestone on the issue itself — "implementation green on branch X", "verification cleared", "integrated at SHA". Visible from a phone, survives any crash, and doubles as the machine-readable landed-marker the companion resume ticket needs (shared mechanism — coordinate the format there). Sub-agents are forbidden outward writes by the operating contract, so these would be posted by the integrate step (already the authorized mutator) and/or a dedicated mechanical-tier reporter dispatch.
(c) Push notification at coarse milestones (optional). One notification per landed/parked issue and at run end.
Acceptance criteria
- During a run, the maintainer can see, from a plain terminal with zero Claude Code TUI interaction, each issue's lifecycle position (implement / verify / fix round k / reconcile / integrate / done / parked) and which issues have landed at which SHA.
- Each landed issue leaves a durable, machine-readable marker (format shared with the companion resume ticket).
- No documented progress-checking path requires opening the agent view or
/workflows.
- The status rendering is deterministic (code, not an LLM) and covered by
tests/test_orchestrate.py.
🤖 Generated with Claude Code
Context — field experience (kntnt-extractor, 2026-07-22, orchestrate 0.16.1)
An orchestrate run is a 6–12 hour unattended process, but the only live views of its progress are inside the Claude Code TUI: the
/workflowsprogress tree and the agent view (arrow-left). In the field this is worse than inconvenient — entering the agent view to check on progress and leaving it again is precisely the interaction that has repeatedly killed the background workflow mid-run (a compaction prompt appears on exit; by then the run is already dead — see the companion resume ticket). So today the maintainer must choose between flying blind for hours and risking the run by peeking.What the maintainer actually needs, continuously and out of band (no TUI interaction): which issues are done, which issue is in flight, and where in its lifecycle it stands (implement / verify / fix round k of N / reconcile / integrate / parked), plus coarse run-level facts (agents spent, waves remaining).
What exists today
log()s wave/fix-round events — but those render only in the in-session progress tree, the exact place peeking is dangerous.journal.jsonlin the run's transcript dir, with onestarted/resultline per agent — durable, on disk, updated live. In the 2026-07-22 recovery this journal was sufficient to reconstruct the full run state by hand (which issue landed at which SHA, which lens was outstanding).Decision R1 — reporting channel(s)
(a) Deterministic status command (recommended core). A new
orchestrate.py statusmode that reads the run'sjournal.jsonl(plus the plan) and renders the current per-issue lifecycle position, timestamps, and agent counts. Zero tokens, pure code, watchable from any plain terminal (watch -n 60 …) with no TUI interaction. Requires the engine's journal entries to be self-describing — today the journal recordsagentId+ result but the human-readablelabel/phaselives only in the per-agentmeta.json; either the harness journals labels orstatusjoins against the meta files.(b) Durable GitHub milestone comments (recommended complement). Post one comment per lifecycle milestone on the issue itself — "implementation green on branch X", "verification cleared", "integrated at SHA". Visible from a phone, survives any crash, and doubles as the machine-readable landed-marker the companion resume ticket needs (shared mechanism — coordinate the format there). Sub-agents are forbidden outward writes by the operating contract, so these would be posted by the integrate step (already the authorized mutator) and/or a dedicated mechanical-tier reporter dispatch.
(c) Push notification at coarse milestones (optional). One notification per landed/parked issue and at run end.
Acceptance criteria
/workflows.tests/test_orchestrate.py.🤖 Generated with Claude Code