|
54 | 54 | * ## Three case families that are RULED but not yet enrolled |
55 | 55 | * |
56 | 56 | * All three were ruled by the maintainer and are implemented in some backends. |
57 | | - * None is in the table, because **every one of them is red on at least one |
58 | | - * enrolled backend today**, and a red row here does not enforce a ruling — it |
59 | | - * just turns another lane's unfinished work into this table's failure. Each is |
60 | | - * recorded with what was actually measured, against `main` at `175d789`, so the |
61 | | - * next author does not have to re-measure. Add the rows in the PR that closes |
62 | | - * the gap, not before. |
| 57 | + * None is in the table yet — a red row here does not enforce a ruling, it just |
| 58 | + * turns another lane's unfinished work into this table's failure, and each |
| 59 | + * family still has one blocker standing, named per family below. Family 1 is |
| 60 | + * recorded with what was actually measured against `main` at `175d789`; |
| 61 | + * families 2 and 3 were re-measured at this PR's 2026-08-05 sync against |
| 62 | + * `cdfbee2f0`, so the next author does not have to re-measure. Add the rows in |
| 63 | + * the PR that closes the gap, not before. |
63 | 64 | * |
64 | 65 | * ### 1. Boolean identities of the empty combinators (#5239) |
65 | 66 | * |
|
91 | 92 | * |
92 | 93 | * A row whose column is NULL does not satisfy the negated condition and IS |
93 | 94 | * returned. Landed in `driver-sql` via PR #5296; `driver-memory`, `formula`, |
94 | | - * `driver-sqlite-wasm` and `driver-mongodb` already agreed. `read-scope-sql` |
95 | | - * and `filter-normalizer` still emit a bare `NOT (…)` and return only row 2 |
96 | | - * where the others return rows 2, 3 and 4 — tracked by #5297. |
| 95 | + * `driver-sqlite-wasm` and `driver-mongodb` already agreed; `read-scope-sql` |
| 96 | + * was aligned by #5326 (closing #5297) and `filter-normalizer` by #5335 |
| 97 | + * (closing #5325), so as of the 2026-08-05 sync (`cdfbee2f0`) every surface |
| 98 | + * answers this family the same way — no backend blocker remains. |
97 | 99 | * |
98 | | - * Enrolling this family also needs a fixture change, which is the other reason |
99 | | - * it is not a one-line addition: every column of {@link FILTER_LOGIC_ROWS} is |
100 | | - * non-null by construction, so a NULL-bearing column has to be added here AND |
101 | | - * declared in all seven harnesses that seed it. |
| 100 | + * What still keeps it out of the table is the fixture: every column of |
| 101 | + * {@link FILTER_LOGIC_ROWS} is non-null by construction, so a NULL-bearing |
| 102 | + * column has to be added here AND declared in all seven harnesses that seed |
| 103 | + * it. That is the whole remaining work item, and it is why this family is not |
| 104 | + * a one-line addition. |
102 | 105 | * |
103 | 106 | * ### 3. `{ field: {} }` — a field constrained by zero operators (#5240) |
104 | 107 | * |
105 | | - * Ruled **REJECT** (`INVALID_FILTER`) on all four backends. No backend gates it |
106 | | - * yet — the engine lane's four-backend gate is the next dispatch — and today |
107 | | - * the repo gives four different answers: `formula` and `driver-memory` say |
108 | | - * FALSE, `driver-sql` rejects at top level but says TRUE inside a combinator, |
109 | | - * `read-scope-sql` throws its own fail-closed error, `driver-mongodb` emits an |
110 | | - * exact-match on an empty document. Beyond that, {@link FilterLogicCase} has no |
111 | | - * way to spell "this filter must be REJECTED": `expected` is a row-id list, and |
112 | | - * an empty list means "matched nothing", which is precisely the FALSE answer |
113 | | - * the ruling did NOT take. Enrolling this case needs the table's own shape |
114 | | - * extended first (an `expectRejection` discriminant, or a sibling table) — |
115 | | - * deliberately not invented here. The case lands with the four-backend gate. |
| 108 | + * Ruled **REJECT** (`INVALID_FILTER`), and since gated: #5327 landed the |
| 109 | + * refusal on `driver-sql` (top level AND inside combinators), |
| 110 | + * `driver-sqlite-wasm`, `driver-memory` (both filter surfaces) and `formula`, |
| 111 | + * one wording, `INVALID_FILTER` / 400. As of the 2026-08-05 sync |
| 112 | + * (`cdfbee2f0`) `driver-mongodb` is the one backend still ANSWERING it — an |
| 113 | + * exact-match on an empty document — tracked by #5376. What blocks enrolment |
| 114 | + * is the table's own shape: {@link FilterLogicCase} has no way to spell "this |
| 115 | + * filter must be REJECTED" — `expected` is a row-id list, and an empty list |
| 116 | + * means "matched nothing", which is precisely the FALSE answer the ruling did |
| 117 | + * NOT take. Enrolling this case needs the shape extended first (an |
| 118 | + * `expectRejection` discriminant, or a sibling table) — deliberately not |
| 119 | + * invented here. The case lands with that extension, alongside the |
| 120 | + * schema-side narrowing that stays with the spec lane. |
116 | 121 | */ |
117 | 122 |
|
118 | 123 | import type { FilterCondition } from './filter.zod'; |
|
0 commit comments