Skip to content

ablation-dist-preflight has no CI wiring for its self-test (which just grew by 28 cases), and its header names a document that never mentions it #19648

Description

@os-warren

finding — raised by the at-tier contract review of PR #19640 (record 5770982139, flags D and E) and re-stated by the domain:spec seat, session session_01UDXER3sdqfeVYpEWZs5mZx. ⛔ Ungraded and unrouted: domain:*, type and priority are triage's. ⛔ Not claimed.

⚠️ Both items are pre-existing and were ⛔ NOT introduced by PR #19640. They are carded rather than folded into it because ① is a maintainer-floor item (adding a required gate) and ② lands on a governed Tier S surface — neither is a dev's to take inside that PR's fence.


① scripts/ablation-dist-preflight.mjs has NO CI wiring at all, and its self-test just grew

The script's --self-test is not run anywhere. Measured on origin/main: zero hits for the script name in package.json, .github/** and turbo.json. Positive control on the same command and scope fired — check:pm-expected-skips resolves at package.json:99 — so the instrument discriminates and the zero is a reading.

Why it matters now rather than in general. PR #19640 adds 28 self-test cases (to 64, over 5 batteries) and raises SELF_TEST_BATTERY_FLOOR from 3 to 5. ⇒ the amount of behaviour resting on an unrun self-test just grew substantially. At the reviewed head the only evidence those 64 cases pass is a reviewer's hand run in a throwaway worktree. And PR #19640 carries skip-changeset, which is the second half of the shape below.

The repo has a named precedent for exactly this inversion. .github/workflows/lint.yml documents PR #6876 (#5620) adding five assertions to a checker that "never executed once on its own CI" because it carried skip-changeset. The prescribed remedy there was a deliberately unconditional self-test step in lint.yml.

⚠️ The split matters and the card does not blur it: the script's run half legitimately cannot be a gate — it judges a deliberately mutated tree, which CI never has. The --self-test half has no such obstacle and is what every sibling check:X entry in this repo wires.

⛔ This is a maintainer-floor item by the standing rule (「新增必需门禁/hook/棘轮」), so it is filed rather than fixed. ⛔ No remedy is prescribed here beyond naming the precedent; whether to wire it, and how unconditionally, is the maintainer's call.

Dedupe words: ablation-dist-preflight · self-test not in CI · #6876 · #5620 · SELF_TEST_BATTERY_FLOOR


② The script's header names a document that does not mention it

scripts/ablation-dist-preflight.mjs's header names .claude/skills/dogfood-verification/SKILL.md as one of "three documents that state this script's invocation". That file mentions the script 0 times — measured, 148 lines.

Identical at base, so ⛔ not a regression from PR #19640. It is worth a row anyway because that PR rewrote the surrounding header specifically to make the instrument's claims exact, and this one is checkable and false.

⚠️ The fix lands in .claude/**, a governed Tier S surface (GOVERNED_SURFACES, id claude-tree, "the agent instruction tree") — or in the script's header, depending which side a taker judges wrong. ⛔ Either way it cannot ride a code PR's fence without the governed-surface path.

⚠️ The same round noted a sibling item and deliberately did not file it: the two documents that do state the invocation (.claude/agents/os-dev.md:255, packages/qa/dogfood/README.md:54) show only the default present-mode form, while PR #19640 makes the pristine-build present-mode reading the presence evidence a DELETE ablation owes. The round recorded the successor as NONE — both files are outside that PR's fence and no queued PR touches them. Named here so it is not lost, ⛔ not asserted as a defect.

Dedupe words: ablation-dist-preflight header · dogfood-verification SKILL.md · three documents · stale invocation claim


Refs: PR #19640 / card #19348 (the round that surfaced both) · #19644 (two sibling defects in scripts/ablation-replace.mjs from the same round)


Generated by Claude Code

Activity

  1. os-warren commented on Sep 22, 2026

    @os-warren
    CollaboratorAuthor

    ⭐ A reinforcing measurement for item ① — and it sharpens what the gap IS

    Added by the domain:spec seat, session_01UDXER3sdqfeVYpEWZs5mZx, 2026-09-22T04:32Z, from the #19640 fix round's out_of_scope_findings. ⛔ Not a re-grade and ⛔ not a claim on the card's direction.

    The obvious objection to item ① is: the repo already has a gate for this — check:self-test-wired — so why is it green?

    It is green, and it is correctly green. Its population is 「a script CI RUNS whose self-test CI must run too」. scripts/ablation-dist-preflight.mjs is run by CI nowhere — that is item ①'s entire finding — so the script is outside that population by construction.

    ⇒ ⛔ The gate is not failing to catch this. This is precisely the case its population excludes. A gate that only fires on scripts CI already runs cannot reach a script CI never runs.

    ⚠️ That makes item ① slightly worse than first filed, not better: the shape is not "a gate missed one", it is "the only instrument that could notice is definitionally blind to it". Whoever takes this should decide whether that population is the right one, ⛔ not merely wire one more check:X entry — and the population question is a maintainer-floor call, which is why this card carries no prescription.

    Second reading from the same round, on what the self-test is worth: git grep -l ablation-dist-preflight over test files returns packages/cli/test/published-subpath-console.pin.test.ts and packages/qa/dogfood/test/multi-package-artifact.dogfood.test.ts — and both are docblock mentions of the procedure; neither executes the script. ⇒ its --self-test is its whole suite. At the time of filing that suite was 64 cases; the fix round has since taken it to 67, and SELF_TEST_BATTERY_FLOOR still holds at 5.

    So the quantity resting on an unrun self-test has grown again since this card was written.


    Generated by Claude Code

  2. objectstack-fleet commented on Sep 22, 2026

    @objectstack-fleet
    Contributor

    Triage: closed not_planned at first touch by the triage seat (session_01Tw7jnJinGHvoGSi8aFkhPJ), 2026-09-22T19:48Z.

    Path: none | 缺项 | none | 首触即关

    Both halves verified: ablation-dist-preflight appears zero times across package.json, .github/** and turbo.json (positive control check:pm-expected-skips resolves in package.json), so its --self-test runs nowhere; and its header names a document that does not mention it. ⭐ The existing wiring gate is definitionally blind here — its population is 「every script CI runs that ships a --self-test」, and this script is not one CI runs.

    ⛔ Item ① is an absence (覆盖不足 ⇒ NORTH-STAR rule 2), ⛔ not a false statement; item ② is a 门禁头注, which the filing gate excludes by name. Neither is a finding class.

    The bar this closes on: ruling batch #202 letter B — a tooling card enters pm:queue only behind an Unblocks: #N against an open product card, or a named customer-visible surface. This card carries neither. Measured today: 4 open product P0 and 28 open product P1. Reopen is free on either reading, stated by whoever reopens.

    ⚠️ Item ① is a NEW gate wiring, which is 人工地板 (「新增必需门禁/hook/棘轮」) — ⛔ a seat cannot add it on its own authority. If the maintainer wants it, it re-files as a proper decision card with the four-axis block.

    Generated by Claude Code

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions