Repository navigation
Commit f151ef2
pm-dispatch: SKILL.md principle-only (815 → 319 lines) — dispatch / review / landing detail relocated into per-phase references, core-rules.md retired (#19805)
Fixes #19716
Clause-②: no
## 维护者速读(草稿)
**改了什么**:PM 协议主文 `.claude/skills/pm-dispatch/SKILL.md` 从 815 行压到 319
行,只留原则——红线、优先级、入口与角色(含参数表)、新增的「阶段细则索引」表、全体座位的不变量、状态模型、域车道、受管面的「路径分叉」块、升级与决策(含四轴框架单源)、报告契约、机械守卫索引、模板与表。派发
/ 分诊 / 座位生命周期 / 读数纪律 / 多仓协调 / 入队与落地的细则逐字搬进六份按阶段读的
references(五份新建:`seat-lifecycle.md`、`reading-discipline.md`、`cross-repo-coordination.md`、`triage-duties.md`、`execution-duties.md`;既有的
`landing-operations.md` 吸收「入队与落地」),每份第一行写明哪个座位在哪个 fire
读它。`references/core-rules.md`(SKILL.md 的人读摘要副本,151
行)删除,所有指向它和被搬章节的指针重定向。行数棘轮把 SKILL.md 上限从 819 降到 319,新文件按落地行数入表,棘轮总量下降。
**为什么改**:决策批 #213 第 4 项,维护者原话「1 2 4 同意」,项目原文「协议主文 819 → 约 300 行(红线 +
状态模型 + 入口 + 索引),派发 / 复核 / 入队细则各成一份按阶段读的 reference;同时删 core-rules.md
双份」。目的是每个座位每次 fire 只读本阶段的文件,不再整本重读 815 行外加 151 行的副本。
**风险与代价(含回滚)**:纯搬迁,无语义变化——被搬的 465 条规则行里 459 条逐字相同,5 条只改了指针拼写(指向新家),1
条自指指针删除;「⛔」行数搬前搬后相等(对合并基点 558 对 558,对派发基点 559 对 559;都不计被删副本自带的 59
行)。代价落在指针:部分 references 的指针行受 120
字节行宽与零余量约束,只写文件名不写章节名(章节标题在新文件里原样保留);两个门禁脚本各改了一处指向路径(自测通过)。SKILL.md 落在
319 行——高于「约 300」但低于 340 上限——多出的部分是 `check:pm-governed-prose` 锚定在
SKILL.md 里的受管面路径分叉块(28 行)加索引表(11 行)。回滚 = revert 本 PR(一个 squash
commit);棘轮上限已降,回滚时抬回需维护者裁决引用。
**席位意见**:(席位填写)
**你要做的**:本 PR 属 Tier S(路径全在 `.claude/**` 与 `scripts/pm/**`),由 skills
席在席内契约复审 PASS 后走队列落地,不需要你点击。若对新文件命名、或 SKILL.md 保留 319 行而非约 300 行有异议,在本
PR 评论一句即可。
## What this PR does
Relocation, not deletion — decision batch #213 item 4 (maintainer,
verbatim: 「1 2 4 同意」). Every rule line of `SKILL.md` on the base
(`fae870352`, 815 lines) ends up in exactly one place: `SKILL.md` if it
is principle, otherwise one per-phase reference.
`references/core-rules.md` (the declared subset / human digest, 151
lines) is deleted. No rule added, no rule dropped, no gate / hook /
ratchet / roster added; `os-dev.md`, `AGENTS.md` and `skills/**`
untouched.
Six destination files, one commit each (the branch is bisectable by
destination):
| destination | opens with (which seat reads it on which fire) | lines |
|:--|:--|--:|
| `references/execution-duties.md` (new) | 执行席每次 fire
读本文:候选、认领、派发、收集、复核;落地窗口另读 `landing-operations.md`。 | 183 |
| `references/seat-lifecycle.md` (new) | 每个座位每次 fire
读本文:开轮互斥读数之前读〈开轮互斥〉,收班之前读其余各节。 | 96 |
| `references/triage-duties.md` (new) | 分诊席每次 fire 开局读本文;本文是分诊座位的全部职责。 |
120 |
| `references/reading-discipline.md` (new) | 任一座位在取读数、引读数或核验 main
的那一刻读本文,所有 fire、所有阶段。 | 37 |
| `references/cross-repo-coordination.md` (new) | 分诊席每次 fire
路由与查重前读本文;执行席跨仓认领、派发或转移时读本文。 | 51 |
| `references/landing-operations.md` (existing, absorbs 入队与落地) |
执行席在落地窗口(ACCEPT 之后至 MERGED)读本文;入队与落地条款与 A–D 操作细则都在此。 | 69 → 101 |
Why two files beyond the card's suggested shape: 平台读数纪律 and 多仓协调 are
read by BOTH seats (readings are taken on every fire; cross-repo routing
is triage's, cross-repo claiming/dispatch is execution's). Folding
either into one seat's phase file would make the other seat skip it — a
rule dropped in effect — and keeping both in `SKILL.md` lands it at 367
lines, over the 340 ceiling. Each gets a single-section file whose title
is the section heading, so every 〈heading〉 pointer still resolves.
## Section → destination (base line spans of `SKILL.md` at `fae870352`)
| base span | section | destination |
|:--|:--|:--|
| 1–76 | frontmatter, intro, 红线, 优先级 (42–44 rewritten, see pointers),
入口与角色 | stays (SKILL.md) |
| 77–92 | 入口与角色 · the 开轮互斥 bullets | `seat-lifecycle.md` 〈开轮互斥〉 |
| 94–158 | 全体座位的不变量, 状态模型 (table + bullets) | stays |
| 159–194 | 平台读数纪律 | `reading-discipline.md` |
| 195–244 | 多仓协调 | `cross-repo-coordination.md` |
| 245–271 | 域车道 (table + bullets) | stays |
| 272–296 | 座位贴协议 | `seat-lifecycle.md` 〈座位贴协议〉 |
| 297–312 | Epic 子树车道 | `seat-lifecycle.md` 〈Epic 子树车道〉 |
| 313–431 | 分诊座位职责 | `triage-duties.md` |
| 432–435 | 执行座位职责 heading + intro bullet | `execution-duties.md` |
| 436–481 / 482–511 / 512–573 / 574–597 | 候选与批次 / 认领 / 派发 / 收集 |
`execution-duties.md` 〈候选与批次〉〈认领〉〈派发〉〈收集〉 |
| 598–612 | 复核 (the verdict rules) | `execution-duties.md` 〈复核〉 |
| 613–641 | 复核 · **ACCEPT 之后的路径分叉** … 本段只适用本循环派发的 dev PR | stays, under
the new heading `## 路径分叉` — `check:pm-governed-prose` anchors its
SKILL.md region on exactly these two lines, and
`check-expected-skips.mjs`'s self-test pins the 入队资格 line at 637 |
| 642–674 | 入队与落地 | `landing-operations.md` 〈入队与落地〉 (644, a self-pointer
to that very file, dropped) |
| 675–690 / 691–698 / 699–707 | 轮次报告与节奏 / 停止条件与待命 / 断粮与跨墙恢复 |
`seat-lifecycle.md` (收班) |
| 708–815 | 升级与决策 (frame block 737–757 byte-identical, md5
`abff5f852c8fd09b79ec0623439aa4f0`), 报告契约, 机械守卫索引, 模板与表 | stays |
New in `SKILL.md`: `## 阶段细则索引` (a 6-row table: file · which seat reads
it on which fire · sections it carries), one pointer line in 入口与角色 to
〈开轮互斥〉, and the `## 路径分叉` heading. SKILL.md: 815 → 319 lines (≈ 300
target, ≤ 340 ceiling; the excess over 300 is the retained 28-line
governed-prose block plus the 11-line index).
## Proof: relocation, not deletion
Measured by an independent verifier over the working tree against `git
show de4ed33:…` (the merge base; script in the report):
- Moved content lines (non-blank, non-heading, in the spans above):
**465** — **459 verbatim**, **5 rewritten** (pointer retargets inside
moved text, listed below), **1 dropped** (644, the self-pointer), **0
missing**.
- Retained `SKILL.md` lines: **302 / 302** present in their original
order (the three rewritten and the one dropped 优先级 line excepted, listed
below).
- 「⛔」 lines, against the PR's merge base `de4ed33fd`: before **617**
(`SKILL.md` 194 + `references/**` 423, of which `core-rules.md` 59) —
after **558** (`SKILL.md` 68 + `references/**` 490). Excluding the
deleted duplicate's own 59 lines: **558 == 558**. (Against the dispatch
base `fae870352` the same proof reads 618 → 559, the one-line difference
being #19795's edit to `seat-post-protocol.md`, merged in.)
- Decision frame block: byte-identical, only its line position changed
(`check:skill-frame-sync` and `-freshness` green).
## Pointer retargets (every one in place, same line count, ≤ 120 bytes)
Inside moved text (the 5 rewrites): 89
「三章程(本文、core-rules、本席章程)」→「SKILL.md、阶段 references、本席章程」(the touch-check
set follows where the rules now live; core-rules gone); 183 「(见认领节)」→「(见
execution-duties.md 认领)」; 491 「照抄 模板与表 节」→「照抄 SKILL.md 模板」; 612 「见 升级与决策
节」→「见 SKILL.md 〈升级与决策〉」; 694 「按收集节②」→「按 `execution-duties.md` 收集节②」.
In `SKILL.md`: 42 drops the 「核心条款」 tier from the priority chain (the
file it named is deleted; no new tier introduced); 43 now points at
`references/**` and 〈阶段细则索引〉 instead of `core-rules.md`; 44
「一条规则在本文与核心条款一处改动,另一处同 PR 同改」 dropped — its whole object is the deleted
duplicate; 56 「见 Epic 子树车道 节」→ `references/seat-lifecycle.md` 〈Epic
子树车道〉.
In references (line 3 unless noted): `review-checklist.md` →
`execution-duties.md` 〈复核〉; `compile-surfaces.md` →
`execution-duties.md`; `true-green.md`, `lanes/devx.md`:19,
`lanes/skills.md`:10 → SKILL.md 〈路径分叉〉;
`lanes/{cli,devx,engine,services,skills,spec}.md` → `seat-lifecycle.md`;
`seat-post-protocol.md` → `seat-lifecycle.md` 〈座位贴协议〉;
`lanes/triage.md`:2 → `triage-duties.md`; `instrument-discipline.md`,
`platform-readings.md` → `reading-discipline.md`; `filing-gate.md` →
`triage-duties.md` 与 `reading-discipline.md`; `lanes/hotcrm.md`,
`lanes/ui.md`:3/13/19/21 → `cross-repo-coordination.md`;
`contract-review.md`:3 → `landing-operations.md` 〈入队与落地〉 (lines 13 / 19
byte-identical, #19061 step ④'s); `external-contributions.md` →
`landing-operations.md`. Where the retargeted line sits at the 120-byte
cap in a headroom-0 file, it cites the file without the 〈heading〉; the
heading itself is unchanged inside the destination.
In scripts: `scripts/pm/dispatch-gates.mjs` 25403 / 26508 — the two
self-test specimens that named `references/core-rules.md` now name
`references/state-machine.md` (an internal references file that exists;
the assertion, "carries no mandate", is unchanged);
`scripts/pm/check-half-states.mjs` 15523 (H65 prescription) plus its two
docblock lines 15104 / 15171 — `SKILL.md 〈分诊座位职责〉` →
`references/triage-duties.md 〈分诊座位职责〉`.
## Ceiling map (`scripts/pm/check-skill-line-ratchet.mjs`), before →
after
| entry | before | after |
|:--|--:|--:|
| `SKILL.md` | 819 | 319 (降恒合法) |
| `references/landing-operations.md` | 69 | 101 — declared CROSS-FILE
MOVE, source `SKILL.md` 819 → 319: +32 against −500, authorised by
#14685 item 5 (comment 5520452691) |
| `references/core-rules.md` | 151 | row and table-row pin removed with
the file |
| `references/seat-lifecycle.md` · `reading-discipline.md` ·
`cross-repo-coordination.md` · `triage-duties.md` ·
`execution-duties.md` | — | 96 · 37 · 51 · 120 · 183 (new rows at landed
count; table-row pins 0, they carry no table) |
| map total | | down 132 lines (−500 −151 +32 +487); the gate reports
the declared moves' total down 477 |
## Gates (exits captured before any pipe)
All families below ran on `8df1e7e52`; after merging `origin/main`
(`de4ed33fd`, three commits: #19792, #19795 and a spec changeset, none
touching `scripts/pm/**`) the ratchet family, `check:pm-skill-id-lint`,
`check:skill-frame-sync`, `check:skill-frame-freshness`,
`check:pm-governed-prose` and `check:nul-bytes` were re-run on the
merged head `f20de6220`, all exit 0, and `--ran` re-reconciled there
(derived list unchanged).
The five the card names: `check:pm-skill-ratchet` exit 0 (`SKILL.md is
319 lines (ceiling 319; headroom 0)`; `declared cross-file moves: 2,
total ceilings down 477 lines`; self-test 157 cases) ·
`check:pm-skill-id-lint` exit 0 (34 files clean) ·
`check:skill-frame-sync` exit 0 (one declared copy, coherent) ·
`check:skill-frame-freshness` exit 0 (current with origin/main) ·
`check:pm-governed-prose` exit 0 (2 instruction surfaces name all 6
governed surfaces).
Derived by `node scripts/pm/dispatch-gates.mjs --repo
objectstack-ai/objectstack --commands` (50 families from the merge-base
change set, 29 paths) and reconciled with `--ran`: `Run reconciliation —
50 derived, 50 run, 0 NOT-MEASURED, 0 UNRUN`, every family recorded with
its exit code (`dispatch-gates --ran` exit 0; the one extra,
`check:skill-frame-freshness`, is outside the derivation). Among them
`check:pm-half-states` exit 0 (4897 cases; the H65 battery reads the
retargeted prescription), `check:pm-governed-merges` exit 0,
`check:pm-expected-skips` exit 0 (its SKILL.md enqueue-bar pin still
holds — the line stayed), `check-governed-queue-guard.mjs --self-test`
exit 0, `check-harness-current.mjs --self-test` exit 0,
`check:doc-authoring` exit 0, `check:nul-bytes` exit 0,
`check:commit-card-trailers` exit 0. `check:pm-dispatch-gates` exit 0 —
`✓ dispatch-gates self-test: 1905 cases pass` (`the battery took 713.0s
on this box`; run detached as its header prescribes, exit captured to a
file). `check:doc-formula-expressions` (derived only because
`dispatch-gates.mjs` is edited) exit 0 after its prerequisite `turbo run
build --filter=@objectstack/formula --filter=@objectstack/lint` under
the verify lock (`VERDICT command-exit 0`): 22 record-scoped examples
across 456 files clean.
Changed lines: 623 additions + 710 deletions = 1,333 (under the 5,000
human-merge threshold). `check-governed-merges.mjs --branch
claude/issue-19716-skill-md-principle-only` (offline, merge-base): exit
3 GOVERNED — Tier S(席内达档复核落地), `.claude/** ×26`, `scripts/pm/*` not on
the register, size 1,333 ≤ 5,000; the `--pr` reading (head repo) is in
the report.
## Readings on the base that differ from the card
- `references/lanes/director.md` and `scripts/pm/git-history.mjs` carry
no `core-rules` reference on `fae870352` (`git grep -c core-rules` → 0
for both). The 「三章程 touch list」 the card attributes to `git-history.mjs`
is SKILL.md line 89 (the tool is `git-history.mjs touch`); it is
rewritten as listed above.
- The 「本车道」 sentence (base line 266) stays in 域车道 and was left
untouched; PR #19792 landed on `origin/main` while this branch was in
flight and the merge brought the ruled wording in cleanly (now SKILL.md
line 175). Nothing of another card's is pre-applied here.
## Acceptance notes
- Two gate docblocks — `scripts/pm/check-clause2-carriers.mjs` 3940–3941
and `scripts/pm/check-governed-queue-guard.mjs` 272–273 — attribute 「记录
= 同形评论落 PR 或卡」 to `SKILL.md 〈入队与落地〉`; the phrase is nowhere in
`SKILL.md` on the base (pre-existing staleness). Left untouched:
retargeting the pointer would keep a false claim. 承接者: skills seat (a
one-line docblock correction when either file is next edited).
- `scripts/pm/check-clause2-carriers.mjs` prose that says "SKILL.md's
handover sentence" (its `CLAIM_HANDOVER_SENTENCE_LINES` twin now lives
in `execution-duties.md` 〈认领〉, byte-identical) — file-name-only prose,
no heading pointer; left. 承接者: same.
- `check:doc-formula-expressions` is derived for this change set only
through `dispatch-gates.mjs` being edited; it needs
`@objectstack/formula` and `@objectstack/lint` built first (exit 3 =
prerequisite, not a finding, until built).
## Changeset
`skip-changeset`: every changed path is under `.claude/**` or
`scripts/pm/**`, which are in no package's `files[]` — nothing published
moves.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01Wnstp2kTth7sGXfr8fXypc)_
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent 502f179 commit f151ef2
29 files changed
Lines changed: 623 additions & 710 deletions
File tree
- .claude/skills/pm-dispatch
- references
- lanes
- scripts/pm
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| |||
This file was deleted.
0 commit comments