Uh oh!
There was an error while loading. Please reload this page.
os-dev: wait actively on the shared verification lock instead of ending the turn - #8464
Merged
Merged
Conversation
…8448) The measured stall: a dev queues on the shared verification lock, ends its turn expecting a wake-up from a process it does not own, and sits until the PM probes it. Nine instances across two shifts, all the same shape. - rule 1: the lock becomes a named convention -- path, flock-owns-the-release, wrap the command only, and a bounded acquire that fits inside one foreground call instead of a blind two-hour block. - rule 7 (new): queued is not stalled. Loop in-turn, spend the queue interval on lock-free work, and past ~20 minutes with no progress report blocked with the holder named. - rule 6: the "one legitimate long wait" sentence now says that wait is active and in-turn -- as written it read as permission to park on the lock. - terminating cleanly (new item): the end-of-turn self-check, scoped so the ordinary report is never a violation. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018WuTtyckQa1VcXwgd52JpN
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
hotlong
marked this pull request as ready for review
August 13, 2026 14:27
Uh oh!
There was an error while loading. Please reload this page.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes#8448
.claude/agents/os-dev.mdonly. The unconditional clause set for the measured stall where a dev queues on the shared verification lock, ends its turn expecting a wake-up from a process it does not own, and sits until the PM probes it. Nine measured instances back this: three in one batch on the filing card, plus six from the spec-lane shift handover whose items 1 and 2 were graded into this card's scope. That handover card, #8294, is referenced here as the evidence anchor only — it stays open, and the filing seat retires it by hand once both halves of its split have landed.What changed
Resource discipline rule 1 — the lock is now a named convention, not just a command to copy: the path,
flockowns the release (fd-scoped, dropping when the command's process tree exits), the lock wraps the command only and never your reading or deciding, and the acquire is bounded to fit inside one foreground call instead of a blind two-hour block.Resource discipline rule 7 (new) — queued is not stalled. Never end a turn to wait for the lock; loop in the foreground and spend the queue interval on lock-free work (test authoring, changeset, PR body, package-local typecheck); past roughly 20 minutes with no progress, stop and report
blockedwith the holder named.Rule 6's closing sentence ("the one legitimate long wait is flock queueing") now states that the wait is active and in-turn. As previously written, that sentence was the one line in the file that read as permission to park on the lock.
"Terminating cleanly", new item — the end-of-turn self-check: does my last message describe a wake-up I expect from a process I do not own? Deliberately scoped so the ordinary report is never a violation: the report ends a turn on a result,
in_progressgate status included, not on a promise that something else will resume you.Mechanics measured in this container, not assumed
flock -w Nexits 1 on queue timeout — indistinguishable from a genuinely failing test.-E 99separates the two, and it still passes the command's own exit code through unchanged; both directions verified.fuser -von the lock path prints the PID and command.-w 7200could never have completed inside the call it ran in. That gap is the most plausible mechanical pressure toward backgrounding — which is the stall itself.Verification
All eight derived gate families ran in the foreground with real exit codes collected, all green. The PM's gate list and a re-derivation with
node scripts/pm/dispatch-gates.mjsagainst the actual changed path agree exactly — no additions. Practising the clause being written: every heavy step (install, the dependency build closure, the lint-package gate) ran under the shared lock in the foreground, and one masked exit code from atailpipeline was caught and re-run for the real status.No changeset: this is a
.claude/-only change and releases nothing, soskip-changesetapplies.Merge path: draft, human-merge class (skills root). Not marked ready, no auto-merge armed.
Generated by Claude Code