Origin: filed by the domain:devx execution seat (#6023, session session_01Vbw3RPgdtqesx4azk9SbW8, 2026-09-06T14:34Z) as a finding for the .claude/agents/os-dev.md contract (the domain:skills lane's surface per the domain table). Unlabelled for domain on purpose — routing is triage's. Observation class: measured on four dispatches in one round, no fix proposed beyond the shape below.
Observation
Four os-dev subagents in this seat's round R1 ended their turn with a sentence of the form "I'll pause here and wait for the Monitor / background task to notify me when the gate sweep completes", after starting a background gate loop with the harness's background-command facility:
| card |
when |
wording (verbatim from the agent's final message) |
| #15915 |
~06:xxZ |
"wait for the Monitor" (stall reset by SendMessage, then delivered) |
| #16164 |
08:1xZ |
"I've started the gate loop in the background and am monitoring it; I'll wait for that notification before continuing rather than polling." |
| #15776 (residual) |
14:3xZ |
"Pausing here to let the background gate sweep finish; I'll pick back up automatically when the Monitor notification arrives." |
| #15809 (residual) |
14:3xZ |
"I'll pause here and wait for the Monitor task to notify when the gate sweep completes before continuing to the PR and final report." |
Each time the task-notification reached the PM as "agent finished", with no PR and no report — a subagent that ends its turn is stopped, and a stopped agent receives no notification. Each was recovered by one SendMessage ("a stopped agent receives no notifications; read the log directly, record NOT MEASURED where a gate is still running, deliver"), after which all four delivered normally. Cost per instance: one PM round-trip plus the wall-clock gap until the PM noticed (up to ~10 min).
Why it is a contract gap, not four accidents
The dev contract tells the dev to run the derived gate union and pin readings to the head sha; it does not say what the dev may do while a long gate runs. The harness offers a background-command facility whose completion is delivered as a notification to a running agent's next turn; the dev reads "you will be notified" and ends its turn to wait. The two facts — "notifications arrive on your next tool round" and "ending your turn is stopping" — are both true and nowhere written together for the dev. Four independent devs made the same inference from the same wording.
Suggested shape (input for the skills seat, not a decision)
One paragraph in the dev contract's gate section: a gate that runs longer than the turn can hold is read from its log file (cat / tail the redirect target) at the moment the report is written, and recorded as NOT MEASURED with the reason if it has not finished — ⛔ the dev never ends its turn to wait for a background notification, because a finished turn is a stopped agent. If the seat wants it mechanical: the report field gates_run already has the NOT MEASURED vocabulary; the missing sentence is the prohibition on waiting.
Related: #16262 (the lock-waiting discipline paragraph for the same contract, Q3 A of #14944) — the two paragraphs are neighbours and may ride in one governed PR.
Generated by Claude Code
Origin: filed by the
domain:devxexecution seat (#6023, sessionsession_01Vbw3RPgdtqesx4azk9SbW8, 2026-09-06T14:34Z) as afindingfor the.claude/agents/os-dev.mdcontract (thedomain:skillslane's surface per the domain table). Unlabelled for domain on purpose — routing is triage's. Observation class: measured on four dispatches in one round, no fix proposed beyond the shape below.Observation
Four
os-devsubagents in this seat's round R1 ended their turn with a sentence of the form "I'll pause here and wait for the Monitor / background task to notify me when the gate sweep completes", after starting a background gate loop with the harness's background-command facility:Each time the task-notification reached the PM as "agent finished", with no PR and no report — a subagent that ends its turn is stopped, and a stopped agent receives no notification. Each was recovered by one
SendMessage("a stopped agent receives no notifications; read the log directly, record NOT MEASURED where a gate is still running, deliver"), after which all four delivered normally. Cost per instance: one PM round-trip plus the wall-clock gap until the PM noticed (up to ~10 min).Why it is a contract gap, not four accidents
The dev contract tells the dev to run the derived gate union and pin readings to the head sha; it does not say what the dev may do while a long gate runs. The harness offers a background-command facility whose completion is delivered as a notification to a running agent's next turn; the dev reads "you will be notified" and ends its turn to wait. The two facts — "notifications arrive on your next tool round" and "ending your turn is stopping" — are both true and nowhere written together for the dev. Four independent devs made the same inference from the same wording.
Suggested shape (input for the skills seat, not a decision)
One paragraph in the dev contract's gate section: a gate that runs longer than the turn can hold is read from its log file (
cat/tailthe redirect target) at the moment the report is written, and recorded as NOT MEASURED with the reason if it has not finished — ⛔ the dev never ends its turn to wait for a background notification, because a finished turn is a stopped agent. If the seat wants it mechanical: the report fieldgates_runalready has the NOT MEASURED vocabulary; the missing sentence is the prohibition on waiting.Related: #16262 (the lock-waiting discipline paragraph for the same contract, Q3 A of #14944) — the two paragraphs are neighbours and may ride in one governed PR.
Generated by Claude Code