skills(pm-dispatch): key the clause-② contract review by lane — spec and skills owe it on every round, other lanes owe none - #18903
os-elon-musk wants to merge 3 commits into
Conversation
… spec and skills owe it on every round, other lanes owe none The maintainer's lane rule, restated on the card: the contract review at CONTRACT_REVIEW_TIER is owed in the spec and skills lanes only, on every delivered round (in-seat when the seat is served at that tier, otherwise by the at-tier review subagent the seat spawns — the 09-17 route stays); every other lane lands on the three pre-checks and the gates with no contract review, and a clause-② limb hit outside those lanes is lane routing (spec-lane work) rather than a self-review demand. When the subagent cannot start the review is unavailable: the PR stays draft, out of the queue, and the maintainer's own review is the only bypass. Net 0 lines per file (812 / 60 / 151). The one added SKILL.md line (the unavailable-tier state) is paid by retiring the default-tier clause-② FAIL rate line, whose population the rule empties. Claude-Session: https://claude.ai/code/session_01BTeBejoPUvRHN8WdAJC6oF Co-authored-by: Claude <noreply@anthropic.com>
… not a seat The clause-② note and the suspect tail printed by `--tier` (quoted into claim comments) said "spec seat; default-tier build" and "in the spec seat" — the 2026-09-10 seat key, never re-keyed by the 09-16 tier PR. They now say what the charter says: the review is owed in the spec and skills lanes, in-seat at tier or by the at-tier subagent, and a contract-surface hit outside those lanes is spec-lane work that moves there. The docblock above MANDATORY_TIER_GLOBS carries the same rule; four self-test pins hold both renderings to the lane key and refuse the two retired spellings. Claude-Session: https://claude.ai/code/session_01BTeBejoPUvRHN8WdAJC6oF Co-authored-by: Claude <noreply@anthropic.com>
`needsRecordRead` — C6's population gate, and the sweep's read budget — owed a record only in the completed state (a cleared `Clause-②: yes`). Under the lane rule the spec and skills lanes owe the contract review on EVERY round they deliver, `no` included, and a `no` round hangs no carrier to mark its review pending: PRs #18530 / #18529 (spec-lane `no` rounds) read 0 here with no record on either head. The population now adds the `no` rounds of the two lanes, read off the card's `domain:*` labels (`LANES_OWING_REVIEW`, `laneOwesReview`; unreadable labels stay UNJUDGED). A `no` elsewhere still owes nothing. A cleared `yes` outside the two lanes keeps its row and its exit — the `yes` is a limb hit and limb-hit work is owed — but its remedy is lane routing (re-lane to spec, or correct a false `yes`), never a default-tier self-review and never an at-tier subagent from that lane. The C6-RECORD note prescribes the clear-citation only where a clear exists. New floored battery, 34 cases; roster floor 32 → 33. Claude-Session: https://claude.ai/code/session_01BTeBejoPUvRHN8WdAJC6oF Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
维护者速读(终稿)— PR #18903 · 席位定稿 2026-09-18T05:30Z(草稿在正文,以本评论为准)改了什么:把你 9-17 说的车道规则写回章程与两个机读脚本:只有 spec 与 skills 两条车道的每一轮交付(不论 为什么改:9-16 那次把「只在 spec 席」改成「按席位实测档」,席位名单没了,同一张 spec 车道 风险与代价(含回滚):① spec 与 skills 车道的 席位意见:建议批准。三条规则逐字落地,车道键与子代理路线同存;唯一值得你多看一眼的是第②条那行退役。留在下一张 SKILL.md 卡上的两处旧措辞(「借契约复审档隔离复核」与 你要做的:确认本 PR 如实落了你的车道规则,并接受第②条那行的退役,是则 APPROVE( Generated by Claude Code |
Fixes #18536
Clause-②: no
What this lands
The maintainer's lane rule, restated by the director record on the card (comment 5717169811), quoted verbatim and untranslated:
carried into the governed text and the two machine readers:
CONTRACT_REVIEW_TIER: in-seat when the seat's served tier is that tier, otherwise by the at-tier review subagent the seat spawns (the 09-17 route stays). The record is the same-shape comment withServed-tier:, on the PR or the card.packages/spec/src/**, declarationClause-②: yes) survive unchanged and now answer the LANE question: a limb hit is spec-lane work and moves there; aClause-②: noPR outside the contract surface lands on the three pre-checks and the gates. No default-tier self-review record is demanded, and no other lane spawns the at-tier subagent.The lane key is the 2026-09-10 key restored (PR #17294) with the 2026-09-17 subagent route kept (PR #18511); the 2026-09-16 tier key (PR #18363) is superseded. Not a byte-revert: both spec AND skills owe the review, and 「余席默认档自审加门禁」 is gone — other lanes owe nothing.
Charter (commit 1) — net 0 lines per file
.claude/skills/pm-dispatch/SKILL.mdreferences/contract-review.mdreferences/core-rules.mdEvery edited line is at most 120 bytes;
check:pm-skill-ratchetis green onbc0c2ec41. Rule text carries no issue numbers (check:pm-skill-id-lintgreen); the four-axis frame block is untouched (check:skill-frame-sync/-freshnessgreen).SKILL.md — five in-place rewrites, one added line, one retired line:
contract-review.md — thirteen in-place rewrites:
core-rules.md — one rewrite: :112 「契约卡达档复核归派发席」 → 「契约复核只 spec、skills 欠」. Trace by REST
GET /pulls/N/files: PR #18363 (09-16) touched SKILL.md, contract-review.md and platform-readings.md only, so the 09-16 re-key never landed in core-rules.md; :112's tier key came with PR #18511 (09-17), replacing PR #17294's 「归 spec 席」. :122 「references/席内达档复核后入队」 is left as the mirror of SKILL.md :625 (see acceptance notes).Machine side
commit 2 —
scripts/pm/dispatch-gates.mjs. The clause-② note and the suspect tail that--tierprints (quoted into claim comments) said 「spec seat; default-tier build」 and 「in the spec seat」 — the 09-10 seat key, which PR #18363 never re-keyed. They now name the spec and skills lanes, the in-seat-or-subagent route, and 「a hit outside those lanes is spec-lane work and moves there」; the docblock aboveMANDATORY_TIER_GLOBScarries the rule. Four self-test pins hold both renderings to the lane key and refuse the two retired spellings.--self-test: 1852 cases pass (baseline on0b31d90: 1848).commit 3 —
scripts/pm/check-clause2-carriers.mjs.needsRecordRead— C6's population gate and the sweep's read budget — owed a record only in the completed state (a clearedyes), so a spec-laneClause-②: noround read 0 with no record on its head: exactly PRs #18530 / #18529, the card's measured pair. Now:LANES_OWING_REVIEW(domain:spec,domain:skills, frozen) andlaneOwesReview(pair), read off the CARD'sdomain:*labels; unreadable labels stay UNJUDGED through the existing labels gap.noon a spec/skills card (new). Anoanywhere else still owes nothing — pinned.noround with no record: exit 4; remedy = the lane's review at tier (in-seat or by the at-tier subagent), with the unavailable-tier state and its one bypass named.yesOUTSIDE the two lanes keeps its row and its exit 4 (theyesis a limb hit, and limb-hit work is owed), but its remedy is lane ROUTING: re-lane the item todomain:spec(pm:retriage, or split the contract work to a spec-lane card or PR per 「新packages/spec工作恒由domain:spec席收口」), or correct a falseyeswith aClause-②-correction:comment — never a default-tier self-review, never an at-tier subagent from that lane.noround with its record it says the lane owes the record and it exists.--self-test: 977 cases pass (baseline 941).Deviation from the dispatch's suggested case (c) — a
yespair on adomain:clicard as 「not owed as a record, plus a note」 at exit 0 — implemented instead as owed at exit 4 with the routing remedy. Reasons: contract-review.md :42 promises 「0 = … head 上有记录」; a cli seat clearing ayespair and landing it from that lane is never a legal workflow under rule 2 (the work 「moves there」), so an exit-0 note would be the 0-with-a-message the file's own header bans; and the row's exit is unchanged from today (only the remedy text moves), so no legal workflow is re-blocked. The four-axis reading is in the report'sopen_questions; the PR is draft for the maintainer's word either way.Gates (run on
bc0c2ec41, the final commit)node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 46 families. 45 ran with exit 0 (each captured redirect-then-$?), among themcheck:pm-skill-ratchet,check:pm-skill-id-lint,check:skill-frame-sync,check:pm-governed-prose,check:pm-clause2-carriers,check:declared-population-live,check:pm-half-states,check:nul-bytes.check:doc-formula-expressionsfirst exited 3 — PREREQUISITE NOT MET (@objectstack/formula/@objectstack/lintnot built; nothing measured) — and reruns green afterturbo run build --filter=@objectstack/formula --filter=@objectstack/lintunder the verify lock (22 + 9 + 14 examples judged clean).check:pm-dispatch-gates(430–450 s) was still running detached when this body was written; its verdict and the--ranreconciliation are in theos-dev-reportcomment on #18536. Both edited scripts' own--self-testpass (above). The four package tests that mentiondispatch-gates.mjsdo so in docblocks only and read nothing from it, so they are not owed. The derivation printed a STALE TREE warning (the tree is behind anorigin/mainthat moved during the run); the PM's re-derivation after the report reads the true list.skip-changeset: nothing published moves —.claude/**andscripts/pm/**ship in no package'sfiles[].Acceptance notes
Lines outside this card's declared file surface that carry seat or tier wording — reported, not edited (承接者: the skills seat's next SKILL.md round; the hot-file queue behind this card holds #18743 · #18755 · #18665 · #18469 PR-B · #18489):
references/席内达档复核后入队」: consistent with rule 1 read as "the skills lane's review at tier, in-seat or by subagent"; the word 席内 there is the 09-16 spelling and could be read as in-seat-only.references/lanes/spec.md:19–:33 andreferences/lanes/skills.md: no contradiction found;lanes/skills.md:13 「契约复核归派发席席内」 is ownership wording (the seat owns the record it adopts) and stays true.needs:contract-reviewcarriers hung outside the spec/skills lanes (the director's ledger ⑫) and re-lane or strip each.check-clause2-carriers.mjswithout--pairnow buys the PR thread for every spec/skills-lanenopair too (one read per PR, cached per PR); the budget paragraph in the file's header is unchanged in shape.维护者速读(草稿)
改了什么:把契约复核的归属重新按「车道」写回章程:只有 spec 与 skills 两条车道的每一轮交付都要过契约复审档的复核——席位达档就席内审,不达档就起达档子代理;其余车道零契约复核,条款②命中即 spec 车道的活;达档子代理起不来时 PR 留 draft、队列外等档,唯一旁路是您亲审。三份章程文本行数不变(812 / 60 / 151),两个机读脚本(
--tier的提示行、--pair的复核记录人口)同步改成按车道判。为什么改:9-16 那次把「只在 spec 席」改成了「按席位实测档」,席位名单没了,于是同一张
Clause-②: no的 spec 车道 PR 在两条细则下答案相反(#18536 的两种读法),而账号级 429 让「等档位」在两种读法里含义完全不同。您 9-17 的裁决把车道规则说回来了,本 PR 只是把它落到文本和脚本上。风险与代价(含回滚):
--pair从此对 spec/skills 车道的no轮也要求 head 上有复核记录,没有就退 4——这正是 #18530 / #18529 该有的读数,但意味着这两条车道的no轮在记录落下前都不能入队;其它车道不受影响,yes挂在别的车道上的旧读数(退 4)不变,只是补救措施从「自审」改成「改道 spec」。回滚 = revert 这三个 commit,文本与脚本一起回到0b31d90。席位意见:(留空)
你要做的:确认本 PR 是否如实落了您的车道规则,是则合并;合并后各车道席按裁决去清理挂在 spec/skills 之外的
needs:contract-review载体。Generated by Claude Code