Repository navigation
docs(pm-dispatch): state the lane table's packages/lint split once beside the anchoring rule - #17086
Conversation
… beside the anchoring rule The domain lane table carried the `packages/lint` split (a rule that revolves around the spec contract is `domain:spec`, the general dev-tool face stays `domain:devx`) only as a trailing clause on two rows, after the package list, and the decisive enumeration lived one file down behind a pointer that read as intra-seat assignment. Two execution seats read the `domain:devx` row's package list, stopped before the clause, and concluded `packages/lint` is wholly devx. Now the anchoring rule (每个包恰好属于一个域) is followed on the next line by its one exception, stated once; the two row clauses become pointers at that line, placed at `packages/lint` itself so the first list item already says it splits; and the `domain:spec` row's pointer to `references/lanes/spec.md` says that file carries the domain-boundary enumeration. The core-rules digest twin gains the same pointer. Line counts stay 812 / 151, every prose line is within the 120-byte cap, both rows sit under the 342-byte pin, and no lane assignment changes. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HxLw5aKDPR5RJgyUR7Exkd
…ne-table-lint-split-anchor
维护者速读 — PR #17086(#16993,skills 席终稿,2026-09-09T07:34Z)改了什么 — 车道表对 为什么改 — 两个执行席在同一天(#16611、#16237)以同样的半读法得出错误路由,#16237 因此整轮返工;spec 席又量到第三例,并发现决定性的枚举其实只在 风险与代价(含回滚) — 纯指令文本;回滚 = revert 本 PR。付账:锚定规则下的两条分诊判据(「读代码判域,不猜标题」「说不出碰哪个文件就不可标」)合到一行,措辞压到 120 字节;两条都在。顺带:dev 发现 席位意见 — 接受(契约复审档席内复核)。棘轮 812/151/43 未动、最宽表行 342 未动; 你要做的 — 合并;或由 os-zhuang / hotlong 批准,本席随即入队。看一处即可::240 那句唯一例外是否就是你对 Generated by Claude Code |
Fixes #16993
Governed surface (
.claude/**×2) ⇒ draft, human merge only; no seat flips it ready, queues it or arms auto-merge.skip-changeset: both files live under.claude/skills/pm-dispatch/, which no package'sfiles[]ships (fast lane per the os-dev definition).What changed — one statement, two pointers
The lane table's
packages/lintsplit was stated only as a trailing clause on two rows, after each row's package list, and the decisive enumeration sat one file down behind a pointer that read as intra-seat assignment. Now the anchoring rule 「每个包恰好属于一个域」 is followed on the next line by its one exception, stated once; the two row clauses are pointers at that line; and thedomain:specrow's pointer toreferences/lanes/spec.mdsays the file carries the domain-boundary enumeration. No lane assignment moves, no ruling is cited, no third copy exists..claude/skills/pm-dispatch/SKILL.md域车道 section, in place (812/812; base854639b3, merged withorigin/mainc43bac70):Before (
:239–:241, 108 / 74 / 63 B):After (
:239–:241, 108 / 118 / 120 B;:239byte-identical):Before (
:247, 322 B — the split begins at byte 254, after the package list and a second parenthetical):After (
:247, 311 B — the pointer is inside the FIRST list item, at byte 33 of the line / byte 15 of the cell; the trailing clause is gone):Before (
:249, 337 B — 「席内分派见references/lanes/spec.md」 at byte 293, announcing intra-seat assignment only):After (
:249, 336 B — pointer up to the anchoring rule at byte 224; the file pointer now names what it carries):.claude/skills/pm-dispatch/references/core-rules.md:65–:66(the anchoring rule's digest twin; 151/151, 112 / 92 B → 120 / 120 B):references/lanes/spec.mdis untouched (43/43): its:11enumeration is what the:249pointer now announces, so the pointer/statement shape did not need it.Who reads each line (the dispatch's mechanism assumption 1, measured against the text)
:239–:240: the triage seat judging a domain reads the anchoring rule; the exception is the next bullet, opening at byte 2 with 「唯一例外」 — no em-dash, no row tail to reach.:247: an execution seat disputing a grade reads thedomain:devxrow; the first list item now reads 「packages/lint(与 spec 相交的面均按锚定规则的例外切分)」, so 「packages/lint⇒domain:devxby the lane table」 cannot be taken from the first 33 bytes — or from any prefix — of the row. Before, that reading held for the first 254 bytes.:249: the spec seat / a disputing seat reads thedomain:specrow; 「按锚定规则的例外归本域的工具链」 points up, and 「域边界枚举与席内分派见references/lanes/spec.md」 says what the file carries (the spec seat's fourth fact).core-rules.md:65: a human reading the digest sees the exception pointer inside the same sentence.Corpus reading after the change:
grep -rn "围着 spec 契约转" .claude/skills/→ exactly two lines,SKILL.md:240(the statement) andreferences/lanes/spec.md:11(the enumeration it points at); before, three (:247,:249,spec.md:11) with the statement on none of them.grep -rn "锚定规则" .claude/skills/→SKILL.md:239(the rule),:247,:249,core-rules.md:65(three pointers).Deviations, declared
:240「域由分诊读代码判定,⛔ 绝不从 issue 标题的词汇猜域」 and old:241「说不出修复碰哪个文件就还没分诊完,不可标」) now share:241, which is what frees the line the statement occupies. Line count is flat (812 → 812); the statement's content is MOVED from the two row clauses, which shrink to pointers — not net-new. Both rules survive; the digest already grouped them on one line (core-rules.md:66), and old:241's 「还没分诊完,」 is compressed to the digest's own spelling 「就还不可标」. If the seat reads this as re-wrap funding rather than an in-place re-cut of the three anchoring lines, the alternative isblocked— there is no other line in the region.core-rules.md:66is touched only to pay:65's bytes: 「由分诊读代码判定」 moves from:65to the head of:66; 「那个」 drops from:65.:240spellsdevxbare (twice) to fit the cap;:247already spellsskillsbare in the same table.:242–:245on854639b3; they are:239–:241(the rows:247/:249were right). Content-identified, so nothing else was touched.Verification
Gates derived by
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(no paths; change set from the merge base; stderr line 1: derived fromobjectstack-ai/objectstackat48840c4b4), all run on48840c4b4with exit codes captured by redirect-then-$?:pnpm check:pm-skill-ratchetSKILL.md is 812 lines (ceiling 812; headroom 0)·widest table row is 342 bytes (pin 342; headroom 0)(the untouched:245) ·core-rules.md is 151 lines (ceiling 151)·lanes/spec.md is 43 lines (ceiling 43)· self-test 157 casespnpm check:pm-skill-id-lint26 file(s) cleanpnpm check:skill-frame-sync2 copies … structurally isomorphicpnpm check:nul-bytesscanned 8023 text file(s) … no raw ASCII control bytespnpm check:pm-governed-mergespnpm check:pm-governed-prose2 instruction surface(s) name all 5 registered governed surfacespnpm check:doc-authoring398 files cleannode scripts/check-closing-keyword-parity.mjs(+--self-test)3 parsers agree· 24 assertionsnode scripts/check-comment-mask-corpus.mjs6410 files, 0 disagreenode scripts/pm/check-governed-queue-guard.mjs --self-testpnpm --filter @objectstack/lint run check:doc-formula-expressionsPREREQUISITE NOT MET(formula/lint unbuilt — NOT MEASURED); built both underos-verify-lock.sh(VERDICT command-exit 0 · held the lock 2s); re-run 022 record-scoped formula example(s) across 434 files / 1373 TS blocks judged cleanpnpm check:agent-test-spelling·check:driver-memory-census·check:refd-timer-probe·check:watch-hint-literaldispatch-gates --ranreconciliation:16 derived famil(ies) accounted for — 16 run, 0 NOT-MEASURED.node scripts/pm/check-governed-merges.mjs --test .claude/skills/pm-dispatch/SKILL.md .claude/skills/pm-dispatch/references/core-rules.md→ exit 3:Sibling-PR probe (assumption 3):
git merge-tree --write-tree origin/main HEADatorigin/mainc43bac704→ clean; in the merged treewc -l= 812 / 151 / 43.origin/mainmoved by one commit since base (c43bac704, a dogfood test pin; nothing underpm-dispatch/), merged into this branch before the PR was opened. Control-byte self-scan of both files: 0 matches, positive control (a file carrying U+0001) 1 match.验收备注
references/lanes/devx.md:12says 「SUBJECT 例外与 spec 三面切分在 SKILL.md 域车道表」; the split's statement now sits three lines above the table, and the table rows point at it, so the pointer still resolves — wording nit only. 承接者: whoever next touchesdevx.md(no open holder known).references/lanes/engine.md:15states 「content/docs/**与packages/lint⇒domain:devx」 with no exception at all — a third text carrying the same mis-read, outside this card's file surface.维护者速读(草稿)
改了什么:PM 派发技能的域车道表里,
packages/lint在domain:spec与domain:devx之间的切分,原本只藏在两行表行末尾的从句里。现在把它写成「锚定规则」正下方的一行例外(只写一次),两行表行改成指向它的指针,domain:spec行指向车道说明文件的指针注明该文件承载域边界枚举;核心条款摘要的孪生行同步加一个指针。为什么改:同一天两个执行席都按表行的包清单读到
packages/lint就停,得出「lint 整包归 devx」的错误路由结论,其中一次让一张卡返工了整整一轮。规则「每个包恰好属于一个域」对packages/lint并不成立,而例外没写在规则旁边。风险与代价(含回滚):不改任何车道归属,不引任何裁决;行数 812/151 不变,每行不超 120 字节,两行表行仍在 342 字节 pin 内。代价是两条分诊判定规则并到一行、一句「还没分诊完」压缩成摘要文件里已有的写法。回滚 = revert 本 PR 的单个内容 commit。
席位意见:(留空,席位定稿成评论)
你要做的:读一遍改后的
:239–:241、:247、:249是否符合「一处陈述、两处指针」;受管面,人工合并。Generated by Claude Code