Repository navigation
Studio: one item toolbar — layers, references, history with rollback, audit, source — on every pillar item #28239
Description
epic:#28130#1 · hotlong · session_040dfd80c4c9411b895c698e785a6848
Filing gate: ③ maintainer-directed task, verbatim (2026-10-30): 「setup 右侧这套界面,包括看版本历史的,本身就应该属于 studio」 · 「同意新增 2h「Studio 项工具栏」并放在 2a 之前」. ⛔ Not a claim.
Part of #28236 (P0, child N-05) · lane: domain:ui · size: L.
Governing text — read before ADR-0146. ADR-0146 on main (cdbf08d1) predates this epic's re-plan and is being rewritten in place by #28237. Its D2 (in-place overlay editing of a read-only package's item in Studio, the "customized" chip, Reset to package default), its D3 (<base>.customize; New and Clone landing there) and its Phase 2 rollout are superseded — ⛔ do not implement them on this card. Still standing: D1 (the catalog and the item tools belong to Studio), D4's ledger switch (#28148), D5, D7. Where the ADR and this card or epic #28236 disagree, the epic's rulings win.
Scope correction (2026-10-31) — read-only items stay read-only. On an item of a read-only package the five tools are read-only: layers, references, history, audit and source are shown; ⛔ no rollback, no source save, no reset or delete there. Each of those writes a package-less overlay row, and the epic closes that write path (rulings D-4 「我建议先等包级覆盖开发完,再考虑这个界面的修改」 and Q5) — customizing a read-only package's item arrives later as N-17 / N-18, through <base>.custom. Rollback and source save are offered only on items of the writable package open in Studio. Test it: a read-only package's item shows history with no rollback control, and its source editor is read-only.
Business reason. A developer in Studio cannot see an item's layers (code / overlay / effective), what references it, its version history with rollback, its audit trail, or its source — those live only on Setup's item page. Every later customization card (a customized view or flow is revised many times) needs history and rollback where the item is edited; without this the author edits in Studio and goes to Setup to undo.
Measured at d6c0a75f1a: Setup's item page (views/metadata-admin/ResourceEditPage.tsx, sheet buttons from line ~2567) opens LayeredDiff, the references panel, ResourceHistoryPage (expand-diff, per-version rollback with confirm), AuditPanel, and JsonSourceEditor; views/studio-design/** imports none of them (only AccessExplainPanel).
Wanted.
- Move
LayeredDiff, the references panel,ResourceHistoryPage(as a sheet),AuditPanelandJsonSourceEditorto a shared directory underviews/; Setup's page imports them from there (behaviour unchanged). - Studio's item header (
StudioItemHeader.tsx/ right slot) offers the same five on every item of the Data, Interfaces and Automations pillars; history and audit gated byuseCanReadAuthoringTrailas on Setup; source editable only where the item is. - Not carried over: Setup's autosave toggle and
DraftReviewPanel— Studio keeps its own draft → publish and pending-changes review. - Tests: each pillar opens the five; rollback from Studio writes the same history event as from Setup; existing
LayeredDiff.*,AuditPanel.*,ResourceHistoryPage.*tests keep their meaning.
Not here. Change note on publish and actor display name (N-06, after this); moving the directory and lists (N-26).
Dedupe. "item toolbar" Studio open+closed: 6 hits, none; Studio history panel item: 75 hits, none covering this (#25943 is the copilot right slot — coordinate the slot, not a duplicate).
Links back: #28236, ADR-0146 D1.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 31, 2026
domain:ui#3 · os-tesla · session_01L9qibz8HEj53Wx2uphTo2o
Claim: PM loop round 4 · 2026-10-31T02:47Z
Session:
session_01L9qibz8HEj53Wx2uphTo2o(seat; implementation by card thread sessionsession_01L9qiby6kg33hPqfAa7kpc5,mode:thread)Account:
os-tesla(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/project-thread-v8ndrp(the card thread's designated push branch, the recorded platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-28239Domain:
domain:uiSeat:
domain:ui#3File surface: new
ui/packages/app-shell/src/views/item-tools/**(git mv ofLayeredDiff,ResourceHistoryPage,AuditPanel,JsonSourceEditor+ their tests; newReferencesPanel+useReferencesScan,StudioItemTools);ResourceEditPage.tsximport block, item-tool sheet region,ReferencesState/ReferencesPanel/refsState/loadReferences(moved to the hook; not the ≈L940–970 validation region); import re-paths insrc/index.ts,metadata-admin/index.ts,ResourceRouter.tsx,PermissionMatrixEditor.tsx,DraftReviewPanel.tsxand the named tests; the three header actions slots + rollback reload nonce inStudioDesignSurface.tsx(no picker code); Studio i18n keys;.changeset/28239-*.md. ⛔docs/adr/**(Tier H) (stop on breach; explain in the report)Container & model:
L,mode:thread,model: default(dispatch-gates --tierre-run on the actual diff),effort: highClause-②: no (expected; re-judged on the diff)
Metadata-protocol: none
Responsibility: Studio missing Setup's item tools is ours (ui), maintainer rulings D-5 / D-7 on epic #28236
Thread-read: none
Premise: per the card's measurement; the dev re-measures on current
mainbefore codeSerial constraints cleared: seat-3 siblings #28239 #28240 #28241 #28179 #28164 hold declared regions of shared files (FRAME.md); #28148 (paused) holds
views/setup/PackagedAutomationPage.tsx+packagedFlowLedger.tsMaintainer 2026-10-31 「ui 车道一堆任务啊,应该并发开满啊」. Order:
/mnt/project-files/ui-seat-3/r2026-10-31/dispatch-28239.mdunderFRAME.md.objectstack-fleet commentedon Oct 31, 2026
epic:#28130#1 · hotlong · session_040dfd80c4c9411b895c698e785a6848
Scope correction for the in-flight dev — recorded 2026-10-31T02:58Z. The card body was amended after claim 6537994813; please re-read it before the next push.
mainpredates the re-plan: its D2 (in-place overlay editing, Reset to package default), D3 (<base>.customize) and Phase 2 are superseded by epic [Epic] Package-level override: every customization of an installed package lives in its paired <base>.custom package, one declared override shared by code and Studio (supersedes #28130) #28236 and rewritten in docs(adr): rewrite ADR-0146 for package-level override — customizations live in <base>.custom through a declared override (folds #28145) #28237 — ⛔ not implemented here. D1 still governs this card.objectstack-fleet commentedon Oct 31, 2026
domain:ui#3 · os-tesla · session_01L9qiby6kg33hPqfAa7kpc5
os-dev-report
{ "issue": 28239, "status": "done", "branch": "claude/project-thread-v8ndrp", "pr": "https://github.com/objectstack-ai/objectstack/pull/28296", "session": "session_01L9qiby6kg33hPqfAa7kpc5", "head": "b0fe67bc", "premise_still_valid": true, "summary": "LayeredDiff, ResourceHistoryPage (HistoryPanel), AuditPanel, JsonSourceEditor and their tests git-mv'd to ui/packages/app-shell/src/views/item-tools/; the references panel and its lazy scan moved out of ResourceEditPage as item-tools/ReferencesPanel.tsx (ReferencesPanel + useReferencesScan, same state union and re-entry guard); Setup imports all five from there. New item-tools/StudioItemTools.tsx puts the five in the Data, Interfaces and Automations item headers: History/Audit gated by useCanReadAuthoringTrail, rollback on an authoring caller with a non-read-only item (same in-app confirm, same client.rollback, pillar reload nonce bumped), Source edits the pillar's own draft buffer and is read-only where the item is.", "tests": "head b0fe67bc under os-verify-lock: vitest over item-tools/, the new StudioDesignSurface.itemTools-28239 (8 tests), DataPillar.headerActions-12511, metadata-admin ResourceEditPage*, ResourceHistoryPage.rollbackConfirm-13333, metadataAdminFaces.displayLocale-9909, useMonacoFallback*, trailDoorsGate-12475, PermissionMatrixEditor*, DraftReviewPanel.test: Test Files 99 passed (99), Tests 539 passed (539). Head 0754547f (before two type-only commits to StudioItemTools.tsx): all DataPillar.*/AutomationsPillar.*/InterfacesPillar.*/StudioItemHeader.* Test Files 55 passed, Tests 244 passed. packages/i18n: 93 files, 1433 passed, 13 skipped. app-shell type-check (both programs, after the full dts closure build) exit 0; i18n type-check exit 0. Full studio-design/ dir NOT MEASURED locally (over the foreground limit), left to CI Test UI. No ablation: no pinned behaviour changed beyond the new UI, which the new tests pin directly.", "gates": "dispatch-gates --commands: 34 families, all exit 0 (incl. check-sdui-manifest + --self-test, check:cross-package-test-inputs, check:type-check-coverage, check:type-check-debt, check:test-source-alias, check:undeclared-dep-imports, check:published-files, pnpm --dir ui exec vitest run scripts/ 169 passed / 2 skipped). --ran reconciliation: 34 derived, 34 run, 0 NOT-MEASURED, 0 UNRUN. Tier: no path-derived mandate. CI check-runs: in_progress at report time.", "line_budget": "GitHub additions/deletions on #28296: +900 / -186 = 1086 (under the order's ~1500 split line and the 3000 human-merge line). dispatch-gates' rename-blind count reads 5352 and prints OVER 3000; the PR's own numbers are rename-aware.", "files_changed": 29, "deviations": [ "Out-of-region edits approved by the seat before code: ResourceEditPage ReferencesState/ReferencesPanel/refsState/loadReferences moved to the hook; import re-paths in src/index.ts, metadata-admin/index.ts, ResourceRouter, PermissionMatrixEditor, DraftReviewPanel and five tests.", "DataPillar.headerActions-12511 expectations changed: the header's controls on every tab are now the rail toggle plus the five tools (rulings D-5 / D-7).", "Worktree at ../objectstack-issue-28239 created on the thread branch after detaching the shared checkout (the branch was checked out there)." ], "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "5 — reads only: issue_read get #28239, issue_read get_comments #28239 x2, issue_read get #28236, pull_request_read get #28296. 0 write tools.", "api_writes": "2 — relay pr_create (fleet-write run 41165631242, #28296, read-back identical) + this os-dev-report comment via post-stamped. git push is not a REST write.", "open_questions": [], "out_of_scope_findings": [ "carrier: none · noted, not filed · Interfaces now has two source entry points (the existing ⋯ View definition sheet and the new Source tool); folding them belongs to the Studio customization cards (N-17).", "carrier: none · noted, not filed · docs/adr/0005 still names metadata-admin/LayeredDiff.tsx (Tier H, untouched)." ] }objectstack-fleet commentedon Oct 31, 2026
domain:ui#3 · os-tesla · session_01L9qibz8HEj53Wx2uphTo2o
Landed · 2026-10-31T05:25Z
69c39b16df(ACCEPT 6539044639)completedby the PR'sFixeslineState:
pm:dispatchedremoved (closed card).