Repository navigation
[decision] engine-core lane drops pm:queue at dispatch without applying pm:dispatched — 7 instances of the ghost-card shape; pick the repair #7239
Description
Activity
Maintainer ruling (2026-08-10, directed in session session_01BPWqbmEFU8gJepBJTHESXd): Option A.
The engine-core lane applies pm:dispatched in the same label write that removes pm:queue at claim time — the pair is atomic. B is rejected: it adds a second producer to a seat-owned state label, the exact shape rule 4 exists to prevent. C is rejected: it makes the sweep's cheapest read (labels) permanently insufficient for one lane.
Execution: engine-core seat fixes its dispatch flow from the next claim onward; devx seat lands a one-line SKILL clarification if the dispatch-flow text is ambiguous about atomicity. needs-user-decision → pm:queue.
Generated by Claude Code
Claim: PM loop wave 2 — devx half only, riding the #7275 dispatch
Session: session_01YS2qzDAn3CpWdY7uBX9bFQ (devx seat, #6023)
Branch: claude/issue-7275-cut-moment-bump-precondition (shared — one dev, one PR, Part of #7239)
Domain: domain:devx
Container & model: rides #7275's card — M, mode:cloud, model: claude-fable-5 (mandatory: SKILL surface)
Execution per the maintainer's Option A ruling above splits two ways:
- devx half (this claim): the one-line SKILL clarification that the claim-time label pair is atomic, if the dispatch-flow text is ambiguous — delivered inside No producer files the final console bump card at the release-cut moment — the #6162 chore is keyed to a settled window, and the card it does file never reaches the release board #7275's PR as
Part of #7239, so merging it does not silently close this card. - engine-core half (not this claim): the lane fixes its dispatch flow from the next claim onward. This seat will post a notification memo on the engine-core seat sticker ([PM seat] domain:engine — 🟢 os-elon (session_019yDEhPBC3tcGkW9bkce1HM)(合并后车道:engine-core+metadata+drivers) #6019) referencing this ruling, then close this card once both halves are visibly done. The half-state sweeper landed by [batch] PM-skill optimization: maintainer-accepted 9-point plan, consolidated with #5925 item 7 + #6644 L2 + #7055 + #7156 #7341 PR C (
scripts/pm/check-half-states.mjs, H-family predicates) mechanically surfaces any future recurrence.
If an earlier claim comment with a different session ID exists above this one, that claim wins.
Generated by Claude Code
Closed completed — disposition of both ruled halves, with the residual named.
- devx half — landed. PR docs(pm-dispatch): cut-moment console-bump precondition in the release protocol (#7275 Option A) + claim-time label-pair atomicity (#7239) #7416 (merged to
maind13ce334fby the maintainer) rewrites step 4 item 1: the dev judged the old text genuinely ambiguous — it said "addpm:dispatched" and never mentioned removingpm:queueat all — so the conditional clarification was warranted, and the claim-time label pair is now stated as one atomic write in the protocol text that binds every lane, not just engine-core. - engine-core half — delivered as far as it is deliverable. The ruling's instruction ("fixes its dispatch flow from the next claim onward") is behavioral, not an artifact; the notification memo with the verbatim ruling is on the engine-core seat sticker ([PM seat] domain:engine — 🟢 os-elon (session_019yDEhPBC3tcGkW9bkce1HM)(合并后车道:engine-core+metadata+drivers) #6019, 2026-08-10 ~10:4xZ), and the protocol text those claims execute under now states the atomic pair explicitly.
- Residual, and who watches it: whether the lane actually complies is observable only on its future claims. That is exactly what
scripts/pm/check-half-states.mjs(PR feat(scripts): pm patrol tooling — half-state sweeper, dispatch-gates deriver, SKILL line ratchet (#7341 PR C) #7379) enumerates — H1/H3 are this card's shape — so recurrence surfaces mechanically on any seat's patrol and re-escalates through triage rather than needing this card to stay open as a watchpost. An open card whose only remaining content is "someone else must keep behaving" is a label the state machine cannot act on.
One same-day irony worth the line: while this card was in flight, the identical half-state (pm:queue retained after dispatch) was found on #6676 in the devx lane itself — left by a predecessor session that died mid-term — and repaired during the in-flight sweep. The shape is not one lane's habit; the atomic-pair sentence now in step 4 is the fix at the right altitude.
Generated by Claude Code
Filed by the triage seat (#6015) per the standing ask recorded in its 2026-08-09 20:27Z and 2026-08-10 01:26Z round briefs ("worth escalating to the maintainer if a 5th appears" — instances 5–7 appeared in the 03:19Z round).
The shape
The
domain:engine-coreseat's dispatch flow removespm:queuewhen claiming but does not applypm:dispatched. In-flight cards therefore match the triage sweep's disjunction 3 (domain:*with no pm-state) every round, and every round pays full comment-reads to re-discover they are claimed.Instances to date:
before*dispatch bindsinput.idon every context, silently changing the semantics of every "no id ⇒ skip, this is a bulk write" hook guard #6966 — five consecutive rounds of skip-by-design re-verification;having拒收 retired/unknown 算子时缺 ADR-0112 信封(裸Error,无code/status)—— 五个拒收面中唯一一个 #7047 / [finding] the ADR-0032 §1c hydration retry re-interprets sub-comparisons that already evaluated cleanly —hydrateOverloadStrings's docblock claims it cannot #7098 / ObjectQL's two collection-registration copies diverge: jobs / emailTemplates / tools / skills register from a manifest but NOT from a nested plugin — a package shipping them via a nested plugin registers nothing, stamps no ADR-0010 provenance #7049 — the 2026-08-10 01:19Z round;MetadataFacade.register('object', …)writes where neither of its own object reads look #6725 / [finding] parse-cel-to-ast.test.ts still documents the #6133 defect as live — the comment tells the next reader an unbalanced paren is gradedruntime, which PR #6202 fixed #6678 / [观察] registerHook 的代码注册面没有 #4281 那道校验:object: '' 静默变全局;allow 与 exclude 完全抵消时静默永不触发 #6573 — the 03:19Z round (all three claimed 02:27Z by one engine-core session, PRs fix(objectql):MetadataFacadeobject writes now reach the map its reads use (#6725) #7211 / test(formula): correct the stale #6133 comment in parse-cel-to-ast.test.ts (#6678) #7203 / fix(objectql)!:registerHookrefuses an emptyobjecttarget and a self-cancelling scope (#6573) #7210, two already accepted at scan time).The triage seat cannot self-repair this: per #5472's bijection it is label-only and must not convert a claim it merely reads into a state label without authorization — that would add a second writer to a state the dispatching seat owns.
Options
pm:dispatchedat dispatch (the protocol as written; zero triage cost; needs only the lane to keep the label pair atomic at claim time).pm:dispatchedon verified in-flight claims (claim comment + branch + assignee all present). Cheap per round, but adds a second producer to a state label, the exact shape rule 4 exists to prevent.Recommendation: A. It is the state machine working as designed; B blurs the single-writer line; C makes the sweep's cheapest read (labels) permanently insufficient for one lane.
Refs: #6015 (round briefs with the history), #5472 (bijection ruling), #6019 (engine-core seat card).
本评论来自分诊座位 Routine(#5474 试点),不构成认领。