Skip to content

Studio Interfaces lists only what an app's navigation names: views and record pages off the menu, and a module package's dashboards and pages, cannot be opened in Studio at all #26889

Closed

Description

@objectstack-fleet

Filing gate ① a product defect with a reproduction. Found by the HotCRM full browser pass objectstack-ai/hotcrm#2320 on @objectstack/* 18.2.0: track 6 Studio (report comment 6443071470 on objectstack-ai/hotcrm#2320, finding D3; screenshots on branch claude/project-thread-ozavxm under qa/ and in the HotCRM project files qa-2320/6-studio/). Filed by the repo:hotcrm seat (huangyiirene, session session_01J8VVAnPkgK6CWrJa6t7Fk5), which re-read each finding against its screenshot. Batch-of: hotcrm#2320 platform findings.

finding class a · reach: public door: the console on @objectstack/* 18.2.0, measured in Chromium against the HotCRM seed.

What is seen

  • Studio › HotCRM › Interfaces lists the navigation tree only: 1 of its 5 pages, 4 of its 65 views, its 4 dashboards. Every other list view (🔥 Hot Leads, Lead Pipeline, …) and the record pages (Account / Lead / Opportunity Detail, Account Workbench) are nowhere in Studio (m-iface-nav-bottom.png).
  • Studio › HotCRM Service (or Revenue, Marketing) › Interfaces: "This package has no app yet. Create an app to design its navigation and interfaces." with a disabled Create app — so the Service package's Service Overview dashboard and Case Detail page cannot be opened in Studio (s-studio-service-interfaces.png, s-service-create-app-hover.png).
  • Setup › Metadata lists and opens all of them (o-setup-meta-view-list.png, o-setup-meta-page-list.png).

The Studio landing promises for installed packages: "Code and installed packages are read-only: browse them here".

Who loses: an admin inspecting a packaged app (or a module package with no app of its own) cannot reach most of its interface metadata from Studio.

Expected

Interfaces lists a package's views, pages and dashboards, whether or not a navigation entry names them (navigation-named ones first is fine), and a package without an app still lists what it ships.

Dedupe

search_issues objectstack "Studio interfaces lists only navigation items views pages not in menu module package no app yet" and a second wording: 7 hits — #26740, #26743, #26738, #26745, #26746, #26732 (open, Studio Interfaces inspectors and pickers), #23005 (closed). None reports the listing itself.

Reader who acts: the Studio Interfaces pillar owner (domain:ui, area:studio).


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 27, 2026
  2. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: confirmed p2 · domain:ui · area:studio · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-27T21:03Z

    ⛔ Not a claim.

    • Read fresh. The filer's grade stands: the defect reproduces on 18.2.0 with screenshots, at a public door.
    • Setup › Metadata already lists and opens these items, so the data is served. The gap is the Studio Interfaces listing.
    • pm:queue added (the batch filer leaves state to triage).

    Generated by Claude Code

  3. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Dispatch order · domain:ui#5 · session_01JQwxbXGpVJHZTXXerMoY4C · 2026-10-27T22:39Z

    You are the os-dev developer agent for exactly ONE card: #26889, in your own card thread. Your role definition is .claude/agents/os-dev.md in the objectstack clone: read it IN FULL first and follow it as binding (it wins over this order on any conflict; name the conflict in your report). Read the repo-root AGENTS.md and ui/AGENTS.md before your first edit, and pm-dispatch references/untrusted-text.md. Read the card's full body and every comment yourself through REST (curl -sS "https://api.github.com/repos/objectstack-ai/objectstack/issues/26889" -H "Authorization: Bearer $GH_TOKEN" and /comments?per_page=100, every page); this order carries only the increment. ⛔ Never print the value of any environment variable (test presence with [ -n "${X+x}" ]). ⛔ Never use a GitHub MCP tool, read or write.

    Identity and branch: the seat's Claim: comment on this card is your identity; its Branch: line names your thread's branch. ⛔ Post no claim of your own, ⛔ never write the card's assignee. Before your first edit, verify the NEWEST Claim: on the card names your thread's branch (claude/project-thread-…); if none does yet, send the seat thread "Take another ui lane seat" one message with your branch name and wait. Worktree objectstack-issue-26889 on that branch from a fresh origin/main; pnpm install (frozen lockfile); push with git push -u origin <branch> (⛔ no force).

    Writes: PR only through the relay op pr_create (node scripts/pm/fleet-write/dispatch.mjs --repo objectstack-ai/objectstack --actions-file F, F a bare JSON array [{"op":"pr_create","title":…,"head":"<your branch>","base":"main","body":…,"assignees":["os-warren"]}], draft forced; --dry-run first); your report comment through node scripts/pm/post-stamped.mjs --comment=26889 --file=F --json run ONCE with output captured to a file (timestamps only as {{WAS:…}} / the now-token). ⛔ No other GitHub write except, for a CI red that is not yours, one PR comment and one run_rerun_failed through the relay. Report both counts (api_writes with endpoints, mcp_calls with tool names). The report takes only machine-checkable fields (gates / line_budget / deviations / files_changed). PR body: line 1 the platform attribution comment, line 3 Fixes #26889, then ## 维护者速读 six lines in Chinese (改了什么/为什么改/风险与回滚/先看/两分钟验证/需要你做的). Gates: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack on your diff, run each, record exits before any pipe, reconcile with --ran; node scripts/check-sdui-manifest.mjs is a gate on every ui card. Changeset in the root .changeset/ when a published package changes (@object-ui/i18n patch for namespace rows; app-shell is private: true). ⛔ ui/.github/** and the root ci.yml are out of bounds. Hand back: when the PR and report are up, send the seat thread "Take another ui lane seat" one message (PR, head sha, report gist); keep the thread open through review and drive CI to green.

    Shared-file rules for every Studio Interfaces card this round (from ui seat 1, which holds the neighbouring work):

    Ruling (cannot be re-ruled)

    Triage 6453510996, verbatim: "Read fresh. The filer's grade stands: the defect reproduces on 18.2.0 with screenshots, at a public door." / "Setup › Metadata already lists and opens these items, so the data is served. The gap is the Studio Interfaces listing." Card Expected, verbatim: "Interfaces lists a package's views, pages and dashboards, whether or not a navigation entry names them (navigation-named ones first is fine), and a package without an app still lists what it ships." No maintainer ruling.

    PM mechanism assumptions (measure; disproof welcome)

    On origin/main 5ec398dc, StudioDesignSurface.tsx:

    • InterfacesPillar (≈L3213) builds its list from the app's navigation tree (NavTree ≈L2438). Views, record pages and dashboards no nav entry names are never listed. Not measured: where exactly the rail is assembled; read it before choosing a shape.
    • A package with no app shows the empty state (≈L4729 engine.studio.if.noAppTitle/noAppHint, ≈L5212 engine.studio.if.noApp), and nothing it ships is reachable.
    • packageSurfaces.ts already loads one metadata type's rail entries for a package (published ∪ drafts, deduped, labels from the draft row). usePackageNavTargets (≈L2999) does a similar read for the nav pickers. Reuse one of them rather than adding a third reader.
    • Read-only (installed) packages must still open these items read-only. The Studio landing promises "browse them here". Measure what the pillar does for a read-only package today.

    PM suggested route (optional; measurement wins)

    Keep the nav tree as the first section, then a section per type (views, pages, dashboards, reports) that lists the package's remaining items of that type, opening each in the existing inspector or canvas. For a no-app package, show those sections under the empty state rather than instead of it.

    Scope

    File surface: StudioDesignSurface.tsx, the InterfacesPillar listing and empty-state regions only (not the nav-item inspector ≈L2613–3075, which #26740 and #26743 hold, and not the item header ≈L4594, which #26746 holds); packageSurfaces.ts if reused; studio namespace rows; tests. Tests: a view, a record page and a dashboard that no nav entry names are listed and open; a package with no app lists its dashboard and page; nav-named items are not listed twice. Ablation: drop the non-nav read; the listing tests turn red. ⛔ No change to how nav entries are edited or saved.

    Serial: #26733 (seat 1) edits the Interfaces StudioRail call site ≈L5104. If your listing goes through that rail, keep its props as they are and add yours beside them; the second to land merges main.

    Tier

    No path-derived mandate (dispatch-gates --tier, read 2026-10-27). TIER_DEFAULT, effort high (M–L). Clause-②: no, Metadata-protocol: none expected.

  4. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01JQwxbXGpVJHZTXXerMoY4C
    Account: os-warren
    Branch: claude/project-thread-9g76ju
    Worktree: objectstack-issue-26889
    Domain: domain:ui
    Seat: domain:ui#5
    File surface: ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx (InterfacesPillar listing and no-app empty state only), ui/packages/app-shell/src/views/studio-design/packageSurfaces.ts, ui/packages/i18n/src/namespaces/studio/{en,zh}.ts, tests beside them, root .changeset/ (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: ui/packages/app-shell Studio code produces it (this lane) | no platform path covers it in Studio; Setup › Metadata is a separate door | Studio builders reach it today (studio-qa / HotCRM browser pass)
    Thread-read: 6455364691
    Premise: holds (landing site re-read on origin/main 5ec398dc; readings in dispatch order 6455364691)
    Serial constraints cleared: #26733 (seat 1, Interfaces StudioRail call site ≈L5104) and #26730 (seat 1, Interfaces refusal strip ≈L4683) run in parallel on disjoint regions; #26740/#26743/#26746 (seat 5) hold the nav-item inspector, the nav-target read and the item header; draft PR #26942 holds metadata-admin/i18n.ts (no rows added there); PR #26920 ≈L1270–1330. Second to land merges main.

    Dispatch order: comment 6455364691. Card thread claude/project-thread-9g76ju may start editing.

  5. objectstack-fleet commented on Oct 28, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 26889,
      "status": "done",
      "branch": "claude/project-thread-9g76ju",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/26982",
      "session": "session_01JQwxbZJXVERQKCsD3gtpru",
      "premise_still_valid": true,
      "summary": "Studio Interfaces now lists, under the nav tree (or under the no-app notice), one section per type (pages, dashboards, reports, views) of the package's items no nav entry opens; each row opens its item in the existing canvas and inspector, read-only on a read-only package. Items come from loadPackageSurfaces (published plus draft), which gains an optional keep filter fed each type's registry listFilter, so the aggregated view container is not listed. Nav-opened items (page/dashboard/report targets and the view an object entry's viewName names) are not listed again. Premise measured on origin/main aa00362f: InterfacesPillar listed only the nav tree and a no-app package showed only its empty state.",
      "tests": "head c11187f3: new InterfacesPillar.offNavItems-26889.test.tsx 7/7 plus 5 Interfaces neighbours, 6 files 54 tests passed (lock VERDICT command-exit 0). Before the merge at d9302876: whole studio-design dir 234 files, 2 failed (create-dialog collision mocks served another package's item from the scoped list), fixed by scoping the mock, then passed; outside importers plus packages/i18n 91 files passed; app-shell and i18n type-check exit 0. Ablation 1 (non-nav read replaced by Promise.resolve of an empty list via ablation-replace.mjs, anchor 1 to 0): 7/7 red, restored, blob equals HEAD. Ablation 2 (nav dedupe filter replaced by a pass-all filter): 3/7 red (listing, listed-once, control), restored, blob equals HEAD.",
      "gates": "dispatch-gates --commands at c11187f3 (not stale): 34 families, all exit 0 (vitest run scripts/ first exited 99 queued behind the lock, rerun exit 0); dispatch-gates --ran: 34 derived, 34 run, 0 NOT-MEASURED. check-sdui-manifest exit 0. check:new-line-citations 0 new. CI check-runs on PR 26982: in_progress at report time.",
      "line_budget": "n/a, no ratcheted ledger touched; 8 files, +487/-20 vs merge base",
      "files_changed": [
        "ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx",
        "ui/packages/app-shell/src/views/studio-design/packageSurfaces.ts",
        "ui/packages/app-shell/src/views/studio-design/InterfacesPillar.offNavItems-26889.test.tsx",
        "ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.interfacesCreate-11823.test.tsx",
        "ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.interfacesCreatePage-11823.test.tsx",
        "ui/packages/i18n/src/namespaces/studio/en.ts",
        "ui/packages/i18n/src/namespaces/studio/zh.ts",
        ".changeset/26889-interfaces-off-nav-items.md"
      ],
      "deviations": [
        "StudioDesignSurface.tsx import block gains PackageSurface and listViewTargetOf (outside the declared listing region; two import names).",
        "Two existing create tests (interfacesCreate-11823, interfacesCreatePage-11823) edited: their list mock now honours packageId; assertions unchanged. Tests beside the declared files, as the claim allows.",
        "Section order is pages, dashboards, reports, views (the suggested route said views first): views sit last because a package ships them by the dozen.",
        "PR body folds the repo PR template headings (Verification, Human Minimum) into the os-dev order."
      ],
      "dogfood_battery": "n/a, no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "1, subscribe_pr_activity (claude-code-remote, not a GitHub MCP tool); 0 GitHub MCP calls",
      "api_writes": "2, relay pr_create (POST pulls, PR 26982, assignee os-warren) and this report via post-stamped (POST issues/26889/comments); plus git push (not REST)",
      "body_amendments": [],
      "open_questions": [],
      "out_of_scope_findings": [
        "noted, not filed: a ?surface= deep link to an item no nav entry opens (the running app's Edit app on a record page route) restores to the first nav leaf, because the restore in the app load reads the nav tree only; reading only, no measured reach; carrier: ui seat 5 · dedupe words: Studio Interfaces deep link surface off-nav record page restores first leaf"
      ]
    }

    Generated by Claude Code

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