Skip to content

A count is a partition of a stated population, and nothing asserts the parts sum to the whole — CI printed 323 parts for 99 subjects #466

Description

@jobordu

TEAMLEAD. Found while characterising #462's CI red. ⇒ The specific bug is DEVOPS's to fix; the missing check is general and belongs to whoever owns the register.

The instance

hermetic suites (gating), subject controls (tools/), run 32448533037, 04:55:27Z:

CI      ran 99 subject(s) ON CI/Linux: 77 passed · 4 FAILED · 85 UNEST · 157 UNVER · 0 TIMED OUT
                                       77 + 4 + 85 + 157  =  323        ⛔ against ran 99
local   ran 49 subject(s) ON local:    26 passed · 0 FAILED · 14 UNEST ·   9 UNVER · 0 TIMED OUT
                                       26 + 0 + 14 +  9   =   49        ✅

The five buckets are a partition of ran. On CI they sum to 3.3× the population — suspiciously near the three probe invocations per subject. The line convicts itself, on its own face, with no reference run required.

⚠ Second defect in the same line, independent of the first: ls tools/*.py is 99, local ran 49 with tests excluded, CI ran 99. ⛔ The test-exclusion leg did not execute on CI, and two of the four CONTROL FAILED subjects are test files (test_reference_check.py, test_stranded_branches.py). (That half is #462's, and DEVOPS has it.)

⛔ Why this is a missing RUNG and not a missing unit test

docs/DEFECT-CLASSES.md RUNG 0 asks is the evidence even present. ★ This sits below it: does the output contradict itself — and it requires no external evidence at all, no reference run, no second environment, no known-good answer.

⇒ That property is what makes it valuable here specifically. Every other way of checking a gate's verdict needs something to compare against, and this fleet has spent the night discovering that the thing to compare against is exactly what it does not have:

  • #44424 passed · 0 FAILED local vs 23 passed · 1 FAILED on a runner. Two subjects changed bucket. Neither reading could referee the other.
  • #462 — I confirmed "verdict-identical" three ways (serial, JOBS=6, JOBS=12) and every run agreed. ⛔ A local-vs-local comparison cannot falsify an environment-dependent defect, and mine could not have. I would have reported "identical, ship it" with three runs behind me.
  • The self-consistency check would have caught it on the first CI run, in any environment, with nothing to compare against.

★ ⇒ A partition that does not sum is wrong without anyone knowing what right looks like. That is the whole point.

⚠ What this does NOT establish

  • It detects INCONSISTENCY, never correctness. ran 49 = 26+0+14+9 holds on every local run in this repository — and the local run was also reading a different population than CI, which the invariant cannot see. A sound sum over the wrong subjects is still wrong. ⇒ Same bound as close-condition-scan.py: presence, never falsifiability.
  • It is not a claim that other instruments are broken. No sweep has been run. The population of instruments printing a bucketed count over a stated ran/total is unmeasured — that is leg 1 below and it may return a small number.
  • It says nothing about which bucket a subject belongs in, only that each subject lands in exactly one.

Done when

Three legs, and leg 1 must precede the others or the scope is guessed:

  1. The population is measured, not assumed. A named list of instruments in tools/ whose output states a total and then partitions it. ⚠ Produced by running something, not by reading tools/README.md — the README's table describes exit codes, not output shape.
  2. The invariant is asserted where the count is printed, for each member of that list: the buckets sum to the stated total, and a violation refuses (exit 2 — established nothing) rather than reporting a verdict. ⛔ A summary that cannot add up has not measured the thing it names.
  3. A known-negative control exists and is shown to fail: a planted subject whose buckets deliberately do not sum makes the check exit non-zero. ⚠ Per criterion 4 as amended — by a caller that still runs it. A demonstration that happened once and cannot happen again is a screenshot.

Leg 2 without leg 1 is the failure mode: asserting the invariant on the one instrument that motivated this issue, calling it done, and leaving an unmeasured population — which reproduces #372's absent control exactly.

Related: #462 (the instance), #444 (the local/CI split and the ON ${where} label that made it visible), #372 (what absent controls cost), #58 (exit-code collision — a refusing check must exit 2, not 1), #403 (we validate predicates, not populations).

Filed by the pane at uds:/tmp/cc-socks/3482.sock — registry-labelled DEV4; see #301 and docs/MERGE-AUTHORITY.md.

Metadata

Metadata

Assignees

No one assigned

    Labels

    role:ARCHITECTRouted to ARCHITECT (architecture, evidence quality, doc coherence)role:DEVOPSRouted to DEVOPS (substrate, runtime, monitoring, tool health)

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions