The nightly matrix cannot judge memory growth, structurally, and the gate does not say so.
Mechanism
plan.json sets duration = 150s per nightly cell (confirmed in all 48 cells of run 34000115227).
validation/properties/i_mem.go excludes a 5-minute warm-up (slopeWarmup), requires a ≥10-minute span (slopeMinSpan) and ≥60 samples before any verdict.
- A 150-second cell therefore never reaches a verdict, and
I-MEM-1, I-MEM-3, I-MEM-4 land in not_judged.
validation/checker/checker_test.go already codifies this: it asserts those three "must be not judged in a 150 s cell" and that Passed() == 2.
So a nightly ValidateGate: PASS carries no opinion whatsoever on memory growth, while require_properties=true in the gate header makes it look as though the property suite was satisfied.
Confirmation from the two runs
- Nightly 34000115227:
not_judged = [I-MEM-1, I-MEM-3, I-MEM-4] in 48/48 cells. Gate: PASS.
- Soak 34003151551 (1h cells, 3599 samples):
not_judged empty in 48/48 — the oracles judged, and I-MEM-1 promptly failed two cells (2476 and 1470 violations). Gate: FAIL.
The soak found a real residual leak that every nightly on the same code would have passed.
Suggested fix
report.Gate never inspects not_judged. At minimum, print the not-judged set in the gate summary so a reader can see which oracles had no opinion. Better: treat "a predicate was requested by tier but reached no verdict in any cell" as a reportable coverage failure, distinct from a violation — the gate is explicitly an absolute zero-signal gate, and silence is not zero signal.
Related: #297 (9 of 14 predicates uninstrumented in every cell, for a different reason).
The nightly matrix cannot judge memory growth, structurally, and the gate does not say so.
Mechanism
plan.jsonsetsduration = 150sper nightly cell (confirmed in all 48 cells of run 34000115227).validation/properties/i_mem.goexcludes a 5-minute warm-up (slopeWarmup), requires a ≥10-minute span (slopeMinSpan) and ≥60 samples before any verdict.I-MEM-1,I-MEM-3,I-MEM-4land innot_judged.validation/checker/checker_test.goalready codifies this: it asserts those three "must be not judged in a 150 s cell" and thatPassed() == 2.So a nightly
ValidateGate: PASScarries no opinion whatsoever on memory growth, whilerequire_properties=truein the gate header makes it look as though the property suite was satisfied.Confirmation from the two runs
not_judged = [I-MEM-1, I-MEM-3, I-MEM-4]in 48/48 cells. Gate: PASS.not_judgedempty in 48/48 — the oracles judged, andI-MEM-1promptly failed two cells (2476 and 1470 violations). Gate: FAIL.The soak found a real residual leak that every nightly on the same code would have passed.
Suggested fix
report.Gatenever inspectsnot_judged. At minimum, print the not-judged set in the gate summary so a reader can see which oracles had no opinion. Better: treat "a predicate was requested by tier but reached no verdict in any cell" as a reportable coverage failure, distinct from a violation — the gate is explicitly an absolute zero-signal gate, and silence is not zero signal.Related: #297 (9 of 14 predicates uninstrumented in every cell, for a different reason).