Skip to content

docs(pm-dispatch): state the lane table's packages/lint split once beside the anchoring rule - #17086

Merged
yinlianghui merged 2 commits into
mainfrom
claude/issue-16993-lane-table-lint-split-anchor
Sep 9, 2026
Merged

yinlianghui merged 2 commits into
mainfrom
claude/issue-16993-lane-table-lint-split-anchor

Conversation

@yinlianghui

Copy link
Copy Markdown
Collaborator

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's files[] ships (fast lane per the os-dev definition).

What changed — one statement, two pointers

The lane table's packages/lint split 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 the domain:spec row's pointer to references/lanes/spec.md says 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; base 854639b3, merged with origin/main c43bac70):

Before (:239–:241, 108 / 74 / 63 B):

- 锚定规则:每个包恰好属于一个域;issue 的 `domain:*` = 修复落地的那个包所属的域。
- 域由分诊读代码判定,⛔ 绝不从 issue 标题的词汇猜域。
- 说不出修复碰哪个文件就还没分诊完,不可标。

After (:239–:241, 108 / 118 / 120 B; :239 byte-identical):

- 锚定规则:每个包恰好属于一个域;issue 的 `domain:*` = 修复落地的那个包所属的域。
- 唯一例外 `packages/lint` 等与 spec 相交的 devx 面:围着 spec 契约转的归 `domain:spec`,余留 devx。
- 域由分诊读代码判定,⛔ 绝不从 issue 标题的词汇猜域;说不出修复碰哪个文件就还不可标。

Before (:247, 322 B — the split begins at byte 254, after the package list and a second parenthetical):

| `domain:devx` | `packages/lint`、`packages/sdui-parser`、`content/docs/**`、`apps/docs`、`scripts/`(门禁类;与 `domain:skills` 的分界按门禁的 SUBJECT:治理 agent 指令面/governed 面的归 skills,治理代码/文档质量的归本域);与 `domain:spec` 相交的面按是否围着 spec 契约转切分 |

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):

| `domain:devx` | `packages/lint`(与 spec 相交的面均按锚定规则的例外切分)、`packages/sdui-parser`、`content/docs/**`、`apps/docs`、`scripts/`(门禁类;与 `domain:skills` 的分界按门禁的 SUBJECT:治理 agent 指令面/governed 面的归 skills,治理代码/文档质量的归本域) |

Before (:249, 337 B — 「席内分派见 references/lanes/spec.md」 at byte 293, announcing intra-seat assignment only):

| `domain:spec` | `packages/spec` 整包:schema 形状、`contracts/**`、退役行为半边、strictness 台账;describe/JSDoc/墓碑散文/错误 guidance 与 alias 表;`packages/spec/scripts/**`、`packages/spec/docs/**` 及围着 spec 契约转的工具链;一般开发工具面留 `devx`;席内分派见 `references/lanes/spec.md` |

After (:249, 336 B — pointer up to the anchoring rule at byte 224; the file pointer now names what it carries):

| `domain:spec` | `packages/spec` 整包:schema 形状、`contracts/**`、退役行为半边、strictness 台账;describe/JSDoc/墓碑散文/错误 guidance 与 alias 表;`packages/spec/scripts/**`、`packages/spec/docs/**` 及按锚定规则的例外归本域的工具链(域边界枚举与席内分派见 `references/lanes/spec.md`) |

.claude/skills/pm-dispatch/references/core-rules.md :65–:66 (the anchoring rule's digest twin; 151/151, 112 / 92 B → 120 / 120 B):

- 每个包恰好属于一个域(唯一例外见 SKILL.md 锚定规则),域标签等于修复落地的包所属的域。
- 域由分诊读代码判定,⛔ 绝不从 issue 标题的词汇猜域;说不出修复碰哪个文件就还不可标。

references/lanes/spec.md is untouched (43/43): its :11 enumeration is what the :249 pointer 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 the domain:devx row; the first list item now reads 「packages/lint(与 spec 相交的面均按锚定规则的例外切分)」, so 「packages/lint ⇒ domain:devx by 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 the domain:spec row; 「按锚定规则的例外归本域的工具链」 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) and references/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

  1. The two triage-judgment rules (old :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 is blocked — there is no other line in the region.
  2. core-rules.md:66 is touched only to pay :65's bytes: 「由分诊读代码判定」 moves from :65 to the head of :66; 「那个」 drops from :65.
  3. :240 spells devx bare (twice) to fit the cap; :247 already spells skills bare in the same table.
  4. The dispatch placed the anchoring lines at :242–:245 on 854639b3; they are :239–:241 (the rows :247 / :249 were right). Content-identified, so nothing else was touched.
  5. Footer: the repo's rule-line + session-URL form below, not the harness's 「🤖 Generated with」 line.

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 from objectstack-ai/objectstack at 48840c4b4), all run on 48840c4b4 with exit codes captured by redirect-then-$?:

gate exit verdict line
pnpm check:pm-skill-ratchet 0 SKILL.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 cases
pnpm check:pm-skill-id-lint 0 26 file(s) clean
pnpm check:skill-frame-sync 0 2 copies … structurally isomorphic
pnpm check:nul-bytes 0 scanned 8023 text file(s) … no raw ASCII control bytes
pnpm check:pm-governed-merges 0 self-test 274 assertions
pnpm check:pm-governed-prose 0 2 instruction surface(s) name all 5 registered governed surfaces
pnpm check:doc-authoring 0 398 files clean
node scripts/check-closing-keyword-parity.mjs (+ --self-test) 0 / 0 3 parsers agree · 24 assertions
node scripts/check-comment-mask-corpus.mjs 0 6410 files, 0 disagree
node scripts/pm/check-governed-queue-guard.mjs --self-test 0 144 cases
pnpm --filter @objectstack/lint run check:doc-formula-expressions first run 3 = PREREQUISITE NOT MET (formula/lint unbuilt — NOT MEASURED); built both under os-verify-lock.sh (VERDICT command-exit 0 · held the lock 2s); re-run 0 22 record-scoped formula example(s) across 434 files / 1373 TS blocks judged clean
pnpm check:agent-test-spelling · check:driver-memory-census · check:refd-timer-probe · check:watch-hint-literal 0 each OK lines in the logs

dispatch-gates --ran reconciliation: 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:

governed-surface predicate: 2 of 2 path(s) hit the register (5 surfaces, repo-agnostic).
  ⛔  GOVERNED — a human merge is the review record for this PR (#9495 regime).
      No seat flips it ready, enqueues it, or arms auto-merge (AGENTS.md Prime Directive #14).
      .claude/** ×2 — the agent instruction tree (skills, agents, hooks, settings)

Sibling-PR probe (assumption 3): git merge-tree --write-tree origin/main HEAD at origin/main c43bac704 → clean; in the merged tree wc -l = 812 / 151 / 43. origin/main moved by one commit since base (c43bac704, a dogfood test pin; nothing under pm-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.

验收备注

  • noted, not filed: references/lanes/devx.md:12 says 「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 touches devx.md (no open holder known).
  • filed separately: references/lanes/engine.md:15 states 「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

… 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

Copy link
Copy Markdown
Collaborator Author

维护者速读 — PR #17086(#16993,skills 席终稿,2026-09-09T07:34Z)

改了什么 — 车道表对 packages/lint 的拆分规则(围着 spec 契约转的 lint 规则归 domain:spec,一般开发工具面留 devx)原来只写在两行表格单元格末尾的破折号后面,一天里三个席位都读到包列表就停、得出「packages/lint ⇒ domain:devx」的错误路由。现在:锚定规则「每个包恰好属于一个域」正下方只写一次这个唯一例外;domain:devx 行改成在 packages/lint 后面第一句就指向它;domain:spec 行改成指向它,并把「席内分派见 spec.md」改写成说明那份文件承载域边界枚举;core-rules 同改。一处陈述、两个指针,⛔ 没有第三份副本;⛔ 没有任何车道归属被改;⛔ 没有引用那条在技能树里找不到出处的「2026-08-09 裁决」。

为什么改 — 两个执行席在同一天(#16611、#16237)以同样的半读法得出错误路由,#16237 因此整轮返工;spec 席又量到第三例,并发现决定性的枚举其实只在 references/lanes/spec.md:11,表格指针没说它带着边界。

风险与代价(含回滚) — 纯指令文本;回滚 = revert 本 PR。付账:锚定规则下的两条分诊判据(「读代码判域,不猜标题」「说不出碰哪个文件就不可标」)合到一行,措辞压到 120 字节;两条都在。顺带:dev 发现 references/lanes/engine.md:15 还有第三处同样的无例外写法,另立了 #17088(裸卡,待分诊席路由)。

席位意见 — 接受(契约复审档席内复核)。棘轮 812/151/43 未动、最宽表行 342 未动;围着 spec 契约转 在技能树里恰两处;id-lint、frame-sync 绿;控制字节 0;mergeable: true;CI 收敛中。

你要做的 — 合并;或由 os-zhuang / hotlong 批准,本席随即入队。看一处即可::240 那句唯一例外是否就是你对 packages/lint 拆分的理解。


Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review September 9, 2026 07:50
@yinlianghui
yinlianghui added this pull request to the merge queue Sep 9, 2026
Merged via the queue into main with commit f63e3eb Sep 9, 2026
35 checks passed
@yinlianghui
yinlianghui deleted the claude/issue-16993-lane-table-lint-split-anchor branch September 9, 2026 08:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation needs-user-decision size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

3 participants