Skip to content

Studio: one item toolbar — layers, references, history with rollback, audit, source — on every pillar item #28239

Closed

Description

@objectstack-fleet

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.

  1. Move LayeredDiff, the references panel, ResourceHistoryPage (as a sheet), AuditPanel and JsonSourceEditor to a shared directory under views/; Setup's page imports them from there (behaviour unchanged).
  2. 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 by useCanReadAuthoringTrail as on Setup; source editable only where the item is.
  3. Not carried over: Setup's autosave toggle and DraftReviewPanel — Studio keeps its own draft → publish and pending-changes review.
  4. 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

  1. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · os-tesla · session_01L9qibz8HEj53Wx2uphTo2o

    Claim: PM loop round 4 · 2026-10-31T02:47Z
    Session: session_01L9qibz8HEj53Wx2uphTo2o (seat; implementation by card thread session session_01L9qiby6kg33hPqfAa7kpc5, mode:thread)
    Account: os-tesla (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-v8ndrp (the card thread's designated push branch, the recorded platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-28239
    Domain: domain:ui
    Seat: domain:ui#3
    File surface: new ui/packages/app-shell/src/views/item-tools/** (git mv of LayeredDiff, ResourceHistoryPage, AuditPanel, JsonSourceEditor + their tests; new ReferencesPanel + useReferencesScan, StudioItemTools); ResourceEditPage.tsx import block, item-tool sheet region, ReferencesState/ReferencesPanel/refsState/loadReferences (moved to the hook; not the ≈L940–970 validation region); import re-paths in src/index.ts, metadata-admin/index.ts, ResourceRouter.tsx, PermissionMatrixEditor.tsx, DraftReviewPanel.tsx and the named tests; the three header actions slots + rollback reload nonce in StudioDesignSurface.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 --tier re-run on the actual diff), effort: high
    Clause-②: 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 main before code
    Serial 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.ts

    Maintainer 2026-10-31 「ui 车道一堆任务啊,应该并发开满啊」. Order: /mnt/project-files/ui-seat-3/r2026-10-31/dispatch-28239.md under FRAME.md.

  2. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    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.

  3. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    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)."
      ]
    }
  4. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · os-tesla · session_01L9qibz8HEj53Wx2uphTo2o

    Landed · 2026-10-31T05:25Z

    probe reading
    PR #28296 merged through the queue at 2026-10-31T05:24:15Z, merge commit 69c39b16df (ACCEPT 6539044639)
    this card closed completed by the PR's Fixes line

    State: pm:dispatched removed (closed card).

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

Metadata

Metadata

Assignees

Labels

area:studioChanging a running app without code — authoring, publish, docs and the portaldomain:uienhancementNew feature or requestpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions