Skip to content

chore(deps): build @objectstack/* from objectstack main 2ec6827962 and follow its contract (objectui#12971) - #13043

Merged
objectstack-fleet[bot] merged 15 commits into
mainfrom
claude/issue-12971-pin-bump-main
Oct 19, 2026
Merged

objectstack-fleet[bot] merged 15 commits into
mainfrom
claude/issue-12971-pin-bump-main

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #12971

Clause-②: yes (narrowing)

Scope: move .objectstack-sha from 2c9bf9430a (the @objectstack/spec 18.0.0-next.3 release commit) to objectstack main f4755a68a797. Then follow every contract change between the two that turns something red here, with no tolerant fallback. The only exemptions are the bookings the seat ruled on objectui#12971 (record 6267645900, decisions D1 to D4).

The held cards' feature work is not done here: objectui#12932, objectui#12931, objectui#12929, objectui#12484 and objectui#13015. This PR makes their commits available.

The Undo snapshot and the renderers' row patch forwarding are objectui#13022's (PR #13033). That PR landed first by decision D3 and was merged into this branch.

Status: CI is green on head 2abf91da (33 success, 3 skipped; listed below). This body was refreshed once through the relay. It replaces the body written at 9310c0ea.

The pin

  • f4755a68a797d5a000cb8bd1c942cb2a9862108e was the newest objectstack main commit green at the move: 150 check-runs completed, none failed.
  • The first move went to 2ec6827962, whose packages read 18.0.0-next.4. objectstack never published or tagged next.4, so e2e/live/ci/backend.env had no published version to pair with. ci-cd-pipeline-doc.test.ts holds that file equal to the lockfile's spec version.
    • objectstack then released 18.0.0-next.5 at 820fd5aef0. scripts/bump-objectstack.sh moved the pin again, to f4755a68a7, which is past that release and reads next.5.
    • OBJECTSTACK_VERSION=18.0.0-next.5 now resolves the tag @objectstack/cli@18.0.0-next.5, and Live E2E passes on it.
  • Ancestry: git merge-base --is-ancestor SHA f4755a68a7 exits 0 for all of these:
    • 586705d85d, 1e001c7df, e15897c0f1, ef65646843 and adb7910f81;
    • 69f342b924, 3a734e0888 and 820fd5aef0;
    • the old pin 2c9bf9430a (201 commits apart).
    • On the same shallow checkout, 5b14b7f3ad (newer than the pin) exits 1 as the negative control.
  • pnpm-lock.yaml is unchanged: the seven packages declare the same dependency names.
  • After merging main, which brought objectui#13008's committed manifests, .objectstack-pin/*/package.json was rewritten by objectstack-pin.mjs build --write-manifests. Only the packed versions move.

Reds at the new pin, and what this PR does

red spec cause (objectstack) done here
parity: action:button / action:icon publish patch 69f342b924, a row's own patch is a tombstone the inputs blocks stop publishing it. Both are pinned by name as harvested tombstones; the patch member pin and the published-key list entry go
parity: carried 60 to 61, judged 40 to 41 194a42d1f7, list-view gains a ComponentPropsMap row list-view joins the covered set
parity: list-view publishes 6 of 44 live keys, 6 member pins owed 194a42d1f7 D1 = A: 38 keys and 6 member pins booked OWED to objectui#13047 under objectui#11111 decision 3 = B, expiry 2026-11-18. The caps rise to exactly those (unpublishedKeys 38, memberPins 6, member-pin ceiling 6). Nothing declared
parity: emptyState unpublished on record:details / record:highlights / record:quick_actions 586705d85d D2 = A: three UNPUBLISHED_EXEMPTIONS entries owned by objectui#12932 (the objectui#12370 precedent)
parity ledger: marketplace:installed-list, record:json 14a8bd2693, 030a7b83e8 both read RETIRED UPSTREAM
block-config.test.ts: stale record:json exclusion 030a7b83e8 exclusion removed
record-highlights-layout-9187 key list 586705d85d emptyState added
spec-object-refinements-7715 page census ef65646843, 3a734e0888 checkPageMainRegionWidth attached on both page nodes. checkPageRecordBindingPlacement attached on the page-kind node and recorded not attachable on the page node. Two describe blocks compare the spec's own issue, with controls
passing-keys-arms-11440, validate-passing-keys-11440 3a734e0888 width: 'large' removed from the main region
imported-defaults-8317 the two checks registered as refinement exceptions
ObjectTree.schemaTyped-8655 194a42d1f7 list-view added to the navigation / tree rows
MetadataService.specKeyObjectPayload / .retiredObjectEnabled 31e7d0ba27, defaultRowScope key count 45 to 46
navigation-spec-parity, nav-target.navEntryTypes-11790 26501ae24f (objectstack#24332), nav-item base dataSource mirrored by reference in NavigationItemSchema (it stripped the key before) and the NavigationItem type; NAV_ENTRY_BASE_KEYS keeps it on a retype
ci-cd-pipeline-doc (live-e2e pin) the bump backend.env set to 18.0.0-next.5 (see the pin section)
check:installed-pin-claims (25 files) the bump each sentence's fact re-measured (node probe, identical at both new pins) and restamped 18.0.0-next.5. Two fixture lines in check-lockfile-integrity.mjs ledgered historical
Type Check: action-button-undoable-11168 TS2353 69f342b924 D3 = A: objectui#13022 (PR #13033) landed first and rewrote the test. Merged here; the inputs blocks (this PR) and the forwarding lines (#13033) both kept

Clause-② (D4 = B): yes, both directions

Narrowings, refused with the spec's own message on safeValidateSchema and StrictAnyComponentSchema (objectui validate):

  • main region width: 'small' | 'medium' | 'large' on a page node or a page-kind node, at the region's width: "Region main is refused with width: 'large' (since @objectstack/spec 18): a main region takes only width: 'full'."
  • a record binding on a page-kind node, at record, for example: "record binds the row of an app page, and this page is type: 'home', which has no row to bind."
  • the patch input on action:button / action:icon is no longer published.

Widenings, the spec's keys by reference, which the strict face refused as undeclared before:

  • emptyState on the three bound record blocks. The renderer half is objectui#12932.
  • record on a page node, for any pageType. The renderer half is objectui#12931.
  • dataSource on navigation entries. The spec marks it planned.

The changeset (.changeset/12971-objectstack-pin-main.md, minor) carries the same line and both lists.

Ablation

checkPageMainRegionWidth was detached at both sites with ablation-replace.mjs: anchor x2 to x0, blob 1e46e7fa45cd to ed50b46f958d.

  • Result: Tests 3 failed | 97 passed. The three failures are exactly the main-width refusal rows; the controls stayed green.
  • Expected direction: red. Observed: red.
  • Restore: blob back to the HEAD blob 1e46e7fa45cd, and git diff HEAD is empty.

Verification at head 2abf91da

  • CI, all success: Build & E2E, Build Docs, Bundle Analysis, Changeset Bump Policy, Changeset Claim Re-read, Changeset Declaration, Changeset Fixed Group Check, Changeset Overwrite Report, Governed Surface Queue Guard, Line Citation Gate, Lint, Live E2E (informational), Repo Gates, Test, Test shards 1 to 16, Test (dist pins), Type Check, label.
  • CI skipped: the two coverage jobs and dependabot.
  • Local: pnpm type-check --concurrency=2 --continue gives Tasks: 81 successful, 81 total.
  • Local targeted run after the merge, 1203 of 1203 tests:
    • packages/components/src/renderers/action/__tests__/;
    • ActionRunner.declaredPatch-13022;
    • registry-inputs-spec-parity;
    • check-action-forward-parity (test and gate);
    • spec-object-refinements-7715;
    • imported-defaults-8317.
  • check-governed-queue-guard --test: NOT GOVERNED.
  • changeset:check, check:changeset-claims, check-changeset-presence, check:pending-changeset-literals, check:installed-pin-claims (OK) and check:lockfile-integrity (clean) all exit 0. check:lockfile-dedupe reads deduped.

Acceptance notes


Generated by Claude Code

feat(metadata-protocol): the draft save records draftChanges per key path;
the save declares its surface (?surface=studio|api, copilot in-process only)
(#24418)

objectstack@2ec6827962ac95a7bdbdad413fd74f65ca238e07

Moved with scripts/bump-objectstack.sh. pnpm install left pnpm-lock.yaml
unchanged: the seven pinned packages declare the same dependencies.

Claude-Session: https://claude.ai/code/session_0188TsgPV8kQXfuRuKmkj2ks
Co-authored-by: Claude <noreply@anthropic.com>
…ch retirement at the new pin

- @object-ui/types attaches the spec's checkPageMainRegionWidth on both page
  nodes beside checkPageRegionPlacement, and checkPageRecordBindingPlacement
  on the page-kind node only (it reads the kind from type, like
  checkPageDefaultPlacement); the census accounts for both.
- The two passing-keys fixtures stop authoring width 'large' on main.
- action:button and action:icon stop publishing the row patch input the spec
  retired; the operation input says the row runs its named action.
- The layout guide says a main region takes only width 'full'.

Claude-Session: https://claude.ai/code/session_0188TsgPV8kQXfuRuKmkj2ks
Co-authored-by: Claude <noreply@anthropic.com>
…new objectstack pin moves

- registry-inputs-spec-parity: list-view gains a ComponentPropsMap row and is
  judged (60 -> 61 carried, 40 -> 41 judged); record:json and
  marketplace:installed-list are retired upstream, so their ledger entries
  read RETIRED UPSTREAM; the two row patch tombstones are pinned by name and
  the patch member pin leaves with the input.
- block-config: record:json is no longer a PageComponentType, so its palette
  exclusion goes.
- record-highlights-layout-9187: the row gains emptyState.
- ObjectTree.schemaTyped-8655: the list-view row declares navigation and tree.
- action-button-icon-inputs-11168: patch leaves the published-key list.

Claude-Session: https://claude.ai/code/session_0188TsgPV8kQXfuRuKmkj2ks
Co-authored-by: Claude <noreply@anthropic.com>
The pinned build reads 18.0.0-next.4, so check:installed-pin-claims named 25
files claiming 18.0.0-next.3. Each sentence's fact was re-measured on the new
pin (a node probe over @objectstack/spec, @objectstack/lint and the automation
schema, plus source identity of the automation engine and view.zod.ts between
the two pins) and holds, so the stamp moves. The two lockfile-integrity
self-test lines are a synthetic registry key, ledgered historical.

Claude-Session: https://claude.ai/code/session_0188TsgPV8kQXfuRuKmkj2ks
Co-authored-by: Claude <noreply@anthropic.com>
…oundary; keep the 17.3.0 sentence the pin-claims control reads

imported-defaults-8317 lists checkPageMainRegionWidth and
checkPageRecordBindingPlacement as refinement exceptions (functions, not
schemas). The retired marketplace:installed-list ledger entry keeps its
"New in 17.3.0" history, the real line check-installed-spec-pin-claims'
refusal control reads.

Claude-Session: https://claude.ai/code/session_0188TsgPV8kQXfuRuKmkj2ks
Co-authored-by: Claude <noreply@anthropic.com>
… 46 (defaultRowScope)

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

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 skipped
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.

Brings in objectui#13008 (the committed .objectstack-pin manifests) and
objectui#12972 (the per-machine pin cache), which the pin bump must follow.

Claude-Session: https://claude.ai/code/session_0188TsgPV8kQXfuRuKmkj2ks
Co-authored-by: Claude <noreply@anthropic.com>
Written by `node scripts/objectstack-pin.mjs build --write-manifests` at the
new pin (objectui#13008 committed them after this branch was cut). Only the
packed versions move, 18.0.0-next.3 -> 18.0.0-next.4; `pnpm install` leaves
pnpm-lock.yaml unchanged.

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

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 77 chunks) 3193.2 KB 3744.1 KB
Main entry chunk (gzip) 80.8 KB 350 KB
Entry file index-CEjAIz5t.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 (buildIdentity.js) 0.80KB 0.49KB
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 21.17KB 7.81KB
app-shell (runtime-config.js) 24.52KB 8.48KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 45.59KB 12.03KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 20.67KB 6.12KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.74KB 3.94KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.62KB 0.83KB
auth (authStyles.js) 5.27KB 1.86KB
auth (createAuthClient.js) 42.84KB 11.66KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
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) 27.26KB 8.03KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (commentAuthorship.js) 1.39KB 0.78KB
collaboration (index.js) 1.93KB 0.85KB
collaboration (useCollaborationTranslation.js) 6.50KB 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) 614.54KB 149.66KB
core (index.js) 10.18KB 4.04KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 247.01KB 68.85KB
fields (index.js) 292.36KB 74.70KB
i18n (LocalizationContext.js) 2.92KB 1.42KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 36.87KB 9.88KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 41.33KB 11.96KB
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) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 15.35KB 5.51KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.82KB 2.38KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
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) 16.04KB 3.92KB
plugin-calendar (index.js) 55.04KB 16.10KB
plugin-charts (index.js) 85.06KB 23.39KB
plugin-chatbot (index.js) 238.30KB 56.26KB
plugin-dashboard (index.js) 147.53KB 39.95KB
plugin-designer (index.js) 233.95KB 50.08KB
plugin-detail (index.js) 263.95KB 70.02KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 181.16KB 46.84KB
plugin-gantt (index.js) 178.46KB 45.13KB
plugin-grid (index.js) 271.47KB 75.36KB
plugin-kanban (index.js) 63.37KB 19.51KB
plugin-list (index.js) 140.56KB 36.26KB
plugin-map (index.js) 27.17KB 9.00KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 46.66KB 13.13KB
plugin-timeline (index.js) 39.31KB 11.88KB
plugin-tree (index.js) 15.27KB 5.40KB
plugin-view (index.js) 94.68KB 24.36KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 12.07KB 3.68KB
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) 126.45KB 41.40KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.71KB 2.11KB
react (schema-input.js) 4.31KB 2.07KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.07KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.81KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
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) 1.13KB 0.65KB
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) 5.78KB 2.70KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (node-slots.js) 7.18KB 2.34KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (product-blocks.js) 0.20KB 0.19KB
types (record-approval-decision.js) 0.20KB 0.20KB
types (record-components.js) 0.20KB 0.19KB
types (record-panels.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) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.26KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.48KB 3.50KB
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

docs(skills): objectstack-data says which hook doors provide ctx.title (#24289) (#24504)

objectstack@f4755a68a797d5a000cb8bd1c942cb2a9862108e

The first move (2ec6827962) built packages that read 18.0.0-next.4, a version
objectstack never published or tagged, so the live-e2e backend pin
(e2e/live/ci/backend.env, held equal to the lockfile's spec version by
ci-cd-pipeline-doc.test.ts) had no published pair. f4755a68a7 is the newest
objectstack main commit green at this move (150 check-runs completed, none
failed) and is past the 18.0.0-next.5 release commit 820fd5aef0, so its
packages read 18.0.0-next.5, which npm publishes and
@objectstack/cli@18.0.0-next.5 tags.

- scripts/bump-objectstack.sh --no-commit built it and wrote the packed
  manifests; pnpm install leaves pnpm-lock.yaml unchanged.
- OBJECTSTACK_VERSION=18.0.0-next.5 in backend.env.
- The installed-pin claims move next.4 -> next.5: the same node probe reads
  every fact identically on the new pin, and service-automation's engine
  diff between the two pins touches none of the reads the start-gate table
  names.

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

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 77 chunks) 3199.4 KB 3744.1 KB
Main entry chunk (gzip) 80.8 KB 350 KB
Entry file index-wypz6qxd.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 (buildIdentity.js) 0.80KB 0.49KB
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 21.17KB 7.81KB
app-shell (runtime-config.js) 24.52KB 8.48KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 45.59KB 12.03KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 20.67KB 6.12KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.74KB 3.94KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.62KB 0.83KB
auth (authStyles.js) 5.27KB 1.86KB
auth (createAuthClient.js) 42.84KB 11.66KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
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) 27.26KB 8.03KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (commentAuthorship.js) 1.39KB 0.78KB
collaboration (index.js) 1.93KB 0.85KB
collaboration (useCollaborationTranslation.js) 6.50KB 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) 614.54KB 149.66KB
core (index.js) 10.18KB 4.04KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 247.01KB 68.85KB
fields (index.js) 292.36KB 74.70KB
i18n (LocalizationContext.js) 2.92KB 1.42KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 36.87KB 9.88KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 41.33KB 11.96KB
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) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 15.35KB 5.51KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.82KB 2.38KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
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) 16.04KB 3.92KB
plugin-calendar (index.js) 55.04KB 16.10KB
plugin-charts (index.js) 85.06KB 23.39KB
plugin-chatbot (index.js) 238.30KB 56.26KB
plugin-dashboard (index.js) 147.53KB 39.95KB
plugin-designer (index.js) 233.95KB 50.08KB
plugin-detail (index.js) 263.95KB 70.02KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 181.16KB 46.84KB
plugin-gantt (index.js) 178.46KB 45.13KB
plugin-grid (index.js) 271.47KB 75.36KB
plugin-kanban (index.js) 63.37KB 19.51KB
plugin-list (index.js) 140.56KB 36.26KB
plugin-map (index.js) 27.17KB 9.00KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 46.66KB 13.13KB
plugin-timeline (index.js) 39.31KB 11.88KB
plugin-tree (index.js) 15.27KB 5.40KB
plugin-view (index.js) 94.68KB 24.36KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 12.07KB 3.68KB
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) 126.45KB 41.40KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.71KB 2.11KB
react (schema-input.js) 4.31KB 2.07KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.07KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.81KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
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) 1.13KB 0.65KB
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) 5.78KB 2.70KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (node-slots.js) 7.18KB 2.34KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (product-blocks.js) 0.20KB 0.19KB
types (record-approval-decision.js) 0.20KB 0.20KB
types (record-components.js) 0.20KB 0.19KB
types (record-panels.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) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.26KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.48KB 3.50KB
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

…from the spec's nav-item base

objectstack#24332 gave the spec's shared nav-item base one API data source
(ElementApiDataSourceSchema), which navigation-spec-parity and the nav
editor's base-key pins read off the installed spec. NavigationItemSchema
takes it by reference (it stripped the key before), the NavigationItem type
derives it from the spec's ObjectNavItem, and the nav editor's base-key table
keeps it on a change of type. The spec marks it planned; nothing here reads
it.

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

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 77 chunks) 3199.4 KB 3744.1 KB
Main entry chunk (gzip) 80.8 KB 350 KB
Entry file index-D0X0UZ-j.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 (buildIdentity.js) 0.80KB 0.49KB
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 21.17KB 7.81KB
app-shell (runtime-config.js) 24.52KB 8.48KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 45.59KB 12.03KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 20.67KB 6.12KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.74KB 3.94KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.62KB 0.83KB
auth (authStyles.js) 5.27KB 1.86KB
auth (createAuthClient.js) 42.84KB 11.66KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
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) 27.26KB 8.03KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (commentAuthorship.js) 1.39KB 0.78KB
collaboration (index.js) 1.93KB 0.85KB
collaboration (useCollaborationTranslation.js) 6.50KB 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) 614.54KB 149.66KB
core (index.js) 10.18KB 4.04KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 247.01KB 68.85KB
fields (index.js) 292.36KB 74.70KB
i18n (LocalizationContext.js) 2.92KB 1.42KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 36.87KB 9.88KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 41.33KB 11.96KB
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) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 15.35KB 5.51KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.82KB 2.38KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
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) 16.04KB 3.92KB
plugin-calendar (index.js) 55.04KB 16.10KB
plugin-charts (index.js) 85.06KB 23.39KB
plugin-chatbot (index.js) 238.30KB 56.26KB
plugin-dashboard (index.js) 147.53KB 39.95KB
plugin-designer (index.js) 233.95KB 50.08KB
plugin-detail (index.js) 263.95KB 70.02KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 181.16KB 46.84KB
plugin-gantt (index.js) 178.46KB 45.13KB
plugin-grid (index.js) 271.47KB 75.36KB
plugin-kanban (index.js) 63.37KB 19.51KB
plugin-list (index.js) 140.56KB 36.26KB
plugin-map (index.js) 27.17KB 9.00KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 46.66KB 13.13KB
plugin-timeline (index.js) 39.31KB 11.88KB
plugin-tree (index.js) 15.27KB 5.40KB
plugin-view (index.js) 94.68KB 24.36KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 12.07KB 3.68KB
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) 126.45KB 41.40KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.71KB 2.11KB
react (schema-input.js) 4.31KB 2.07KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.07KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.81KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
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) 1.13KB 0.65KB
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) 5.78KB 2.70KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (node-slots.js) 7.18KB 2.34KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (product-blocks.js) 0.20KB 0.19KB
types (record-approval-decision.js) 0.20KB 0.20KB
types (record-components.js) 0.20KB 0.19KB
types (record-panels.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) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.26KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.48KB 3.50KB
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

…13047 and emptyState to objectui#12932; Clause-② reads yes

Seat decisions on objectui#12971 (record 6267645900):
- D1 = A, under objectui#11111 decision 3 = B: the 38 list-view spec keys
  the registration does not publish and its 6 owed member pins are booked
  OWED to objectui#13047 (expires 2026-11-18). Caps rise to exactly the
  booked entries (unpublishedKeys 38, memberPins 6,
  MEMBER_PIN_EXEMPTION_CEILING 6); nothing is declared.
- D2 = A, the objectui#12370 precedent: three UNPUBLISHED_EXEMPTIONS entries
  for emptyState on record:details, record:highlights and
  record:quick_actions, owned by objectui#12932.
- D4 = B: the changeset reads Clause-②: yes and lists both directions, the
  narrowings with the spec's messages.

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

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 77 chunks) 3199.4 KB 3744.1 KB
Main entry chunk (gzip) 80.8 KB 350 KB
Entry file index-CAOx3RXE.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 (buildIdentity.js) 0.80KB 0.49KB
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 21.17KB 7.81KB
app-shell (runtime-config.js) 24.52KB 8.48KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 45.59KB 12.03KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 20.67KB 6.12KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.74KB 3.94KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.62KB 0.83KB
auth (authStyles.js) 5.27KB 1.86KB
auth (createAuthClient.js) 42.84KB 11.66KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
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) 27.26KB 8.03KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (commentAuthorship.js) 1.39KB 0.78KB
collaboration (index.js) 1.93KB 0.85KB
collaboration (useCollaborationTranslation.js) 6.50KB 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) 614.54KB 149.66KB
core (index.js) 10.18KB 4.04KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 247.01KB 68.85KB
fields (index.js) 292.36KB 74.70KB
i18n (LocalizationContext.js) 2.92KB 1.42KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 36.87KB 9.88KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 41.33KB 11.96KB
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) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 15.35KB 5.51KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.82KB 2.38KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
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) 16.04KB 3.92KB
plugin-calendar (index.js) 55.04KB 16.10KB
plugin-charts (index.js) 85.06KB 23.39KB
plugin-chatbot (index.js) 238.30KB 56.26KB
plugin-dashboard (index.js) 147.53KB 39.95KB
plugin-designer (index.js) 233.95KB 50.08KB
plugin-detail (index.js) 263.95KB 70.02KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 181.16KB 46.84KB
plugin-gantt (index.js) 178.46KB 45.13KB
plugin-grid (index.js) 271.47KB 75.36KB
plugin-kanban (index.js) 63.37KB 19.51KB
plugin-list (index.js) 140.56KB 36.26KB
plugin-map (index.js) 27.17KB 9.00KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 46.66KB 13.13KB
plugin-timeline (index.js) 39.31KB 11.88KB
plugin-tree (index.js) 15.27KB 5.40KB
plugin-view (index.js) 94.68KB 24.36KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 12.07KB 3.68KB
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) 126.45KB 41.40KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.71KB 2.11KB
react (schema-input.js) 4.31KB 2.07KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.07KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.81KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
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) 1.13KB 0.65KB
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) 5.78KB 2.70KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (node-slots.js) 7.18KB 2.34KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (product-blocks.js) 0.20KB 0.19KB
types (record-approval-decision.js) 0.20KB 0.20KB
types (record-components.js) 0.20KB 0.19KB
types (record-panels.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) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.26KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.48KB 3.50KB
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

Brings in objectui#13022 (PR #13033), which landed first by the seat's
decision D3 = A on objectui#12971: the Undo snapshot reads the named
declaration's patch and no action renderer forwards a row patch. The action
renderers merged cleanly: this branch owns the inputs blocks, #13033 the
forwarding lines, and both are kept.

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

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 77 chunks) 3199.5 KB 3744.1 KB
Main entry chunk (gzip) 80.8 KB 350 KB
Entry file index-CQ3sXJtN.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 (buildIdentity.js) 0.80KB 0.49KB
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 21.17KB 7.81KB
app-shell (runtime-config.js) 24.52KB 8.48KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 45.59KB 12.03KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 20.67KB 6.12KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.74KB 3.94KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.62KB 0.83KB
auth (authStyles.js) 5.27KB 1.86KB
auth (createAuthClient.js) 42.84KB 11.66KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
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) 27.26KB 8.03KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (commentAuthorship.js) 1.39KB 0.78KB
collaboration (index.js) 1.93KB 0.85KB
collaboration (useCollaborationTranslation.js) 6.50KB 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) 614.46KB 149.64KB
core (index.js) 10.18KB 4.04KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 247.01KB 68.85KB
fields (index.js) 292.36KB 74.70KB
i18n (LocalizationContext.js) 2.92KB 1.42KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 36.87KB 9.88KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 41.33KB 11.96KB
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) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 15.35KB 5.51KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.82KB 2.38KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
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) 16.04KB 3.92KB
plugin-calendar (index.js) 55.04KB 16.10KB
plugin-charts (index.js) 85.06KB 23.39KB
plugin-chatbot (index.js) 238.30KB 56.26KB
plugin-dashboard (index.js) 147.53KB 39.95KB
plugin-designer (index.js) 233.95KB 50.08KB
plugin-detail (index.js) 263.95KB 70.02KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 181.16KB 46.84KB
plugin-gantt (index.js) 178.46KB 45.13KB
plugin-grid (index.js) 271.47KB 75.36KB
plugin-kanban (index.js) 63.37KB 19.51KB
plugin-list (index.js) 140.56KB 36.26KB
plugin-map (index.js) 27.17KB 9.00KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 46.66KB 13.13KB
plugin-timeline (index.js) 39.31KB 11.88KB
plugin-tree (index.js) 15.27KB 5.40KB
plugin-view (index.js) 94.68KB 24.36KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 12.07KB 3.68KB
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) 126.45KB 41.40KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.71KB 2.11KB
react (schema-input.js) 4.31KB 2.07KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.07KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.81KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
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) 1.13KB 0.65KB
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) 5.78KB 2.70KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (node-slots.js) 7.18KB 2.34KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (product-blocks.js) 0.20KB 0.19KB
types (record-approval-decision.js) 0.20KB 0.20KB
types (record-components.js) 0.20KB 0.19KB
types (record-panels.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) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.26KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.48KB 3.50KB
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

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 2abf91da744620a9a2891ef2a1da57b55428ba69
Local-runs: none
Scope: .objectstack-pin/client/package.json, .objectstack-pin/core/package.json, .objectstack-pin/formula/package.json, .objectstack-pin/lint/package.json, .objectstack-pin/sdui-parser/package.json, .objectstack-pin/spec/package.json, .objectstack-pin/types/package.json, .objectstack-sha, apps/console/src/tests/registry-inputs-spec-parity.test.ts, e2e/live/ci/backend.env, packages/app-shell/src/services/MetadataService.retiredObjectEnabled.test.ts, packages/app-shell/src/services/MetadataService.specKeyObjectPayload.test.ts, packages/app-shell/src/views/metadata-admin/celAuthoring.ts, packages/app-shell/src/views/metadata-admin/inspectors/FlowNodeInspector.declaredDefault.test.tsx, packages/app-shell/src/views/metadata-admin/inspectors/flow-node-config.startGates-12780.test.ts, packages/app-shell/src/views/metadata-admin/inspectors/flowSingleBrace-12329.test.tsx, packages/app-shell/src/views/metadata-admin/inspectors/nav-target.navEntryTypes-11790.test.ts, packages/app-shell/src/views/metadata-admin/inspectors/nav-target.ts, packages/app-shell/src/views/metadata-admin/previews/block-types.ts, packages/app-shell/src/views/metadata-admin/previews/flow-canvas-seeds.saveErrors-10948.test.tsx, packages/cli/src/tests/validate-passing-keys-11440.test.ts, packages/components/src/renderers/action/tests/action-button-icon-inputs-11168.test.tsx, packages/components/src/renderers/action/action-button.tsx, packages/components/src/renderers/action/action-icon.tsx, packages/core/src/evaluator/optionRules.ts, packages/plugin-calendar/src/ObjectCalendar.tsx, packages/plugin-calendar/src/tests/calendarUnionReads-8651.test.tsx, packages/plugin-designer/src/MetadataFieldsPage.tsx, packages/plugin-detail/src/index.tsx, packages/plugin-form/src/tests/formSectionGroupReference-7051.test.tsx, packages/plugin-form/src/tests/masterDetailDetailsMembers-8071.test.tsx, packages/plugin-gantt/src/readme-navigation-example.test.ts, packages/plugin-kanban/src/index.tsx, packages/plugin-tree/src/ObjectTree.schemaTyped-8655.test.ts, packages/types/src/tests/chartconfig-aria-retired-4044.test.ts, packages/types/src/tests/dashboard-aria-retired-contract-twins.test.ts, packages/types/src/tests/imported-defaults-8317.test.ts, packages/types/src/tests/object-view-unmirrored-keys-7779.test.ts, packages/types/src/tests/passing-keys-arms-11440.test.ts, packages/types/src/tests/record-details-top-level-9040.test.ts, packages/types/src/tests/record-highlights-layout-9187.test.ts, packages/types/src/tests/spec-object-refinements-7715.test.ts, packages/types/src/app.ts, packages/types/src/field-types.ts, packages/types/src/objectql.ts, packages/types/src/record-components.ts, packages/types/src/zod/app.zod.ts, packages/types/src/zod/layout.zod.ts, packages/types/src/zod/objectql.zod.ts, scripts/check-installed-spec-pin-claims.mjs + the prose faces read for ② and ③ (.changeset/12971-objectstack-pin-main.md, content/docs/guide/layout.md); the spec at the new pin f4755a68a797 and the old pin 2c9bf9430a (objectstack packages/spec/src/ui/page.zod.ts, packages/spec/src/ui/component.zod.ts, packages/spec/src/ui/view.zod.ts, packages/spec/src/ui/app.zod.ts, packages/spec/src/data/object.zod.ts, packages/spec/src/ui/index.ts); the objectui files the hunks make claims about, at this head (packages/plugin-list/src/index.tsx, packages/plugin-detail/src/index.tsx, packages/components/src/renderers/layout/page.tsx, scripts/check-lockfile-integrity.mjs, packages/app-shell/src/views/RecordDetailView.recordOpenWaves-13010.test.tsx, packages/components/src/__tests__/page-single-h1.test.tsx); the fleet's Clause-②: reader (objectstack scripts/pm/clause2-line.mjs, scripts/pm/record-recognisers.mjs); the owner cards the bookings name (objectui#13047, objectui#12932), the filed card objectstack#24534, and PR #13033's merge.

① Derived judgments

Every accept-set and public-surface change the diff implies, read in the cited code. Each is named right or wrong; none is wrong.

  1. PageNodeSchema and PageKindNodeSchema narrow on the main region's width — right. checkPageMainRegionWidth is attached by identifier on both nodes. At the pin it is an exported function in the spec's page.zod.ts, re-exported through @objectstack/spec/ui, and the eighth check on the spec's own PageSchema; absent at 2c9bf9430a. It reads each region's name and width only, which objectui's PageNodeRegionSchema carries with the same meaning: PageRegionWidthSchema is small | medium | large | full, and page.tsx reads a main region's width for one thing, the full-bleed predicate (r.name?.toLowerCase() === 'main' && r.width === 'full'); header and footer go through getRegionWidthClass, sidebar and aside through getSidebarWidthClass. The refusal reaches safeValidateSchema and StrictAnyComponentSchema with the spec's issue at regions.N.width, pinned with controls (full on main, no width, large on aside). The two passing-keys-11440 fixtures drop width: 'large' on main, which renders the same. content/docs/guide/layout.md says the same thing the spec's message says.
  2. PageKindNodeSchema narrows on the record binding — right; PageNodeSchema records it notAttachable — right, with the gap named. checkPageRecordBindingPlacement judges record by the page's type (PAGE_TYPE_DEFAULT when absent) and refuses every type but app. The kind node's type is the kind (record, home, utility), none of which is app, so the binding is refused there with the spec's message. On the page node type is the discriminator 'page', so attached there the check would refuse every record, a pageType: 'app' page's included; the census records it beside checkPageDefaultPlacement, the same shape objectui#12626 ruled. Consequence, declared in the changeset and not hidden: the page node accepts record on any pageType, wider than the spec on the non-app kinds, until the renderer half (objectui#12931) lands.
  3. record arrives on both page nodes by reference — right. PageRecordBindingSchema and the record member of PageSchema are absent at the old pin and present at the new; SpecPageFields carries the key by reference, so the strict face stops refusing it as undeclared. Nothing authored.
  4. NavigationItemObject gains dataSource by reference — right. The spec's nav-item base declares dataSource: ElementApiDataSourceSchema.optional() at the pin, marked [PLANNED — not yet rendered], on every branch but separator, which spreads nothing and answers the key with SEPARATOR_NAV_ITEM_GUIDANCE; the old pin's app.zod.ts has no dataSource. objectui takes ElementApiDataSourceSchema (exported from the spec's page.zod.ts) through stripImportedDefaults, .optional(); before, the z.object stripped the key, so an authored binding validated clean and was thrown away. NavigationEntryItem.dataSource?: SpecObjectNavItem['dataSource'] and NAV_ENTRY_BASE_KEYS gaining 'dataSource' (kept on a retype, beside visible) follow the same base. Gap, filed: the spec attaches navItemVisibleDataNeedsDataSource with .superRefine on its union but does not export it, so objectui's flat object cannot attach it by identifier and accepts a visible that reads data with no dataSource; objectstack#24534 (open) asks for the export. Leaving it unattached is right (restating a spec check is forbidden); attaching it is that card's.
  5. action:button and action:icon stop publishing patch — right. At the pin both rows carry patch: rowPatchRetired(...), a retiredKey() tombstone (objectstack#24394, ADR-0110 D2), and the row judge refuses operation: 'update' with no name; the rewritten operation description says exactly that. patch leaves ACTION_LEAF_MEMBER_CLAIMS and the inputs pin's LEAF_KEYS, and enters the parity test's HARVESTED list, whose four assertions (still listed, reads as a tombstone, no longer demanded, not exempted) fit a key that was published rather than exempted. The registry's inputs are a public surface (the sdui manifest gate, Studio's palette), so this is a narrowing. Forwarding and the Undo snapshot are objectui#13022's, landed first by PR fix(core,components): an update's Undo covers its named declaration's patch, and no action renderer forwards a row patch (objectui#13022) #13033.
  6. PALETTE_EXCLUSIONS drops record:json — right. At the pin ComponentPropsMap['record:json'] is retiredComponentProps('record:json') and the type is out of PageComponentType, so an exclusion would name a type the palette cannot offer.
  7. The parity ledger — right, reconciled against the pin. ComponentPropsMap has 60 rows at 2c9bf9430a and 61 at f4755a68a797; the one new row is 'list-view': ListViewPageProps, so MINOR_18_MAIN_BLOCKS, 60 → 61 and 40 → 41 hold. record:json and marketplace:installed-list keep rows as retiredComponentProps refusal doors (objectstack#24162 030a7b83e8, objectstack#24255 14a8bd2693), so ledgeredUnjudgeable stays 13 and their entries read RETIRED UPSTREAM.
    • D1 booking. ListViewPageProps is ListViewShapeSchema.shape with columns optional and options from VIEW_METADATA_MEMBERS.listOverlay. The shape carries 51 keys: 7 are retiredKey() tombstones (responsive, performance, striped, bordered, virtualScroll, pageName, tabs) and aria is the file's blanket cross-block exclusion (objectui#3808), leaving 43 live, plus options = 44. The registration in packages/plugin-list/src/index.tsx publishes exactly data, type, columns, filter, sort, options; the 38 booked keys are exactly the remainder — no typo, nothing missing, nothing extra. The six member pins are the four array/object-armed inputs plus data and the node-level dataSource the member population already carries for every bound block. The caps move to exactly the bookings (unpublishedKeys 38, memberPins 6, MEMBER_PIN_EXEMPTION_CEILING 6), objectui11111OwnerOf routes list-view.* by block, the per-owner count reads 44, and OBJECTUI_12971_EXPIRES = '2026-11-18' is thirty days from the decision. Owner card objectui#13047 exists, Blocked-by: #12971, and its done-when strikes these rows. The bump declares nothing.
    • D2 entries. RecordDetailsProps, RecordHighlightsProps and RecordQuickActionsProps each declare emptyState: EmptyStateSchema.optional() at the pin (absent at the old); the three plugin-detail registrations publish no emptyState; each reason names objectstack#24270 and objectui#12932 (open, the renderer's owner), which satisfies the entry rule ("states a reason and references a tracking issue"); the blocks are not on LAZY_REGISTERED_BLOCKS, so no backlog ceiling moves. The precedent shape is kept.
  8. Spec-fact re-points — right. record-highlights-layout-9187 gains emptyState; ObjectTree.schemaTyped-8655 adds list-view to the navigation and tree rows (the row is the list view's own shape); the two MetadataService pins read 46 (the only top-level ObjectSchema key added between the pins is defaultRowScope); imported-defaults-8317 registers the two checks; the spec-object-refinements-7715 census on the page node reads 5 attached + 3 not attachable = the eight checks the spec's PageSchema carries; nav-target.navEntryTypes-11790 adds dataSource to the base values.
  9. Mechanical — right. .objectstack-sha is f4755a68a797d5a000cb8bd1c942cb2a9862108e, whose packages/spec/package.json reads 18.0.0-next.5; every sha the body names is its ancestor (586705d85d, 1e001c7df, e15897c0f1, ef65646843, adb7910f81, 69f342b924, 3a734e0888, 820fd5aef0, 194a42d1f7, 14a8bd2693, 030a7b83e8, 26501ae24f, 31e7d0ba27, and 2c9bf9430a, 201 commits back). The seven .objectstack-pin/*/package.json manifests move version strings only. backend.env reads OBJECTSTACK_VERSION=18.0.0-next.5 and Live E2E is green on it. The check-installed-spec-pin-claims.mjs LEDGER row is accurate: the two 18.0.0-next.3 sites in check-lockfile-integrity.mjs are self-test fixture strings (run([PIN], [PIN, '@objectstack/spec@18.0.0-next.3'])), a registry key that must not be the pin. Restamped measurement comments spot-checked at the pin: ObjectCalendarPropsSchema declares ten flat members including navigation; ObjectKanbanPropsSchema declares fifteen top-level keys with quickAdd the tombstone.

② Semver level

  • Changeset .changeset/12971-objectstack-pin-main.md: minor on @object-ui/types, @object-ui/components, @object-ui/app-shell, @object-ui/console, @object-ui/runner — right. All five are in the fixed group; objectui declares no major off a cross-major sync and writes breaking semantics in the body. The body carries, for each narrowing, the FROM → TO mapping, the one-line fix and the spec's own message (checkPageMainRegionWidth, checkPageRecordBindingPlacement, the retired row patch), and the widening list matches ① (the three emptyState keys, record on a page node, nav dataSource). Not skip-changeset, correctly: published src/ of released packages moves.
  • Clause-②: line — value right, arm WRONG. Both carriers (the changeset and the PR body) read Clause-②: yes. yes is true: three keys the strict face refused as undeclared are accepted by reference now. But the diff also narrows three published accept sets, and the line names no direction. The fleet's one reader of that line, clause2-line.mjs, spells this case out: "yes (narrowing) — a diff that widens one surface and narrows another. Both facts are true and both are read", and "An ABSENT arm therefore declares NO DIRECTION"; reviewFace reads yes (narrowing) as the spelling that owes the narrowing face. The card's done-when 3 asks a narrowed accept set to carry the (narrowing) arm. As committed, the tree declares no narrowing, so the narrowing face this record is served on is not the face the tree declares — the defect the arm exists to remove, a narrowing shipping to consumers with every gate green. D4's value (B, yes) stands; the dropped arm does not. Fix: Clause-②: yes (narrowing) on the changeset and the PR body. minor is unchanged, and nothing else moves: objectui's changeset gates read no Clause-②: value, and the fleet reader reads this spelling as declared.
  • Check-runs on 2abf91da: 33 success, 3 skipped (the two coverage jobs, dependabot), none pending. Every gate verdict is green; none of them reads the arm, which is why this record is where it is caught.

③ Boundary flags

  • D1 (the list-view row) = A — judged right (① 7). Booked, capped exactly, routed by block, expiring, owned by an open card. ⛔ C stays rejected.
  • D2 (emptyState on the three bound record blocks) = A — judged right (① 7). Booking under the ruled precedent, not tolerance.
  • D3 (action-button-undoable-11168 TS2353) = A — judged right. PR fix(core,components): an update's Undo covers its named declaration's patch, and no action renderer forwards a row patch (objectui#13022) #13033 merged as 61ed5ada, which is this PR's merge-base; Type Check is green at this head; neither branch edited the other's file.
  • D4 (Clause-②) = B — value right, arm missing. The FAIL reason, with its one-token fix, is in ②.
  • Out-of-scope finding (nav visible reading data with no dataSource accepted here, refused by the spec): filed as objectstack#24534, which exists and is open; attached here once the spec exports the check. Accepted.
  • Stale body: refreshed at this head and read against the diff — the pin, the ancestry proof, the reds table, the CI list and the ablation are accurate.
  • Acceptance note (not blocking): RecordDetailView.recordOpenWaves-13010.test.tsx (three sites) and page-single-h1.test.tsx (one) still author width: 'large' on main. Nothing validates them and the renderer reads no such width, so nothing reds and nothing renders differently. A one-key delete per site, in the fix push or when those files are next touched, keeps the fixtures spec-clean; not required for this verdict.
  • Acceptance note: the installed-pin-claims gate and the live-e2e pin compare version strings, not commits, so a pin moving inside one version string prompts no re-measurement. A known limit of those two instruments, not this PR's to change.
  • No open_questions entry is left unanswered; nothing here needs the maintainer.

Implemented-by: claude/issue-12971-pin-bump-main
Reviewed-by: session_0188TsgPV8kQXfuRuKmkj2ks

VERDICT: FAIL

One reason: the Clause-②: line omits the (narrowing) arm on a diff that narrows three published accept sets — write Clause-②: yes (narrowing) on .changeset/12971-objectstack-pin-main.md and the PR body, and nothing else. Everything in ① and the rest of ② and ③ stands; the re-review of the next head is a re-read of that line.


Generated by Claude Code

The contract review on PR #13043 (record 6268625896): a diff that widens one
surface and narrows another reads `Clause-②: yes (narrowing)`, the fleet
reader's spelling (clause2-line.mjs). The two-direction lists are unchanged.

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

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 77 chunks) 3199.5 KB 3744.1 KB
Main entry chunk (gzip) 80.8 KB 350 KB
Entry file index-Blj1MdmG.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 (buildIdentity.js) 0.80KB 0.49KB
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 21.17KB 7.81KB
app-shell (runtime-config.js) 24.52KB 8.48KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.11KB 3.87KB
auth (ActiveOrganizationStorage.js) 27.95KB 10.04KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 45.59KB 12.03KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 20.67KB 6.12KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.74KB 3.94KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.62KB 0.83KB
auth (authStyles.js) 5.27KB 1.86KB
auth (createAuthClient.js) 42.84KB 11.66KB
auth (createAuthenticatedFetch.js) 8.54KB 3.46KB
auth (index.js) 3.63KB 1.64KB
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) 27.26KB 8.03KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.28KB 2.60KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (commentAuthorship.js) 1.39KB 0.78KB
collaboration (index.js) 1.93KB 0.85KB
collaboration (useCollaborationTranslation.js) 6.50KB 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) 614.46KB 149.64KB
core (index.js) 10.18KB 4.04KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 247.01KB 68.85KB
fields (index.js) 292.36KB 74.70KB
i18n (LocalizationContext.js) 2.92KB 1.42KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 2.59KB 1.22KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 8.87KB 3.64KB
i18n (index.js) 5.52KB 2.39KB
i18n (pickLocalized.js) 9.86KB 3.95KB
i18n (provider.js) 39.35KB 12.88KB
i18n (translateFn.js) 0.20KB 0.18KB
i18n (useDisplayLocale.js) 3.52KB 1.76KB
i18n (useObjectLabel.js) 36.87KB 9.88KB
i18n (useSafeTranslation.js) 7.14KB 2.92KB
layout (index.js) 41.33KB 11.96KB
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) 6.62KB 2.45KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useSpecGesture.js) 5.52KB 2.10KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 15.35KB 5.51KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.82KB 2.38KB
permissions (discardProofCache.js) 1.04KB 0.55KB
permissions (evaluator.js) 8.33KB 3.07KB
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) 16.04KB 3.92KB
plugin-calendar (index.js) 55.04KB 16.10KB
plugin-charts (index.js) 85.06KB 23.39KB
plugin-chatbot (index.js) 238.30KB 56.26KB
plugin-dashboard (index.js) 147.53KB 39.95KB
plugin-designer (index.js) 233.95KB 50.08KB
plugin-detail (index.js) 263.95KB 70.02KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 181.16KB 46.84KB
plugin-gantt (index.js) 178.46KB 45.13KB
plugin-grid (index.js) 271.47KB 75.36KB
plugin-kanban (index.js) 63.37KB 19.51KB
plugin-list (index.js) 140.56KB 36.26KB
plugin-map (index.js) 27.17KB 9.00KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 46.66KB 13.13KB
plugin-timeline (index.js) 39.31KB 11.88KB
plugin-tree (index.js) 15.27KB 5.40KB
plugin-view (index.js) 94.68KB 24.36KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 12.07KB 3.68KB
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) 126.45KB 41.40KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.71KB 2.11KB
react (schema-input.js) 4.31KB 2.07KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (body-dialect.js) 4.50KB 1.99KB
sdui-parser (codegen.js) 9.45KB 3.76KB
sdui-parser (dashboard-widget-options.js) 3.07KB 1.30KB
sdui-parser (index.js) 7.30KB 3.12KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 25.28KB 7.81KB
sdui-parser (provenance.js) 3.84KB 1.90KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 23.87KB 7.83KB
types (ai.js) 4.39KB 2.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 4.12KB 1.61KB
types (authoring-nodes.js) 0.20KB 0.19KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (cloud.js) 0.20KB 0.18KB
types (complex.js) 4.44KB 2.07KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (dashboard-widget-layout.js) 2.06KB 0.96KB
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) 1.13KB 0.65KB
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) 5.78KB 2.70KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 5.00KB 2.39KB
types (navigation.js) 0.20KB 0.18KB
types (node-slots.js) 7.18KB 2.34KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 2.52KB 1.31KB
types (plugin-scope.js) 0.20KB 0.18KB
types (product-blocks.js) 0.20KB 0.19KB
types (record-approval-decision.js) 0.20KB 0.20KB
types (record-components.js) 0.20KB 0.19KB
types (record-panels.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) 4.99KB 1.96KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (strict-authoring-face.js) 19.93KB 7.26KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 8.48KB 3.50KB
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

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 4a292e16221d9f16d70111bdfe8d39400582c0cf
Local-runs: none
Scope: .objectstack-pin/client/package.json, .objectstack-pin/core/package.json, .objectstack-pin/formula/package.json, .objectstack-pin/lint/package.json, .objectstack-pin/sdui-parser/package.json, .objectstack-pin/spec/package.json, .objectstack-pin/types/package.json, .objectstack-sha, apps/console/src/tests/registry-inputs-spec-parity.test.ts, e2e/live/ci/backend.env, packages/app-shell/src/services/MetadataService.retiredObjectEnabled.test.ts, packages/app-shell/src/services/MetadataService.specKeyObjectPayload.test.ts, packages/app-shell/src/views/metadata-admin/celAuthoring.ts, packages/app-shell/src/views/metadata-admin/inspectors/FlowNodeInspector.declaredDefault.test.tsx, packages/app-shell/src/views/metadata-admin/inspectors/flow-node-config.startGates-12780.test.ts, packages/app-shell/src/views/metadata-admin/inspectors/flowSingleBrace-12329.test.tsx, packages/app-shell/src/views/metadata-admin/inspectors/nav-target.navEntryTypes-11790.test.ts, packages/app-shell/src/views/metadata-admin/inspectors/nav-target.ts, packages/app-shell/src/views/metadata-admin/previews/block-types.ts, packages/app-shell/src/views/metadata-admin/previews/flow-canvas-seeds.saveErrors-10948.test.tsx, packages/cli/src/tests/validate-passing-keys-11440.test.ts, packages/components/src/renderers/action/tests/action-button-icon-inputs-11168.test.tsx, packages/components/src/renderers/action/action-button.tsx, packages/components/src/renderers/action/action-icon.tsx, packages/core/src/evaluator/optionRules.ts, packages/plugin-calendar/src/ObjectCalendar.tsx, packages/plugin-calendar/src/tests/calendarUnionReads-8651.test.tsx, packages/plugin-designer/src/MetadataFieldsPage.tsx, packages/plugin-detail/src/index.tsx, packages/plugin-form/src/tests/formSectionGroupReference-7051.test.tsx, packages/plugin-form/src/tests/masterDetailDetailsMembers-8071.test.tsx, packages/plugin-gantt/src/readme-navigation-example.test.ts, packages/plugin-kanban/src/index.tsx, packages/plugin-tree/src/ObjectTree.schemaTyped-8655.test.ts, packages/types/src/tests/chartconfig-aria-retired-4044.test.ts, packages/types/src/tests/dashboard-aria-retired-contract-twins.test.ts, packages/types/src/tests/imported-defaults-8317.test.ts, packages/types/src/tests/object-view-unmirrored-keys-7779.test.ts, packages/types/src/tests/passing-keys-arms-11440.test.ts, packages/types/src/tests/record-details-top-level-9040.test.ts, packages/types/src/tests/record-highlights-layout-9187.test.ts, packages/types/src/tests/spec-object-refinements-7715.test.ts, packages/types/src/app.ts, packages/types/src/field-types.ts, packages/types/src/objectql.ts, packages/types/src/record-components.ts, packages/types/src/zod/app.zod.ts, packages/types/src/zod/layout.zod.ts, packages/types/src/zod/objectql.zod.ts, scripts/check-installed-spec-pin-claims.mjs + the prose faces read for ② and ③ (.changeset/12971-objectstack-pin-main.md, content/docs/guide/layout.md); the spec at the new pin f4755a68a797 and the old pin 2c9bf9430a (objectstack packages/spec/src/ui/page.zod.ts, packages/spec/src/ui/component.zod.ts, packages/spec/src/ui/view.zod.ts, packages/spec/src/ui/app.zod.ts, packages/spec/src/data/object.zod.ts, packages/spec/src/ui/index.ts); the objectui files the hunks make claims about, at this head (packages/plugin-list/src/index.tsx, packages/plugin-detail/src/index.tsx, packages/components/src/renderers/layout/page.tsx, scripts/check-lockfile-integrity.mjs, packages/app-shell/src/views/RecordDetailView.recordOpenWaves-13010.test.tsx, packages/components/src/__tests__/page-single-h1.test.tsx); the fleet's Clause-②: reader (objectstack scripts/pm/clause2-line.mjs, scripts/pm/record-recognisers.mjs); the owner cards the bookings name (objectui#13047, objectui#12932), the filed card objectstack#24534, PR #13033's merge, and the earlier record on this PR, comment 6268625896 (head 2abf91da).

What moved since the earlier record, read in the tree. One commit, 4a292e16, since 2abf91da: git diff between the two heads is one file, one line, .changeset/12971-objectstack-pin-main.md, Clause-②: yes → Clause-②: yes (narrowing). The merge-base with main is unchanged (61ed5ada, PR #13033's merge), so the net diff against main at this head is the earlier one with that line changed and nothing else: 52 files, 448 insertions, 131 deletions, the same file list. The PR body carries the same change: its line 3 reads Clause-②: yes (narrowing). No comment was added to card #12971 since the seat's decisions (6267645900); the only PR comment since the earlier record is the performance-budget bot's. Every judgment of record 6268625896 whose inputs are untouched by that one line is carried forward below and marked so; the one that line resolves is re-read.

① Derived judgments

Carried forward from 6268625896 unchanged — the line that moved touches no accept set, no public surface, no spec row and no registration, so each judgment's inputs are byte-identical at this head. Each remains right; none is wrong.

  1. PageNodeSchema and PageKindNodeSchema narrow on the main region's width — right. checkPageMainRegionWidth attached by identifier on both nodes; exported from the spec's page.zod.ts through @objectstack/spec/ui, the eighth check on the spec's PageSchema, absent at 2c9bf9430a. It reads each region's name and width, which objectui's PageNodeRegionSchema carries with the meaning page.tsx reads: the only main width read is the full-bleed predicate (r.name?.toLowerCase() === 'main' && r.width === 'full'). Refusal reaches safeValidateSchema and StrictAnyComponentSchema with the spec's issue at regions.N.width, pinned with controls; the two passing-keys-11440 fixtures drop width: 'large' on main; layout.md says what the spec's message says.
  2. PageKindNodeSchema narrows on the record binding — right; PageNodeSchema records it notAttachable — right, gap named. checkPageRecordBindingPlacement judges by page.type and refuses every type but app; on the page node type is the discriminator 'page', so attached there it would refuse every record, a pageType: 'app' page's included — the shape checkPageDefaultPlacement already has (objectui#12626). Consequence declared in the changeset: the page node accepts record on any pageType, wider than the spec on the non-app kinds, until objectui#12931's renderer half.
  3. record arrives on both page nodes by reference — right. PageRecordBindingSchema and the record member of PageSchema are absent at the old pin, present at the new; SpecPageFields carries it. Nothing authored.
  4. NavigationItemObject gains dataSource by reference — right. The spec's nav-item base declares dataSource: ElementApiDataSourceSchema.optional() (planned, not rendered) on every branch but separator; objectui takes it through stripImportedDefaults, .optional(), where the z.object used to strip it. NavigationEntryItem.dataSource?: SpecObjectNavItem['dataSource'] and NAV_ENTRY_BASE_KEYS gaining 'dataSource' follow. Gap filed: the spec's navItemVisibleDataNeedsDataSource is attached but not exported, so objectui cannot attach it by identifier — objectstack#24534, open.
  5. action:button and action:icon stop publishing patch — right. Both rows carry patch: rowPatchRetired(...) at the pin (objectstack#24394, ADR-0110 D2); the row judge refuses operation: 'update' with no name, which the rewritten operation description states. patch leaves ACTION_LEAF_MEMBER_CLAIMS and LEAF_KEYS and enters the parity test's HARVESTED list. Forwarding and Undo are objectui#13022's, landed first by PR fix(core,components): an update's Undo covers its named declaration's patch, and no action renderer forwards a row patch (objectui#13022) #13033.
  6. PALETTE_EXCLUSIONS drops record:json — right. ComponentPropsMap['record:json'] is retiredComponentProps('record:json') at the pin and the type is out of PageComponentType.
  7. The parity ledger — right, reconciled against the pin. ComponentPropsMap 60 rows at 2c9bf9430a, 61 at f4755a68a797, the one new row 'list-view': ListViewPageProps; record:json and marketplace:installed-list keep rows as refusal doors, so ledgeredUnjudgeable stays 13 and both read RETIRED UPSTREAM. D1 booking: ListViewShapeSchema carries 51 keys, 7 of them retiredKey() tombstones (responsive, performance, striped, bordered, virtualScroll, pageName, tabs) and aria the file's blanket exclusion (objectui#3808) — 43 live, plus the page row's options = 44; the registration in packages/plugin-list/src/index.tsx publishes exactly data, type, columns, filter, sort, options; the 38 booked keys are exactly the remainder; the six member pins are the four array/object-armed inputs plus data and the node-level dataSource the population carries for every bound block; caps exact (38 / 6 / ceiling 6), routed by block, per-owner count 44, OBJECTUI_12971_EXPIRES = '2026-11-18' thirty days from the decision; owner card objectui#13047 exists, Blocked-by: #12971. The bump declares nothing. D2 entries: RecordDetailsProps, RecordHighlightsProps, RecordQuickActionsProps each declare emptyState: EmptyStateSchema.optional() at the pin, absent at the old; the three plugin-detail registrations publish no emptyState; each reason names objectstack#24270 and objectui#12932 (open), satisfying the entry rule; the blocks are not on LAZY_REGISTERED_BLOCKS, so no backlog ceiling moves.
  8. Spec-fact re-points — right. record-highlights-layout-9187 gains emptyState; ObjectTree.schemaTyped-8655 adds list-view to the navigation and tree rows; the two MetadataService pins read 46 (defaultRowScope is the only top-level ObjectSchema key added between the pins); imported-defaults-8317 registers the two checks; the spec-object-refinements-7715 census on the page node reads 5 attached + 3 not attachable = the spec's eight; nav-target.navEntryTypes-11790 adds dataSource to the base values.
  9. Mechanical — right. .objectstack-sha is f4755a68a797d5a000cb8bd1c942cb2a9862108e (@objectstack/spec reads 18.0.0-next.5); every sha the body names is its ancestor, 2c9bf9430a 201 commits back; the seven .objectstack-pin/*/package.json manifests move version strings only; backend.env reads OBJECTSTACK_VERSION=18.0.0-next.5 and Live E2E is green on it; the check-installed-spec-pin-claims.mjs LEDGER row names two self-test fixture strings in check-lockfile-integrity.mjs; restamped measurement comments spot-checked at the pin (ObjectCalendarPropsSchema ten flat members including navigation; ObjectKanbanPropsSchema fifteen top-level keys with quickAdd the tombstone).

② Semver level

  • Changeset .changeset/12971-objectstack-pin-main.md: minor on @object-ui/types, @object-ui/components, @object-ui/app-shell, @object-ui/console, @object-ui/runner — right (carried forward: all five in the fixed group; objectui declares no major off a cross-major sync; the body carries FROM → TO, the one-line fix and the spec's own message for each narrowing, and the widening list matches ①). Not skip-changeset, correctly.
  • Clause-②: line — right, re-read at this head. Both carriers now read Clause-②: yes (narrowing): the changeset at the start of a line (the one line 4a292e16 changes) and the PR body at its line 3. That is the spelling the fleet's one reader, clause2-line.mjs, names for exactly this diff — "yes (narrowing) — a diff that widens one surface and narrows another. Both facts are true and both are read" — and readClause2Line reads it as declared, value yes, arm narrowing (the parenthetical opens as the next thing after the value and its first token is the fixed spelling), so reviewFace owes the narrowing face at CONTRACT_REVIEW_TIER, which is the face this record is served on. The value is true (three keys newly accepted by reference), the arm is true (three published accept sets narrowed), and the card's done-when 3 is met. The FAIL reason of 6268625896 is resolved by the one line that moved, and nothing else moved.
  • Check-runs on 4a292e16: 36 runs, 33 success, 3 skipped (the two coverage jobs, dependabot), 0 failure, none pending — the same 36 names as on 2abf91da, every gate verdict green, the five Changeset * checks included.

③ Boundary flags

  • D1 (the list-view row) = A — judged right (carried forward, ① 7). ⛔ C stays rejected.
  • D2 (emptyState on the three bound record blocks) = A — judged right (carried forward, ① 7).
  • D3 (action-button-undoable-11168 TS2353) = A — judged right (carried forward): PR fix(core,components): an update's Undo covers its named declaration's patch, and no action renderer forwards a row patch (objectui#13022) #13033 merged as 61ed5ada, still this PR's merge-base; Type Check green at this head.
  • D4 (Clause-②) = B — judged right at this head: value yes with the (narrowing) arm, on both carriers.
  • Out-of-scope finding (nav visible reading data with no dataSource): filed as objectstack#24534, open; attached here once the spec exports the check. Accepted (carried forward).
  • PR body: the Clause-②: carrier line is current. One prose line is stale by one head and not blocking: "Status: CI is green on head 2abf91da" names the previous head; the check-runs on 4a292e16 read the same 33 / 3 / 0, so the statement is true of this head too, only the sha is old. A body refresh naming 4a292e16 is tidy, not owed by this verdict.
  • Acceptance note (not blocking, carried forward): RecordDetailView.recordOpenWaves-13010.test.tsx (three sites) and page-single-h1.test.tsx (one) still author width: 'large' on main; nothing validates them and the renderer reads no such width. A one-key delete per site when those files are next touched.
  • Acceptance note (carried forward): the installed-pin-claims gate and the live-e2e pin compare version strings, not commits — a known limit of those two instruments.
  • No open_questions entry is left unanswered; nothing here needs the maintainer.

Implemented-by: claude/issue-12971-pin-bump-main
Reviewed-by: session_0188TsgPV8kQXfuRuKmkj2ks

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 — ACCEPT · domain:ui seat 1 · session_0188TsgPV8kQXfuRuKmkj2ks · 2026-10-19T13:58Z

Reviewed at head 4a292e16221d9f16d70111bdfe8d39400582c0cf, against claim 6261969552 on objectui#12971 and the seat's decisions 6267645900. It executes ruling B on objectui#12955: the first real pin bump.

  1. Shape. Draft PR against main, opening Fixes #12971, assigned sunhaolin. 52 files, +448 / −131. check-governed-queue-guard --test: not governed. CI on this head: 33 success, 3 skipped (coverage ×2, dependabot), 0 failure.
  2. Contract review at CONTRACT_REVIEW_TIER: PASS on this head (6268975517).
    • The first record 6268625896 was FAIL for one reason: the Clause-②: line had no arm.
    • That was the seat's own D4 instruction, which said yes without its arm. Fixed in 4a292e16: the net diff since 2abf91da is that one line, Clause-②: yes (narrowing), on the changeset and on the PR body.
  3. What lands.
    • .objectstack-sha moves from 2c9bf9430a (the next.3 release commit) to objectstack main f4755a68a797, which reads 18.0.0-next.5 and was green with 150 check-runs at the move. It carries 586705d85d, ef65646843, 1e001c7df, e15897c0f1, adb7910f81, 69f342b924 and 3a734e0888. pnpm-lock.yaml is unchanged.
    • The followed narrowings: checkPageMainRegionWidth (both page nodes), checkPageRecordBindingPlacement (the kind node), and the retired row patch input on action:button and action:icon.
    • Spec-fact pins re-pointed, nav dataSource by reference, backend.env and the installed-pin claims at next.5.
  4. Decisions carried out.
  5. Open, non-blocking. width: 'large' on main survives in RecordDetailView.recordOpenWaves-13010.test.tsx (3) and page-single-h1.test.tsx (1). Nothing validates them; delete the key when those files are next touched. The PR body's status line names the previous head 2abf91da (also true of this head).
  6. Landing. Not Tier H. The seat marks the PR ready and arms auto-merge. On MERGED:

VERDICT: ACCEPT


Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 19, 2026 13:59
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 19, 2026 13:59
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 19, 2026
Merged via the queue into main with commit 8aa8e3e Oct 19, 2026
37 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-12971-pin-bump-main branch October 19, 2026 14:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment