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

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