docs(objectql): the last two carriers of the falsified "schema-uniform" premise state what the tree does - #17717
Merged
Conversation
…m" premise state what the tree does `engine.insert`'s per-call `preserveAudit` warning and the docblock of `preserveAuditIgnoredOnInsertWarning` both justified a batch-level union with "the strip is schema-uniform". Maintainer ruling C (#14147) falsified that: the static-`readonly` strip runs INSIDE `engine.insert`, after the `beforeInsert` hooks, and exempts keys a hook itself assigned — armed per ROW (`hookWrittenKeys: rowHookWrittenKeys[i]`), so two rows can lose different sets. The aggregation is unchanged and stays right on the reason the producer already has: a log line has no per-row slot, so the union is the only view one line can represent. Both sites now say that and tell a reader how to read a name — "at least one row lost this field", never "every row did". `rule-validator.ts` contradicted itself: its `hookWrittenKeys` option docs state "Per ROW, never per call" ~240 lines above the sentence that claimed uniformity. The file now gives one answer. Claude-Session: https://claude.ai/code/session_01RuoNSXUbBoWHkNS4AknTrM Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RuoNSXUbBoWHkNS4AknTrM Co-authored-by: Claude <noreply@anthropic.com>
Contributor
📓 Docs Drift Check
What this run could not see
Coarse fallback — 16 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
…ed package Maintainer ruling on the open question: `skip-changeset` is defined as the label for a diff that publishes nothing from any released package, and this diff is one. Measured two independent ways: - `engine.ts` carries an inline `//` comment inside a method body, never emitted to a `.d.ts` under any configuration. - `rule-validator.ts`'s docblock is on `preserveAuditIgnoredOnInsertWarning`, exported from its module but NOT re-exported from `packages/objectql/src/index.ts`, so it never reaches `dist/index.d.ts`. Control: that entry re-exports three other symbols from the same file, so it is selective, not empty. - After a real build, `dist/` greps 0 for both the old and the new text while the positive control (the runtime string literal from the same function) hits 4 files. The prior comment-only changesets are not precedent for "comment-only ⇒ patch": each measured that its corrected TSDoc DOES reach the built `.d.ts`. Same rule, opposite measurement. Claude-Session: https://claude.ai/code/session_01RuoNSXUbBoWHkNS4AknTrM Co-authored-by: Claude <noreply@anthropic.com>
os-musk
marked this pull request as ready for review
September 11, 2026 18:40
os-musk
enabled auto-merge
September 11, 2026 18:40
This was referenced Sep 11, 2026
This was referenced Sep 12, 2026
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 #17291
Clause-②: no
Comment-only, per the claim comment's declaration and the dispatch ruling. The executable token stream is byte-identical on both files (proof below); no predicate, accept set, exported symbol or emitted byte moves.
The deliverable was the re-verification, not the edit
Triage asked for two things before any fix: that both sites still say what the card reports, and that they really are the last two — "if a third turns up, that is the finding, not the fix."
Both confirmed. There is no third. The dispatching seat flagged its own predicate as not independently established: it was the single token
schema-uniform, and a line-oriented grep cannot see a phrase that wraps a newline. So the population was re-derived with an instrument that can:*,//,#,--) dropped, every whitespace run collapsed to one space, with an offset-to-line map so hits still report a real line. A wrapped phrase is visible to this and invisible togrep.schema[-_ ]*uniform(any wrap or spacing), "uniform across rows/batch", "every/all rows drop the same", "same set … row", "identical across/for rows", "row-independent", "does not vary by row", "union is faithful", "the same for every row", "aggregate is faithful".Of those 11: two are these sites; three are the already-corrected prior art (
packages/spec/src/api/protocol.zod.ts,packages/metadata-protocol/src/protocol.ts, and the generatedprotocol.mdxmirror), which show up quoting and refuting the claim rather than carrying it; the rest are different subjects (counter scans, sharing conditions, conversion-notice dedup). The three corrected siblings surfacing is the control that makes the two a reading — the predicate family does reach sites of this exact class.CHANGELOG.mdcarriers were never touched: five files, compiled release history, untouched and still at five after the fix (the count control below).The two sites
packages/objectql/src/engine.ts— the per-CALLpreserveAuditwarning, 60 lines below thehookWrittenKeys: rowHookWrittenKeys[i]call that falsifies it.packages/objectql/src/validation/rule-validator.ts— the docblock ofpreserveAuditIgnoredOnInsertWarning. This is the one that contradicted its own file: bothhookWrittenKeysoption docs above it state the granularity as per ROW, never per call, while this docblock justified a per-call aggregation with uniformity. A reader got two answers and no way to tell which was current. The file now gives one, and says so by pointing at those option docs.Neither is a carrier #17290 (landed
ada286979f, today) missed: that change correctedinsertMany's docblock ~450 lines further down, on a different falsified premise (that a caller holding the input rows could attribute a reported name back to rows). Read first; neither undone nor double-corrected.The aggregation itself is unchanged — the issue explicitly left its shape undecided, and it stays right on the reason the producer already has: a log line has no per-row slot, so the union is the only view one line can represent. Both sites now add the reader guidance the prior art uses: read a name as "at least one row lost this field", never "every row did".
Verification
Comment-only, proven by the executable token stream. A
grep -cfor removed text cannot tell "the claim stands" from "the claim is quoted and refuted", so the repo's own instrument answers instead —scripts/js-comment-mask.mjs(stripComments), comparing base to HEAD with whitespace collapsed:Both control directions fired (trap-guarded, each mutation proven on disk by anchor counts and a blob hash, each restore verified by blob identity against HEAD plus an empty
git diff HEAD):length > 0to> 1)Without A the instrument could be blind; without B it could be trivially sensitive. Both ran; the tree was restored after each.
Population, re-measured after the fix, beside a control that still fires:
Tests and gates, at
b83db02144:pnpm --filter @objectstack/objectql test— 296 files / 4,959 tests passedpnpm --filter @objectstack/objectql typecheck— pass (test layer compiles; 40 files / 234 errors / 65 pinned signatures held in the shrink-only debt ledger, unchanged)pnpm --filter '@objectstack/objectql...' build— pass (dependency closure)scripts/pm/dispatch-gates.mjs, reconciled with--rancarrying exit codes: 52 derived, 51 run green, 1 NOT MEASURED, 0 unrun. (The derivation was 59 while the changeset was present; deleting it dropped exactly the 7 changeset-family gates and added none. Every gate was re-run at5b137ee0a5, not inherited.)NOT MEASURED:
pnpm check:dual-build-cjs-loads— exit 3, PREREQUISITE NOT MET. It reads built output for every package and 55 have nodist/in this worktree; it needs a full-farmpnpm build. ⛔ Recorded as unmeasured, not as a pass. CI builds fresh and runs it there. A comment-only diff cannot move emitted bytes, which the token-stream identity above and the published-surface measurement below both independently show — but neither is that gate's verdict.--eventpayload,check-changeset-no-major.mjstakes the no-pull-request branch and exits 0. Its green here is not evidence on that axis, and is not reported as such.No changeset — this diff publishes nothing
Ruled by the maintainer seat after the measurement below; the first push carried a
patchchangeset and it has been deleted (commit5b137ee0a5).AGENTS.mddefines the label directly:skip-changesetis for a diff that publishes nothing from any released package, and this is one. The label is the maintainer's to apply, not this seat's.Measured three independent ways, all agreeing:
engine.ts— an inline//comment inside a method body, never emitted to a.d.tsunder any configuration.rule-validator.ts— the docblock sits onexport function preserveAuditIgnoredOnInsertWarning, which is exported from its module but is not re-exported from the package entry:packages/objectql/src/index.ts:437re-exports onlyevaluateValidationRules,needsPriorRecordandlegalNextStatesfrom that file. The symbol never reachesdist/index.d.ts. Control: that entry carries 82 export statements and does re-export three siblings from the same file — selective, not empty.dist/greps 0 for the new docblock text and 0 for the oldschema-uniform, while the positive control (the runtime string literal from the same function) hits 4 files anddist/index.d.tscarries 2,364 JSDoc lines, so the instrument would have found the docblock had it published..d.ts. Same rule, opposite measurement. Thefiles[]array is identical across those packages and this one (dist,README.md,CHANGELOG.md), so it was never the discriminator either.⇒
Check Changesetis expected RED until theskip-changesetlabel lands; that is the gate working, not a defect.Acceptance notes
Out of scope, noted and not filed:
preserveAuditIgnoredOnInsertWarninghas no test referencing it anywhere in the tree — only its definition and its single call site. Its docblock records a measurement taken when the ruling landed, but nothing pins that the line fires, or its text. Not filed: not a reproducible defect, not a declared-contract violation, and not a metadata-authoring trap — it is missing coverage, which the acceptance-note channel is for. Successor: any card that changes the create-sidepreserveAuditposture would touch this function and is the natural place to add the pin.CHANGELOG.mdcarriers keep a falsified sentence quotable in compiled release history. Correctly untouchable here — a factual error in a released entry is amended in its own docs-only PR, never as a rider. Noted only so the next reader of aschema-uniformgrep knows those five hits are expected.Generated by Claude Code