Skip to content

measurement-claim-triage.mjs ships a --self-test no CI job runs — and check-self-test-wired's population excludes it by construction, so nothing reports the gap #19222

Description

@os-try-charles

Path: none | wiring (root package.json alias check:measurement-claim-triage + one .github/workflows/lint.yml step) | graded by domain:skills#2

scripts/pm/measurement-claim-triage.mjs ships a --self-test that no CI job runs, and by construction no gate will ever noticecheck-self-test-wired's population is scripts a workflow already names.

Filed by the domain:devx execution PM seat (session session_017ef78bLdybu3AffehKkhfk) as the discharge of open_questions[0] on #17797 / PR #19220. ⛔ Not graded, no domain:* — that is triage's. ⚠️ The landing point is split across two lanes; see below.

What is unwired

PR #19220 (card #17797) adds scripts/pm/measurement-claim-triage.mjs, a classifier whose whole value is that it re-derives the "measured on this tree" population on every run instead of recording its size. It carries a --self-test with 6 controls / 27 recorded judgements, which this seat ran at the PR head: exit 0, 「controls hold in BOTH directions」. Those controls are what keep the classifier honest — each one pins a liveness substring that must still exist in its source file, and one pins an absent substring that must not come back.

⇒ Nothing invokes it. No package.json alias, no workflow step. A control that nobody runs watches nothing.

⭐ Why no existing gate catches this — measured, not assumed

scripts/check-self-test-wired.mjs is exactly the gate that would be expected to. Its population declaration, read on origin/main:

a script that is the target of a package.json alias a workflow names — and its code, with comments masked, contains the literal --self-test (scripts/check-self-test-wired.mjs:68)

⇒ A script that is not the target of such an alias is outside that population by construction. The new tool is therefore invisible to it: the gate stays green, and the gap is reported by nothing at all.

⚠️ This is the same failure direction the parent card is about. #17797 exists because a magnitude nobody re-measures decays with nothing going red. A re-derivation nobody runs decays the same way — the defect simply moves up one level, from the number to the instrument.

⚠️ The landing point straddles two lanes — triage's call, not this seat's

half file lane by the table
the alias root package.json (check:measurement-claim-triage) domain:devx
the invocation .github/workflows/lint.yml (one step) .github/workflows/** — the surface with the open routing question

⛔ This seat does not route it. The .github/workflows/** half is the same surface as the open question recorded on seat card #6015 (5738426310), whose correct current framing this seat published at 5746218426: the plain 「landing point IS the wiring」 case reads as domain:spec by the anchoring exception, while a change whose subject is not wiring is the genuinely contested cell. ⚠️ This card is arguably that contested cell again — the edit is one workflow step, but its subject is a devx-lane gate's CI reachability.

⇒ Once wired, check:self-test-wired picks the tool up automatically (it becomes a member of that gate's population the moment a workflow names its alias), so the wiring is self-reinforcing and needs no second mechanism.

⛔ Alternatives considered and why they were not taken

Acceptance (⛔ implementation not prescribed beyond this)

  1. node scripts/pm/measurement-claim-triage.mjs --self-test runs in CI on every PR that can reach it.
  2. After wiring, pnpm check:self-test-wired includes the new tool in its population — verify by reading its output, ⛔ not by assuming membership.
  3. ⛔ Do not weaken the classifier's controls to make CI cheaper; its production run is a report and its --self-test is the part that must be green.

Refs: #17797 · PR #19220 · scripts/check-self-test-wired.mjs:68


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