docs: comments outside driver-memory name what replaced the retired reference matcher (#20822 group 4) - #21395
Conversation
…eference matcher driver-memory's reference matcher (memory-matcher.ts) was retired by commit 8fec76a. Sentences outside that package that still named it as a live surface now name what carries the semantics today, or say it is retired: driver-memory's query path (normalizeFilterCondition, then mingo), formula's matches-filter.ts, or the driver-memory suites that hold the deleted test files' cells (memory-driver-document-not.test.ts, memory-driver-filter-logic-conformance.test.ts). Historical sentences are unchanged. Comment and docblock prose only. Claude-Session: https://claude.ai/code/session_017xfMoEjKUuSh2xYB8sCozp Co-authored-by: Claude <noreply@anthropic.com>
The table row in spec's filter-logic conformance docblock reaches data/index.d.ts and data/index.d.mts, and both ObjectQLStrategy comments reach service-analytics' JavaScript output (one also its declaration file), so each package takes a patch entry. formula and service-storage changed test files only, and plugin-security's rewritten docblock is not in its dist. Claude-Session: https://claude.ai/code/session_017xfMoEjKUuSh2xYB8sCozp Co-authored-by: Claude <noreply@anthropic.com>
…tired-matcher-pointers
📓 Docs Drift CheckThis PR changes 6 package(s): 1 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:
⛔ 1 release-owned page(s) also name something this change touched. These are read-only:
What this run could not see
Coarse fallback — 143 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 06c1a6e1e17aed8c72dd76246262bd8d27296378 && git checkout 06c1a6e1e17aed8c72dd76246262bd8d27296378
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin ecb6ca0258176466767588a6805363387c5777a6 54c8e70e88fb043f30ee71ab376726a3a7829528 && git checkout -B drift-repro ecb6ca0258176466767588a6805363387c5777a6 && git merge --no-ff 54c8e70e88fb043f30ee71ab376726a3a7829528
node scripts/docs-audit/affected-docs.mjs --json ecb6ca0258176466767588a6805363387c5777a6
|
…tired-matcher-pointers
…r-memory suite that holds the deleted matcher file's cells The docblock pointed at memory-matcher-not-null-safe.test.ts, deleted with driver-memory's reference matcher in commit 8fec76a. It now names memory-driver-document-not.test.ts, which holds those cells on the query path, and keeps the historical note that the suites were run while these cases were written. Comment only. Claude-Session: https://claude.ai/code/session_017xfMoEjKUuSh2xYB8sCozp Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017xfMoEjKUuSh2xYB8sCozp Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017xfMoEjKUuSh2xYB8sCozp Co-authored-by: Claude <noreply@anthropic.com>
…; spec's entry names the new docblocks Measured with three legs at 57d675d: the round's rewritten lines reach spec's filter declaration chunk, data/index.js and the shipped src/**/*.zod.ts, formula's index.js/.mjs and objectql's index and core bundles. driver-mongodb and service-analytics changed source maps only, and driver-turso and plugin-security not at all, so they take no new entry. Claude-Session: https://claude.ai/code/session_017xfMoEjKUuSh2xYB8sCozp Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: Inputs: card #20822, its body and all 44 comments; PR #21395's body (round 0 plus the seat's "Patch round 1" section), its 28-file list, and the net diff against ① Derived judgmentsNo accept set and no public surface moves — right. All 197 changed lines (old and new sides counted) across the 24 touched
Sampled and read in the other packages (more than 12): driver-mongodb
The rewritten sentences, judged against the code at the head:
Sentences that rest on the PR body's stated probes, not re-measured here: the ② Semver level
③ Boundary flagsDoes
Nothing placed on the card's close is open, so The round-1 deviations (1)–(9), from 5952834398: (1) the container restart killed leg B after three builds; its restore trap never ran, but the tree was found clean (18 of 18 round files equal to The excluded The two string literals moved to #21397. Check-runs on Escalated:
Implemented-by: VERDICT: PASS Generated by Claude Code |
Fixes #20822
Clause-②: no
#20822 group 4, the card's last group: the comments and docblocks outside
driver-memorythat still named its retired reference matcher (memory-matcher.ts, retired by commit8fec76a2b) as a live surface. This is the carry group 1's ACCEPT put on the card's last group PR. Claim: the PM'sClaim:comment 5948997842 (branchclaude/issue-20822-retired-matcher-pointers). Cross-lane declarations: spec seat post (5949027331) and services seat post (5949038856).The seat confirms
Fixesat ACCEPT. Hypothesis H1 (the site list is complete outsidedriver-memory) is falsified: 28 more sites outside the claim's file surface still name the matcher as live (25 comments and docblocks, one JSON ledger note, and 2 string literals in code). They are not edited here. They are listed under "Sites outside the claim's surface" below, and the route is the open question in theos-dev-reporton #20822.Base
11905a4f8b;origin/maindb0cf2231bmerged once (mergeff241ad71a, no conflict, no file in this diff). Headff241ad71a. Net diff againstmain: 10 files, +68 / -35. Not governed.What changes
Comment and docblock prose only. A sentence that named the matcher as a live surface now names what carries the semantics today, measured per site, or says the matcher is retired. Historical sentences stay.
filter-logic-conformance.ts:15memory-matcher" rowdriver-memorynormalizeFilterCondition, then mingo", with the retirement in the same row (H3)filter-comparand-shape.ts:127filter-comparand-shape.ts:142and:144objectql-strategy.ts:1687driver-memory's matcher ... pin"{$not: {}}driver-memory's query path (memory-driver-document-not.test.tspins it)objectql-strategy.ts:2055(the unlock read it at:2014)memory-matcher.ts"does" read$regex$regexand then the matcher were retiredfilter-normalizer-not-null-safe.test.ts:50memory-matcher-not-null-safe.test.tsmemory-driver-document-not.test.ts, which holds its cellsobjectql-contains-canonical-operator.test.ts:31,:103-:110,:118,:305memory-matcher.tsdoes", and "driver-memory's$regexarm is deliberate and serves a real producer"$containsis pointed at infilter-refusal.ts.:118and:305are in the same file but not in the unlock's listattachment-read-visibility.test.ts:13memory-matcher.tsandformula'smatches-filter.ts"formula'smatches-filter.ts; the matcher is past tenseattachment-read-visibility.test.ts:326memory-matcher-or-semantics.test.tsmemory-driver-filter-logic-conformance.test.ts, which holds its casesclaim-seed-ownership.ts:91id IN (...)scan attributed tomemory-matcher.ts$in, whichInMemoryDriverhands the list to (measured below)matches-filter-not-null-safe.test.ts:17memory-matcher-not-null-safe.test.tsmemory-driver-document-not.test.tsmatches-filter-not-null-safe.test.ts:120memory-driver-document-not.test.tspins['1']); the matcher answered the opposite until PR #13356 and is retireddocs/design/predicate-compilation-convergence.md:44,:56,:3583711e0b763Read and left as they are, because each is already historical or not a claim about a live matcher: spec
filter-logic-conformance.ts:184,:211(a measurement table dated by its commits),:244,:480;:492namesmemory-matcher-no-value-negated-operators.test.ts, which still exists under that name and holds the live path's cells;:503and:509are string literals in the past tense;filter-comparand-shape.ts:122-:124(the reason for the 2026-08-31 ruling); formulamatches-filter-icontains.test.ts:91("what the reference matcher was moved onto"); the design doc's:510(the D6 decision row) and:570(a commit-table row).Measurements
H3, what
driver-memoryevaluates a filter with today.InMemoryDriver.find,count,updateMany,deleteManyand the others callconvertToMongoQuery(memory-driver.ts:1421). It runsassertFilterConditionShape(filter-refusal.ts), thennormalizeFilterCondition(memory-driver.ts:1600), and hands the result to mingo'sQuery.memory-driver-filter-logic-conformance.test.tsrunsFILTER_LOGIC_CASESthroughInMemoryDriver.find, andcheck:driver-conformanceholds it. So the spec table's in-memory row names the query path.claim-seed-ownership.ts'sid IN (...)sentence.normalizeFieldOperators'$inarm (memory-driver.ts:1862) passes$inthrough. mingo 7.2.4's$inpredicate (operators/_predicates.js) is built once per query and called once per document; each call runsintersection([values, list])(util/_internal.js), which fills a hash map from the whole list. So the sentence's "linear scan of the id list PER ROW" holds, through mingo, and the attribution to the matcher was wrong.Code-token guard (PR #21357's two readings), base
11905a4f8bagainst the working tree at head, TypeScript 6.0.3. Reading 1 is the parser's leaf nodes from aforEachChildwalk, so comments are trivia and JSDoc is never visited; a leaf that is not a token is re-scanned with trivia skipped. Reading 2 is the token stream from agetChildrenwalk, with JSDoc nodes skipped. Identifiers and string, template and numeric literals are compared in full..tsfiles: 26,645 base tokens (reading 2), 0 files with a token change (exit 0).objectql-strategy.ts): 0 files changed (exit 0).filterNodeToConditiontofilterNodeToConditionX,objectql-strategy.ts): DIFFER on both readings (exit 1).FILTER_LOGIC_CASESnamegains anX,filter-logic-conformance.ts): DIFFER on both readings (exit 1).MAX_BULK_PER_ROW_HOOK_ROWS / 2to/ 3,claim-seed-ownership.ts): DIFFER on both readings (exit 1).Each mutation went through
scripts/ablation-replace.mjsin wrap mode (anchor 1 to 0). Each restore was proven: blob equal toHEADandgit diff HEADempty.distreach (H4), three legs plus a determinism leg. The five packages'distfiles were hashed after each build. Every build exited 0 and ran under the shared verify lock.All four legs ran at
3ba971f1b6; the later commits change no file in the five packages.build.HEADblob,git diff HEADempty), then the same five builds.@objectstack/spec's ownbuildagain. It equals leg 3 in all 230 files, so that build path is deterministic.dist@objectstack/specdata/index.d.tsanddata/index.d.mtsdata/index.d.ts/.d.mts, 30 source maps (line offsets), 2 build-input hashespatch@objectstack/service-analyticsindex.js/index.cjs(one also inindex.d.ts/index.d.cts)patch@objectstack/plugin-securityindex.js.mapandindex.mjs.mapdiffer: line offsets, because the docblock grew by two lines; the maps carry nosourcesContent@objectstack/formula@objectstack/service-storage.changeset/20822-retired-matcher-pointers.mdtherefore declarespatchfor@objectstack/specand@objectstack/service-analytics, comment text only, withClause-②: no. Each changeset sentence maps to a diff line: the spec table row atfilter-logic-conformance.ts:15, and the twoObjectQLStrategycomments atobjectql-strategy.ts:1687and:2055.Gates and tests (head
ff241ad71a)node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commandsatff241ad71a(10 paths against merge basedb0cf2231) derived 89 commands. All 89 ran, each exit code captured before any pipe. 87 exited 0 on the first run.check:dual-build-cjs-loadsandcheck:i18nexited 3 (PREREQUISITE NOT MET: unbuilt workspace packages), not a measurement. Both exited 0 after a whole-workspace build (turbo run build --filter=!@objectstack/docs, 72 tasks, VERDICT command-exit 0).--ranreports "89 derived, 89 run, 0 NOT-MEASURED, 0 UNRUN" and exits 0.vitest run --maxWorkers=2:--project local: 598 files, 17,529 passed, 1 todo;--project repo: 48 files, 849 passed;pnpm --filter ... typecheckexits 0 for spec (withcheck:scripts-typecheckandcheck:test-typecheck), formula, service-analytics, service-storage and plugin-security. Formula, service-storage and plugin-security also runcheck:test-typecheck, and service-analytics'tsc --listFilesprogram holds 164 of its__tests__files, both touched ones included.eslint --no-inline-config --format jsonover the 8 touched.tsfiles plusservice-analytics/dist/index.jsas a control gives 9 results, 0 errors and 1 warning: the control's ignore notice. None of the 8 is reported ignored, and each resolves under--print-config.eslint.config.mjsnever enables type-aware linting (its lines 327-328 say so), so a comment edit cannot move the verdict on an untouched file. The repo-widepnpm lintis CI's run.pnpm check:nul-bytesexits 0. A control-byte scan over the 10 changed files finds none.Sites outside the claim's surface (round 0; superseded by patch round 1 below)
Read at base
11905a4f8bwith every spelling:memory-matcher,reference matcher,in-memory matcher,memory matcher,match(), thememory-matcher-*test-file names, and "driver-memory's matcher".driver-memory,CHANGELOG.mdandcontent/docs/releases/**are excluded. Each of these still names the matcher as a live surface:service-analyticsread-scope-not-null-safe.test.ts:43: points at the deletedmemory-matcher-not-null-safe.test.ts. It is on group 1's list and inside the ACCEPT's "service-analytics test docblocks", but not in the unlock's list or the claim.driver-mongodbmongodb-filter.ts:1151("it is the oracle both drivers agree with").driver-tursoremote-transport-boolean-identity.test.ts:43andremote-transport-not-operator.test.ts:40.formulamatches-filter.ts:729(asciiCaseInsensitiveContainsis "the same onedriver-memory's matcher ... call[s]").objectql:having-filter.ts:23,:26and:2064;having-filter.test.ts:8and:60;number-comparand-declared-type-door.ts:46("the memory matcher compares"; which face it means is ambiguous);validation/record-validator.ts:533("five hand-rolled shape tests", one of them the matcher);tsconfig.test.json:22andtest-typecheck-debt.json:3(a JSON string).plugin-security:bootstrap-declared-capabilities.test.ts:39andbootstrap-system-capabilities.test.ts:29;rls-check-stored-form.ts:40, written after the retirement, so it probably means the query path.service-analyticsstrategies/filter-normalizer.ts:450("the in-memory matcher ... already held to" the table).spec:filter.zod.ts:411,:940and:3111(live implementation-status tables),:1198,:1242(the exportedasciiCaseInsensitiveContainsdocblock) and:3142(the$emptytable);filter-text-conformance.ts:342("both then and now");ui/view.zod.ts:605("match()runsassertFilterConditionShape").filter.zod.ts:470, the author-facing refusal for anullordering comparand. Measured on the published schema door:FieldOperatorsSchema.safeParse({ $gt: null })answers "... its reference matcher compares through JS coercion ...", in the present tense.filter-operator-vocabulary.test.ts:86, an assertion message that prescribes editing the reference matcher.The governed
.claude/skills/pm-dispatch/references/compile-surfaces.md:16stays on the seat post's protocol observation, as the ACCEPT placed it. 34 more hits outside the surface are historical (past tense, dated measurements, or string literals in the past tense). Theos-dev-reporton #20822 lists them.Patch round 1 (head
54c8e70e88)Section added by the
domain:engine#1seat, from the dev's patch-round report (5952834398 on #20822).The seat's answer to round 0's open question: A, minus the two string literals (claim amendment 5950842658). The round corrects the 26 comment, docblock and ledger-note sites listed there, under the same rule.
read-scope-not-null-safe.test.ts:43comes first, in its own commit68ca26224f. It is the site inside group 1's ACCEPT carry that the seat's unlock had dropped, so every site that ACCEPT carried is now corrected, andFixes #20822stands.Not edited:
filter.zod.ts:470(the author-facing null-ordering refusal) andfilter-operator-vocabulary.test.ts:86(an assertion message). They are spec: the null-ordering refusal message and a vocabulary assertion message still name driver-memory's reference matcher, retired by 8fec76a2b #21397's (spec lane), so this PR stays comment-only;filter.zod.ts:3106("that driver's matcher", generic staging reasoning with an ambiguous referent);compile-surfaces.md.Commits:
1118eebbcdmergesorigin/main56238d890donce, with no conflict. fix(objectql)!: a string comparand against a boolean field is narrowed to its boolean, or refused 400, at the engine filter door #21372's hunks moved no listed line;68ca26224f,1bf9b24f26,57d675df10, and54c8e70e88(the changeset).The net diff against
mainis 28 files, +152/−81, not governed.Measured per site: each rewritten sentence names what carries the semantics today, or says commit
8fec76a2bretired the matcher. The probes behind the sentences that state a behaviour:filter.zod.ts:411;number-comparand-declared-type-door.ts:46;InMemoryDriver's null-or-missing match for the twoplugin-securitybootstrap tests;asciiCaseInsensitiveContains.Historical sentences are untouched.
Code-token guard (both readings, base = merge base
56238d890, so it covers the whole PR):.tsfiles: 0 files changed;ts.parseJsonText, withtest-typecheck-debt.json's_notemasked: 0 changed. That_noteis the text this round edits by design; anentriesvalue control still DIFFERS under the mask;distreach (three legs; the legs agree byte for byte in 276 of 276 files):dist@objectstack/specfilter.zod.tsandview.zod.tsalso ship as sourcepatch, extended@objectstack/formulapatch, added@objectstack/objectqlpatch, added@objectstack/service-analyticsdriver-mongodb,plugin-securitydriver-tursoTests and typecheck at
54c8e70e88:spec,formula,objectql,driver-turso,driver-mongodb,plugin-securityandservice-analyticsare green.driver-mongodb's real-mongod suites are not measured here: there is nomongod;Acceptance notes
build) are both at the same text. They differ in 14@objectstack/specdeclaration files (api,automation,contracts,marketplace,systemand twonode-executor.zodchunks,.d.ts/.d.mts). Leg 3 equals leg 4 byte for byte, so each path is deterministic and the rewrite's effect was read on legs 2 and 3, which share a path. The difference between the paths is not explained here.mainmoved after the merge. Seven more commits landed afterdb0cf2231b(to69a12a0952when this was written); none touches a file here. The derivation's only stale input among them isscripts/sdui-manifest.record.json. CI judges the merge ref.packages/spec/src/**, non-test. The seat runs it.Generated by Claude Code