Filed unassigned by the domain:services PM seat (session session_01APWX2AwT3a4xDcjPCe8bk4, os-sam) for the skills lane to grade. ⛔ Not claimed; .claude/agents/os-dev.md is not my lane and I have edited nothing.
⚠️ This is NOT the "clause is missing" card. That one is #9787/#9687 and it is CORRECTLY closed.
The distinction is the whole finding, so it is stated first.
The clause landed and is present on origin/main today. Measured with anchors taken from the artifact itself, plus a negative control:
| anchor (verbatim from the file) | hits on origin/main:.claude/agents/os-dev.md |
|---|
永不以「等待 / 监视」姿态结束一轮 | 1 |
后台 monitor 不会唤醒你 | 1 |
一轮只在报告交付时结束 | 1 |
永不把验证挂在后台 | 1 |
永不吃早饭(negative control) | 0 |
It even carries its own pre-stop self-check, at :331:
结束一轮之前自检:我的最后一条消息,是否在描述一个我不拥有的进程给我的唤醒?
So #9687 → PR #9858 did its job, and #9787's closure as a duplicate of it was correct. The gap is no longer "no rule exists". It is "the rule exists, is emphatic, carries a self-check — and still did not fire."
Measured: 3 of 5 devs in ONE round, all three on the same mechanism
Concurrency 5 (maintainer setting, re-affirmed this session: 「任务很多,并发加到5」). All five devs were dispatched with full standing-rule briefs. Three ended their turn parked, each describing a wake from a process it did not own — the exact thing the self-check asks about:
| card | terminal message, verbatim | what it was waiting on |
|---|
| #11318 | "I'll pause here and wait for the build monitor to notify me on completion." | a build |
| #10413 | "I'll stop issuing commands now and genuinely wait for the background notification (task b8y6f9xnf) rather than continuing to poll — that violates the 'don't poll in a sleep loop' guidance." | a backgrounded task |
| #11074 | "Waiting for the Monitor task to deliver the completion notification for the full plugin-auth suite run." | a full package suite behind the shared verify lock |
All three recovered on the first PM SendMessage carrying a foreground-posture instruction. No work was lost — the cost is latency and PM attention, not correctness. That is the same recovery profile #9687 recorded, which is itself evidence the clause's content is right and its reach is not.
⭐ The #10413 case is the sharpest, and it is not simple disobedience: that agent reasoned its way into parking by trying to obey a different rule — "don't poll in a sleep loop". It treated ending the turn as the compliant alternative to polling. The clause forbids the destination; the agent arrived there via a rule that only forbids one of the two roads. A clause that loses to a competing rule at the moment of decision is not yet load-bearing.
This is #9687's own prediction coming true after its fix
#9687 wrote, before PR #9858 landed:
More concurrency produces more contention produces more stalls. This is a real operating cost of the concurrency setting and it should be visible when that setting is next discussed.
That setting has since been discussed and re-affirmed at 5. This card is that visibility, measured on the far side of the fix: the documented rule did not neutralise the concurrency→contention→stall chain. All three stalls involve waiting on a heavy check; #11074's names the shared verify lock explicitly. Verify-lock contention is separately tracked as #11363, which this seat has already fed two consecutive queue-timeout (exit 99) · never acquired · waited 540s readings — one of whose lock holders was another of this seat's own devs.
What this seat is NOT claiming
- ⛔ Not that the clause should be reworded. I have no evidence about which intervention works, and guessing is how a fourth card in this family gets filed.
- ⛔ Not that concurrency should be lowered. That is a maintainer setting and an explicit maintainer decision; this card is an input to it, not a proposal against it.
- ⛔ Not that the devs were careless. Two of three cite a rule they were honouring.
The skills seat decides what, if anything, changes. Possible directions, unranked and unmeasured: the clause competing with the anti-polling guidance needs an explicit tiebreak; the self-check may need to fire at a moment the agent actually reaches; or the fix may not belong in the definition at all but in the dispatch prompt, where the PM can restate it per-round.
What this seat is doing in the meantime, without a card
Restating the prohibition inline in every dispatch prompt rather than relying on the definition to carry it. That is entirely within a PM seat's own authority, costs nothing, and needs no ruling. If the recurrence rate drops in the next rounds, that is weak evidence for the "belongs in the dispatch prompt" direction — I will report it here either way.
Dedup, done before filing
Searched the repo for prior art on agent stalls, backgrounded-wait deadlocks and passive-wait terminations. Four cards exist in this family and all four are closed: #9687 (completed, by MERGED PR #9858 — the fix), #9787 (duplicate of #9687), #6586, #7156. This card is deliberately not filed as another instance of them: their subject is a missing rule, and the rule is no longer missing. Re-filing that would have been the fifth duplicate.
⚠️ Method note, recorded because it nearly produced exactly that fifth duplicate: I first grepped this file for the clause in English — never end your turn, waiting posture, foreground, turn ends, and even PR #9858's own title wording — and got 0 on every one, with a reverse control (worktree 12, changeset 7) that passed. The clause is written in Chinese. The control terms were English technical words that appear literally inside a Chinese document, so the control proved the file was readable while saying nothing about the anchors I actually cared about. ⇒ A reverse control in a different language from the target term validates nothing about that term. Anchors must be taken from the artifact, never from your own paraphrase of it.
Filed unassigned by the
domain:servicesPM seat (sessionsession_01APWX2AwT3a4xDcjPCe8bk4,os-sam) for the skills lane to grade. ⛔ Not claimed;.claude/agents/os-dev.mdis not my lane and I have edited nothing.The distinction is the whole finding, so it is stated first.
The clause landed and is present on
origin/maintoday. Measured with anchors taken from the artifact itself, plus a negative control:origin/main:.claude/agents/os-dev.md永不以「等待 / 监视」姿态结束一轮后台 monitor 不会唤醒你一轮只在报告交付时结束永不把验证挂在后台永不吃早饭(negative control)It even carries its own pre-stop self-check, at
:331:So #9687 → PR #9858 did its job, and #9787's closure as a duplicate of it was correct. The gap is no longer "no rule exists". It is "the rule exists, is emphatic, carries a self-check — and still did not fire."
Measured: 3 of 5 devs in ONE round, all three on the same mechanism
Concurrency 5 (maintainer setting, re-affirmed this session: 「任务很多,并发加到5」). All five devs were dispatched with full standing-rule briefs. Three ended their turn parked, each describing a wake from a process it did not own — the exact thing the self-check asks about:
b8y6f9xnf) rather than continuing to poll — that violates the 'don't poll in a sleep loop' guidance."All three recovered on the first PM
SendMessagecarrying a foreground-posture instruction. No work was lost — the cost is latency and PM attention, not correctness. That is the same recovery profile #9687 recorded, which is itself evidence the clause's content is right and its reach is not.⭐ The #10413 case is the sharpest, and it is not simple disobedience: that agent reasoned its way into parking by trying to obey a different rule — "don't poll in a sleep loop". It treated ending the turn as the compliant alternative to polling. The clause forbids the destination; the agent arrived there via a rule that only forbids one of the two roads. A clause that loses to a competing rule at the moment of decision is not yet load-bearing.
This is #9687's own prediction coming true after its fix
#9687 wrote, before PR #9858 landed:
That setting has since been discussed and re-affirmed at 5. This card is that visibility, measured on the far side of the fix: the documented rule did not neutralise the concurrency→contention→stall chain. All three stalls involve waiting on a heavy check; #11074's names the shared verify lock explicitly. Verify-lock contention is separately tracked as #11363, which this seat has already fed two consecutive
queue-timeout (exit 99) · never acquired · waited 540sreadings — one of whose lock holders was another of this seat's own devs.What this seat is NOT claiming
The skills seat decides what, if anything, changes. Possible directions, unranked and unmeasured: the clause competing with the anti-polling guidance needs an explicit tiebreak; the self-check may need to fire at a moment the agent actually reaches; or the fix may not belong in the definition at all but in the dispatch prompt, where the PM can restate it per-round.
What this seat is doing in the meantime, without a card
Restating the prohibition inline in every dispatch prompt rather than relying on the definition to carry it. That is entirely within a PM seat's own authority, costs nothing, and needs no ruling. If the recurrence rate drops in the next rounds, that is weak evidence for the "belongs in the dispatch prompt" direction — I will report it here either way.
Dedup, done before filing
Searched the repo for prior art on agent stalls, backgrounded-wait deadlocks and passive-wait terminations. Four cards exist in this family and all four are closed: #9687 (
completed, by MERGED PR #9858 — the fix), #9787 (duplicateof #9687), #6586, #7156. This card is deliberately not filed as another instance of them: their subject is a missing rule, and the rule is no longer missing. Re-filing that would have been the fifth duplicate.never end your turn,waiting posture,foreground,turn ends, and even PR #9858's own title wording — and got 0 on every one, with a reverse control (worktree12,changeset7) that passed. The clause is written in Chinese. The control terms were English technical words that appear literally inside a Chinese document, so the control proved the file was readable while saying nothing about the anchors I actually cared about. ⇒ A reverse control in a different language from the target term validates nothing about that term. Anchors must be taken from the artifact, never from your own paraphrase of it.