Skip to content

test(spec): enrol the no-value negated-operator and $exists rows in FILTER_LOGIC_CASES, refresh the stale dated cells - #13595

Merged
os-warren merged 3 commits into
mainfrom
claude/issue-13540-filter-conformance-enrol
Aug 31, 2026
Merged

test(spec): enrol the no-value negated-operator and $exists rows in FILTER_LOGIC_CASES, refresh the stale dated cells#13595
os-warren merged 3 commits into
mainfrom
claude/issue-13540-filter-conformance-enrol

Conversation

@os-warren

Copy link
Copy Markdown
Collaborator

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

CommitCardWhat it delivers
0b63d05c#13540 halfEnrols $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, 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 $notContains row emits (translateFilter compiles 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#13531 halfRefreshes the three FALSE $exists cells — driver-memory live mingo path, driver-memory analytics face, driver-mongodb translateFilter — to "no — has-value since PR #13529", dated form kept; the table header records the full re-take on b997272 with 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 $exists in 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.
e7dd7c67familyOne changeset: @objectstack/spec patch — 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 $exists divergence and the $notContains type-test divergence lived on. The key-absent reading (where $nin diverged) has no spelling in the shared fixture: it is only distinguishable on the document faces, and it stays pinned per face in memory-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 $nin with a [null] member cell

PR #13356 disclosed that the reference matcher's answer for a $nin list containing null, 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 head e7dd7c67. 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.
  • Every suite that drives the table ran at 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).
  • 47 locally-derived gate families ran, all green except two self-declared NOT MEASURED prerequisites (check-test-completeness wants a saved turbo test log; check-half-states wants a live GitHub credential). The convention-triggered six for a test-file edit — engine-double-contract, where-matcher, cross-package-test-inputs, query-options-erasure, type-check-coverage, type-check-debt (after the full closure build) — all green.
  • spec check:generated: all 14 artifacts up to date. spec and driver-mongodb typecheck green — 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, narrowed with evidence: this repo's one config enables no type-aware linting for any file (stated, with a measured positive control, in eslint.config.mjs near 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-review goes 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

…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
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

1 anchor(s) derived from 1 changed package(s); no hand-written page names any of them, so this run has nothing to listnot 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
  • 3 name(s) were too generic to anchor anything (single lowercase words)
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.

Coarse fallback — 126 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json 3d0897459577835a78fc96a8f718eb3b139708a3packageMentionDocs.

Which tree this was computed on

This run read content/docs from f1eeb3789821cc289ae58561c32a3598a938d89c — the merge of head e7dd7c67a52761fc1be76371d92867cd73a78c9c into base 3d0897459577835a78fc96a8f718eb3b139708a3, which is what actions/checkout gives a pull_request run. Not the PR head.

A worktree cut from an older main holds a different content/docs, so re-deriving there can legitimately return a different list — that is a different tree, not a wrong row. To answer on the same tree:

# 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

⚠️ That checkout carried uncommitted changes, so the commit above does not fully identify what was read.

@os-warrenClaude

Copy link
Copy Markdown
CollaboratorAuthor

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 needs:contract-review park). Not a self-release: the dispatching seat acts on the maintainer's word, citing it here. Pre-release verification: all 39 check runs on head e7dd7c67 completed success/skipped (zero red — the every-check bar, not the required subset); PM checklist review of record: ACCEPT on #13540 (comment 5473090104), run at claude-fable-5; dispatch tier was claude-fable-5 (not below CONTRACT_REVIEW_TIER); no governed surface in the diff. Stripping needs:contract-review from both carriers, flipping ready, arming the queue. — session_01PBjwYLS6BciTQW3c9xQiD2


Generated by Claude Code

@os-warren
os-warren marked this pull request as ready for review August 31, 2026 04:07
@os-warren
os-warren enabled auto-merge August 31, 2026 04:07
@os-warren
os-warren added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit 03bf7b1Aug 31, 2026
44 checks passed
@os-warren
os-warren deleted the claude/issue-13540-filter-conformance-enrol branch August 31, 2026 04:31
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationprotocol:datateststooling

Projects

None yet

2 participants

@os-warren@claude