Found while resolving the merge conflict on PR #9826 (issue #9763). Not fixed there — that PR is a reviewed conflict resolution and its ruling 4 forbids re-scoping. Recording only.
The stale clause
scripts/check-cross-package-test-inputs.mjs, in the @objectstack/spec entry, justifying the packages/cli/src/commands/serve.ts glob:
// `serve.ts` is named in a comment rather than read, the same shape as// `check-nul-bytes.mjs` / `sync-template-versions.mjs` / the realtime// protocol page below, and settled the same way: the literal collector// takes quoted paths without parsing, so a mention forces a declaration,
sync-template-versions.mjs is not that shape any more. packages/create-objectstack/src/template-version-stamps.test.ts:47 really reads it:
constSYNC_SCRIPT=path.join(repoRoot,'scripts','sync-template-versions.mjs');
and since #9763 the collector reconstructs split-segment join/resolve paths, so that read is what holds the radius. The create-objectstack entry in the same file now says so in as many words — "What FORCES the glob is now the read itself … The mentions are ordinary prose again — free to reword." Two entries in one file, disagreeing about the same path.
Why it is worth a card rather than a shrug
This is the second instance of the identical clause. #9651 retired it from the create-objectstack entry for exactly this reason ("still calls sync-template-versions.mjs 'named in a comment rather than read', which stopped being true"). It came back because #9782 wrote a fresh rationale in a different entry that reached for sync-template-versions.mjs as its canonical example of the mention shape — correct when written against main, false once #9763 landed.
The cost is not cosmetic: the clause tells the next author that rewording those mentions would unforce a live radius. That was true before #9763 and is the reason the clause exists; it is now advice against a hazard that has been fixed, attached to a path that no longer has it.
Bounded, and stated
No gate is wrong — serve.ts genuinely is mention-held, so the @objectstack/spec declaration it justifies is correct and load-bearing (ablated on the PR #9826 merge head: removing it fails the gate, naming packages/spec/scripts/publish-smoke-port-collision.test.ts). Only the cross-reference inside the rationale is stale. Same for the sibling clause in the create-objectstack entry, which PR #9826's conflict resolution had to author and therefore corrected in place — that one is already handled; this card is about the @objectstack/spec copy that git auto-merged untouched.
Shape of a fix
Delete the stale half of the cross-reference, keeping the example that is still true:
// `serve.ts` is named in a comment rather than read, the same shape as
- // `check-nul-bytes.mjs` / `sync-template-versions.mjs` / the realtime- // protocol page below, and settled the same way: the literal collector+ // `check-nul-bytes.mjs` / the realtime protocol page below, and settled+ // the same way: the literal collector
check-nul-bytes.mjs is still correct — the file's own @objectstack/cli rationale calls it "the one entry no test READS" — and so is the realtime-protocol.mdx reference, which #9651's dev deliberately left alone for the same reason.
Worth considering alongside the recurrence itself: a rationale that names another entry's path as an example goes stale whenever that path's status changes, and nothing mechanical notices. #9651 and this card are the same failure twice in eight days.
Generated by Claude Code
Found while resolving the merge conflict on PR #9826 (issue #9763). Not fixed there — that PR is a reviewed conflict resolution and its ruling 4 forbids re-scoping. Recording only.
The stale clause
scripts/check-cross-package-test-inputs.mjs, in the@objectstack/specentry, justifying thepackages/cli/src/commands/serve.tsglob:sync-template-versions.mjsis not that shape any more.packages/create-objectstack/src/template-version-stamps.test.ts:47really reads it:and since #9763 the collector reconstructs split-segment
join/resolvepaths, so that read is what holds the radius. Thecreate-objectstackentry in the same file now says so in as many words — "What FORCES the glob is now the read itself … The mentions are ordinary prose again — free to reword." Two entries in one file, disagreeing about the same path.Why it is worth a card rather than a shrug
This is the second instance of the identical clause. #9651 retired it from the
create-objectstackentry for exactly this reason ("still calls sync-template-versions.mjs 'named in a comment rather than read', which stopped being true"). It came back because #9782 wrote a fresh rationale in a different entry that reached forsync-template-versions.mjsas its canonical example of the mention shape — correct when written againstmain, false once #9763 landed.The cost is not cosmetic: the clause tells the next author that rewording those mentions would unforce a live radius. That was true before #9763 and is the reason the clause exists; it is now advice against a hazard that has been fixed, attached to a path that no longer has it.
Bounded, and stated
No gate is wrong —
serve.tsgenuinely is mention-held, so the@objectstack/specdeclaration it justifies is correct and load-bearing (ablated on the PR #9826 merge head: removing it fails the gate, namingpackages/spec/scripts/publish-smoke-port-collision.test.ts). Only the cross-reference inside the rationale is stale. Same for the sibling clause in thecreate-objectstackentry, which PR #9826's conflict resolution had to author and therefore corrected in place — that one is already handled; this card is about the@objectstack/speccopy that git auto-merged untouched.Shape of a fix
Delete the stale half of the cross-reference, keeping the example that is still true:
check-nul-bytes.mjsis still correct — the file's own@objectstack/clirationale calls it "the one entry no test READS" — and so is therealtime-protocol.mdxreference, which #9651's dev deliberately left alone for the same reason.Worth considering alongside the recurrence itself: a rationale that names another entry's path as an example goes stale whenever that path's status changes, and nothing mechanical notices. #9651 and this card are the same failure twice in eight days.
Generated by Claude Code