Repository navigation
pm-dispatch: a published schema, skill or ADR PR owes a full review — item ④ design judgment in the contract-review record, brief and rule - #26514
Conversation
…em ④ design judgment in the record, brief and rule The at-tier contract review of the schema and governed-rules faces gains a fourth item: the design judged against the code it cites and the scenario it is accepted against (an ADR against its first consumer and execution plan), by an agent other than the drafter, over the surface files only, once per substantive head with a delta round by the same reviewer. - references/contract-review.md: ④ definition, cadence, independence (55/60) - SKILL.md: the ACCEPT pointer line names the full review ①–④ (319/319) - record-recognisers.mjs: `fullReview` on the face table, ④ heading in the record on the schema/rules faces, the ④ note in --template, the adversarial ④ instruction and surface-file scope rule in --brief-template, self-test pins with raised battery floors Claude-Session: https://claude.ai/code/session_01JQwxbZCMuAzYCqL3RBJRdX Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewReviewed at 2026-10-27T06:25Z — PR #26514 (card #25765, pm-dispatch: the full-review rule, Tier S), independent contract review at the ceiling tier, read-only, adversarial to the dispatch order, the claim and the dev's report. Inputs: the card body and its five comments (re-fetched over REST at 2026-10-27T06:14Z), the PR body, file list and diff over REST, the three files on Served-tier: Check-runs on the head, read at 2026-10-27T06:20Z: 45 total — 28 success, 17 skipped, 0 failure, 0 in progress (at 2026-10-27T06:14Z three were still running: Test Core 1/8, Type Check · consumer gates, Type Check · workspace; all three completed success). Lane map read in ① Derived judgmentsNothing published changes: no
② Semver levelRight. ③ Boundary flagsThe report (6435101147) carries
④ Design judgmentJudged per
Implemented-by: VERDICT: PASS |
维护者速读改了什么:pm-dispatch 技能的契约复核规则加第 ④ 项「设计判断」:碰已发布 schema 面或受管规则面(含 spec、skills、ADR,按受管登记表)的 PR,达档复核除 ①②③ 外还逐个命中文件判「改动对所引代码与验收场景是否成立」(ADR 另判首个消费者与执行计划);范围只限面上文件,被引代码读而不审;一次实质 head 一轮完整复核,只改复核意见的提交由同一复核者做增量复核,无 must-fix 即止;复核者不得是起草者。记录模板与简报模板( 席位核对ACCEPT ·
Generated by Claude Code |
Requested by Warren · project thread
Fixes #25765
Clause-②: no
Metadata-protocol: none
维护者速读
packages/spec/src/**非测试)、skills/**与.claude/skills/**、docs/adr/**三面,席位 ACCEPT 前欠的达档复核就是完整复核 —— 逐个面文件判改动对它所引的代码与验收场景是否成立(ADR 另判首个消费者与执行计划),只审面文件、被引代码读而不审,由起草者之外的 agent 在契约档跑,每个实质 head 一轮,只落发现的 commit 由同一复核者 delta 复核,无 must-fix 即止。记录仍是同一条## Contract review评论(多一个 ④ 节,⛔ 不另开第二条记录);--template打出 ④ 节与说明,--brief-template打出对抗性的 ④ 指令与「只审面文件」规则。docs/adr/**owes an independent full review at CONTRACT_REVIEW_TIER before the seat's ACCEPT, not only the contract review #25765 正文与评论 6396446237,本文不改写)。卡上实测:一张 ADR PR 两次契约复核 PASS 之后,独立完整复核仍找出三处设计缺陷,全部被负责人采纳 —— 契约复核读的是 diff 对裁决,从不问设计对首个消费者成不成立。.claude/skills/pm-dispatch/两个文件与scripts/pm/record-recognisers.mjs;无新门禁、无发布面、无 changeset。行数 49→55(上限 60)、319→319(上限 319,同行改写);脚本自测 201→215 例。风险在成本:每张三面 PR 多一轮达档复核(卡上实测每轮 10–18 分钟);以及 ④ 只挂 schema 与 governed 两面、收窄面不挂,若负责人要把收窄面也纳入需另下令。回滚 = revert 本 PR。references/contract-review.md第 29–32 行(④ 定义、只审面文件、cadence)与第 40 行(独立性);②scripts/pm/record-recognisers.mjscontractReviewBriefLines的两处 ④ 段;③SKILL.md第 190 行指针行的后半句。node scripts/pm/record-recognisers.mjs --brief-template | grep -n ④看到「④ judges the hits files ONLY」与「④ Design judgment」两段;node scripts/pm/record-recognisers.mjs --brief-template --face narrowing | grep -c ④打印 0;pnpm check:pm-record-recognisers打印 215 cases pass。.claude/**+scripts/pm/**,契约复核 PASS 与席位 ACCEPT 后由席位 ready → 入队)。What changes
Items 1–6 of the card (「What to change」 1–4 in the body, 5–6 in comment 6396446237), as one PR of three files. The tier is spelled everywhere by its constant name
CONTRACT_REVIEW_TIER.Faces — measured, nothing added
The card asks whether
skills/**anddocs/adr/**already fall under SKILL.md's governed-rules-text definition. They do: SKILL.md 〈路径分叉〉 「governed 面统一定义」 listsdocs/adr/**+.claude/**(全量) +skills/**+docs/NORTH-STAR.md+.github/workflows/**, and the rules face inrecord-recognisers.mjsreads the governed register (governedPathsIn). The published-schema face ispackages/spec/src/**minus test files (SUSPECT_TIER_GLOBS). Read onorigin/mainat00a4593awithnode scripts/pm/record-recognisers.mjs --template --paths PATH:Served-tier:Scope:hitdocs/adr/0141-x.mdCONTRACT_REVIEW_TIERskills/objectstack-data/SKILL.mdCONTRACT_REVIEW_TIER.claude/skills/pm-dispatch/SKILL.mdCONTRACT_REVIEW_TIERpackages/spec/src/data/x.zod.tsCONTRACT_REVIEW_TIERpackages/spec/src/data/x.test.tsTIER_DEFAULTSo all three surfaces of the order are the schema face and the rules face already; this PR adds no face and edits no definition. It adds the depth (item ④), the scope of ④ (the
hitsfiles only, the cited code read to judge them), the cadence and the independence clause, on those two faces. The narrowing face (at tier, but by construction free of schema and governed paths) and the declaration face carry no ④..claude/skills/pm-dispatch/references/contract-review.md— 49 → 55 lines (ceiling 60)Record shape, before (one line):
After (two lines):
Added after the ② ③ definition line (four lines: ④'s definition and scope, then cadence):
Added after the 独立性对 line (one line — independence):
The existing scope rule (混合 diff 的达档复核范围 =
reviewFace的hits路径 + 其 hunk 所断言的文件(读被引代码)) is the surface-file rule the owner refined the order with; ④ restates it as 「逐hits文件判 … 被引代码读而不审」 and the remainder stays the lane seat's ACCEPT (unchanged line). The regeneration / prose-only head-move exception is unchanged: those are not substantive heads. Every line ≤ 120 bytes (longest new line 116)..claude/skills/pm-dispatch/SKILL.md— 319 → 319 lines (ceiling 319, headroom 0)One line reworded, the ACCEPT pointer line in 〈路径分叉〉. Its first half — the pointer format
指针 ACCEPT → PR #n comment ID(the placeholder for the comment id is written in angle brackets in the file; spelled out here so the body sanitizer leaves it alone) — is unchanged. The second half, after the;:Before:
After:
111 → 118 bytes. The retired words 「随面定档」 (the tier follows the face) remain stated in
contract-review.md「档随面定」; the SKILL.md line now names what the governed and published-schema faces owe (the full review ①–④) and who runs it when the seat is below tier.scripts/pm/record-recognisers.mjs— 2054 → 2134 linesREVIEW_FACESgainsfullReview(trueonschemaandrules,falseonnarrowinganddeclaration);recordCarriesDesignJudgment(face, tierName)reads it (a null face is the bare template, their tier).contractReviewRecordLinestakes an optionalfaceIdand prints the fourth section;contractReviewTemplateLinespasses the face through and gains a ④ note;contractReviewBriefLinesgains the ④ instruction and the surface-file scope rule.--template, fenced record after (the bare template,--face schema,--face rules,--pathsover a mixed list):--template, note added after theScopenote:--brief-template, scope rule added after theACCEPT at TIER_DEFAULTline:--brief-template, judge item added after ③:--face narrowingand--face declarationprint none of the four blocks (the ④ note in the template's calibration text names them as faces that carry no ④).Self-test: 14 pins added (8 in the template battery, 6 in the brief battery), floors raised 19 → 27 and 10 → 16 so a pin that stops registering reds; the battery roster count (12) is unchanged. The pins cover: ④ right after ③ in the bare record and one record shape (four
###headings, never a second record); schema, rules and--pathsprint it; narrowing and declaration do not (fenced record checked, not the calibration text); the face table marks exactlyschema,rules; an unknownfaceIdis refused; a record carrying ④ still reads FOUND and its tier STANDS (④ is prose to every reader); the note text; the brief's ④ instruction, its surface-file rule, per face; the brief stays free of angle brackets, model identifiers and digit-shaped card numbers..claude/skills/pm-dispatch/references/contract-review.md.claude/skills/pm-dispatch/SKILL.mdscripts/pm/record-recognisers.mjsWhy
The owner's order: a change on a published schema, a skill or an ADR owes a full review by an independent agent at the contract tier before the seat's ACCEPT — the floor, not a replacement for who drafts (the sibling card #25729 is untouched). Measured on the card: a contract review reads the diff against its order and never asks whether the design works for its first consumer; that question is what ④ makes mandatory. Triage (comment 6431838043) fixed the carrier:
contract-review.md+ the brief template, ⛔ no new gate — the full review is a record the seat reads, like the contract review.Tests
pnpm check:pm-record-recognisers(the script's own suite, run bylint.ymlline 1165):✓ record-recognisers self-test: 215 cases pass— onorigin/mainat00a4593ait prints 201; +14 pins.node scripts/pm/check-governed-queue-guard.mjs --self-test(loads this file through the real lazy import and drives every queue state with the printed record): exit 0.npx eslint scripts/pm/record-recognisers.mjs: exit 0 (the repo-widepnpm lintis CI's run).Acceptance notes
## Contract reviewrecord (the seat's recommendation on the card), not a second record —contract-review.mdsays 「⛔ 无第二条记录」 and the self-test pins four###headings and one record shape.fullReview: trueonnarrowing) if the owner wants it.Implemented-by:/Reviewed-by:pair plus the feeding rule; the new line adds what the card asks: a change drafted at the contract tier still owes the review, by an agent other than its drafter, never fed the drafter's conclusions.pnpm check:pm-skill-id-lint(pattern#+ 3 digits) and.claude/agents/os-dev.md(「教训写成自含规则,⛔ 不引卡号」) forbid card numbers in.claude/skills/pm-dispatch/**. The rules are written self-contained; provenance lives in this body and in the script's docblock, where ruling-record citations are the file's own convention.docs/adr/**is dispatched at CONTRACT_REVIEW_TIER with effort xhigh, no one-line exit #25729); re-reviewing merged PRs;references/_index.mddoes not exist for pm-dispatch (no generator owns one).--template/--brief-template(no--face, no--paths) print ④, because the bare template is the tier of a schema or governed-path face; a narrowing-only PR already has to be printed with--face narrowing(the self-test refuses--pathsover such a list), so no new trap.Verification
Local gates on the final head
54224ebf— derived withnode scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(41 families), each exit code captured before any pipe, reconciled with--ran:✓ dispatch-gates --ran: 41 derived famil(ies) accounted for — 41 run, 0 NOT-MEASURED. One family,check:doc-formula-expressions, first exited 3 (PREREQUISITE NOT MET:@objectstack/formulaand@objectstack/lintdist absent in a fresh worktree); afterpnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lintunderos-verify-lock.sh(VERDICT command-exit 0, held 99 s) it re-ran and exited 0.check:pm-dispatch-gatesran detached (308.9 s).Exit codes (41)
pnpm check:pm-skill-ratchet:contract-review.md is 55 lines (ceiling 60; headroom 5),SKILL.md is 319 lines (ceiling 319; headroom 0), widest SKILL.md table row 341 (pin 341).pnpm check:pm-skill-id-lint: 104 file(s) clean.pnpm check:pm-dispatch-gates:✓ dispatch-gates self-test (fast tier): 1935 cases pass(308.9 s).Two-minute check:
CI on the PR: the required contexts run on the head after this PR opens; this body is written before them (⛔ not waited on, per the order) and the seat's ACCEPT reads the check-runs.
Human Minimum
Each item is one rule from CONTRIBUTING.md › Human Minimum.
packages/specholds no runtime logic — n/a.fullReview,recordCarriesDesignJudgment).pnpm lintis CI's).main(00a4593a), one pull request — on the card thread's harness branch, the measured platform exception toclaude/issue-N-slugnamed in the seat's Claim..claude/**andscripts/pm/**are the fast lane,skip-changesetdeclared atpr_create; both declaration lines are at the top of this body.packages/specuntouched.content/docs/references/,packages/*/CHANGELOG.mdorcontent/docs/releases/.Generated by Claude Code