Skip to content

feat(types)!: retire TextSchema.value as an ADR-0049 tombstone — content is the one spelling (objectui#6951 A1 / objectui#7016) - #7761

Merged
os-justin merged 5 commits into
mainfrom
claude/issue-6951-text-content-only
Sep 5, 2026
Merged

feat(types)!: retire TextSchema.value as an ADR-0049 tombstone — content is the one spelling (objectui#6951 A1 / objectui#7016)#7761
os-justin merged 5 commits into
mainfrom
claude/issue-6951-text-content-only

Conversation

@os-justin

Copy link
Copy Markdown
Collaborator

Fixes #7016
Refs #6951 (A half — TextSchema; the B half, TreeViewSchema.data, is its own PR and the card stays open until both are on main)

⚠️ 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 A1 (2026-09-04, director record on #6951, batch #25), verbatim: "A1: retire value, keep content … Retirement is immediate, no deprecation window (maintainer 2026-08-27: 「项目在创业阶段,用户也很少,短期不考虑渐进。」). Existing value-only documents are not a reason to stage it." — premise-bound: the dev measures the content-only / value-only / both distribution first and STOPS if value is the majority. It is not (below), so the retirement is carried out as ruled.

Measurement — the ruling's premise, taken before any edit

A text node is an object literal whose OWN type key is the string text (not element:text, not other schemas carrying a value member). Walker: a tokenizer over JSON files, TS/TSX object literals and the fenced code blocks of md/mdx, recording each such object's depth-1 keys and its parent key; declaration contexts (interface / type bodies) excluded; objects classified by KIND from their keys and position — sdui-text (the population the ruling is about), field-descriptor ({ value, label, type: "text" } under fields[], where type is a FIELD type and value the field key — the filter-builder catalog entries), ai-sdk-part (output: { type: 'text', value } tool-result envelopes). Tree read at origin/main = 9587fc95 (dispatch base, before the merge); re-verified unchanged on the merge-base 83c77dc3 by grep (below).

The four ruling-named roots, sdui-text kind (examples/, apps/, the examples/ directories under packages/ = packages/types/examples + packages/plugin-charts/examples, content/docs/**; 939 files scanned):

root text nodes content-only value-only both neither
examples/ 688 674 13 0 1
apps/ 79 59 0 0 20
packages/*/examples 1 0 1 0 0
content/docs/** 59 43 11 0 5
total 827 776 25 0 26

Raw, all kinds, same roots: 947 objects — 776 / 39 / 0 / 132; the 14 extra value-only are the filter-builder field descriptors (all under fields[], keys value,label,type), the 106 extra neither are form/field descriptors. Verdict on the premise: content by 30 : 1 — no stop.

In-repo tests and fixtures, separately (packages/**/__tests__, packages/**/*.test.ts*, **/test/; 2314 files): sdui-text 634 — 45 / 25 / 0 / 564; ai-sdk-part 6 (all value); field-descriptor 885 (16 value). Of the 25 sdui-text value-only hits: 13 are AI-SDK / MCP tool-result envelopes in plugin-chatbot and app-shell (unwrapToolResult, isProposalResult, detectReplayOutcome — a different vocabulary, untouched); 7 are real text nodes and were rewritten (span-children-rendering ×3, span-value-fallback ×2, undeclared-but-consumed-keys-6150's NODE fixture) or flipped (basic-renderers "value as alias"); 1 keeps authoring value deliberately as the retired-key probe (bindable-text-keys-4795, now asserting nothing reaches the DOM); 4 are left as they are with a reason — a LOCAL interface TextSchema fixture in packages/react (ComponentRendererProps.reconciliation, its own declaration), a generic CoreSchemaNode literal (SchemaNode.reconciliation), the packages/react carriage-map probe pin (SchemaRenderer.bindableTextKeys:155, about the memo, passes unchanged), and a negative fixture for the retired block type (phase2-schemas:329, refused either way).

Non-test package sources (packages/*/src, outside the ruling roots, scanned because a producer of the dialect inside the renderer package would ship a blank): 7 real producers — components/.../overlay/context-menu.tsx:95 (the built-in fallback trigger node), plugin-dashboard DashboardGridLayout.tsx:360, DashboardRenderer.tsx:790 and :803, legacyRetiredWidget.ts:56 (placeholder text nodes whose wording is pinned through the rendered DOM), and three published README samples (components, react, types/src/zod); plus 3 hast / AI-SDK objects that are not SDUI nodes (plugin-markdown/MarkdownImpl.tsx:105, plugin-chatbot/elements/code-block.tsx:53, app-shell/hooks/useChatConversation.ts:590, untouched).

Grep cross-checks (single-line forms, git grep -c summed): content/docs/** fences spelling text + value: 8 on 83c77dc3, 0 on this head; "type": "text" objects in the catalog on base: 701 (the walker's 688 sdui-text + the descriptors); packages/*/src non-test type: 'text', value on this head: 8 hits, all of them the hast / AI-SDK objects above or comments describing that envelope.

The retirement — both faces, and the read

  • TS face (packages/types/src/layout.ts, TextSchema block only): value?: never with the house-form @deprecated RETIRED docblock; content's docblock no longer says it "wins over value" and names the two read sites as {schema.content}. The value?: string members of TextSpanSchema (:66) and TabsSchema (:414) are other schemas' contracts — untouched, and pinned as the control.
  • Zod face (packages/types/src/zod/layout.zod.ts, TextSchema const only): value: retirementTombstone('RETIRED (objectui#6951) — valueis no longer part of TextSchema; writecontent. …') — one string feeding both the parse-time message and .describe(); content's describe no longer references the retired limb.
  • Renderer (packages/components/src/renderers/basic/text.tsx:162 and :167): {schema.content || schema.value}{schema.content} at BOTH arms.
  • Why a tombstone, not a deletion: BaseSchema is .passthrough() / carries [key: string]: any, and the renderer no longer reads value, so a deleted member would make an authored value accepted, unvalidated and rendered as a blank. Pinned live as the "deleted row" control.
  • Boundary, unchanged by this PR: SchemaNodeSchema validates nested nodes against BaseSchemaCore, not AnyComponentSchema, so the refusal bites at the node's own validator (TextSchema.safeParse) and at the union entry (safeValidateSchema on a top-level text node), and on the TS face wherever a literal is typed. A text node nested under a content / children slot is not deep-validated today — the same reach every tombstone in this package has.

Corpus rewrite — every value-authoring text node found above

No document authored both keys, so no "content wins" tie-break was needed anywhere; every rewrite is a rename with the string unchanged.

  • examples/schema-catalog/src/schemas/ (9, JSON-aware rename, byte-identical formatting round-trip): components-data-display-kbd/inline-usage.json ×2 · components-feedback-spinner/loading-button.json · components-form-date-picker/date-range-selector.json · components-form-input-otp/verification-form.json · components-overlay-hover-card/basic-hover-card.json · components-overlay-sheet/basic-sheet.json · left-side.json · right-side.json
  • examples/schema-catalog/test/overlay-trigger-mirror-6939.test.tsx ×4 · packages/types/examples/zod-validation-example.ts ×1
  • content/docs/ (11): core/enhanced-actions.mdx ×2 · guide/architecture.md ×2 (the doc-snippet: fragment contrast pair — Hello, John! and Hello, ${user.name}!; the second was an expression site PR docs: teach content as text's expression channel, not value (29 occurrences, not 23) #7114 / docs: expressions/architecture guides teach text.value for expressions — switch all 23 occurrences to content, the ruled sole evaluation channel (objectstack#13670 option 2) #7015 left) · guide/layout.md ×2 · guide/schema-rendering.md ×5; components/basic/text.mdx row value?: string; // Alias for content replaced by a retirement note quoting the refusal; components/basic/span.mdx comment no longer cites text's content over value precedence
  • READMEs (3): packages/components/README.md:95 · packages/react/README.md:29 · packages/types/src/zod/README.md:272
  • Producers (5 sites, 4 files): context-menu.tsx:95; plugin-dashboard ×4 (wording unchanged, still pinned by the legacyRetired suites through the DOM)
  • Docblocks (comment-only, 3 files): packages/types/src/base.ts:477 example, packages/types/src/overlay.ts:598 read-site quote, span-value-fallback.test.tsx precedence rationale dated to before this card

#7015 status checked: landed as PR #7114 (29 expression occurrences); the 11 doc sites above are plain-string value and were outside its scope.

Pins

  • 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 pins (undeclared-but-consumed-keys-6150.test.ts): the TextSchema.content case follows the read site (readText: '{schema.content}') and the shared NODE fixture spells content; the file had no case asserting value accepted — the acceptance lived in the renderer pins below.
  • Component pins flipped (basic-renderers "should support value property as alias" → nothing from the retired key reaches the DOM; bindable-text-keys-4795 "text.value is still not evaluated" → neither evaluated nor read back).
  • New pin packages/types/src/__tests__/text-value-retired-6951.test.ts (18 tests): zod half — three authored values refused at path value with invalid_type / expected: never, the message names content and equals the .describe(), the same node refused through safeValidateSchema with the guidance inside the invalid_union envelope, key still DECLARED; inside the boundary — content parses and survives, { type: "text" } parses, content: 42 still refused, TextSpanSchema.value (the layout.ts:66 sibling) still accepted and survives, an undeclared key still rides passthrough; corpus — tree-scoped walk of every JSON under examples/schema-catalog/src/schemas and packages/types/examples (descriptor arrays skipped by position; non-vacuity floor 500 nodes) asserting no text node spells value and each parses; renderer — text.tsx read set off disk (schema.value absent, {schema.content} ×2) and the context-menu producer spelling; TS half — @ts-expect-error legs on the member type, the fresh literal and a widened value, TextSpanSchema control compiles.
  • Parity ledger: no row. The ?: never / retirementTombstone() pair does not drift (undefined meets undefined); ablation leg B shows the existing ledger reddening layout.zod.ts#TextSchema (TS2322) the moment only one face moves, so the lockstep is already enforced without a row. ⛔ MIRRORS / EXCLUSIONS untouched.

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/plugin-dashboard^...' --filter '@object-ui/components^...' --filter @object-ui/types build (lock) 0 9587fc95+diff VERDICT command-exit 0 · held the lock 98s
pnpm exec vitest run --maxWorkers=2 packages/types/ packages/components/ packages/plugin-dashboard/ packages/react/src/__tests__/SchemaRenderer.bindableTextKeys.test.tsx examples/schema-catalog/test/ (lock) 1 588c0c8f (pre-merge) Test Files 1 failed, 471 passed (472) · Tests 1 failed, 7103 passed (7104) — the one failure was the new pin's own walker counting the 14 filter-builder descriptors; fixed in 2c188f09
pnpm --filter @object-ui/types build && pnpm exec vitest run --maxWorkers=2 packages/types/ packages/components/ packages/plugin-dashboard/ packages/react/src/__tests__/SchemaRenderer.bindableTextKeys.test.tsx examples/schema-catalog/test/overlay-trigger-mirror-6939.test.tsx scripts/__tests__/check-doc-component-types.test.ts scripts/__tests__/doc-version-claims.test.ts (lock) 0 2c188f09 (post-merge) Test Files 449 passed (449) · Tests 5160 passed (5160) · VERDICT command-exit 0 · held the lock 542s
pnpm exec vitest run --maxWorkers=2 scripts/__tests__/check-doc-snippet-types.test.ts scripts/__tests__/check-readme-exports.test.ts scripts/__tests__/check-doc-links.test.ts (lock) 0 2c188f09 Test Files 3 passed (3) · Tests 278 passed (278)
pnpm --filter @object-ui/types type-check (tsc --noEmit && tsc -p tsconfig.examples.json && tsc -p tsconfig.test.json) 0 2c188f09, re-run on a80deb15 and on the final head d4de1ca4 clean
pnpm --filter @object-ui/components type-check · pnpm --filter @object-ui/plugin-dashboard type-check 0 · 0 2c188f09 (components re-run on d4de1ca4) clean
pnpm --filter @object-ui/types build && pnpm exec vitest run --maxWorkers=2 packages/types/ packages/components/src/__tests__/basic-renderers.test.tsx …bindable-text-keys-4795… …span-value-fallback… …span-children-rendering… (lock; after merging origin/main = 3e377c93, so #7736's layout-default-jsdoc-7361 pin runs on the merged layout.ts) 0 d4de1ca4 (final head) Test Files 126 passed (126) · Tests 2132 passed (2132) · VERDICT command-exit 0 · held the lock 33s
pnpm --filter @object-ui/types lint · @object-ui/components lint · @object-ui/plugin-dashboard lint · @object-ui/example-schema-catalog lint (each eslint ., the population CI's Lint job runs) 0 ×4 588c0c8f+diff 0 errors each (268 / 924 / 426 pre-existing warnings, none on a touched line)
node scripts/check-changeset-presence.mjs 0 d4de1ca4 ✅ 16 source file(s) of 3 released package(s) changed, and this change declares 1 changeset(s)
node scripts/check-changeset-fixed.mjs · check-changeset-no-major.mjs · check-changeset-overwrite.mjs 0 · 0 · 0 2c188f09 ✅ 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 0 a80deb15 ✅ check-control-bytes: OK (scanned 6318 tracked text file(s))
pnpm check:spec-symbols 0 a80deb15 ✅ 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 2c188f09 ✅ Every documented component type is registered · ✅ check:doc-fences — every TypeScript block in 227 document(s) is fenced ts/tsx/typescript … · 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 2c188f09 green (the families lint.yml / ci.yml run that read a path in this diff; derived by hand from .github/workflows/* — the objectstack dispatch-gates.mjs derivation is objectstack-only and does not answer for this tree)
governed-surface predicate: node scripts/pm/check-governed-merges.mjs --test … (objectstack, on the final 35-path list at d4de1ca4) 0 0 of 35 path(s) hit the register … NOT governed

NOT MEASURED (precondition exits, not verdicts): pnpm check:doc-snippets → exit 2 PRECONDITION NOT MET (its --build-filter closure is 26 packages with ..., effectively the whole workspace; not built on this shared box); pnpm check:skill-examples → exit 2 (same closure; this diff touches no skills/** file, and the only skills/ fences spelling text.value are jsonc counter-examples, which that gate parses and does not schema-validate); pnpm check:readme-exports → exit 1 population COLLAPSED — run pnpm build first; pnpm check:sdui-registration-pins → exit 2 No console build to weigh. CI runs all four on the farm.

Narrowed measurement standing in for check:doc-snippets: the six touched non-fragment ts / tsx fences (content/docs/core/enhanced-actions.mdx:309, :399; content/docs/guide/schema-rendering.md:21; packages/components/README.md:86; packages/react/README.md:26; packages/types/src/zod/README.md:266; architecture.md:398 is a declared doc-snippet: fragment and is not compiled by the gate either) were extracted from the merge-base 83c77dc3 and from this branch and compiled with tsc --strict --noEmit (jsx: react-jsx, paths derived from each workspace package's exports[*].types, against the dist built above). Diagnostic sets are IDENTICAL before and after: five fences clean; the zod README fence reports the same pre-existing TS2304 Cannot find name 'CardSchema' on both sides (no import in that fence on base either). This diff moves no fence verdict.

Ablation (red-first evidence; 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 (value back to z.string().optional(); anchors value: retirementTombstone( 1→0, marker 0→1): the pin file → exit 1, 6 failed / 12 passed — the three refusal cases, the guidance case, the safeValidateSchema case and the DECLARED case; every inside-the-boundary, corpus, renderer and TS-erased leg stays green (that asymmetry is the point).
  • Leg B — TS face (value?: nevervalue?: string; anchors 1→0 / 0→1): tsc -p tsconfig.test.jsonexit 2TS2578 Unused '@ts-expect-error' on exactly the three directives (:300, :317, :337) plus zod-mirror-parity.test.ts(1522): TS2322 '"layout.zod.ts#TextSchema"' is not assignable to type 'never' — the existing ledger catching the one-face drift.
  • Leg C — renderer ({schema.content}{schema.content || schema.value} at both arms; anchors 2→0 / 0→2): pin + basic-renderers + bindable-text-keys-4795 + undeclared-but-consumed-keys-6150exit 1, 4 failed / 119 passed — the two flipped component pins, 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 off-disk read-set pin.
  • All three restored: blob hashes equal HEAD's, git diff HEAD empty, git status clean.

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

Grep of scripts/check-changeset-*.mjs (4 scripts: fixed, no-major, overwrite, presence), scripts/__tests__/*, .github/workflows/* and .changeset/README.md for adr-0087 / disposition: no gate in this repository reads a changeset or PR-body marker — the only hits are a prose entry in scripts/__tests__/doc-version-claims.test.ts (quoting a spec tombstone) and a comment in changelog.yml. objectstack's check:adr-0087-registration has no objectui counterpart. The four changeset gates ran (table above), all green. No marker was added — copying one from a sibling PR would be the deviation the ruling forbids; if the reviewing seat wants a marker, say which gate should read it.

Deviations from the dispatch's file surface (declared, not silent)

  1. The run was interrupted at ~13:36Z (account usage limit, HTTP 429) after the first full vitest pass and resumed at 15:26Z; nothing was reverted; origin/main merged twice before opening (83c77dc3, then 3e377c93 after the PM's notice that docs(types): align two layout @default docblocks with the renderer fallbacks #7736 touched layout.ts in another region).
  2. Surface expanded by the census: context-menu.tsx (a producer inside @object-ui/components — "nothing else in the package moves" was read as the renderer read site, and a fallback trigger that would render blank is the retirement's own consequence); three plugin-dashboard source files carrying four producer sites (none of their tests — the wording pins pass through the DOM unchanged); three READMEs; four component test files whose fixtures authored the retired key; two comment-only docblocks in packages/types/src/base.ts / overlay.ts. The changeset therefore also names @object-ui/plugin-dashboard: patch (the presence gate requires the declaration; behaviour is unchanged).
  3. 14 filter-builder field descriptors excluded from the measured population by kind (and by position in the pin's walker) — they spell type: "text" but are not text nodes.
  4. check:doc-snippets / check:skill-examples / check:readme-exports / check:sdui-registration-pins NOT MEASURED locally (above), differential fence measurement supplied.

Out of scope — observed, not touched

  • skills/objectui/guides/schema-expressions.md:47, :479, :485 teach { "type": "text", "value": … } as counter-examples with prose "value is read but never templated"; after this retirement the key is refused outright, so that prose is stale. skills/** is a governed surface (human merge) — handed back on the report, not edited here.
  • Comments still describing the old schema.content || schema.value read, in files this PR does not otherwise touch: packages/components/src/renderers/basic/span.tsx:131, examples/schema-catalog/test/catalog-authored-key-6805-6806.test.tsx:64, catalog-gallery-render.test.tsx:68, packages/react/src/__tests__/SchemaRenderer.bindableTextKeys.test.tsx:147 (its pin is about the carriage map and passes unchanged).
  • The B half (TreeViewSchema.data) — its own PR, as the ruling requires.

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 5 commits September 5, 2026 15:25
…ent` is the one spelling (objectui#6951 A1 / objectui#7016)

`TextSchema` declared two spellings for its one content slot: `content`
(read first) and `value` (the fallback limb of
`{schema.content || schema.value}` at renderers/basic/text.tsx:162 and :167),
both declared by objectui#6150, whose docblock called the pair "a dialect,
not a design" and deferred the choice to an ADR-0049 ruling. Maintainer
ruling A1 (2026-09-04): retire `value`, keep `content`, immediately.

The ruling's premise was measured before any edit, on the four roots it
named (examples/, apps/, the examples/ dirs under packages/, content/docs):
776 content-only text nodes, 25 value-only, 0 both -- `content` by 30:1.

- `value?: never` on the interface, `retirementTombstone()` named refusal
  on the Zod mirror (message names `content`), `content` docblocks rewritten
- text.tsx renders `{schema.content}` at both arms; the context-menu
  renderer's built-in fallback trigger node and plugin-dashboard's three
  placeholder text nodes spell `content` so they keep rendering
- every in-repo text node that authored `value` rewritten to `content`:
  9 catalog entries, packages/types/examples, 11 doc fences, 3 README samples,
  the catalog overlay-trigger test and four component tests
- #6150 pin follows the read site; two component pins that asserted `value`
  renders now assert nothing from the retired key reaches the DOM
- new pin text-value-retired-6951: both faces refuse, the union entry
  carries the guidance, `content` survives, TextSpanSchema.value control,
  tree-scoped catalog absence, renderer read set off disk, tsc legs
- docs row replaced by a retirement note; changeset (types/components minor,
  plugin-dashboard patch)

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

The first run of `text-value-retired-6951` reported 14 offenders that are
filter-builder `fields[]` descriptors (`{ value, label, type: "text" }` — a
FIELD type, not a text node), the same population the census excluded by
kind. The walk now skips descriptor arrays (`fields`, `columns`, `filters`,
`options`) so it measures text NODES.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BAZFhALsQsGqxui8sNqM8s
…he retired `text.value`

`base.ts`'s SchemaNode example and `overlay.ts`'s ContextMenuSchema.trigger
read-site quote spelled `{ type: 'text', value }`; the span precedence
comments described `content || value` as the live family precedent. All
now spell `content` or date the old read to before objectui#6951.

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) 3186.7 KB 3191.4 KB
Main entry chunk (gzip) 143.2 KB 350 KB
Entry file index-Dujg5Bdl.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.61KB 116.20KB
core (index.js) 6.96KB 2.79KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 180.00KB 50.20KB
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.88KB 34.69KB
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 d4de1ca4, recorded on the card as objectui#6951 comment 5553212632 (carries the Implemented-by: / Reviewed-by: pair and the three-item judgment for this A 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: seven labels, the carrier absent). If this head moves, the label is re-hung and the delta re-reviewed before any flip. The out-of-scope prose items from this PR's report are filed as objectui#7770 for triage.


Generated by Claude Code

@os-justin
os-justin marked this pull request as ready for review September 5, 2026 16:34
@os-justin
os-justin added this pull request to the merge queue Sep 5, 2026
Merged via the queue into main with commit 5ad86dd Sep 5, 2026
34 checks passed
@os-justin
os-justin deleted the claude/issue-6951-text-content-only branch September 5, 2026 16:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants