docs(scripts): reconcile renderCountsFile's docblock with the merge guidance it emits - #19006
Merged
os-bill merged 1 commit intoSep 18, 2026
Merged
Conversation
…uidance it emits The docblock said `merge=os-regen` was the right resolution for docs/audits/2026-08-tenant-audit-write-call-sites.counts.md, "the same as its strictness-ledger sibling"; the header the same function emits into that file says the opposite. `git check-attr merge` settles it: the sibling reads `os-regen` (lit control, instrument alive), this path reads `unspecified`. The parity claim is gone. What the docblock keeps is what measurement and the emitted header agree on: the file is rewritten whole with no prose to splice, and two branches each adding a write call site produce rows that merge cleanly and a header that merges cleanly and WRONG, so the resolution is always to recompute from the merged tree. Prose only: no behaviour change, no .gitattributes change, and the generator's output is byte-identical across the edit. Claude-Session: https://claude.ai/code/session_01JbZnqu8bt6YqfJsr9vaFb3 Co-authored-by: Claude <noreply@anthropic.com>
os-bill
marked this pull request as ready for review
September 18, 2026 11:45
os-bill
deleted the
claude/issue-18960-counts-file-os-regen-contradiction
branch
September 18, 2026 12:16
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 #18960
Clause-②: no
renderCountsFile()'s docblock saidmerge=os-regenwas "the right resolution" fordocs/audits/2026-08-tenant-audit-write-call-sites.counts.md, "the same as itsstrictness-ledger sibling". The header that the same function emits into that file says
the opposite. One of the two had to be wrong; measurement says the docblock was.
Prose only. No behaviour change, no
.gitattributeschange, no.counts.mdchange.The measurement that decides it
git check-attr merge, run in this worktree with a lit control (the sibling thedocblock itself named) and a dark control (a path that does not exist) — because the
object and the dark control read the same value, so
unspecifiedalone cannot tell a realabsence from a dead instrument. The lit control is what separates them.
Before the edit, at base
2767af8e83:mergedocs/audits/2026-08-tenant-audit-write-call-sites.counts.mdunspecifieddocs/audits/2026-07-unknown-key-strictness-ledger.counts.mdos-regendocs/audits/totally-fabricated-xyz.counts.mdunspecifiedAfter the edit, same three paths, same three values — this PR does not touch attributes.
So the parity claim was false by exactly the comparison it named, and the emitted header
was the accurate side.
The docblock as it now reads
No assertion is left that this counts file is, or ought to be,
merge=os-regen— theparity wording included. The two claims the card named as true and load-bearing are kept,
and both still agree with the emitted header:
says the same thing;
and WRONG, so the correct resolution is always to recompute from the merged tree —
the emitted header says the same thing, and now the docblock names the command it
prescribes.
What replaced the false sentence is a measured statement (no covering entry, so
check-attrreadsunspecified) plus the backstop the emitted header already points at.It deliberately does not restate the emitted header's rationale for the absence —
see the acceptance note below.
What this PR does not touch
.gitattributes— this card is not "add a missingos-regenregistration". Registeringthis path is the wrong action the false sentence was inviting.
out.push(...))..counts.md, and any census verdict,out.pushline, orscripts/check-tenant-audit-census.mjs..counts.mdsiblings ought to merge the same way. The card names that asa separate question and this PR does not answer it.
Verification
node scripts/tenant-audit-census.mjs --writerun before theedit and again after it, both at the same HEAD so the generator's measurement stamp is a
constant. Output byte-identical across the two runs:
4851056362eb1b196acef0dac60dee1cbddc2870for the counts file and084932491a2b68a856880b68086f485ca58aaf3bfortenant-audit-census.mdx, both runs. Theartefacts were then restored to their committed bytes, so this PR's diff is one file.
node scripts/check-tenant-audit-census.mjs --self-test— exit 0 before and after(44 + 24 cases).
node scripts/check-tenant-audit-census.mjs— exit 0 before and after, 225 write callsites certified, 23 prose figures held to the census.
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackagainst the real change set (1 path): 28 commands, all run,all exit 0; reconciled with
--ranrecording each exit code — "28 derived, 28 run,0 NOT-MEASURED, 0 UNRUN", a derived zero.
skip-changeset. Measured per file rather than asserted: every non-privatemanifest in the tree (70) was read and each diff path tested against its
files[].scripts/tenant-audit-census.mjslands on none — it is root-level tooling, and afiles[]entry is package-relative. Positive controls through the same predicate fire:
packages/spec/dist/index.jshits@objectstack/spec files[] "dist"andpackages/cli/dist/cli.jshits@objectstack/cli files[] "dist". Nothing published moves,and the change is a comment.
Acceptance notes
Noted, not filed here — the emitted header's stated reason for the absence looks stale.
The header this function emits says the file is not
merge=os-regenbecause "that driverresolves an artefact's
gen:/check:scripts in@objectstack/speconly, and these areroot-level tooling". Two readings in this tree point the other way:
scripts/git-merge-regen.mjsdocuments at
reconcileScripts()that resolution reads "the owner's manifest, whichever thatis" since #13585 — root included,
manifestFor('.')beingpackage.json— and.gitattributesalready routes root-owned artefacts such as
scripts/platform-object-tenancy-census.jsonanddocs/protocol-upgrade-guide.mdtomerge=os-regen. That is about the reason, not about thefact: the absence itself is measured above and is not in doubt, and whether this path ought to
be registered stays the separate question the card excludes. It is out of scope here — the card
fences the emitted prose as read-only — so this PR states only what it measured and leaves the
rationale to whoever takes that question. Reported to the dispatching seat in the round report.
Out of scope: #18944, a separate card on this same file (the census's engine-door
classification rule); deliberately not combined, per triage.
Generated by Claude Code