You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
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
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
Dashboard › Add widget menu → 11 types; select a widget › Type → 10 (no scatter).
Write each of the 20 spec widget types via PUT /api/v1/meta/dashboard/… → all render.
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.
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.
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):
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.
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.
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/main5ec398dc; 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.
{
"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"
]
}
Activity
objectstack-fleet commentedon Oct 27, 2026
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.
main.Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
Dispatch order ·
domain:ui#5·session_01JQwxbXGpVJHZTXXerMoY4C· 2026-10-27T22:41ZYou are the os-dev developer agent for exactly ONE card: #26745, in your own card thread. Your role definition is
.claude/agents/os-dev.mdin 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-rootAGENTS.mdandui/AGENTS.mdbefore your first edit, and pm-dispatchreferences/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; itsBranch:line names your thread's branch. ⛔ Post no claim of your own, ⛔ never write the card's assignee. Before your first edit, verify the NEWESTClaim: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. Worktreeobjectstack-issue-26745on that branch from a freshorigin/main;pnpm install(frozen lockfile); push withgit 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-runfirst); your report comment throughnode scripts/pm/post-stamped.mjs --comment=26745 --file=F --jsonrun 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 onerun_rerun_failedthrough the relay. Report both counts (api_writeswith endpoints,mcp_callswith tool names). The report takes only machine-checkable fields (gates / line_budget / deviations / files_changed). PR body: line 1 the platform attribution comment, line 3Fixes #26745, then## 维护者速读six lines in Chinese (改了什么/为什么改/风险与回滚/先看/两分钟验证/需要你做的). Gates:node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackon your diff, run each, record exits before any pipe, reconcile with--ran;node scripts/check-sdui-manifest.mjsis a gate on every ui card. Changeset in the root.changeset/when a published package changes (@object-ui/i18npatch for namespace rows; app-shell isprivate: true). ⛔ui/.github/**and the rootci.ymlare 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):
engine.studio.*rows, the Interfaces familyengine.studio.if.*included, out ofui/packages/app-shell/src/views/metadata-admin/i18n.tsintoui/packages/i18n/src/namespaces/studio/{en,zh}.ts. ⛔ Add or edit no row inmetadata-admin/i18n.ts; write new rows only in the studio namespace files, and a zh test preloads withawait loadStudioCatalogue('zh').ui/packages/app-shell/src/views/studio-design/StudioDesignSurface.tsxis shared with ui seat 1's Studio publish refusals: shown only as a ~4 s toast with engine-internal text; the Pending changes panel keeps no refusal; "Show me" does not focus the offending input and the dashboard/report refusal strip has no "Show me" #26730 (the Interfaces refusal strip ≈L4683 gets anonShow), Studio rails: a search with no matches shows a blank list with no "no matches" message (object rail, permission-set rail) #26733 (props on the fourStudioRailcall sites, Interfaces ≈L5104) and PR fix(metadata-protocol,runtime,app-shell)!: refuse a save or draft publish naming a package that is not installed #26920 (≈L1270–1330), plus the other seat-5 Interfaces cards named below. Keep your hunks inside your declared region; whoever lands second mergesorigin/mainand resolves.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/main5ec398dc:metadata-admin/inspectors/DashboardWidgetInspector.tsx≈L70WIDGET_TYPESis a hand-kept list of 10, typed toDashboardWidgetTypeName. 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.metadata-admin/previews/block-types.tskeeps documented exclusions with reasons (≈L218–268:record:chatteris a compatibility alias ofrecord:discussionand 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.engine.inspector.widget.datasetHint, studio namespaceen.ts≈L503) mentions "the inline object query above", which does not exist. Reword it in en and zh to describe the real controls.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, efforthigh(M).Clause-②: no,Metadata-protocol: noneexpected.objectstack-fleet commentedon Oct 27, 2026
Claim: PM loop round 1
Session:
session_01JQwxbXGpVJHZTXXerMoY4CAccount:
os-warrenBranch:
claude/project-thread-iudfy4Worktree:
objectstack-issue-26745Domain:
domain:uiSeat:
domain:ui#5File 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: highClause-②: no
Metadata-protocol: none
Responsibility:
ui/packages/app-shellStudio 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/main5ec398dc; readings in dispatch order 6455394911)Serial constraints cleared: No open PR touches
DashboardWidgetInspector.tsx,DashboardDefaultInspector.tsxorblock-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-iudfy4may start editing.objectstack-fleet commentedon Oct 27, 2026
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