Repository navigation
docs(driver-memory): re-anchor the dead tracker citations to the commits that decided them (stage 5 of #20595) - #21375
Conversation
…its that decided them (stage 5 of #20595) Every comment or docblock site in packages/drivers/driver-memory that cited a tracker number answering 404 now cites the commit in this repository that decided it (ruling C+D, form C): 104 sites on 103 lines in 27 files, 13 numbers. Comment prose only; every file keeps its line count. Claude-Session: https://claude.ai/code/session_017xfMoEjKUuSh2xYB8sCozp Co-authored-by: Claude <noreply@anthropic.com>
The rewritten docblocks reach the published dist (index.d.ts / index.d.mts and the JS output), so the package owes a patch changeset. Claude-Session: https://claude.ai/code/session_017xfMoEjKUuSh2xYB8sCozp Co-authored-by: Claude <noreply@anthropic.com>
…ations Claude-Session: https://claude.ai/code/session_017xfMoEjKUuSh2xYB8sCozp Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift CheckThis PR changes 1 package(s): 25 hand-written doc(s) name something this change touched — list omitted above 15 rows. Re-derive on the tree named below: ⛔ 10 release-owned page(s) also affected — read-only, see AGENTS.md Documentation Guardrails. What this run could not see
Coarse fallback — 10 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 86f6f7bde684c227c2dabf87d73c3b554f3f5a79 && git checkout 86f6f7bde684c227c2dabf87d73c3b554f3f5a79
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 3937ad2f327450c0ce4d4ded30acae815ef98810 381dddc9c67d3d551107674bc471bda703b00719 && git checkout -B drift-repro 3937ad2f327450c0ce4d4ded30acae815ef98810 && git merge --no-ff 381dddc9c67d3d551107674bc471bda703b00719
node scripts/docs-audit/affected-docs.mjs --json 3937ad2f327450c0ce4d4ded30acae815ef98810
|
Part of #20595
Clause-②: no
What changed
Stage 5 of the
domain:enginelane of the dead-citation sweep:packages/drivers/driver-memory/**, comment and docblock prose only, per the claim (5947712781). Stages 1 to 4 landed asa7d9768ec,d150c3039,4bf4e7e70and13a24ece2; #20595 stays open for the next stage.Every comment or docblock site in the package that cited a tracker number answering 404 is rewritten in ruling C+D's form C (record
5749154545on #19123): the ADR when one records the decision, otherwise the commit in this repository's history that made it. That is 104 sites on 103 lines in 27 files, covering 13 numbers:src/): the wholeallocated-but-absentpopulation of the gate's own census in this package at the base;objectstack.config.ts:19(Three plugin-manifest blocks —capabilities,configuration,extensions— have zero reads of the container itself, so all 8 keys beneath them are inert (configuration.properties.secretpromises encryption/masking) #11332) and:26(Retire the nine dead members of the plugin-manifestcontributesblock (events/menus/themes/translations/actions/drivers/fieldTypes/functions/commands) — tombstone route,kindssurvives #10724), andtsconfig.typecheck.json:11(Three plugin-manifest blocks —capabilities,configuration,extensions— have zero reads of the container itself, so all 8 keys beneath them are inert (configuration.properties.secretpromises encryption/masking) #11332 and Retire the nine dead members of the plugin-manifestcontributesblock (events/menus/themes/translations/actions/drivers/fieldTypes/functions/commands) — tombstone route,kindssurvives #10724 on one//line);src, 2 it reads as dead elsewhere in the repository ([finding][drivers] 五个驱动的find/count/…仍声明query: QueryAST,而调用方已可省略object—— 双变让它编译,但声明开始说谎 #6075, driver-sql: the $contains MEMBERSHIP spelling on any multi-valued / JSON column is a DATABASE_ERROR 500 on live PostgreSQL (SQLSTATE 42883, operator does not exist: json ~~ text) — it has only ever been executed on SQLite #17590), and 3 it never judges because they stand only in test files (feat(spec): declare the not-found arm on IDataDriver.update() and un-mask driver-memory's published update/upsert types #14434, driver-memory's two filter faces disagree when a SCALAR comparand meets a stored ARRAY value —==joins the array to "a,b" in the matcher (a false positive) while the live mingo path reads membership #16838, driver-memory answers a text operator over a DECLARED temporal column by matching its canonical ISO text — the opposite of #15683's declared-type answer, and the existing pin passes for the wrong reason (a millisecond mismatch) #17348), which the board and a single read each settle.No comment-id citation in the package is dead (see Census).
Anchors: 13 numbers by commit, 0 by ADR, 0 by words alone. 11 numbers reuse the anchor another lane or stage already measured for them; 2 were measured here (#14435, #16838). 13 distinct shas. No ADR or ruling record names any of the 13 for this subject:
git grepoverdocs/adrandscripts/adr-anchorsfinds only ADR-0088's correction row for #10724, which is aboutcontributes.functions, not thecontributes.driversretirement cited here.Only comments changed. Every file keeps its line count (103 lines out, 103 in, plus the changeset), so no line citation into any of them moves. No code token moves (the guard below). No citation number is added: on every changed line, the numbers on the new text are a subset of those on the old, and the diff-scoped gate judged the 7 citations left on changed lines: all 7 resolve.
A
patchchangeset: 20 of the 62 rewritten non-test lines are in the publisheddist(the.d.tskeeps JSDoc on exported members, and esbuild keeps some comments in the JS), anddistis not byte-identical with the base text (see Changeset).H0: the largest remaining
domain:enginepackageThe gate's own
node scripts/check-issue-citations.mjs --census --jsonat base5fd4855a9(the before run below),allocated-but-absentper package over everydomain:enginefamily in.claude/skills/pm-dispatch/SKILL.md's lane table:drivers/driver-memorymetadatacoreplatform-objectsmetadata-coredrivers/driver-tursodrivers/driver-mongodbformulametadata-fsdrivers/driver-sqlite-wasm,plugins/plugin-pinyin-search,objectql,metadata-protocol,drivers/driver-sqldriver-memoryis still the largest (lane total 215), so this stage went ahead.Census:
driver-memory, before and afterInstrument (A1). The gate's own
node scripts/check-issue-citations.mjs --census --json, read-only and unchanged. The count is itsallocated-but-absentfindings underpackages/drivers/driver-memory/.allocated-but-absent5fd4855a9, run 07:54:54Z to 07:58:32Z17f667f86, run 08:13:08Z to 08:17:18ZThe whole-repo drop is 59, and the two finding sets differ by exactly the 59 rows of this package, removed; none was added.
resolves(34,880),resolves-as-pull-request(2,378) andcross-repo-unjudged(1,165) did not move. The card's 62 was taken atf11b5f20a2with the older extractor; the base here reads 59. The head's later commits are the changeset (outside the census surface) and one merge ofmainthat touches no file underpackages/drivers/driver-memory.Supplementary instrument, the whole package. The census reads neither test files nor strings nor files outside
src. A second reading runs the gate's own exportedextractCitations(whole-file and comment-prose projections) over every tracked file in the package (89: 82.ts,package.json,tsconfig.json,tsconfig.typecheck.json,README.md,CHANGELOG.md,LICENSE,objectstack.config.tsamong the.ts), and classifies each citation with the gate'sclassifyCitationagainst one board enumerated by the gate'senumerateBoard(192 pages, frontier #21369, 19,190 records, 07:59:39Z to 08:03:13Z). Every one of the 13 numbers in the population was then read on its own over the issues endpoint (08:04Z): all 13 answer 404, and the lit controls#5286and#12624answer 200.tsconfig.typecheck.json)5fd4855a917f667f86src commenthere is the 59 census sites plus the 2 inobjectstack.config.ts. The drop of 104 citations is exactly the rewritten sites, and the live counts did not move (src comment: 494 resolve, 13 as pull requests, 1 cross-repo; test comment: 504, 20 and 4). A third, raw reading (every#followed by 2 to 6 digits, whatever surrounds it) counts 1,736 before and 1,632 after: a drop of 104.Comment ids. Three distinct comment-id citations stand on 6 sites in this package:
5234868334(1 site),5861435168(2) and5865693155(3). Each was read over the issue-comments endpoint and answers 200 (control5947712781, 200). So no comment id is in the population.Per-number table
srccounts the census sites plus the four outside the census glob;testcounts test-comment sites. Every sha below matches exactly one commit (git rev-parse --disambiguate, count 1) and is an ancestor of the base5fd4855a9(git merge-base --is-ancestor, exit 0 for all 13 shas; the clone is not shallow). The+lines introduce exactly these 13 nine-hex spans and no other. The message or the diff of each one names the number it replaces: 6 in the message and the diff (56c093c4d,0f38ab084,9dac1ae01,be21955ba,e04a0aff2,d367f03d6), 6 in the diff alone (555a89cbd28 added lines,20950404c7,dce5cd4f026,51efbf1164,20032594f8,b90aff81f9), and 1 only in the subject's squash suffix (93940d492, where #14434 was that pull request's own number). Each anchor touchespackages/drivers/driver-memoryitself, excepte04a0aff2, whose two sites name thedriver-sqlfixture it created.git blameat the base puts 67 of the 104 sites on their anchor. The other 37 were written by a different commit that cites the number as another change: for #13197, the declared-index commitb7f645a8aand the atomicity commits34e80993fand4642f4c64; for #13195, the clobber generalisationdf1812050, the reference-matcher retirement8fec76a2b, and two commits from while that card was open (178325bcb,9268aec56, see Wordings to check). In each case the anchor is the commit that made the change the sentence credits to the number.sourcesays whether another lane or stage already used this anchor for this number (reused) or it was measured here (measured).#6075d367f03d6DriverQuery#10724be21955baaaad682dbc, spec)contributesmembers,driversamong them, with driver-memory's manifest corrected in the same change#1106520950404c#11332dce5cd4f0capabilities,configuration,extensions), driver-memory's manifest included#131959dac1ae01$existsmeans HAS A VALUE on the live mingo path, the analytics face andtranslateFilter, with the lowered$existspromoted to its own$andbranch when its key is taken; its changeset records the maintainer's 2026-08-30 ruling#1319756c093c4dunique, refusing a colliding write with the ADR-0112 envelope;updateManychecks every row before mutating any#1443493940d492update/upserttypes (that pull request's squash)#1443520032594ffind(),findOne()andcreate()#16589555a89cbd5904005321on this card)assertCallNotTenantScoped#167290f38ab084syncSchemare-registration, on driver-memory and driver-sql#16838b90aff81f#1734851efbf116#17590e04a0aff2$containson a JSON column as a per-dialect MEMBERSHIP test; it created thedriver-sqlfixture these two sites copyWordings to check
Most rewrites swap a tag in place (
[#N]to[commit SHA],(#N)to(commit SHA),#N's Xtocommit SHA's X,since #Ntosince commit SHA), the form the landed stages use. These say more than the tag:#17348(memory-driver-filter-logic-conformance.test.ts:598): 「the repair is in the driver, and it is driver-memory answers a text operator over a DECLARED temporal column by matching its canonical ISO text — the opposite of #15683's declared-type answer, and the existing pin passes for the wrong reason (a millisecond mismatch) #17348's, filed」 became 「the repair is in the driver, named as owed in commit 51efbf1 and filed」, with:599(「against [裁决] driver-memory / driver-mongodb 投入冻结 —— 维护者 2026-08-05 口径(跨单锚点) #5499's investment freeze.」) untouched.51efbf116wrote this note, and its changeset records 「That divergence is filed as driver-memory answers a text operator over a DECLARED temporal column by matching its canonical ISO text — the opposite of #15683's declared-type answer, and the existing pin passes for the wrong reason (a millisecond mismatch) #17348 and pinned by name」.#13195where it was written while that card was open (memory-matcher-no-value-negated-operators.test.ts:32): the sentence says$exists「is the neighbouring cell」 and 「still read[s] it as key-presence」, and:47already calls that caution history. A bare swap would credit9dac1ae01with a still-open divergence, so it reads 「(the card commit 9dac1ae closed)」. The other site written while that card was open,memory-exists-has-value-faces.test.ts:4, is the file's title from the pin9268aec56took before the fix; the header under it says the file 「is no longer a pin of a divergence」 but was inverted in place, and9dac1ae01is the commit that inverted it, so a tag swap reads true there.memory-driver-document-not.test.ts:239-:241, 「It used to say "… the direction is now driver-memory's reference matcher still answers $notContains / $nin the pre-ruling way on a no-value row — the #5499 freeze that excused it dissolved 2026-08-11, so the divergence is now unexcused and untracked #13166's and $exists still reads KEY-PRESENCE rather than has-value on driver-memory's live mingo path and driver-mongodb — the #5499 freeze that excused it dissolved, #13166 explicitly excludes it, so it is now unexcused AND untracked #13195's to settle."」): the dead number inside the quote became a bracketed editorial substitution, 「[commit 9dac1ae]'s」, so the quote stays recognisable as a quote and says where the edit is. It is the note quoting itself, not a ruling.tenancyblock — its guard only refuses an explicitenabled: true, so memory-driver runs show cross-organization rows a SQL driver refuses #16589 defect)」 became 「(this is the defect commit 555a89c fixed)」 (memory-tenancy-guard.ts:271); 「This is the [finding] The InMemory driver silently ignores the engine's tenant scope for objects that OMIT atenancyblock — its guard only refuses an explicitenabled: true, so memory-driver runs show cross-organization rows a SQL driver refuses #16589 answer」 became 「This is the defect's answer (fixed in commit 555a89c)」 (memory-tenant-scope-refusal.test.ts:139); and in that file's reading table (:29) the cell 「the [finding] The InMemory driver silently ignores the engine's tenant scope for objects that OMIT atenancyblock — its guard only refuses an explicitenabled: true, so memory-driver runs show cross-organization rows a SQL driver refuses #16589 defect」 became 「what commit 555a89c fixed」, which fits the column's 28-character width, so the table stays aligned and no row is added.uniquebut not object-level declaredindexes[]— a composite unique is a real constraint on driver-sql and nothing at all in memory #13239」 became 「commit 56c093c and driver-memory enforces field-leveluniquebut not object-level declaredindexes[]— a composite unique is a real constraint on driver-sql and nothing at all in memory #13239」 (two sites); 「[finding] driver-memory enforces no uniqueness, so an out-of-process duplicate autonumber lands SILENTLY and the write succeeds — the #5499 freeze that deferred the fix dissolved 2026-08-11 #13197 / driver-memory enforces field-leveluniquebut not object-level declaredindexes[]— a composite unique is a real constraint on driver-sql and nothing at all in memory #13239」 became 「commit 56c093c / driver-memory enforces field-leveluniquebut not object-level declaredindexes[]— a composite unique is a real constraint on driver-sql and nothing at all in memory #13239」; 「[[finding] driver-memory enforces no uniqueness, so an out-of-process duplicate autonumber lands SILENTLY and the write succeeds — the #5499 freeze that deferred the fix dissolved 2026-08-11 #13197, driver-memory enforces field-leveluniquebut not object-level declaredindexes[]— a composite unique is a real constraint on driver-sql and nothing at all in memory #13239]」 became 「[commit 56c093c, driver-memory enforces field-leveluniquebut not object-level declaredindexes[]— a composite unique is a real constraint on driver-sql and nothing at all in memory #13239]」 (four sites); 「(Three plugin-manifest blocks —capabilities,configuration,extensions— have zero reads of the container itself, so all 8 keys beneath them are inert (configuration.properties.secretpromises encryption/masking) #11332 / Retire the nine dead members of the plugin-manifestcontributesblock (events/menus/themes/translations/actions/drivers/fieldTypes/functions/commands) — tombstone route,kindssurvives #10724 / docs/spec: PLUGIN_STANDARDS.md §5.1/§5.2/§5.4 把 Hot Reload 与 Plugin Isolation 标为 ✅,但 PluginHotReloadSchema / PluginSandboxingSchema 全仓零 runtime reader(ADR-0049) #4914)」 became 「(commit dce5cd4 / commit be21955 / docs/spec: PLUGIN_STANDARDS.md §5.1/§5.2/§5.4 把 Hot Reload 与 Plugin Isolation 标为 ✅,但 PluginHotReloadSchema / PluginSandboxingSchema 全仓零 runtime reader(ADR-0049) #4914)」, the exact form the eleven-package sweep (aaad682dbc) gave the same sentence inplugin-hono-server.driver-sql's fixture (memory-20874-contains-membership.test.ts:63,:110): 「driver-sql's driver-sql: the $contains MEMBERSHIP spelling on any multi-valued / JSON column is a DATABASE_ERROR 500 on live PostgreSQL (SQLSTATE 42883, operator does not exist: json ~~ text) — it has only ever been executed on SQLite #17590 fixture」 / 「assertions」 became 「driver-sql's commit e04a0af fixture」 / 「assertions」;e04a0aff2createdsql-driver-17590-json-column-membership.test.ts.#13195sites that say 「ruled … 2026-08-30」 keep it (9dac1ae01's changeset and docblocks carry 「the maintainer ruled on 2026-08-30」).eslint.config.mjsdeclares no line-length rule, and a reflow would move neighbouring lines and every line citation into the file).Sites left
describeandittitles, assertion arguments):#131957,#131977,#110652,#168382,#144351,#165891,#167291. Every one of the 7 is in this stage's population, so the table above holds an anchor for each. Non-test strings carry none. Strings are outside this stage's surface.src: the release-ownedCHANGELOG.mdnames dead numbers on 18 sites (11 numbers); left.package.json,tsconfig.json,README.mdandLICENSEcite no dead number.Mechanical guard: no code token moves
The guard (stages 2 to 4's) compares base
5fd4855a9against the working tree over all 27 touched files, with TypeScript 6.0.3 (tsconfig.typecheck.jsonthroughts.parseJsonText, the same two walks):forEachChildwalk. Comments are trivia there, and JSDoc is never visited. A leaf that is not itself a token is re-scanned with trivia skipped.getChildrenwalk, JSDoc nodes skipped. String, template and numeric literals are compared in full on both readings.Results:
memory-driver.ts): 0 files changed (exit 0).tenantFieldOftotenantFieldOfX,memory-unique-constraint.ts): DIFFER on both readings (exit 1).'MEMORY_MULTI_TENANT_UNSUPPORTED'to…X,memory-tenancy-guard.ts): DIFFER on both readings (exit 1).UNIQUE_VIOLATION_STATUS = 409to410,memory-unique-constraint.ts): DIFFER on both readings (exit 1)."rootDir": "."to"./",tsconfig.typecheck.json): DIFFER on both readings (exit 1).Each mutation went through
scripts/ablation-replace.mjs(wrap mode, anchor hit 1 to 0) under a shell trap that restores by absolute path fromHEAD. Each restore was proven equal to itsHEADblob (ac823bf8fa9b,eb0eb11358ea,7b008c1f12b7,eb0eb11358ea,88035b359542), withgit diff HEADempty and a clean tree afterwards.Changeset:
patch(distmeasured)files[]isdist,README.mdandCHANGELOG.md, and the package is not private. The dependency closure and the package were built first (turbo run build --filter='@objectstack/driver-memory^...' --filter=@objectstack/driver-memory, 5 of 5 tasks, VERDICT command-exit 0). Then the package's ownbuild(tsup pluscheck-dts-emitted) ran three times in one script under the shared verify lock (VERDICT command-exit 0), at17f667f86:distfiles hashed. Of the 62 rewritten non-test lines, 20 appear verbatim indist: 11 frommemory-driver.ts, 4 each frommemory-tenancy-guard.tsandmemory-unique-constraint.ts, 1 frommemory-analytics.ts; inindex.d.ts/index.d.mts(16) andindex.js/index.mjs(10).index.d.ts,index.d.mts,index.js,index.mjs), andscripts/ablation-dist-preflight.mjsfinds the base marker 「[driver-memory: a partialsyncSchemare-registration silently flips a platform-global object's UNIQUE partition from global to per-organization — the explicittenancy.enabled: falseopt-out is not sticky here the way it is in driver-sql #16729] One driver's record」 in 2 built files (exit 0).HEADblob,git diff HEADempty, porcelain empty): all 6 files are byte-identical to leg 1, and the preflight's--absentreading exits 0, so the build is deterministic and the difference is the rewrite.So the rewrite ships, and
.changeset/20595-driver-memory-provenance-anchors.mddeclares apatchfor@objectstack/driver-memory, comment text only, with the claim'sClause-②: noline. The later changeset commit and the merge ofmaintouch no file underpackages/drivers/driver-memory.Gates (head
381dddc9c)node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commandsat381dddc9c(28 paths against merge basefbe2debb7, 220 changed lines) derived 62 commands. All 62 ran, each exit code captured before any pipe: 62 exit 0.--ranreports 「62 derived, 62 run, 0 NOT-MEASURED, 0 UNRUN」 (a derived zero) and exits 0.node scripts/check-changeset-fixed.mjs,pnpm check:authz-resolver,pnpm check:error-code-casing,pnpm check:filter-alias-parity,pnpm check:object-def-param-keys,pnpm check:tenant-chokepoint.node scripts/check-issue-citations.mjsexits 0 (「every citation this change adds resolves」, 7 judged across 5 files);pnpm check:issue-citationsexits 0 (self-test, 173 cases, 9 batteries);pnpm check:doc-authoringexits 0 (the sibling-package prose-id baseline holds, no growth);pnpm check:nul-bytesexits 0 (9,669 files, no raw control bytes), and a control-byte grep over the 28 changed files finds none (exit 1).turbo run build --filter='./packages/*' --filter='./packages/*/*' --concurrency=2at381dddc9c, 71 of 71 tasks, VERDICT command-exit 0.381dddc9c:pnpm --filter @objectstack/driver-memory test: 70 test files pass (70), 1,718 tests pass (1,718), exit 0;pnpm --filter @objectstack/driver-memory typecheck(both programs,tsconfig.jsonandtsconfig.typecheck.json) exits 0.tsc --listFilesputs all 70 tracked test files and the 25 changedsrcfiles in thetsconfig.jsonprogram, andobjectstack.config.tsin thetsconfig.typecheck.jsonone..tsfiles plusdist/index.jsas the control: 27 results, 0 errors and 1 warning, the control's ignore notice; none of the 26 is reported ignored.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.tsconfig.typecheck.jsonis not an eslint target (run alone, eslint answers 「File ignored because no matching configuration was supplied」); the token guard covers it. The repo-widepnpm lintis CI's run.Acceptance notes
5fd4855a9and merged withmainonce, atfbe2debb7, before the gates (merge381dddc9c, no conflict, no file underpackages/drivers/driver-memory, and neithercheck-issue-citations.mjsnordispatch-gates.mjs).45ce12a48(the lastdriver-memorychange before this stage) is in the base (merge-base --is-ancestorexit 0; control13a24ece2, exit 0). The net diff againstmainis the 27 rewritten files (+103/−103) and the changeset.memory-exists-has-value-faces.test.ts:264says 「not in the card」 two lines under the tag that named that card, now[commit 9dac1ae01]. It has no number of its own, so it was not touched.Generated by Claude Code