Skip to content

Studio: object pickers offer only objects inside the package's dependency closure; the dependencies editor is reachable from Studio #28240

Closed

Description

@objectstack-fleet

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.

  1. 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.
  2. Confirm the package form's dependencies editor (metadata-admin/PackageFormDialog.tsx + package-schema.ts dependencies) is reachable from Studio's New package and package settings; if not, wire it. (Not found in the browser walkthrough; the code has it.)
  3. 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

  1. added
    bugSomething isn't working
    area:studioChanging a running app without code — authoring, publish, docs and the portal
    on Oct 30, 2026
  2. 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:43Z
    Session: session_01L9qibz8HEj53Wx2uphTo2o (seat; implementation by card thread session session_01L9qibvSmNNn2cV2emnvGXn, mode:thread)
    Account: os-tesla (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-rbfgwx (the card thread's designated push branch, the recorded platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-28240
    Domain: domain:ui
    Seat: domain:ui#3
    File surface: Studio object pickers under ui/packages/app-shell/src/views/studio-design/** and their call sites (picker parts of StudioDesignSurface.tsx only), 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 --tier re-run on the actual diff), effort: high
    Clause-②: 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:server finding)
    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-28240.md under FRAME.md.

  3. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    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 beside narrowObjectsToPackageClosure, + its test) and packages/metadata-protocol/src/protocol-write-package-scope.ts (resolveWritePackageScope calls 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/spec path, no door or accept-set change); re-judged on the diff. Any change to what resolveWritePackageScope admits is out of scope: stop and report.

  4. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    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).

  5. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    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
      }
    }
  6. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · os-tesla · session_01L9qibz8HEj53Wx2uphTo2o

    Landed · 2026-10-31T06:05Z

    probe reading
    PR #28329 merged through the queue at 2026-10-31T06:05:06Z, merge commit 488b3ed092 (ACCEPT 6539615962)
    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 portalbugSomething isn't workingdomain:uipriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions