Skip to content

refactor(app-shell,types,data-objectstack)!: retire the toolbar-to-view write family and DataSource.updateViewConfig (objectui#12504) - #12586

Merged
os-zhuang merged 10 commits into
mainfrom
claude/issue-12504-retire-view-write-family
Oct 16, 2026
Merged

os-zhuang merged 10 commits into
mainfrom
claude/issue-12504-retire-view-write-family

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #12504
Clause-②: no (narrowing). A published @object-ui/types method and the @object-ui/data-objectstack method behind it leave the contract, as ruled (ruling 6203730732, letter A). Nothing widens: no type, prop, export or spec declaration is added.

The maintainer's ruling on objectui#12504 retires the console's toolbar-to-view write family at once, with no window. Since objectui#12418 and objectui#12474 the list toolbar's sort, column layout, density and Hide Fields are each user's own list state (ui.list.OBJECT), so the write had no caller. The explicit save (handleViewConfigSave then persistRuntimeMetadata) is now the one write path to the shared view, and it is unchanged.

What changed

  • @object-ui/app-shell, ObjectView.tsx. Removed persistViewPatch with its debounce timers, pending-patch map and write chain, toolbarWriteInputs, buildPersistedViewBody, the CONSOLE_MADE_TAB mark and its guard, the savedViewsRef mirror that only the writer read, the refusal toast, and the setSystemCapabilities push effect. That effect existed only to feed the adapter gate on updateViewConfig, and its own comment said so. The overlay READ path is unchanged (loadViewOverrides, sanitizeViewOverride, narrowPersonalizationOverlay), because rows earlier consoles wrote are still at rest. Docblocks that described the writer as live now describe it as retired. The same applies to the viewIdentity.ts docblock.
  • @object-ui/types. DataSource.updateViewConfig? is removed. The listViewOverrides docblock now names createView / updateView as the writes that share its key space. The onDensityChange docblock in objectql.ts no longer suggests the method.
  • @object-ui/data-objectstack. ObjectStackAdapter.updateViewConfig is removed, together with the gate that only it read (see the next section). Docblocks that described its caller are corrected: the overlay marker, isPersonalizationOverlayRow, VIEW_OVERLAY_OWNED_KEYS, listViewOverrides, listViews, the save-advisory seam and the factory. The marker, its readers and the owned-key list stay, for the rows at rest.
  • @object-ui/i18n. console.objectView.viewConfigPermissionDenied leaves all ten packs. Its only producer was the retired toast.
  • Docblocks elsewhere, code unchanged. These comments named the retired path as live and now name the user's own list state: ObjectGrid.tsx (three places), ListView.tsx, useDensityMode.ts (its @example), data-table.tsx and ConcurrentUpdateDialog.tsx. The @example ledger row in scripts/check-doc-example-types.mjs now names the identifiers the example references. This is a data string only; the row's codes are unchanged.
  • Docs. content/docs/utilities/data-objectstack.mdx drops the retired systemCapabilities factory option. Its member count, which the change would have made false, is replaced by a pointer to the Exclude expression that lists the members.
  • Published skill (governed). skills/objectui/guides/data-integration.md listed updateViewConfig?(...) among the DataSource view members and told agents to write a view through it. It now names it beside saveView as a spelling that does not exist. This is its own commit (6b510d14b0), so the seat can split it into a separate pull request. Readings: whole file 514 lines before, 514 after. Whole package (the sum of every SKILL.md, one file) 142 before, 142 after. The line count does not grow.
  • Changeset. .changeset/12504-retire-view-write-family.md: minor for @object-ui/types and @object-ui/data-objectstack, with a BREAKING paragraph naming DataSource.updateViewConfig and ObjectStackAdapter.updateViewConfig. patch for app-shell, i18n, plugin-grid, plugin-list, react, components, plugin-detail and console.

Beyond the ruling's letter: the gate's public names (a judgement, please review)

The ruling names DataSource.updateViewConfig and ObjectStackAdapter.updateViewConfig. The method opened with a capability gate, and that gate was published under five names that nothing else reads: ObjectStackAdapter.setSystemCapabilities, the systemCapabilities option of the constructor and of createObjectStackAdapter, VIEW_CONFIG_CAPABILITY, ViewConfigPermissionDeniedError and isViewConfigPermissionDeniedError. Measured: the only thrower of the error was updateViewConfig, and the only reader of the capabilities was the private maySetViewConfig, which only updateViewConfig called. The only caller of setSystemCapabilities was the ObjectView effect retired above. In objectstack origin/main and hotcrm origin/main there are zero hits for any of the five names.

Keeping them would leave a published setter and a constructor option that do nothing, and an error class nothing throws. That is the "declared but not honoured" shape the ruling's option C was refused for. So they retire with the method, and the changeset's BREAKING paragraph names each one. If the seat's contract review reads the letter narrowly, the names can come back as their own decision. They live in commit b1708d8f6b beside the method.

Mechanism assumptions (PM's A1 to A4), measured on base 830eb1f2dd

  • A1 holds. A grep of updateViewConfig in packages/*/src and apps/*/src found one call expression outside tests, dataSource.updateViewConfig?.(...). It sat inside persistViewPatch, the retired family, with that function's guard read beside it. The other hits by kind:
    • declarations: the DataSource member and the adapter method;
    • docblocks: in ObjectView.tsx, viewIdentity.ts, data.ts, objectql.ts, data-objectstack index.ts, ObjectGrid.tsx, useDensityMode.ts and data-table.tsx;
    • tests: the family's pins and harnesses, plus two console probes that list the name in a stub's method array (no call).
  • A2 holds, and it was wider than one member. No types API-surface or exports census pinned updateViewConfig. The one presence pin was adapterFactoryReturn.types.test.ts, which asserted setSystemCapabilities (type and runtime) and now asserts the remaining eight members. The two console probes drop the name from their stub lists. One addition to A2: an object literal annotated as DataSource that carries the member is now refused as an unknown property. None exists in this tree, and the type-check is green.
  • A3 holds. The toast key had one producer, the persistViewPatch catch. check:i18n-keys, check:i18n-drift and check:i18n-dead-keys accept the removal. objectView-config-keys-retired-4730.test.ts records the key as retired, the way the census expects: 123 retired became 124, 104 surviving became 103, and the total of 227 is unchanged. de-quote-pairing-3876.test.ts drops one matched pair (87 to 86).
  • A4. 37 test files are touched:
    • (a) 3 deleted, because they pinned only the family: ObjectView.viewConfigGate.test.ts, ObjectView.densityInsideConfig-11625.test.ts and viewConfigPermissionGate.test.ts.
    • (b) 33 edited where they mention the family. Write detectors were re-pointed to the surviving doors (meta.saveItem, updateView / createView spies). Rows that were written through the method are now planted at rest in the shape the retired write stored. Firing controls now use createView. Comments were corrected.
    • (c) 1 re-pointed: the objectui#12474 census pin in ObjectView.overlayPatchOnly.test.ts, whose buildPersistedViewBody write cases retired with the function.

Fork condition: not met. There is no named caller of updateViewConfig outside the retired family. objectstack origin/main has 0 call expressions. Its hits are docblocks and test comments in packages/spec and packages/metadata-protocol, a migration entry string, and one QA checklist step (see Acceptance notes). hotcrm origin/main has 0 hits. In objectui, apps/* has only the two stub lists and examples/* has 0.

Pins

  • Census, re-pointed to absence (ObjectView.overlayPatchOnly.test.ts, describe "objectui#12504 census — the toolbar-to-view write family is retired"). It reads code with comments stripped:
    • ObjectView.tsx defines and reaches none of persistViewPatch, buildPersistedViewBody, toolbarWriteInputs, CONSOLE_MADE_TAB, updateViewConfig, setSystemCapabilities, isViewConfigPermissionDeniedError or the toast key;
    • DataSource declares no updateViewConfig, pinned off data.ts and as a type that type-check reads;
    • ObjectStackAdapter.prototype has no updateViewConfig and no setSystemCapabilities, and the package exports none of the three gate names. The same fact is also pinned as a type.
  • CONTROL: the explicit save still writes through persistRuntimeMetadata('view', vid, buildViewConfigSaveBody(...)). This is the same census describe; ObjectView.userListState-12418.test.tsx "the view editor's save still writes /meta/view" is unchanged and green.
  • CONTROL: a toolbar sort and a density / Hide Fields change land on the user's ui.list.OBJECT row and write no view. This is the unchanged ObjectView.userListState-12418.test.tsx and consoleListStateWall-12418.test.tsx suites; the wall suite's own CONTROL now writes through the real adapter's createView.

Ablation (through objectstack scripts/ablation-replace.mjs, each leg restored and proven)

  • Leg A: the member is re-added to DataSource in data.ts. Anchor 1 to 0, blob 3b3996403088 to 1acc16bfed4b. Predicted: only the DataSource census case goes red. Observed: Tests 1 failed | 14 passed (15), the red being "DataSource declares no updateViewConfig (@object-ui/types)". Restore: blob equals HEAD 3b3996403088, and git diff HEAD is empty.
  • Leg B: an updateViewConfig method is re-added to ObjectStackAdapter. Anchor 1 to 0, blob 1a202c973005 to b87a7a2f451f. Predicted: the adapter census case and the viewOverlayMarker "no overlay writer left" case go red. Observed: Tests 2 failed | 13 passed (15), exactly those two. Restore: blob equals HEAD and the diff is empty.
  • Leg C (the type-level half, read through the rebuilt .d.ts): the Leg A mutation is held, and @object-ui/types is rebuilt (exit 0; marker in dist/data.d.ts: 1). Then app-shell tsc -p tsconfig.test.json exits 2 with exactly one error, TS2322 at the census Absent assertion. Restore: blob equals HEAD and the diff is empty. After a rebuild, the marker count in dist is 0.
  • Baseline on the unmutated tree: Tests 15 passed (15). Controls stayed green in every leg.

Local gates (at 3643cc1e6e, the merge of origin/main 3e09c1e8d5)

  • Dependency closure pnpm --workspace-concurrency=2 --filter '@object-ui/app-shell^...' build under the verify lock: VERDICT command-exit 0. The packages the gates read (app-shell, plugin-ai, gantt, map, markdown, timeline, tree, cli) were built after it, and plugin-list and app-shell were rebuilt after the merge.
  • type-check of types, data-objectstack, app-shell, plugin-grid, plugin-list, react, i18n, components, plugin-detail and console: all Done, VERDICT command-exit 0. The app-shell, data-objectstack, react, i18n, components, plugin-grid, plugin-list and plugin-detail scripts compile their tests as well.
  • Vitest union at 3643cc1e6e under the lock: every ObjectView* and InterfaceListPage* app-shell suite, view-filter-fold.ratchet, writeRefusalCensus-11583, consoleListStateWall-12418, src/context/__tests__/, four app-shell __tests__ sweeps, the whole of packages/data-objectstack/ and packages/i18n/, every touched plugin, components, types and console test, the readers of the skill guide and the docs page, the AFFORDANCE_GRANTS census (affordanceGrantMap-12082), and the edited gate's own suites. Result: Test Files 282 passed (282), Tests 3794 passed | 13 skipped (3807), VERDICT command-exit 0.
  • These gates exit 0: check:i18n-keys, check:i18n-drift, check:i18n-dead-keys (report), check:i18n-designer-parity, check:readme-exports, check:spec-symbols, check:unreferenced-sources, check:metadata-write-doors, check:control-bytes, check:new-line-citations (0 new), check:test-path-roots, the three check:vi-mock-*, check:skills-paths, check:skill-examples, check:doc-snippets, check:doc-examples, check:doc-types, check:doc-json, check:doc-fences, scripts/check-doc-links.mjs, check:changeset-claims, check:pending-changeset-literals, check-changeset-presence ("57 source file(s) of 10 released package(s) changed, and this change declares 1 changeset(s)"), check-changeset-no-major and check-changeset-fixed.
  • ESLint on the 55 changed TS files: 0 errors. ObjectView.tsx now carries 182 warnings, against the 197 the objectui#12474 dev reported at their head.
  • check-governed-queue-guard --test on the diff: GOVERNED (one path, skills/**).

What the landing seat's browser reading should show

On a console over a served object list, as a session WITHOUT manage_metadata:

  1. Change the density, hide a field, sort by a header and drag a column width. The network panel shows no PUT /api/v1/meta/view/... and no error toast. Each change lands as a sys_user_preference write of the user's ui.list.OBJECT row, and survives a reload.
  2. As an admin, open "Edit view config" and Save. A PUT to /meta/view is still sent, and the edit is visible to another user.
  3. A view that already carries a personalization overlay row (_isOverride: true, written by an earlier console) still shows that row's density and columns. It does not appear as a saved view in the switcher.
  4. Nothing anywhere shows the old "View settings apply to everyone who uses this view..." refusal toast.

Acceptance notes

  • Not class a/b/c, noted, not filed. objectstack still describes objectui's persistViewPatch / updateViewConfig as the live overlay writer in prose. The places are two docblocks in packages/spec/src/ui/view.zod.ts, the string of the spec migration entry 18.view-overlay-judged-by-viewkind-arm, comments in view-metadata-schema.test.ts, view-overlay-viewkind-arm.test.ts and metadata-protocol protocol.graft-folded-form-sections.test.ts, and the platform-checklist step in docs/qa/platform-checklist/areas/records-forms.json that says "or the persisted view override via dataSource.updateViewConfig". None of these has a runtime effect, and they are outside this claim (objectstack files). 承接者:无.
  • Not edited: ADR-0034 names persistViewPatch. It is a decision record and a governed path. 承接者:无.
  • Pending changesets in the same release. 11625-density-inside-config, 11642-toolbar-writes-compose and 11643-fallback-tab-session-only describe the toolbar's view write, which objectui#12418, objectui#12474 and this change moved away and then retired. All are still pending (pre.json has consumed none), so they publish beside this one. They are other cards' declarations and are not edited here. 承接者:无.
  • The overlay read path now serves only rows at rest. Nothing writes a personalization overlay any more. Whether to migrate or retire those rows (the marker, narrowPersonalizationOverlay, VIEW_OVERLAY_OWNED_KEYS) is a separate question that no deployment measurement here informs. 承接者:无.
  • ListView.tsx's comment on the forwarded onColumnStateChange still says a parent persists "alongside the view definition". It does not name the retired method, and objectui#12474's report already noted it. 承接者:无.
  • Repaired in passing, in files this change touches: the cross-file line addresses in gridNonAuthorKeys.test.tsx's producer strings, in ObjectGrid.tsx's columnState docblock and in the InterfaceListPage overlay test's docblock. All are now cited by symbol.

维护者速读(草稿)

改了什么

控制台列表工具栏里"把改动写进共享视图"的整条代码路径删除了。对外发布的数据源接口去掉了 updateViewConfig 方法。只为这个方法服务的权限门接口(5 个公开名字)和一条报错提示文案也一起删除了。发布给客户 AI 的技能文档同步去掉了这个方法。

为什么改

自 objectui#12418 / objectui#12474 起,排序、列宽、行高、隐藏字段都已是每个用户自己的列表状态,这条写入路径已无人调用。您在 objectui#12504 上裁定 A:整组立即退役,不留过渡窗口。共享视图从此只有一条写入路径:视图编辑器的显式保存。

风险与代价(含回滚)

  • 外部若有代码调用 updateViewConfig,或引用被删的权限门名字,升级后会编译失败。changeset 已写明 BREAKING,版本号按约定仍为 minor。仓内、objectstack、hotcrm 实测零调用方。
  • 权限门的 5 个名字超出了裁决原文的字面范围。它们只为这个方法服务,留下会变成"声明了却不生效"的空接口,席位复核时请确认。
  • 旧版控制台已写下的个性化覆盖行仍会被读取,用户看到的效果不变。
  • 回滚:revert 本 PR 即可。技能文档改动是单独一个 commit,可单独撤回或拆出。

席位意见

你要做的

本 PR 改到了发布给客户的技能文档(skills/**,受管面),因此需要您在 PR 上留一条批准,才能进入合并队列。若您希望代码先落地、文档另走,告诉席位拆分即可。


Generated by Claude Code

…ectView

No list toolbar control has reached `persistViewPatch` since
objectui#12474. The maintainer ruled the whole family retired at once
(objectui#12504, letter A): the writer, its debounce and write chain,
`toolbarWriteInputs`, `buildPersistedViewBody`, the `CONSOLE_MADE_TAB`
guard, the refusal toast, and the `setSystemCapabilities` push that fed
the adapter gate only `updateViewConfig` read. The explicit save
(`handleViewConfigSave` -> `persistRuntimeMetadata`) stays the one write
path to the shared view; the overlay rows already at rest are still read.

Tests: the two files that pinned only the family are deleted; the census
pin in `ObjectView.overlayPatchOnly.test.ts` now pins absence; the
harness suites re-point their write detectors to the surviving doors.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JZnppgHRp4sREcouhkQYDB
… and the adapter's view-config gate

`DataSource.updateViewConfig?` leaves `@object-ui/types`, and
`ObjectStackAdapter.updateViewConfig` leaves `@object-ui/data-objectstack`
with the gate only it read: `setSystemCapabilities`, the `systemCapabilities`
constructor / factory option, `VIEW_CONFIG_CAPABILITY`,
`ViewConfigPermissionDeniedError` and `isViewConfigPermissionDeniedError`.
Its last caller was the console's toolbar write, retired in the previous
commit (objectui#12504, ruling letter A).

The overlay marker and its readers stay: rows the retired write stored
are still at rest. Docblocks that described the caller are corrected.
Tests that wrote through the method now plant the row it stored, or use
`createView`; the gate's own suite is deleted.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JZnppgHRp4sREcouhkQYDB
Its only producer, the toolbar view write's refusal toast, retired with
`updateViewConfig` (objectui#12504). The key leaves all ten packs and is
recorded as retired in `objectView-config-keys-retired-4730.test.ts`;
the de quote-pairing counts drop by its one span.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JZnppgHRp4sREcouhkQYDB
Docblocks in plugin-grid, plugin-list, react, components and
plugin-detail described the toolbar's view write (`persistViewPatch` ->
`dataSource.updateViewConfig`) as the host's live persistence path; they
now name the user's own list state, or the retirement (objectui#12504).
Code does not change. The data-objectstack docs page drops the retired
`systemCapabilities` factory option; the console probes drop the method
from their stub lists.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JZnppgHRp4sREcouhkQYDB
`minor` for `@object-ui/types` and `@object-ui/data-objectstack`, with a
BREAKING paragraph naming `DataSource.updateViewConfig`,
`ObjectStackAdapter.updateViewConfig` and the gate names that left with
it; `patch` for the packages whose source changed only in the retired
machinery or in comments.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JZnppgHRp4sREcouhkQYDB
The published guide listed `updateViewConfig?(...)` among the
`DataSource` view members and told agents to write a view through it.
The member is retired, so the excerpt drops it and the "spellings that
do not exist" note names it beside `saveView`. The stale optional-member
count is replaced by a pointer to `data.ts`, the file that lists them.

Governed surface (`skills/**`): kept as its own commit so it can be split
into a separate pull request if the seat prefers.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JZnppgHRp4sREcouhkQYDB
…example now references

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JZnppgHRp4sREcouhkQYDB
…-family

Brings in objectui#12510 (ListView aria-labels) and objectui#12514; no file overlaps this branch.

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

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 70 chunks) 3091.6 KB 3119.4 KB
Main entry chunk (gzip) 73.3 KB 350 KB
Entry file index-BpUMjgph.js —
Status PASS —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 21.19KB 7.76KB
app-shell (runtime-config.js) 22.59KB 7.89KB
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) 40.22KB 10.61KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.40KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.70KB 3.93KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.62KB 0.83KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 41.19KB 11.12KB
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) 596.60KB 143.79KB
core (index.js) 10.18KB 4.04KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 248.20KB 69.22KB
fields (index.js) 283.09KB 72.13KB
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) 40.67KB 11.85KB
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) 54.94KB 16.05KB
plugin-charts (index.js) 84.97KB 23.36KB
plugin-chatbot (index.js) 201.89KB 48.13KB
plugin-dashboard (index.js) 145.69KB 39.39KB
plugin-designer (index.js) 233.95KB 50.08KB
plugin-detail (index.js) 262.91KB 69.49KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 180.83KB 46.61KB
plugin-gantt (index.js) 178.36KB 45.08KB
plugin-grid (index.js) 262.82KB 72.91KB
plugin-kanban (index.js) 53.23KB 16.71KB
plugin-list (index.js) 129.82KB 33.09KB
plugin-map (index.js) 27.07KB 8.96KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 46.66KB 13.13KB
plugin-timeline (index.js) 39.21KB 11.85KB
plugin-tree (index.js) 15.07KB 5.33KB
plugin-view (index.js) 93.43KB 23.94KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 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) 120.63KB 39.56KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.50KB 2.06KB
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 (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: TIER_DEFAULT
Head-sha: 3643cc1e6e
Local-runs: none

This is the lane seat's own record. The claim's Clause-②: no (narrowing) makes it owed: a published @object-ui/types member and published @object-ui/data-objectstack exports leave the contract. None of the 61 files is a published-schema path. One governed path is touched, skills/objectui/guides/data-integration.md, which is judged here as prose and approved by a person (Tier H). It was read at 2026-10-16T00:08Z from:

  • the card and its ruling 6203730732 (letter A);
  • the claim 6203867757;
  • the dev report 6204756489;
  • the PR body;
  • the diff of this head against main.

① Derived judgments

  1. DataSource.updateViewConfig? leaves @object-ui/types: RIGHT, as ruled.
    • The member was optional. A class that keeps the method still compiles, but nothing calls it.
    • A caller, or an object literal annotated DataSource that carries the key, stops compiling. The changeset says so, and names the replacement (createView / updateView, or the view editor's save).
  2. ObjectStackAdapter.updateViewConfig leaves @object-ui/data-objectstack: RIGHT, as ruled.
  3. Five more public names of that package retire: RIGHT, as the closure of the ruled family.
    • The names are setSystemCapabilities, the systemCapabilities option of the constructor and of createObjectStackAdapter, VIEW_CONFIG_CAPABILITY, ViewConfigPermissionDeniedError and isViewConfigPermissionDeniedError.
    • Measured: their only reader was the retired method, and their only writer was the retired ObjectView effect. Readers outside objectui are 0: objectstack packages/*/src, examples/** and apps/** have 2 hits, both test comments; HotCRM src has 0.
    • Kept, they would be a setter and an option that do nothing, and an error with no thrower. That is the declared-but-not-honoured shape the ruling refused as C.
    • They are beyond the ruling's letter, so the seat record puts them in front of the approver by name.
  4. The census pin stays and now pins absence: RIGHT.
    • ObjectView.overlayPatchOnly.test.ts asserts that persistViewPatch is not defined, that DataSource declares no updateViewConfig, and that the adapter has no such method.
    • Ablation, each leg restored with blob proof:
      • leg A, the member re-added to DataSource: 1 red;
      • leg B, the method re-added to the adapter: 2 red;
      • leg C, type level through the rebuilt .d.ts: one TS2322 at the census assertion.
  5. The one write path to the shared view is unchanged: the view editor's explicit save, handleViewConfigSave → persistRuntimeMetadata. objectui#12418's per-user list-state suite stays green in the union run.
  6. Rows at rest stay readable. Personalization rows earlier consoles wrote into /meta/view are still read: the overlay marker, narrowPersonalizationOverlay, and the listViews() exclusion. Nothing new writes one.

② Semver level

  • RIGHT, and never major:
    • @object-ui/types and @object-ui/data-objectstack are minor, with a BREAKING paragraph naming all seven retired names;
    • the other eight packages are patch, for comments, tests and the i18n key.
  • Clause-②: no (narrowing) is RIGHT: nothing widens.

③ Boundary flags

  • Mechanism assumptions, measured:
    • A1 holds: no call expression is left outside the retired family. The remaining mentions are past-tense docblocks ("retired in objectui#12504").
    • A2 holds: a type-level census pin was updated, not deleted.
    • A3 holds: the toast key had one producer, and the retired-keys census accepts its removal.
    • A4: 3 test files deleted, 33 edited in the part that names the family, 1 re-pointed.
  • The governed edit is accepted. skills/objectui/guides/data-integration.md is a 5-line swap; the file stays 514 lines. It stops the published guide teaching agents a method that no longer exists. Keeping it in this PR closes the window in which code and guide disagree. It makes the PR Tier H.
  • The other dev deviations are accepted:
    • content/docs/utilities/data-objectstack.mdx documented the retired option, per AGENTS.md Add automated testing infrastructure and CI/CD workflows #2.
    • The ledger reason string in scripts/check-doc-example-types.mjs changed; the gate's own suite is green.
    • Docblock corrections in data-table.tsx and ConcurrentUpdateDialog.tsx.
    • Cross-file line citations repaired to symbol citations in files already touched.
    • @object-ui/console listed as patch, for its probes.
  • Size: +595/−2090 over 61 files, 2,685 lines, which is under the 3,000-line human-merge threshold.

Implemented-by: claude/issue-12504-retire-view-write-family
Reviewed-by: session_01JZnppgHRp4sREcouhkQYDB

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

维护者速读

改了什么:退役列表工具栏「写共享视图」的整套旧路径,改完后共享视图只剩视图编辑器的「保存」这一条写入口。共 61 个文件,+595/−2090,大部分是删除。具体退掉的有:

  • console 的 persistViewPatch 及其私有机器;
  • @object-ui/types 的 DataSource.updateViewConfig;
  • @object-ui/data-objectstack 的 ObjectStackAdapter.updateViewConfig;
  • 只为这个方法服务的权限闸的五个公开名:setSystemCapabilities、构造器和工厂函数的 systemCapabilities 选项、VIEW_CONFIG_CAPABILITY、ViewConfigPermissionDeniedError、isViewConfigPermissionDeniedError;
  • 十个语言包里的一条拒绝提示。

另外,发布出去的技能指南 skills/objectui/guides/data-integration.md 原本教 agent 用 updateViewConfig 写视图,这一段也一并改掉。这是受管面,所以本 PR 需要你批准。

为什么改:维护者已裁 A(6203730732)。自 #12418 / #12474 起,工具栏的排序、列、密度、隐藏字段都改存到每个用户自己的列表状态,这套写共享视图的方法已经没有任何调用方。留着它,就是一个随时可能被重新接上的陷阱。创业阶段不留过渡窗口。

风险与代价(含回滚):

  • 破坏性变更: 对外是 BREAKING。@object-ui/types 和 @object-ui/data-objectstack 升 minor,changeset 里把七个退掉的名字逐个点名,并给出替代写法(createView / updateView,或视图编辑器的保存)。
  • 实测影响面: objectui、objectstack、HotCRM 都没有调用方。objectstack 只有两处测试注释还提到旧名。
  • 唯一残余风险是看不见的外部适配器: 只实现了该方法的类照样能编译,只是不再被调用;调用该方法或导入闸门名的代码会编译失败,changeset 里写了替代路径。
  • 历史数据: 早期 console 写进 /meta/view 的个性化行仍然可读。
  • 回滚: revert 本 PR 即可。

席位意见:建议批准。

  • 超出裁决原文的部分: 比裁决原文多退了五个权限闸名。它们只为已退役的方法服务,留着就是「声明了但不起作用」的空设置,正是裁决否掉 C 的理由。本席认为这属于裁决「整族一次退役」的范围。
  • 技能指南改在同一个 PR 里: 只是 5 行替换。放在一起,可以避免「代码已经落地、指南还在教一个不存在的方法」的窗口。
  • 复审与 CI: 本席契约复审 PASS(6204947717),CI 全绿。

你要做的:用 os-zhuang 或 hotlong 批准本 PR,批准后由本席翻 ready、入合并队列。如果你认为那五个权限闸名应另立卡退役,回复一句,本席让 dev 部分回退。

席位核对

domain:ui seat 1 · session_01JZnppgHRp4sREcouhkQYDB · 2026-10-16T00:09Z · head 3643cc1e6e. This is the seat's ACCEPT for objectui#12504. Card pointer: ACCEPT → PR #12586 comment (this comment).

  1. Shape:
    • Draft, base main, assignee sunhaolin.
    • Line 1 is Fixes #12504, the body's only closing keyword. Line 2 starts Clause-②: no (narrowing).
    • 61 files, +595/−2090: 2,685 lines, under the 3,000 threshold.
    • One changeset: minor for @object-ui/types and @object-ui/data-objectstack, patch for eight others, never major.
    • Tier H: skills/objectui/guides/data-integration.md is governed, so the whole PR waits for a person.
  2. Premises measured:
    • A1–A4 hold (contract review 6204947717 ③).
    • Callers measured as zero: objectstack (2 test comments only), HotCRM src, and objectui outside the retired family.
    • The census pin was re-pointed to absence and ablated in three legs.
  3. Gates, read from check-runs on the head:
    • 37 total: 34 success and 3 expected skips (dependabot, Test (coverage) and its shard leg). 0 failures. Spec Main Shape Gate is green.
    • The console performance budget passes: eager closure 3091.6 KB against 3119.4 KB.
    • Contract review 6204947717: Served-tier: TIER_DEFAULT, the head sha matches, Local-runs: none, the independence pair is signed, PASS.
  4. Deviations accepted:
    • The five gate names retired with the method. They are named for the approver above, and B (restore them, card the retirement) stays open on the approver's word.
    • The governed guide edit kept in this PR, not split.
    • content/docs/utilities/data-objectstack.mdx and the doc-example gate's ledger string.
    • Docblock corrections in data-table.tsx and ConcurrentUpdateDialog.tsx.
    • Line citations repaired to symbol citations in files already touched.
  5. Out of scope (the dev's notes), each → Acceptance notes. None has behaviour behind it, so none is filed:
  6. Landing:
    • The PR stays draft until an approval from os-zhuang or hotlong (GOVERNED_APPROVERS). This act requests both and puts needs-user-decision on the PR.
    • After the approval, the seat runs the pre-landing checks, removes the label, and marks the PR ready with auto-merge through the queue.
    • ⛔ No seat approves.

Generated by Claude Code

@os-zhuang
os-zhuang marked this pull request as ready for review October 16, 2026 00:31
@os-zhuang
os-zhuang enabled auto-merge October 16, 2026 00:31
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Pre-landing check · domain:ui seat 1 · session_01JZnppgHRp4sREcouhkQYDB · 2026-10-16T00:32Z

  • Approval: approved by os-zhuang (GOVERNED_APPROVERS) at 2026-10-16T00:31Z, with the review on 83ab59422c.
  • The maintainer's own steps: a merge of main into the branch, then ready and auto-merge.
  • The merge carries no PR content: commit 83ab59422c brings only main's own commits. The PR's own patch against its merge base is unchanged, with patch-id 5977831bc029 before and after the merge, over 61 files. The accepted content stands.
  • The label: needs-user-decision came off with this check. CI re-runs on the new head through the queue.

Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Maintainer's word recorded · batch #353, the PR line · director seat (summon #42 continuation 1, session_01AKVFxqmRLqktJspVXwPE9A) · 2026-10-16T00:34Z

The maintainer answered 「批准 (推荐)」 to this PR's line in batch #353 (presented in this seat's session, on the seat's 速读 6204958128): the ruled retirement lands as built, the five gate names included (the closure of the ruled family), and the five-line skills/objectui/guides/data-integration.md hunk rides this PR. Not taken: 「部分回退」 and 「拆分」.

What still gates the landing, in order:

  1. The approval click itself, by os-zhuang or hotlong (requested on this PR). A word in chat is not the APPROVED review the queue guard reads; this comment records the word only.
  2. The contract record on the governed hunk. Record 6204947717 is served at TIER_DEFAULT; a skills/** hunk is governed rules text, which puts its review at CONTRACT_REVIEW_TIER (contract-review.md: the tier follows the face; a mixed diff's at-tier scope is the reviewFace hits, the Scope: line). Before ready, the lane seat (domain:ui seat 1) obtains an isolated CONTRACT_REVIEW_TIER record scoped to that hunk, or splits the hunk into its own PR. This does not gate the maintainer's approval.
  3. Then ready and auto-merge through the queue, on the seat's terms; needs-user-decision leaves this PR with the approval.

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 70 chunks) 3091.6 KB 3119.4 KB
Main entry chunk (gzip) 73.3 KB 350 KB
Entry file index-DEa2HIJz.js —
Status PASS —

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 21.19KB 7.76KB
app-shell (runtime-config.js) 22.59KB 7.89KB
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) 40.22KB 10.61KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.40KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.72KB 2.24KB
auth (SocialSignInButtons.js) 9.70KB 3.93KB
auth (UserMenu.js) 3.39KB 1.21KB
auth (auth-gate-events.js) 1.62KB 0.83KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 41.19KB 11.12KB
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) 596.60KB 143.79KB
core (index.js) 10.18KB 4.04KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 248.20KB 69.22KB
fields (index.js) 283.09KB 72.13KB
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) 40.67KB 11.85KB
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) 54.94KB 16.05KB
plugin-charts (index.js) 84.97KB 23.36KB
plugin-chatbot (index.js) 201.89KB 48.13KB
plugin-dashboard (index.js) 145.69KB 39.39KB
plugin-designer (index.js) 233.95KB 50.08KB
plugin-detail (index.js) 262.91KB 69.49KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 180.83KB 46.61KB
plugin-gantt (index.js) 178.36KB 45.08KB
plugin-grid (index.js) 262.82KB 72.91KB
plugin-kanban (index.js) 53.23KB 16.71KB
plugin-list (index.js) 129.82KB 33.09KB
plugin-map (index.js) 27.07KB 8.96KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 46.66KB 13.13KB
plugin-timeline (index.js) 39.21KB 11.85KB
plugin-tree (index.js) 15.07KB 5.33KB
plugin-view (index.js) 93.43KB 23.94KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 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) 120.63KB 39.56KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.50KB 2.06KB
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 (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

@os-zhuang
os-zhuang added this pull request to the merge queue Oct 16, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 83ab59422cbb3dad752dc986108c3eda6fbe688c
Local-runs: none
Scope: skills/objectui/guides/data-integration.md (the reviewFace hit; the rest of the diff is covered by 6204947717)

Read at 2026-10-16T00:44Z from: card #12504 (body and its six comments, the ruling 6203730732, the claim 6203867757, the dev report 6204756489 included); PR #12586 (body, the 61-file list, the net diff of this head against merge base 1b3b5b1026, patch-id 5977831bc029); the check-runs on this head; PR comments 6204947717, 6205262642 and 6205275538. The hunk is judged against packages/types/src/data.ts and packages/data-objectstack/src/index.ts as this same head ships them.

① Derived judgments

  1. The DataSource excerpt (guide lines 40 to 65) is accurate at this head: RIGHT. Every member the excerpt names is declared in data.ts with the same optionality: the six non-optional members are exactly find (:397), findOne (:434), create (:443), update (:463), delete (:479) and getObjectSchema (:587), so "Six members are required" (line 67) holds; the optional ones named are bulk (:493), getView (:630), createView (:678), updateView (:685), deleteView (:700), aggregate (:774) and onMutation (:833). The edited view line, createView?(...); updateView?(...); deleteView?(...) (line 57), now matches the three view writes the interface declares beside getView, listViews and listViewOverrides. The excerpt's simplified return types (aggregate answers an array in data.ts; the mutation event is DataSourceMutationEvent) predate this PR, are outside the hunk, and the guide declares the fence a simplified copy that nothing checks.
  2. "there is no saveView and no updateViewConfig (write a view through createView / updateView)" (lines 71 to 72): RIGHT. At this head git grep finds saveView nowhere in packages/types/src (0 hits) and updateViewConfig nowhere in packages/types/src (0 hits): the diff removes the member (base data.ts:659 to :685) and re-points the listViewOverrides docblock to createView / updateView. ObjectStackAdapter.updateViewConfig leaves index.ts in the same diff. The only updateViewConfig mentions left in packages/*/src and apps/*/src outside tests are past-tense docblocks ("retired in objectui#12504"); no call expression and no declaration remain. The replacement the hunk names is the one the changeset's BREAKING paragraph names. "no generic execute" also holds (0 hits in the interface).
  3. "data.ts lists every optional member" in place of "32 optional members at origin/main" (line 68): RIGHT, and the retirement of the number is the right shape. Counting the interface's declarations with comments stripped: at the merge base 6 required + 31 optional = 37 members; at this head 6 + 30 = 36. So "32" was already one off before this PR and would have been two off after it; a pointer to the declaration cannot drift. The categories the sentence keeps (bulk/transaction, views, apps & pages, file upload, the export / import job lifecycles) each still have members at this head.
  4. Nothing else in skills/objectui/** names a retired member as live: RIGHT. git grep over the package's 27 files at this head for updateViewConfig, persistViewPatch, setSystemCapabilities, systemCapabilities, VIEW_CONFIG_CAPABILITY, ViewConfigPermissionDeniedError, isViewConfigPermissionDeniedError, CONSOLE_MADE_TAB, buildPersistedViewBody, toolbarWriteInputs, maySetViewConfig and saveView returns one line, the guide's own line 71, which names saveView and updateViewConfig as spellings that do not exist. The five gate names were never in the package (0 hits at the merge base as well). evals/data-integration.json carries no view-write prompt.
  5. Line budget as the dev reported: RIGHT. The guide is 514 lines at the merge base and 514 at this head; the package's one SKILL.md is 142 before and after.

② Semver level

  • The skill package publishes no npm package (no package.json under skills/), so the hunk owes no changeset entry; its publication gate is the governed approval, which is on this head (os-zhuang, recorded in 6205262642).
  • The changeset .changeset/12504-retire-view-write-family.md at this head matches what the diff publishes: minor for @object-ui/types and @object-ui/data-objectstack (both at 17.7.0), patch for app-shell, i18n, plugin-grid, plugin-list, react, components, plugin-detail and console. Its BREAKING paragraph names what the diff removes and nothing else: DataSource.updateViewConfig (data.ts), ObjectStackAdapter.updateViewConfig, setSystemCapabilities, the systemCapabilities option of the constructor and of createObjectStackAdapter, VIEW_CONFIG_CAPABILITY, ViewConfigPermissionDeniedError and isViewConfigPermissionDeniedError (each a removed line in index.ts). Never major: RIGHT. The Changeset Bump Policy, Declaration, Claim Re-read, Fixed Group Check and Overwrite Report check-runs are success on this head.
  • Clause-②: no (narrowing): RIGHT. The hunk adds no spelling to the published skill; it removes one and re-points the write to members that already exist. Nothing widens in the diff either.

③ Boundary flags

  • Open question 1 (the five gate names retire with the method): ruled, confirmed, not re-ruled. The maintainer's word at 6205275538 keeps them retired. For this face: no gate name was ever in skills/objectui/**, so the skill owes no edit for them.
  • Open question 2 (the skill hunk rides this PR): ruled, confirmed, not re-ruled. 6205275538 has it ride; the approval sits on 83ab59422c; the merge commit carries no PR content (patch-id 5977831bc029 unchanged against the merge base, 61 files, +595/−2090); the Governed Surface Queue Guard run that survives on this head is success.
  • Dev deviations 1 and 2 are the two rulings above. Deviations 3 to 6 (files outside the claim's list, @object-ui/console as patch, the line-citation repairs, the attribution pair) are outside this face and are already judged in 6204947717. The five out_of_scope_findings carry 承接者:无 in the dev report; the one nearest this face (objectstack prose that still calls updateViewConfig the live overlay writer: spec docblocks, a migration entry string, a platform-checklist step) lives in another repository, not in skills/objectui/**. Noted, not re-judged.
  • Escalated, new, does not block the hunk: guide line 34, 33 lines above the hunk and outside it, still says the published DataSource has 38 members. Measured against the declaration: 37 at the merge base, 36 at this head, and 35 at the commit that wrote the number (6479086867, feat(types,plugin-detail): declare the field-security triple on record:details / record:highlights / record:related_list and read it un-cast (objectui#8649) #11184). It is the same class of claim the hunk retired, a count data.ts does not bear out, and this PR moves it one further from the declaration. It predates the PR and is not part of the approved five-line hunk, so it is not the hunk's defect; it owes a one-line governed follow-up in the hunk's own shape (a pointer to data.ts in place of the number). Carrier: the lane seat (domain:ui seat 1), to amend or card.
  • Check-runs on this head, all completed at the reading above: 38 runs, 34 success, 3 skipped (dependabot, the two coverage legs), 1 cancelled, none in progress. The cancelled run is the first of two "Governed Surface Queue Guard" runs on this head, one second long and superseded by the second, which is success. The 16 test shards and their "Test" aggregate, Type Check, Lint, Repo Gates, Build Docs, Build & E2E, Bundle Analysis, Spec Main Shape Gate, Line Citation Gate and the five changeset gates are success. The earlier head 3643cc1e6e, carrying the same patch (5977831bc029 against its own merge base 3e09c1e8d5, 61 files), finished 34 success / 3 skipped of 37.

Implemented-by: claude/issue-12504-retire-view-write-family
Reviewed-by: session_01JZnppgHRp4sREcouhkQYDB

VERDICT: PASS

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

Projects

None yet

3 participants