Skip to content

Commit 0cd841a

Browse files
claude[bot]claude
andauthored
skills(pm-dispatch): an out-of-tier seat hands a skills-face hunk's review to the skills seat (#17806)
Fixes #17490 ## What changed One line of `.claude/skills/pm-dispatch/SKILL.md` (the governed ACCEPT fork, rule ①) is replaced in place. Nothing else moves: same line count, the four-axis frame block untouched, no reference twin, the tiering ruling's own text untouched. | | line 610 | bytes (no newline) | |:--|:--|--:| | before (`a77b4e92e`, identical on the dispatch tip `6682c5d8`) | `- ① 复核结论照常写在 issue 上;技能面 PR 的复核席须跑在契约复审档位。` | 96 | | graded candidate (comment 5624178855, re-measured on the base) | `- ① 复核结论照常写在 issue 上;技能面 PR 须由契约复审档的席复核,档外席交 skills 席。` | 114 | | **after (this PR)** | `- ① 复核结论照常写在 issue 上;技能面 hunk 须由契约复审档的席复核,档外席先交 skills 席。` | **119** | Line cap is 120 bytes (`scripts/pm/check-skill-line-ratchet.mjs`, "Why 120 bytes"); 119 is under it. File stays 812 lines, ceiling 812, headroom 0 — no line added, no rule deleted, no re-wrap, no density payment. ### The three ruled elements, mapped to the words The ruled direction is option 3 on the card (5624178855): the seat that cannot run the tier hands the `skills/**` hunk's review to the skills seat, which records it on the card before the four-piece terminal fires; the lane's own review of the code half stands. | element | words | |:--|:--| | (a) the conclusion still goes on the issue | `复核结论照常写在 issue 上` — unchanged from the old line | | (b) the review of the `skills/**` hunk runs at the contract-review tier | `技能面 hunk 须由契约复审档的席复核` — the skills-face hunk must be reviewed by a seat AT the contract-review tier | | (c) a seat outside that tier hands that review to the skills seat | `档外席先交 skills 席` — an out-of-tier seat hands it to the skills seat first | Two wording changes against the graded 114 B candidate, both inside the ruled direction and inside the cap: - `PR` → `hunk` (+2 B). The ruling hands over the **hunk's** review and keeps the lane's review of the code half; with `PR` the sentence read as handing the whole PR review across seats, which contradicts that second clause. `hunk` is already vocabulary in this skill (`references/dispatch-runbook.md` lines 101 and 151). For a PR that is entirely `skills/**`, hunk = PR, so nothing narrows. - `交` → `先交` (+3 B). The ruling says the handed-off review is recorded on the card **before the four-piece fires**; `先` carries that ordering, closing the failure mode where a seat fires the four-piece and hands off afterwards, leaving the PR at the maintainer with no at-tier read. Kept from the candidate: `技能面` (the term the old line and line 600's `触 skills/** 的 PR` pairing already use), `契约复审档`, `skills 席`. ### core-rules twin check `git grep -n '契约复审档位' origin/main -- .claude/skills/pm-dispatch/references/core-rules.md` ⇒ exit 1 (no hit). A wider probe `git grep -n '复核席\|技能面 PR' origin/main -- .claude/skills/pm-dispatch/references/core-rules.md` ⇒ exit 1 (no hit). The only tier sentence in core-rules (line 112, `语义面卡恒契约复审档施工,契约卡达档复核归 spec 席`) is about the build tier and the spec seat's clause-② review, not the governed fork's rule ① — not a twin. `references/core-rules.md` is untouched. The phrase `契约复审档位` also appears in `references/contract-review.md` line 57 (`产出裁决的每轮都须读到契约复审档位`) — that is the contract-review reading's own tier requirement, a different rule; untouched. ### Premise check (all three PM readings held) 1. Line 610 on `6682c5d8` and on the actual base `a77b4e92e` (origin/main moved by one commit between dispatch and branch cut — PR #17794, which touches only `references/dispatch-runbook.md`; `git diff --stat 6682c5d HEAD -- SKILL.md` is empty) is the 96 B sentence above, 97 B with its newline. Ratchet verdict on the base: `SKILL.md is 812 lines (ceiling 812; headroom 0)`. No open PR touches SKILL.md or core-rules.md: the 30 most recently updated open PRs (newest at 06:19Z, i.e. none after the PM's 06:29Z reading) were listed via REST; the two pm/ci PRs in that list (#17799, #17801) were file-listed and touch `scripts/pm/check-clause2-carriers.mjs` and workflow/script files only. 2. The interim was already executed at tier by the previous skills seat on card 17134 (PR #17462); that card was read only, not touched. 3. `node scripts/pm/dispatch-gates.mjs --tier .claude/skills/pm-dispatch/SKILL.md` prints `Model tier — MANDATORY: claude-fable-5-1`. This PR was authored at that tier (claude-fable-5-1). ### Governed verdict `node scripts/pm/check-governed-merges.mjs --test .claude/skills/pm-dispatch/SKILL.md` ⇒ exit 3: `governed-surface predicate: 1 of 1 path(s) hit the register (5 surfaces, repo-agnostic).` / `⛔ GOVERNED — a human merge is the review record for this PR`. ⇒ draft at the human terminal; no ready flip, no queue, no auto-merge from any seat. `skip-changeset` applied additively (`.claude/**` publishes nothing). ## Verification (final commit `8b7dae6c0`) Gate set derived, not recalled: `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` (change set derived three-dot from the merge base `a77b4e92e`, 1 path) ⇒ 16 commands. All 16 run on `8b7dae6c0` with exit captured before any pipe (`cmd > log 2>&1; ex=$?`), all exit 0; reconciliation `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran FILE` ⇒ `Run reconciliation — 16 derived, 16 run, 0 NOT-MEASURED, 0 UNRUN.` The same 16 ran once before the commit on the identical bytes; the command list was byte-identical pre/post commit. Verdict lines as printed by the gates on `8b7dae6c0`: - `✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/SKILL.md is 812 lines (ceiling 812; headroom 0).` - `✓ check-skill-id-lint: 27 file(s) clean (pattern /#[0-9]{3,}/g).` - `✓ check-skill-frame-sync: the one declared copy of the decision frame is internally coherent (.claude/skills/pm-dispatch/SKILL.md; no second copy to compare — …)` — plus the direct proof the block did not move: `sed -n 734,755p SKILL.md | md5sum` ⇒ `3327d02c56f8a0eca88569dad2270f32` before and after the edit (the dispatch's expected hash). - `✓ check-governed-prose: 2 instruction surface(s) name all 5 registered governed surfaces (…) and claim no others.` - `check-nul-bytes: OK (scanned 8456 text file(s) … no raw ASCII control bytes).` — plus the manual control-byte self-scan on SKILL.md (`grep -naP` over the C0/DEL range) ⇒ no hits. - `pnpm check:pm-governed-merges`, `check-governed-queue-guard --self-test`, `check-closing-keyword-parity` (+ `--self-test`), `check-comment-mask-corpus`, `check:agent-test-spelling`, `check:doc-authoring`, `check:driver-memory-census`, `check:refd-timer-probe`, `check:watch-hint-literal` — each printed its own ✓/OK line, exit 0. - `pnpm --filter @objectstack/lint run check:doc-formula-expressions`: first run exit 3 `PREREQUISITE NOT MET` (`@objectstack/formula` / `@objectstack/lint` not built — NOT MEASURED, not a finding). Built both under the shared verify lock (`os-verify-lock.sh`, `VERDICT command-exit 0`, held 182 s), re-run ⇒ `✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 438 files / 1374 TS blocks judged clean`, exit 0; included in the post-commit union above. On-disk proof of the edit: `grep -cF` of the old line 1 → 0 and of the new line 0 → 1; `git show HEAD:…SKILL.md | sed -n 610p` prints the new line. No repo-wide `pnpm lint` run locally (CI-owned); no package build/test owed — the diff touches no package (no ① closure, no ②). Not measured locally: CI convergence (owned by the review side). ## Acceptance notes - noted, not filed: `references/contract-review.md` line 57 uses the spelling `契约复审档位` for the contract-review reading's own tier, while SKILL.md line 610 now spells the same tier `契约复审档` (as lines 505–527 do). Both spellings already coexisted on the tip; no gate reads either. Carrier: whoever next edits contract-review.md; none queued. - Out of scope, untouched by design: the tiering ruling's text (card 17285 / PR 17294 — those cards remain as they are), card 17134's labels, the four-axis block (lines 734–755). ## 维护者速读(草稿) **改了什么**:`.claude/skills/pm-dispatch/SKILL.md` 第 610 行(治理面 ACCEPT 分叉的规则①)原地换了一句话,96 字节变 119 字节,行数 812 不变。旧句要求「技能面 PR 的复核席须跑在契约复审档位」;新句改为「技能面 hunk 须由契约复审档的席复核,档外席先交 skills 席」。 **为什么改**:旧规则①与分档裁决(契约复审档只留给 skills 席、spec 席的条款②复核与维护者召集的 director)构成一对谁都满足不了的矛盾:一个 `domain:cli` 席复核一张顺手修了 `skills/**` 里一行的 PR,被要求跑一个它被禁止跑的档位。这不是边角:「已发布的说法本轮变假就地修、不立卡」这条规则天然会让普通车道的 PR 顺带碰到 `skills/**`。一张 p1(PR #17462)已经撞上。方向由 skills 席自分诊定为选项 3(5624178855,轮次报告否决窗已过):档外席把 `skills/**` 那一块的复核交给 skills 席,skills 席在四件套之前记到卡上;代码那一半仍由本车道自己复核。 **风险与代价(含回滚)**:每次顺带的 skills 修补多一次跨席交接 —— 几行 hunk、一条评论,不是一张卡。文字层面只动这一行,分档裁决原文、四轴框架块、#17134 的标签都没碰;`references/core-rules.md` 无孪生句(已 grep 核实),未动。回滚 = revert 这一个 commit,不牵连任何生成物。 **席位意见**:(留空,席位定稿时填) **你要做的**:读第 610 行这一句,认可则人工直合;不认可则在此 PR 评论里写下你要的措辞,由 skills 席改。 --- _Generated by [Claude Code](https://claude.ai/code/session_01MCLBsUgfykL74aU716rzVK)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent 4342c99 commit 0cd841a

1 file changed

Lines changed: 1 addition & 1 deletion

File tree

.claude/skills/pm-dispatch/SKILL.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -607,7 +607,7 @@ PM 的工作是循环:选卡 → 认领 → 派发 → 收集 → 复核 → 报
607607
- governed 面统一定义:`docs/adr/**` + `.claude/**`(全量,含 agents/hooks/settings)+ `skills/**`
608608
- governed 面同含 `AGENTS.md` + `CLAUDE.md`;agent 指令文件跨仓同判,仓集读 `GOVERNED_REPOS`,此处不列。
609609
- 路径面一条命中 ⇒ ACCEPT 换终局四件套,混合 diff ⛔ 不按比例判;要拆让 dev 单独开 PR。
610-
- ① 复核结论照常写在 issue 上;技能面 PR 的复核席须跑在契约复审档位
610+
- ① 复核结论照常写在 issue 上;技能面 hunk 须由契约复审档的席复核,档外席先交 skills 席
611611
- ② PR 留给维护者看得见地悬着;终局两条:人工直合即审核记录;授权批准 ⇒ 队列放行。
612612
- 看得见 = ACCEPT 同笔挂 `needs-user-decision` + 贴终稿「维护者速读」评论;①仍是审核记录。
613613
- 速读五段固定:改了什么/为什么改/风险与代价(含回滚)/席位意见/你要做的(一个动作)。

0 commit comments

Comments
 (0)