Repository navigation
fix(app-shell): INHERITED_TARGET docblock quotes the read the resolver performs (objectui#10159) - #10305
Conversation
…ver performs The docblock above `INHERITED_TARGET` in `ActionPreview` quoted the resolver as `referenceTo: param.reference ?? field.reference_to`. The resolver has read `field.reference` since the read was narrowed, and `reference_to` is a field-def key `@objectstack/spec` refuses by name, so a reader following the comment would author rejected metadata. The quotation now matches the code, and a pin re-derives the quoted expression from the docblock and requires it to occur, as whole tokens, in the resolver's comment-masked code, with a lit control and a boundary discriminator.
The only published-source edit is a comment above the non-exported `INHERITED_TARGET`; measured, it reaches no emitted `.d.ts` and moves no runtime token.
|
changeset-claim-re-read
|
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
Fixes #10159
Clause-②: no
What
One line, in the docblock above
INHERITED_TARGETin the metadata-adminActionPreview. It quoted the action-param resolver as readingreferenceTo: param.reference ?? field.reference_to. The code readsreferenceTo: param.reference ?? field.reference, inresolveActionParam, the per-param stepresolveActionParamsmaps over. It has read that way since objectui#6837 narrowed it.reference_tois a field-definition key@objectstack/specrefuses by name (unrecognized_keys, suggesting the rename toreference). So the comment pointed an author at metadata the platform rejects. The quotation now matches the code. It was already cited by content (a symbol plus a quoted expression, no path and no line), and that shape is kept.Premise, re-derived on
origin/main(5ea623ea) before editinggit grep -n "param.reference ??" -- packages/app-shellreturned two rows: the resolver's code readingfield.reference, and this docblock quotingfield.reference_to. The spec refusal was read on objectstackorigin/main: the conversions registry's "always REFUSEDreference_toby name" paragraph, and the conversions test "the canonical field schema declaresreferenceand rejectsreference_towith the rename".The pin
ActionPreview.inheritedTargetCitation-10159.test.tssits beside the existingActionPreviewtests and runs in the unit project. It follows the shape of the repo's docblock-truth pins (referenceRailRoute-9816,rootLandingHasOneResolver-10042):referenceTo:). The test never transcribes it.scripts/js-comment-mask.mjs, so prose about the read cannot satisfy it.field.referencewould therefore not pass against code that readsfield.reference_to, the mirror image of this defect.referenceTo:read the resolver has. DISCRIMINATOR: the boundary refuses a prefix of a longer identifier.Ablation (a one-time proof, run from the committed fix
9e8b6718)The mutation ran through objectstack's
scripts/ablation-replace.mjsin WRAP mode, inside a script with its owntraprestore on EXIT, INT and TERM. It changed the anchorfield.reference`).tofield.reference_to`).. Anchor count went 1 to 0, replacement count 0 to 1, and the blobff67f1a4became447a4c85.Tests 1 failed | 3 passed (4). The failing case wasthat quotation occurs in the resolver's code, as whole tokens, with the message "the docblock quotesreferenceTo: param.reference ?? field.reference_to, which the resolver does not perform". The landing, CONTROL and DISCRIMINATOR cases stayed green. That is the predicted direction: red.ff67f1a4,git diff HEADis empty, and the on-disk counts are back to 1 for the new quotation and 0 for the old one.Verification at HEAD
ee6d0ded(the final commit)ActionPreviewneighbours, repo-root form:Test Files 3 passed (3),Tests 14 passed (14).pnpm --filter @object-ui/app-shell type-check(tsc --noEmit && tsc -p tsconfig.test.json) exits 0. The test program includes the new pin (--listFilesOnly: 1 hit).pnpm check:control-bytespasses.pnpm check:new-line-citationsreports 0 citations added, over 3 files compared, with its synthetic controls PASS.node scripts/check-changeset-presence.mjspasses.check-test-path-roots,check-hand-rolled-comment-mask(no carrier outside DEBT),check-comment-mask-corpus,check-changeset-no-major,check-changeset-claims(report-only),check-pending-changeset-literals,check-lint-coverage, and themarkdown-test-inputsandunit-registry-absence-collisionscript tests. All exit 0. The corpus sweep's single disagreement is the pre-existingDocsIndex.tsxresidue held under objectui#7882.previews/__tests__/directory ran at9e8b6718, before the changeset existed: 13 of 13 files, 135 tests passed.@object-ui/app-shell^...was built first (turbo, all cached), so type-check read currentdisttypings.Lint: narrowed, with the narrowing proven
File ignored because no matching configuration was supplied.--format json: 2 files, 0 errors, 0 warnings. This is the package's own form:eslintrun inpackages/app-shellwith inline config honoured.eslint.config.jsenables no type-aware linting (noprojectService, noparserOptions.project), and no local rule undereslint-rules/reads the filesystem. So this diff cannot move a verdict on any untouched file.--no-inline-config,ActionPreview.tsxshows 2react-hooks/static-componentserrors. They are the two lines that already carryeslint-disableon base, and this diff does not touch them.Changeset: empty frontmatter, measured
The presence gate requires a changeset, because published
srcchanged. It is declared as releasing nothing, based on a measurement of the emit. Afterpnpm --filter @object-ui/app-shell build:ActionPreview.d.tscontains neitherINHERITED_TARGETnor the quotation (0 hits; control: the exportedActionPreview, 2 hits);ActionPreview.jscarries the comment, and no runtime token moved;Precedent: objectui#6572 (a docblock on a non-exported member took an empty frontmatter) versus objectui#5213 (JSDoc on exported declarations reached the
.d.tsand tookpatch).Acceptance notes
RecordDetailView, which does not take the object-store union that objectui#10158 added. Carrier: whoever next edits either handler; the parity pinRecordDetailView.paramRuntimeParity-6431names both. Second,RuntimeField.reference_toin the resolver, a declaration that no read has consumed since objectui#6837. Carrier: none.Session:
https://claude.ai/code/session_01BA3nKVUwKQJf8DBxrSVtNC(thedomain:uiseat #1 dispatch).Generated by Claude Code