Repository navigation
feat(app-shell): Studio copilot draft marks, the remainder: the Permissions save surface, the data-objectstack README, inline element marks (objectui#12725) - #13106
Merged
objectstack-fleet[bot] merged 6 commits intoOct 20, 2026
Conversation
…face=studio (objectui#12725) PermissionMatrixEditPage sends `surface: 'studio'` on its package-door draft save only when Studio's Access pillar hosts it (`packageId` + `embedded`); metadata-admin's mount states none. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XVp19E1MYUTFM3dnkwz8gB
…w (objectui#12725) `field-multi` and `FieldsListEditor` (its `FieldListRow`) take the copilot-added set through an optional `copilotAdded` prop and draw the draft chip in each marked element's row; absent, nothing changes. The list-view properties pass it instead of the chip list under the widget, and the now-unused `DraftElementList` is removed. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XVp19E1MYUTFM3dnkwz8gB
… in the README; changeset (objectui#12725) Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XVp19E1MYUTFM3dnkwz8gB
…carries surface=studio (objectui#12725) Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XVp19E1MYUTFM3dnkwz8gB
…n (objectui#12725) Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XVp19E1MYUTFM3dnkwz8gB
…conditionScope (objectui#12725) Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XVp19E1MYUTFM3dnkwz8gB
Contributor
✅ 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
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part of #12725
Clause-②: no — the claim's condition was "unless a widget's exported prop changes". The new
copilotAddedprop sits onWidgetProps(widgets.tsx),FieldsListEditorPropsandFieldListRow, and none of them is on@object-ui/app-shell's published face. The package'sexportsis.only, andsrc/index.tsre-exports none of them (and noexport *). The rest is a README paragraph and internal call sites.Items 1–3 of the remainder in release
6280467303. Item 4, the live staging reading of the first real copilot draft, is not reachable from this seat and stays on the card, so this PR isPart of.What changed
1. The Permissions pillar's draft save names its surface (
metadata-admin/PermissionMatrixEditor.tsx).PermissionMatrixEditPage's save addssurface: 'studio'only when it is a package draft (packageId) and Studio hosts it (embedded). Studio's Access pillar mounts it with both. metadata-admin mounts it through the resource registry (ResourceEditPagerendersEditPagewithtypeandnameonly), so it states no surface there.2. README (
packages/data-objectstack/README.md). A new section, "Reading a Draft and Who Changed It", is one paragraph covering:getDraftanswers the wire envelope;extractDraftBody;draftChangesreaders:readDraftChanges(absent means not recorded),governingDraftChange(longest prefix;[]is the whole body; segments compared whole) anddraftChangesUnder;surfacesave option,'studio' | 'api', sent once. When it is omitted the save is recorded asapi.copilotis the server's own.3. Inline element marks.
WIDGETS['field-multi'](a kanban card's fields) andFieldsListEditor(a view's columns, throughFieldListRow) take an optionalcopilotAddedset. They draw the copilot's Draft chip (DraftChip, testidstudio-draft-element-chip,data-draft-ofthe element) inside each marked element's row. With the prop absent, nothing is drawn and the markup is unchanged.ObjectListViewInspectorpasses the added set instead of drawingDraftElementListunder each widget. When a copilot change tocolumnsadded no column (a reorder or a removal), the chip still sits beside the setting.DraftElementListhad no other caller and is removed fromStudioDraftMark.tsx.Optional item (the tighter layered read): left as it is. A copilot entry governs an array setting when it sits at that path or at any ancestor (
config,config.kanban,[]handled apart). The path also depends on whether the row is record-shaped (configor not), and the hook does not know that shape when it reads. That makes it more than one condition, and the ruling allowed it only as one.Tests
New:
metadata-admin/PermissionMatrixEditor.saveSurface-12725.test.tsx— pin (a). The REAL hosts (AccessPillar, andMetadataResourceEditPagethrough the built-in registration) save through a REALMetadataClientwhose transport records each PUT:getAll('surface')equals['studio'], withmode=draftand the package;getAll('surface')equals[].metadata-admin/previews/copilotAddedRowMark-12725.test.tsx— pin (b), for both widgets:copilotAdded, the markup has no chip and equals the markup for a set that marks nothing the widget holds.Re-pointed:
studio-design/ObjectListViewInspector.copilotMarks-12725.test.tsx— pin (c). The chip list under the widgets is gone, somarkedElementsreads the in-row chips bydata-draft-of. The[]leg reads them in the widgets' own sections (list-view-kanban-fields,list-view-columns) instead of the removed list testids. The first leg also asserts that each added card field's row carries the mark and the published row does not.metadata-admin/PermissionMatrixEditor.layersUnsaved-11799.test.tsx— its exact query string now ends in&surface=studio, because it mounts the editor the way Studio hosts it (packageId+embedded).Runs, under the shared lock with
--maxWorkers=1:PermissionMatrixEditor,widgets,FieldsListEditor,ViewColumnPanes,ObjectListViewInspector,StudioDraftMark, the Access pillar). The first run had 1 failure, thelayersUnsaved-11799pin above; it passed after the update.AccessPillarorPermissionMatrixEditPage: all passed.packages/app-shellandpackages/data-objectstackdirectories are declared to CI.Type-check:
@object-ui/app-shell^...exited 0;@object-ui/app-shelltype-check(tsc --noEmit && tsc -p tsconfig.test.json, so the test files are typed) exited 0 at the final head;@object-ui/data-objectstacktype-checkexited 0.Ablation
Each mutation went through
ablation-replace.mjsin wrap mode. Each restore is proven by blob hash equal to HEAD and an emptygit diff HEAD.surface: 'studio'sent unconditionally: the metadata-admin leg goes red (1 failed / 1 passed) and the Studio leg stays green. Restored3694a08e82af.field-multi: the in-row pins go red (3 failed / 8 passed). Restored65bf9276b19b.FieldListRow: the columns pins go red (2 failed / 9 passed). Restored0f892bab3c4b.The ablations ran at
16e61a3329. The two commits after it touch only test files: an unused import, and the widget context's requiredconditionScope.Gates
At
233c059e1c, each exit code recorded:check:spec-floorsexits 1, all of it[no-artifact](packages not built here)..ts/.tsxfiles (--no-inline-config, JSON format: 10 files): 0 errors, and no message on an added line. The config is not type-aware, so a narrowed run cannot change the verdict on an untouched file.check-governed-queue-guard --testover the 12 changed paths: NOT GOVERNED.Acceptance notes
StudioDraftMark.tsxis outside the claim's literal file surface. The edit there removesDraftElementList, which this change leaves with no caller, and widens the doc ofDraftChip'sofprop.useMetadataLocale), as that widget's other text does. The chip list it replaces read the panel'slocaleprop.The implementing session is
https://claude.ai/code/session_01XVp19E1MYUTFM3dnkwz8gB.Generated by Claude Code