Skip to content

[finding] The os-dev never-park clause LANDED and still does not hold — 3 of 5 devs ended a turn parked in one round at concurrency 5, all three on a shared-lock/long-suite wait #11463

Description

@os-sam

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:

cardterminal message, verbatimwhat 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 Englishnever 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.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions