Repository navigation
feat(pm): scope the at-tier contract review of a mixed diff to reviewFace hits — the Scope: line - #23655
Conversation
…Face hits — the Scope: line Ruling record 6184805932 (letter C): the at-tier review of a mixed diff covers the paths reviewFace returns as hits plus every file those hunks make a claim about; the record's Scope: line lists both, may widen and never narrows below hits; the non-governed remainder is the lane seat's ACCEPT at TIER_DEFAULT; Tier H approval and the queue guard stay whole-PR. - contract-review.md: the 档随面定 rule keeps its tier mapping and gains the scope, the remainder and the whole-PR landing lines (+3). - record-recognisers.mjs: reviewScopeHits (read off reviewFace); the at-tier record prints `Scope: PATH-ONE, PATH-TWO + CITED-FILE` with its legend; the brief states the scope; --paths reads the face and fills the hits; a new self-test battery (18 cases) and a guard-drive case proving the queue guard clears a record carrying the line. Claude-Session: https://claude.ai/code/session_01GjUZrCo7Yi58T4vPXqx88e Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: ① Derived judgments
② Semver levelNo published package in the diff ⇒ no changeset owed; the ③ Boundary flags
Implemented-by: VERDICT: PASS Reviewed 2026-10-15T10:45Z against the PR's committed diff, the card's four records and the head's check-runs ( |
席位核对 — PR #23655 (#23578) @
|
Fixes #23578
Clause-②: no
What this does
Executes ruling record 6184805932 on the card (letter C, the maintainer's 「同意」): the at-tier contract review of a mixed diff is scoped to the paths
reviewFacereturns ashitsplus every file those hunks make a claim about; the record'sScope:line lists both; the non-governed remainder is the lane seat's ACCEPT atTIER_DEFAULT; Tier H approval and the queue guard stay whole-PR.The ruling, quoted from the record:
.claude/skills/pm-dispatch/references/contract-review.md(+3 lines: 44 to 47, ceiling 60)CONTRACT_REVIEW_TIERon one hit; what this changes is that review's scope.hits+ the files their hunks claim about (the reviewer reads the cited code). A rule and the gate that enforces it are read as one. The record'sScope:line lists both and may widen, never belowhits(items 1, 4).TIER_DEFAULT, as for a standalone PR, named there. Tier H approval and the queue guard stay whole-PR (items 2, 3).SKILL.md:186is untouched, and no table row was added.scripts/pm/record-recognisers.mjsreviewScopeHits(paths)is the floor, read offreviewFaceitself: schema hits first, each path once. It is empty exactly on the declaration face.--template: the at-tier record carriesScope: PATH-ONE, PATH-TWO + CITED-FILEright afterLocal-runs:, plus a· Scopelegend entry. The declaration face prints noScope:, because it has no hits and its whole review is the lane seat's own.--brief-template: at tier, a Scope paragraph after "Inputs" (the hits, the claimed files, widen-never-narrow, and the remainder's ACCEPT tier). The declaration-face brief is byte-identical to before.--paths PATH...takes the PR's changed paths in place of--face(refused beside--face, refused when empty). It reads the face off them throughreviewFaceand prints thehitsfilled in. The brief then hands the reviewer--template --paths HITS, which reads back the same face and the same floor (pinned).Scope:, andcheck-governed-queue-guard.mjsis not edited.PM mechanism assumptions, measured
7cb33cfef,reviewFacereturns{ face, tierName, words, hits: { schema, rules } }, which holds.contract-review.mdwas 44 lines (ceiling 60) and its widest table row was 0 bytes.runGuard, merge-group event, Tier S path) with the recordcontractReviewRecordLines()now prints,Scope:included. The guard clears on both threads, and a new case asserts that the cleared record carries the line. The writer side holds too: a one-off probe ofpost-stamped.mjsrecordKeyedLineRefusalson a--paths-printed record returns[]. No recogniser change was needed.check:pm-skill-ratchetreports 47 lines, ceiling 60, headroom 13, widest table row 0 (pin 0).check:pm-record-recogniserspasses 184 cases (165 before, plus an 18-case letter-C battery and 1 guard case; the roster floor is 10 → 11).check:pm-skill-id-lintreports 87 files clean.Boundary flag for the reviewer:
--paths--pathsgoes beyond the dispatch's placeholder-only route. The reason: the ruling calls thehits"machine-derived, the same function the queue guard uses", and the card and claim say the line is "read offhits". With placeholders alone, a seat lists governed paths by eye, which is exactly how a scope drops belowhits. The bare output still prints the word placeholders. If the seat prefers placeholder-only, removing--pathsmeans deletingtemplateArgsOf's third branch,templateFace's paths arm, the brief's paths command and the cases that exercise them.Verification (all at head
ead127958)node scripts/pm/record-recognisers.mjs --self-test: exit 0, "✓ record-recognisers self-test: 184 cases pass".node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(no paths, merge base7cb33cfef) gives 37 commands. All 37 ran and all exited 0.pnpm --filter @objectstack/lint run check:doc-formula-expressionsfirst exited 3 (PREREQUISITE NOT MET:@objectstack/formulaand@objectstack/lintunbuilt; nothing measured). It re-ran with exit 0 afterturbo run buildof those two packages underos-verify-lock.sh(VERDICT command-exit 0).pnpm check:pm-dispatch-gates(fast tier): exit 0, 1884 cases.--ranreconciliation: "37 derived famil(ies) accounted for — 37 run, 0 NOT-MEASURED (a DERIVED zero — all 37 recorded an exit code and none of them is 3)".node scripts/pm/check-governed-queue-guard.mjs --self-testexit 0 (322 cases), andpnpm check:pm-post-stampedexit 0 (679 cases)..claude/**andscripts/pm/**only), so there is no changeset and it carriesskip-changeset.Acceptance notes
usageLines' docblock said "Four flags" while five already existed. It now says "a closed set of flags".BRIEF_TEMPLATE_PLACEHOLDERSstill holds the four slots a seat fills by value, and the scope floor is filled by--paths, not by value.维护者速读(草稿)
reviewFace的hits)和这些改动所涉及的其他文件送达档复审;复审记录多一行Scope:,写明审了哪些文件。其余部分照它单独开 PR 时那样,由车道席位按默认档审。复审模板工具新增--paths,可直接从 PR 的文件清单算出该审的受管路径,不靠人眼挑。Scope:行没有任何机器读取,旧记录不受影响。.claude/**与scripts/pm/**,属 Tier S,由席位在达档复核 PASS 后落地。Generated by Claude Code