test(spec): the transactions tombstone pin discriminates its own subject - #19078
Merged
Merged
Conversation
`packages/spec/src/data/driver.test.ts` pinned the `transactions` retired-key prescription with a regex requiring only that `METHOD PRESENCE` and `beginTransaction` appear somewhere in the thrown message. #18890 rewrote that prescription's opening from "gated on METHOD PRESENCE" to "gated on the DRIVER'S DECLARATION, no longer on METHOD PRESENCE alone" — and the old regex matches BOTH. Reverting the prescription to the now-false sentence kept the test green, so the pin could not fail on the one shape it exists to catch. The title said "points at method presence", which is the old world too. Anchor on the two things #18890 made load-bearing instead: the negation (`no longer on METHOD PRESENCE`) and the predicate that replaced presence (`driverSupportsTransactions`). `beginTransaction` and `Delete the key` stay, so nothing the old pin covered is dropped. Deliberately NOT a ban on the phrase `METHOD PRESENCE`: `schemaSync`'s own "Schema sync is gated on METHOD PRESENCE" sentence in driver.zod.ts is true of the runtime today and is untouched. Test-only. No runtime file, no published surface. Claude-Session: https://claude.ai/code/session_01JbZnqu8bt6YqfJsr9vaFb3 Co-authored-by: Claude <noreply@anthropic.com>
Contributor
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs. What this run could not see
Coarse fallback — 0 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
os-bill
marked this pull request as ready for review
September 18, 2026 16:43
os-bill
deleted the
claude/issue-18996-transactions-pin-discriminates
branch
September 18, 2026 17:12
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #18996
Clause-②: no
What was wrong
packages/spec/src/data/driver.test.tspinned thetransactionsretired-key prescription with a regex that required only thatMETHOD PRESENCEandbeginTransactionappear somewhere in the thrown message:PR #18890 rewrote that prescription's opening from "Transaction use is gated on METHOD PRESENCE —
driver.beginTransaction…" to "Transaction use is gated on the DRIVER'S DECLARATION, no longer on METHOD PRESENCE alone:engine.transaction()asksdriverSupportsTransactions(driver)…". The old regex matches both, so reverting the prescription to the now-false sentence kept this test green: the pin could not fail on the one shape it exists to catch. Its title — "points at method presence" — was in the old world too.The shipped prose is true today; what was missing is the guard that keeps it that way. This is coverage debt, not a contract defect.
What changed
One regex and one title, in one test file. The new anchor is the pair of things #18890 made load-bearing — the negation (
no longer on METHOD PRESENCE) and the predicate that replaced presence (driverSupportsTransactions):beginTransactionandDelete the keystay, so nothing the old pin covered is dropped.The card suggested anchoring on
DECLARATION; both discriminate on the tree measured below, and the negation was chosen because it is the literal contradiction of the false claim — a future sentence cannot say "gated on METHOD PRESENCE" and "no longer on METHOD PRESENCE" at once, whereas a bare mention of a declaration can coexist with a presence-gated claim.⛔ Deliberately not a ban on the phrase.
driver.zod.tscarries a second "gated on METHOD PRESENCE" sentence, forschemaSync, and that one is true of the runtime today. It is untouched, and so isdriver.zod.tsas a whole — this PR's diff is one.test.tsfile.Evidence — the acceptance leg is an ablation, not "the new pin passes"
1. Ablation (decisive).
node scripts/ablation-replace.mjsin WRAP mode overpackages/spec/src/data/driver.zod.ts: the prescription's opening clause was replaced with the verbatim pre-#18890 false sentence, read out of history at5ba2ec3ca4^:packages/spec/src/data/driver.zod.ts:266-267, with the rest of the prescription left intact.1 -> 0, replacement0 -> 1, blob46daf837a26a -> 9268d7835908Tests 1 failed | 57 passed (58), the failing case being the one under repair46daf837a26a, equal to the path's blob at HEAD,git diff HEADemptyTests 58 passed (58)2. Lit control — the defect itself, measured first-hand, on that same false tree. A probe that reads the thrown message and applies both regexes reported:
The OLD pin stays green on a tree whose prescription is false. That is the blindness this card names, reproduced here rather than quoted.
3. Dark control — the trap.
driver.test.ts: 58 passed before, 58 passed after.driver.zod.tsis byte-identical to the base (git hash-object=46daf837a26a…= its blob at0ec81857aa), soschemaSync's true sentence cannot have moved. One honest qualification: thetransactionsUnsupported.*NOT this key restoredassertion lives in the sameit()block, so on the false tree it was NOT MEASURED — vitest aborts a case at its first failed assertion. It is green on the restored tree, inside the 58.Verification
pnpm --filter @objectstack/spec testTest Files 491 passed (491),Tests 14299 passed (14299)pnpm --filter @objectstack/spec typechecktsc --noEmit+check:scripts-typecheck+check:test-typecheck)node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack→ 76 commands; 72 exit 0, 4 exit 3--ranwith exit codes recorded: 76 derived, 72 run, 4 NOT-MEASURED, 0 UNRUNeslint . --no-inline-configexit 0 over 6866 files, 0 errors / 0 warnings, atbada58f3c2The four exit-3 gates each print
PREREQUISITE NOT MET … nothing was measured— they read built output of packages this diff does not touch and need a full monorepo build:check:doc-formula-expressions,check:dual-build-cjs-loads,check:lean-entry-closure,check:type-check-debt. Not findings, not passes. CI builds fresh and runs them.No narrowing is claimed for lint: the population above is the whole repo, run at the final commit of this branch.
Changeset —
skip-changesetmeasured, not assumednpm pack --dry-run --jsoninpackages/specat this commit lists 2039 files. Positive controlsrc/data/driver.zod.tsis present;src/data/driver.test.tsis absent, and zero.test.tsfiles ship at all (files[]publishessrc/**/*.zod.ts, never*.test.ts). Nothing any released package actually ships moves, so this diff publishes nothing.Clause-②: no.Acceptance notes
it.each(RETIRED_BITS)pin in the same block asserts onlyDriverCapabilities.BIT…removed…Delete the key(the bit name interpolated per case). That is weak by design — it pins that each tombstone exists and prescribes, not what any one sentence claims — so it is not a second instance of this defect. Noted, not filed.streaming,queryFilters) anchor on content distinctive to their current sentences, and neither sentence has been rewritten. Noted, not filed.Generated by Claude Code