Repository navigation
docs(sdui): three passages name the PIN as the generator version default, not the record - #18956
Merged
Merged
Conversation
…n default The record-derived `--objectui-version` default is gone from `scripts/gen-sdui-manifest-node.mjs`: with no flag it reads the version the PINNED commit declares, through check 4's own `readPinnedDeclaredVersion` oracle, and REFUSES when that cannot be read. Three passages still described the retired default as current. - `scripts/check-sdui-manifest.mjs` check 4's problem text: the reason clause for the prescription on its next line asserted "The generator REUSES the version already recorded when --objectui-version is not passed". It now names the pin as the source and lists how a disagreeing record still arises, so the flagged prescription below it keeps a true reason. - The same file's header, check 4's own rationale: "`--objectui-version` unset makes it REUSE the version already in the record" — the same retired default, one grep-phrase away from the one above, which is why the card's census missed it. Repaired in place: same file, same defect class, same gate family. - `packages/spec/scripts/check-react-blocks-declaration-parity.ts`: the node producer "enumerates the PUBLISHED @object-ui/* packages at the version named in scripts/sdui-manifest.record.json". That record is the run's OUTPUT today, never where it reads the version from. Prose only. The gate's verdicts do not move: its three non-self-test arms are byte-identical before and after, on both streams, and `--self-test` is byte-identical and green. Claude-Session: https://claude.ai/code/session_01JbZnqu8bt6YqfJsr9vaFb3 Co-authored-by: Claude <noreply@anthropic.com>
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 07:47
os-bill
deleted the
claude/issue-18879-retired-version-default-prose
branch
September 18, 2026 08:53
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 #18879
Clause-②: no
PR #18875 retired the generator's record-derived version default.
scripts/gen-sdui-manifest-node.mjsnow resolves the version in one order —
--objectui-versionwhen passed, otherwise what the PINNEDobjectui commit declares in
packages/core/package.json(throughcheck-sdui-manifest.mjs's ownexported
readPinnedDeclaredVersion) — and REFUSES when neither answers. Three passages stilldescribed the retired default as current. This repairs those three, and leaves four others alone
because they are conditional, not broken.
The card's six sites are not one class, and there is a seventh
I enumerated every site on this tree and classified each. The census phrase the card used
(
gen-sdui-manifest-node, 30 hits tree-wide) plus two wording sweeps (REUSE,already in the record/already recorded/already sitting) is what the enumeration is taken from.Class (a) — literally false today, repaired here:
scripts/check-sdui-manifest.mjscheck 4's problem text (was :318-319)packages/spec/scripts/check-react-blocks-declaration-parity.ts(was :87-88)scripts/check-sdui-manifest.mjsheader, check 4's own rationale (was :43-47) — NOT on thecard's six; see "The seventh site" below
Class (b) — conditional, not broken, deliberately untouched:
scripts/check-sdui-manifest.mjs:228(artefact missing) — flaglessRegenerate:prescriptionscripts/check-sdui-manifest.mjs:275(sha256 mismatch) — flaglessRegenerate:prescriptionscripts/sdui-manifest.record.json:10— flagless prescription; also held by open PR sdui-parser: port inert-quick-add and member-type-mismatch from objectui, re-record the lockstep and bump the pin #18723packages/spec/scripts/manifest-prescription.ts:81— flagless prescription, and its own textalready points the reader at where the exact call is printed
(a) verbatim, before and after
1. check 4's problem text
Before (the false sentence is the REASON CLAUSE for the prescription on the line below it):
After:
Both blocks are real output, captured by driving
checkTreeagainst the fixture shape the script'sown self-test uses (a green tree plus a throwaway objectui whose declared version disagrees with the
record). The prescription line is unchanged.
Why the new sentence is true of today's generator:
gen-sdui-manifest-node.mjs:149-168takes--objectui-versionwhen passed, otherwise callsreadPinnedDeclaredVersion(pin)andfails on anystatus but
resolved; it never readsrecord.objectuiPackagesVersion. Check 4 only runs whenpin === record.objectuiSha(check 3 returns early otherwise), so at this point the record names theLIVE pin and its version field disagrees with what that pin declares. The three routes the new
sentence lists are the ones that survive: an explicit
--objectui-versionnaming another version, ahand edit, and a record written before that default was fixed.
2. the node producer's description in the parity gate header
Before:
After:
Why the new sentence is true of today's generator: the record is the run's OUTPUT
(
gen-sdui-manifest-node.mjs:229-240writesnextRecordwithobjectuiPackagesVersion: version),never its input. The paragraph forty lines below this one in the same header already says the version
is "read off the pinned commit's
packages/core/package.json", so the file now agrees with itself.3. the seventh site — the same defect, one grep-phrase away
The card's census missed it because the wording differs: the problem text says "the version already
recorded", the header says "the version already in the record", so the card's own firing control
never sounded on it.
Before:
After:
Repaired in place rather than filed: same file, same defect class, same gate family, mechanical, and
the correct shape was already pinned by the sibling passage above. A full scan of all 25 open
non-release PRs (file lists read one by one) found no other claim on this file.
Firing control
git grep -n 'version already recorded' -- '*.mjs' '*.ts' '*.md'scripts/check-sdui-manifest.mjs:318)The instrument is not dead. Two positive controls of the same command shape, run on the same tree
after the edit:
'version already sitting in the record'answers 1 hit inscripts/gen-sdui-manifest-node.mjs, and'Regenerate against the pin'answers 1 hit inscripts/check-sdui-manifest.mjs— the very file the zero is claimed about, so the grep demonstrablystill reaches it.
(b) decided, with live readings, and the decision differs from triage
Triage framed
:228/:275as "a gate handing you a command it will itself refuse", and half of itsp2audience argument rests on that reading. I agree with the PM's narrowing, and I did not take thereading off the source: I ran the generator both ways in a scratch root, so nothing in this tree was
written.
The scratch root was made discriminating on purpose — its record was seeded with
objectuiPackagesVersion: "0.0.0-BOGUS-SCRATCH", a version that exists on no registry. Had theretired default still been live, the run would have tried to install it.
Leg 1 — no resolvable pin (
OBJECTUI_ROOTpointed at a path with no checkout): exit 1, nothingwritten, and the refusal carries its own two remedies:
Leg 2 — resolvable pin, full run including the network install: exit 0.
It resolved
17.6.0— the version objectui declares at the pin — over the bogus0.0.0-BOGUS-SCRATCHsitting in the record, and overwrote the record with it. The manifest it produced carries
sha256
49211fee7792…, byte-matching the artefact tracked here.So
:228and:275are not broken. The flagless call they print writes the correct artefact wheneverthe pin's declared version is readable, and when it is not, it refuses loudly with the remedy in its
own failure text rather than writing a drifted record. That is the behaviour #18875 was for. They are
conditional, and a conditional prescription that fails loudly and names its own fix is not the shape
this repo files cards about. Sites 6 and 7 in the list above are the same conditional shape; site 7
(
manifest-prescription.ts:81) even printed itself during this round's gate sweep, intact andactionable, when
check:react-declaration-parityran withoutMANIFESTset.One consequence worth writing down rather than acting on: because the flagless default now reads the
pin, the flagless call would ALSO repair the check-4 record. The flagged prescription is kept
unchanged anyway — it names the value in the command, which is the self-evidencing form, and this
round is prose only.
DARK — the gate's verdicts do not move
scripts/check-sdui-manifest.mjsrun before and after the edit, three arms, both streams captured tofiles and compared with
cmp:../objectuisibling)OBJECTUI_ROOTunresolvableOBJECTUI_ROOTunresolvable +--require-objectui--self-testis green and its output is byte-identical before and after: 11 cases, battery floor 11.The strings this PR edits live on failure paths, so a green tree never prints them — which is exactly
why the verdict bytes do not move.
Gates
Derived with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, runone by one with each exit code landed to disk before anything read it, then reconciled with
--rancarrying those codes.
The two NOT MEASURED are
check:dual-build-cjs-loadsandcheck:lean-entry-closure. Both exit 3 —their own
PREREQUISITE NOT METcode — because they load built output and this worktree has no fullpnpm build. Both self-tests passed (93 and 22 cases). Neither can be moved by a comment-only diff;they are declared to CI.
One gate exits 1 under the derived spelling and 0 under CI's:
check:react-declaration-parityrefuseswhen
MANIFESTis unset, which is a prerequisite, not a red. Run aslint.ymlruns it —MANIFEST="$PWD/sdui.manifest.json" ... --baseline react-declaration-parity.baseline.json --strict—it exits 0 with "no new DECLARATION divergence vs accepted baseline".
Derivation stability: the 72-family list came out byte-identical at all three tree states this branch
passed through (
625db0e853,0ea26d37e8,92eee4dcc5), so the tool's STALE TREE notice — raisedbecause a sibling agent's fetch keeps advancing the shared
origin/mainref — changed nothing aboutwhat is owed here.
Tests and lint
pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2 scripts/check-react-blocks-declaration-parity.test.ts scripts/build-schemas-check-mode.test.ts— 2 files, 115 tests, all passed. These are the suites that name the two edited scripts.scripts/check-sdui-manifest.mjshas no sibling test file inscripts/; its--self-testis its suite, and it is above.pnpm --filter @objectstack/spec typecheck— exit 0.pnpm --filter @objectstack/spec check:scripts-typecheck— exit 0; this is the program that compiles the editedpackages/spec/scripts/**file.pnpm --filter @objectstack/spec build && pnpm --filter @objectstack/spec check:generatedafter mergingmain— all 15 generated artifacts up to date.pnpm --filter '@objectstack/spec^...' buildis an empty run here: "No projects matched the filters" —packages/spechas no workspace dependencies.92eee4dcc5:eslint . --no-inline-config --format jsonover a population of 6855 files read from eslint's own JSON output — 0 errors, 0 warnings. Narrowed to the two edited files: 2 files, 0 errors, 0 warnings.eslint.config.mjs:326-328records that this repo "never enables type-aware linting (noparserOptions.project, no typed@typescript-eslintrules) for ANY file", so nothing in this diff can move an untouched file's verdict either way.Changeset
skip-changeset, measured rather than assumed:files[]entry reachingscripts/— 76 manifests scanned, 0 hits.packages/spec'sfiles[]isdist,json-schema,liveness,prompts,llms.txt,README.md,src/**/*.zod.ts,CHANGELOG.md,api-surface,spec-changes.json.scripts/is not among them.src/**/*.zod.ts) for two distinctive strings from this diff returns zero hits, exit 1. Positive control, same command shape:PageComponentSchemaanswers fromdist/identity/index.jsand three siblings.scripts/check-sdui-manifest.mjsis a repo-root script belonging to no package.Nothing published moves, so the tarballs do not move.
Read-only fences, re-taken at start of work
scripts/sdui-manifest.record.jsonis held by open PR sdui-parser: port inert-quick-add and member-type-mismatch from objectui, re-record the lockstep and bump the pin #18723 (state open, draft, 11 files) — confirmed by reading that PR's file list directly, not inherited. Untouched here. Its own stale-ish prescription is class (b) anyway, so the fence costs this round nothing.check-sdui-manifest.mjs,check-react-blocks-declaration-parity.tsorgen-sdui-manifest-node.mjs, and no other open PR holds any of them.scripts/gen-sdui-manifest-node.mjsis this round's source of truth and is untouched.packages/spec/src/.Acceptance notes
Observed, deliberately not filed:
docs/releases-maintenance.md:116/:279,scripts/bump-objectui.sh:11/:705/:739andscripts/build-console.sh:282/:297all print the FLAGGED form and are correct today;scripts/sdui-manifest.record.json:5andcheck-sdui-manifest.mjs:19-21describe the version as "the version.objectui-shaships", which is more true after fix(scripts): the manifest generator defaults its @object-ui version from the PIN, not the record #18875 than before. None of them is a site. Carrier: none — nothing here needs changing.Generated by Claude Code