test(spec): enrol the no-value negated-operator and $exists rows in FILTER_LOGIC_CASES, refresh the stale dated cells - #13595
Conversation
…he stale reference-matcher cell The #13540 half of the two-card family (one PR with the #13531 half; card relations are declared once, in the PR body). - FILTER_LOGIC_CASES gains '$nin returns the rows with no value' and '$notContains returns the rows with no value' (both ['2','3','4'] — the include direction ruled at 5146 -> 5298 option A, unblocked by PR 13356). The shared fixture spells no-value as a stored NULL; the case-block comment states that reading scope and points at the per-face pin suite that carries the key-absent reading. - The reversal-measurement table's driver-memory reference-matcher row is refreshed in the dated form: both operator cells now read MATCH, realigned by PR 13356; the $exists cell is untouched (the neighbouring card's half). - The [null]-comparand axis is deliberately NOT enrolled (13357's axis); stated in the case-block comment. - driver-mongodb's server-free translation harness models $regex (the vocabulary the enrolled $notContains row now produces), the unmodeled-operator pin moves to $mod, and the string-only rule is pinned. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PBjwYLS6BciTQW3c9xQiD2
…n both directions The #13531 half of the two-card family (same PR as the #13540 half; card relations are declared once, in the PR body). - The reversal-measurement table's three FALSE cells — driver-memory live mingo path, driver-memory analytics face, driver-mongodb translateFilter — now read 'no — has-value since PR 13529' in the dated per-cell form; the table header records the full re-take on b997272 with the four candidate rows enrolled. - The stale warning paragraph (including 'a $exists row cannot be enrolled here yet') is rewritten as a closed-gap record: PR 13529 (issue 13195) moved the last three key-presence exits, and the paragraph now names the analytics face as the third divergent exit PR 13420 measured. The DEBT-ledger paragraph is reframed from 'the blocker on that row' to the standing all-green-first granularity rule. - FILTER_LOGIC_CASES gains '$exists true selects exactly the valued rows' (['1','2']) and '$exists false selects exactly the no-value rows' (['3','4']) — BOTH directions, per the ruling that called $exists:false the hardest live harm; stored-null seeding is what makes the rows discriminating, stated in the case-block comment. - The shared-scope sentence in the header now names the full enrolled vocabulary. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PBjwYLS6BciTQW3c9xQiD2
…t family One spec patch entry covering both member commits (grading argued inside the changeset; driver-mongodb's harness edit is test-only, no bump). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PBjwYLS6BciTQW3c9xQiD2
📓 Docs Drift Check1 anchor(s) derived from 1 changed package(s); no hand-written page names any of them, so this run has nothing to list — not a clean bill of health. This check sees only pages that NAME a derived anchor: one that documents this change in prose, or enumerates it in an authoring dialect, names none and stays invisible to it on every run. What this run could not see
Coarse fallback — 126 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin f1eeb3789821cc289ae58561c32a3598a938d89c && git checkout f1eeb3789821cc289ae58561c32a3598a938d89c
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 3d0897459577835a78fc96a8f718eb3b139708a3 e7dd7c67a52761fc1be76371d92867cd73a78c9c && git checkout -B drift-repro 3d0897459577835a78fc96a8f718eb3b139708a3 && git merge --no-ff e7dd7c67a52761fc1be76371d92867cd73a78c9c
node scripts/docs-audit/affected-docs.mjs --json 3d0897459577835a78fc96a8f718eb3b139708a3 |
|
Released by maintainer instruction. Provenance: maintainer, live PM session chat, 2026-08-31 ~04:0xZ, verbatim 「pr 绿了为什么不合并」 — read as a personal release of the green parked contract-face PRs, per the recorded #12606 precedent (「12606 绿了」= personal release lifting the Generated by Claude Code |
Fixes #13540
Fixes #13531
One PR for the two-card family, per triage's serial-correction ruling on #13540 (comment 5470880646): both cards edit the same docblock table in
packages/spec/src/data/filter-logic-conformance.ts, so the two halves land serially on one branch, each as its own commit.Per-member commit map
0b63d05c$nin returns the rows with no valueand$notContains returns the rows with no value(both['2','3','4']— the include direction ruled at #5146, extended by #5298 option A, re-affirmed after the #5299 reversal was costed and withdrawn). Refreshes the stale reference-matcher row of the dated reversal table: both operator cells now read MATCH, realigned by PR #13356, in the dated-measurement form. Also extends driver-mongodb's server-free translation harness to model$regex— the vocabulary the enrolled$notContainsrow emits (translateFiltercompiles it to a per-field negation wrapping an escaped-literal regex); the unmodeled-operator pin moves to$mod, and the string-only rule gets its own discrimination test.577af86e$existscells — driver-memory live mingo path, driver-memory analytics face, driver-mongodbtranslateFilter— to "no — has-value since PR #13529", dated form kept; the table header records the full re-take onb997272with the four candidate rows enrolled. Rewrites the stale warning paragraph (the "cannot be enrolled here yet" blocker is gone) as a closed record that also names the analytics face as the third divergent exit measured in PR #13420. Enrols$existsin BOTH directions: true selects['1','2'], false selects['3','4']— single-direction enrolment is the recorded blind spot, and the false direction is the harm the maintainer's ruling called the hardest live one.e7dd7c67@objectstack/specpatch — grading argued inside the changeset; the driver-mongodb harness edit is test-only, no bump.Reading scope (fixture discipline)
Every harness seeds fixture rows 3-4 with a stored NULL (
d: null), so the enrolled rows hold all backends to the stored-null reading of "no value" — the reading every historical$existsdivergence and the$notContainstype-test divergence lived on. The key-absent reading (where$nindiverged) has no spelling in the shared fixture: it is only distinguishable on the document faces, and it stays pinned per face inmemory-matcher-no-value-negated-operators.test.ts(three operators x both readings). The case-block comment states this scope so the next author knows what the rows do and do not measure.Decision of record: the
$ninwith a[null]member cellPR #13356 disclosed that the reference matcher's answer for a
$ninlist containingnull, on a MISSING key, changed from['1']to['1','3']— a cell the original card never measured. Decision: NOT enrolled here, on two grounds. (a) The[null]-comparand axis belongs to #13357 — triage ruled the three same-family cards not foldable — and no maintainer ruling fixes that cell's cross-surface answer; a conformance row is a ruling ratchet, not a way to mint one. (b) The disclosed cell is on the missing-key reading, which the shared fixture cannot spell today anyway. The deliberate non-enrolment is recorded in the case-block comment. #13357 remains open; #13494 and #13492 are not addressed here.Verification
check-driver-conformance: OK — 50 covered cell(s), 0 in the DEBT ledger, 0 exempt.— quoted from the run at final heade7dd7c67. The covered-cell count is per (driver x case-set) and unchanged by design: no new ledger spelling was invented, and every scored driver passes the new rows.577af86e(tree-identical to the final head for everything the suites read — the only later commit adds the changeset file, which was already on disk during the runs), after a full closure build so the suites read the rebuilt spec dist: spec filter-verdict 52 passed; driver-memory 170 passed across 4 files (live path, analytics face, reference matcher, both no-value pin suites); driver-sql 31 passed with 2 dialect cells unprovisioned locally; driver-sqlite-wasm 30 passed; driver-turso 96 passed (local, remote, null-parity); driver-mongodb translation 39 passed — the real-mongod conformance half is opt-in and skipped without the binary, and per its own header the translation half is the priority proof; formula 29 passed; service-analytics 58 passed (native SQL + read-scope).check:generated: all 14 artifacts up to date. spec and driver-mongodbtypecheckgreen — noting honestly that driver-mongodb's tsconfig excludes test files, so the package typecheck does not measure the edited harness; a tests-included tsc run shows zero diagnostics in the edited file (remaining diagnostics are pre-existing config debt in other test files, the reason the exclude exists).eslint.config.mjsnear line 328), so per-file verdicts are independent and this diff cannot move an untouched file's verdict; the three changed files linted via--format json: 0 errors (the changeset markdown file is outside the lint population).Clause-②: this PR changes the gate-enforced population (content limb) on
packages/spec/src/**(path limb). It opens as draft and stays draft;needs:contract-reviewgoes on the PR and both cards in the same stroke it exists. The review chain owns enqueue.Session: https://claude.ai/code/session_01PBjwYLS6BciTQW3c9xQiD2
Generated by Claude Code
Generated by Claude Code