Skip to content

docs(ci): record the cited-example discipline the mention-shape rationales rely on - #11444

Merged
os-steve merged 1 commit into
mainfrom
claude/issue-10019-unmarked-merge-regions
Aug 23, 2026
Merged

docs(ci): record the cited-example discipline the mention-shape rationales rely on#11444
os-steve merged 1 commit into
mainfrom
claude/issue-10019-unmarked-merge-regions

Conversation

@claude

@claude claude Bot commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

Part of #10019 — finding 2 only. Finding 1 is answered with a measurement and a
recommendation not to build, reported on the card; nothing here closes it.

Finding 1 — premise reconstructed, mechanism CONFIRMED, tool DECLINED

PR #9826's merge geometry, reconstructed (merge 1e60ca74, parents
c74b2b9aa / 56656aa1aa, unique merge base 9ff11921a, replayed with
git merge-file):

region marker? outcome
create-objectstack rationale + globs MARKED — lines 375–424 corrected by the resolver
@objectstack/spec serve.ts glob + 11-line rationale, line 141 none stale clause survived
turbo.json (changed by BOTH sides) none — 0 conflicts no stages existed to read

Exactly one marked region in the file. The spec clause sat 234 lines
outside
it, and the resolver's edits fall entirely inside lines 372–424 —
the same citation, corrected in the marked copy and untouched in the unmarked
one. The card's falsifier ("if the spec copy was inside a marked region") is
refuted.

Two corrections to the card, both measured:

  1. The "fatal" instance is misattributed. census appears 0 times in
    all four merge stages of check-cross-package-test-inputs.mjs, and all four
    pass node --check. That defect belongs to PR feat(gate): enumerate check:engine-double-contract's pinned population so a lost pin names itself #9712 and a different file
    (check-engine-double-contract.mjs). fix(ci): reconstruct the paths cross-package tests really read, instead of trusting quoted prose #9826's resolver swept for it by name
    and reported duplicate top-level bindings: (none). So the card's "two
    instances in one file, one fatal" is one cosmetic instance plus turbo.json.

  2. The unmarked region DID enter the resolver's view. They tabulated all
    three regions with a marker? column, ran node --check, swept duplicate
    bindings, diffed turbo.json against both parents by key, and filed the
    stale clause as check-cross-package-test-inputs' @objectstack/spec entry cites sync-template-versions.mjs as "named in a comment rather than read" — the same clause #9651 already retired, reintroduced in a second entry #9977 deliberately
    under the PM's ruling not to fix
    inherited text. The clause survived a policy decision, not a detection
    failure.

⇒ A scripts/pm/ helper emitting the unmarked-region list would have reproduced
the table the resolver already wrote by hand, and changed nothing. With
node --check covering the fatal half for free, the residual value is over a
cosmetic half that was already detected. Recommending the card be closed
without building it.

Finding 2 — the specific defect is already discharged; the discipline is not

The card's stale clause was fixed by PR #10018: site :236 no longer cites
sync-template-versions.mjs. Re-derived population on main (the card's
L141/238/327/393 all moved; the file grew 1398 → 2581 lines):

site entry cites as example safe?
236 @objectstack/spec check-nul-bytes.mjs / realtime page yes
349 @objectstack/cli — (defines the trade) n/a
373 @objectstack/cli check-nul-bytes.mjs yes
395 @objectstack/cli check-nul-bytes.mjs yes
549 @objectstack/plugin-auth serve.ts + realtime-protocol.mdx no
606 @objectstack/dogfood check-nul-bytes.mjs yes
692 create-objectstack check-nul-bytes.mjs yes

The card's thesis reproduces exactly — and recurs: five durable sites cite
check-nul-bytes.mjs; the one site reaching elsewhere is the exposed one. Site
549 is a new instance that post-dates the card. Both paths it cites are
declared mention-only in this same file, so both can move exactly as
sync-template-versions.mjs did. Co-location is demonstrably not protection —
the card's original two copies were also in this one file.

This PR records the discipline in the table's own JSDoc and re-points site 549
at the invariant example, matching the @objectstack/dogfood form verbatim.
Per the card, no gate — "structurally unable to change status" is a
judgement.

The card's counter-example claim was checked: template-version-stamps.test.ts:47
still reads path.join(repoRoot, 'scripts', 'sync-template-versions.mjs')
verbatim, and the file loads it at runtime. (:97 has drifted into a doc
comment — itself another cross-reference rotting.)

Verification — union re-run on 079b17ed

cross-package-selftest   exit=0  All 104 self-test cases passed.
cross-package-verify     exit=0  OK: 14 package(s) read outside themselves, all declared,
                                 and turbo.json hashes every declared glob.
entry-guard-selftest     exit=0  ✓ 52 cases pass
entry-guard              exit=0  ✓ 138 scripts/ file(s)
parse-guard-selftest     exit=0  ✓ 46 cases pass
parse-guard              exit=0
nul-bytes-selftest       exit=0  ✓ 75 assertions
nul-bytes                exit=0  scanned 6418 text file(s); no raw ASCII control bytes

Every exit code captured before any pipe (cmd > file 2>&1; ex=$?). Families
derived with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack
against the real change set, not recalled.

Narrowing declared, and measured rather than asserted: check-ci-filter-parity
could not run — it imports yaml and this container has no node_modules
anywhere. It reads the exported CROSS_PACKAGE_TEST_INPUTS, so I proved its
input is untouched instead: the table imported from both revisions is
byte-identical (JSON.stringify 4856 bytes both ways, deep-equal; 14
packages, 89 globs), and all 23 changed lines are comment lines with zero
non-comment changes. Its verdict cannot move. CI runs it regardless.

No changeset: a CI gate script's comments publish nothing.

Generated by Claude Code


Generated by Claude Code

…nales rely on

The "named in a comment rather than read" rationales in this table all reach for
`check-nul-bytes.mjs`, and that is load-bearing rather than habit: no test has a
reason to READ a gate script, so the claim stays true of it for as long as the
sentence exists. The one clause that reached for a different example is the one
that rotted -- `sync-template-versions.mjs` was cited that way until #9763
taught the collector to see the split-segment read template-version-stamps.test.ts
had been making all along, at which point every sentence naming it went false at
once, in copies that had to be retired one at a time.

Records the discipline in the table's own JSDoc, next to the sites it governs,
and applies it to the one live site that still cited status-changeable examples:
@objectstack/plugin-auth cited `serve.ts` and `realtime-protocol.mdx`, both of
which are declared mention-only in this same file and can therefore move exactly
as sync-template-versions.mjs did. Re-pointed at the invariant example, matching
the form the @objectstack/dogfood entry already uses verbatim.

Comment text only; no behaviour changes.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015ahemw8RcTgqtxrj15PEZx
@claude claude Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 23, 2026
@os-steve
os-steve marked this pull request as ready for review August 23, 2026 19:54
@os-steve
os-steve added this pull request to the merge queue Aug 23, 2026
Merged via the queue into main with commit 20cecbb Aug 23, 2026
32 checks passed
@os-steve
os-steve deleted the claude/issue-10019-unmarked-merge-regions branch August 23, 2026 20:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants