Skip to content

feat(types)!: retire TreeViewSchema.data as an ADR-0049 tombstone — nodes is the only inline spelling (objectui#6951 B1) - #7769

Merged
os-justin merged 4 commits into
mainfrom
claude/issue-6951-treeview-nodes-only
Sep 5, 2026
Merged

feat(types)!: retire TreeViewSchema.data as an ADR-0049 tombstone — nodes is the only inline spelling (objectui#6951 B1)#7769
os-justin merged 4 commits into
mainfrom
claude/issue-6951-treeview-nodes-only

Conversation

@os-justin

Copy link
Copy Markdown
Collaborator

Fixes #6951
Part of the A1 + B1 ruling on that card; the A half (TextSchema.value) is PR #7761, which carries the closing line for its folded member card and only refs this card. This is the B half — the card closes when both are on main, and this PR is the one that closes it.

⚠️ Draft + needs:contract-review on purpose. This narrows a published validator's accept set (Clause-② yes); the dispatching seat reviews at tier before it lands. Please do not mark ready or enable auto-merge.

The ruling

Maintainer ruling B1 (2026-09-04, director record on #6951, batch #25), verbatim as recorded: "B1: retire data, nodes is the only inline spelling … So B1 as recorded = retire data; nodes stays optional; no refinement." The batch text's 「nodes 必填」 was swapped by the director under the 2026-09-03 seat discipline because a bind-only tree-view is a legal, rendering document (packages/components/src/renderers/__tests__/shadowed-renderer-behaviour.test.tsx, { type: 'tree-view', bind: 'treeNodes' }) and bind is the FIRST source the renderer reads. ⛔ nodes is NOT made required here and no two-limb presence refinement is added; both are pinned as legal documents.

Premise re-measured on the current main before editing

On origin/main = 3e377c93 (cut), 53ded82b and 2760075f (merged before opening, in that order): packages/types/src/data-display.ts:1289 data?: TreeNode[] (optional since PR #7533) and :1305 nodes?: TreeNode[] inside TreeViewSchema (:1270); packages/types/src/zod/data-display.zod.ts:338 data: z.array(TreeNodeSchema).optional() / :340 nodes: … .optional(); packages/components/src/renderers/data-display/tree-view.tsx:105 const rawNodes = boundData || schema.nodes || schema.data || [];. data was NOT already a tombstone — the retirement is a tombstone on an existing optional member, as the ruling read it. (data-display.ts:1439 / data-display.zod.ts:399 carry a same-file precedent: ChartDataSeries.data, tombstoned by objectui#6896.)

The corpus (rewrite list, with the denominator — the ruling has no majority clause for B): the same walker as PR #7761 (object literal whose OWN type key is tree-view), over examples/, apps/, the examples/ directories under packages/, content/docs/** (939 files): 10 tree-view nodes — 6 nodes-only, 3 data-only, 1 both. Of the data-bearing four: packages/types/examples/data-display-examples.json#examples.tree-view and the content/docs/api/schema-reference.md:512 JSON fence author data and are rewritten to nodes; the other two are probes inside examples/schema-catalog/test/tree-view-nodes-mirror-6939.test.tsx (data: 'not-an-array' and a both-spellings carrier), flipped below. The six on nodes: the four components-data-display-tree-view/* catalog entries, the nested tree in components-complex-resizable/editor-interface.json, and a nodes-only probe in that same test. In-repo tests separately (2349 files): 9 tree-view literals — the #7533 pin (NODES_ONLY_DOCUMENT + two BaseSchema controls on data, which stay as controls), the #6150 control document (data: []nodes: []), and the three mirror-test probes. Package sources (packages/*/src, 1684 files): 0 tree-view literals. skills/**: no tree-view fence authors either key. Grep cross-check: "type": "tree-view" under the four roots — 7 files on base, the two data sites now 0.

The retirement — both faces, and the read

  • TS face (packages/types/src/data-display.ts, TreeViewSchema block only): data?: never with the house-form @deprecated RETIRED docblock pointing at nodes and noting bind stays the first-read source; nodes's docblock no longer narrates the three-limb read. TreeNode.data?: any (the per-node payload, :1265) and ChartDataSeries.data are other members — untouched, the former pinned as the control.
  • Zod face (packages/types/src/zod/data-display.zod.ts, TreeViewSchema const only): data: retirementTombstone('RETIRED (objectui#6951) — datais no longer part of TreeViewSchema; writenodes(or bind the tree withbind). …'); nodes's describe rewritten without the three-limb narrative.
  • Renderer (tree-view.tsx:105): boundData || schema.nodes || schema.data || []boundData || schema.nodes || []. Nothing else in the file.
  • The BaseSchema.data trap, measured (the PM's mechanism assumption): BaseSchema declares data?: any / z.any().optional() and is .passthrough(), so a DELETED member would ADMIT an authored data unvalidated through the base (PR fix(types): tree-view mirror stops requiring the limb it reads third (group 2 of objectui#6939) #7533's body explains this; its pin measured it). The tombstone on the extended schema SHADOWS the base member, and the new pin proves it rather than assumes it: on the same document { type: 'tree-view', data: [...] }, BaseSchema.safeParse succeeds with the array surviving while TreeViewSchema.safeParse refuses at path data, and safeValidateSchema (the AnyComponentSchema union entry) refuses with the guidance inside the invalid_union envelope; on the TS face the same literal is a legal BaseSchema and an @ts-expect-error on TreeViewSchema (a declared never member wins over both the inherited any and the index signature).
  • Boundary, unchanged: nested nodes under SchemaNodeSchema are validated against BaseSchemaCore, not the union — the same reach every tombstone in this package has.

Corpus rewrite

  • packages/types/examples/data-display-examples.json#examples.tree-view: datanodes (targeted key rename; the file is not JSON.stringify-canonical, so no re-serialisation; verified by parse: keys type, id, nodes, multiSelect, showLines). A different region from PR fix(types): lift the flex example's direction/gap out of the inert props envelope #7729's compositeExample.
  • content/docs/api/schema-reference.md:517: "data": ["nodes": [ in the TreeViewSchema fence.
  • content/docs/components/data-display/tree-view.mdx: the data?: TreeNode[]; // Tree data (alias for nodes) row removed, nodes row reworded, a retirement note after the schema fence quoting the refusal and stating that bind is unchanged, nodes stays optional, and TreeNode.data is a different member.

Pins

  • PR fix(types): tree-view mirror stops requiring the limb it reads third (group 2 of objectui#6939) #7533's pins flipped in place (tree-view-data-optional-6939.test.ts): the type-level pin becomes an Equal of TsTreeViewSchema['data'] with undefined (still red if the member is DELETED — it would resolve to the inherited any); "the accept set only WIDENED" → every data document refused at path data; "element-level enforcement" → refused at the KEY with the guidance (the tombstone, not element validation); the passthrough control's carrier moves from data: [] to nodes: []; the read-site pins now assert boundData || schema.nodes || [], no schema.data in the file, and bind read ahead of nodes. The relaxation's still-true pins — nodes-only legal, a bare { type: 'tree-view' } legal (no refinement), BaseSchema alone admits both refused values — stay, with a header note.
  • Catalog mirror test flipped (tree-view-nodes-mirror-6939.test.tsx): "correcting it to data changes no pixel" → spelling it data now draws an EMPTY tree (title still on screen, every root label gone — the enforce-or-remove half measured through the DOM); "both spellings validate" → only nodes validates, data refused by name on the direct schema and on the union door; the DECLARED-keys carrier is nodes-only.
  • finding(types): 13 top-level schema keys that component renderers genuinely READ are declared by no shipped type — measured across all 76 content/docs/components pages #6150 (undeclared-but-consumed-keys-6150.test.ts): TREE_CONTROL is { type: 'tree-view', nodes: [] } and the nodes case's read text is boundData || schema.nodes || [].
  • New pin packages/types/src/__tests__/tree-view-data-retired-6951.test.ts (18 tests): zod half — a well-formed array and [] refused at path data with invalid_type / expected: never, message names nodes and bind and equals the .describe(), the union door refuses with the guidance and accepts the nodes-only and bind-only documents, BASE CONTROL (BaseSchema accepts the same document), key still DECLARED; inside the boundary — nodes-only parses and survives, bind-only parses (pinned explicitly as the document a two-limb refinement would have refused), bare { type: 'tree-view' } parses, wrong-typed nodes still refused, TreeNode.data control accepted, undeclared key rides passthrough; corpus — tree-scoped walk of every JSON under examples/schema-catalog/src/schemas and packages/types/examples (six tree-view nodes; floor 6) asserting none spells data and each parses; renderer — read set off disk (boundData || schema.nodes || [], no schema.data, bind read before nodes); TS half — @ts-expect-error on the member type, the fresh literal (with the BaseSchema base control compiling beside it) and a widened value; nodes, bind and TreeNode.data compile.
  • Parity ledger: no row — the ?: never / retirementTombstone() pair does not drift; tree-view's only ledger entry stays RuntimeOnlyDeclared → onNodeClick. ⛔ MIRRORS / EXCLUSIONS untouched; PR test(types): watch the mirror-wider-than-declared direction with a fifth parity ledger #7758's WiderThanDeclared region is not needed here.

Verification (exit codes captured before any pipe; heavy runs through the shared verify lock; every reading on the head named)

command exit head verdict line
pnpm --filter '@object-ui/components^...' --filter @object-ui/types build (lock) 0 3e377c93+diff VERDICT command-exit 0 · held the lock 28s (dist verified on disk for types/core/react/react-runtime/sdui-parser/i18n)
pnpm exec vitest run --maxWorkers=2 packages/types/ packages/components/ examples/schema-catalog/test/tree-view-nodes-mirror-6939.test.tsx examples/schema-catalog/test/safe-validate-corpus-6318.test.ts scripts/__tests__/check-doc-component-types.test.ts scripts/__tests__/doc-version-claims.test.ts (lock) 1 db4c848e (pre-merge) Test Files 2 failed, 357 passed (359) · Tests 2 failed, 4371 passed (4373) — both failures my own: the new pin's non-vacuity floor (7 written, 6 measured) and the mirror probe reading the guidance off the union envelope instead of the arm; fixed in 80aae7cb
pnpm --filter @object-ui/types build && pnpm exec vitest run --maxWorkers=2 packages/types/ …tree-view-nodes-mirror-6939… …safe-validate-corpus-6318… …shadowed-renderer-behaviour… …skill-guide-data-table-binding… (lock; after merging origin/main = 53ded82b) 0 80aae7cb Test Files 126 passed (126) · Tests 2147 passed (2147) · VERDICT command-exit 0 · held the lock 26s
pnpm --filter @object-ui/types type-check · pnpm --filter @object-ui/components type-check 0 · 0 80aae7cb, re-run on af691923 clean
pnpm exec vitest run --maxWorkers=2 packages/types/ …tree-view-nodes-mirror-6939… …shadowed-renderer-behaviour… (lock; after merging origin/main = 2760075f, so PR #7758's fifth parity ledger runs against this tombstone) 0 af691923 (final head) Test Files 124 passed (124) · Tests 2126 passed (2126) · VERDICT command-exit 0 · held the lock 20s
pnpm --filter @object-ui/types lint · @object-ui/components lint · @object-ui/example-schema-catalog lint (each eslint .) 0 ×3 db4c848e 0 errors each (268 / 925 pre-existing warnings, none on a touched line)
node scripts/check-changeset-presence.mjs 0 80aae7cb, re-run on af691923 ✅ 6 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s): .changeset/6951-tree-view-data-retired.md
node scripts/check-changeset-fixed.mjs · check-changeset-no-major.mjs · check-changeset-overwrite.mjs 0 · 0 · 0 db4c848e ✅ All workspace packages are in the changeset fixed group · ✅ No changeset declares a major bump · ✅ No pre-existing changeset was modified or deleted
node scripts/check-control-bytes.mjs · pnpm check:spec-symbols 0 · 0 80aae7cb ✅ check-control-bytes: OK (scanned 6326 tracked text file(s)) · ✅ spec member citations: no comment cites a key its spec symbol does not declare
pnpm check:doc-types · pnpm check:doc-fences · node scripts/check-doc-links.mjs 0 · 0 · 0 db4c848e ✅ Every documented component type is registered · ✅ check:doc-fences … · Links are valid across 17 scan roots
pnpm check:unreferenced-sources · check:i18n-keys · check:i18n-drift · check:element-data-source-declaration · check:action-forward-parity · check:designer-field-key-parity · check:phantom-deps · check:self-import · check:side-effects-array · check:entry-guard · check:icon-record-names · check:skills-paths · check:shell-escape-residue · check:docs-route-closure 0 ×14 db4c848e green (the lint.yml / ci.yml families reading a touched path; derived by hand from .github/workflows/*)
governed-surface predicate: node scripts/pm/check-governed-merges.mjs --test … (objectstack, final 11-path list — unchanged by the second merge) 0 80aae7cb 0 of 11 path(s) hit the register … NOT governed

Narrowing declared: the full packages/components/ suite ran green in the pre-merge lock run (db4c848e); the post-merge run re-ran packages/types/ (where the merged commits — PR #7737 chart-series, #7739 chatbot — land) plus the four tree-view-relevant files, because git diff --stat 3e377c93 origin/main -- packages/components examples/schema-catalog is EMPTY — none of the merged commits (#7754, #7757, #7758) touches either tree; the one packages/types change among them is #7758's parity-ledger test, which the post-merge packages/types/ run covers. CI runs the farm.

NOT MEASURED (precondition exits, not verdicts): pnpm check:doc-snippets / pnpm check:skill-examples (26-package build closure, not built on this shared box) — this diff touches no ts / tsx fence anywhere (the two doc edits are a json fence and a plaintext fence, which those gates do not compile) and no skills/** file, and the census found no doc or skill fence authoring tree-view.data on a typed literal, so the tombstone cannot move either gate's verdict; pnpm check:readme-exports / check:sdui-registration-pins (need app-shell dist / a console build). CI runs all four on the farm.

Ablation (red-first; each leg mutate → prove on disk by blob hash and anchor counts → run → git checkout HEAD -- ABSOLUTE PATH → prove restored by blob hash == HEAD blob; trap on EXIT INT TERM; final git diff HEAD empty)

  • Leg A — zod face (data back to z.array(TreeNodeSchema).optional(); anchors data: retirementTombstone( in the TreeViewSchema region 1→0, marker 0→1): the pin file → exit 1, 6 failed / 12 passed — both refusal cases, the guidance case, the safeValidateSchema case, the BASE CONTROL (the base and the extended schema now AGREE, which is the failure) and the DECLARED case; every inside-the-boundary, corpus, renderer and TS-erased leg stays green.
  • Leg B — TS face (TreeViewSchema.data?: neverdata?: TreeNode[], block-anchored so the pre-existing ChartDataSeries.data tombstone in the same file stays put; anchors data?: never 2→1, marker 0→1): tsc -p tsconfig.test.jsonexit 2TS2578 Unused '@ts-expect-error' on exactly the three directives (:303, :323, :343), TS2344 on the flipped fix(types): tree-view mirror stops requiring the limb it reads third (group 2 of objectui#6939) #7533 type pin (tree-view-data-optional-6939.test.ts:96), and zod-mirror-parity.test.ts(1524): TS2322 '"data-display.zod.ts#TreeViewSchema"' is not assignable to type 'never' — the existing ledger catching the one-face drift. (A first attempt anchored on the bare member text did NOT land — the anchor matched twice — and was reported by the script's on-disk check rather than read as a pass; the re-run above is the reading.)
  • Leg C — renderer (boundData || schema.nodes || []boundData || schema.nodes || schema.data || []; anchors 1→0 / 0→1): pin + tree-view-data-optional-6939 + undeclared-but-consumed-keys-6150 + the catalog mirror test → exit 1, 7 failed / 121 passed — the off-disk read-set pin, the flipped fix(types): tree-view mirror stops requiring the limb it reads third (group 2 of objectui#6939) #7533 read pin, finding(types): 13 top-level schema keys that component renderers genuinely READ are declared by no shipped type — measured across all 76 content/docs/components pages #6150's read-site pin, and the four "spelling it data now draws an EMPTY tree" cases (the tree draws again once the limb is read — the DOM half of enforce-or-remove going red-first).
  • All three restored: blob hashes equal HEAD's, git diff HEAD empty, git status clean.

ADR-0087 disposition marker — the gate's own reading

Same reading as PR #7761, re-taken on this tree: grep of scripts/check-changeset-*.mjs (4 scripts), scripts/__tests__/*, .github/workflows/* and .changeset/README.md for adr-0087 / disposition finds no gate that reads a changeset or PR-body marker (hits: a prose entry in scripts/__tests__/doc-version-claims.test.ts, a comment in changelog.yml); objectstack's check:adr-0087-registration has no objectui counterpart. The four changeset gates ran green. No marker was added; if the reviewing seat wants one, say which gate should read it.

Deviations (declared, not silent)

  1. The dispatch run was interrupted at ~13:36Z (HTTP 429) and resumed at 15:26Z; PR A was finished first as ordered; this worktree was cut from 3e377c93 and origin/main was merged twice before opening per the PM's notices — 53ded82b (carrying finding(types): series chartType is undeclared and SILENTLY STRIPPED - the normalizer reads it first, measured not live, alias-refusal owed #7694 / PR feat(types): refuse chartType on a chart series by name, pointing at type #7737 and finding(types/plugin-chatbot): chatbot-floating declares two keys nothing reads - displayMode (designer control included) and FloatingChatbotConfig.triggerIcon #7654 / PR feat(types)!: retire ChatbotSchema.displayMode as an ADR-0049 tombstone; remove the Display Mode control and seed (objectui#7654) #7739 in data-display.* and complex.*), then 2760075f (PR test(types): watch the mirror-wider-than-declared direction with a fifth parity ledger #7758's parity ledger; this PR adds no ledger row and does not touch that file).
  2. The examples/schema-catalog/test/tree-view-nodes-mirror-6939.test.tsx flips and the undeclared-but-consumed-keys-6150.test.ts control document are outside the claim's literal file list but inside "existing pins that assert data accepted flipped" — they were the pins asserting it.
  3. check:doc-snippets / check:skill-examples / check:readme-exports / check:sdui-registration-pins NOT MEASURED locally (above), with the reason the first two cannot be moved by this diff.

Out of scope — observed, not touched

Session: https://claude.ai/code/session_01BAZFhALsQsGqxui8sNqM8s

🤖 Generated with Claude Code

https://claude.ai/code/session_01BAZFhALsQsGqxui8sNqM8s


Generated by Claude Code

os-justin and others added 4 commits September 5, 2026 16:01
…odes` is the only inline spelling (objectui#6951 B1)

`TreeViewSchema` declared two spellings for its one inline-nodes slot:
`nodes` (read second, after a `bind`-resolved value) and `data` (read
third), both declared by objectui#6150; `data` was required until
objectui#6939 / PR #7533 made it optional. Maintainer ruling B1
(2026-09-04): retire `data`; `nodes` stays optional; no presence refinement
(a `bind`-only tree-view is a legal, rendering document).

`BaseSchema` declares `data?: any` / `z.any().optional()`, so deleting the
member would ADMIT the key unvalidated; the retirement is a tombstone on
the extended schema that shadows the base member, and the base-vs-extended
contrast is pinned on both faces.

- `data?: never` on the interface, `retirementTombstone()` named refusal on
  the Zod mirror (message names `nodes` and `bind`); `nodes` docblocks and
  describe rewritten without the three-limb narrative
- tree-view.tsx reads `boundData || schema.nodes || []`
- packages/types/examples/data-display-examples.json and the
  content/docs/api/schema-reference.md fence spell `nodes`; docs row
  replaced by a retirement note
- PR #7533's pins that asserted `data` accepted flipped to refusal in place;
  the catalog mirror test's data-spelling probes flipped; #6150 control
  document moves to `nodes: []`
- new pin tree-view-data-retired-6951: both faces refuse, the union entry
  carries the guidance, BaseSchema alone accepts the same document (both
  faces), `nodes`-only / `bind`-only / bare document parse, TreeNode.data
  control, tree-scoped catalog absence, renderer read set off disk, tsc legs
- changeset (types/components minor)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BAZFhALsQsGqxui8sNqM8s
…e mirror probe reads the arm-level issue

The first run counted the JSON population as seven; the walk finds six
(four catalog entries, the nested tree in editor-interface.json, and the
types example). The catalog mirror test's `data`-spelling probe asserted the
guidance on the union door's top-level issue, which is the invalid_union
envelope; it now reads the `data` path issue off TreeViewSchema.safeParse
and keeps the union-door refusal as a separate check.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BAZFhALsQsGqxui8sNqM8s
@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3187.0 KB 3191.4 KB
Main entry chunk (gzip) 143.2 KB 350 KB
Entry file index-oAAZCTJI.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) 15.67KB 5.75KB
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) 5.13KB 2.35KB
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) 510.62KB 116.20KB
core (index.js) 6.96KB 2.79KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 182.08KB 50.62KB
fields (index.js) 242.44KB 61.25KB
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) 4.28KB 1.75KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
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.98KB 10.98KB
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) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 11.71KB 4.29KB
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) 5.12KB 1.74KB
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) 15.75KB 3.80KB
plugin-calendar (index.js) 47.87KB 13.31KB
plugin-charts (index.js) 70.92KB 19.75KB
plugin-chatbot (index.js) 196.19KB 46.37KB
plugin-dashboard (index.js) 132.87KB 34.68KB
plugin-designer (index.js) 212.86KB 43.19KB
plugin-detail (index.js) 250.55KB 64.06KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 132.87KB 32.66KB
plugin-gantt (index.js) 167.26KB 41.00KB
plugin-grid (index.js) 209.29KB 56.78KB
plugin-kanban (index.js) 52.71KB 14.55KB
plugin-list (index.js) 113.28KB 27.59KB
plugin-map (index.js) 20.44KB 6.78KB
plugin-markdown (index.js) 13.93KB 4.81KB
plugin-report (index.js) 43.59KB 11.97KB
plugin-timeline (index.js) 30.84KB 8.85KB
plugin-tree (index.js) 9.20KB 3.19KB
plugin-view (index.js) 85.24KB 20.94KB
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) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 5.41KB 2.34KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 4.93KB 2.24KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 10.35KB 3.60KB
types (ai.js) 0.20KB 0.17KB
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.74KB 1.41KB
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 (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

needs:contract-review cleared (2026-09-05T16:34Z) — provenance: in-seat contract review at tier PASSED on head af691923, recorded on the card as objectui#6951 comment 5553215517 (carries the Implemented-by: / Reviewed-by: pair and the three-item judgment for this B half). Cleared by the domain:spec execution seat, session session_01BAZFhALsQsGqxui8sNqM8s, via read-current → write-union-minus-target → read-back (read-back at 16:34Z: four labels, the carrier absent). The flip waits for every check run on af691923 to complete green (Type Check and the four test shards were still in progress at 16:31Z). If this head moves, the label is re-hung and the delta re-reviewed before any flip.


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants