Skip to content

chore(deps): resolve @objectstack/spec at 17.3.0 in the lockfile - #7685

Draft
claude[bot] wants to merge 11 commits into
mainfrom
claude/issue-7122-spec-pin-17-3-0
Draft

chore(deps): resolve @objectstack/spec at 17.3.0 in the lockfile#7685
claude[bot] wants to merge 11 commits into
mainfrom
claude/issue-7122-spec-pin-17-3-0

Conversation

@claude

@claude claude Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Part of #7122

Not a merge candidate. This branch carries the @objectstack/spec 17.3.0 lockfile bump so the reconciliation it forces is measurable. Everything mechanically fixable is fixed; what is left is decision-gated, and every survivor is named with its owner below.

Head measured for everything here: f389bec90. The catalogue this body used to carry was measured at 36baa6d57 and is superseded.

⭐ What this round changed, in one table

CI check at 36baa6d57 at f389bec90
Bundle Analysis ❌ eager closure 4137.7 KB / 3191.4 budget 3466.4 KB671.3 KB recovered, 275.0 KB still over
Type Check ❌ 2 × TS2344 in packages/types 1 blocker, in packages/app-shell — and it is a different one
Test (4 shards) ❌ 19 assertions / 9 files 8 assertions / 6 files in CI
everything else (24 green, 3 skipped)

⚠️ The red count is unchanged at 6. The red content is not, and the honest headline is that two of the three Type Check blockers were invisible until now: turbo run type-check aborts at its first failing task, so "the 2 TS2344 are the only Type Check blocker" was never a reading the old measurement could support. Re-run with --continue, 80 of 81 tasks pass and exactly one fails.

1. The duplicate spec is gone — measured, not assumed

@objectstack/client, core, formula and lint at 17.2.0 each pin @objectstack/spec exactly, so resolving the spec alone to 17.3.0 stopped satisfying them and the console shipped two copies. Moving the family with it in the lockfile collapses that.

origin/main @ 17.2.0 spec-only @ 17.3.0 family @ 17.3.0 (now)
eager closure, gzip 3186.1 KB 4137.7 KB 3466.1 KB (CI: 3466.4)
vendor-objectstack 926.1 KB 1877.6 KB 1206.1 KB
eager chunks / total 50 / 518 50 / 518 50 / 518

⛔ No manifest moved. All four declare ^17.0.0, so the lockfile was resolved by raising those ranges temporarily, resolving, restoring the manifests and re-installing. check-changeset-presence confirms independently: "0 of them a manifest whose published contract moved".

⚠️ That route matters. A plain pnpm update was tried first and rejected: it rewrote four manifests to ^17.3.0 and floated zod 4.4.3 to 4.5.4, splitting the @objectstack/* peer context into two variants — re-introducing the very duplication this change removes. The lockfile now carries exactly one snapshot per package, and node_modules/.pnpm holds exactly one @objectstack/spec directory.

The duplication is collapsed — three probes, with controls

probe doubled build family build
markers unique to spec 17.2.0, present in the chunk 92.3% 1.0% (1 of 104)
markers unique to spec 17.3.0, present in the chunk (positive control) 85.9% 81.9%
occurrences of defaultValue (17.2.0 baseline 203) 413 (2.03x) 258
occurrences of ObjectStack (17.2.0 baseline 32) 63 (1.97x) 40

The single surviving 17.2.0-unique marker is getTranslations, and it is accounted for: it is present in @objectstack/client and core at 17.3.0, which live in the same vendor-objectstack chunk. 0 of 104 unexplained.

⚠️ A first pass of this probe read 9.2% and was wrong — recorded because the correction is the interesting part. Defining "17.2.0-only" as a set difference over extracted quoted literals mislabels a literal that 17.3.0 merely extended: "Max character length" at 17.2.0 is "Max character length (positive integer). Only authorable…" at 17.3.0, and a substring test finds the old one inside the new one. Ten of the eleven apparent hits were that. The sound definition — a literal that does not occur anywhere in the other version's text — gives 1.0%.

2. What is left of the overage is real growth, not duplication

Per-package gzip of the installed ESM, 17.2.0 versus 17.3.0:

package 17.2.0 17.3.0 delta
spec 1850.8 KB 2143.0 KB +292.2 KB
lint 281.9 337.2 +55.3
core 65.1 74.9 +9.8
client 44.3 53.7 +9.4
sdui-parser 4.4 7.1 +2.7
formula 20.5 22.1 +1.6
types (NEW at 17.3.0) 15.1 +15.1

The chunk grew +280.0 KB over the 17.2.0 baseline (1206.1 vs 926.1); the spec's own growth is +292.2 KB. Those agree to within 12 KB, and the same probe that refuted duplication identifies the mechanism: 17.3.0 lengthened the Zod .describe() doc strings, which ship in the browser build. "Output schema" became "Output schema (JSON Schema)"; "Action functionality type" became "Action functionality type — the dispatch route. …", and so on across the schema surface.

The remaining 274.7 KB is 17.3.0's honest price, and nothing inside this repo can pay it. ⛔ No ceiling was raised, ⛔ no exemption added, ⛔ no import made lazy — the gate self-reports sensitivity ✅ and freshness ✅, so the number is real. The question this hands back is a different and much smaller one than the ~950 KB it started as, and it is arguably upstream: whether the spec's browser build needs to carry authoring documentation prose at all.

3. Type Check — one blocker left, and it is not this seat's

Measured with --continue, so the list is complete rather than truncated at the first failure: 80 of 81 tasks pass.

blocker status
2 × TS2344, packages/types/src/__tests__/select-option-tier1-convergence-7014.test.ts fixed — section 4
TS2321: Excessive stack depth, packages/cli/src/utils/workspace-vite.ts fixed — section 5
TS2344, packages/app-shell/src/__tests__/spec-symbol-parity.test.ts:447 left red deliberately — below

The survivor, measured precisely so it is a one-line repair for whoever owns it: ObjectFieldGroupSchema declares nine keys at 17.3.0 and the pin's _NoInventedKeys names eight. The gained key is visibleWhen. Both _HasSpecKeys and _NoInventedKeys need it added.

⛔ Not repaired here. packages/app-shell is the domain:ui lane, #7635 is pm:dispatched on exactly this family, and colliding with an in-flight claim is worse than leaving a red.

4. The select-option pins now record 17.3.0's boundary

17.3.0 implements the maintainer's 2026-08-25 ruling on #6140 / #6153 (Option A): SelectOptionSchema.description and a type-gated rows become declared, authorable keys. Two pin files still asserted the 17.2.0 truth. Re-pointing them executes that ruling and makes no new one. 10 assertions closed, plus both TS2344.

Measured against the installed 17.3.0 rather than read from a changelog:

  • SelectOptionSchema declares six keys: color, default, description, label, value, visibleWhen.
  • rows is accepted on textarea / markdown / html / richtext, and refused on text / select as a custom refinement — not unrecognized_keys. "Declared" is not "declared everywhere", and both directions are now pinned.
  • icon and disabled are still refused by name, and at options.0 when routed through FieldSchema.

The boundary moved; it did not disappear, so every re-point keeps a refusal opposite it:

In the convergence file the type-level halves moved for a reason worth stating: SelectOptionBase derives the spec's keys by reference, so description arrived on both faces with no edit to the type at all. The form face's pre-convergence equality therefore became a set difference — the idiom the object-metadata face has used for default since the convergence — and "the two faces differ on exactly value" now says so directly instead of excusing description from the comparison.

Reverse-verified rather than asserted: re-pointing either half back and rebuilding gives tsc exit 2 at the mutated line and vitest 1 failed / 35 passed; restoring gives blob hashes identical to the HEAD blobs, an empty git diff HEAD, tsc exit 0 and 36 passed.

5. A postcss duplicate this branch introduced, found by fixing the pin above

With packages/types green, turbo reached @object-ui/cli for the first time on this branch and it failed: TS2321: Excessive stack depth comparing types 'Plugin & ExportedAPI' and 'Plugin' — in a file this branch never touched.

Cause, measured: the CLI's type-check program held two postcss copies. @tailwindcss/postcss@4.3.3 depended on postcss@8.5.26 while autoprefixer@10.5.4 resolved its auto-installed peer to postcss@8.5.28, so Plugin on one side and Plugin & ExportedAPI on the other were structurally distinct and the comparison exceeded the instantiation budget. origin/main has a single autoprefixer@10.5.4(postcss@8.5.26) and no 8.5.28 at all, which is why it is green.

⚠️ It is not from the family bump: postcss@8.5.28 is present at 36baa6d57, and the family-bump commit's lockfile diff touches neither postcss nor autoprefixer. It arrived with aabc527cb, this branch's first lockfile bump, whose diff shows postcss@8.5.26 → 8.5.28 alongside the spec move.

Collapsed by the same lockfile-only route: all eight manifests that declare postcss already declare ^8.5.26, which admits 8.5.28. No declared range moved; postcss@8.5.26 leaves the graph entirely. After: @object-ui/cli tsc --noEmit exits 0.

6. The family bump's own reconciliation cost — one site, reported not absorbed

client.analytics.query resolved to a Promise of any at 17.2.0 and resolves to a Promise of AnalyticsResult at 17.3.0, so the pre-envelope branches of aggregate's row-shape fallback in @object-ui/data-objectstack stopped type-checking. The client's own docblock records the runtime change behind the narrower type: "BREAKING since #13079 — read result.rows, not result.data.rows; the method used to resolve to the whole envelope."

Those branches are read through a widened alias rather than deleted, deliberately: deleting them is a runtime compatibility decision about servers older than that change, not a type repair. The alias restores exactly the compile-time latitude 17.2.0 gave the same expression and changes no runtime byte of it. ⚠️ Contract-first (AGENTS.md #0.1) says those branches should eventually go; that is a decision, and it is named here rather than made.

That is the only source reconciliation the family bump forced. It added no new test reds: the unit red set was 9 files / 19 assertions before it and after it.

7. Remaining red set — every survivor, and whose it is

file reds why it is a decision, and whose
spec-symbol-parity.test.ts (Type Check) 1 ObjectFieldGroup gained visibleWhen. domain:ui, #7635's lane
object-schema-metadata-spec-derivation.test.ts 2 spec adopted ObjectSchema.editMode. The pin's own docblock prescribes "retire it from ObjectSchemaClientExtensions and let the derivation carry it" — a source edit outside this seat's fence, and one indivisible change with the two app-shell pins below. #7635
MetadataService.retiredObjectEnabled.test.ts 1 same editMode adoption, 42 → 43 keys. #7635
MetadataService.specKeyObjectPayload.test.ts 1 same
MetadataService.specKeyReference.test.ts 1 lookup now requires a non-empty reference. Ruled item 4 = fix the designer; own domain:ui card. ⛔ Pin deliberately NOT flipped green — doing so pins a known-broken save path
recordDetailsInputs.spec-parity.test.ts 1 record:details section entry grew 8 keys. Ruled item 5 = deferred feature card
block-config.test.ts 2 one is item 5's 8 keys. The other is user:profile leaving spec PageComponentType — ⛔ NOT a stale-entry deletion: objectui still registers it in components/renderers/placeholders.tsx and cli/known-schema-types.ts
check-sdui-registration-pins.test.ts 1 local, 0 in CI already filed as #6893 — fails on any tree where packages/app-shell/dist exists. CI's test shards do not build
check:eager-closure section 2. Not answerable inside this repo
check-spec-range-floors @object-ui/types floor ^17.0.0 vs the ^17.3.0 the gate names. ⛔ Published-manifest change, unchanged from the last round. Scheduled-only, never a PR job — but its blocking copy runs on the publish path

8. Gates

Exit codes captured before any pipe (cmd > file 2>&1; EXIT=$?), all at f389bec90, on the same tree the union ran in.

gate exit
pnpm build 0 — 43 / 43
turbo run type-check --continue 2 — 80 of 81, the one survivor above
pnpm exec vitest run --project unit 1 — 7 files / 9 assertions (8 in CI)
check:phantom-deps · check:self-import · check:unreferenced-sources · check:published-tsconfig-exclude · check:side-effects-array · check:element-data-source-declaration · check:esm-specifiers · check:spec-symbols · check:action-forward-parity · check:designer-field-key-parity · check:icon-record-names · check:i18n-keys · check:i18n-drift · check:sdui-registration-pins · check:docs-route-closure 0
type-check:scripts · type-check:vitest-setup · check-type-check-coverage 0
check-changeset-presence · -fixed · -no-major · check-control-bytes 0
eslint on the three changed source files, through each package's own lint script 0 errors
check:eager-closure 1 — section 2
check-spec-range-floors 1 — unchanged, section 7

Lint was measured as a declared narrowing, not skipped: the universe is each affected package's own eslint . (the CI invocation, not a guess), three files were reported by --format json, and eslint.config.js carries no parserOptions.project / projectService, so no untouched file's verdict can move because of this diff.

9. One CI reading that is not from this branch

The bundle report on f389bec90 carries a new types (expression.js) row. It is not reproducible locally and it is not ours: packages/types/src/expression.ts does not exist on this branch, on 36baa6d57, or at the branch's last origin/main merge. It arrives from origin/main c354ce5db (the shared ExpressionWire for visible / hidden / disabled), because CI builds the pull-request merge ref. Worth remembering when reading any CI number here: they are merge-ref numbers and this branch is behind main.

10. Clause-② — still no

No repair on this branch changes what any published @object-ui/* package accepts or refuses. The data-objectstack change is a type annotation over an unchanged expression; the rest is tests, lockfile resolutions with no declared range moved, and changesets. The two things that would flip it — the @object-ui/types floor raise, and any of the domain:ui pins above — are reported, none done.

⛔ Left draft. Not enqueued, ready not flipped, auto-merge not armed.


Generated by Claude Code

Moves the `@objectstack/spec` resolution in `pnpm-lock.yaml` from 17.2.0 to
17.3.0. Every one of the 30 manifests that declare the dependency already
carried a range admitting it (`^17.0.0` / `^17.1.0` / `^17.2.0`), so the
declared specifiers are untouched and no published dependency declaration
changes by a byte; `check-changeset-presence` confirms the range independently
("0 of them a manifest whose published contract moved").

The bump is committed on its own because the reconciliation it forces is not
mechanical: 17.3.0 reddens 14 test files / 36 assertions across six packages,
and at least four of those reds are public-contract decisions rather than pin
updates. The PR body carries the full measured red set.

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

os-sam commented Sep 5, 2026

Copy link
Copy Markdown
Collaborator

CI red — expected, measured in advance, and ⛔ not fixable inside this branch

PM of record for this dispatch (domain:spec @ objectui seat, session session_0114Ytxr5sM1vdW19Y9WAx6E). Reading taken 2026-09-05T02:40Z on head aabc527cb.

What is failing

Type Check — but the failing step inside that job is not tsc. It is:

> node scripts/check-spec-symbol-derivation.mjs
ELIFECYCLE  Command failed with exit code 1.

Three findings, verbatim from the job log:

  1. @object-ui/app-shell declares 2 spec-named symbols the spec now owns — interface FlowNodeLike at packages/app-shell/src/views/metadata-admin/inspectors/flow-nested-selection.ts:125 and .../flow-scope.ts:76, both now exported by @objectstack/spec/system.
  2. @object-ui/types:BreakpointName is in ALLOW but no longer collides with a spec export.
  3. @object-ui/layout:BreakpointColumnMap — same.

⭐ This is the PR's own prediction firing, not a surprise

The PR body already recorded this gate at exit 1 with these three findings, before CI ran. CI reproduces them exactly. The red is the deliverable here — this branch exists to make the 17.3.0 reconciliation measurable, and it says so in its first line: ⛔ not a merge candidate.

All three findings are the same upstream fact the PR documents: 17.3.0 added FlowNodeLike and removed BreakpointName / BreakpointColumnMap — two of the four public type exports dropped in a minor.

Why no fix is being pushed

⛔ Not because it is hard, and ⛔ not "flake" — this is real and deterministic. Three reasons, in order:

  1. Finding 1 is a judgment, not an edit. The gate itself offers four remedies — import the spec's, derive it, rename to a declared local dialect with a tripwire, or ALLOW with a reason — and choosing correctly requires knowing whether app-shell's local FlowNodeLike actually matches the spec's. That is a contract question, and both files sit in packages/app-shell, outside this card's dispatched surface. The dev reported the boundary rather than crossing it, which is right.
  2. Findings 2–3 are mechanical, but fixing them does not turn this PR green. 14 files / 36 assertions are still red across six packages, and those are decision-gated (a lookup field now requiring reference collides with a pin that deliberately asserts half-filled drafts save; ActionSchema grew two keys; the record:details section entry grew 8 keys with no designer control; three local extensions the spec has adopted; two removed exports whose pins prescribe repairs elsewhere). Landing a partial green here would only make the branch look closer to mergeable than it is.
  3. Widening this PR to chase them is the failure mode the rules name. Six packages of reconciliation across public-contract questions is not a rider on a lockfile bump.

No re-run. A re-run is for confirming a failure that is not this PR's, or one that died before any test body ran. This one is this PR's, it is reproducible, and its cause is named.

What actually unblocks it

#7122 moves to the decision box. The card was dispatched as a mechanical pin bump; the measurement shows the bump forces a set of public-contract rulings. Per the standing rule, that means the dev stops and the card returns for adjudication — ⛔ never a silent re-decision by this seat. This branch stays draft and parked as the evidence, and keeps Part of #7122 rather than Fixes so merging it could never silently close a card whose work is unmade.

This comment is the standing-down record for this failure; ⛔ a further red on this same head needs no second one.


Generated by Claude Code

@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

ℹ️ Console Performance Budget — not measured

This run did not produce a console bundle to measure, so there is no pass/fail verdict for the performance budget.

This is not a budget violation. Nothing was measured — the numbers a real violation would carry are simply absent.

Step Outcome
Build packages failure
Check console performance budget skipped

See the workflow run for details.

No package size report: it is only generated from a complete package build, so a partial one is never shown.

os-sam commented Sep 5, 2026

Copy link
Copy Markdown
Collaborator

⛔ 撤回上一条止血评论的范围 —— 它把可机械修复的部分也一并停手了,这是错的

domain:spec @ objectui 席(session session_0114Ytxr5sM1vdW19Y9WAx6E),2026-09-05T09:05Z

维护者指令(逐字):「7685 红了,你已应该修复」。本条依此执行,并如实记录我判断错在哪。

我错在哪

上一条止血评论(5548718074)说本 PR 的红「⛔ 不可在本分支内修复」,理由分三条。第 2 条站不住:我在同一条评论里写明「findings 2–3 是机械的」(两个陈旧 ALLOW 条目,门禁原话就是 "Delete the entry"),然后又以**「修了也不能让本 PR 变绿」**为由不修。

⇒ 「修好一个真实的、机械的、在范围内的缺陷,不足以让整个 PR 变绿」不是不修它的理由。我把决策闸门套在了整个红面上,而实际上只有其中一部分真正需要裁决。红面里可机械修复的那部分,是我该修而没修的

现在执行

已派发 dev 驱动本 PR 向绿,修一切「修法已由门禁自身或 pin 自己的 docblock 写明」的项:

为什么它是机械的
两个陈旧 ALLOW 条目(BreakpointName / BreakpointColumnMap) 门禁原话即 "Delete the entry"
FlowNodeLike 遮蔽(app-shell 两处) 四个修法里选哪个是可测量的(比对本地接口与 spec 导出是否结构相同),⛔ 不是裁决
约 20 条引用被剥的 pin 17.3.0 只剥了 #NNNN 引用、保留了处方半句;pin 自己的 docblock 写明「处方才是让拒绝可执行的那一半」⇒ 重新指向处方是执行其既定意图
main 已修掉的 本分支落后 main 16 个提交(tip aabc527cb,main 4ce14f125),期间多个 packages/types 变更落地 ⇒ 先合 main 再重测,红面目录已过期约 7 小时

⛔ 仍然不修、确实需要您裁决的

  • lookup 强制 reference —— designer 故意 PUT 半填草稿,对齐后端会 422 并阻塞该对象后续每次保存。改 designer 还是上游反对,是产品裁决。⛔ 不把该 pin 改绿(那会 pin 住已知损坏的行为)。
  • record:details section 新增 8 个键且无 designer 控件 —— 那是功能,不是对账。
  • 任何「修法会扩大/改变 objectui 已发布接受面」而非恢复 declared=enforced 的项。

#7122 保留的将只剩真正的分叉,而不是像现在这样把整片红面都挂在裁决后面。这正是我上一条该做而没做的收窄。

不变的部分

Part of #7122 保持(⛔ 不改 Fixes:#7122 仍有未裁事项,合并不得静默关闭它)。PR 仍 draft,⛔ 不入队、不挂 auto-merge。若任何修复触发条款②,PR 挂 needs:contract-review 停放。


Generated by Claude Code

@github-actions

github-actions Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

ℹ️ Console Performance Budget — not measured

This run did not produce a console bundle to measure, so there is no pass/fail verdict for the performance budget.

This is not a budget violation. Nothing was measured — the numbers a real violation would carry are simply absent.

Step Outcome
Build packages failure
Check console performance budget skipped

See the workflow run for details.

No package size report: it is only generated from a complete package build, so a partial one is never shown.

…bjectstack/spec 17.3.0 (objectui#7122)

Three repairs, each prescribed by the thing that failed.

1. `SchemaDiffEntryKind` gained `unreachable` in 17.3.0, so app-shell's
   deliberately-total `DIFF_LABEL` map stopped compiling — TS2741, the single
   error behind the `Build packages: failure` CI reported on this branch. The
   map is total on purpose so an upstream addition fails the build instead of
   rendering a blank cell; that mechanism worked. Labelled "Not checked —
   remote unreachable", following the spec's own ruling that this kind asserts
   NOTHING about the remote schema and must never be surfaced as "schema
   changed".

2. 17.3.0 began exporting `FlowNodeLike` from `@objectstack/spec/system`, so
   app-shell's two same-named local declarations became shadows. Measured
   rather than assumed: the spec's `id?` is OPTIONAL where the inspector's is
   REQUIRED, and assignability runs one way only, so importing the spec export
   would silently widen away the guarantee `locateFlowNode`'s callers rest on.
   Genuine dialects ⇒ renamed to `InspectorFlowNode` and `ScopeFlowNode`, with
   the tripwire rows the guard asks for in `page-nav-misc-spec-parity.test.ts`.

3. The `BreakpointName` / `BreakpointColumnMap` ALLOW entries were written
   self-expiring: they covered the interval while objectstack#11027's
   retirement was merged but unreleased, and their own text said to delete them
   on the pin bump and move the names to the absence pin. 17.3.0 published the
   retirement, ratchet 3 failed them as excusing nothing, so both are deleted
   and both names are pinned absent instead.

`node scripts/check-spec-symbol-derivation.mjs` — exit 0 (was 1 with three
findings): 1345 files scanned, 18 declared dialects.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0114Ytxr5sM1vdW19Y9WAx6E
@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) 4137.7 KB 3191.4 KB
Main entry chunk (gzip) 143.2 KB 350 KB
Entry file index-C18P77W3.js
Status FAIL

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.

Which half objected:

Eager-closure half Verdict
Aggregate closure ceiling ❌ over its ceiling
Per-chunk ceilings ❌ over its ceiling
Ceiling sensitivity (headroom) ✅ pass
Ceiling freshness (checkout vs. base branch) ✅ pass

📦 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.70KB 116.21KB
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.27KB 61.22KB
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.37KB 46.41KB
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 (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

…the prescription (objectui#7122)

`@objectstack/spec` 17.3.0 stripped the `#NNNN` issue-number citations from its
refusal messages while keeping the prescriptive half intact. Sixteen assertions
were pinned on the stripped half and went red; each is re-pointed at what the
refusal still carries, which is the half the pins' own comments name as the
point — "the prescription is the half that makes the refusal actionable for an
author; asserting only `success === false` would stay green if it were reduced
to 'Invalid input'".

- `submitRedirect.test.ts` (13): `#7496` -> `ruled 2026-08-11`. The refusal still
  cites its governing ruling, now by date rather than by issue number; the
  key-name and non-genericity assertions are untouched.
- `export-options-spec-parity.test.ts`: `/8010|1301/` -> the surviving format
  list and the `os migrate meta` command, i.e. the actionable repair itself.
- `report-chart-query-spec-parity.test.ts`: `'#4876, ADR-0049 D2'` -> the ADR
  reference, which survived, plus the `Delete the key.` prescription.

Separately, the `PreviewModeConfig` doc-provenance ratchet FIRED and is retired
exactly as its own docblock prescribed ("correct the README line … and then
delete this guard, which has no reason to outlive the sentence it protects").
⚠️ The docblock expected that at spec major 18 — objectstack#11846 registered
the retirement in `RETIRED_DEFS_BY_MAJOR[18]` — and it arrived in a MINOR
instead, one of four public type exports 17.3.0 removed with no major signal.
The capability is untouched: `previewMode` is host-supplied and stays.

Verified: `pnpm exec vitest run` over the five affected files — 5 passed,
150 tests passed, exit 0. The edited gate script's own pin suites
(`check-spec-symbol-derivation.test.ts`, `check-doc-component-types.test.ts`) —
2 passed, 108 tests, exit 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0114Ytxr5sM1vdW19Y9WAx6E
…0 bump forced (objectui#7122)

The branch previously declared 'no release' with empty frontmatter, which was
true while its only diff was the lockfile. It no longer is: `@object-ui/app-shell`
needed a source fix to compile against 17.3.0 at all, and `@object-ui/auth`'s
README carried a provenance claim 17.3.0 falsified. Both are declared as patches;
the lockfile-only changeset keeps its own empty-frontmatter declaration.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0114Ytxr5sM1vdW19Y9WAx6E
@github-actions github-actions Bot added documentation Improvements or additions to documentation plugin labels Sep 5, 2026
…ation` / `patch` (objectui#7122)

`SPEC_ACTION_KEYS` declares itself as "every property `@objectstack/spec`'s
`ActionSchema` declares", and `actionKeys.pin.test.ts` walks the schema and fails
the day that drifts. 17.3.0 added `operation` and `patch` — the declarative
single-record field write mirroring a list view's `bulkActionDefs` — so the
inventory was stating something false.

Restating the spec, NOT adopting a feature, exactly as the `description` entry
above it records for the same situation: `ActionDef` still does not declare
either key, no runner branch reads them, and no action surface forwards them.
That omission is deliberate under the maintainer's 2026-09-05 ruling on this
bump — record them as justified omissions now, forward only a key a runtime
actually reads once its semantics are read from upstream, no speculative
forwarding.

⚠️ Deliberately checked rather than assumed: the inventory feeds
`KNOWN_ACTION_KEYS`, which `classifyActionKeys` consults — and that function only
builds `unknown` / `retired` lists for a dev-mode console warning. It rejects
nothing and drops nothing, so widening it does not move what any published
`@object-ui/*` package accepts or refuses. Clause-② stays `no`.

Verified: `pnpm exec vitest run packages/core/src/actions/` — 24 files, 427
tests, exit 0. `node scripts/check-action-forward-parity.mjs` — exit 0, still
19 justified omissions / 7 known gaps, so no new gap was opened.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0114Ytxr5sM1vdW19Y9WAx6E
@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) 4137.7 KB 3191.4 KB
Main entry chunk (gzip) 143.2 KB 350 KB
Entry file index-DFqvb1w2.js
Status FAIL

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.

Which half objected:

Eager-closure half Verdict
Aggregate closure ceiling ❌ over its ceiling
Per-chunk ceilings ❌ over its ceiling
Ceiling sensitivity (headroom) ✅ pass
Ceiling freshness (checkout vs. base branch) ✅ pass

📦 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.70KB 116.21KB
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.27KB 61.22KB
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.37KB 46.41KB
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 (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

…al (objectui#7122)

`scripts/__tests__/doc-version-claims.test.ts` is a ratchet over version
literals on doc surfaces, and my first correction of this sentence introduced
one. Its prescription is explicit — prefer DELETING the literal and pointing at
the truth instead, because that is the only spelling that cannot go stale
(objectui#3645 froze a spec range across 36 READMEs for thirteen majors exactly
this way). The sentence now names the upstream retirement and the fact that the
resolved spec no longer exports the symbol, with no version to go stale.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0114Ytxr5sM1vdW19Y9WAx6E
@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) 4137.7 KB 3191.4 KB
Main entry chunk (gzip) 143.2 KB 350 KB
Entry file index-DFqvb1w2.js
Status FAIL

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.

Which half objected:

Eager-closure half Verdict
Aggregate closure ceiling ❌ over its ceiling
Per-chunk ceilings ❌ over its ceiling
Ceiling sensitivity (headroom) ✅ pass
Ceiling freshness (checkout vs. base branch) ✅ pass

📦 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.70KB 116.21KB
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.27KB 61.22KB
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.37KB 46.41KB
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 (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

os-sam and others added 3 commits September 5, 2026 13:36
…dedupes

`@objectstack/client`, `core`, `formula` and `lint` at 17.2.0 each pin
`@objectstack/spec` EXACTLY at 17.2.0. Resolving the spec alone to 17.3.0
therefore stopped satisfying them, and the console shipped TWO copies of the
spec: `vendor-objectstack` went 926.1 -> 1877.6 KB gzip and the eager closure
went 3186.1 -> 4137.7 KB against a 3191.4 KB budget, with no chunk entering or
leaving the closure.

Moving the family in the lockfile collapses the duplicate. Every declared range
already admitted 17.3.0 (`^17.0.0` on all four), so no manifest's published
contract moves by a byte -- `check-changeset-presence` independently reports
"0 of them a manifest whose published contract moved". The lockfile was
resolved by raising the four ranges temporarily, resolving, then restoring the
manifests and re-installing, so `pnpm update`'s two side effects are absent:
no declared range moved, and `zod` stays at 4.4.3 rather than splitting the
`@objectstack/*` peer context into two variants (which would have re-introduced
the very duplication this commit removes).

Measured after: eager closure 3466.1 KB, `vendor-objectstack` 1206.1 KB. The
duplicate IS gone -- markers unique to the 17.2.0 artifact fall from 92.3% to
9.2% presence in the chunk, and `defaultValue` occurrences fall 413 -> 258
against a 203 baseline. What remains is real growth, not duplication: the spec's
own browser dist is +292.2 KB gzip at 17.3.0. `check:eager-closure` therefore
stays RED by 274.7 KB, which no repair inside this repo can answer.

The family bump forces exactly one source reconciliation, and no new test reds.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0114Ytxr5sM1vdW19Y9WAx6E
…undary

`@objectstack/spec` 17.3.0 implements the maintainer's 2026-08-25 ruling on
objectui#6140 / objectui#6153 (Option A): `SelectOptionSchema.description` and a
type-gated `rows` become declared, authorable keys. Two pin files still asserted
the 17.2.0 truth -- that the spec REFUSES both -- so they were measurably false,
and one of them was the only remaining `Type Check` blocker (TS2344 at lines 101
and 124). Re-pointing them executes the ruling; it makes no new one.

Measured against the installed 17.3.0 rather than read from a changelog:
`SelectOptionSchema` declares six keys (`color`, `default`, `description`,
`label`, `value`, `visibleWhen`); `rows` is accepted on `textarea`, `markdown`,
`html` and `richtext` and refused on `text` / `select` as a `custom` refinement
rather than `unrecognized_keys`; `icon` and `disabled` are still refused by
name, at `options.0` when routed through `FieldSchema`.

The boundary moved, it did not disappear, so every re-point keeps a refusal
opposite it:

- `description` and `rows` are asserted ADMITTED **and** value-enforced (a
  wrongly-typed `description` is `invalid_type` at its key; `rows: 0` is
  `too_small`, `rows: '4'` is `invalid_type`). A merely-tolerated key passes the
  first assertion and fails the second, which is what makes the pair a reading.
- `icon` / `disabled` carry the refusal half, so a schema that had gone
  permissive cannot pass either file.
- The four inert rich-text keys (`toolbar` / `preview` / `minHeight` /
  `maxHeight`) are newly pinned as still-refused on all four multiline types.
  The ruling's expansion stops at `rows` (objectui#7635 records this: do not
  widen), and that door has to be seen to stay shut.
- `rows`'s type gating is pinned in both directions, because "declared" is not
  "declared everywhere".

In the convergence file the type-level halves moved for a reason worth stating:
`SelectOptionBase` derives the spec's keys BY REFERENCE, so `description`
arrived on BOTH faces with no edit to the type at all. The form face's
pre-convergence equality therefore became a SET DIFFERENCE -- the same idiom the
object-metadata face has used for `default` since the convergence -- and the
"the two faces differ on exactly `value`" assertion now says so directly instead
of excusing `description` from the comparison.

NOT done here, deliberately: the prose in `packages/types/src/field-types.ts`
and `select-option.ts` still describes the 17.2.0 boundary and is now false in
the other direction. Those comment sites are objectui#7635's declared surface.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0114Ytxr5sM1vdW19Y9WAx6E
…ntroduced

`@object-ui/cli` failed `type-check` with `TS2321: Excessive stack depth
comparing types 'Plugin & ExportedAPI' and 'Plugin'` in
`src/utils/workspace-vite.ts`, a file this branch never touched.

Cause, measured rather than inferred: the CLI's type-check program held TWO
postcss copies. `@tailwindcss/postcss@4.3.3` depended on `postcss@8.5.26` while
`autoprefixer@10.5.4` resolved its auto-installed peer to `postcss@8.5.28`, so
`Plugin` on one side and `Plugin & ExportedAPI` on the other were structurally
distinct types and the comparison exceeded the instantiation budget.
`origin/main` has a single `autoprefixer@10.5.4(postcss@8.5.26)` and no 8.5.28
at all, which is why it is green.

The duplicate is NOT from this round's family bump: `postcss@8.5.28` is present
at `36baa6d57`, and the family-bump commit's lockfile diff touches neither
postcss nor autoprefixer. It arrived with `aabc527cb`, the branch's first
lockfile bump, whose own diff shows `postcss@8.5.26 -> 8.5.28` alongside the
spec move. It stayed invisible because `turbo run type-check` aborts at its
first failing task, and `@object-ui/types` failed before `@object-ui/cli` ever
ran -- so "the 2 TS2344 are the ONLY Type Check blocker" was never a reading the
old measurement could support.

Collapsed in the lockfile only, by the same route as the `@objectstack/*` family:
all eight manifests that declare postcss already declare `^8.5.26`, which admits
8.5.28, so the ranges were raised temporarily, resolved, then restored and
re-installed. No declared range moved; `postcss@8.5.26` leaves the graph
entirely and `@tailwindcss/postcss` now shares the single 8.5.28. `postcss@8.5.23`
is a separate consumer, present on main too, and is untouched.

After: `@object-ui/cli` `tsc --noEmit` exits 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0114Ytxr5sM1vdW19Y9WAx6E
@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) 3466.4 KB 3191.4 KB
Main entry chunk (gzip) 143.2 KB 350 KB
Entry file index-CtHcv5ac.js
Status FAIL

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.

Which half objected:

Eager-closure half Verdict
Aggregate closure ceiling ❌ over its ceiling
Per-chunk ceilings ❌ over its ceiling
Ceiling sensitivity (headroom) ✅ pass
Ceiling freshness (checkout vs. base branch) ✅ pass

📦 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.70KB 116.21KB
core (index.js) 6.96KB 2.79KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 180.05KB 50.21KB
fields (index.js) 242.27KB 61.22KB
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.37KB 46.41KB
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

@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) 3466.7 KB 3191.4 KB
Main entry chunk (gzip) 143.2 KB 350 KB
Entry file index-DXRJ04IC.js
Status FAIL

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.

Which half objected:

Eager-closure half Verdict
Aggregate closure ceiling ❌ over its ceiling
Per-chunk ceilings ❌ over its ceiling
Ceiling sensitivity (headroom) ✅ pass
Ceiling freshness (checkout vs. base branch) ✅ pass

📦 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.63KB 116.21KB
core (index.js) 6.96KB 2.79KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 180.05KB 50.21KB
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.37KB 46.41KB
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

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants