Repository navigation
refactor(app-shell,types,data-objectstack)!: retire the toolbar-to-view write family and DataSource.updateViewConfig (objectui#12504) - #12586
Conversation
…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
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
✅ Console Performance Budget
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
Size Limits
|
Contract reviewServed-tier: This is the lane seat's own record. The claim's
① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
维护者速读改了什么:退役列表工具栏「写共享视图」的整套旧路径,改完后共享视图只剩视图编辑器的「保存」这一条写入口。共 61 个文件,+595/−2090,大部分是删除。具体退掉的有:
另外,发布出去的技能指南 为什么改:维护者已裁 A( 风险与代价(含回滚):
席位意见:建议批准。
你要做的:用 席位核对
Generated by Claude Code |
|
Pre-landing check ·
Generated by Claude Code |
Maintainer's word recorded · batch #353, the PR line · director seat (summon #42 continuation 1,
|
✅ Console Performance Budget
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
Size Limits
|
Contract reviewServed-tier: Read at 2026-10-16T00:44Z from: card #12504 (body and its six comments, the ruling ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS |
Fixes #12504
Clause-②: no (narrowing). A published
@object-ui/typesmethod and the@object-ui/data-objectstackmethod behind it leave the contract, as ruled (ruling6203730732, 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 (handleViewConfigSavethenpersistRuntimeMetadata) is now the one write path to the shared view, and it is unchanged.What changed
@object-ui/app-shell,ObjectView.tsx. RemovedpersistViewPatchwith its debounce timers, pending-patch map and write chain,toolbarWriteInputs,buildPersistedViewBody, theCONSOLE_MADE_TABmark and its guard, thesavedViewsRefmirror that only the writer read, the refusal toast, and thesetSystemCapabilitiespush effect. That effect existed only to feed the adapter gate onupdateViewConfig, 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 theviewIdentity.tsdocblock.@object-ui/types.DataSource.updateViewConfig?is removed. ThelistViewOverridesdocblock now namescreateView/updateViewas the writes that share its key space. TheonDensityChangedocblock inobjectql.tsno longer suggests the method.@object-ui/data-objectstack.ObjectStackAdapter.updateViewConfigis 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.viewConfigPermissionDeniedleaves all ten packs. Its only producer was the retired toast.ObjectGrid.tsx(three places),ListView.tsx,useDensityMode.ts(its@example),data-table.tsxandConcurrentUpdateDialog.tsx. The@exampleledger row inscripts/check-doc-example-types.mjsnow names the identifiers the example references. This is a data string only; the row's codes are unchanged.content/docs/utilities/data-objectstack.mdxdrops the retiredsystemCapabilitiesfactory option. Its member count, which the change would have made false, is replaced by a pointer to theExcludeexpression that lists the members.skills/objectui/guides/data-integration.mdlistedupdateViewConfig?(...)among theDataSourceview members and told agents to write a view through it. It now names it besidesaveViewas 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 everySKILL.md, one file) 142 before, 142 after. The line count does not grow..changeset/12504-retire-view-write-family.md:minorfor@object-ui/typesand@object-ui/data-objectstack, with a BREAKING paragraph namingDataSource.updateViewConfigandObjectStackAdapter.updateViewConfig.patchfor 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.updateViewConfigandObjectStackAdapter.updateViewConfig. The method opened with a capability gate, and that gate was published under five names that nothing else reads:ObjectStackAdapter.setSystemCapabilities, thesystemCapabilitiesoption of the constructor and ofcreateObjectStackAdapter,VIEW_CONFIG_CAPABILITY,ViewConfigPermissionDeniedErrorandisViewConfigPermissionDeniedError. Measured: the only thrower of the error wasupdateViewConfig, and the only reader of the capabilities was the privatemaySetViewConfig, which onlyupdateViewConfigcalled. The only caller ofsetSystemCapabilitieswas theObjectVieweffect retired above. In objectstackorigin/mainand hotcrmorigin/mainthere 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
b1708d8f6bbeside the method.Mechanism assumptions (PM's A1 to A4), measured on base
830eb1f2ddupdateViewConfiginpackages/*/srcandapps/*/srcfound one call expression outside tests,dataSource.updateViewConfig?.(...). It sat insidepersistViewPatch, the retired family, with that function's guard read beside it. The other hits by kind:DataSourcemember and the adapter method;ObjectView.tsx,viewIdentity.ts,data.ts,objectql.ts,data-objectstackindex.ts,ObjectGrid.tsx,useDensityMode.tsanddata-table.tsx;updateViewConfig. The one presence pin wasadapterFactoryReturn.types.test.ts, which assertedsetSystemCapabilities(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 asDataSourcethat carries the member is now refused as an unknown property. None exists in this tree, and the type-check is green.persistViewPatchcatch.check:i18n-keys,check:i18n-driftandcheck:i18n-dead-keysaccept the removal.objectView-config-keys-retired-4730.test.tsrecords 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.tsdrops one matched pair (87 to 86).ObjectView.viewConfigGate.test.ts,ObjectView.densityInsideConfig-11625.test.tsandviewConfigPermissionGate.test.ts.meta.saveItem,updateView/createViewspies). Rows that were written through the method are now planted at rest in the shape the retired write stored. Firing controls now usecreateView. Comments were corrected.ObjectView.overlayPatchOnly.test.ts, whosebuildPersistedViewBodywrite cases retired with the function.Fork condition: not met. There is no named caller of
updateViewConfigoutside the retired family. objectstackorigin/mainhas 0 call expressions. Its hits are docblocks and test comments inpackages/specandpackages/metadata-protocol, a migration entry string, and one QA checklist step (see Acceptance notes). hotcrmorigin/mainhas 0 hits. In objectui,apps/*has only the two stub lists andexamples/*has 0.Pins
ObjectView.overlayPatchOnly.test.ts, describe "objectui#12504 census — the toolbar-to-view write family is retired"). It reads code with comments stripped:ObjectView.tsxdefines and reaches none ofpersistViewPatch,buildPersistedViewBody,toolbarWriteInputs,CONSOLE_MADE_TAB,updateViewConfig,setSystemCapabilities,isViewConfigPermissionDeniedErroror the toast key;DataSourcedeclares noupdateViewConfig, pinned offdata.tsand as a type thattype-checkreads;ObjectStackAdapter.prototypehas noupdateViewConfigand nosetSystemCapabilities, and the package exports none of the three gate names. The same fact is also pinned as a type.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.ui.list.OBJECTrow and write no view. This is the unchangedObjectView.userListState-12418.test.tsxandconsoleListStateWall-12418.test.tsxsuites; the wall suite's own CONTROL now writes through the real adapter'screateView.Ablation (through objectstack
scripts/ablation-replace.mjs, each leg restored and proven)DataSourceindata.ts. Anchor 1 to 0, blob3b3996403088to1acc16bfed4b. Predicted: only the DataSource census case goes red. Observed:Tests 1 failed | 14 passed (15), the red being "DataSourcedeclares noupdateViewConfig(@object-ui/types)". Restore: blob equals HEAD3b3996403088, andgit diff HEADis empty.updateViewConfigmethod is re-added toObjectStackAdapter. Anchor 1 to 0, blob1a202c973005tob87a7a2f451f. Predicted: the adapter census case and theviewOverlayMarker"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..d.ts): the Leg A mutation is held, and@object-ui/typesis rebuilt (exit 0; marker indist/data.d.ts: 1). Then app-shelltsc -p tsconfig.test.jsonexits 2 with exactly one error, TS2322 at the censusAbsentassertion. Restore: blob equals HEAD and the diff is empty. After a rebuild, the marker count in dist is 0.Tests 15 passed (15). Controls stayed green in every leg.Local gates (at
3643cc1e6e, the merge oforigin/main3e09c1e8d5)pnpm --workspace-concurrency=2 --filter '@object-ui/app-shell^...' buildunder 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-checkof types, data-objectstack, app-shell, plugin-grid, plugin-list, react, i18n, components, plugin-detail and console: allDone, 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.3643cc1e6eunder the lock: everyObjectView*andInterfaceListPage*app-shell suite,view-filter-fold.ratchet,writeRefusalCensus-11583,consoleListStateWall-12418,src/context/__tests__/, four app-shell__tests__sweeps, the whole ofpackages/data-objectstack/andpackages/i18n/, every touched plugin, components, types and console test, the readers of the skill guide and the docs page, theAFFORDANCE_GRANTScensus (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.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 threecheck: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-majorandcheck-changeset-fixed.ObjectView.tsxnow carries 182 warnings, against the 197 the objectui#12474 dev reported at their head.check-governed-queue-guard --teston 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:PUT /api/v1/meta/view/...and no error toast. Each change lands as asys_user_preferencewrite of the user'sui.list.OBJECTrow, and survives a reload.PUTto/meta/viewis still sent, and the edit is visible to another user._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.Acceptance notes
persistViewPatch/updateViewConfigas the live overlay writer in prose. The places are two docblocks inpackages/spec/src/ui/view.zod.ts, the string of the spec migration entry18.view-overlay-judged-by-viewkind-arm, comments inview-metadata-schema.test.ts,view-overlay-viewkind-arm.test.tsandmetadata-protocolprotocol.graft-folded-form-sections.test.ts, and the platform-checklist step indocs/qa/platform-checklist/areas/records-forms.jsonthat says "or the persisted view override via dataSource.updateViewConfig". None of these has a runtime effect, and they are outside this claim (objectstack files). 承接者:无.persistViewPatch. It is a decision record and a governed path. 承接者:无.11625-density-inside-config,11642-toolbar-writes-composeand11643-fallback-tab-session-onlydescribe the toolbar's view write, which objectui#12418, objectui#12474 and this change moved away and then retired. All are still pending (pre.jsonhas consumed none), so they publish beside this one. They are other cards' declarations and are not edited here. 承接者:无.narrowPersonalizationOverlay,VIEW_OVERLAY_OWNED_KEYS) is a separate question that no deployment measurement here informs. 承接者:无.ListView.tsx's comment on the forwardedonColumnStateChangestill says a parent persists "alongside the view definition". It does not name the retired method, and objectui#12474's report already noted it. 承接者:无.gridNonAuthorKeys.test.tsx's producer strings, inObjectGrid.tsx's columnState docblock and in theInterfaceListPageoverlay 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 实测零调用方。席位意见
你要做的
本 PR 改到了发布给客户的技能文档(
skills/**,受管面),因此需要您在 PR 上留一条批准,才能进入合并队列。若您希望代码先落地、文档另走,告诉席位拆分即可。Generated by Claude Code