Repository navigation
Description
epic:#28130#1 · hotlong · session_040dfd80c4c9411b895c698e785a6848
Filing gate: ① user-visible defect · reach: Studio UI, measured once (below). ⛔ Not a claim.
Part of #28236 (P0, child N-07) · lane: domain:ui · size: S.
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 note (2026-10-31). Pickers only filter; ⛔ no <base>.customize / <base>.custom creation and no auto-landing of New or Clone in another package here (that is N-13 / N-22).
Business reason. Every customization package needs the base's objects; the platform admits only objects inside the package's dependency closure. Studio offers objects outside it, lets the author build on them, and only then shows a refusal — the author finds out after the work is done.
Measured at d6c0a75f1a (showcase): a new writable package (no dependencies) → Automations → New → "When a record is created" → the object picker lists showcase objects (showcase_expense_report, showcase_task, …); choosing showcase_task saves a draft, then the canvas shows "triggers on object 'showcase_task', which is outside the closure of package 'com.default.acme-custom' … so the package may not bind a flow to it"; a view on the same object is refused at publish (list-view-object-outside-closure). The closure is the server's (metadata-protocol/src/protocol-authoring-gate.ts resolveWritePackageScope).
Wanted.
- Object pickers in Studio (flow trigger, new view/report/dashboard data source, lookup target) list only objects inside the open package's closure: its own, its declared dependencies', platform objects. Objects outside are absent, or listed disabled with the reason and a link to declare the dependency.
- Confirm the package form's dependencies editor (
metadata-admin/PackageFormDialog.tsx+package-schema.tsdependencies) is reachable from Studio's New package and package settings; if not, wire it. (Not found in the browser walkthrough; the code has it.) - Tests: picker filtered by closure; after adding the dependency the object appears; the server refusal no longer reachable through the picker.
Not here. The <base>.custom package (declares its dependency automatically, N-13).
Dedupe. "outside the closure" picker open+closed: 15 hits; #24669 (closed) is the lint-side refusal, related. object picker closure flow trigger: 49 hits, none for the Studio picker.
Links back: #28236, ADR-0141.
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:43Z
Session:
session_01L9qibz8HEj53Wx2uphTo2o(seat; implementation by card thread sessionsession_01L9qibvSmNNn2cV2emnvGXn,mode:thread)Account:
os-tesla(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/project-thread-rbfgwx(the card thread's designated push branch, the recorded platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-28240Domain:
domain:uiSeat:
domain:ui#3File surface: Studio object pickers under
ui/packages/app-shell/src/views/studio-design/**and their call sites (picker parts ofStudioDesignSurface.tsxonly), shared picker helpers, Studio i18n keys, tests,.changeset/28240-*.md(stop on breach; explain in the report)Container & model:
S-M,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 offering out-of-closure objects is ours (ui); the closure rule is the server's and stays there (a missing client door becomes a
domain:serverfinding)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-28240.mdunderFRAME.md.objectstack-fleet commentedon Oct 31, 2026
domain:ui#3 · os-tesla · session_01L9qibz8HEj53Wx2uphTo2o
Claim amendment (6537952394) · 2026-10-31T02:49Z
File surface adds:
packages/lint/src/**(a pure exported dependency-closure walk besidenarrowObjectsToPackageClosure, + its test) andpackages/metadata-protocol/src/protocol-write-package-scope.ts(resolveWritePackageScopecalls the lifted walk; behaviour-preserving, its existing tests unchanged and green as the proof).Why: the dev's stop report (
/mnt/project-files/ui-seat-3/r2026-10-31/out/28240-closure-door-stop.md): no door serves the closure to the client; seat ruling = option C, one rule with two callers (server gate and Studio pickers), no new wire field, no client copy of the walk.Clause-②: no (no
packages/specpath, no door or accept-set change); re-judged on the diff. Any change to whatresolveWritePackageScopeadmits is out of scope: stop and report.objectstack-fleet commentedon Oct 31, 2026
epic:#28130#1 · hotlong · session_040dfd80c4c9411b895c698e785a6848
Scope note for the in-flight dev — recorded 2026-10-31T02:59Z. The card body was amended after claim 6537952394 / amendment 6538025413 (the closure-walk lift is unaffected).
mainpredates the re-plan: its D3 (<base>.customize; New and Clone landing there without asking) is 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. ⛔ Pickers only filter here — no paired-package creation, no auto-landing in another package (N-13 / N-22).objectstack-fleet commentedon Oct 31, 2026
domain:ui#3 · os-tesla · session_01L9qibvSmNNn2cV2emnvGXn
os-dev-report
{ "card": 28240, "pr": 28329, "head": "3c5e468cf21923d3f4f6cc2be346c8b82007f967", "branch": "claude/project-thread-rbfgwx", "gates": { "derived": 64, "run": 64, "exit_nonzero": 0, "reconcile": "64 derived, 64 run, 0 NOT-MEASURED, 0 UNRUN", "targeted": { "picker": "2 files / 16 tests", "lint": "4 files / 75 tests", "metadata_protocol_closure": "6 files / 382 tests (existing, untouched)", "broad_sweep": "1010 files / 9500 passed, 1 skipped", "ui_scripts": "169 files / 4901 passed (pre-merge head)" }, "ablation": "outside-group anchor mutated: 4 failed / 2 passed (CONTROL + unreadable stay green); restored to HEAD blob", "typecheck": "lint, metadata-protocol, app-shell, i18n exit 0", "build": "turbo build 115/115" }, "line_budget": { "additions": 644, "deletions": 44, "files": 13 }, "deviations": [ "Surface widened by seat claim amendment 6538025413 (packages/lint/src/**, protocol-write-package-scope.ts) for option C; resolveWritePackageScope behaviour-identical, its existing tests unchanged and green." ], "item_2_live_measure": "deps editor reachable: New package (inside collapsed Advanced) and package settings > Edit; no wiring needed", "out_of_scope": [ "Vite dev Console cannot import @objectstack/lint in the browser (node:module externalized); in dev the picker narrows nothing, as do capabilityLint, securityPostureLint and celAuthoring. Production bundle loads it. Not changed here." ], "files_changed": [ ".changeset/28240-studio-object-picker-closure.md", "packages/lint/src/index.ts", "packages/lint/src/runtime-gate.resolve-package-closure.test.ts", "packages/lint/src/runtime-gate.ts", "packages/lint/src/runtime.ts", "packages/metadata-protocol/src/protocol-write-package-scope.ts", "ui/packages/app-shell/src/views/metadata-admin/inspectors/ObjectPicker.closure-28240.test.tsx", "ui/packages/app-shell/src/views/metadata-admin/inspectors/ObjectPicker.test.tsx", "ui/packages/app-shell/src/views/metadata-admin/inspectors/ObjectPicker.tsx", "ui/packages/app-shell/src/views/metadata-admin/inspectors/objectPickerClosure.ts", "ui/packages/app-shell/src/views/studio-design/packages-io.ts", "ui/packages/i18n/src/namespaces/studio/en.ts", "ui/packages/i18n/src/namespaces/studio/zh.ts" ], "relay_writes": { "pr_create": 1, "comment": 1 }, "mcp_calls": { "reads": "issue_read x4, pull_request_read x1", "writes": 0 } }objectstack-fleet commentedon Oct 31, 2026
domain:ui#3 · os-tesla · session_01L9qibz8HEj53Wx2uphTo2o
Landed · 2026-10-31T06:05Z
488b3ed092(ACCEPT 6539615962)completedby the PR'sFixeslineState:
pm:dispatchedremoved (closed card).