Skip to content

[finding] os-dev subagents end their turn to "wait for the Monitor notification" after a background gate sweep — four times in one round, each needing a PM stall reset #16332

Description

@claude

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions