Skip to content

[Decision] 仪器与吞吐的取舍:哪些闸门该硬、达档复核保留到什么程度 #19491

Description

@os-steve

Filed by domain:spec seat 4 (session_01AmH9bKvGoLjiY86Q4Z3og2, seat post #18917) from a maintainer conversation on 2026-09-21. ⛔ Not a claim, ⛔ not a ruling — routing and grading are triage's.

Status at 2026-09-21T03:43Z: decisions A and C are SETTLED by the ruling below. B and D are open.

The question

How much of the PM gate apparatus should hold a hard landing gate, how much at-tier contract review is worth its agent cost, and which of the existing instruments are kept, simplified or retired — at a stage where dev time should go to product features and the instruments should stop consuming continuous development.

What the maintainer said, verbatim and untranslated

阻碍我的pr落地,导致 agent 开发满就是负面因素,哪怕挡住几个bug,但是出现bug也是可以重新修改的。

达档复核 我理解也没有那么重要,没复核出的bug,后续总会测试出来。

业务价值也要你判断,我只是不希望开发时间不停的话在仪器上,创业阶段dev应该集中做业务功能

agent 车队都是ai,不会有人去看

包括现有的仪器是否需要保留或者简化,避免仪器本身不停的开发

决策卡创建完告诉我,六条我同意

What was measured

reading value
scripts/pm/** total 121,888 lines over 27 files
the code it gates (packages/spec/src, non-test) 206,512 lines — the gating tools are 59% of the gated code
commits in the last 14 days, whole repo 1,432; 206 touch scripts/pm/**, 127 touch nothing but scripts/pm/** (8.9% of all commits are pure instrument work)
the same window, product 855 commits touch packages/**
check-widening-tells.mjs born 2026-09-07; 18 changes in 14 days — i.e. every commit it has ever had falls inside the window. It has never had a stable week
open defect cards against it 5#19384, #19341, #19221, #19440, #17926every one a false positive
its own header :102-104 「cannot tell an array element from a call argument … a tell, never a proof」
PR #19314 READY, clean, 30 green / 5 skipped / 0 red, at-tier review PASS — blocked 12 hours by 7 tells its own review ruled false
true positives from that instrument, across 8 rounds 0
lane queue composition 92 cards: 81 product, 11 tooling
comment-to-total ratio in the five large instruments 39%–52% — half of the bulk is prose about the instrument
while this card sat open the tooling tree gained its 27th file, close-cards.mjs, 1,145 lines, landed the same day (#19479)

⭐ The finding that changes the cost of fixing this

The two limbs that have actually blocked landings are not CI gates. Measured: grep -rl across .github/workflows/ returns no file referencing check-widening-tells or check-clause2-carriers. They refuse only because the skill text tells the seat to treat a non-zero exit as a landing blocker:

  • .claude/skills/pm-dispatch/SKILL.md:649 — 「开 PR check-clause2-carriers --pair N 0 才请审」
  • .claude/skills/pm-dispatch/references/contract-review.md:41 / :43

⇒ Loosening them is an edit to two sentences under .claude/** (Tier S, landed by the owning seat). It touches no workflow, no product code, and cannot make CI red. The 12 hours #19314 lost were spent on a rule, not on a test.

Every instrument, with its verdict

CI = referenced by a workflow, so it can fail a PR. SEAT = run only by the dispatch loop, so it blocks only through skill text.

instrument lines changes born in 14d wired verdict
check-governed-merges 6,146 31 08-18 9 CI + the register KEEP, unchanged. Answers a definite question — is this path governed, at what tier. Correct every time it was exercised.
check-governed-queue-guard 4,535 18 08-25 9 CI KEEP. Enforced #19351 correctly at the queue; the one defect found in it was stale prose, not enforcement.
dispatch-gates 28,769 163 08-10 34 CI ×13 workflows KEEP, FREEZE. The most-changed file in the tree and the most load-bearing — 13 workflows import it. ⛔ No refactor, no new gate families; changes only when a workflow it already serves breaks.
check-half-states 36,717 121 08-10 52 CI ×8, report-only SIMPLIFY. The largest file in the repo's tooling and the fastest-churning (52 changes in 14 days). It blocks nothing, so it costs no throughput — it costs dev time. Proposal D1 below.
check-clause2-carriers 9,985 42 08-31 33 SEAT SPLIT. Keep C6 (does a review of record exist for this head) — a definite question, cheap, catches a real hole. Demote C5 (widening tells) to report-only — already dispatched.
check-widening-tells 6,107 18 09-07 18 SEAT REPORT-ONLY + FREEZE DEVELOPMENT. 0 true positives, 5 open false-positive cards, 14 days old and never stable. It stays as a hint printed beside the review; ⛔ no further dev on it, and 「the checker mis-fired again」 findings are closed by one sentence from a seat, not by a PR.
the other 21 scripts/pm/*.mjs 29,629 mixed NO SWEEP. ⛔ Deleting instruments is itself instrument work. They are frozen where they sit; each is revisited only when it actually fails.

The principle behind the column, stated so the next case is decided without another card:

An instrument that answers a question with a definite answer (is this path governed? does a review of record exist? is this branch shaped as the contract requires?) may hold a hard gate. An instrument that guesses at intent — 「is this diff widening a contract」, which its own header says it cannot prove — may print, and may never refuse.

Why 「不停的开发」 happens, and the only rule that stops it

Every one of the 18 changes to check-widening-tells was a false positive being patched. A guessing instrument generates its own maintenance: each mis-fire looks like a bug in the instrument, so it earns a card, a dev, a review and a PR. A definite instrument does not: all five open false-positive cards in this lane name check-widening-tells, and none names the register.

⇒ The rule: a report-only instrument gets no dev time for being wrong. A wrong hint costs one sentence in a review record. Only a gate earns a fix when it is wrong, which is another reason to have few gates.

The independence question, answered honestly

⚠️ The maintainer's counter is correct and is recorded: 「agent 车队都是ai,不会有人去看」. The reviews are AI reading AI; this is not human oversight. What it is, measured: an independent second read with an adversarial brief. Every catch below was missed by the agent that wrote the diff and found by a different agent given the same diff and a "find what is wrong with it" brief.

PR what the review caught would a test catch it?
#19302 the regenerated upgrade guide still promised upgrading 「from any past major」 while --from 15 throws; upgrading.mdx:218's --to 16 became an empty range; a wrong conversion count headed for the customer-facing CHANGELOG no
#19302 (round 1) a red packages/cli integration test the dev never ran yes, if run
#19184 an orphaned @example docblock left by a removed field no
#19088 a changeset citing a route retired at the pin no
#18572 「136 registered surfaces」 where the measured figure is 389 no
#19379 a rules line that dropped its ALL quantifier, partitioning surfaces instead of pull requests; a self-test line printed on every run naming the wrong actor no

⇒ The catches concentrate in things that ship to users and to agents — docs, CHANGELOG, rules text. For that class 「后续总会测试出来」 does not hold: no test suite goes red because a document lies.

SETTLED — the six the maintainer agreed to

Ruled 2026-09-21: 「决策卡创建完告诉我,六条我同意」.

  1. PR fix(pm): check-widening-tells T2 asks which construct encloses the element before asserting a closed set #19438 stopped at round 8. Eight rounds of dev and review on one checker; the remaining work was documentation and is not worth the PRs it holds.
  2. C5 demoted from refusal to report-only — the tell still prints with its file:line evidence, the at-tier review rules on it.
  3. spec: declaresCollection reads a pipe's authorable side, so a preprocess-wrapped collection key cannot silently leave the merge refusal set (#19150) #19314 lands once the demotion clears it. ⇒ This settles C: it waits for a legitimate clear, ⛔ it is not landed over a red --pair by seat fiat.
  4. Concurrency redirected to the 81 product cards, starting with four p1s: reading(spec): the tools universe rule can only REMOVE findings — what would a runtime tool create actually be judged by? (ruling #203/4 group B) #19477, spec(lint): wire the inert runtime-create rules for action / hook / report / skill / email_template / mapping — six types, one edit (ruling #203/4 group A+C) #19474, [finding] datasource is a 14th allowRuntimeCreate: true type with zero live runtimeTypes declarations — invisible to #19275's census because its registry entry is the only MULTI-LINE one #19389, The /packages read doors' declared request schemas and their actual query reads diverge in BOTH directions — ?limit= and ?cursor= are declared and never read, ?type= is read and never declared #17667.
  5. The 11 tooling cards are not dispatched, including 「the checker mis-fired again」 findings.
  6. At-tier review only for what ships to users or agents — docs, CHANGELOG, published schemas, rules text. ⇒ This settles A as A1: internal-code defects go to tests and user reports.

Still open — the maintainer's to settle

B / D1. How far check-half-states is cut. 36,717 lines, 52 changes in 14 days, report-only, 8 workflows depend on it. It is the single largest consumer of instrument dev time in the repo. Options:

action cost risk
D1a (this seat's recommendation) freeze it — no new rows, no refactor; a row is fixed only when a workflow that consumes it breaks zero dev time, zero PRs its known-stale rows stay stale — H43 is measured tier-blind: governedTierFor occurs 0 times in the whole 36,717-line file, against 10 in the register and a control symbol (GOVERNED_APPROVERS) that greps 7 hits in the same file
D1b cut it to the rows a workflow actually reads, delete the rest one dev PR on a 36k-line file, touching 8 workflows a deletion PR on the most-depended-on report is itself a throughput risk
D1c leave it as is zero decision cost it keeps earning ~4 commits a week

D2. Whether the freeze is written into the skill — i.e. whether .claude/skills/pm-dispatch/ gains one line saying 「仪器只在挡住真实工作时才改;只报告的仪器报错不配 dev」. Writing it is Tier S and cheap; not writing it means the next seat re-derives this conversation from scratch.

What this seat does now

The six are in force from 2026-09-21T03:43Z. D1a is the default absent a ruling on B/D — frozen, not cut, because cutting is more instrument work. ⛔ Stated so that silence is not read as agreement with something never chosen.


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions