Repository navigation
[Epic] Studio designs, Setup administers (ADR-0146): one editor per metadata item, in-place customization on read-only packages, the paired <base>.customize package, the metadata catalog moves into Studio #28130
Description
director#1 · os-bill · session_01Utp6CaRN6wdrRyLKJSCMYH
Epic: ADR-0146 rollout · pm:epic · opened by the project decision thread 「决定 Studio 建议三行的产品取舍」 on the maintainer's word 「同意,立专题卡」 (2026-10-30T13:22Z), after 「按照这个方案先更新 issue,写adr。等我审核」 (10:28Z). The record is ADR-0146 (Proposed), draft PR #28045 — the maintainer's hand-merge is its acceptance (Prime Directive #14). ⛔ Not a claim.
Blocked-by: PR #28045. ⛔ Until ADR-0146 merges, no seat claims this epic and no child card is cut from it; the phase lists below are the plan of record, not cards. The row rulings already executing on #27356 (row 12 → PR #28076, merged; row 19 A1 Delete flow, seat domain:ui#3) stay on #27356 and are not children of this epic.
Territory (declared): ui/packages/app-shell/src/views/studio-design/** (pillars, rails, switcher, landing), ui/packages/app-shell/src/views/metadata-admin/** (the catalog that moves), ui/packages/app-shell/src/views/setup/** (Packaged automation page; the new administration pages), ui/packages/app-shell/src/hooks/useStudioDesignGate.ts, packages/runtime/src/flow-clone.ts and packages/runtime/src/domains/{automation,packages}.ts (the clone door's target package; the paired-package create convention), packages/metadata-protocol/src/protocol-package-install.ts (explicit namespace on the paired create), docs/qa/platform-checklist/areas/{studio-authoring,ux-conventions}.json, ui/e2e/live/studio-object-designer.spec.ts. Server children go to the domain:server queue; the rest are domain:ui.
维护者速读
- 改了什么: 按 ADR-0146 分三期落地「Studio 管全部元数据、Setup 只做管理」:② 只读包上就地覆盖 + 流的账本开关与克隆放项上 + 配对定制包
<base>.customize当一个界面看;③ 元数据目录 / 源码 / 分层 / 历史 / 诊断从 Setup 搬进 Studio,Setup 补职位持有人与权限集分配两页,Setup → Metadata 路由重定向,QA 清单与 e2e 改门;④ 其余类型按需进支柱。 - 为什么改: HotCRM 走查(Setup and Studio: suggestions from a full HotCRM browser pass on 18.2.0: user onboarding, packaged automation state, run-now for scheduled flows, admin lists, and Studio entry, field table, flow inspector wording and one designer per item #27356 行 12/14/19):同一条流两个设计器两种保存、代码包没有 Studio 入口、删除 / 重置 / 开关 / 克隆只在 Setup、客户定制没有家。你 10-30 的裁定见 ADR-0146 D1–D7。
- 风险与回滚: 每张子卡独立 PR,可单独回退;目录搬家(③)前 Setup 页保留,搬家用重定向,不删路由。
- 先看: ADR-0146 的 D2(§9 三样提起)、D3(配对包 + 显式 namespace)、D4(账本开关的权限边界);本卡的第二期 6 张。
- 两分钟验证: 第二期完成后:打开 HotCRM(只读)→ 任一视图可改并出现「已自定义」+ 重置;任一流可「在本部署关闭」与「克隆」;克隆落在
hotcrm.customize并混排在 HotCRM 的 rail 里。 - 需要你做的: 先 hand-merge docs(adr): ADR-0146 — Studio designs, Setup administers; one editor per metadata item; paired
<base>.customizepackage #28045;合并后由协调员 / 本线程切第二期子卡进各车道队列。
Phase 2 — customization on the read-only package (6 children; cut after #28045 merges)
| # | Child (one card each) | Lane | ADR | Depends on |
|---|---|---|---|---|
| 2a | In-place overlay editing on a read-only package's overlay-type item (views, dashboards, reports first; translations and email templates after): draft writes the overlay row, publish applies; "customized in this environment" chip from the layered read; Reset to package default (the existing DELETE /meta/:type/:name, honest verb from resettable); retire the row-13 link to Setup |
domain:ui |
D2 | — |
| 2b | Activation-ledger switch and Clone on a read-only package's flow in the Automations pillar: switch bound to GET /automation/_status + POST /automation/<name>/toggle, worded "off for this deployment", distinct from the writable package's definition switch; disabled from the served posture facts (features.tenancyPosture, user.isPlatformAdmin) with the console's wording, server refusal shown verbatim after an attempt; Clone via POST /automation/<name>/clone with the server notice and the "switch the original off" offer (objectui#13270) |
domain:ui |
D4 | 2c for the clone's landing |
| 2c | Flow clone door takes a target packageId (a writable package) and refuses a package-less target once 2d exists; closes the ADR-0070 D5 gap (clones no longer land in the retired scope) |
domain:server |
D3 | — |
| 2d | Paired-package create convention: POST /packages (and the install primitive) accept <base>.customize — dependency on the base in manifest.dependencies (ADR-0141), namespace set to the base's explicitly (the id-derived default would be customize), idempotent create-if-absent; one packages/spec constant for the pairing that the door and the console both read |
domain:server (+ domain:spec for the constant) |
D3 | — |
| 2e | Studio shows base + <base>.customize as one surface: mixed rails with a "customization" chip and an "only customizations" filter; New / Clone land in the paired package without a prompt; pending-changes and publish act on the paired package; the switcher folds the paired package under its base; contributed items from other packages greyed with their source |
domain:ui |
D3 | 2d |
| 2f | Studio landing: one line per package — overlaid count and switched-off count (served rows and ledger rows; nothing computed) | domain:ui |
D3 | 2a, 2b |
Phase 3 — the catalog moves (4 children; cut after Phase 2 lands)
| # | Child | Lane | ADR |
|---|---|---|---|
| 3a | Re-home views/metadata-admin directory, lists, generic item page (schema form, Source JSON, layered diff, history, diagnostics, reset/delete) under Studio's All metadata area, per package and across packages; a pillar type opened from the directory opens its pillar |
domain:ui |
D1 |
| 3b | Setup administration pages: position holders (from PositionHoldersSection) and permission-set assignment (from AssignedUsersSection) as people-and-organization pages under setup.access; queue membership arrives with ADR-0142 D2, not here |
domain:ui |
D7 |
| 3c | Setup → Metadata routes redirect into Studio; the Setup item pages for the seven pillar types stop editing; Packaged automation stays as the deployment-wide operations overview until the maintainer decides its retirement (ADR-0146 open question 1) | domain:ui |
D1, D4 |
| 3d | QA checklist and e2e: items driving the Setup designer as "a sibling door onto the same save" (studio-authoring.json, ux-conventions.json, studio-object-designer.spec.ts) rewritten to the Studio door or marked transitional |
domain:ui (docs/qa) |
Consequences |
⛔ 3c does not retire a route whose administrative action has no Setup home yet (3b first).
Phase 4 — as pulled (direction only, no cards here)
App, action, dataset (today a create dialog, no designer), translation, email template, documentation and the AI types gain pillar-grade designers one card at a time; until then the All-metadata area's generic page is their editor.
Not in this epic
- Setup and Studio: suggestions from a full HotCRM browser pass on 18.2.0: user onboarding, packaged automation state, run-now for scheduled flows, admin lists, and Studio entry, field table, flow inspector wording and one designer per item #27356 row 12 (browse entry, D5) — merged as PR feat(console): an admin can open a read-only package's app in Studio to look at it #28076. Row 19 A1 (Delete flow) — seat
domain:ui#3on Setup and Studio: suggestions from a full HotCRM browser pass on 18.2.0: user onboarding, packaged automation state, run-now for scheduled flows, admin lists, and Studio entry, field table, flow inspector wording and one designer per item #27356. Row 14 — will not do (letter C). - Any change to the overlay tier's membership, the activation ledger's shape, or clone lineage (ADR-0005, ADR-0126 §9 second bullet).
Dedupe
Open domain:ui / area:studio titles read for "Setup designer", "one designer", "customize package", "overlay in Studio", "Open in Studio": none covers this plan. Related, not duplicates: #27356 (the source rows), #27928 (row 20 nav-contributor stamp, server), #26889 (contributed interfaces listing), #27842 / #27504 (switched-off packaged action), #12049 (ADR-0126's charter card).
Links back: ADR-0146 (PR #28045), #27356, ADR-0126 §7.4 / §9, ADR-0070 D3 / D5, ADR-0141, ADR-0142.
Size: XL across phases; each child S–M.
Generated by Claude Code
Activity
docs(adr): ADR-0146 — Rollout and Refs point at tracking epic #28130
objectstack-fleet commentedon Oct 30, 2026
director#1 · os-bill · session_01Utp6CaRN6wdrRyLKJSCMYH
Status — 2026-10-30T14:04Z.
ADR-0146 merged: PR #28045 landed on
mainascdbf08d1(2026-10-30T13:55Z, merge queue). The Blocked-by in the body is satisfied; the ⛔ on cutting children is lifted. The last contract review's three wording should-fixes ride in follow-up PR #28145 (docs-only, Tier H hand-merge); they change no decision.Phase 2 children cut (each
pm:queue,priority:p2, waiting for its lane — ⛔ not claims):domain:uidomain:uipackageIddomain:serverHeld: 2d (paired-package create convention) waits on the maintainer's answer to ADR-0146 open question 2 — a
packages/specconstant for the pairing (this epic's row, recommended) or a server-side default applied by the create door; 2e and 2f depend on 2d / 2a+2b and are cut right after. Phase 3 is cut after phase 2 lands, as the body says.pm:blockedcomes off this epic now that its named blocker merged; the held children are named here, not by a label.Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
epic:#28130#1 · hotlong · session_040dfd80c4c9411b895c698e785a6848
Closed 2026-10-30T18:41Z as not planned — superseded by epic #28236 (package-level override).
<base>.custompackage through one declared override shared by code and Studio. ADR-0146 is rewritten in place (docs(adr): rewrite ADR-0146 for package-level override — customizations live in <base>.custom through a declared override (folds #28145) #28237; PR docs(adr): ADR-0146 — anchor the four load-bearing symbols, count two Setup pages, drop the epic label snapshot (S13–S15) #28145 folds into it) rather than built as merged.pm:epic— the children are lane work.<base>.customizepackage, the metadata catalog moves into Studio #28130」.