skills(pm-dispatch): the lane table carries non-gate scripts/pm and the three devx paths; lane files point at it - #17397
Conversation
…he three devx paths; lane files point at it The domain:skills row gains non-gate `scripts/pm/**` (PM loop tools); the domain:devx row gains `.githooks/`, `docker/README.md` and the test-infra face of `examples/**`, paid inside the row under the 342-byte widest-row pin. `lanes/skills.md` and `lanes/devx.md` no longer restate paths and point at the table instead (one statement, pointers to it). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YKEjmbYNvYWJvWGSWx26zK
… new count The lanes/devx.md ceiling row in the line ratchet moves 38 -> 36 to match the file after its three-line path bullet became one pointer line. Shrink-only: lowering needs no ruling, and the ratchet's own text says it is always legitimate. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01YKEjmbYNvYWJvWGSWx26zK
维护者速读改了什么 —— PM 技能的域车道表(哪个包归哪个车道)补齐两行的缺口: 为什么改 —— 表自己宣称是「全量判据」,岗位说明也说以表为准,但表答不了非门禁的 风险与代价(含回滚) —— 纯协议文本,不动代码与门禁;行数净零,表格行宽在 342 字节钉子之内(devx 行 341);棘轮只降不升;dev 派生的 39 个门禁族全绿;CI 在 head 席位意见 —— 通过。本席在契约复审档对照 diff 自读:两行表格内容与岗位说明原文逐项对应,devx 行压缩后的 SUBJECT 句意义不变(agent 指令面本就在受管面定义之内);两处指针句用文件里已有的写法;棘轮下调是它自己的规则。受管面( 你要做的 —— 一个动作:人工合并本 draft PR。 skills 席,session Generated by Claude Code |
Fixes #17225
The 〈域车道〉 table in
.claude/skills/pm-dispatch/SKILL.mdis the declared 全量判据 (「全量判据在 SKILL.md 域车道表」), yet it answered for none of four paths the lane files stated: non-gatescripts/pm/**(stated only inreferences/lanes/skills.md), and.githooks/,docker/README.md,examples/**测试基建面 (stated only inreferences/lanes/devx.md). This PR makes the table the one statement and turns the two lane-file statements into pointers at it — the discipline quoted on the card and its predecessor: one statement, pointers to it. No lane assignment changes: every routing written here is one the lane files already stated, and the 多仓协调 line 「scripts/pm/**等住 objectstack 的全板工具链单写手恒为 objectstack 侧席」 already carried thescripts/pm/**half. Predecessor: #17222 (its PR #17226 landed atd03c3c96); this card is its successor, not a duplicate.Governed surface (
.claude/**) ⇒ draft only, human merge;check-governed-merges.mjs --teston the four paths answers GOVERNED (its own verdict line: 「3 of 4 path(s) hit the register … ⛔ GOVERNED」, exit 3).What changed (before → after, bytes)
Measured at
eb7406ca(base) →b5757749(this PR's head). The two table rows and the two lane-file pointers stand as landed onc8fdd0ce; the patch-round commitb5757749touches only the ratchet map. Line numbers are the base tree's; the files sit under a line ratchet, so read the content, not the numbers..claude/skills/pm-dispatch/SKILL.md— 812/812 lines (ceiling 812); widest table row 342/342 (thedomain:enginerow, unchanged).domain:devxrow (:247), 330 B → 341 B (pin 342). Before:After:
Paid inside the row (+68 B of new paths against 12 B of headroom, so 57 B cut; no stated path lost, no pin raised): the repeated 「门禁」 qualifier on
.github/workflows/(「门禁接线」→「接线」, the qualifier the dispatch named);packages/sdui-parser→sdui-parser(the table's own bare-name convention —runtime,verify,types,plugin-*;packages/lintkeeps its prefix because the 锚定规则 exception line spells it so); 「;三者」→「三者」 as an appositive; 「相交的面」→「相交面」; 「的例外」→「例外」; 「再按」→「按」; and the SUBJECT sentence's two 「治理」 verbs plus 「agent 指令面/」, which is inside governed 面 by the table's own definition lines (「governed 面统一定义:….claude/**(全量,含 agents/hooks/settings)…」 and 「governed 面同含AGENTS.md+CLAUDE.md」), so the SUBJECT split is unchanged: governed 面 → skills, 代码/文档质量 → devx.examples/**carries 「仅测试基建面」 so it does not contradict the no-fixed-home row'sexamples/*(归它演练的子系统), which stays.domain:skillsrow (:248), 254 B → 300 B — one clause inserted after the governed 面全量 clause: 「非门禁的scripts/pm/**(PM 循环工具)」. Nothing else in the row moves; the 「governed 面统一定义」 reference stays verbatim. Ascripts/pm/GATE keeps the devx row's SUBJECT split. After:references/lanes/skills.md— 33/33 lines (ceiling 33). :8, 90 B → 109 B (cap 120):The root instruction files are covered by the table through 「governed 面同含
AGENTS.md+CLAUDE.md」, so the pointer drops no stated path.references/lanes/devx.md— 38 → 36 lines (ceiling 38 → 36 after the patch round; headroom 0). The 范围 bullet at :7–:9 (79/78/55 B, one wrapped bullet) → one line, 83 B:scripts/pm/check-skill-line-ratchet.mjs— one token (patch round; the skills seat's answer A to the open question, surface widened by exactly this file). Thelanes/devx.mdrow ofCEILINGS:Reason: the file's count fell 38 → 36 when its three-line path bullet became one pointer line; the ratchet is shrink-only and its own text says lowering is always legitimate, so the ceiling is re-locked at the new count with headroom 0 instead of leaving two lines of growth budget nobody paid for. No ruling is needed to lower; nothing else in that file moves.
Re-check (the card's commands), before → after
On
.claude/skills/pm-dispatch/SKILL.md:grep -c -- ".githooks"0 → 1 ·grep -c -- "docker/README"0 → 1 ·grep -c -- "scripts/pm/\*\*"1 → 2 (the new hit is thedomain:skillsrow; the file-widegrep -c "scripts/pm"reads 15 → 15 because SKILL.md names manyscripts/pm/*tools by file) ·grep -c -- "examples/"1 → 2 · controlgrep -c "domain:spec"5 → 5.On
references/lanes/skills.md:grep -c "scripts/pm"1 → 0. Onreferences/lanes/devx.md:.githooks1 → 0,docker/README1 → 0,examples/1 → 0.The decision-frame block (:734–:752) is untouched: md5
22f2339f0acb64cdb50c7adc9db681c3before and after.Gates (all run at
b5757749, the final head; exit codes captured before any pipe)Derived with
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commandson the widened diff: 39 families (16 on the first headc8fdd0ce; the ratchet-script edit adds 23,check:pm-dispatch-gatesamong them);--ranreconciliation atb5757749: 「39 derived, 39 run, 0 NOT-MEASURED, 0 UNRUN」 with every recorded exit code. All exit 0, each gate's own verdict line read:check:pm-skill-ratchet— SKILL.md 「812 lines (ceiling 812; headroom 0)」, 「widest table row is 342 bytes (pin 342; headroom 0)」; lanes/skills.md 「33 lines (ceiling 33; headroom 0)」; lanes/devx.md 「36 lines (ceiling 36; headroom 0)」 (onc8fdd0ce, before the patch round, it read 「36 lines (ceiling 38; headroom 2)」).check:skill-frame-sync— 「the one declared copy of the decision frame is internally coherent」.check:pm-skill-id-lint— 「27 file(s) clean」.check:pm-governed-prose— 「2 instruction surface(s) name all 5 registered governed surfaces … and claim no others」.check:nul-bytes— 「OK (scanned 8179 text file(s) …)」.check-closing-keyword-parity(+--self-test),check-comment-mask-corpus,check-governed-queue-guard --self-test,check:agent-test-spelling,check:doc-authoring,check:driver-memory-census,check:pm-governed-merges,check:refd-timer-probe,check:watch-hint-literal, and@objectstack/lint check:doc-formula-expressions(first run exit 3 = its own PREREQUISITE NOT MET on an unbuilt worktree, NOT MEASURED by its own text; afterturbo run build --filter=@objectstack/formula --filter=@objectstack/lintunder the verify lock, VERDICT command-exit 0, the re-run exits 0: 「22 record-scoped formula example(s) … judged clean」).check-reference-carrier-shape(+--self-test),check-ci-filter-parity,check-declaration-mirrors(+--self-test),check-scripts-symbol-anchors(+--self-test),check-self-test-wired(+--self-test),check-self-test-workflow-commands(+--self-test),check-whole-set-label-write(+--self-test),bare-root-worklist --self-test,report-test-timings --self-test,check:bash32-floor,check:cli-command-ids,check:cross-package-test-inputs,check:entry-guard,check:parse-guard,check:pnpm-filter-targets,check:ratchet-remedy-authority.check:pm-dispatch-gates(dispatch-named on the first head, derived on the second) — 「dispatch-gates self-test: 1674 cases pass」, exit 0 on both heads (each run overran the foreground cap, was detached, and its verdict read from its redirected log).check-governed-merges.mjs --teston all four paths: 「3 of 4 path(s) hit the register … ⛔ GOVERNED」, exit 3 (expected; the ratchet script is not governed,.claude/**is).skip-changeset: nothing published moves — three files live under.claude/**and the fourth underscripts/pm/**, neither of which any package'sfiles[]ships.Deviations from the dispatch
lanes/devx.mdlands at 36 lines, not the claim's 「38/38, net-zero」: the claim assumed the devx statement was one line; ateb7406cait is a three-line wrapped bullet (:7–:9), and a pointer takes one line. Padding two lines to hold the count would be filler. Resolved on this branch by the patch round: the ceiling row was lowered to 36 (surface widened by exactly that file, answer A to the open question).check:pm-dispatch-gates; all were run.Acceptance notes
lanes/skills.md:7 (.claude/skills/**,skills/**) and :9 (.github/CODEOWNERS) still restate paths the table carries (governed 面全量; the CODEOWNERS clause) — pre-existing and outside the declared surface; same discipline, not class (a)/(b)/(c). 承接者: the skills seat (the file's own lane), if a follow-up under the same discipline is wanted.lanes/devx.md:11 states a path criterion for skills-guarding gates underscripts/while the table splits gates by SUBJECT; :12 defers the SUBJECT exception to the table, so the pair reads as default plus exception. 承接者: none needed.AGENTS.md+CLAUDE.md; one definition across two lines, matching the five-entry register (check:pm-governed-prosegreen). 承接者: none needed.维护者速读(草稿)
改了什么:PM 技能里的「域车道表」现在自己写全了四条路径的归属:非门禁的
scripts/pm/**(PM 循环工具)归 skills 席;.githooks/、docker/README.md、examples/**的测试基建面归 devx 席。两份车道岗位说明(skills、devx)里原来各自重复陈述的路径删掉,改成一句「见 SKILL.md 域车道表」的指针。SKILL.md 行数 812 不变,最宽表行 342 字节不变;devx 岗位说明由 38 行减到 36 行,其行数上限也在本 PR 内同步降到 36(棘轮只收不放)。为什么改:表被声明为「全量判据」,但这四条路径只写在岗位说明里、表里没有;两处各说一套,分诊时该信哪一处没有答案。一处陈述、其余指向,是这条线上前两张卡已经定下的纪律。⛔ 本 PR 不改任何归属:写进表里的都是岗位说明与「多仓协调」行早已说了的。
风险与代价(含回滚):纯协议文本,不碰代码、不发布任何包;风险是表行为了装下三条路径压缩了措辞(见正文 before/after),语义逐条对照过、门禁全绿。回滚 = revert 本 PR 的两个提交即可。无遗留:行数上限已随本 PR 一并收紧。
席位意见:(留空)
你要做的:人工合并本 draft PR(受管面,不走队列)。
Generated by Claude Code