docs(pm-dispatch): the claim comment carries the clause-② line at the start of its own line — the enqueue gate reads that comment only (#17800) - #18208
Conversation
… start of its own line — the enqueue gate reads that comment only Three claim-discipline lines in SKILL.md 〈执行座位职责〉, 3 → 3 (812/812 held, every line ≤ 120 bytes): - the claim comment copies the 〈模板与表〉 template — `Claim:` as the first line, `Branch:` and `Clause-②:` each on a line of its own, at the start of the line; - why: the clause-② enqueue gate reads only the claim comment and only line-initial keys — a key mentioned inside a sentence or posted as a separate comment is unread, and the card is then illegible; - the readers stay strict and are never widened; the session-ID and subagent-identity clauses of the old third line are kept, compressed. The template itself and the checker are unchanged. Claude-Session: https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8 Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: 4/4 In-seat record on the GOVERNED rules layer ( ① Derived judgments
② Semver levelNone. ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
维护者速读改了什么:认领纪律的三行重写,不加行:认领评论必须照抄模板—— 为什么改:cli 席自己立了这张卡,第二天写的三份派发令又全部踩中同一个坑(把「必须独占一行」写在一句话里),说明靠注意力修不了;规则层没有一行说这个形状是硬性的、也没说为什么。 风险与代价(含回滚):纯规则文本,零机械化;回滚即 revert。 席位意见:派发令里 dev 指出本席的前提 P2 写错了(闸门也读 你要做的:os-zhuang 或 hotlong 一次 approve;之后由本席落地。是 / 否? Generated by Claude Code |
|
Landing under ruling C — Generated by Claude Code |
Fixes #17800
What changed
.claude/skills/pm-dispatch/SKILL.md〈执行座位职责〉 › 认领(先认领后动工), lines :472–:474 on base99edfd008e: three lines → three lines. 812/812 held; every changed line ≤ 120 bytes. Nothing else in the tree moves — ⛔ not the 〈模板与表〉 template (P5), ⛔ notscripts/pm/check-clause2-carriers.mjs, ⛔ not the reader tolerance that #17098 is about (#17098 remains open), ⛔ no label, sweep or gate, ⛔ notreferences/core-rules.md(P3).Bytes per line (
Buffer.byteLength, utf8, measured 2026-09-14T15:05:43Z): before 109 / 114 / 94 → after 116 / 118 / 114; the cap isMAX_LINE_BYTES = 120inscripts/pm/check-skill-line-ratchet.mjs.What each new line carries:
Claim:is the first line;Branch:andClause-②:each occupy a line of their own, at the start of the line. 「照抄」 (copy) is the remedy the checker's own remedy text names — "COPY the template's line rather than composing one" (TEMPLATE_POINTER, check-clause2-carriers.mjs :1502).auth.login/auth.registernormalize intodatabut never setsuccess— neither satisfies theSessionResponsethey declare #17234, [finding]action-execution.ts:1474silently skips a nullish id — a SECOND undeclared tolerance in the veryActionEngineFacade.deletearm #15117 just made declared, while the test comment beside it says "never a null id" #17620 and docs(client): correct environments.update's accept-set and note updateVisibility's current state #17948 — an instruction that describes the key inside a sentence IS the violation) or posted as a separate comment is unread, and the card is then illegible. 「条款②入队闸门」 is the charter's own name for it (:637).mode:subagentthe dev and the PM share one ID, so identity is the branch. Two clauses dropped as now-redundant: 「只认Claim:这一个拼写」 — the literal spelling is shown in :472 and in the template header (:799) — and 「修法是全舰队向它收敛」 — converging on the template is what 「照抄」 in :472 says.Triage direction (comment 5645818231, verbatim)
Where the charter states the claim form: SKILL.md :472 (the claim-discipline line) and 〈模板与表〉 :799–:811 (the template, already three-line). The rule line was the gap; the template was not.
Premises, read against
origin/main99edfd008ebefore writingP1 — holds in substance; the instrument's predicted count was wrong. :472 and :475 read exactly as the dispatch quoted (2026-09-14T14:57Z). The grep
各占一行|各自一行|own line|行首over SKILL.md,references/*.md, os-dev.md and AGENTS.md returned 5 hits, not 0 (14:57:17Z; the control机器判据in SKILL.md → 2, as predicted). Each read: SKILL.md:111 (Maintainer-action:line-initial — a different key), state-machine.md:25 and :42 (Blocked-by:/Release:— different keys), platform-readings.md:352 (CLAIM_COMMENT_MARKERrecognises line-initialClaim:— the marker, not the declaration), and platform-readings.md:350–:351 「认领腿CLAUSE2_KEY_LINE的轴是行首位置:引用块、项目符、粗体、反引号全容,冒号可在外。只有#标题与行中键破它」 — a READING of the checker's axis in the readings reference, not a rule binding the claim comment's shape, and not at the place the charter states the claim form. No line said the gate reads the claim comment only. The rule gap the card names is real; the new :473 is its first rule-layer statement and agrees with that readings line.P2 — falsified in its literal form; direction unchanged, "why" stronger.
grep -c 'Branch:' scripts/pm/check-clause2-carriers.mjs→ 23 (14:57:17Z). The checker DOES read the claim'sBranch:line: it importsclaimedBranchesfromcheck-half-states.mjs(:608), whose reader is line-anchored —/^\s*(?:[-*+]\s+)?>?\s*Branch(?:es)?\s*:\s*(.*)$/gim(check-half-states.mjs :4789) — andgoverningClaimpicks "the newest claim comment from which at least one branch parses" (:4802). An inlineBranch:parses to zero and the pair is reported UNJUDGED with the remedy "aBranch:line of its OWN … ⛔ not inside theClaim:sentence, which no reader parses" (check-clause2-carriers.mjs :3194–:3200, pinned at :5209–:5221). So the gate reads ONE comment and all three keys line-anchored:Claim:as the marker (CLAIM_COMMENT_MARKER, check-half-states.mjs :1134),Branch:to resolve which claim governs the pair,Clause-②:as the declaration (CLAUSE2_KEY_LINE, :762). The new :473 says exactly that — 「只读认领评论且只读行首键」 — and neither claims nor denies anything beyond it; :479 「分支名必须带 issue 号」 is untouched. Reported per the three-zone rule (mechanism assumption tested, falsification reported, ruling's intent kept), not as a stop.P3 — SKILL.md only.
references/core-rules.md:109 reads 「认领原子对:一次标签写入完成认领与状态对调,随后留Claim:开头的评论并重读全线程。」 (151/151, headroom 0). It states the atomic pair and theClaim:-initial comment and nothing about the other two keys' placement, and the new :472 leaves that sentence true. The placement ofBranch:/Clause-②:is form detail of the template (细则), not a principle (核心条款); 〈优先级〉's same-PR sync clause 「一条规则在本文与核心条款一处改动,另一处同 PR 同改」 fires on a rule that lives in both files and changes in one — no core-rules sentence changed meaning. Touching core-rules would have cost a trim in a 0-headroom file for a detail; not taken.P4 — holds. Base
pnpm check:pm-skill-ratchetexit 0 at 2026-09-14T15:00:16Z: 「.claude/skills/pm-dispatch/SKILL.md is 812 lines (ceiling 812; headroom 0)」, 「widest table row is 342 bytes (pin 342; headroom 0)」; basepnpm check:skill-frame-syncexit 0 at 15:00:17Z.git ls-remote --heads originat 15:13:32Z: onlyclaude/issue-17800-claim-form-three-linesmatchesissue-17497|issue-17800— no #17497 branch exists. After the editorigin/mainadvanced by one commit (d4554d4f5a, #18191, acontent/docspage);git diff --stat 99edfd008e origin/main -- .claude/skills/pm-dispatch/ .claude/agents/os-dev.md AGENTS.mdis empty (15:15:22Z) — no governed file moved; the merge-base is still99edfd008e.P5 — holds. 〈模板与表〉 :799–:811 (read 14:57:13Z) carries
Claim: PM loop round N,Branch: …,Clause-②: yes | noeach on its own line at column 0. The template is untouched.Gates — this tree,
4c91f60ef2node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(no paths; changeset from merge-base99edfd008: committed 1, working tree 0, untracked 0 —.claude/skills/pm-dispatch/SKILL.md) derived 16 commands. Each run in the foreground, exit captured by redirect-then-$?:node scripts/check-closing-keyword-parity.mjsnode scripts/check-closing-keyword-parity.mjs --self-testnode scripts/check-comment-mask-corpus.mjsnode scripts/pm/check-governed-queue-guard.mjs --self-testpnpm --filter @objectstack/lint run check:doc-formula-expressionspnpm check:agent-test-spellingpnpm check:doc-authoringpnpm check:driver-memory-censuspnpm check:nul-bytespnpm check:pm-governed-mergespnpm check:pm-governed-prosepnpm check:pm-skill-id-lintpnpm check:pm-skill-ratchetpnpm check:refd-timer-probepnpm check:skill-frame-syncpnpm check:watch-hint-literalcheck:doc-formula-expressionsfirst exited 3 — 「PREREQUISITE NOT MET — the workspace package@objectstack/formulais not built … Nothing was measured」 — not a reading. Built@objectstack/formulaand@objectstack/lintunderscripts/pm/os-verify-lock.sh(「VERDICT command-exit 0 · held the lock 219s (3m39s) · waited 0s」), rerun → exit 0 at 15:13:30Z.--ranreconciliation (15:15:20Z): 「Run reconciliation — 16 derived, 16 run, 0 NOT-MEASURED, 0 UNRUN.」 … 「✓ dispatch-gates --ran: 16 derived famil(ies) accounted for — 16 run, 0 NOT-MEASURED (a DERIVED zero — all 16 recorded an exit code and none of them is 3).」Post-edit ratchet (
pnpm check:pm-skill-ratchetexit 0, 15:08:39Z): 「.claude/skills/pm-dispatch/SKILL.md is 812 lines (ceiling 812; headroom 0)」, 「widest table row is 342 bytes (pin 342; headroom 0)」.pnpm check:skill-frame-syncexit 0: 「the one declared copy of the decision frame is internally coherent」.pnpm check:pm-skill-id-lintexit 0: 「27 file(s) clean」 — the new lines cite no card number.pnpm check:nul-bytesexit 0; the control-character self-scan of SKILL.md → no hits.Not derived, not run:
pnpm lint(repo-wide eslint, CI-owned; markdown is outside its population) anddocs:check-links. Not run:pnpm test/pnpm typecheck— the diff touches no package.Changeset: none.
.claude/**publishes nothing (fast lane: nofiles[]of any released package ships it). No label is written from this container.维护者速读(草稿)
Clause-②:(连同Claim:、Branch:)必须各自独占一行、写在行首,因为条款②入队闸门只读认领评论、只按行首读键——写进派发令的句子里或另发一条评论,闸门都读不到,卡就不可读。模板不变、脚本不变,只把规则层这三行改成 3→3(812/812 不动)。Acceptance notes
Branch:) was falsified by the tree (above) and reported as a mechanism-assumption correction; the ruling's direction was kept and the "why" written so it is true of all three keys.references/platform-readings.md:350–:351 already carries the checker-axis reading the new :473 agrees with; no drift, nothing to file. 承接者:无.check-clause2-carriersreads a key-INITIAL describing line as a declaration — its own self-test asserts the general property "only DESCRIBES ⇒ MISSING", and the fixture pinning it covers only the other half #17098 remains open and its reader tolerance is untouched.Clause-②: no
Generated by Claude Code