docs(drivers): retire the dissolved #5499 freeze claims at the 15 untriaged group-A sites - #13210
Conversation
…riaged group-A sites The #5499 investment freeze dissolved 2026-08-11 (maintainer lifted it for driver-mongodb, then driver-memory the same day - evidence in the head note of packages/spec/src/data/aggregation-conformance.ts). 24 sites still asserted it in the PRESENT tense outside the packages the earlier sweep opened. This rewrites the 15 that are mechanical: past tense, dated, naming the dissolution, keeping whatever each sentence was actually explaining. Where a sentence used the freeze to EXCUSE a divergence, the excuse is now stated as lapsed and the card that owns the disposition is named rather than a new justification being invented: - memory-driver-document-not.test.ts -> #13166 / #13195 (undecided) - memory-tenancy-guard.ts (Route A) -> #6915 - mongodb-comparand-type-conformance -> untriaged, no card owns it - read-scope-undefined-comparand -> the #6125 debt "owed at thaw" is DUE Deliberately NOT touched (7 sites): the four dated group-C records (memory-pagination-conformance.test.ts:125, mongodb-filter-text-conformance .test.ts:18, tombstone-hydration-download-agreement.test.ts:58, service-storage/vitest.config.ts:47) and the three pins #13166 owns (memory-matcher-not-null-safe.test.ts:148/:174/:188). The generated packages/spec/src/migrations/registry.ts is excluded from the sweep grep. Reported, not rewritten (2 sites): driver-mongodb/src/test-mongod.ts:45 (group-B design rationale) and qa/dogfood/test/read-coercion-conformance .test.ts:11 (retirement mis-attribution). Both need a judgement, not a sweep. Comment and test-title prose only - no behaviour change. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LZbWd2jNV1FErXTPSS4Dry
📓 Docs Drift CheckThis PR changes 3 package(s): 6 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 — 11 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 84670be4f7ff2c7d276a1956428369790c6c063f && git checkout 84670be4f7ff2c7d276a1956428369790c6c063f
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin ce7e497448a49d86469392f6e9992618ee0f18fd 9c1ff95e8c4723fdeab2b89e4ba5f51fdd9881f3 && git checkout -B drift-repro ce7e497448a49d86469392f6e9992618ee0f18fd && git merge --no-ff 9c1ff95e8c4723fdeab2b89e4ba5f51fdd9881f3
node scripts/docs-audit/affected-docs.mjs --json ce7e497448a49d86469392f6e9992618ee0f18fd
|
Both sites were reported rather than rewritten in the first commit because each needed a judgement. The coordinator ruled both; this applies them. test-mongod.ts (group-B design rationale) - option A, restate on the surviving grounds. The retirement had two premises and only one survives: the MEASURED merge-queue hazard (the unsettleable promise, three red builds in one day ejecting unrelated PRs), which is independent of investment posture. The #5499 freeze was the other, and it only ever answered "why not build the infrastructure instead"; it dissolved 2026-08-11. Per the ruling, the new text must NOT silently preserve the prohibition: it now reads as "nobody has built it, and here is the measured reason it was not worth building", says plainly that nothing forbids building it now, and defers the coverage-versus-CI-cost question to a separate card rather than settling it here. read-coercion-conformance.test.ts (retirement mis-attribution) - option A, MATCHED to the landed twin at packages/runtime/src/datasource-autoconnect.test.ts rather than independently worded. The twin KEPT the present progressive, so the tense half of the earlier recommendation is declined: the retirement is ongoing because check:driver-memory-census still enforces it, making "is being retired" accurate rather than stale. Seven clauses now match the twin verbatim, re-anchoring to #5704/#6664 and stating "NOT by #5499: that was an INVESTMENT freeze, a different proposition on the same anchor". The seven deliberately untouched sites remain absent from the branch diff, re-verified mechanically by path; the three #13166 pins are byte-identical to the branch base. Comment prose only - no behaviour change, no ablation, no rebuild claimed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LZbWd2jNV1FErXTPSS4Dry
PM 复核:两条裁定逐条验过,七个禁区机械验证未动,CI 36/36⛔ 全部读的是 head ✅ Q1 ——
|
| 路径 | |
|---|---|
memory-pagination-conformance.test.ts(#6577 局部解冻记录) |
✅ 未动 |
mongodb-filter-text-conformance.test.ts(#6520 一次性特许) |
✅ 未动 |
tombstone-hydration-download-agreement.test.ts |
✅ 未动 |
service-storage/vitest.config.ts |
✅ 未动 |
memory-matcher-not-null-safe.test.ts(#13166 的三处 pin,含 describe 标题) |
✅ 未动 |
packages/spec/src/migrations/registry.ts(生成物) |
✅ 未动 |
热文件 driver-sql/src/sql-driver.ts:git diff --numstat = 2 增 1 删 ⇒ 正是「一行注释变两行」,⛔ 该文件再无其他改动。(本车道无 CI gate 护它,故单独量。)
✅ CI
36/36 完成:33 success + 3 skipped,零失败。 Test Core (1/6) 本轮一次即绿,⛔ 没撞上 #13158。Check Changeset skipped 与 skip-changeset 标签一致。
⭐ 值得记在 PR 上的一件事:一次被拦下的静默关闭
dev 报告其 PR body 初稿引用了 PM 重启闩的字面行,而那行把一个 close 关键字紧挨着 issue 引用。GitHub 在 PR body 里按该形状解析为关闭指令,不问上下文 ⇒ 合并会静默关掉 #5499,也就是这一整族卡挂着的锚点。dev 自行发现、打断邻接、用正则复查全部关闭关键字与 issue 引用的相邻(0 命中)、并在更新后确认锚点仍 open。
⇒ ⛔ 这不是本席要求的检查,是 dev 自己加的。记在这里因为下一个引用闩文本的人会踩同一个坑。
⛔ 落地
保持 draft。本卡(#13194)无条款②,但落地是 PM 的动作,且本席要先把 dev 顺带产出的 #13211(分母重估:那三张卡的 .ts-only grep 按构造看不见 .mjs/.yml/.json)分诊完 —— 已定级 bug·tooling·p1·pm:queue·domain:devx。
Generated by Claude Code
Part of #13194
The #5499 investment freeze dissolved 2026-08-11. Evidence, quoted from the head note of
packages/spec/src/data/aggregation-conformance.ts(the card's own cited source):This PR rewrites 17 of that card's 24 sites and deliberately leaves 7 untouched.
The 15 mechanical group-A sites landed first. The remaining 2 were NOT group-A shaped and were reported rather than rewritten, because each needed a judgement; both have since been ruled by the coordinator and are now applied here (see section 4). The 7 untouched sites are untouched because they are correct as they stand or belong to an undecided card.
1. The denominator, reproduced before anything was changed
Run in a fresh worktree at
33184fd29:48 hits, zero bare-number false positives — matching the card exactly. Confirmed as not-drift at both refs the card names, using the same exclusion:
33184fd29(this branch's base)39d5d8a60(the card's ref)56470d86b(the earlier card's ref)The generated
packages/spec/src/migrations/registry.tsis excluded explicitly by path in every command above, andpnpm --filter @objectstack/spec check:migration-registryconfirms it is still current and unedited (see gates below).One correction to the card, in the FILE count only. The card reports "48 hits / 40 files". The hit count is exact; the file count is 39 after the exclusion, stable across all three refs above. 39 + the 1 excluded generated file = 40, so this is the card's arithmetic and not a measurement that moved. The load-bearing number, 48, reproduces exactly.
The partition closes. The 24 accounted to the earlier card plus this card's 24 = 48, with no remainder.
2. What changed — 17 sites in 14 files
Each rewrite is past tense, dated, names the dissolution and its evidence, and KEEPS whatever the sentence was explaining. No reasoning was deleted.
driver-memory/src/filter-refusal.ts:65driver-memory/src/memory-aggregation-filter-refusal.test.ts:14driver-memory/src/memory-comparand-type-conformance.test.ts:11parseFilterAST) — the reason that actually survivesdriver-memory/src/memory-driver-document-not.test.ts:223driver-memory/src/memory-driver-document-not.test.ts:229(describe title)... — behaviour frozen (#5499)... — divergence pinned, disposition open (#13166/#13195)driver-memory/src/memory-driver.ts:412driver-memory/src/memory-like-pattern.test.ts:13driver-memory/src/memory-tenancy-guard.ts:49driver-memory/src/memory-tenancy-guard.ts:146supports.batchSchemaSyncdriver-mongodb/src/mongodb-comparand-type-conformance.test.ts:20driver-mongodb/src/mongodb-comparand-type-conformance.test.ts:171driver-mongodb/src/mongodb-icontains.test.ts:8driver-sql/src/sql-driver.ts:8524(HOT FILE — see below)plugin-dev/src/dev-plugin-security-enforcement-warning.test.ts:65driver-mongodb/src/test-mongod.ts:45(ruled — see 4a)qa/dogfood/test/read-coercion-conformance.test.ts:11(ruled — see 4b)packages/runtime/src/datasource-autoconnect.test.ts, present progressive KEPTservice-analytics/src/__tests__/read-scope-undefined-comparand.test.ts:51Where a sentence used the freeze to EXCUSE a divergence, the excuse is stated as lapsed and the card that now owns the disposition is NAMED (#13166 / #13195 / #6915 / #6125) rather than a new justification being invented. Where no card owns it (site 11), the PR says exactly that instead of inventing one.
Site 13 named separately, as required
packages/drivers/driver-sql/src/sql-driver.tsis this lane's hot file and NO CI gate protects it. The entire diff to that file is one comment line becoming two, inside the same sentence:Nothing else in the 8,900-line file is touched. Verified with
git diff -- packages/drivers/driver-sql/src/sql-driver.ts(3 lines changed: 1 removed, 2 added).The two describe() titles
Site 5 is a
describe()title, so the false claim was in TEST OUTPUT and not only in a comment. Before renaming, confirmed nothing references it by name — its only occurrence in the repo is its own definition, and there is notestNamePatternanywhere. Verified rendering after the change:The card's OTHER describe() title (
memory-matcher-not-null-safe.test.ts:174) is one of the three sites this PR does not touch — see below.3. The SEVEN sites deliberately NOT touched
Verified absent from the diff by path, mechanically, after the edits:
Four dated group-C records — sweeping them would turn history into a false statement.
driver-memory/src/memory-pagination-conformance.test.ts:125driver-mongodb/src/mongodb-filter-text-conformance.test.ts:18service-storage/src/tombstone-hydration-download-agreement.test.ts:58service-storage/vitest.config.ts:47Three pins owned by #13166, whose disposition is UNDECIDED.
driver-memory/src/memory-matcher-not-null-safe.test.ts:148,:174(a describe title),:188. That card's triage explicitly forbids rewriting this wording ahead of its ruling; touching it would presuppose an outcome nobody has decided. Left byte-for-byte, including the title.Plus the generated file,
packages/spec/src/migrations/registry.ts(5 look-alike hits), excluded by path from every grep above and confirmed untouched and current by its own gate.4. The two that are NOT group-A shaped — reported first, then RULED and applied
Neither was rewritten in the first commit; each was reported with a reading and a proposed wording so a ruling could be applied directly. The coordinator has since ruled both. The readings are kept below because they are the justification for what landed.
4a.
driver-mongodb/src/test-mongod.ts:45— a fourth group-B DESIGN RATIONALEOriginal text:
Reading: the conclusion survives, but one of its two premises is gone, and that changes what the comment LICENSES.
The decision rests on two independent premises. The first is a MEASURED hazard documented in the same comment immediately above (lines 20-41): the download races between workers; the loser's
renamethrows ENOENT inside a fire-and-forget async listener, so the rejection reaches nobody and the enclosing promise never settles — costing the merge queue at least three red builds in one day and ejecting unrelated PRs. None of that depends on investment posture. The second premise is the freeze, whose ONLY job in the sentence was to answer "why not just build the infrastructure instead?" — it justified not SPENDING, not the retirement itself.RULED: option A — restate on the surviving grounds, with one binding constraint: the rewrite must not silently preserve the PROHIBITION. After 2026-08-11 the prohibition has no source, so the text has to land as "nobody has built it, and here is the measured reason it was not worth building", never as "it must not be built".
Applied exactly that way. The new text separates the two premises, keeps the retirement on the measured hazard alone, and closes with:
Whether that infrastructure is now worth building was explicitly NOT settled here; it is a separate card if anyone wants it.
4b.
qa/dogfood/test/read-coercion-conformance.test.ts:11— a second RETIREMENT mis-attributionOriginal text:
Reading: two separable defects, and only the second is freeze staleness.
The first is a plain MIS-ATTRIBUTION, wrong even if the freeze were still live. The parenthetical hangs a RETIREMENT proposition on #5499, but #5499 was an INVESTMENT FREEZE — a decision not to SPEND on the driver, which is a different proposition from a decision to REPLACE it. The retirement is owned by #5704 (already cited correctly in the same sentence) and #6664 (which replaced the prose census with the ledger
check:driver-memory-censusenforces).The second concerns tense. My initial recommendation was to also change "is being replaced" to the past — and that half was DECLINED, correctly.
RULED: option A, matched to the landed twin, NOT the tense repair. The twin at
packages/runtime/src/datasource-autoconnect.test.tshas landed onmainand KEPT the present progressive, because the retirement is ongoing —check:driver-memory-censusis still enforcing it, so the tense is accurate rather than stale. Changing it here would have made this site DIVERGE from its twin, which is the one outcome the "match the twin" instruction existed to prevent.Applied as a close match to the twin's landed sentence rather than a parallel wording. Seven clauses were checked against it mechanically and all seven appear verbatim in both files:
is being retired·by #5704, which migrated the test backends·#6664, which replaced the prose census with the ledger·check:driver-memory-census` enforces·NOT by #5499: that was an INVESTMENT freeze·a different proposition on the same anchor·it was lifted on 2026-08-11 while the retirement carried onThe only addition is this site's own fact,
in favour of sqlite:memory:``, which the twin has no reason to carry. The surrounding "Nothing is lost here — SQLite is the driver that actually stores booleans as integers" reasoning is untouched.5. Verification
All runs below are on the final commit
9c1ff95e8, clean working tree. Every gate was re-run on this head after the two rulings landed — not carried over from the earlier commit.Gate family, re-derived with
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstackon the new head: 14 paths, three-dot, committed 14 / working tree 0 / untracked 0; repo assertion confirmed against this checkout'sorigin. Addingpackages/qa/dogfood/**pulled in five families the first derivation did not name, all run and green:check:driver-memory-censusOK — every declaration is ledgered, every ledger entry is live, and every ruled file states "#6664 census: 2 ruled consumers"spec check:livenessspec-liveness-check.ymltriggers onpackages/qa/dogfood/**state-counts.mdcurrent, 31 rowsspec check:empty-stateall classified (1 closed, 2 open, 4 output, 9 scope)spec check:strictness-ledger437 site(s) measured, 1 authorable strip site(s) leftspec check:variant-docs18 discriminated union(s) — 8 governed, 10 exemptThe 17 families from the first derivation were all re-run on this head and stayed green, including every ratchet:
cross-package-test-inputs,engine-double-contract,where-matcher,query-options-erasure,slot-lookup,driver-conformance,test-source-alias,type-check-coverage,dispatcher-error-vocabulary,published-files,page-declaration-shape,logger-receiver-detach,objectql-double-limit,changeset-gate-self-tests,type-source-resolution,dual-build-cjs-loads, andcheck:type-check-debt— the last reporting--re-measure: OK — 31 ledger entr(ies) re-measured in 264.2s, 1570 raw tsc error(s) total, none above its recorded number.Plus
pnpm --filter @objectstack/spec check:migration-registry->src/migrations/registry.ts is current (135 semantic, 69 retired-key, 71 retired-def), confirming the generated file is still unedited. (Note: there is no root-levelcheck:migration-registryscript; invoking it bare givesERR_PNPM_RECURSIVE_EXEC_FIRST_FAIL / Command not found, which is a wrong script name and NOT a red gate.)pnpm lint— the FULL repo scan (eslint . --no-inline-config), exit 0, zero findings. No narrowing is claimed and none is owed.Tests for every package touched on this branch, after rebuilding the workspace closure (
turbo run build, 70/70 successful). All six green, zero failure lines:@objectstack/driver-memory@objectstack/driver-mongodb@objectstack/driver-sql@objectstack/plugin-dev@objectstack/service-analytics@objectstack/dogfoodSkips are the pre-existing opt-in real-mongod and dialect suites, unchanged by this PR.
typecheckgreen for every touched package that declares the script (tsc --noEmitechoed for each, so not a zero-match silent pass). Both files edited in the ruling commit were confirmed to be INSIDE their package's tsc program withtsc --listFiles:test-mongod.tsis not a*.test.tssodriver-mongodb's exclusion does not reach it, anddogfoodincludestest/**/*with no test exclusion.Stated as NOT MEASURED rather than as a pass:
@objectstack/service-analyticsdeclares NOtypecheckscript, sopnpm typecheckmeasured nothing for it. It is a registered DEBT-ledger entry (10 frozen errors), covered instead bycheck:type-check-debt --re-measure, green above.driver-mongodb'stsconfig.jsonexcludes**/*.test.ts, so itstypecheckdoes not compile the two mongodb test files edited in the first commit (confirmed absent viatsc --listFiles). They are covered by that package's TEST_DEBT ledger entry — whose own note records exactly this exclusion — re-measured green, pluspnpm lintand the vitest run. Both edits there are comment-only.origin/main, and three files the derivation reads (check-type-check-coverage.mjs,cross-package-test-inputs.mjs,check-skill-line-ratchet.mjs) changed across that range. The branch was deliberately not merged withmainto keep the diff to this card's sites, so the local family list is derived from the branch's tree. CI runs the farm against the real merge base and is the authority.No ablation was performed or claimed: this change is comment prose plus one
describe()title, so there is no behaviour to ablate and no rebuild is claimed for one.Control-byte self-scan over all changed files: 0 hits.
Fences re-verified mechanically after the ruling commit, against the branch base rather than only the last commit: all seven untouched sites and the generated
registry.tsare absent from the whole-branch diff by path, andmemory-matcher-not-null-safe.test.ts(the three #13166 pins, itsdescribe()title included) is byte-identical to the base viagit diff --exit-code.6. Changeset
None. This PR changes comment prose and one
describe()title; it publishes nothing and changes no behaviour. It takes theskip-changesetlabel.7. One out-of-scope finding, filed not fixed
Filed as #13211 (unassigned, unlabelled, for triage): the dissolved freeze is asserted in the present tense in a population NO card in this family ever measured. All three cards used
grep -rn 5499 packages --include=*.ts, which by construction cannot see.mjsgate scripts,.ymlworkflows or.jsonledgers. Repo-wide the count is 143; 47 sit inside that denominator and 96 outside it, and setting the CHANGELOGs aside the remainder includesscripts/check-driver-memory-census.mjs(9),scripts/check-driver-conformance.mjs(7),.github/workflows/lint.yml(2) andscripts/pm/check-half-states.mjs(2).Three are sharper than anything in this card: a false sentence printed in
check:driver-memory-census's own GREEN success output on every run; a mirrored pair between that script andlint.ymlwhere a one-sided repair may trip a mirror check; and a PM restart latch whose condition is the literalRestart-when:line naming the anchor as a close-event on issue 5499 (spelled without the#here on purpose, so this PR body does not itself become a close directive) — and issue 5499 is still OPEN, so the latch waits on an event that the 2026-08-11 lift bypassed. That last one is a live machinery condition, not prose.This card's own triage anticipated this and named the response — "本卡把 48 的分母补齐了,理论上不该有第四张。若还有第四张,那说明分母算法本身有问题,⛔ 届时不要再扩范围,回来重估。" — so it is filed as a denominator re-evaluation rather than a fourth sweep, and NOTHING in that population was touched here.
Scope
Nothing outside this card's enumerated sites was changed. No test was skipped, disabled or quarantined, and nothing was added to any baseline or ledger.
Generated by Claude Code
Generated by Claude Code