Skip to content

refactor(types): retire the inert node-recursion-point refinement, and repair the pin that read its shape (objectui#9659) - #9745

Merged
os-sales merged 1 commit into
mainfrom
claude/issue-9659-9639-post-pass-residuals
Sep 18, 2026
Merged

os-sales merged 1 commit into
mainfrom
claude/issue-9659-9639-post-pass-residuals

Conversation

@os-sales

Copy link
Copy Markdown
Collaborator

Fixes #9659

Clause-②: no

Carries the three in-scope non-blocking residuals an isolated at-tier contract review named on PR objectui#9639 (card objectui#8572). ⛔ That PASS is adopted verbatim and is not reopened; none of these changes it.

Every reading below was re-taken on this branch. ⛔ No figure is inherited from the card.


1 — a pin asserted the shape of a clause that can no longer fire

Reviewer's reading reproduced, with a lit control on the same instrument and the same corpus.

Document: a corpus-valid chatbot seed plus body: { model, temperature }, nested in card.body[]. Instrument: the flattened issue tree of AnyComponentSchema.safeParse, discriminating by issue code at the child's own body path — the arm's tombstone is invalid_type / expected: never, the clause re-issues BaseSchemaCore.shape.body's own refusal, which is invalid_union.

run arm tombstone at body.0.body clause-shaped issue at body.0.body
this branch's base 1 0
LIT CONTROL — the pre-objectui#9639 record arm rebuilt in place 0 2

The lit control is a real mutation, not an argument: ChatbotSchema.body restored to z.record(z.string(), z.unknown()).optional(), proven on disk (marker count 1 to 0, replacement 0 to 1, blob hash moved), rebuilt, proven to have reached dist/zod/index.zod.js, then restored with the blob hash back to HEAD's and git diff HEAD empty. ⇒ the zero above is a reading, not a broken instrument.

Why it cannot fire, enumerated over the guard's own branches. The clause runs only if the wrapped union parse SUCCEEDED, type === 'chatbot', and body !== undefined. Measured against ChatbotSchema directly:

body = record | node | node[] | string | number | boolean | null | [] | {}   -> ALL REFUSED
body = undefined                                                            -> accepted, and the clause returns early on it
[LIT CTRL] no `body` key at all                                             -> accepted

⇒ "reaches the clause" and "has a body to check" are disjoint, with no input in between.

Changed. defineNodeComponentUnion installs the component union as it stands. The read-back assertion that announces a zod which stopped keeping its option array by reference is untouched. The fill is LIVE leg is re-pointed from the wrapper's SHAPE (not.toBe the bare union, plus checks of length exactly 1) to the INSTALLATION: slot 0 holds the component union and not the pre-objectui#8344 base shape.

⚠️ The old leg carried a warning — ⛔ do not assert identity with the bare union, it would go green the moment the wrapper stopped being installed. That was correct WHILE a wrapper existed and retires with it; the new pin is proved failable by ablation B below.

Clause-②: no, and it is MEASURED

432 schema-catalog documents through safeValidateSchema, plus a 60-case sweep (three chatbot faces x ten body shapes x both depths) through AnyComponentSchema. Verdict lists before and after: diff exit 0, byte-identical. A clause that cannot fire cannot be narrowing anything, in either direction.


2 — a leg that could not fail

Vacuity measured, ⛔ not asserted. The old leg read JSON.stringify(issues) for the substring "body". The parent card.body[] slot puts "body" in the issue path for ANY refused child, so:

nested document refused OLD leg passes issues at body.0.body
off-spec icon (size: 'huge') yes true 0
unmirrored metric-card yes true 0
chatbot missing messages yes true 0
chatbot with a record body yes true 1

Three documents with nothing wrong at body satisfy the old assertion. ⇒ it was a green light wired to nothing.

Changed. The leg now reads the child's OWN path, and asserts the remedy reaches the author at DEPTH and not only at the root — a reading no other leg in the file makes. The three vacuity documents are pinned alongside it as CONTROLS that assert nothing at body.0.body AND that the old assertion holds anyway, so the discrimination is tested rather than described in prose.

Ablation legs

A — the thing the leg is supposed to catch. The chatbot body tombstone stops naming the remedy key (`requestBody` to some other key). On disk: old phrase 1 to 0, new phrase 0 to 1, blob hash moved; rebuilt; proven in dist.

x names `body` AT ITS OWN PATH one slot down, and carries the remedy there too   <- RED
x is REFUSED at the ROOT too                                                     <- RED
Tests  2 failed | 18 passed (20)

⚠️ Reported honestly: the ROOT leg co-fires on this mutation, because it reads the same remedy string at depth 0. What is unique to the repaired leg is the DEPTH and the exact path, which ablation B isolates.

B — the fill reverts to the pre-objectui#8344 base shape (nodeUnionOptions[0] installs BaseSchemaCore, with the read-back's expectation moved with it so the failure is silent rather than thrown). Runtime confirms slot 0 is no longer the component union.

x the fill is LIVE, and slot 0 holds the COMPONENT UNION   <- RED (item 1's re-pointed pin IS failable)
x names `body` AT ITS OWN PATH one slot down               <- RED
v is REFUSED at the ROOT too                               <- GREEN (depth isolated from root)
Tests  10 failed | 10 passed (20)

Restores proved, both legs. Blob hash equal to HEAD's and git diff HEAD empty for the mutated path; a trap ... EXIT INT TERM restore hook with an absolute repo root in every script; rebuilt after each restore and the marker re-checked in dist, so no mutated byte survives into a later measurement.


3 — a narrowing row that lost its same-face control

Measured on the body channel: ACCEPTED on chatbot-enhanced and chatbot-floating, REFUSED on chatbot.

The plain chatbot row of the objectui#9256 table lists children only. On the two twin faces that still means "body held out and live", with the same-face LIVE CONTROL proving it. On the plain face it no longer does — objectui#9639 had to re-point that control at a twin precisely because the plain face refuses body now, for objectui#8572's reason rather than this table's.

Changed: a line, ⛔ not a rewrite. A comment above the three chatbot rows records that the row is one-sided, that the absence of body means "not this card's to assert" rather than "still live here", and that the body half of the plain face is pinned by node-recursion-point-8344.test.ts. ⛔ No assertion in that table moved, and adding 'body' to the plain row is explicitly warned against: those assertions read objectui#9256's message, and the plain face's tombstone carries objectui#8572's — the row would go red on a true statement.


Changeset grade: patch, MEASURED

packages/types publishes dist, so the question is whether published bytes move. Built at this branch's base and at this head, same tree, same command:

dist/zod/index.zod.js    515,520 -> 516,078
dist/zod/base.zod.js      43,462 ->  44,370
dist/zod/base.zod.d.ts    31,334 ->  31,875
dist/zod/index.zod.d.ts 1,368,902 -> 1,369,310
the clause's own emitted source, in the shipped bundle:  present 1x -> 0x
  • POSITIVE CONTROL: neighbouring shipped content is present in both builds.
  • ABSENT CONTROL: a string in neither build reads 0 in both.
  • REPRODUCIBILITY CONTROL: two builds of the SAME source are byte-identical (diff -rq exit 0), so the delta above is this change and not build noise.

⇒ published bytes move, so an empty frontmatter would have been a false claim. Graded patch rather than minor, because the accept set is measured unmoved. ⛔ Never major (this repo's fixed group).

A pending changeset this change falsified, amended in the same pass

check:changeset-claims named 14 pending declarations that describe a file this change touches. Re-read; one had gone false. .changeset/8344-node-recursion-point-redirect.md says "the arm the recursion point installs carries a check that a nested chatbot node's body still fits the node slot", and its objectui#8572 amendment then says "the installed arm's check ... cannot rot". It has now moved, and that body publishes VERBATIM into the CHANGELOG. A second AMENDED note records it and states what did NOT move (the nested verdict, the accept set, "narrows at all 109, widens at none"). The bump level is unchanged (minor to minor); check:changeset-overwrite is report-only and flags the edit by design.

Two source prose sites this change falsified are amended in place, ⛔ not rewritten: zod/index.zod.ts's "wraps it rather than replacing it", and zod/base.zod.ts's note on the loose parameter bound (kept for the reason it records, with an AMENDED note that the exclusion set the pin reads is now empty).

Gates

Exit codes captured to disk BEFORE any pipe, every one of them.

check-changeset-presence            0     check:control-bytes                 0
check-changeset-overwrite           0     check:new-line-citations            0
check:changeset-claims              0     check-governed-queue-guard          0  (--self-test)
check:pending-changeset-literals    0     pnpm --filter @object-ui/types type-check  0  (all three legs)
check-changeset-no-major            0     pnpm exec vitest run packages/types/       0  (204 files, 4772 tests)
check-changeset-fixed               0

check-governed-queue-guard --test on this PR's five paths: NOT GOVERNED, 5 paths against 5 governed surfaces, none matched.

Self-scan beyond the gate, over every changed file: grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]' exit 1, zero hits.

⚠️ Prose scans on this corpus were run whitespace-tolerant throughout. A line-anchored git grep for the chatbot tombstone's own text reads 0 where the truth is 1 — the string wraps across concatenated literals — so every marker count here is taken on the whitespace-flattened, literal-joined text with both a lit and an absent control.

Surface increment

The claim comment declared three paths. Two more are in the diff and both are required rather than opportunistic: content-channel-family-d-9256.test.ts is where item 3 lands (item 3 is in scope; the declared surface under-listed it), and zod/index.zod.ts carries one clause that THIS change falsified.

Serial constraint, re-taken

Re-enumerated over the live open-PR set immediately before the first write: 13 open PRs, where the dispatch table listed 6. Intersection with packages/types/src/zod/base.zod.ts and packages/types/src/__tests__/node-recursion-point-8344.test.ts: EMPTY. Re-confirmed that PR objectui#9742 holds packages/types/src/base.ts and this branch holds packages/types/src/zod/base.zod.ts — different files, disjoint on disk. PR objectui#9735 had already landed (this branch is cut from the commit that merged it).

Acceptance notes

  • ⛔ Item 4 (the render path) is NOT repaired here and this PR does not widen into @object-ui/core. It was VERIFIED first-hand — see the report on card objectui#9659 — and is handed to the seat to file, with dedupe words. ⚠️ Conflict declared: the dispatch asked this dev to file the card; the standing dev contract says a dev does not create issues and hands the finding to the seat instead. The standing contract won and the conflict is stated rather than quietly resolved either way.
  • ⛔ No label was added, removed or changed, on this PR or on the card.
  • Left a DRAFT. The ready-flip and the queue belong to the seat.

🤖 Generated with Claude Code

https://claude.ai/code/session_01UanLVj6xvbS6puBCewLr8L


Generated by Claude Code

…nd repair the pin that read its shape (objectui#9659)

The objectui#8344 `superRefine` clause on `defineNodeComponentUnion` could no
longer fire once ruling A on objectui#8572 made `ChatbotSchema.body` an ADR-0049
tombstone: zod skips a check once the schema it wraps has refused, and the arm
refuses every defined `body`, while the clause returns early on `undefined`.
Measured on the issue tree of a nested refusal (the arm's tombstone, no
clause-shaped issue) against a lit control built from the pre-retirement record
arm, which produces the clause's issue and no tombstone.

The accept set does not move: byte-identical verdicts over 432 schema-catalog
documents plus a 60-case sweep of three chatbot faces x ten `body` shapes x both
depths.

The wrapper's other role is kept. The read-back assertion is untouched and the
`fill is LIVE` leg is re-pointed from the wrapper's shape to the installation.

A second leg was vacuous: `names body in the refusal` read the serialized issue
blob for `"body"`, which the parent card slot supplies for any refused child. It
now reads the child's own `body` path and asserts the remedy reaches the author
at depth, with the three documents that made it vacuous pinned as controls.

Also annotates the plain `chatbot` row of the objectui#9256 narrowing table as a
one-sided reading, and amends the two prose sites this change falsified.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UanLVj6xvbS6puBCewLr8L
@github-actions

Copy link
Copy Markdown
Contributor

changeset-claim-re-read

⚠️ 13 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/5905-componentinput-inputtype-tombstone.md

  • names zod/base.zod.tspackages/types/src/zod/base.zod.ts — edited by this change

    Stale wording corrected in the same pass, because this change falsifies it: base.ts and zod/base.zod.ts both said the fork was "recorded for a ruling; until then this stays a live, writable key", and widget.ts called it "the open fork". All three now record the ruling. A reader who greps the source instead of the card thread was meeting an open fork that no longer existed.

.changeset/5905-componentinput-retire-constraint-keys.md

  • names packages/types/src/zod/base.zod.tspackages/types/src/zod/base.zod.ts — edited by this change

    The retirement kit: ?: never on the interface (packages/types/src/base.ts), so authoring one is a tsc error at the registration site; retirementTombstone() on the Zod mirror (packages/types/src/zod/base.zod.ts), so an authored value is REFUSED at parse time with code: 'invalid_type', the key named in the issue path, and the migration note as the message. Deleting the members outright was the option NOT taken: ComponentInputSchema is a non-strict z.object, which strips an undeclared key silently — one silent no-op traded for another. Pinned in packages/types/src/__tests__/component-input-retired-constraint-keys.test.ts.

.changeset/7087-disabled-twin-symmetry.md

  • names base.zod.tspackages/types/src/zod/base.zod.ts — edited by this change

    Those 18 redeclarations are removed, on both faces. The interfaces inherit BaseSchema.disabled the way they always inherited visible; the zod mirrors inherit base.zod.ts's z.union([z.boolean(), z.string()]) through .extend()'s merged .shape, so there is no second spelling of the union to drift from — the route ChatbotSchema took in objectui#6169.

.changeset/7493-componentinput-retire-label-defaultvalue-advanced.md

  • names packages/types/src/zod/base.zod.tspackages/types/src/zod/base.zod.ts — edited by this change

    The retirement kit: ?: never on ComponentInput (packages/types/src/base.ts), so authoring one is a tsc error at the registration site; retirementTombstone() on ComponentInputSchema (packages/types/src/zod/base.zod.ts), so an authored value is REFUSED at parse time with code: 'invalid_type', the key named in the issue path, and the migration note as the message (one string, both channels). Pinned in packages/types/src/__tests__/component-input-retired-keys-7493.test.ts, which also holds a tree-scoped absence census over every inputs: array under packages/** and apps/**.

.changeset/7530-predicate-envelope-declared.md

  • names base.zod.tspackages/types/src/zod/base.zod.ts — edited by this change

    • ExpressionWire (type, main entry) — the TypeScript wire union, in packages/types/src/expression.ts. - ExpressionWireSchema (@object-ui/types/zod) — its runtime twin, hoisted out of zod/form.zod.ts (where it was module-private) into zod/expression.zod.ts and imported by both base.zod.ts and form.zod.ts. One envelope type, reused by reference; no second spelling.

.changeset/7917-export-breadcrumb-object-tree-zod-schemas.md

  • names index.zod.tspackages/types/src/zod/index.zod.ts — edited by this change

    AnyComponentSchema declares 107 node component types. 105 of them could be named on the ./zod barrel — ButtonSchema.safeParse(node), which is what a designer, a form builder or a targeted test needs. The arms declaring type: 'breadcrumb' (navigation.zod.ts) and type: 'object-tree' (objectql.zod.ts) could not: both were already export const in their own module, but index.zod.ts — the package's only zod entry point — did not re-export them, so the schemas existed, were maintained, and were applied by the union while no consumer could name them.

.changeset/7918-zod-lazy-getter-identity.md

  • names base.zod.tspackages/types/src/zod/base.zod.ts — edited by this change

    The card that found this did not claim the ten were wrong. It asked whether the spelling was buying a temporal-dead-zone dodge, and that check is what shipped. Each of the ten was rewritten in place to const inner = ANGLE-BRACKETS(body); z.lazy(() => inner), the package rebuilt, and the built barrel imported in a fresh process. Eight refuse to load. Seven name the very const being declared (children: z.array(TreeNodeSchema) sits inside TreeNodeSchema's own initialiser); SchemaNodeSchema names BaseSchemaCore, which base.zod.ts declares below it. For those eight the z.lazy is load-bearing, so ActionSchema, AppMenuItemSchema, FilterGroupSchema, MenuItemSchema, NavLinkSchema, NavigationMenuItemSchema, SchemaNodeSchema and TreeNodeSchema keep the spelling they have. The two that loaded clean are memoised: FilterBuilderConditionSchema is not recursive at all, and NavigationItemSchema already defers its self-reference through an inner z.lazy(() => NavigationItemSchema) on children.

.changeset/8499-node-slot-registered-arms.md

  • names zod/index.zod.tspackages/types/src/zod/index.zod.ts — edited by this change

    Why 49 is acceptable here where 2 was a defect: the 2 were data blocks a consumer had a standing reason to validate on their own, and objectui#7917 (PR feat(types): re-export BreadcrumbSchema and ObjectTreeSchema from the zod barrel (objectui#7917) #8777, open at the time of writing, and the holder of zod/index.zod.ts) exists to export exactly those. The 47 added here are HTML primitives and two input aliases — they have no per-tag consumer to serve, and exporting a SemanticElementSchema / HtmlElementSchema pair would publish a NAMED authoring surface (z.enum families, not per-tag schemas) that this card's ruling does not cover: the ruling is "arm the registered renderers", not "add public exports to @object-ui/types". So the metric is left to move and said out loud instead. ⇒ Whoever next runs that measurement should expect 49, and whoever wants the number back down should treat naming these families as its own decision. If PR feat(types): re-export BreadcrumbSchema and ObjectTreeSchema from the zod barrel (objectui#7917) #8777 lands first, the same movement reads 0 to 47.

.changeset/8572-chatbot-body-retired.md

  • names node-recursion-point-8344.test.tspackages/types/src/__tests__/node-recursion-point-8344.test.ts — edited by this change

    Pins moved, and how. node-recursion-point-8344.test.ts keeps both directions and inverts the two the ruling names: the root case now asserts the refusal (with the issue path, the code and the named replacement) instead of acceptance, and the ArmsNotAssignableToSchemaNode type pin now reads never instead of 'chatbot'. ⚠️ That type alias needed an empty-set guard, measured rather than assumed: its bare projection Exclude< … > extends { type: infer K } ? K : never resolves to unknown, not never, when the exclusion set is empty, so the naive inversion could only ever be red. zod-mirror-parity.test.ts loses body from ChatbotSchema's KnownDrift row (the entry survives on its two runtime slots) and loses the whole WiderThanDeclared entry, with the header figures re-derived from the ledgers by that file's own pins.

.changeset/8598-zod-subpath-single-bundled-module.md

  • names src/zod/index.zod.tspackages/types/src/zod/index.zod.ts — edited by this change

    The defect. This package declares "sideEffects": false, and src/zod/index.zod.ts fills the node recursion point as the initializer of its AnyComponentSchema const. tsc emitted that barrel as a module whose only other content is re-exports — so a bundler resolving import { CardSchema } from '@object-ui/types/zod' followed the re-export to dist/zod/layout.zod.js, needed nothing from the barrel's own body, and the flag let it drop that body whole. The fill went with it, and every child slot then validated against the pre-spec(types): redirect the node recursion point from BaseSchemaCore to AnyComponentSchema — measured at 9 newly-refused documents, and it drops 118 phantom strict refusals #8344 BaseSchemaCore arm — the ~21 base keys and nothing type-specific — with no error, no warning and no way for the guard inside the dropped code to notice. objectui#8344 shipped that window DECLARED and pointed here to close it.

.changeset/9067-zod-barrel-named-arms.md

  • names packages/types/src/zod/index.zod.tspackages/types/src/zod/index.zod.ts — edited by this change

    Two new exported symbols, both on packages/types/src/zod/index.zod.ts:

.changeset/9162-node-slot-guard-class-closure.md

  • names packages/types/src/zod/base.zod.tspackages/types/src/zod/base.zod.ts — edited by this change

    What leaked. {schema.footer && ANGLE-BRACKETS(CardFooter)…ANGLE-BRACKETS(/CardFooter)} does not evaluate to false when the slot is falsy — it evaluates to the slot, and React renders numbers. A node slot's published zod face carries a z.number() arm (nodeUnionOptions, packages/types/src/zod/base.zod.ts), so footer: 0 is legal authored input, and it painted a stray 0 into the DOM. NaN painted three characters. The && also short-circuits, so renderChildren's own if (!children) return null first leg was never reached — which is why the objectui#8908 bridge repair could not cover any of these sites.

.changeset/component-meta-converge-and-deprecate-alias-5893.md

  • names zod/base.zod.tspackages/types/src/zod/base.zod.ts — edited by this change

    Either side had already moved. base.ts declared eleven keys; the plugin-scoped copy declared nine — the same nine, minus tags and description. So a plugin author typing against the plugin-facing declaration could not write two keys the main surface advertises, and which the runtime validator already accepted: ComponentMetaSchema in zod/base.zod.ts declares all eleven, so two of the three authorities agreed and the plugin-facing one did not. resizeConstraints' six members were identical in both, so the delta was exactly those two keys.

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 claim that was born false (a changeset this change adds is excluded by construction), 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 e89aae323 (merge-base with origin/main): 4 file(s) changed outside .changeset/, read against 1132 pending declaration(s) that publish a body (1649 pending in total). · run

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 329 chunks) 3049.2 KB 3104.5 KB
Main entry chunk (gzip) 145.7 KB 350 KB
Entry file index-DnyzLIkC.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.93KB 130.69KB
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.27KB 62.92KB
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) 4.39KB 1.66KB
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.49KB 19.99KB
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.29KB 65.88KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 136.71KB 34.16KB
plugin-gantt (index.js) 167.62KB 41.26KB
plugin-grid (index.js) 212.64KB 57.91KB
plugin-kanban (index.js) 48.10KB 14.94KB
plugin-list (index.js) 112.73KB 27.69KB
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.04KB 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

@os-sales os-sales changed the title refactor(types)!: retire the inert node-recursion-point refinement, and repair the pin that read its shape (objectui#9659) refactor(types): retire the inert node-recursion-point refinement, and repair the pin that read its shape (objectui#9659) Sep 17, 2026
@os-sales
os-sales marked this pull request as ready for review September 17, 2026 23:59
@os-sales
os-sales added this pull request to the merge queue Sep 17, 2026
Merged via the queue into main with commit 06611e4 Sep 18, 2026
38 checks passed
@os-sales
os-sales deleted the claude/issue-9659-9639-post-pass-residuals branch September 18, 2026 00:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants