Skip to content

skills(pm-dispatch): the lane table carries non-gate scripts/pm and the three devx paths; lane files point at it - #17397

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-17225-lane-table-rowless-paths
Sep 10, 2026
Merged

os-zhuang merged 2 commits into
mainfrom
claude/issue-17225-lane-table-rowless-paths

Conversation

@os-litant

@os-litant os-litant commented Sep 10, 2026

Copy link
Copy Markdown
Collaborator

Fixes #17225

The 〈域车道〉 table in .claude/skills/pm-dispatch/SKILL.md is the declared 全量判据 (「全量判据在 SKILL.md 域车道表」), yet it answered for none of four paths the lane files stated: non-gate scripts/pm/** (stated only in references/lanes/skills.md), and .githooks/, docker/README.md, examples/** 测试基建面 (stated only in references/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 the scripts/pm/** half. Predecessor: #17222 (its PR #17226 landed at d03c3c96); this card is its successor, not a duplicate.

Governed surface (.claude/**) ⇒ draft only, human merge; check-governed-merges.mjs --test on 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 on c8fdd0ce; the patch-round commit b5757749 touches 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 (the domain:engine row, unchanged).

domain:devx row (:247), 330 B → 341 B (pin 342). Before:

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

After:

| `domain:devx` | `sdui-parser`、`content/docs/**`、`apps/docs`、`.githooks/`、`docker/README.md`、`examples/**` 仅测试基建面;`packages/lint`、`scripts/`(门禁类)、`.github/workflows/`(接线)三者与 spec 相交面按锚定规则例外归 `domain:spec`,门禁按 SUBJECT:governed 面归 skills,代码/文档质量归本域 |

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-parsersdui-parser (the table's own bare-name convention — runtime, verify, types, plugin-*; packages/lint keeps 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's examples/*(归它演练的子系统), which stays.

domain:skills row (: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. A scripts/pm/ GATE keeps the devx row's SUBJECT split. After:

| `domain:skills` | governed 面全量(含本文件;统一定义见「governed 面统一定义」行);非门禁的 `scripts/pm/**`(PM 循环工具);governed 面的治理执行文件:`.github/CODEOWNERS` + SUBJECT 是 governed 面本身的门禁/审计(现为 `scripts/pm/check-governed-merges.mjs`) |

references/lanes/skills.md — 33/33 lines (ceiling 33). :8, 90 B → 109 B (cap 120):

before: - `scripts/pm/**` PM 循环工具;指令架构文件:根 `AGENTS.md` 与根 `CLAUDE.md`。
after:  - PM 循环工具与指令架构文件的归属见 SKILL.md 域车道表 `domain:skills` 行,⛔ 不另抄。

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:

before:
- `packages/lint`、`packages/sdui-parser`、`content/docs/**`、`apps/docs`、
  `scripts/`(门禁类)、`.github/workflows/`(门禁接线)、`.githooks/`、
  `examples/**` 测试基建面、`docker/README.md`。
after:
- 本席路径面全量在 SKILL.md 域车道表 `domain:devx` 行,⛔ 不另抄。

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). The lanes/devx.md row of CEILINGS:

before: ['.claude/skills/pm-dispatch/references/lanes/devx.md', 38],
after:  ['.claude/skills/pm-dispatch/references/lanes/devx.md', 36],

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 the domain:skills row; the file-wide grep -c "scripts/pm" reads 15 → 15 because SKILL.md names many scripts/pm/* tools by file) · grep -c -- "examples/" 1 → 2 · control grep -c "domain:spec" 5 → 5.
On references/lanes/skills.md: grep -c "scripts/pm" 1 → 0. On references/lanes/devx.md: .githooks 1 → 0, docker/README 1 → 0, examples/ 1 → 0.
The decision-frame block (:734–:752) is untouched: md5 22f2339f0acb64cdb50c7adc9db681c3 before 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 --commands on the widened diff: 39 families (16 on the first head c8fdd0ce; the ratchet-script edit adds 23, check:pm-dispatch-gates among them); --ran reconciliation at b5757749: 「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)」 (on c8fdd0ce, 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) …)」.
  • Derivation-added beyond the dispatch's list, all exit 0: 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; after turbo run build --filter=@objectstack/formula --filter=@objectstack/lint under the verify lock, VERDICT command-exit 0, the re-run exits 0: 「22 record-scoped formula example(s) … judged clean」).
  • Patch-round additions (families that read the ratchet script), all exit 0: 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 --test on 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 under scripts/pm/**, neither of which any package's files[] ships.

Deviations from the dispatch

  1. lanes/devx.md lands at 36 lines, not the claim's 「38/38, net-zero」: the claim assumed the devx statement was one line; at eb7406ca it 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).
  2. Zone 2 A held in direction but not in size: 12 B of headroom against +68 B of new paths meant 57 B of cuts inside the row, listed above; no path lost, pin not raised. The devx row's SUBJECT sentence is compressed, not byte-identical.
  3. The gate derivation added nine families the dispatch did not name and omitted check:pm-dispatch-gates; all were run.

Acceptance notes

  • noted, not filed: 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.
  • noted, not filed: lanes/devx.md :11 states a path criterion for skills-guarding gates under scripts/ 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.
  • noted, not filed: SKILL.md's 「governed 面统一定义」 line spells three globs and the next line adds AGENTS.md + CLAUDE.md; one definition across two lines, matching the five-entry register (check:pm-governed-prose green). 承接者: none needed.

维护者速读(草稿)

改了什么:PM 技能里的「域车道表」现在自己写全了四条路径的归属:非门禁的 scripts/pm/**(PM 循环工具)归 skills 席;.githooks/docker/README.mdexamples/** 的测试基建面归 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

…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

Copy link
Copy Markdown
Collaborator Author

维护者速读

改了什么 —— PM 技能的域车道表(哪个包归哪个车道)补齐两行的缺口:domain:skills 行写明非门禁的 scripts/pm/**(PM 循环工具)归 skills 席;domain:devx 行补上 .githooks/docker/README.mdexamples/** 的测试基建面,在行内压缩措辞付账,不抬表格行宽上限。两份车道岗位说明里原来各自重复陈述的路径改成指向表的一句指针,从此一处陈述、不再两处各说。devx 岗位说明由三行折成一行后,棘轮上限同步下调 38 → 36。主文件 812 行不变。

为什么改 —— 表自己宣称是「全量判据」,岗位说明也说以表为准,但表答不了非门禁的 scripts/pm/** 归谁,也没有 devx 说明里列的三个路径。两处各说一版,哪张卡该谁认领就要靠人推。这是 #17222 同一纪律的后继:一处陈述,指针指向它。⛔ 没有改动任何既有归属,只是把岗位说明已经写着的东西写进表。

风险与代价(含回滚) —— 纯协议文本,不动代码与门禁;行数净零,表格行宽在 342 字节钉子之内(devx 行 341);棘轮只降不升;dev 派生的 39 个门禁族全绿;CI 在 head b5757749 上收敛中。回滚 = revert 两个提交。

席位意见 —— 通过。本席在契约复审档对照 diff 自读:两行表格内容与岗位说明原文逐项对应,devx 行压缩后的 SUBJECT 句意义不变(agent 指令面本就在受管面定义之内);两处指针句用文件里已有的写法;棘轮下调是它自己的规则。受管面(.claude/**):本席不翻 ready、不入队、不批准。

你要做的 —— 一个动作:人工合并本 draft PR。

skills 席,session session_01YKEjmbYNvYWJvWGSWx26zK,2026-09-10T11:41Z。


Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review September 10, 2026 11:42
@os-zhuang
os-zhuang enabled auto-merge September 10, 2026 11:42
@os-zhuang
os-zhuang added this pull request to the merge queue Sep 10, 2026
Merged via the queue into main with commit d5125f2 Sep 10, 2026
42 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-17225-lane-table-rowless-paths branch September 10, 2026 12:07
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

2 participants