Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions .claude/skills/pm-dispatch/references/contract-review.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,15 @@
- 五面皆不碰 ⇒ CI 加席位自读 ⛔ 不起第二个 agent;谁跑 = 派发席,达档者席内审。
- 复核记录 = 一条评论落 PR 或卡,席内与子代理同形;散文、dev 自评、`os-dev-report` 恒不算。
- 同形 = `## Contract review` 题头、所审 head sha 独占码段、①②③ 逐项、独立性对、PASS/FAIL。
- 同形含首行 `Served-tier:`:值写常量名 `CONTRACT_REVIEW_TIER`;无此行不成裁决,模板见 `--template`。
- 同形含首行 `Served-tier:`:值写常量名 `CONTRACT_REVIEW_TIER`;无此行不成裁决,
模板见 `node scripts/pm/record-recognisers.mjs --template`。
- ① derived judgments 逐项:diff 引出的接受集与公开面变化逐条点名判对错。
- ② semver 定级与 changeset 声明一致;③ 边界旗:dev 挂旗与 `open_questions` 逐旗答复或升级。
- 复核形状:只读 diff 与卡片,check 结论取 head 的 check-runs,⛔ 永不本地重跑派生门禁族。
- 只喂卡片、既有裁决与 PR 本体,⛔ 不喂派发令与派发席自己的结论;简报写成对抗性。
- 隔离复核子代理暂存全写按所审 PR 命名的 `<scratchpad>/pr-<n>/`,⛔ 不读非本轮自写的暂存。
- 独立性对:`Implemented-by:`/`Reviewed-by:` 取值见 `--template`;子代理记采纳它的席位。
- 独立性对:`Implemented-by:`/`Reviewed-by:` 取值见
`node scripts/pm/record-recognisers.mjs --template`;子代理记采纳它的席位。
- 轮次报告设复审清单专节,形状与代裁清单同为强制审计。
- 落地前检两条,过则 Tier S 入队、Tier H 等人批:① 达档条款②复核 PASS 在案(同形记录)。
- 例外:纯重生成 head 后移原记录继续管;判据机读已提交树;PR 落 `Regen-provenance:` 行。
Expand Down
32 changes: 14 additions & 18 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1247,24 +1247,20 @@ jobs:
- name: PM half-state sweeper self-test
run: pnpm check:pm-half-states

# Clause-② carrier + declaration checker self-test (#13922 · #12409 ·
# #13914). Same family and the same split as the two steps either side:
# the LIVE sweep reads a shared board over the API and is report-only, so
# only the offline self-test runs here — a clause-② desync on somebody
# else's pair is a fact about the board, not about the PR that happens to
# run CI next, and failing that PR would punish the wrong actor.
#
# ⛔ Do not "promote" the live sweep into this step. The script's `--pair`
# landing pre-check is retired (ruling record 5770886272 on #19061) and
# nothing runs it; the file stays only because the Governed Surface Queue
# Guard lazily imports its contract-review record recognisers and
# `--template`, and this self-test is what keeps those loadable.
#
# The self-test is offline and imports `check-half-states.mjs` for the
# `prDeliversCard` delivery relation and the shared PREREQUISITE-NOT-MET
# exit code — one source for each.
- name: Clause-② carrier checker self-test
run: pnpm check:pm-clause2-carriers
# Contract-review record recogniser self-test (#18042 · #18701). The
# readers the Governed Surface Queue Guard's Tier S leg lazily imports,
# and the record `--template` prints, live in
# `scripts/pm/record-recognisers.mjs`; this step runs that file's offline
# self-test, which pins each reader and drives the guard once with the
# printed record on each thread. Same family and the same split as the
# steps either side: offline, no network, no token.
#
# This is the step that ran `check-clause2-carriers.mjs`'s self-test,
# retargeted when ruling record 5770886272 on #19061 (letter B, its last
# step) deleted that file with its retired `--pair` sweep — ⛔ not a gate
# added beside it.
- name: Contract-review record recogniser self-test
run: pnpm check:pm-record-recognisers

# Widening-tell gate self-test (#16448) — the mechanical half of the
# directional clause-② ruling (#16349), and the same split as every step
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@
"check:declared-population-live": "node scripts/check-declared-population-live.mjs --self-test && node scripts/check-declared-population-live.mjs",
"check:pm-half-states": "node scripts/pm/check-half-states.mjs --self-test",
"check:issue-citations": "node scripts/check-issue-citations.mjs --self-test",
"check:pm-clause2-carriers": "node scripts/pm/check-clause2-carriers.mjs --self-test",
"check:pm-record-recognisers": "node scripts/pm/record-recognisers.mjs --self-test",
"check:pm-widening-tells": "node scripts/pm/check-widening-tells.mjs --self-test",
"check:pm-prior-rulings": "node scripts/pm/check-prior-rulings.mjs --self-test",
"check:pm-closed-card-sweep": "node scripts/pm/sweep-closed-cards.mjs --self-test",
Expand Down
6 changes: 3 additions & 3 deletions scripts/check-adr-0087-registration.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -633,9 +633,9 @@ export function breakingDeclaration(parsed) {
const summary = (parsed.body.trim().split(/\n/)[0] || '').replace(/^\*\*|^#+\s*/, '');
if (/^[a-z]+(\([^)]*\))?!:/.test(summary)) signals.push('bang');
// (4) The direction arm. A `malformed` or `near-miss` reading declares
// nothing HERE and must not: this gate judges changesets, and the states that
// send a seat to fix an unreadable declaration are `check-clause2-carriers`'s
// rows, on the carriers that own them.
// nothing HERE and must not: this gate judges changesets, and the refusal that
// sends a seat to fix an unreadable declaration is `pm/post-stamped.mjs`'s, at
// the moment the claim carrying it is written.
const decl = readClause2Line(parsed.body);
if (decl?.kind === 'declared' && decl.arm === 'narrowing') signals.push('clause-②-narrowing');
return { breaking: signals.length > 0, signals };
Expand Down
7 changes: 3 additions & 4 deletions scripts/check-closing-target-claim.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -48,11 +48,10 @@
* behaviourally equal to the two workflow spellings. A FOURTH spelling here
* would be the one nobody remembers when the grammar next moves.
* - the claim predicate is `h46ClaimNamesBranch`, which is itself
* `CLAIM_COMMENT_MARKER` plus `claimedBranches` — the same pair
* check-clause2-carriers reads. ⭐ "Import, never restate."
* `CLAIM_COMMENT_MARKER` plus `claimedBranches`. ⭐ "Import, never restate."
* - the classification of everything that is NOT a claim on this branch is
* `claimGovernance`, the three-valued reader check-clause2-carriers already
* uses, and the next section is why a blocking gate needs all three values.
* `claimGovernance`, the three-valued reader beside it in check-half-states,
* and the next section is why a blocking gate needs all three values.
*
* The POSITIVE predicate is deliberately H46's and not governance's, so the
* patrol row and this gate can never disagree about the word CLAIMED. The two
Expand Down
Loading
Loading