|
2 | 2 | "$comment": [ |
3 | 3 | "Measured baseline for scripts/check-where-matcher-conformance.mjs (#8494, from #7620).", |
4 | 4 | "", |
5 | | - "Each entry is ONE test file holding in-memory WHERE matcher(s) that answer a combinator", |
6 | | - "query SILENTLY WRONG — they neither handle `$or`/`$and` correctly nor refuse them. The", |
7 | | - "counts are measured by the gate, never asserted by hand; run the gate and it prints the", |
8 | | - "current number for every file it disagrees with.", |
9 | | - "", |
10 | | - "`silent` the matcher answers the combinator battery wrongly without erroring. Every", |
11 | | - " entry here today is failure shape (b) from #8494: an `Object.entries(where)`", |
12 | | - " matcher with NO combinator branch, which reads `$or` as an ordinary field", |
13 | | - " name, compares `row.$or` (undefined) against the array, and drops the row.", |
14 | | - " Dormant, not harmless — the day a test adds an `$or` to one of these, the", |
15 | | - " suite asserts on an empty result set with nothing erroring.", |
| 5 | + "WHAT AN ENTRY IS. One test file holding in-memory WHERE matcher(s) that answer a", |
| 6 | + "combinator query SILENTLY WRONG — they neither handle `$or`/`$and` correctly nor refuse", |
| 7 | + "them. An entry is DEBT, never an exemption: the remedy is the matcher, and the entry is", |
| 8 | + "deleted by the PR that repairs it. The per-file counts are MEASURED by the gate, never", |
| 9 | + "asserted by hand — run the gate and it prints what it measured for every file it", |
| 10 | + "disagrees with.", |
| 11 | + "", |
| 12 | + "`silent` the matcher answers the combinator battery wrongly without erroring. Dormant,", |
| 13 | + " not harmless — the day a test hands one of these an `$or`, the suite asserts", |
| 14 | + " on an empty result set with nothing erroring.", |
16 | 15 | "", |
17 | 16 | "`unjudged` the matcher could not be lifted out of its file and executed, so the gate has", |
18 | 17 | " no verdict on it. Declared rather than skipped: \"could not run\" is a failure,", |
19 | 18 | " not a pass (AGENTS.md, \"Absence must be loud\").", |
20 | 19 | "", |
21 | | - "NOTE what is NOT here: failure shape (a), the `$or` early return that discards sibling", |
22 | | - "keys. That shape has ZERO grandfathered instances on purpose — the five still live on", |
23 | | - "`main` when this gate was built (four in objectql, one in plugin-security, all missed by", |
24 | | - "the three correction lanes) were fixed in the gate's own PR rather than baselined. A", |
25 | | - "ledger that grandfathered the exact defect its gate exists to stop would be worth", |
26 | | - "nothing. Shape (a) is enforced with an EMPTY ledger; shape (b) is the sweep still owed.", |
| 20 | + "HOW MANY entries there are is deliberately not written here, and neither is which failure", |
| 21 | + "shape they carry: both change with every PR that repairs one, and prose asserting either", |
| 22 | + "goes stale unread. This block said \"every entry here today is failure shape (b)\" and", |
| 23 | + "\"shape (b) is the sweep still owed\" for as long as the ledger sat empty after the sweep", |
| 24 | + "finished (#9766). Read the count from `files`; read the shape from the gate's output,", |
| 25 | + "which attributes it per matcher for the report only.", |
| 26 | + "", |
| 27 | + "THE TWO SHAPES ARE STILL THE VOCABULARY (checker header, \"Two failure shapes, one", |
| 28 | + "criterion\"; the self-test pins the attribution of each). Both are graded by the same", |
| 29 | + "behavioural battery and land in the same `silent` count, so an entry may be either and", |
| 30 | + "this file does not record which: (a) EARLY RETURN — a combinator branch that `return`s,", |
| 31 | + "discarding the sibling keys, so the matcher sees `$or` but answers a narrower query;", |
| 32 | + "(b) NO COMBINATOR BRANCH — an `Object.entries(where)` matcher that reads `$or` as an", |
| 33 | + "ordinary field name, compares `row.$or` (undefined) against the array, and drops the row.", |
| 34 | + "", |
| 35 | + "PROVENANCE. Seeded by PR #8581, the gate's own PR: the pre-existing combinator-blind", |
| 36 | + "doubles were grandfathered, while the five LIVE early-return instances that PR found", |
| 37 | + "(four in objectql, one in plugin-security, all missed by the three correction lanes", |
| 38 | + "#7846 / #8493 / #7619) were FIXED there rather than baselined — a ledger that", |
| 39 | + "grandfathered the exact defect its gate exists to stop would be worth nothing. PR #8618,", |
| 40 | + "the #8582 sweep, then cleared the grandfathered set in three batches, ratcheting this", |
| 41 | + "ledger to empty; every repair since deletes its own entry the same way.", |
| 42 | + "", |
| 43 | + "EMPTY IS THE SUCCESS STATE, NOT A DEAD FILE. `files: {}` means nothing is grandfathered:", |
| 44 | + "every matcher the gate discovered answers the battery correctly or refuses it loudly. The", |
| 45 | + "loader asserts nothing about the ledger's size (it reads `baseline.files ?? {}`), so an", |
| 46 | + "empty ledger is a PASSING run, not a corrupted or half-written one.", |
| 47 | + "", |
| 48 | + "⛔ DO NOT DELETE THIS FILE WHEN IT EMPTIES. Measured, not assumed: with the file absent", |
| 49 | + "the gate prints `check-where-matcher-conformance: missing` followed by this path and exits", |
| 50 | + "2 BEFORE it scans anything — a hard refusal, never a clean pass, because an absent ledger", |
| 51 | + "cannot tell settled debt from a new defect. Deleting and later re-adding it also costs the", |
| 52 | + "MONOTONIC invariant for that run: `monotonicity()` reads this same path out of the merge", |
| 53 | + "base with origin/main, and a read that fails leaves the run reporting \"NOT verified: could", |
| 54 | + "not read the baseline at the merge base with main\". The empty file is what keeps the NEXT", |
| 55 | + "silently-wrong double reportable as NEW, instead of arriving with no ledger for it to be", |
| 56 | + "absent from.", |
| 57 | + "", |
| 58 | + "ABSENCE FROM THIS FILE MEANS GRADED AND CONFORMING — never \"unscanned\", and never that", |
| 59 | + "the defect is extinct repo-wide. Membership is decided behaviourally: a candidate that", |
| 60 | + "fails the control probe is dropped OUT_OF_SCOPE, and the known residual is the INVERTED", |
| 61 | + "survivor filter inside a `delete` double — `(r) => !Object.entries(where).every(…)` —", |
| 62 | + "which answers the probe `false`/`true` and so is correctly not a row-SELECTING predicate,", |
| 63 | + "while carrying the no-combinator-branch defect one negation away. Ungraded on purpose", |
| 64 | + "(teaching the probe to read a negation means guessing at intent), pinned as the", |
| 65 | + "`FIXTURE_CAPTURED_NEGATED` self-test fixture so it stays a KNOWN limit, and tracked by", |
| 66 | + "#8662. An empty ledger is a statement about what the gate GRADES, not about what exists.", |
27 | 67 | "", |
28 | 68 | "TWO ways to clear an entry, and the cheap one is usually right:", |
29 | 69 | " 1. make the matcher conjoin `$or`/`$and` with its sibling keys, or", |
|
39 | 79 | "origin/main, because counts alone cannot see a newly-added file matching its own count —", |
40 | 80 | "that would turn this ledger into a general-purpose mute button (the SLOT_LOOKUP_UNSWEPT", |
41 | 81 | "precedent, #4251). There is deliberately no --update flag: a generator would let a new", |
42 | | - "silently-wrong double in by \"just run the update command\"." |
| 82 | + "silently-wrong double in by \"just run the update command\".", |
| 83 | + "", |
| 84 | + "Key is the repo-relative test file path; its value is the measured `silent` / `unjudged`", |
| 85 | + "counts for that file. Run the gate to see exactly what it measured." |
43 | 86 | ], |
44 | 87 | "files": {} |
45 | 88 | } |
0 commit comments