docs: correct nine more out-of-package comments that still gated formatOutput's timestamp passes on isSqlite - #16866
Conversation
…tput's timestamp passes on isSqlite WIP checkpoint before the verification laps. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ADLdAs2pVcH17h9tZKWMBg
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ADLdAs2pVcH17h9tZKWMBg
…qlite-comment-drift-sweep
…has landed Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ADLdAs2pVcH17h9tZKWMBg
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ADLdAs2pVcH17h9tZKWMBg
📓 Docs Drift CheckThis PR changes 3 package(s): 2 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 — 34 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 1496ec1ad4e0429badcf7c9d9aaaf3e3a228ffc9 && git checkout 1496ec1ad4e0429badcf7c9d9aaaf3e3a228ffc9
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 8b672726ac0ae8f93e2009d8b53635c7b8d3df71 08f3a9cff0543c2759329b6c400c5c149de111b1 && git checkout -B drift-repro 8b672726ac0ae8f93e2009d8b53635c7b8d3df71 && git merge --no-ff 08f3a9cff0543c2759329b6c400c5c149de111b1
node scripts/docs-audit/affected-docs.mjs --json 8b672726ac0ae8f93e2009d8b53635c7b8d3df71
|
Fixes #16818
Nine out-of-package comments still described
SqlDriver#formatOutput's two timestamppasses as gated on
if (this.isSqlite). They are not. Comments only — zero runtimebehaviour, no exported symbol and no public type changes.
All readings below are pinned to this PR's head
08f3a9cff0.Clause-②: no
What the tree actually says
Measured by walking
formatOutputinpackages/drivers/driver-sql/src/sql-driver.ts,not recalled from the card:
The surviving
if (this.isSqlite)arm covers the JSON codec and the numeric-scalarrepair only, and it closes twenty lines above the first timestamp pass.
The fossil, quoted before rewriting
Three recorded constraints are carried through rather than flattened. Each is quoted from
the tree at
08f3a9cff0.D-F2 —
withPostgresCalendarDayAsTextis still untouched.sql-driver.ts:5372:So "the client hands back a
Date" stays TRUE everywhere it appears; only "nothing foldsit" was false. Every rewrite says which layer it is talking about.
D-F3 — the Invalid
Dateresidue survives.isoFromValidDate,sql-driver.ts:324:with its docblock recording that both live dialects produce that shape from rows already
on disk. No sentence in this diff claims the read door never hands out a
Date; everyrewritten site carries the carve-out explicitly. This is the over-generalisation PR #16619's
own contract review returned a finding against, and it is deliberately not repeated.
B1 — the ruled-B consumer arms stay. Under the B1 ruling those arms are no-ops for the
valid-
Datecase, not conflicts. No arm is retired here; only the prose explaining why eachone exists is corrected. Measured, not assumed — the three helpers this prose documents
contain no tolerant
??fallback and no alias over a mis-spelled key, only per-shapenormalisation of one value:
That is also the card's written re-grade trigger, and it is NOT met: no prose site here
was measured to have caused a defensive coercion of the kind ADR-0053 forbids.
Three-list reconciliation, re-run on current
origin/mainThe card's list was measured at
56ee7aef1d; PR #16817 has landed since, so the census wasre-run rather than inherited. Landing was verified by content — every file of PR #16817
byte-identical to
origin/main— with a comparator proven in both directions in the samerun (PR #16796 still differs on all six of its files).
main; re-read each, none redoneThe three extras are at
sys-metadata-repository.ts:96/:178/:1196anddatabase-loader.ts:42/:118on today's tree — triage's:167/:1182/:41drifted, asthe card warned. Nothing was anchored on a line number; every site was located by reading
the sentence.
The union was not assumed to be the whole set. An independent instrument was built to
test that: it classifies every out-of-package
if (this.isSqlite)occurrence by the tenseof the verb tying it to the gate. Its firing control is that on
origin/mainit must namethe card's eleven and nothing else — it does, name for name, correctly excluding the nine
already-repaired blocks that still contain the token inside a true past-tense sentence.
Sentence-level sweeps beyond the token — on
normalizeSqliteDatetimeOutput,AUDIT_TIMESTAMP_COLUMNS,repairNaiveUtcAuditTimestamp,formatOutput,withPostgresCalendarDayAsText, "as a JSDate", and the SQLite-gated/SQLite-only proseforms — surfaced no further site making this claim. What they did surface is recorded in
the acceptance notes below.
Deferred, declared
packages/metadata-protocol/src/protocol.ts— two sites, at:1641and:1692onorigin/main. Held by open draft PR #16796 (headbbe4590c0e), which was verified bycontent to be un-landed and which does not itself correct them (they survive at
:1719and:1770on its head). Not touched here. Issue #16702 is the card behind that PR; it is notaddressed by this one and stays open.
packages/metadata/src/migrations/migrate-sys-notification-to-event.ts— this one wasdeferred at the start and then un-deferred: PR #16834 landed mid-run and was verified by
content (all four of its files byte-identical to
origin/main, same comparator, same firingcontrol). The site is therefore repaired here, at
:495on the post-#16834 tree — which isexactly the disagreement the dispatch flagged. Both readings were right at their own
commits:
:437before PR #16834,:495after. Issue #16312 is not addressed here andstays open.
Which two were load-bearing
stranded-orphan-inventory.tsdrew a conclusion for a live read door from the falsepremise, and went further: it stated that folding at the driver's read door "would reverse
the deliberate
withPostgresCalendarDayAsTextdecision" — which is what the ADR-0053 D-F1ruling authorised and did. Both halves are corrected.
migrate-sys-notification-to-event.tswrote it as a numbered step in migration reasoning.Its conclusion is TRUE and is kept: that path reads through the raw-SQL seam, so
formatOutputnever runs on it and the dialect divergence genuinely survives there. Onlythe attached reason was wrong, so the step now names the seam instead of a gate.
The same true-half care applies to both
packages/clisites, for the same reason.Evidence
Per-site absence of the removed claim, each with a firing control in the same run — the
exact removed string counted at
HEAD/origin/main(must be 1) and in the worktree (mustbe 0), plus a negative control string that was never in the tree:
Tests and typechecks — real commands, real summary lines:
duplicates.created-at-canonical.test.tsis in theintegrationtier by the package's ownpredicate (it value-imports
@objectstack/driver-sql), so it was run there as well asthrough the unit tier; the partition pin is green, confirming the comment-only edits move
no file between tiers (the predicate reads comment-masked source).
Gates — derived with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack,all run, then reconciled with
--ran. The reconciliation line, verbatim:exit 0. On the first pass 59 exited 0 and two exited 3 — PREREQUISITE NOT MET, which is
NOT MEASURED and not a pass:
check:dual-build-cjs-loads(12 packages had nodist/) andcheck:i18n-coverage(12 of 13 configs could not lint). Both named their build closure, bothclosures were built, and both were re-run to a real verdict:
Every exit code above was captured before any pipe, per those gates' own warning.
Lint was run targeted over the nine touched TypeScript files
(
eslint --no-inline-config --format json): 9 files linted, 0 errors, 0 warnings, exit 0.The repo-wide
pnpm lintsweep is CI's run, not this PR's local obligation.The changeset, decided on a measurement
Route 2 (
skip-changeset) does not apply: the label is for a diff that publishesnothing from any released package, and this one publishes. Measured per package by grepping
each built
dist/for a distinctive phrase from the new prose, each with a firing controlproving the grep works on that
dist/:dist?@objectstack/cliduplicates.ts(source)dist/commands/migrate/duplicates.jsand.d.ts@objectstack/service-storagestranded-orphan-inventory.ts(source)usableCreatedAtJSDoc@objectstack/metadatamigrate-sys-notification-to-event.ts(source)canonicalTimestampTextJSDoc@objectstack/metadata-protocolFiring controls for the three NO rows: the enclosing identifier IS found in the same
dist/(usableCreatedAt,canonicalTimestampText), and an exported declaration's JSDocDOES survive into
dist/index.d.ts— so the absence is comment stripping, not a brokenprobe. Source maps were checked too: no
sourcesContentin any of the four, so no commenttext ships that way either. Same shape and same conclusion PR #16817 reached for its own
packages.
验收备注
Findings from the sentence-level sweep that are outside this card's class and are not
touched here:
.changeset/listdrafts-updated-at-canonical-iso.md:9— a pending, unreleasedchangeset carries the same false sentence verbatim ("
SqlDriver#formatOutputrepairs them... only inside its
if (this.isSqlite)arm"). It will publish into@objectstack/metadata-protocol'sCHANGELOG.mdat the next release. Left alone on theboundary rule that a factual error on a release surface is a dedicated docs-only change,
never a rider — flagged so somebody can decide before the next version cut.
asserting the downstream consequence ("on Postgres and MySQL it materialises as a JS
Date") without naming the gate. Examples read but not touched:sys-metadata-repository.ts:554and:1915,db-queue-adapter.ts:35-52,db-queue-adapter-13993-idempotency-window-materialisation.test.ts:10,migrate-sys-notification-to-event.test.ts:264,temporal-conformance.ts:434. These arepartly true (D-F2 at the client layer, D-F3 at the door) and they document ruled-B arms,
which must not be retired as tidying — so they need a judgement, not a sweep.
stranded-orphan-inventory.test.ts:559names a test "a JSDate(the Postgres/MySQLshape)". Test titles were left alone throughout, matching PR docs(engine): correct seven out-of-package comments that still gate formatOutput's timestamp passes on isSqlite #16817, which renamed none.
Noted, not filed. None of the three is a reproducible defect, a declared-contract
violation, or a metadata-authoring trap.
Generated by Claude Code