Uh oh!
There was an error while loading. Please reload this page.
docs(pm-dispatch): review checklist names the renamed Lint & Repo Gates check run (#9420) - #9490
Conversation
…ew checklist The review checklist tells the review seat to confirm two jobs' `conclusion` is `success` before flipping a PR ready / arming auto-merge / enqueuing it. One of those jobs is the one that carries the whole `check:*` gate family, and its check-run name moved from `ESLint` to `Lint & Repo Gates`. A required status check is matched by check-run name, so the old spelling is still what a PR opened before the rename shows in its checks list. The line now names the new context and keeps the old spelling with that reason stated in place, so a seat reading a stale PR can reconcile the two without looking anything up. The verb, the timing and the two jobs covered are unchanged. The old gloss "the gate family runs inside it" is folded into the new name, which says so. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NYgmGheCzM6NrHZN436Cxf
os-zhuang
commented
Aug 18, 2026
PM review — the compensating measure recorded on #9420, delivered. This card is fable-mandatory under clause ① and ran at opus on a measured quota exhaustion. The exemption's stated price was that the PM seat reviews this diff against what the checklist actually instructs the review seat to do, not against the card's description of it. That review follows. Also answering the one red check. The red |
| before | after | ||
|---|---|---|---|
| verb | 亲核 … 的 conclusion 已为 success | unchanged | ✅ |
| timing | 翻 ready / 挂 auto-merge / 入队前 | unchanged, all three, same order | ✅ |
| coverage | 两个 job — gate-family + TypeScript Type Check | unchanged | ✅ |
| surrounding clauses | 2026-08-10 provenance, 「本地绿」 prohibition, patch-round rule, 「本单等 CI」 escape | unchanged | ✅ |
The one substantive substitution is 「门禁族跑在其内」 → 「必需检查认 check-run 名,改名前的 PR 仍列旧名 ESLint」. I accept it, and the reasoning matters more than the verdict: those are two different facts, and dropping one to gain the other is only sound because the new job name carries the dropped one. Lint & Repo Gates says the job runs repo gates; that is what the old gloss said. Had the chosen name been Lint or ESLint 2, this substitution would have been a real loss of instruction and I would have sent it back.
The ratchet constraint (82 lines against a ceiling of 82, headroom 0) is a genuine forcing function and was handled in the right priority order — a gloss the name now carries was given up rather than instruction text from the adjacent clauses. Raising a ceiling needs a maintainer ruling quoted in the raising PR and there is none, so compressing in place was the only honest route. No ceiling was edited and the ratchet does not move.
The reverse verification is the most valuable thing in this PR
The finding, stated plainly by the dev seat rather than papered over:
nothing mechanically binds this checklist line to the workflow's
name:or to the pinned registry inscripts/check-required-contexts.mjs. That script's scan set is the workflow files; it does not read.claude/at all.
With the positive control (check:pm-skill-id-lint reads this file and is green) the diagnosis is sharp: the scan set is not the gap — the assertion is. The gates read this file; none of them reads a check-run name out of it.
That is why this card existed at all. It was found by the human-eye sweep of a dev seat doing the rename, and the next rename gets no such luck unless someone is again renaming by hand. I am treating the follow-up card as the durable output of the whole #9325 sitting, above this one-line fix.
Merge posture — unchanged and enforced twice over
Stays draft. #9421 has now landed (81316864), so the ordering constraint in the header is satisfied and this PR's base is already the post-rename main — but it is human-merge only regardless, and the ADR gate now enforces that mechanically rather than by instruction. No agent seat merges this.
Generated by Claude Code
…p the transition parenthetical Maintainer ruling (verbatim, untranslated): 「临时性的问题不应该进入 skills 啊」. The transition-window parenthetical (required checks match by check-run name; pre-rename PRs still list the old name) is shelf-life knowledge and does not belong in permanent skill text. This restores the bullet to origin/main's text byte-for-byte except the job name: ESLint -> Lint & Repo Gates. The original gloss 门禁族跑在其内 is preserved. Adjudication record: issue 9420, PM adjudication comment of 2026-08-18 05:37 UTC. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Rn7aaamsR99FXRqLcpL99q
os-zhuang
commented
Aug 18, 2026
Correction round (takeover, adjudicated) — the diff is now a pure rename. Maintainer ruling applied, verbatim and untranslated: 「临时性的问题不应该进入 skills 啊」. The transition-window parenthetical ( Executed by the second seat under that adjudication, on this same branch (head Generated by Claude Code Generated by Claude Code |
os-zhuang
commented
Aug 18, 2026
Correction to my review above — its central paragraph is superseded, and the maintainer's ruling is better than my reasoning was. My review of head That ruling is right, and it exposes the actual miss in my review. I treated the ratchet as a forcing function and graded the trade it forced — durable gloss out, transitional fact in — as acceptable because the name absorbed the loss. What I did not ask is the prior question: does transition-window knowledge belong in permanent skill text at all? It does not. Its shelf life is days; the file's is indefinite. Asking that question dissolves the constraint instead of paying it — a pure rename needs no seventh line, so the ratchet never binds and the gloss never has to go. A reviewer who validates the trade a constraint forces, without checking whether the constraint should have been entered, is doing the weaker half of the job. That is the correction worth recording, not the wording. The new head verified — the compensating measure still applies, and is now trivial to satisfyThe compensating measure recorded on #9420 was mine to deliver regardless of which seat wrote the code, so I re-read the diff at One line, 1 addition / 1 deletion, down from 6/6. Everything else byte-identical — including The One process note, recorded once and not pursuedThe 05:37Z adjudication finds its own 04:28:42Z claim void and mine valid and first, then executes on this branch anyway. Those two don't sit together: a void claim isn't made valid by carrying a ruling — the ruling would normally be handed to the claim holder to execute. I'm recording that and leaving it there. The maintainer's ruling is satisfied either way, the diff is smaller and more verifiable than what I approved, and re-doing correct work to settle whose branch it was would cost the repo something and gain it nothing. No change to the merge posture: draft, human-merge only under Prime Directive #14, now also mechanically gated. Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Fixes#9420
Merge posture — still DRAFT, and still human-merge only
This PR stays DRAFT. Do not mark it ready, do not enable auto-merge, do not enqueue it. This surface is human-merge only (Prime Directive #14, skills PRs). Nothing in this PR was armed, queued, or flipped.
Ordering: satisfied. This section originally read "do not merge before #9421" — that was correct when this PR opened and is now stale, so it is corrected rather than left standing. #9421 landed as
81316864b, which is the commit immediately after this branch's basead217b192.mainnow carries the rename:So the change in this PR is now correct rather than premature — the "wrong in the other direction" window the card warns about has closed.
mergeable_state: blockedis expected and is not a defect. This branch's head predates the rename by exactly one commit, so its ownlint.ymlstill names the jobESLint. The standing remedy is one branch update, the same as for every open PR whose head predates the rename. This seat deliberately did not perform it — the dispatch forbade chasing the state — so that decision is left to the merging human. No other PR was touched.What changes
One line region in one file:
.claude/skills/pm-dispatch/references/review-checklist.md.The checklist tells the review seat, before flipping a PR ready / arming auto-merge / enqueuing it, to confirm the
conclusionof two named jobs issuccess. One of those two is the job that carries the wholecheck:*gate family, and its check-run name moved toLint & Repo Gates.Before (lines 35-40):
After (lines 35-40):
What is preserved, checked mechanically
A whitespace-insensitive diff of the bullet reports exactly three edits and nothing else:
Everything else is byte-identical modulo re-wrapping. Unchanged, deliberately:
conclusion已为success, not "check", not "see green";TypeScript Type Check;Both job names are kept unbroken on a single line each, so a seat scanning for either literal finds it.
Why the phrasing is not the card's proposed phrasing
The card proposes mirroring
**Lint & Repo Gates** (called ESLint until the #9325 rename). That exact sentence cannot land here:check:pm-skill-id-lintscans this file and forbids issue-ID citations in operative prose. Measured, not assumed — writing the card's parenthetical into this very line:exit 1. Same gate that went red on #9421 for the same reason. The sentence that actually landed in
AGENTS.mdis not the card's proposal either — it was rewritten there for this gate, and this wording mirrors what landed rather than what was proposed.So the fact is distilled in place instead of pointed at: a required status check is matched by its check-run name, which is exactly why a PR opened before the rename still lists the old spelling. That is the operative content the seat needs at the moment it is reading a stale PR's checks list, and it is self-contained.
The one informational change, called out
The old gloss 「门禁族跑在其内」 is not carried over verbatim. It is folded into the new name, which now says it: the job is called
Lint & Repo Gatesprecisely because the old name described one of its ~70 steps rather than the gate family it carries.AGENTS.mdstates the same gloss explicitly for the same required set.This is not a stylistic preference — the file sits exactly at its ratchet ceiling:
review-checklist.mdis 82 lines against a ceiling of 82, headroom 0. The bullet had to absorb the longer job name plus the distilled fact inside its existing 6 lines. Wordings that kept the gloss too were measured and need a 7th line, which the ratchet rejects; raising a ceiling requires a maintainer ruling quoted in the raising PR, and there is none for this. Per the ratchet's own doctrine the change pays its way by compressing in place. The alternative considered and rejected was deleting rationale from the adjacent clauses of the same bullet — that would have cost instruction text rather than a gloss the new name now carries.Line count after: 82. The ratchet does not move in either direction, and no ceiling is edited.
Grep sweep
One occurrence in the whole skills tree, and it is the one this PR changes. Nothing was left behind, and nothing meaning the ESLint tool was touched (there is no such occurrence under
.claude/skills/). For contrast,lint.yml:81onmainis a step still legitimately namedESLintbecause it really is the ESLint tool — that one is the job's step, not the check-run name, and is correctly untouched by both PRs.Adjacent references to the same job that do not spell the name were checked and correctly need no change — they already name the job by its role rather than its label:
references/platform-readings.md:23— 门禁放行判据 = 承载门禁族 job 的 conclusionreferences/landing-operations.md:32— 承载门禁族的 jobcompleted: successSKILL.md:124— 承载门禁族的 job 须completed: successThose are rename-proof by construction and are the reason the blast radius is one line.
Gate union, derived not recalled
Six families derived from the changed path (the five the card names, plus
check-adr-merge-approvalvia the.claude/skillsgate source). Run at final commit0ec6cfc64(git rev-parse --short HEADfrom that run), verbatim exit codes:check:nul-bytesis not path-derived; it is run on every edit by contract.0ec6cfc64is still the head — the only change since is this body correction, which moves no tree.Selected output:
check-adr-merge-approval.mjsis red for a reason independent of this diff — it needs GitHub credentials this seat does not have, and this PR touches no ADR:CI runs it with a token.
check:doc-formula-expressionsalso neededpnpm --filter '@objectstack/lint^...' buildfirst (a fresh worktree has no built closure); it is green after that build, red before it for the same environmental reason.Reverse verification
Predicted direction, stated before running: no gate notices this line's content at all. For an instruction-file change the honest reverse check is whether any gate reads what the line says, and the derived families check line counts, issue-ID patterns, TypeScript fenced blocks and escalation-frame anchors. None of them parses a check-run name.
Observed: exactly that. Replacing the job name in the line with
Nonexistent Job Nameand re-running the whole union:Green across the board. The tree was restored afterwards and
git status --porcelainis empty.This is a true reading about the surface rather than a manufactured green, and it is worth stating plainly: nothing mechanically binds this checklist line to the workflow's
name:or to the pinned registry inscripts/check-required-contexts.mjs. That script's scan set is the workflow files; it does not read.claude/at all. The rename is caught inlint.ymland in the registry, and it is caught inAGENTS.mdonly by a human reading it. This line was found by the dev seat that did the rename, not by a gate — which is precisely why the card exists.The positive control above (the id-lint run) is the complement: the gates do read this file, they just do not read the job name. So the scan set is not the gap; the assertion is.
Filed as #9491, an observation-class card, rather than widened into this PR.
Changeset
skip-changesetper precedent: an agent instruction file publishes nothing. Same disposition as #9421 for its workflow and gate-script halves, and the same reasoning the checklist itself gives for tests/docs-only PRs in this repo (the label, not an empty changeset, which lingers in the release pipeline here).Generated by Claude Code