docs(core): withdraw the vacuous entry-surface justification on the SchemaNode re-export - #5915
Merged
Merged
Conversation
…chemaNode re-export
`packages/core/src/types/index.ts` justified objectui#4580's re-export convergence
with "core's own entry surface is unchanged (`dist/index.d.ts` is byte-identical
across the change — measured, both rounds)". The reading was real and it certified
nothing: that file is emitted from a barrel that only forwards the symbol, and
forwarding never restates a shape — not `export *`, and not the `export type { … }`
line that names this one. Only the module that declares the symbol can move.
The block now withdraws the sentence, states the mechanism, and carries the gauge
that can fail — the emitted `.d.ts` of the declaring module, over a cleared `dist/`
and a cleared `tsconfig.tsbuildinfo`, with a probe calibration and its failure mode
spelled out. Measured for this change: a probe key on `BaseSchema` moved
`@object-ui/types`' `dist/base.d.ts` and came back, while `core/dist/index.d.ts` and
`core/dist/types/index.d.ts` held one hash across all three legs.
The `ComponentRendererProps` block below reached the right verdict already but gave a
narrower reason for it — that core's entry is an `export *` barrel — which is not the
mechanism and is wrong for a symbol the barrel names; it now states the forwarding
rule instead.
Documentation only, in a published declaration file. Refs objectui#5673.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EuPCi56cnGyykygi3z9w4m
Contributor
✅ 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
|
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 #5673
A defect in a proof, not in behaviour.
packages/core/src/types/index.tsjustifiedthe #4580 re-export convergence with:
True, and it certified nothing. That block now withdraws the sentence, states the
mechanism, and carries a gauge that can fail — with its failure mode written down, so the
next reader inherits a check instead of a claim.
Why the reading is vacuous — measured, not argued
core/dist/index.d.tsis emitted from a barrel that only forwards the symbol, andforwarding never restates a shape: neither
export *nor theexport type { … }linethat names this one. Only the module that declares the symbol can move.
Probe calibration on this tree — one additive optional key on
BaseSchema(the shapeSchemaNodepublishes), each leg built from a cleareddist/and a clearedtsconfig.tsbuildinfo, both packages rebuilt every leg:@object-ui/typesdist/base.d.ts— declares the shape31b5a01d…8487500e…moved31b5a01d…@object-ui/coredist/types/index.d.ts— forwards it0e64c8c6…0e64c8c6…0e64c8c6…@object-ui/coredist/index.d.ts— entry barrel, names the symbol5cca207a…5cca207a…5cca207a…Two things this pins beyond the card's own control leg:
SchemaNode(core/dist/index.d.ts:8) and is byte-identicalanyway — so the rule is forwarding, not
export *, and not "the barrel doesn't name it".core/dist/types/index.d.ts, the file ComponentRendererProps: re-export the one declaration instead of restating it #5679 found could move, is also insensitivehere. It moved for finding(types): ComponentRendererProps is the second dual declaration in the same two files as SchemaNode — core's is non-generic, types' is generic #4594 because that change edited core's own source; for a shape
change in the declaring package it does not move at all. The gauge has to be the
declaring module's emit, which for
SchemaNodelives in another package.The mutation was proven on disk before any build was believed: anchor count 1 → 1, marker
count 0 → 1, the injected line printed from the file,
git diff --statshowing1 insertion(+); thenmarker_count=1intypes/dist/base.d.tsand0incore/dist/index.d.tsafter the rebuild. The restore leg is symmetric — marker count backto 0 in source and in
dist/, and all three hashes back to base. The script carriedtrap '<restore>' EXIT INT TERM, so a mid-run kill could not leave a mutated tree behind.No ablation is available for this card and none was staged: the change is prose. What
replaces it is the calibration above, which is the same discipline applied to the thing
actually under test.
Where else the sentence propagated
Search scope:
git grep -nIover all 5001 tracked files, patternsindex\.d\.ts(144 hits, each classified),
byte.identical,entry (type )?surface, and the exact#4580 sentence.
Controls, searched the same way:
is byte-identical across the change(known present) →6 files;
SchemaNode.reconciliation.test.ts(known present in the edited file) → 2 files;a known-absent string →
git grepexit 1, zero lines, with the exit code capturedbefore any pipe. So an empty result here is distinguishable from a broken search.
Result — the vacuous class has exactly six instances, one live and five released:
packages/core/src/types/index.ts— corrected in this PR.packages/{components,core,plugin-dashboard,react,types}/CHANGELOG.md— five verbatimcopies of the finding(types): two competing SchemaNode declarations — core's interface vs types' union #4580 changeset, propagated by the release tooling. Deliberately not
rewritten here: they are compiled release records for a shipped release, the same text
is already on npm, and this card's fence is the comment carrying the claim. Filed as
The withdrawn
dist/index.d.tsbyte-identity sentence survives verbatim in five released CHANGELOGs — decide whether released records get amended #5913 (sub-issue of this card) with the options laid out.Citations that are sound and were left alone, because the gauge can fail for their
claim:
packages/app-shell/CHANGELOG.md:2694andpackages/plugin-grid/CHANGELOG.md:863(a claim about which names the entry publishes — adding or removing a forwarded name
does move the barrel);
packages/fields/CHANGELOG.md:1033andpackages/plugin-editor/CHANGELOG.md:96(whole-tree sha256 manifests);packages/types/CHANGELOG.md:652andpackages/data-objectstack/CHANGELOG.md:299(thegauge firing positively in a declaring package);
.changeset/app-shell-page-header-subtitle-4761.md(checker-resolved export census withcontrols);
.changeset/plugin-component-input-deprecate-5674.md(the calibrated one)..changeset/componentinput-reexport-4972.mdalready reports the gauge only with itscontrol — the card's "it propagated once" instance has self-corrected; its stated reason
is narrower than the mechanism, which is recorded in the report rather than edited, since
it is another card's pending release note.
The one bounded in-place correction
The
ComponentRendererPropsblock in the same file reached the right verdict already butgave a narrower reason: "
core/src/index.tsis a 95-lineexport *barrel". Twodefects, same class as this card: the count was stale (that file is 101 lines today), and
the reason is wrong for
ComponentRendererPropsspecifically — the barrel names it online 9. The measurement above is what settles the correct form, so it is mechanical. It
now states the forwarding rule, and its cross-reference to the
SchemaNodeblock abovehad to move anyway, since that block no longer merely omits the sentence — it withdraws it.
No new gate
Per this card's ruling, no CI check is added here. The shape one could take, and the
reason a naive phrase-ban would be wrong, is filed as #5914 (
finding, unassigned).Verification
Gate union re-run after the final commit, at
738390cc1(clean tree), quoting eachgate's own verdict line; exit codes captured before any pipe:
vitest ran from the repo root with path filters —
packages/core/, both*.reconciliation.test.tspins the docstrings name, andscripts/__tests__/doc-version-claims.test.ts(the version-literal ratchet; this PR addsno version literal to prose). The dependency closure was built first
(
pnpm --workspace-concurrency=2 --filter '@object-ui/core^...' build), so nothing wasjudged against a stale
dist/. All heavy legs went through the shared verify lock.Lint, narrowed — with the three pieces of evidence:
eslint .insidepackages/coreand the repo's own root-scope invocation (
lint:root's ignore patterns), lettingeslint resolve the file set.
--format json: 191 files in the core scope, 161 at root scope,0 errors in both (510 and 26 pre-existing warnings, none on the edited file). The
edited file is present in the core population; 0 markdown files are in eslint's
population at all, so the new changeset is outside eslint's reach by configuration.
eslint.config.jsdeclares noprojectServiceandno
parserOptions.project— type-aware linting is off — so a comment-only edit insideone file cannot move the verdict on any file it does not contain.
turbo.json'slinttask has no
^builddependency either, so no other package's lint result reads core'sbuild output.
The repo-wide
eslintfarm is CI's run either way; the above is a measurement of thisdiff's reach, not a skip.
Published surface
Documentation only — but it does ship. These docblocks sit on export specifiers, so they
land in the published declaration:
core/dist/types/index.d.tsmoved0e64c8c6…→76f769ed…for this commit, whilecore/dist/index.d.tsheld5cca207a…— the same insensitivity, demonstrated a third time on this very change. That is why the
changeset declares a
patchrather than an empty frontmatter. No type moves; no runtimebehaviour changes.
Generated by Claude Code