Skip to content

pm-dispatch(contract-review): a FAIL on the current head, or a head move that changes the reviewed surface, disarms auto-merge at once - #27845

Merged
os-zhuang merged 2 commits into
mainfrom
claude/project-thread-ldqpch
Oct 30, 2026
Merged

os-zhuang merged 2 commits into
mainfrom
claude/project-thread-ldqpch

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Elon · project thread

Fixes #27809

Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么:PR 已挂自动合并时,若当前提交的契约复审判 FAIL,或提交被改动(如合入 main 时改了被审内容),负责席位读到即撤下自动合并;FAIL 记录写明这一步,重新挂上仍须当前提交有 PASS。
  • 为什么改:PR fix(rest): an undeclared hook abort answers the data door with HOOK_ABORTED #27667 增量复审 FAIL 后 20 分钟,仍凭早先挂上的自动合并被队列合入,主干随即变红(p0 main red (Dogfood Regression Gate 1/3) since 21c4bdd8 (#27667): two dogfood pins still expect a code-less hook refusal after HOOK_ABORTED landed #27806)。原规则只说落地前要有 PASS,没说已挂上的 PR 在 PASS 失效时怎么办。
  • 风险与回滚:只改 .claude/skills/pm-dispatch/ 下三处规则文字,不发布任何包,不加门禁或脚本;三个文件行数都没涨(删两句重复条文付账)。回滚即 revert 这一个提交。
  • 先看:references/contract-review.md 的 head 后移一条(两行),再看等复核标记一节合并后的第一行。
  • 两分钟验证:pnpm check:pm-skill-ratchet && pnpm check:pm-skill-id-lint,预期都绿,contract-review.md 仍为 60 行。
  • 需要你做的:暂无。contract review owed(契约复审未完成,席位复审后再求批);本 PR 是规则改动,落地为 Tier H,由维护者批准。

What changes

Rule text only, in .claude/skills/pm-dispatch/. No script, no gate, no queue guard (triage: 「新增门禁默认否」).

  • references/contract-review.md, the one rule site. The head-move exception bullet under landing check ① now carries both rules:

    head 后移:纯重生成或只动散文面则原记录续管,落 Regen-provenance: 行;余移或现 head 落 FAIL
    而已挂 auto-merge ⇒ 派发席读到即照 AGENTS.md disarm 句撤挂,FAIL 记录点名撤挂;重挂照 ①。

    In English: a pure regeneration or prose-only move keeps the original record (with a Regen-provenance: line). Any other move, or a FAIL on the current head, while auto-merge is armed: the dispatching seat disarms on reading it, by the AGENTS.md disarm sentence, and the FAIL record names the disarm. Re-arming follows check ①, so it needs a PASS (or a Regen-provenance: line) on the current head.

  • The disarm itself is not restated. It points at the one disarm sentence in AGENTS.md (governed-surface landing, "Already armed or queued when you read this?"): disable auto-merge AND convert to draft; neither act is measured to dequeue a queued PR, so ask the maintainer to remove it by hand, then confirm it is in neither the queue nor origin/main. The relay ops are automerge_disable and pr_draft (references/rest-channel.md). The dequeue facts are in references/platform-readings.md § queue membership.

  • Pointers, in place: references/landing-operations.md:12 (FAIL ⇒ 撤挂,补丁轮) and SKILL.md:200 (PASS 后 head 移 ⇒ 撤挂回等).

Why — measured

Event Record Time
Seat check after a main merge moved #27667's head to af33de9c; "Auto-merge stays armed" comment 6510205555 2026-10-29T22:41Z
Triage: auto-merge is armed on a head no PASS names; the owning seat disarms until a delta PASS comment 6510422663 22:54Z
Delta contract review on af33de9c: FAIL, two must-fix comment 6510686343 23:11Z
#27667 merges at af33de9c through the still-armed auto-merge merge 21c4bdd8 23:31Z
main Dogfood Regression Gate (1/3) red on the two pins the FAIL named p0 #27806 after the merge

contract-review.md on fec60e00b had no disarm text (grep -n -i 'disarm\|automerge_disable\|auto-merge' → 0 hits). Landing check ① said a PASS must name the current head before landing. Nothing said what to do with a PR that was already armed when ① stopped holding, so the seat left it armed.

Line budget

All three files sit at their ceiling with headroom 0 (scripts/pm/check-skill-line-ratchet.mjs), and no maintainer ruling orders a raise. The rule costs one line (the exception bullet goes from 1 line to 2). It is paid in the same file by real deletion, not by re-wrap: the marker section's first and last bullets fold into one line, dropping two restatements:

  • 「卡上副本在规则外、不是要求」: follows from 「单载体 = PR」, which stays.
  • 「入队只认同形记录,标记有无不改判」: restates landing check ① and 「⛔ 不是闸门」, which stays.

Wording compressed in the edited lines only: 「只动上列散文面」 → 「只动散文面」 (the prose faces are defined once, at :9–10), 「继续管」 → 「续管」, landing-operations.md 「交棒请审」 → 「交棒」 (SKILL.md ③ is 「请审 = 席位交棒」), SKILL.md 「回等复核」 → 「撤挂回等」.

File Lines (ceiling) Changed
references/contract-review.md 60 (60) +3 / −3
references/landing-operations.md 101 (101) +1 / −1
SKILL.md 319 (319) +1 / −1, an in-place edit of :200

Every edited line is at most 120 bytes.

Deviations from the dispatch order

  • The precedent is named here, not in the skills text. The order asked for one clause naming fix(rest): an undeclared hook abort answers the data door with HOOK_ABORTED #27667 → p0 main red (Dogfood Regression Gate 1/3) since 21c4bdd8 (#27667): two dogfood pins still expect a code-less hook refusal after HOOK_ABORTED landed #27806. check:pm-skill-id-lint refuses any #NNN in the pm-dispatch corpus, and the rules-only ruling moved incident narratives out of it. So the precedent lives in this body and in the commit message.
  • The disarm steps are a pointer, not a restatement. The order's "relay automerge_disable, plus pr_draft where the repo's reading says disable alone does not dequeue" is already the AGENTS.md disarm sentence, which is stricter (both ops every time, plus the maintainer's hand removal for a queued PR). The rule points there.
  • Wanted 3 of the card (a queue guard that refuses a head whose newest contract record is FAIL) is not built. It is the maintainer's call per the card and triage.
  • landing-operations.md:57 and :72 (the seat's own origin/main merge) are not edited. The head-move half reaches every seat through SKILL.md:200, which is read in full on every fire.

Verification

dispatch-gates

node scripts/pm/dispatch-gates.mjs --commands (no paths, derived from the committed diff against merge base fec60e00b) derives 21 families. All 21 were run with exit codes captured before any pipe. pnpm --filter @objectstack/lint run check:doc-formula-expressions first exited 3 (@objectstack/formula and @objectstack/lint not built in a fresh worktree). It was re-run after pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint, exit 0. --ran reconcile: 21 derived famil(ies) accounted for — 21 run, 0 NOT-MEASURED. Changed lines 10 (+5 / −5), under the 3000 threshold. git merge-tree against origin/main 0a4b0fb2 is clean, and no commit since the base touched these three files.

Directly relevant: check:pm-skill-ratchet (60/60, 101/101, 319/319), check:pm-skill-id-lint, check:pm-governed-prose, check:pm-record-recognisers, check:skill-frame-sync. All exit 0.

Contract review owed: governed .claude/** rules text, at CONTRACT_REVIEW_TIER. Landing is Tier H (triage 6512254201: 「A rule change: the maintainer approves」).

Human Minimum

  • 1. Schemas start as Zod; packages/spec holds no runtime logic. (not touched)
  • 2. Every name I added uses the casing for its kind. (no names added)
  • 3. No formatter ran; pnpm lint passes (prose only; the full run is CI's).
  • 4. One issue, one branch off an up-to-date main, one pull request.
  • 5. A change that publishes carries a changeset. .claude/** publishes nothing, so skip-changeset.
  • 6. packages/spec touched: n/a.
  • 7. No hand edits to content/docs/references/, packages/*/CHANGELOG.md or content/docs/releases/.
  • 8. Title, body and comments are in English (the 维护者速读 and quoted rule text are the sanctioned Chinese channels).
  • The Before Submitting list in CONTRIBUTING.md is done.

🤖 Generated with Claude Code

https://claude.ai/code/session_016WV4cwDXbDuhAz7Zn6Dv8i

…ove that changes the reviewed surface, disarms auto-merge at once

An armed PR stayed in the merge queue after a delta contract review on its
current head came back FAIL, and the queue landed that head. The rules said a
PASS must name the current head before landing, but said nothing about a PR
that is already armed when that stops being true.

- contract-review.md: the head-move exception bullet now also carries the
  disarm. A non-exception head move, or a FAIL on the current head, while
  auto-merge is armed: the dispatching seat disarms on reading it, by the
  AGENTS.md disarm sentence (disable auto-merge and convert to draft; a
  queued PR goes to the maintainer for hand removal). The FAIL record names
  the disarm. Re-arming follows landing check ①.
- Paid in place: the marker section's two restatements (the card-copy clause,
  implied by the single carrier; and the queue-only-reads-records clause,
  restating check ① and "not a gate") fold into one line. Line count stays 60.
- landing-operations.md: the PASS/FAIL outcome line says FAIL disarms.
- SKILL.md: the head-move clause in ③ says disarm, then wait.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016WV4cwDXbDuhAz7Zn6Dv8i
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 30, 2026
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation labels Oct 30, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS

Contract-review-claim: session_016WV4d1QkPVVzNz3FJqb2iS · head b02ba2d · 2026-10-30T01:47Z

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: b02ba2dd5d4afb2de6a70005b339b85b8a44ae86
Local-runs: none
Scope: .claude/skills/pm-dispatch/SKILL.md, .claude/skills/pm-dispatch/references/contract-review.md, .claude/skills/pm-dispatch/references/landing-operations.md + AGENTS.md (the one disarm sentence, line 297, item 14), .claude/skills/pm-dispatch/references/rest-channel.md:56-57, .claude/skills/pm-dispatch/references/platform-readings.md:41-43, .claude/skills/pm-dispatch/references/triage-duties.md:12-14, scripts/pm/check-skill-id-lint.mjs (the #NNN pattern, line 35), scripts/pm/check-skill-line-ratchet.mjs (ceilings and the 120-byte line rule), scripts/pm/record-recognisers.mjs (--template --paths, this record's shape). The cited files were read to judge the three hits, not reviewed.

Inputs read: the PR body and its one comment (6512940265, this seat's claim on this head); card #27809 body and both comments (triage 6512254201, claim 6512415848); PR #27667 comments 6510205555 (seat check, "Auto-merge stays armed"), 6510422663 (triage: owning seat disarms until a delta PASS) and 6510686343 (delta review on af33de9c, FAIL); git diff origin/main...FETCH_HEAD (3 files, +5 / −5, one commit) and git show of each file on origin/main ddab8b996 and on the head; the 43 check-runs on the head, read twice. Merge base fec60e00b; git merge-tree against origin/main ddab8b996 is clean and no main commit since the base touches the three files, AGENTS.md, rest-channel.md, platform-readings.md or triage-duties.md.

Gate verdicts on the head at the second read: 43 check-runs, 0 failure; 4 still in progress: Type Check · workspace, Type Check · debt ledger, Type Check · consumer gates, Lint · PM dispatch-gates. Green: Governed Surface Queue Guard, PR-body guards, Check Changeset, Check PR Size, Lint · repo & tooling gates, Lint · docs & code guards, Lint · CI, release & engine gates, Lint · ESLint, the three Lint · scoped jobs, Type Check · source gates, Test Core, Test UI, Dogfood Regression Gate (aggregates; shards are expected skips for a .claude/**-only diff). This record judges the text; landing check ② is the seat's at landing time, after the four in-progress jobs report.

① Derived judgments

Measured against the three files on the head, not the PR body.

  1. Line counts are unchanged at every ceiling. contract-review.md 60 → 60, landing-operations.md 101 → 101, SKILL.md 319 → 319 (wc -l on origin/main and on the head). Every edited line is at or under 120 bytes: contract-review.md:49 117, :50 116, :58 119; landing-operations.md:12 119; SKILL.md:200 118. Right.
  2. The rule site is one bullet, contract-review.md:49-50, under landing check ①. Main's :49 was the regen/prose-only exception alone. The head's bullet keeps that exception (「纯重生成或只动散文面则原记录续管,落 Regen-provenance: 行」) and adds: any other head move, or a FAIL on the current head, while auto-merge is armed ⇒ the dispatching seat, on reading it, disarms per the AGENTS.md disarm sentence; the FAIL record names the disarm; re-arming follows ①. Right as a statement of the card and the triage comment (see ④).
  3. The disarm mechanics are a pointer, and the pointer resolves. grep -n -i disarm AGENTS.md on the head returns exactly one line, 297, inside item 14's governed-surface landing paragraph: "Already armed or queued when you read this? Disable auto-merge AND convert it back to draft, which disarms an unqueued PR; no seat act ... is measured to dequeue one (platform-readings.md, queue membership), so ask the maintainer at once to remove a queued PR by hand — then confirm from the remote that it is in neither the queue nor origin/main." So 「照 AGENTS.md disarm 句」 is a unique, greppable reference, and it already carries the queued case. Right.
  4. Relay spelling and the dequeue facts agree. rest-channel.md:56 names the reverse ops pr_draft/automerge_disable; :57 says draft-then-arm order and 「反向两 op 未实调」. platform-readings.md:41-43: converting to draft is not a reliable dequeue; dropping auto-merge on draft is seen only when unqueued; unloading auto-merge alone does not dequeue and both acts together were not seen to dequeue either (08-08, 09-28). The new text makes no claim beyond these: it points at the AGENTS.md sentence, which says do both and go to the maintainer for a queued PR. No contradiction. What changes is that two never-invoked relay ops become rule-mandated on an event (see should-fix 3).
  5. SKILL.md:197 「批准后再推亦不过期」 and the moved-head rule are about different objects. :196-197 say the maintainer's APPROVED review (GOVERNED_APPROVERS) is spent once per PR and survives later pushes; the new rule governs the contract-review PASS, which landing check ① already ties to the current head. A Tier H PR that is approved and armed, then moved by a main merge: the seat disarms, waits for a delta PASS or Regen-provenance:, then re-arms per ①, and the approval still stands, so no second approval is asked. 「踢出/变基同法」 re-lands through 落地前检, whose ① is PASS-on-current-head, so a kick or rebase is already under the same condition. Consistent.
  6. SKILL.md:200 is a pointer without the exception. 「PASS 后 head 移 ⇒ 撤挂回等」 names every move; the regen/prose-only exemption lives only at contract-review.md:49. Main's :200 (「回等复核」) had the same shape, so this is not new, and the over-reading errs toward disarming. Not a contradiction; should-fix 2.
  7. landing-operations.md:12 pointer. 「FAIL ⇒ 撤挂,补丁轮」 is read in the landing window (file line 3) and names the FAIL half. 「交棒请审」→「交棒」 loses nothing: SKILL.md:198 defines ③ 请审 = 席位交棒. Right.
  8. landing-operations.md:57 and :72 are untouched. :57 (dirty ⇒ merge main, then arm) is the pre-arm case and is consistent as is. :72 (dirty ⇒ merge origin/main and push at once) is the exact action that moved fix(rest): an undeclared hook abort answers the data door with HOOK_ABORTED #27667's head while armed, and it carries no pointer to the moved-head rule; the seat in the landing window reaches that rule through SKILL.md:200 and contract-review.md:49-50 only. Not a lost rule, since neither line asserts the PR stays armed; should-fix 1.
  9. The two deleted sentences are restatements, not rules. Main :57 「卡上副本在规则外、不是要求」: with 「单载体 = PR」 retained, the card copy is by construction not a carrier; the only consumer of the label in the corpus is a PR search (dispatch-runbook.md:44 is:pr is:open label:needs:contract-review) and check-owed-reviews.mjs WAITING_LABEL, both PR-side. Main :60 「⛔ 无 check、workflow 或队列守卫读标记与认领/hold 行」 is kept verbatim inside the head's :58; 「入队只认同形记录,标记有无不改判」 is landing check ① (:48, PASS on the current head) plus 「⛔ 不是闸门」 (:58). The marker's three operations (挂 :59, 摘 :60, FAIL 不摘 :60) are unchanged. No rule lost.
  10. Compressions on the edited lines only. 「只动上列散文面」→「只动散文面」 (prose faces defined once at :9-10; triage-duties.md:12 uses the same short form), 「继续管」→「续管」. Byte-exact elsewhere: git diff shows no other hunk. Right.
  11. No gate, script or workflow is added or changed. The diff is three .md files under .claude/skills/pm-dispatch/. Wanted 3 is not built, matching triage 「新增门禁默认否」. Right.
  12. Precedent is not in the skills text. scripts/pm/check-skill-id-lint.mjs:35 refuses /#[0-9]{3,}/ in the pm-dispatch corpus; fix(rest): an undeclared hook abort answers the data door with HOOK_ABORTED #27667 and main red (Dogfood Regression Gate 1/3) since 21c4bdd8 (#27667): two dogfood pins still expect a code-less hook refusal after HOOK_ABORTED landed #27806 are named in the PR body and the commit message instead. Right.

② Semver level

Not applicable: .claude/** publishes nothing, the PR carries skip-changeset, Check Changeset is green on the head. No package, schema or published surface moves. Consistent.

③ Boundary flags

The PR body declares four deviations from the dispatch order and no open_questions. Each answered:

  1. Precedent named in the body, not in the text: accepted, the id-lint pattern forbids it (① 12) and the rules-only ruling moved narrative out.
  2. Disarm as a pointer, not a restatement: accepted. The AGENTS.md sentence is stricter than the order's wording (both ops every time, plus hand removal for a queued PR), the pointer is unique (① 3), and CLAUDE.md's single-instruction-set rule argues against a second copy.
  3. Wanted 3 not built: accepted, triage 6512254201 said no new gate; the card itself says the queue guard is the maintainer's call.
  4. landing-operations.md:57 and :72 untouched: accepted as not a lost rule (① 8), carried as should-fix 1 because :72 is the incident's own action.

Author is objectstack-fleet[bot]; no off-relay login to note.

④ Design judgment

Against the card's Wanted and the triage comment, with the incident (6510205555 → 6510422663 → 6510686343 → merge 21c4bdd8 → p0 #27806) as the acceptance scenario.

  • Wanted 1 (a FAIL on the current head disarms). Held. 「现 head 落 FAIL 而已挂 auto-merge ⇒ 派发席读到即照 AGENTS.md disarm 句撤挂,FAIL 记录点名撤挂;重挂照 ①」. The actor is the dispatching seat (派发席, the seat that ACCEPTed and armed, i.e. the owning seat), on reading the FAIL; the review seat's FAIL record names the disarm; re-arming needs a same-shape PASS on the current head (①). This is triage's narrowing of the card (owning seat, not the reviewer), and the text follows triage. Replayed on fix(rest): an undeclared hook abort answers the data door with HOOK_ABORTED #27667: at 23:11Z the FAIL record would name the disarm owed; the owning seat's next event (any wake before 23:31Z) would read it and run the AGENTS.md sentence; with no PASS on af33de9c, ① forbids re-arming. The 20-minute window closes at the seat's next read rather than at the FAIL itself, which is what triage asked for.
  • Wanted 2 (a moved head disarms until a delta PASS or Regen-provenance). Held. 「余移…而已挂 auto-merge ⇒ …撤挂;重挂照 ①」 with the regen/prose-only exception continuing under the original record plus a Regen-provenance: line. Replayed: af33de9c edited two wire pins in the conflict resolution, so it is 「余移」, not pure regeneration (triage 6510422663 said the same under triage-duties L14), and the seat's 22:41Z check would have had to disarm instead of writing "Auto-merge stays armed". SKILL.md:200 reaches every seat on every fire with the same instruction.
  • Wanted 3. Nothing built. Right by triage.
  • Scoping to 「已挂 auto-merge」. A PR that is not armed has nothing to disarm, and ① already forbids arming it; the condition does not narrow the rule. Queued PRs are a subset of armed ones in this repo (enable-auto-merge is the enqueue act, landing-operations.md:59-61), and the AGENTS.md sentence handles the queued case.
  • Reach of the AGENTS.md sentence. It sits in the governed-surface paragraph; the new rule applies its mechanics to any PR under contract review, including a spec-face PR like fix(rest): an undeclared hook abort answers the data door with HOOK_ABORTED #27667 that touches no governed path. That is an extension of where the mechanics apply, not a change to them, and the sentence is self-contained. No contradiction with AGENTS.md.
  • Internal consistency across the three files. Checked each sentence that names arming, head moves or the marker: contract-review.md:28 (claim expires on head move), :42 (each substantive head owes a full review, findings-only commits a delta by the same reviewer), :48-50, :58-60; landing-operations.md:12, :57, :59-61, :72; SKILL.md:197-201. None contradicts the new bullet. The two softer points, SKILL.md:200 without the exception and landing-operations.md:72 without a pointer, are listed below.
  • Line budget. The one-line cost is paid in the same file by deleting two restatements (① 9), not by re-wrapping; the ratchet ceilings and the 120-byte rule hold on every edited line (① 1).

Must-fix: none.

Should-fix (not blocking; a follow-up PR or the same patch round if the seat chooses):

  1. landing-operations.md:72 is the landing-window instruction that moves an armed PR's head (dirty ⇒ merge origin/main and push), and it is the step fix(rest): an undeclared hook abort answers the data door with HOOK_ABORTED #27667's seat ran. Give it a pointer to the moved-head rule, e.g. append 「移 head 照 contract-review.md」, paying the bytes elsewhere in the file (the file is at 101/101 and :72 is at 117 bytes, so the line needs a compression, not a new line).
  2. SKILL.md:200 「PASS 后 head 移 ⇒ 撤挂回等」 names every move, while the regen/prose-only exemption lives only at contract-review.md:49. It errs toward disarming, so it is safe, but a seat reading SKILL.md alone will disarm on a byte-exact regeneration. Consider 「非例外 head 移 ⇒ 撤挂回等」 or a pointer, inside the 120-byte line.
  3. rest-channel.md:57 records 「反向两 op 未实调」 for pr_draft/automerge_disable. This rule makes them mandatory on an event. The first real invocation should update that line with what was measured (whether disable alone dropped the arm on an unqueued PR), and platform-readings.md:41-43 if a dequeue is ever observed. Separate card, not this PR.
  4. contract-review.md:50 「FAIL 记录点名撤挂」 reads either as "names the disarm as owed" or "confirms the disarm was done"; since the review seat writes before the owning seat acts, the first is the only one it can mean. 「点名欠撤挂」 would say so in two extra bytes, within the 116-byte line.

Implemented-by: claude/project-thread-ldqpch
Reviewed-by: session_016WV4d1QkPVVzNz3FJqb2iS

VERDICT: PASS

…to the disarm rule

- landing-operations.md: the dirty-merge step (merge origin/main and push at
  once) is the act that moves an armed PR's head, so it now points at the
  contract-review head-move bullet for the disarm and re-arm. Paid in the
  same file by deleting the Part-of rationale line, a consequence statement
  whose rule the lines beside it already carry.
- SKILL.md:200 names the exception: a non-exception head move disarms, so a
  byte-exact regeneration read from SKILL.md alone no longer reads as one.
- contract-review.md: the bullet is now spelled as the head-move exception
  (so SKILL.md's 非例外 resolves to it), and the FAIL record names the disarm
  as owed, since the review seat writes before the owning seat acts.

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

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS

Contract-review-claim: session_016WV4d1QkPVVzNz3FJqb2iS · head 5855983 · 2026-10-30T02:14Z

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 5855983ea638542cd6fb4c3a67d1846892a51395
Local-runs: none
Scope: .claude/skills/pm-dispatch/SKILL.md, .claude/skills/pm-dispatch/references/contract-review.md, .claude/skills/pm-dispatch/references/landing-operations.md + AGENTS.md:297 (the disarm sentence), .claude/skills/pm-dispatch/references/review-checklist.md:8-13, .claude/skills/pm-dispatch/references/execution-duties.md:62-66, .claude/skills/pm-dispatch/references/rest-channel.md:56-57, .claude/skills/pm-dispatch/references/platform-readings.md:41-43, scripts/pm/check-skill-line-ratchet.mjs (ceilings, 120-byte line rule). Cited files read to judge the three hits, not reviewed.

This is a DELTA record on top of record 6513017524 (PASS, head b02ba2dd5d4afb2de6a70005b339b85b8a44ae86, this seat). Sections the move does not touch stand as judged there and say so by name.

Inputs read: the one commit b02ba2dd..5855983e (git diff, 3 files, +4 / −4: SKILL.md 1/1, contract-review.md 2/2, landing-operations.md 1/1), its commit message, the three files whole on the new head; the seat's claim on this head (6513289169); card #27848 (should-fix 3 filed separately, Blocked-by: #27845, pm:blocked, unclaimed); the 40 check-runs on the head. origin/main is now c4cb5ec0c; merge base is still fec60e00b; git merge-tree against origin/main is clean; no main commit since the base touches the three files, AGENTS.md, review-checklist.md, execution-duties.md, rest-channel.md or platform-readings.md.

Gate verdicts on the head: 40 check-runs, 22 success, 18 skipped, 0 failure, 0 in progress. The coordinator's count is confirmed. The four jobs that were in progress on b02ba2dd are green here: Type Check · workspace, Type Check · debt ledger, Type Check · consumer gates, Lint · PM dispatch-gates. Also green: Governed Surface Queue Guard, PR-body guards, Lint & Repo Gates, Lint · repo & tooling gates, Lint · docs & code guards, Lint · CI, release & engine gates, Lint · ESLint, the three Lint · scoped jobs, Type Check · source gates, TypeScript Type Check, Test Core, Test UI, Dogfood Regression Gate, Check PR Size, Auto Label. The 18 skips are shards and opt-in or UI jobs expected to skip on a .claude/**-only diff; Check Changeset skipped under skip-changeset.

What moved: b02ba2dd to 5855983e

One commit, no merge. Each hunk measured on the head:

  • references/contract-review.md:49-50. :49 「head 后移:纯重生成或只动散文面则原记录续管」 → 「head 后移例外:纯重生成或只动散文面原记录续管」 (gains the anchor word 例外, drops 则); :50 「FAIL 记录点名撤挂」 → 「FAIL 记录点名欠撤挂」. Bytes 120 and 119 (the ratchet allows exactly 120). Rest of the file byte-identical to b02ba2dd.
  • SKILL.md:200. 「PASS 后 head 移 ⇒ 撤挂回等」 → 「非例外 head 移 ⇒ 撤挂回等」. 119 bytes.
  • references/landing-operations.md. Old :64 「Part of 卡开着不摘 pm:dispatched,无在飞物的卡就永远算进 label:pm:dispatched is:open」 deleted; a continuation line is added under the dirty bullet (now :71-72): 「这一移 head 的撤挂与重挂照 contract-review.md head 后移例外条。」, 83 bytes, indented as a wrapped bullet in the same style as contract-review.md:49-50. Line count 101 → 101.

Line counts on the head: 60 / 101 / 319, every ceiling held.

① Derived judgments

Items 1 to 12 of record 6513017524 re-read against the new head. Items 2, 3, 4, 5, 7, 9, 10, 11 and 12 stand: the text they judge is unchanged. Re-judged where the move touches:

  1. Ceilings and bytes. 60/101/319 unchanged; the five edited or added lines are 120, 119, 119, 83 bytes and the deleted line costs nothing. Right.
  2. SKILL.md:200 now carries the exception. 「非例外 head 移 ⇒ 撤挂回等」 resolves to contract-review.md:49, which now begins 「head 后移例外:」, the only place in the corpus that spells the exception. Dropping 「PASS 后」 loses nothing: 撤挂 presupposes an armed PR, and landing check ① says a PR is armed only after a PASS on its head, so "after PASS" was implied by "armed"; a move before any PASS leaves the PR where ① already holds it. Right; should-fix 2 of the prior record is closed.
  3. landing-operations.md:71 now points at the rule. The dirty ⇒ merge-and-push step, the act that moved fix(rest): an undeclared hook abort answers the data door with HOOK_ABORTED #27667's head, gets a continuation line sending the disarm and re-arm to the head-move exception bullet. :57 (pre-arm case) stays as is, which is correct. Should-fix 1 of the prior record is closed.
  4. The deleted :64 was a consequence statement, and its rule survives in three places. The line said: a Part of card left open with pm:dispatched still on counts forever in label:pm:dispatched is:open. The imperative behind it (remove pm:dispatched from a Part of card at close-out) is stated at landing-operations.md:63 (「确认 MERGED 同一动作里给 Part of 卡收口…标也须摘,⛔ 不拆到下轮巡检」), at :64 on the head (「摘标换回 pm:queue 或按剩余物定级,加一条…评论」, the very next line, which tells the seat what the label becomes), and verbatim at review-checklist.md:12 (「Part of 收口的卡不会自动关,pm:dispatched 必须手工摘,动作要件见落地细则 B」, pointing back into this section). execution-duties.md:64 covers the partial-landing release (Refs #N (item k) ⇒ 回 pm:queue + 清 assignee), and SKILL.md:107 defines pm:dispatched as always paired with an assignee. What is gone is the "why" (the dispatched-query consequence), which under the rules-only ruling is narrative. No rule lost. Right.
  5. contract-review.md:50 「点名欠撤挂」. Now says the FAIL record names the disarm as owed, which is the only thing a review seat writing before the owning seat acts can assert. Should-fix 4 of the prior record is closed. Right.
  6. Anchor consistency. git grep 'head 后移例外' on the head hits exactly two lines: contract-review.md:49 「head 后移例外:」 (the definition) and landing-operations.md:72 「head 后移例外条」 (the pointer). SKILL.md:200 「非例外 head 移」 names the same exception by its negation and has no other candidate to resolve to. Right.

② Semver level

Stands as judged in 6513017524: not applicable, .claude/** publishes nothing, skip-changeset on the PR.

③ Boundary flags

The four deviations stand as accepted in 6513017524. The commit message declares nothing new. Should-fix 3 (rest-channel.md:57 「反向两 op 未实调」) is filed as #27848 with Blocked-by: #27845, which is the right route: it waits on the first real relay invocation and is not this PR's text. Author remains objectstack-fleet[bot].

④ Design judgment

Stands as judged in 6513017524 for Wanted 1, Wanted 2, Wanted 3, the 「已挂 auto-merge」 scoping, the reach of the AGENTS.md sentence and the line budget. Re-run on the two points the move touches:

  • Replay of fix(rest): an undeclared hook abort answers the data door with HOOK_ABORTED #27667 through landing-operations.md. The seat in the landing window reads this file (line 3). At 22:41Z it saw dirty, merged origin/main and pushed (:71). On this head the next line (:72) tells it that this move's disarm and re-arm follow the head-move exception bullet; the bullet says a move that is not pure regeneration or prose-only, while armed, is disarmed on reading per the AGENTS.md sentence. af33de9c edited two wire pins, so it is 「余移」. The 22:41Z "Auto-merge stays armed" is now contradicted by the file the seat was reading, not only by SKILL.md:200. The gap the card measured is closed at the point where it opened.
  • The exception is now reachable from SKILL.md alone. A seat that reads only SKILL.md:200 is told that a non-exception move disarms, so a byte-exact regeneration is not read as a disarm trigger without checking the exception. The exception's definition stays single-sited (contract-review.md:49, with triage-duties.md:12 using the same short form), so no second copy was added.
  • Internal consistency across the three files re-checked for every sentence that names arming, head moves, the marker or Part of close-out: contract-review.md:28, :42, :48-50, :58-60; landing-operations.md:12, :57, :59-64, :71-72; SKILL.md:107, :197-201. None contradicts another on this head.

Must-fix: none.

Should-fix: none left on this PR. Should-fix 3 of 6513017524 lives at #27848 (pm:blocked on #27845 and on the first real automerge_disable / pr_draft stroke).

Implemented-by: claude/project-thread-ldqpch
Reviewed-by: session_016WV4d1QkPVVzNz3FJqb2iS

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#2 · os-elon-musk · session_016WV4d1QkPVVzNz3FJqb2iS

维护者速读

  • 改了什么:pm-dispatch 规则补两条撤挂规则,规则只落 contract-review.md 一处,另两处就地加指针。一、PR 已挂 auto-merge 时,当前 head 上的契约复核为 FAIL,派发席读到即撤挂(照 AGENTS.md 的撤挂句:卸 auto-merge 并转 draft,已入队者交维护者手动移出),FAIL 记录点名「欠撤挂」。二、非例外的 head 后移(如合入 main 改动了被复核面)同样撤挂,直到差量 PASS 或 Regen-provenance: 点名新 head;纯再生 / 纯文字的后移沿用原记录。landing-operations.md 的 dirty ⇒ merge 后推送 一条与 SKILL.md:200 改为指向该规则。3 个文件 +6/−6,行数不变。
  • 为什么改:fix(rest): an undeclared hook abort answers the data door with HOOK_ABORTED #27667 在 ACCEPT 后被 main 合入移动了 head,auto-merge 一直挂着;新 head 的差量复核 FAIL 后 20 分钟照样合入,main 变红(p0 main red (Dogfood Regression Gate 1/3) since 21c4bdd8 (#27667): two dogfood pins still expect a code-less hook refusal after HOOK_ABORTED landed #27806)。原规则只说「PASS 后 head 移 ⇒ 回等复核」,没说要撤挂。
  • 风险与回滚:只改规则文字,不加门禁(分诊:「新增门禁默认否」);revert 即回滚。PR 正文仍是第一轮描述(预算表 landing-operations +1/−1、SKILL.md 引文缺「非例外」),以本条为准。
  • 先看:contract-review.md:49-50(例外条与 FAIL 撤挂),再看 landing-operations.md:71-72 和 SKILL.md:200 两处指针。
  • 两分钟验证:git grep -n 'head 后移例外' -- .claude 应命中 contract-review.md:49 与 landing-operations.md:72 两处。
  • 需要你做的:受管面规则改动,按分诊走 Tier H,请批准本 PR(契约复核 PASS 6513017524,差量 PASS 6513333002,Head-sha: 5855983ea638542cd6fb4c3a67d1846892a51395)。

席位意见:ACCEPT。首轮契约复核 PASS(无 must-fix,4 条 should-fix)。1、2、4 已在本 PR 改完,差量复核 PASS;第 3 条(rest-channel.md:57「反向两 op 未实调」)另立 #27848。CI 全绿。

席位核对

  • 形态: one PR, Fixes #27809, three files under .claude/skills/pm-dispatch/ (+6/−6, line counts 60/101/319 unchanged), skip-changeset. Governed .claude/**: the register's claude-tree row reads Tier S, triage 6512254201 rules Tier H (「A rule change: the maintainer approves」); the seat takes the stricter, Tier H.
  • 前提实测: on fec60e00b contract-review.md carried no disarm text (claim 6512415848); the fix(rest): an undeclared hook abort answers the data door with HOOK_ABORTED #27667 timeline (6510205555 → 6510422663 → FAIL 6510686343 → merge 21c4bdd8) replays as now refused at landing-operations.md:71-72 and contract-review.md:49-50 (review ①).
  • 门禁 check-runs: head 5855983ea638542cd6fb4c3a67d1846892a51395: 40 check-runs, 22 success, 18 skipped (shards, opt-in, UI jobs, Check Changeset under skip-changeset), 0 failed, 0 pending; Governed Surface Queue Guard and Lint & Repo Gates success.
  • 接受的偏差: no #27667 / #27806 precedent in the skill text (check:pm-skill-id-lint refuses #NNN; the precedent lives in the PR body and commit); the disarm steps point at the AGENTS.md disarm sentence instead of restating it; Wanted 3 (a queue guard) not built, per triage; old landing-operations.md:64 (a consequence line) deleted to pay for the pointer, its rule carried by :63, :64 and review-checklist.md:12 (review delta ①). PR body keeps round-1 figures; this record supersedes them.
  • 范围外去向: review should-fix 3 → pm-dispatch(rest-channel): record the first measured automerge_disable / pr_draft stroke in place of 「反向两 op 未实调」, now that the disarm rule mandates both ops #27848 (pm:blocked on this PR; records the first measured automerge_disable / pr_draft stroke).
  • 落地条款: Tier H: a GOVERNED_APPROVERS approval, then the seat lands it under the maintainer's landing grant for this term (seat thread, 2026-10-29 22:04Z).

@os-zhuang
os-zhuang marked this pull request as ready for review October 30, 2026 02:20
@os-zhuang
os-zhuang added this pull request to the merge queue Oct 30, 2026
Merged via the queue into main with commit c91a004 Oct 30, 2026
49 checks passed
@os-zhuang
os-zhuang deleted the claude/project-thread-ldqpch branch October 30, 2026 02:27
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 size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants