You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Derive the landing obligations a new gate script owes, instead of letting CI teach them (#12435)
* feat(pm): derive the landing obligations a new GATE SCRIPT owes, before CI does
A new gate carries obligations that no derivation enumerated: a bare-root
verdict in `bare-root-worklist`'s TRIAGE, and an `escapable-literal` respell or
record in `check:pm-dispatch-gates`. Both were learned from red CI, after the
dev had already reported — four devs, two obligations, twice inside one hour.
Adds a fifth CHANGE_KIND_GATES entry keyed on gate-script IDENTITY: the path is
a file some discovered family runs. Both gates open exactly `entry.files`, so
the trigger is the population they actually judge — 170 tracked files, 2.47% of
the corpus, precision 100% by construction and nothing listed.
⛔ Deliberately not the `check-*` filename regex the card proposed: measured on
this tree it fabricates 10 leads and misses 31 real gate scripts (93.3%/81.8%).
Both directions are pinned as self-test cases.
Nothing imports `bare-root-worklist` here — the #10705 refusal (no constant-name
heuristic on the path that derives every PR's gate list) is kept intact; this
entry NAMES the gate rather than reading its verdicts. The file grew no watch
hint of its own (9 before, 9 after).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UjM2ia8Av1v5NqfqQEQmC6
* docs(pm): say "no family RESOLVES to" rather than "run by no family"
Three of the ten fabrications the new kind refuses are healthy, running
scripts — `check-dts-emitted.mjs` is invoked by ~11 packages' own build
scripts, and `check:platform-checklist` is maintainer-run by design. They are
fabrications for THESE two obligations because neither sweep opens them, not
because they are dead, and the earlier wording read as the latter.
Measured while checking whether the first was an out-of-scope finding: a survey
scoped to the root manifest and the workflows reads it as unwired; the
per-package manifests say otherwise. Recorded so the next reader does not
re-run that survey and file it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UjM2ia8Av1v5NqfqQEQmC6
---------
Co-authored-by: Claude <noreply@anthropic.com>
why: 'a gate whose population is spelled as a BARE top-level word (a separator-less string such as the one naming the package root) builds no watch hint at all, so it lands unnameable by every dispatch brief — and this self-test refuses the tree until a verdict for it is RECORDED. That obligation is a ledger row, not a command, so no amount of running the families you were given surfaces it: four devs learned it from red CI instead, twice within one hour, each AFTER reporting. Three directions bite, which is why an EDIT counts and not only an add: FRESH (a new invisible population, unjudged), STALE (a recorded verdict whose row you renamed or removed), CONTRADICTED (you declared a hint on a gate whose recorded verdict says the population cannot be spelled). The remedy is the one the failure text names: REFUSE-WIDE, REFUSE-UNSPELLABLE, or the subtree-glob idiom beside the constant. ⛔ Declaring a root the gate does not really read is the costlier error, and ⛔ the map is shrink-only, so a new row is never a remedy for a stale one',
3155
+
},
3156
+
{
3157
+
name: 'check:pm-dispatch-gates',
3158
+
why: 'the SECOND obligation of the same shape, in this tool, and the one it cannot name for you: a gate that declares a bare top-level word the tree HAS joins the escapable-literal species, and this gate refuses the tree until the literal is either respelled or recorded. It reaches your card by gate-script IDENTITY only — its own declared literals are an artifact roster rather than a population — so a card that merely INCURS the obligation is never named by the path derivation, which is measured, not suspected. Two remedies and which is right depends on what your gate actually READS: it really does walk that root, so declare the subtree spelling beside the literal; or it does not, so respell the literal to say what the predicate means. ⛔ Do not reach for the first by default, and ⛔ the ledger is shrink-only',
3159
+
},
3160
+
],
3161
+
},
3072
3162
{
3073
3163
kind: 'adds or edits TypeScript in the ROOT tsc program (outside the directories tsconfig.json excludes)',
0 commit comments