Skip to content

Studio Interfaces: dashboard widget types differ between the Add menu (11), the Type picker (10, no scatter) and the spec (20); the page block picker lacks 8 of 34 standard blocks; widget dataset help mentions a nonexistent "inline object query" #26745

Closed

Description

@objectstack-fleet

Filing gate: ① product defect, reproduced, landing site named.
Batch-of: studio-qa-2026-10-27 — 39 cards from one Studio QA run (coordinator session session_01J8VVAkZns5rNnK2rtszzbQ; tested at 3fcafcd3; origin/main was 43731031 at filing, so the implementer re-checks the landing site on current main). The run record is the qa-run issue filed with this batch.

Symptom

Nine renderable widget types (column, treemap, sankey, combo, gauge, solid-gauge, kpi, bullet, radar) have no Studio entry although all 20 render when written through the API; eight standard blocks cannot be placed from Studio.

Reproduction

  1. Dashboard › Add widget menu → 11 types; select a widget › Type → 10 (no scatter).
  2. Write each of the 20 spec widget types via PUT /api/v1/meta/dashboard/… → all render.
  3. Page designer block picker lacks record:chatter, record:approval_decision, record:approvals, record:attachments, app:launcher, global:notifications, element:record_picker, element:text_input.
  4. Widget dataset field help text refers to an "inline object query above" that does not exist.

Expected

One source of truth for widget and block types in Studio, matching the spec; help text describes real controls.

Suspected landing site (the implementer verifies)

Studio dashboard widget menus and page block palette under ui/packages/app-shell/src/views/studio-design/.

Filing facts

  • reach: Studio UI, measured by the Interfaces QA card.
  • Business reason: Builders cannot use half the chart types the platform ships.
  • Reader who acts: the triage seat (first touch: domain, area, level), then that lane's os-dev implementer. QA suggestion only: domain:ui, area:studio, p3.
  • Dedupe: semantic search dashboard widget Add menu and Type picker list different widget types, block picker missing standard blocks on objectstack-ai/objectstack → 0 hits.
  • QA id: U13

Activity

  1. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade — priority:p2 · domain:ui · area:studio · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-27T17:03Z

    ⛔ Not a claim, ⛔ not a dispatch.

    • p2: the dashboard Add menu (11), the Type picker (10) and the spec (20) list different widget types, and the page block picker lacks 8 standard blocks. Derive every picker from one registry of the renderable types. ⛔ No hand-kept lists. From the studio-qa-2026-10-27 batch. Re-check the landing site on current main.

    Generated by Claude Code

  2. added
    area:studioChanging a running app without code — authoring, publish, docs and the portal
    and removed on Oct 27, 2026
  3. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

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

    You are the os-dev developer agent for exactly ONE card: #26745, 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/26745" -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-26745 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=26745 --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 #26745, 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 6448297073, verbatim: "p2: the dashboard Add menu (11), the Type picker (10) and the spec (20) list different widget types, and the page block picker lacks 8 standard blocks. Derive every picker from one registry of the renderable types. ⛔ No hand-kept lists. From the studio-qa-2026-10-27 batch. Re-check the landing site on current main." No maintainer ruling.

    PM mechanism assumptions (measure; disproof welcome)

    On origin/main 5ec398dc:

    • metadata-admin/inspectors/DashboardWidgetInspector.tsx ≈L70 WIDGET_TYPES is a hand-kept list of 10, typed to DashboardWidgetTypeName. Its docblock says "A hand-written SUBSET is fine"; the triage ruling replaces that. The Add menu's list of 11 is somewhere else: find it. Derive both from the spec's widget-type vocabulary, filtered by the types the console's renderer registry actually renders.
    • Block palette: metadata-admin/previews/block-types.ts keeps documented exclusions with reasons (≈L218–268: record:chatter is a compatibility alias of record:discussion and is left out of the palette on purpose). The card's "lacks 8 of 34" counts those. Measure each of the 8. A block excluded with a recorded reason stays excluded; say so per block in the report. Only blocks missing with no reason are added.
    • The dataset help text (engine.inspector.widget.datasetHint, studio namespace en.ts ≈L503) mentions "the inline object query above", which does not exist. Reword it in en and zh to describe the real controls.
    • Each widget type needs a label key. Add the missing engine.inspector.widget.type.* rows in the studio namespace en/zh.

    Scope

    File surface: DashboardWidgetInspector.tsx, the Add-widget menu's file, block-types.ts (palette list only), studio namespace en/zh rows, tests. These metadata-admin files are shared with the Setup pages, so the change must be the same in both. Tests: the Add menu and the Type picker offer the same set, equal to the renderable spec types; each newly offered block is placeable; a test pins that the two pickers read one source. Ablation: put one hand-kept list back; the parity test turns red. ⛔ No change to renderers or to the spec vocabulary.

    Tier

    No path-derived mandate. TIER_DEFAULT, effort high (M). 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-iudfy4
    Worktree: objectstack-issue-26745
    Domain: domain:ui
    Seat: domain:ui#5
    File surface: ui/packages/app-shell/src/views/metadata-admin/inspectors/DashboardWidgetInspector.tsx, the Add-widget menu file, ui/packages/app-shell/src/views/metadata-admin/previews/block-types.ts (palette list), ui/packages/i18n/src/namespaces/studio/{en,zh}.ts, tests, 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: 6455394911
    Premise: holds (landing site re-read on origin/main 5ec398dc; readings in dispatch order 6455394911)
    Serial constraints cleared: No open PR touches DashboardWidgetInspector.tsx, DashboardDefaultInspector.tsx or block-types.ts (open-PR file lists read 2026-10-27); draft PRs #26942 and #26936 add rows to the studio namespace files (append-only conflicts). Second to land merges main.

    Dispatch order: comment 6455394911. Card thread claude/project-thread-iudfy4 may start editing.

  5. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 26745,
      "status": "done",
      "branch": "claude/project-thread-iudfy4",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/26967",
      "head": "65768a23",
      "base": "aa00362f",
      "session": "session_01JQwxbafngYyQTJq78seG4v",
      "premise_still_valid": true,
      "summary": "Widget half holds and is fixed: the Add-widget menu (11) and the inspector Type select (10, no scatter) now both read previews/widget-types.ts, whose offered set is ChartTypeSchema.options (20) read at runtime; per-type presentation is checked against ChartType with satisfies, so a spec change fails tsc. Ten engine.inspector.widget.type.* and nine engine.widgetPicker.type.* rows added to the studio namespace (en+zh); engine.inspector.widget.datasetHint reworded in en and zh. Block half: measured PageComponentType 34, palette offers 26, the 8 not offered are exactly the 8 PALETTE_EXCLUSIONS entries, each with a recorded reason, so none is added and block-types.ts is untouched (per block: record:chatter alias of record:discussion; app:launcher and global:notifications shell singletons; element:record_picker and element:text_input field widgets; record:approvals, record:attachments, record:approval_decision recorded as a deferred Studio decision, see open_questions).",
      "tests": "New AddWidgetPicker.oneRegistry-26745.test.tsx 7/7 (registry = spec enum; Add menu set = spec; Type select options = spec in spec order; all 20 render through DashboardPreview/DashboardRenderer with no placeholder or OBJUI-001 panel; heatmap lit control; en+zh rows for both keys). Neighbours: 123 files, 1773 passed / 13 skipped, exit 0. type-check @object-ui/i18n + @object-ui/app-shell: Done, exit 0. Ablation 1 (Type select back to a hand-kept 10-type list): 1 failed / 6 passed. Ablation 2 (registry back to a hand-kept 11-type list): 3 failed / 4 passed. Both via scripts/ablation-replace.mjs, anchor 1 -> 0, restore blob == HEAD, git diff HEAD empty. No dist leg: the tests import app-shell sources by relative path.",
      "gates": "dispatch-gates --commands on 65768a23: 34 derived, all exit 0 (incl. node scripts/check-sdui-manifest.mjs, pnpm --dir ui exec vitest run scripts/ 178 files passed); --ran reconciliation: 34 run, 0 NOT-MEASURED, 0 UNRUN, exit 0. pnpm check:new-line-citations: 0 new, exit 0. CI check-runs on PR 26967: in_progress at report time.",
      "line_budget": "8 files, +351 / -76 (427 changed lines, under the 3000 human-merge threshold); no ratchet-governed file touched",
      "files_changed": [
        ".changeset/26745-studio-widget-type-registry.md",
        "ui/packages/app-shell/src/views/metadata-admin/inspectors/DashboardWidgetInspector.tsx",
        "ui/packages/app-shell/src/views/metadata-admin/inspectors/inspectorStrings.i18n-10748.test.tsx",
        "ui/packages/app-shell/src/views/metadata-admin/inspectors/inspectorStrings.i18n-10804.test.tsx",
        "ui/packages/app-shell/src/views/metadata-admin/previews/AddWidgetPicker.oneRegistry-26745.test.tsx",
        "ui/packages/app-shell/src/views/metadata-admin/previews/widget-types.ts",
        "ui/packages/i18n/src/namespaces/studio/en.ts",
        "ui/packages/i18n/src/namespaces/studio/zh.ts"
      ],
      "deviations": [
        "The Add-widget menu file of the claim's surface is previews/widget-types.ts (the menu's data); AddWidgetPicker.tsx itself needed no change.",
        "Beyond the order's engine.inspector.widget.type.* rows, nine engine.widgetPicker.type.* rows were added to the studio namespace, because the Add menu displays that family; the family's 11 older rows stay in metadata-admin/i18n.ts (not edited, per the shared-file rule).",
        "Renderability is not filtered at runtime: plugin-dashboard does not export its dispatch classifier and is lazy-loaded by DashboardPreview, so the registry takes ChartTypeSchema as-is (every member is routed, pinned by plugin-dashboard widget-dispatch-spec-parity.test.ts) and the new test re-checks rendering through DashboardRenderer.",
        "Branch is the platform thread branch, not claude/issue-26745-slug; PR body folds the PR template headings into the os-dev order; the harness-written attribution HTML comment is line 1 of the PR body."
      ],
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "2 — fleet-write relay pr_create (workflow dispatch, PR 26967 created as draft with assignee os-warren); this report comment via post-stamped.mjs. git push is not a REST write.",
      "open_questions": [
        {
          "question": "record:approvals, record:attachments and record:approval_decision render but are excluded with the reason 'not yet offered: offering it is a Studio decision'. Should the page palette offer them?",
          "options": [
            "A: separate Studio card that decides each block (record-context placement, config panel, labels) and offers the ones that fit",
            "B: offer all three now in this PR",
            "C: keep them excluded and rewrite the reasons as standing decisions"
          ],
          "recommendation": "A, because the dispatch rule keeps recorded exclusions, and offering a record-context block is feature work (panel, labels, placement) outside this card's picker-registry fix"
        }
      ],
      "out_of_scope_findings": [
        "carrier: #25922 · noted, not filed: engine.widgetPicker.type.* and engine.inspector.widget.type.* name the same 20 types differently (Bar chart / Bar Chart, Data table / Table); collapsing them is a naming decision, best taken when the widgetPicker rows leave metadata-admin/i18n.ts"
      ]
    }

    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