Filed, deliberately not built. Follow-ons to #205 / #206.
A. Pipeline runs on the board
A pipeline run writes pipeline_runs but no board card, so a pipeline subordinate is invisible to a supervisor. Fix: mirrorRuntimeTask a pipeline.run card in lib/pipeline-run-start.ts and flip its status in workflows/pipeline-run.ts.
Deferred because it has no Coder-Lead relevance and would add a card to every pipeline agent's board — a wider blast radius than #206 for zero benefit to the stated goal.
Worth noting as the architectural test: when this lands, subordinate_status picks it up with no supervision-side change at all. That is the evidence the boundary drawn in #205 is right.
B. A plain-language progress line — the honest equivalent of the terminal tail
Even with #205 and #206, the Lead sees card titles, outcomes and step counts — not the terminal text the hardcoded Overseer reads. There is no clean way for supervision to reach that, and it must not try (see the reverted 3f14bd3).
The architecturally correct close is another domain write: have the Pilot upsert a short human summary into its own delegation card'sdescription, from the "thought" branch of the same onEvent hook #206 uses, throttled (e.g. every 5th action). The Lead then reads live progress through a generic record and still knows nothing about tmux.
This is the deliberate finish line for Overseer parity, not an oversight. Deferred pending a decision that outcomes + progress is insufficient in practice.
C. Orphan sweeper for agent_loop_runs
expireOrphanedRuntimeTasks reaps stranded instance_runtime_tasks. Nothing does the equivalent for agent_loop_runs or pipeline_runs, so a run whose Workflow died mid-step sits running forever with a stale iteration.
Both workflows have code defenses (agent-loop.ts force-closes in a catch, coding-session.ts closes on the no-runner path — "a running row nobody will ever close is worse than a failed one, because the supervisor keeps waiting"), but neither is a queryable staleness signal and neither survives an isolate death.
#205 mitigates the symptom by deriving "stalled" from last_progress_at. The structural fix is a sweeper. Note this also weakens the case for ever unifying the run tables: more write paths into one table means more ways to strand a row, and a stranded row is permanent data.
Filed, deliberately not built. Follow-ons to #205 / #206.
A. Pipeline runs on the board
A pipeline run writes
pipeline_runsbut no board card, so a pipeline subordinate is invisible to a supervisor. Fix:mirrorRuntimeTaskapipeline.runcard inlib/pipeline-run-start.tsand flip its status inworkflows/pipeline-run.ts.Deferred because it has no Coder-Lead relevance and would add a card to every pipeline agent's board — a wider blast radius than #206 for zero benefit to the stated goal.
Worth noting as the architectural test: when this lands,
subordinate_statuspicks it up with no supervision-side change at all. That is the evidence the boundary drawn in #205 is right.B. A plain-language progress line — the honest equivalent of the terminal tail
Even with #205 and #206, the Lead sees card titles, outcomes and step counts — not the terminal text the hardcoded Overseer reads. There is no clean way for supervision to reach that, and it must not try (see the reverted 3f14bd3).
The architecturally correct close is another domain write: have the Pilot upsert a short human summary into its own delegation card's
description, from the"thought"branch of the sameonEventhook #206 uses, throttled (e.g. every 5th action). The Lead then reads live progress through a generic record and still knows nothing about tmux.This is the deliberate finish line for Overseer parity, not an oversight. Deferred pending a decision that outcomes + progress is insufficient in practice.
C. Orphan sweeper for
agent_loop_runsexpireOrphanedRuntimeTasksreaps strandedinstance_runtime_tasks. Nothing does the equivalent foragent_loop_runsorpipeline_runs, so a run whose Workflow died mid-step sitsrunningforever with a staleiteration.Both workflows have code defenses (
agent-loop.tsforce-closes in a catch,coding-session.tscloses on the no-runner path — "arunningrow nobody will ever close is worse than a failed one, because the supervisor keeps waiting"), but neither is a queryable staleness signal and neither survives an isolate death.#205 mitigates the symptom by deriving "stalled" from
last_progress_at. The structural fix is a sweeper. Note this also weakens the case for ever unifying the run tables: more write paths into one table means more ways to strand a row, and a stranded row is permanent data.