Skip to content

skills(pm-dispatch): an out-of-tier seat hands a skills-face hunk's review to the skills seat - #17806

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-17490-skills-hunk-review-handoff
Sep 12, 2026
Merged

skills(pm-dispatch): an out-of-tier seat hands a skills-face hunk's review to the skills seat#17806
os-zhuang merged 1 commit into
mainfrom
claude/issue-17490-skills-hunk-review-handoff

Conversation

@claude

@claude claude Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

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:

  • PRhunk (+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 skills(pm-dispatch): a mid-task narrowing names its replacement owner and the moment #17794, which touches only references/dispatch-runbook.md; git diff --stat 6682c5d8 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 (fix(pm): a key-INITIAL clause-② line that QUOTES the spelling is not a declaration #17799, ci: a PR may close a card only while that card claims its head branch #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 fix(cli): os migrate meta --from N lists the conversions its tombstones prescribe, and an empty range stops reading as success #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 FILERun 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 | md5sum3327d02c56f8a0eca88569dad2270f32 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

…eview to the skills seat

The governed ACCEPT fork's rule ① required the reviewing seat of a
`skills/**`-touching PR to run at the contract-review tier, while the
tiering ruling reserves that tier away from every non-skills lane — an
unsatisfiable conjunction for any lane that reaches `skills/**`
incidentally (the repair-don't-file rule produces exactly that).

Rule ① now says: the skills-face hunk must be reviewed by a seat AT the
contract-review tier, and a seat outside that tier hands that hunk's
review to the skills seat first (before the four-piece terminal fires).
The conclusion still goes on the issue; the lane's own review of the
code half stands. One line replaced in place (96 B -> 119 B, under the
120-byte line cap); line count unchanged at 812/812; no reference twin.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MCLBsUgfykL74aU716rzVK
@claude

claude Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor Author

维护者速读(终稿)

改了什么 — PM 派发技能 SKILL.md 受管 ACCEPT 分叉的第 ① 条,一行原地替换:「技能面 PR 的复核席须跑在契约复审档位」→「技能面 hunk 须由契约复审档的席复核,档外席先交 skills 席」(96 → 119 字节,上限 120;812/812 行不变,四轴块 md5 不变)。含义:碰到 skills/** 的 PR,其技能面那一块必须由契约复审档的席位复核;不在该档的车道席(cli / engine / services…)先把这块交给 skills 席复核记录在卡上,再挂四件套;代码半边仍由本车道自己复核。

为什么改 — 两条现行规则曾构成无法同时满足的合取:分叉要求「须跑在契约复审档位」,而分档裁决(#17285)把该档只留给 skills 席、spec 席的 clause-② 复核与总监席;domain:cli 的 p1(PR #17462 / #17134)当天就撞上,只能在书面上声明「本席复核不在该档」。分诊席按「两条细则冲突按更严者行事并立卡」给了临时读法(档外席交 skills 席),skills 席定级时定为方向(选项 3),本 PR 把它写成正文。

风险与代价(含回滚) — 每次偶然碰到 skills 面的修补多一跳跨席评论(几行 hunk 一次复核),不是新卡;16 条派生门禁全绿,受管判定 GOVERNED 是预期。回滚 = revert 本 PR。

席位意见 — 席内按契约复审档复核通过(本席即该档),建议合并。

你要做的 — 受管面:请人工合并 PR #17806(本席不翻 ready、不入队、不挂 auto-merge)。


Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review September 12, 2026 09:39
@os-zhuang
os-zhuang enabled auto-merge September 12, 2026 09:39
@os-zhuang
os-zhuang added this pull request to the merge queue Sep 12, 2026
Merged via the queue into main with commit 0cd841a Sep 12, 2026
35 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-17490-skills-hunk-review-handoff branch September 12, 2026 09:58
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/xs skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants