Skip to content

fix(cli,vscode-extension,components,runner): move the body child-list dialect off the platform’s producers, and teach the two VS Code readers children - #9846

Merged
os-tesla merged 6 commits into
mainfrom
claude/issue-7181-body-dialect-producers-to-children
Sep 18, 2026
Merged

os-tesla merged 6 commits into
mainfrom
claude/issue-7181-body-dialect-producers-to-children

Conversation

@os-tesla

@os-tesla os-tesla commented Sep 18, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #7181

Clause-②: no

Moves the body child-list dialect off the platform's PRODUCERS, and — per the seat's
ruling of 2026-09-18T09:03Z on the card — converges the two VS Code extension readers
onto children first so the producers can move at all.

Why the reader change is here and not in a later step

The card's delivery order asked for a stop condition first: does every face the
producers' output crosses accept children today? Five of six did. The two extension
readers did not — they guarded on schema.body alone, so moving the producers without
them would have shipped a blank preview. That was measured before any producer moved,
reported, and ruled on; the amended fence added exactly those two files.

The reader fix is a live defect fix in its own right, true today with no part of the
retirement being true.
An author spelling a child list children — blessed by the
BaseSchema declaration, the zod mirror, core's validateSchema and the authoring
tier's BASE_PROPS — got a silently blank preview and children that were never
validated. That is what the changeset names.

What changed

Readers (children first, body KEPT — purely additive, nothing narrowed):

  • packages/vscode-extension/src/providers/PreviewProvider.ts — the card branch and the
    default container branch
  • packages/vscode-extension/src/providers/SchemaValidator.ts — the recursion guard, and
    the diagnostic path now names the key the document actually used instead of addressing
    problems to .body[...] in a file containing no such key

Producers (node counts as pnpm census:body-dialect reports them):

producer nodes
packages/cli/src/commands/init.ts 53
packages/vscode-extension/src/extension.ts 14
packages/components/src/renderers/complex/carousel.tsx 3
packages/components/src/renderers/complex/resizable.tsx 2
packages/runner/src/App.tsx 2
packages/components/src/renderers/complex/scroll-area.tsx 1

Every node type involved (div, card, page) already read children, so this is a
rename, not a re-shape.

Evidence

The executed probe that decided the stop, run against the preview's own shipped
inline renderer extracted verbatim: the same card node printed descendant elements rendered: 2 under body and 1 under children. The body leg is the lit control in
the same run, so the 1 is a real drop. That probe is now a committed test rather than a
one-off.

Five ablations, each proving a pin can fail (via ablation-replace, which asserts the
mutation landed by blob hash and proves the restore against HEAD):

ablated result
preview container arm 3 red — expected +0 to be 1
preview card arm 2 red
validator arm 1 red — expected [] to include 'Missing required property "type"'
init.ts simple template back to body 1 red — names the retired dialect
extension.ts empty template back to body 1 red

Every restore leg reported blob == HEAD with an empty git diff HEAD, and the tree was
clean after all five.

Census before and after, same instrument, same root:

nodes carrying `body`   230  becomes  160

That reconciles exactly: 230 − 75 migrated + 5 deliberately kept. The 5 are body-spelled
fixtures in the new pins, which assert BOTH spellings so a regression in the kept body
arm is caught too. All six producer files are absent from the after-census; the control is
that the census still reports 195 rows elsewhere in the same run.

Suites and gates (all on the final tree):

check result
vitest run packages/cli/ packages/vscode-extension/ packages/runner/ 27 files, 316 tests pass
vitest run packages/components/ 281 files, 2744 tests pass
turbo run type-check (4 touched packages) 19/19 tasks pass
check-changeset-presence pass — 11 source files, 4 released packages, 1 changeset
check-changeset-no-major pass
check-control-bytes pass
check-new-cross-file-line-citations 0 new
check-governed-queue-guard --test NOT GOVERNED, 12 paths checked
eslint --no-inline-config over the 11 changed files exit 0, 0 errors, 15 warnings, 0 of them on a line this branch added

The lint run is narrowed to the changed files. Stated so it can be checked: the repo's
eslint config declares no project / projectService, so type-aware linting is off and
this diff cannot move the verdict on any file it does not touch; the file count is from
--format json.

⚠️ type-check earned its place here. The first version of the reader comments put raw
backticks inside the preview's HTML template literal, which ends the string. Every test
stayed green — the pins read that provider as TEXT rather than importing it — and only
tsc caught it. Fixed in its own commit, and the ablation was re-run afterwards to
confirm it still bites.

Seat note — evidence is UNDERSTATED above, and one CI repair round happened

⚠️ Added by the domain:ui#2 execution seat (session_018HrVaotisyhgmot9o2MLRq), 2026-09-18T10:18Z. The dev writes a PR body once and ⛔ never patches it; the body is the seat's to keep current.

The Evidence table above cites 27+281 test files across four packages. That is now conservative, ⛔ not wrong. After a CI repair round the branch is verified over 719 test files / 15139 tests across SEVEN trees — scripts/, examples/ and packages/types/ added — plus tsc -p tsconfig.scripts.json with the edited file proven inside that program by --listFiles.

Why the repair round happened, and ⭐ what it found. CI went red on Test (shard 3/4): scripts/__tests__/body-dialect-census.test.ts pins that the producers still carry body — this card's own finding, written down as a test — so migrating them reds it. ⛔ That is the pin doing its job, and it is 100% this PR's to repair. The repair keeps the block's claim verbatim and re-points its subject at objectui#9847; ⛔ it was deliberately not inverted into 「the producers now carry children」, which would assert this branch's own diff back at itself and discard the ordering rationale.

⭐⭐ And the mandatory ablation caught a PHANTOM PASS inside that repair. The strengthened reader assertion did ⛔ not bite: ablating the children arm out of providers/SchemaValidator.ts left the pin GREEN, because that file documents the arm by quoting schema.children || schema.body in a comment directly above the line that implements it — toContain was matching the prose, not the code. Fixed with a readCode helper that strips whole-line comments only (so a // inside a string survives: both a URL and the preview provider's inlined webview script appear in the files these blocks read). ⚠️ Invisible to the assertion's own result — green before and after the mutation — and only an ablation shows it. Without the mandatory ablation this would have shipped as a pin that could never fail.

⭐ The instrument that found the red's siblings is worth naming: instead of guessing which trees to sweep, the dev grepped for every test anywhere that names one of the changed source files, control lit in the same run. It returned readers in three trees no affected-package suite reaches — scripts/ (the census pin), packages/types/ (two pins reading carousel.tsx and resizable.tsx) and examples/schema-catalog/ (one reading scroll-area.tsx).

Acceptance notes

  • There is a SEVENTH producer this PR does not touch, and it is now FILED as objectui#9847.
    generatePage() in packages/cli/src/commands/generate.ts:72 does writeFileSync of a
    pages/NAME.json carrying a body child list (:80) — a producer in exactly the card's
    sense, and the census places it in the same app-metadata bucket the six were in. It is
    outside the amended fence, and the bounded in-place exemption does not apply because a dev
    cannot amend the claim's declared file surface. Listed, not touched; it is the one
    app-metadata row the after-census still reports. ⭐ Re-measured at source by the seat on
    origin/main 276d1745 before filing, control lit in the same run.
    ⚠️ The repaired census pin names that card in-source, so objectui#9847 landing will red
    the platform SHIPS the dialect it is being asked to refuse until the block is re-pointed —
    at whatever still ships the dialect, or at nothing once nothing does, which is the day
    objectui#6771 step 4 becomes landable.
    That is the intended handoff, ⛔ not a trap.
  • The card's own producer table prints 1 node for packages/runner/src/App.tsx; the
    census counts 2 (a page node and the div nested in it). The migration used 2.
    Table inaccuracy on the card, not a code defect.
  • The card cites schema-validator.ts:419; it is at :467 on this base. Not repaired —
    cross-file line addresses are repaired opportunistically and never as a sweep, and a
    card body is record.
  • Commit trailers here follow this repo's observed convention on main
    (Co-authored-by: Claude), which is model-free. Noted because the session's default
    attribution names a model.

Not in this PR, deliberately

  • packages/core/src/validation/schema-validator.ts — already children-first; removing
    its body arm belongs to the retirement's reader-convergence step, not here.
  • packages/types/src/base.ts and its zod mirror — the published-type narrowing step.
    Both already accept children; nothing to change.
  • Corpus and teaching.
  • The body arm itself, anywhere. Nothing in this branch narrows an accept set.

Part of the retirement tracked on objectui#6771; that card is not addressed here and
remains open.


Generated by Claude Code


Generated by Claude Code

…ling

Both extension-host readers guarded their child-list recursion on
`schema.body` alone, while `children` is the spelling declared by the
TypeScript face and zod mirror in `@object-ui/types`, by `validateSchema`
in `@object-ui/core` (which reads `schema.children || schema.body`), and
by the manifest tier's `BASE_PROPS` in `@object-ui/sdui-parser`.

An author writing the declared spelling therefore got a blank preview and
children that were never validated -- both failures silent, with no
diagnostic and no refusal.

Read `children` first and KEEP the `body` arm, so every `body`-spelled
document behaves exactly as before. Removing that arm is a separate,
already-ruled step and is not done here.

The validator's diagnostic path now names the key the document actually
used, so a `children`-spelled node no longer reports problems at a
`.body[...]` address that does not occur in the file.

Pinned by executing the shipped sources rather than asserting on their
text: the preview's renderer lives inside a template literal that nothing
type-checks, and the validator is transpiled and run against a stub of the
`vscode` members it touches.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018HrVaotisyhgmot9o2MLRq
Six code paths emitted `body`-spelled child lists into metadata a user
then owns or that ships as a component's declared default:

  packages/cli/src/commands/init.ts               53 nodes
  packages/vscode-extension/src/extension.ts      14 nodes
  packages/components/.../complex/carousel.tsx     3 nodes
  packages/components/.../complex/resizable.tsx    2 nodes
  packages/runner/src/App.tsx                      2 nodes
  packages/components/.../complex/scroll-area.tsx  1 node

Counts are the node counts `pnpm census:body-dialect` reports, not line
counts; `init.ts` matches `body` on 55 LINES because two of them are the
HTML body tags in the generated `index.html`, which are not schema nodes
and are untouched here.

The three `defaultProps` cases were the sharpest: the registration shipped
the dialect inside its own declared default, so the component emitted by
default a spelling the retirement is removing.

Every node type involved -- `div`, `card`, `page` -- already read
`children`, so this is a rename and not a re-shape.

New pins, neither of which existed before: the scaffolded output of every
`objectui init` template, and every `Create New Schema` template. Both
discover their template population from the code rather than listing it,
so a template added later is covered without editing the test.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018HrVaotisyhgmot9o2MLRq
…w template

The comments added with the `children` arm sat INSIDE the preview's HTML
template literal, where a backtick is not decoration -- it ends the string.
`tsc` reported TS1005/TS1443 at the first one.

Nothing else caught it, and the reason is worth keeping: the pins for this
behaviour read the provider as TEXT rather than importing it, so they were
green against a file TypeScript rejected. `type-check` is what found it.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018HrVaotisyhgmot9o2MLRq
Scored `minor` across the four released packages this branch touches.
The reader half is a user-visible defect fix, not a refactor note, so the
changeset names the symptom -- a silently blank preview and unvalidated
children for a spelling the platform blesses on four faces.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018HrVaotisyhgmot9o2MLRq
@github-actions

github-actions Bot commented Sep 18, 2026 •

Copy link
Copy Markdown
Contributor

changeset-claim-re-read

⚠️ 1 pending changeset(s) describe a file this change touches

Their bodies publish verbatim into the CHANGELOG at the next release, so this is a request to re-read them against your diff — addressed here because you are the one seat that can answer it without re-deriving anything.

⛔ Nothing here blocks, and nothing here is a verdict on your change. This gate exits 0, is not a required context, and judges name resolution, never meaning: it asked whether a pending body names a file you touched. "Is this sentence still true?" is the one question it will not answer, and the one you are being asked to answer.

.changeset/6150-undeclared-but-consumed-keys.md

  • names complex/carousel.tsx → packages/components/src/renderers/complex/carousel.tsx — edited by this change

    | type | key | declared as | read at | |---|---|---|---| | TextSchema | content | string | renderers/basic/text.tsx — {schema.content \|\| schema.value} | | CarouselSchema | opts | RecordANGLE-BRACKETS(string, unknown) | complex/carousel.tsx — opts={schema.opts} | | CarouselSchema | orientation | 'horizontal' \| 'vertical' | complex/carousel.tsx | | CarouselSchema | itemClassName | string | complex/carousel.tsx — per-slide class | | FilterBuilderSchema | wrapperClass | string | complex/filter-builder.tsx | | TreeViewSchema | nodes | TreeNode[] | data-display/tree-view.tsx | | TreeViewSchema | title | string | data-display/tree-view.tsx | | TreeViewSchema | onNodeClick | (node: TreeNode) => void | data-display/tree-view.tsx — INVOKED | | CheckboxSchema | required | boolean | form/checkbox.tsx — drives the * marker | | FileUploadSchema | buttonText | string | form/file-upload.tsx | | FileUploadSchema | wrapperClass | string | form/file-upload.tsx | | HoverCardSchema | align | OverlayAlignment | overlay/hover-card.tsx | | ContextMenuSchema | trigger | SchemaNode \| SchemaNode[] | overlay/context-menu.tsx |

Read the paragraph, not the line: both false halves of the objectui#8617 claim sat in one paragraph, and correcting either alone would have left it asserting the same wrong thing.

If a claim did go false, correct the body. That is precedented and prose-only, frontmatter untouched; check-changeset-overwrite.mjs will report the correction as its own case 2 ("correcting a declaration on purpose … legitimate"), which is the intended shape — one gate asks for the read, the other records the write.

Not covered, stated so nobody reads this as more: a born-false claim that spells no line address at all (objectui#9495 coordinated one by ORDINAL — "a grep finds that member first" — and deciding that means reading what the sentence means), a claim spelled as a symbol or a package rather than a backticked file name, and a file named ambiguously.

Angle-bracketed names in the quoted prose above are rewritten as ANGLE-BRACKETS(name): GitHub deletes tag-shaped fragments from a stored body, and a quote that silently loses the identifier it is about is worse than a visible repair.

Compared the checked-out tree with 6c3944c30 (merge-base with origin/main): 12 file(s) changed outside .changeset/, read against 1154 pending declaration(s) that publish a body (1688 pending in total). · run

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3049.8 KB 3104.5 KB
Main entry chunk (gzip) 145.7 KB 350 KB
Entry file index-DbGz4loM.js —
Status PASS —

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

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.69KB 6.21KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 545.76KB 130.74KB
core (index.js) 8.94KB 3.59KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 215.98KB 59.97KB
fields (index.js) 249.23KB 62.88KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.22KB 2.26KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 32.15KB 10.49KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.83KB 10.95KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.39KB 3.10KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 14.81KB 3.63KB
plugin-calendar (index.js) 49.92KB 14.22KB
plugin-charts (index.js) 71.61KB 20.05KB
plugin-chatbot (index.js) 195.34KB 46.51KB
plugin-dashboard (index.js) 131.44KB 34.65KB
plugin-designer (index.js) 215.94KB 44.33KB
plugin-detail (index.js) 253.37KB 65.90KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 136.74KB 34.16KB
plugin-gantt (index.js) 167.62KB 41.26KB
plugin-grid (index.js) 212.61KB 57.90KB
plugin-kanban (index.js) 48.10KB 14.94KB
plugin-list (index.js) 112.74KB 27.70KB
plugin-map (index.js) 21.48KB 6.99KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.41KB 11.93KB
plugin-timeline (index.js) 30.07KB 8.74KB
plugin-tree (index.js) 10.58KB 3.72KB
plugin-view (index.js) 85.05KB 21.01KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 104.82KB 34.67KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.66KB 2.50KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 14.82KB 4.99KB
types (ai.js) 4.11KB 2.06KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 14.04KB 5.36KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

This branch migrated six producers off the `body` dialect, which made two
claims in the census pin false. Repairing a claim this diff falsified is
what is owed; the claims themselves are kept.

"the platform SHIPS the dialect it is being asked to refuse" keeps its
wording and its ordering rationale, and gains a live subject: six
producers moved, and `generatePage` in commands/generate.ts still writes
a `pages/NAME.json` spelled `body`. Both halves are asserted, so either a
migrated producer drifting back or that last producer moving without this
block being re-pointed will red.

Deliberately NOT inverted into "the producers now carry `children`" --
that asserts this branch's own diff back at itself and throws away the
reason the block exists.

The generic-reader block's assertions were already passing, so they are
not weakened: the two vscode lines are STRENGTHENED to the same
`schema.children || schema.body` spelling the core line pins, which is
what those readers now say. Its comment recorded the three readers as
alike; they were not, and that difference is the whole of this branch.

Found by CI, not locally: this test lives in scripts/__tests__ and reads
other packages' source text, so no affected-package suite reaches it.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018HrVaotisyhgmot9o2MLRq
The strengthened reader assertion did not bite. Ablating the `children`
arm out of providers/SchemaValidator.ts left the pin GREEN, because that
file documents the arm by quoting `schema.children || schema.body` in a
comment directly above the line implementing it -- `toContain` was
matching the prose.

A `readCode` helper strips whole-line comments, and the three source-text
blocks use it. Whole-line only, so a `//` inside a string survives: both
a URL and the preview provider's inlined webview script appear in the
files these blocks read.

This is the principle the scanner is already pinned on one block above
("prose is not a call site"), applied to the assertions themselves.

Caught by ablation, which is the only reason it was visible at all: the
assertion was green both before and after the mutation.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018HrVaotisyhgmot9o2MLRq
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3049.8 KB 3104.5 KB
Main entry chunk (gzip) 145.7 KB 350 KB
Entry file index-DbGz4loM.js —
Status PASS —

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

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 16.69KB 6.21KB
app-shell (runtime-config.js) 20.68KB 7.36KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 11.08KB 4.58KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 545.76KB 130.74KB
core (index.js) 8.94KB 3.59KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 215.98KB 59.97KB
fields (index.js) 249.23KB 62.88KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.22KB 2.26KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 32.15KB 10.49KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.83KB 10.95KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.99KB 0.87KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 13.52KB 4.88KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.39KB 3.10KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 4.83KB 2.27KB
plugin-ai (index.js) 14.81KB 3.63KB
plugin-calendar (index.js) 49.92KB 14.22KB
plugin-charts (index.js) 71.61KB 20.05KB
plugin-chatbot (index.js) 195.34KB 46.51KB
plugin-dashboard (index.js) 131.44KB 34.65KB
plugin-designer (index.js) 215.94KB 44.33KB
plugin-detail (index.js) 253.37KB 65.90KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 136.74KB 34.16KB
plugin-gantt (index.js) 167.62KB 41.26KB
plugin-grid (index.js) 212.61KB 57.90KB
plugin-kanban (index.js) 48.10KB 14.94KB
plugin-list (index.js) 112.74KB 27.70KB
plugin-map (index.js) 21.48KB 6.99KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.41KB 11.93KB
plugin-timeline (index.js) 30.07KB 8.74KB
plugin-tree (index.js) 10.58KB 3.72KB
plugin-view (index.js) 85.05KB 21.01KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 104.82KB 34.67KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 4.25KB 2.04KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.66KB 2.50KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 14.82KB 4.99KB
types (ai.js) 4.11KB 2.06KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (expression.js) 0.20KB 0.18KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (select-option.js) 0.20KB 0.19KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 14.04KB 5.36KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.11KB 3.32KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

Copy link
Copy Markdown
Collaborator Author

Re: changeset-claim-re-read — the one flagged body was re-read, and it is ⛔ NOT falsified

Answering the gate's one question — 「is this sentence still true?」 — on behalf of the authoring seat. Measured at 2026-09-18T10:18Z on this PR's head 616e838c, against merge-base 3ae740c4.

.changeset/6150-undeclared-but-consumed-keys.md names complex/carousel.tsx, which this change edits. Its three claims about that file are:

type key read at
CarouselSchema opts complex/carousel.tsx — opts={schema.opts}
CarouselSchema orientation complex/carousel.tsx
CarouselSchema itemClassName complex/carousel.tsx — per-slide class

⭐ All three still true, verified at source on this head: :23 opts={schema.opts}, :24 orientation={schema.orientation || 'horizontal'}, :30 className={schema.itemClassName}.

Read as a paragraph, as the gate asks, not line by line. That body's claim is about undeclared-but-consumed keys — which props the renderer reads that the schema never declares. This change touches none of that: its entire edit to carousel.tsx is three defaultProps lines, each moving a nested div's child list from body: to children: inside the slide content:

-  [{ type: 'div', className: 'p-4 sm:p-6 md:p-8 border rounded bg-slate-50', body: [{ type: 'text', content: 'Slide 1' }] }],
+  [{ type: 'div', className: 'p-4 sm:p-6 md:p-8 border rounded bg-slate-50', children: [{ type: 'text', content: 'Slide 1' }] }],

⇒ ⛔ no declaration moves, ⛔ no read site moves, ⛔ no key is added or removed on CarouselSchema.

Measured rather than asserted, with a control in the same command: of the changed lines in carousel.tsx on this branch, 0 mention opts, orientation or itemClassName; the same pattern over the file at this head resolves 6 times. ⇒ an admissible zero, ⛔ not a bare one.

⛔ No changeset body needs correcting, and none was edited on account of this gate.

⚠️ Recorded for the next reader of this PR, because the gate's own framing invites it: this change did falsify a body elsewhere, and that one WAS repaired — .changeset/9821-…md on objectui#9851, under a seat-amended fence. ⇒ this answer is 「read and judged」, ⛔ not 「the gate never finds anything」.

domain:ui#2 execution seat · session_018HrVaotisyhgmot9o2MLRq · gate answer · readings taken 2026-09-18T10:18Z


Generated by Claude Code

@os-tesla
os-tesla marked this pull request as ready for review September 18, 2026 10:38
@os-tesla
os-tesla added this pull request to the merge queue Sep 18, 2026
Merged via the queue into main with commit 4b5bb95 Sep 18, 2026
38 checks passed
@os-tesla
os-tesla deleted the claude/issue-7181-body-dialect-producers-to-children branch September 18, 2026 10:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants