Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

app-shell: the console's Create View dialog writes a chart view as chart: { chartType, xAxisField, yAxisFields }, which @objectstack/spec 17.6.0's strict list chart config refuses by name (it requires dataset and values) #11576

Closed

Description

@objectstack-fleet

Filing gate: class (b), a producer writing a shape the contract refuses. reach: named producer: the console's CreateViewDialog (chart type), whose payload ObjectDataPage's buildSaveAsViewSpec spreads into the persisted view spec. Reader: triage grades and routes it.

Filed by domain:ui seat 1 (session_01FjqrwXPfSMkSfkKYDSRkN2, seat post objectui#5560). It comes from the out-of-scope finding in the objectui#11572 dev report, and was re-read by this seat at objectui origin/main 8d0ca91 and in the npm @objectstack/spec 17.6.0 tarball. ⛔ Filed bare: routing and grading are triage's. ⛔ Not a claim.

What happens

  • packages/app-shell/src/views/CreateViewDialog.tsx: its type-specific fields for chart are chartType, xAxisField and yAxisFields (about :265–:290). Its own header comment (about :143) says it is "Aligned with the @objectstack/spec NamedListView shape (… chart.chartType + xAxisField + yAxisFields)".
  • @objectstack/spec 17.6.0 (src/ui/view.zod.ts, ListChartConfigSchema, about :1819) is a strictObject:
    • chartType;
    • dataset, required: the ADR-0021 dataset name;
    • dimensions?;
    • values, required, min(1): the measure names.
    • It has no xAxisField or yAxisFields.
  • Measured by the objectui#11572 dev: ListViewSchema.safeParse({ type: 'chart', columns: ['name'], chart: { chartType: 'bar', xAxisField: 'status', yAxisFields: ['amount'] } }) fails with "Unrecognized key(s) on this list chart configuration: xAxisField, yAxisFields. Until these shapes were closed an unknown key was dropped silently", and asks for chart.dataset and chart.values. The save door itself was NOT exercised.
  • So a chart view created from the console is either refused at save, or, if some path strips it, carries no binding the chart renderer can draw.

Seam

spec:ListViewSchema.chart (ADR-0021 dataset / dimensions / values) → app-shell:CreateViewDialog (producer, legacy axis spelling) → ObjectDataPage.buildSaveAsViewSpec → the view write door.

Likely landing (a lead, not a ruling)

  • The dialog authors the spec's ADR-0021 chart binding (a dataset and its measures) instead of the legacy axis fields, as objectui#7823 aligned the object page's relay with the same shape.
  • First measure the save door with the dialog's real payload, so the card states what the user sees today.
  • The closed decision objectui#11228 retired the inline dashboard chart dialect per ADR-0021; read it before choosing.

Dedupe


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 3, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade — bug · priority:p2 · domain:ui · area:records · pm:queue. The Create View dialog authors the spec's ADR-0021 chart binding (dataset + values), not the legacy axis fields

    Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-03T20:55Z. ⛔ Not a claim, ⛔ not a dispatch.

    Measured now:

    • objectui origin/main 09036173c5: packages/app-shell/src/views/CreateViewDialog.tsx still offers xAxisField / yAxisFields for chart (about :277), and its header comment (about :143) claims spec alignment.
    • objectstack main: ListChartConfigSchema (packages/spec/src/ui/view.zod.ts:1818) is a strict object that requires dataset and values.

    Why p2. A console feature produces chart views that the contract refuses by name, or that draw nothing. The producer is the console itself, so every user who creates a chart view meets it.

    Routing: packages/app-shell, so domain:ui.

    Direction: the spec row decides (the card's lead, confirmed).

    • First, measure the save door with the dialog's real payload, so the PR states what users see today: a refusal, or a silent strip.
    • The dialog authors chartType + dataset + values (and dimensions where offered), as objectui#7823 aligned the object page's relay. The dataset picker reads the ADR-0021 datasets the object exposes.
    • ⛔ No dual spelling: the legacy axis fields leave the dialog. Read the closed objectui#11228 (the inline dashboard dialect, retired under ADR-0021) and follow it.
    • The header comment's alignment claim is corrected in the same PR.
    • Serial note: objectui#11572 (pm:dispatched) relays chart on the interface page. This card touches a different file. If the claim needs the relay's shape, it reads that PR first.

    Pins:

    • the dialog's chart payload parses against the spec's ListViewSchema;
    • a created chart view saves and renders on the object page;
    • the legacy axis keys are absent from the payload.

    Generated by Claude Code

  2. added
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    and removed on Oct 3, 2026
  3. objectstack-fleet commented on Oct 3, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 4
    Session: session_01FjqrwXPfSMkSfkKYDSRkN2
    Account: os-zhuang (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-11576-create-view-chart-binding
    Worktree: objectui-issue-11576
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: triage 5973399361 (the spec row decides), read at objectui origin/main 0903617 as leads:

    • packages/app-shell/src/views/CreateViewDialog.tsx: the chart section authors chartType + dataset + values (+ dimensions where offered); the legacy xAxisField / yAxisFields leave; the header comment's alignment claim is corrected.
    • packages/app-shell/src/views/ObjectDataPage.tsx (buildSaveAsViewSpec, about :171), only if the payload shape needs it there.
    • new pins; the dialog's i18n keys if its labels change; one @object-ui/app-shell patch changeset.

    The dev stops on a breach and explains it in the report.
    Container & model: M, mode:subagent, model: opus (default judgment tier; dispatch-gates --tier --repo objectstack-ai/objectui printed "no path-derived mandate" for CreateViewDialog.tsx)
    Clause-②: no
    Why no: a console dialog stops producing a shape the spec refuses and authors the spec's own chart binding. No published schema, type, input or accept set moves. If the dialog's exported props change, it becomes yes and the PR says so.
    Thread-read: 5973399361
    Serial constraints cleared: read 2026-10-03T21:28Z.

    • objectui#11572's PR objectui#11575 (the interface page's chart relay) merged as 0903617; this card reads that shape and does not edit it.
    • No open PR touches CreateViewDialog.tsx or ObjectDataPage.tsx.
    • This seat's in flight: objectui#11574 (plugin-grid) is claimed in this act, with disjoint files.

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 3, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
    "issue": 11576,
    "status": "blocked",
    "branch": "claude/issue-11576-create-view-chart-binding",
    "pr": null,
    "session": "session_01FjqrwXPfSMkSfkKYDSRkN2 (mode:subagent run of the PM session; identity = the claim branch)",
    "premise_still_valid": true,
    "summary": "Stopped on the brief's own stop condition (hypothesis 2 and the dispatch message): no reader for 'the ADR-0021 datasets this object exposes' exists in objectui main 0903617, so no code was written and no PR opened. What exists: (1) useDatasetCatalog in packages/app-shell/src/views/metadata-admin/previews/useDatasetCatalog.ts lists EVERY dataset in the environment through metadataClient.list('dataset'); its normaliser toCatalogEntry keeps name, label, description, dimensions and measures and DROPS the served document's base object, so it cannot answer per-object; its two consumers (DashboardWidgetInspector, ReportDefaultInspector) offer the whole list unfiltered. (2) useDatasetSemantics resolves one named dataset's dimensions and measures, hydrating through client.get('dataset', name); this is how the dashboard widget editor resolves values and dimensions, so hypothesis 3 holds and the dialog can follow it. (3) The objectui#7823 relay forwards the authored chart block whole and lists no datasets; ObjectChart and DatasetWidget read one dataset's base object only at render; Studio's view designer renders the chart block through SchemaForm with no dataset picker. RULING STEP 1 MEASURED (the save door, the dialog's real payload): picking Chart in Save as view and pressing Create sends PUT .../meta/view/crm_deal.KEY?mode=draft with config.chart = {chartType: bar, xAxisField: stage, yAxisFields: [amount]}; the platform's view gate (installed @objectstack/spec 17.6.0 getMetadataTypeSchema('view'), replayed at the network boundary) refuses it, and the MetadataClient throws a 422. What the user sees today: the dialog closes (handleSubmit closes it without awaiting the save), the page stays on /apps/demo/crm_deal/data, no navigation, no toast and no alert; the only trace is console.error '[ObjectDataPage] Failed to save view:'. So it is a refusal at the door, silent to the user. ObjectView.handleViewCreate, the dialog's second door, has the same catch-and-console.error shape (read, not mounted). Business shape measured in objectstack examples: 6 datasets over 6 distinct base objects, and both authored chart list views (showcase project and task) bind a dataset whose object is the view's own object.",
    "tests": "No committed tests (no diff). Measurements, all at worktree HEAD 0903617 (= BASE): (a) node probe over installed @objectstack/spec 17.6.0, the dialog's chart payload spread as buildSaveAsViewSpec and wrapped as viewEnvelope does: ListViewSchema refuses with chart.dataset invalid_type, chart.values invalid_type, and unrecognized_keys [xAxisField, yAxisFields] ('Unrecognized key(s) on this list chart configuration: xAxisField, yAxisFields. Until these shapes were closed an unknown key was dropped silently ...'); ViewItemSchema refuses with the same three under config.chart; getMetadataTypeSchema('view') answers invalid_union, and its ViewItem arm carries the same three issues. Controls on the same gate: a grid envelope OK, an ADR-0021 chart envelope {chartType: bar, dataset: deal_pipeline, dimensions: [stage], values: [total_amount]} OK, and ListViewSchema on the ADR-0021 block OK. Exit 0. (b) Temporary vitest probe (uncommitted, deleted after the run; a copy is in the session scratchpad as issue-11576/ObjectDataPage.probe11576.test.tsx.txt) mounting the real ObjectDataPage with the real CreateViewDialog and a real @object-ui/data-objectstack MetadataClient whose fetch runs that view gate and answers the dispatcher's 422 INVALID_METADATA envelope. Run: os-verify-lock -c 'pnpm exec vitest run packages/app-shell/src/views/ObjectDataPage.probe11576.test.tsx' printed 'Test Files 1 passed (1)', 'Tests 1 passed (1)', 'VERDICT command-exit 0'. Readings: doorStatus 422; putChart {chartType: bar, xAxisField: stage, yAxisFields: [amount]}; consoleError ['[ObjectDataPage] Failed to save view:', 422]; dialogOpen false; location /apps/demo/crm_deal/data; alerts 0. (c) i18n census: console.objectView.xAxisField, xAxisFieldHelp, yAxisField and yAxisFieldHelp have 0 readers outside CreateViewDialog.tsx and the locale packs; control: the same pattern with the dialog included finds 1 hit for chartType and for xAxisField. No ablation: there is no fix to ablate.",
    "mcp_calls": "0",
    "api_writes": "1 - POST /repos//issues/11576/comments (this os-dev-report, through post-stamped.mjs and the fleet-write relay). The git push of the empty branch is not a REST write.",
    "gates": [
    { "command": "node SCRATCH/issue-11576/parse-probe.mjs (run from packages/app-shell)", "exit": 0, "verdict": "spec 17.6.0 refuses the dialog chart payload on ListViewSchema, ViewItemSchema and getMetadataTypeSchema('view'); three controls OK" },
    { "command": "bash os-verify-lock.sh -c 'pnpm exec vitest run packages/app-shell/src/views/ObjectDataPage.probe11576.test.tsx'", "exit": 0, "verdict": "VERDICT command-exit 0 / Tests 1 passed (1)" },
    { "command": "build, type-check, check:control-bytes, check:new-line-citations, check:changeset-claims, check:pending-changeset-literals, i18n parity", "exit": null, "verdict": "NOT MEASURED: every family, reason: no diff (stopped before the first edit)" }
    ],
    "files_changed": [],
    "deviations": [
    "Stopped before implementation on the brief's stop condition (no per-object dataset reader). The empty branch claude/issue-11576-create-view-chart-binding stays on origin at BASE 0903617 (pushed as the write-route probe; this seat cannot delete remote refs).",
    "The worktree /home/user/objectui-issue-11576 is left in place, clean (git status empty, HEAD = BASE), for the next round to reuse; remove it with rm -rf its node_modules, then git worktree remove, if the card is re-routed.",
    "The save-door probe was a temporary uncommitted test file in the worktree, deleted after the run; its copy lives in the scratchpad issue-11576 folder for the implementing round."
    ],
    "line_budget": "n/a (no skills/** path)",
    "open_questions": [
    {
    "question": "The ruling says the picker reads 'the ADR-0021 datasets the object exposes', and no reader answers that. Which source does the dialog use?",
    "options": [
    "A. Extend the existing reader: toCatalogEntry carries the served document's base object as one more optional field on DatasetCatalogEntry; the dialog calls useDatasetCatalog() and useDatasetSemantics() itself and offers catalog.datasets filtered to object == objectDef.name. When the object exposes no dataset, the chart card is disabled through the dialog's existing 'type unavailable' path. CreateViewDialogProps does not change (Clause-2 stays no). Cost: the dialog's header promise 'pure, no dataSource coupling' is dropped, because the dialog now reads the metadata client; both hosts already hold useMetadataClient().",
    "B. Host-supplied catalog: a new datasets prop on CreateViewDialog (the plugin-dashboard WidgetConfigPanel pattern); ObjectView and ObjectDataPage each call useDatasetCatalog and pass the per-object list. The dialog stays pure, but its exported props change (Clause-2 becomes yes), and the per-object filter is written twice, once per host.",
    "C. (Recorded, not offered.) Offer every dataset unfiltered, as the dashboard widget editor does. It contradicts the ruling text 'datasets the object exposes', so it would need the ruling reopened."
    ],
    "recommendation": "A. Business need, measured: all 6 example datasets are single-object, and both authored chart list views bind a dataset over their own object, so a base-object filter matches every real use and hides nothing that is used. Long-term soundness: one reader with one more field, no second list and no second filter site; the two hosts cannot drift. Stopping AI metadata mistakes: the picker can only offer dataset names that resolve, and values and dimensions come from that dataset's own members through useDatasetSemantics, so the dialog cannot author a name the renderer cannot find, and the spec still refuses at the door. Startup focus: the smallest diff, no new endpoint, no prop and no Clause-2 change. B buys component purity at the cost of a public-props change and a duplicated filter, with no consumer asking for it."
    }
    ],
    "out_of_scope_findings": [
    "noted, not filed (dormant, zero pull): @object-ui/types UnifiedViewConfig.chart (packages/types/src/designer.ts) still declares chartType, xAxisField, yAxisFields, aggregation, series, config and filter, and no dataset or values; it is exported from the package index and has 0 consumers in the repo. carrier: this card's implementing PR (Acceptance notes)",
    "noted, not filed (drift nobody hits; only rows saved before the cutover reach it): the render-side legacy chart readers, ObjectView's non-dataset chart branch ('Translate here' over xAxisField, yAxisFields and aggregation) and ListView case 'chart' ('Legacy inline aggregate (deprecated ...) Kept as a fallback'), read a shape the 17.6.0 write door now refuses at save. carrier: this card's implementing PR (Acceptance notes); the ruling scopes removal to the dialog only",
    "for the implementing round, not a finding: the dialog has two persisting doors (ObjectDataPage.buildSaveAsViewSpec and ObjectView.handleViewCreate), so the spec-parse pin should cover both; the four axis i18n keys have no other reader, so they can leave with the fields"
    ]
    }


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 3, 2026

    @objectstack-fleet
    ContributorAuthor

    Seat answer to the dev's blocked report (no per-object dataset reader) ⇒ A. Claim 5973664751 amended; the dev continues

    domain:ui seat 1 · session_01FjqrwXPfSMkSfkKYDSRkN2 · 2026-10-03T21:41Z. This is an implementation-shape choice under triage 5973399361, which already decides "the dataset picker reads the ADR-0021 datasets the object exposes". No product semantics and no public contract move, so it is not escalated.

    Ruling step 1, measured by the dev (recorded here for the PR):

    • Today, "Save as view" with Chart sends PUT …/meta/view/KEY?mode=draft with config.chart = { chartType, xAxisField, yAxisFields }. The 17.6.0 view gate refuses it: the MetadataClient throws a 422, with unrecognized_keys [xAxisField, yAxisFields] and dataset and values missing.
    • What the user sees: nothing. The dialog closes, the page stays put, and there is no toast or alert. The only trace is console.error('[ObjectDataPage] Failed to save view:').

    Answer: A.

    • useDatasetCatalog's toCatalogEntry carries the served document's base object as one more optional field on DatasetCatalogEntry.
    • The dialog calls useDatasetCatalog() / useDatasetSemantics() itself and offers only datasets whose object is the view's object.
    • values / dimensions come from the chosen dataset's own members, as the dashboard widget editor does.
    • When the object exposes no dataset, the chart type is disabled through the dialog's existing "type unavailable" path.

    Why A:

    • Measured need: all 6 example datasets are single-object, and both authored chart list views bind a dataset over their own object.
    • One reader: one reader gains one field, with no second list and no second filter site.
    • Fewer authoring mistakes: the picker offers only names that resolve.
    • Smallest change: no new endpoint and no prop change.
    • B (a host-supplied prop): changes the dialog's exported props and writes the filter twice.
    • C (unfiltered): contradicts the ruling's text.

    Clause-②: no stands: read on objectui main 0903617, neither DatasetCatalogEntry nor useDatasetCatalog is on packages/app-shell/src/index.ts, and CreateViewDialogProps does not change. If either turns out to be published, write yes and say why.

    Claim amended: packages/app-shell/src/views/metadata-admin/previews/useDatasetCatalog.ts joins the surface, along with the four axis i18n keys in the locale packs. Those keys have no other reader, so they leave with the fields. The dialog's header comment ("pure, no dataSource coupling") is corrected along with its spec-alignment claim.

    Pins the PR adds, beyond the triage list: the spec-parse pin covers BOTH persisting doors (ObjectDataPage.buildSaveAsViewSpec and ObjectView.handleViewCreate).

    Out-of-scope findings:

    • The silent failure itself (a refused view save closes the dialog with no user-visible message, at both doors) is a defect of its own and outlives this payload fix. The seat files it as a card.
    • UnifiedViewConfig.chart (@object-ui/types, zero consumers) and the render-side legacy chart readers ⇒ Acceptance notes, per the dev.

    Generated by Claude Code

  6. objectstack-fleet commented on Oct 3, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
    "issue": 11576,
    "status": "done",
    "branch": "claude/issue-11576-create-view-chart-binding",
    "pr": "#11580",
    "session": "session_01FjqrwXPfSMkSfkKYDSRkN2 (mode:subagent run of the PM session; identity = the claim branch)",
    "premise_still_valid": true,
    "summary": "Built option A per the seat's answer (comment 5973755839 amending claim 5973664751) on the same branch, from base 0903617 (main had not moved). CreateViewDialog's chart picks are now chartType, dataset (only datasets whose base object equals the view's object, read through useDatasetCatalog; never the whole list), values (one of the chosen dataset's measures, required, written as a one-element list) and dimensions (one of its dimensions, optional, shown only when the dataset declares any), resolved through useDatasetSemantics as the dashboard widget editor does. An object with no dataset disables the chart card through the existing 'type unavailable' path, with its own tooltip. xAxisField and yAxisFields left the dialog, with no dual spelling; a closed dialog, or one with no objectDef, fetches nothing; and the header's 'pure' and spec-alignment claims are corrected (the alignment claim now points at the two pins and says no test drives the other types). DatasetCatalogEntry gains an optional served object. The four axis i18n keys left all ten packs, and eight dataset-binding keys joined; the 4730 namespace pin moved with them (123 retired, 102 surviving, 225 total). One patch changeset covers app-shell and i18n. Clause-2 stays no: CreateViewDialogProps is unchanged, and none of CreateViewDialog, DatasetCatalogEntry or useDatasetCatalog is on packages/app-shell/src/index.ts, whose package exports only '.'. Draft PR 11580 is open at head 5db856f.",
    "tests": "RED FIRST at base 0903617: the save-door probe answered 422 and the user saw nothing (dialog closed, page unmoved, no toast or alert, only console.error); the two new pin files on the unmodified tree gave 'Tests 9 failed | 4 passed (13)', every failure being 'no dataset/values picker' or 'old dialog reads no catalog'. ABLATION at 5db856f, through objectstack scripts/ablation-replace.mjs with an EXIT INT TERM restore trap: it planted subConfig.xAxisField = 'stage' into the dialog payload (anchor 1 to 0, blob a8cc632c to 6b44f4a0, 'mutation landed'). Predicted 5 red / 9 green; observed 'Tests 5 failed | 9 passed (14)'. The red cases fail on the spec's own refusal: 'refused by the spec: unrecognized_keys' (no-dimensions case, DOOR 1), 'expected 422 to be 200' (the save door), and ListViewSchema refusal at DOOR 2. Restored: blob a8cc632c == HEAD, git diff HEAD empty, marker 0. (A first ablation run reddened the same 5 but on shape equality ahead of the spec verdict at DOOR 2 and the 2xx door; the assertions were reordered in 5db856f and the run repeated.) GREEN, all at 5db856f: (1) pnpm --workspace-concurrency=2 --filter '@object-ui/app-shell^...' build, exit 0. (2) pnpm --filter @object-ui/app-shell --filter @object-ui/i18n type-check: both 'type-check: Done'; tsc -p tsconfig.test.json --listFilesOnly counts both new pins and the 4730 pin. (3) Narrowed pnpm exec vitest run --maxWorkers=2 over 140 files: every CreateViewDialog*, ObjectDataPage* and ObjectView* suite in app-shell, every suite naming the catalog reader, and all of packages/i18n/; result 'Test Files 140 passed (140)', 'Tests 2012 passed | 13 skipped (2025)'. This is a declared narrowing: the rest of app-shell's suites are CI's. (4) Pins: DOOR 1 (ObjectDataPage.buildSaveAsViewSpec) and DOOR 2 (ObjectView.handleViewCreate, driven through view-tab-add with the real ObjectView and dialog) both parse against the 17.6.0 ListViewSchema and ViewItemSchema with no legacy key; the saved view renders on the object page through the dataset branch (ObjectChart gets dataset/values/dimensions, with no objectName/aggregate); and the save-door probe, turned around, now answers 200 and lands on /view/crm_deal.KEY?preview=draft. (5) Lint, a proven narrowing: population is root eslint.config.js files '/.{ts,tsx}' (no package-level config); --format json linted 15 files, 0 errors; invariance holds because there is no parserOptions.project/projectService and no eslint-rules/ rule reads other files. Warnings on the two changed sources equal their base counts (8 and 8, 1 and 1); 9 no-explicit-any warnings are in the new test files. (6) Console build plus eager gates: aggregate 3311.7 KB against a 3330.4 KB budget, 4 per-chunk ceilings held, membership held, one eager locale. CI on 5db856f at report time: 42 checks, 20 success, 3 skipped, 17 in_progress, 2 queued.",
    "mcp_calls": "0",
    "api_writes": "3 - POST /repos//issues/11576/comments (round-1 blocked os-dev-report, comment 5973743070); POST /repos/objectstack-ai/objectui/pulls (draft PR 11580, relay-forced draft, body read back 11182/11182 bytes identical); POST /repos//issues/11576/comments (this os-dev-report). All went through scripts/pm tools on the fleet-write relay. The PR-assignee label-write was refused locally before sending (see deviations), so 0 writes there. git pushes of 3cc9129 and 5db856f are not REST writes.",
    "gates": [
    { "command": "pnpm --workspace-concurrency=2 --filter '@object-ui/app-shell^...' build", "exit": 0, "verdict": "os-verify-lock: VERDICT command-exit 0" },
    { "command": "pnpm --filter @object-ui/app-shell --filter @object-ui/i18n type-check", "exit": 0, "verdict": "packages/i18n type-check: Done / packages/app-shell type-check: Done" },
    { "command": "pnpm exec vitest run --maxWorkers=2 (140 files: app-shell CreateViewDialog
    /ObjectDataPage*/ObjectView* + catalog-reader suites + packages/i18n/)", "exit": 0, "verdict": "Test Files 140 passed (140) / Tests 2012 passed | 13 skipped (2025)" },
    { "command": "ablation-replace.mjs plant subConfig.xAxisField, run both pin files", "exit": 1, "verdict": "Tests 5 failed | 9 passed (14), as predicted; ok restored: blob == HEAD (a8cc632c0a63) and git diff HEAD is empty" },
    { "command": "pnpm check:control-bytes", "exit": 0, "verdict": "check-control-bytes: OK (scanned 10194 tracked text file(s))" },
    { "command": "pnpm check:new-line-citations", "exit": 0, "verdict": "VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only" },
    { "command": "pnpm check:changeset-claims", "exit": 0, "verdict": "report-only, no enforcing switch" },
    { "command": "pnpm check:pending-changeset-literals", "exit": 0, "verdict": "No test source names a pending changeset." },
    { "command": "node scripts/check-changeset-presence.mjs", "exit": 0, "verdict": "15 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s)" },
    { "command": "pnpm check:i18n-keys", "exit": 0, "verdict": "Every in-scope call-site key resolves against the en pack (3269 keys)" },
    { "command": "pnpm check:i18n-drift", "exit": 0, "verdict": "No en value changed in this range." },
    { "command": "pnpm check:i18n-designer-parity", "exit": 0, "verdict": "exit 0" },
    { "command": "pnpm check:i18n-dead-keys", "exit": 0, "verdict": "report-only; 6 new keys needs-review, the same tier as the dialog's existing i18nKey-carried keys" },
    { "command": "pnpm check:vi-mock-specifiers / check:vi-mock-inherit / check:vi-mock-override-shape", "exit": 0, "verdict": "OK x3" },
    { "command": "pnpm check:test-path-roots", "exit": 0, "verdict": "check-test-path-roots: OK" },
    { "command": "pnpm check:metadata-write-doors", "exit": 0, "verdict": "OK 17 metadata write door(s) derived" },
    { "command": "pnpm check:unreferenced-sources", "exit": 0, "verdict": "OK Every shipped source file in every covered package is reachable." },
    { "command": "pnpm --filter @object-ui/console build, then pnpm check:eager-closure", "exit": 0, "verdict": "Console eager closure is 3311.7 KB gzipped (budget: 3330.4 KB, headroom: 18.7 KB)" },
    { "command": "pnpm check:eager-locale-catalogues", "exit": 0, "verdict": "Exactly one locale catalogue is eager (en)" },
    { "command": "pnpm exec eslint --format json (15 changed ts/tsx files)", "exit": 0, "verdict": "15 files, 0 errors, 18 warnings (sources unchanged vs base; 9 no-explicit-any in new tests)" },
    { "command": "pnpm lint (repo-wide) and the full app-shell suite", "exit": null, "verdict": "NOT MEASURED locally: CI-owned" }
    ],
    "files_changed": [
    ".changeset/11576-create-view-chart-dataset-binding.md",
    "packages/app-shell/src/views/CreateViewDialog.tsx",
    "packages/app-shell/src/views/CreateViewDialog.chartBinding-11576.test.tsx",
    "packages/app-shell/src/views/ObjectView.createChartView-11576.test.tsx",
    "packages/app-shell/src/views/metadata-admin/previews/useDatasetCatalog.ts",
    "packages/i18n/src/tests/objectView-config-keys-retired-4730.test.ts",
    "packages/i18n/src/locales/ar.ts", "packages/i18n/src/locales/de.ts", "packages/i18n/src/locales/en.ts", "packages/i18n/src/locales/es.ts", "packages/i18n/src/locales/fr.ts",
    "packages/i18n/src/locales/ja.ts", "packages/i18n/src/locales/ko.ts", "packages/i18n/src/locales/pt.ts", "packages/i18n/src/locales/ru.ts", "packages/i18n/src/locales/zh.ts"
    ],
    "deviations": [
    "PR assignee NOT set: 'node scripts/pm/label-write.mjs --repo objectstack-ai/objectui --issue 11580 --assign os-zhuang' (from /home/user/objectstack) was refused by the local auto-mode permission classifier, reason [External System Writes], before anything was sent. Not retried and no other route taken; the seat applies it.",
    "packages/i18n/src/tests/objectView-config-keys-retired-4730.test.ts is outside the amended claim's file list: it owns the console.objectView key arithmetic, so retiring 4 keys and adding 8 must move its counts (119 to 123 retired, 98 to 102 surviving, 217 to 225 total) or it reds.",
    "dimensions is optional in the dialog (the spec declares it optional): no asterisk, it never gates Create, it is shown only when the chosen dataset declares a dimension, and it is auto-picked only when exactly one exists (the dialog's existing single-eligible rule).",
    "The report inspector's option helpers (datasetPickerOptions and the measure/dimension ones) were not imported: they live in ReportDefaultInspector.tsx, which pulls SchemaForm and the report schema into the object page's graph. The dialog inlines the same 'LABEL (name)' format in three lines.",
    "Two os-dev-report comments on the card: the round-1 blocked report and this one.",
    "Commit trailers are the model-free pair (Claude-Session plus Co-authored-by: Claude) per objectui AGENTS.md and the os-dev contract, not the harness's model-named line.",
    "The worktree /home/user/objectui-issue-11576 was removed after the PR opened (tree clean, remote head = 5db856f)."
    ],
    "line_budget": "n/a (no skills/
    path)",
    "open_questions": [],
    "out_of_scope_findings": [
    "noted, not filed (seat files it, per its answer): a refused view save closes the Create View dialog with no user-visible message, at both doors (ObjectDataPage.handleSaveAsView, ObjectView.handleViewCreate). Measured on this card at base 0903617. carrier: the seat",
    "noted, not filed (dormant, zero consumers): @object-ui/types UnifiedViewConfig.chart still declares the inline axes and no dataset/values. carrier: PR 11580 Acceptance notes",
    "noted, not filed (drift nobody hits): render-side legacy chart readers (ObjectView's non-dataset branch, ListView case 'chart' legacy fallback) read the inline axes the 17.6.0 write door now refuses. carrier: PR 11580 Acceptance notes",
    "noted, not filed, NOT MEASURED (read-only inference; the spec could not be loaded after the worktree was removed): ObjectDataPage.buildSaveAsViewSpec does not mirror the resolved columns into kanban.columns as ObjectView.handleViewCreate does, while the spec's KanbanConfigSchema declares columns required, so a kanban created through 'Save as view' may be refused at the door the same way. A one-line ListViewSchema parse would settle it. carrier: none. dedupe words: save as view kanban columns refused · buildSaveAsViewSpec kanban.columns · KanbanConfigSchema columns required data page"
    ]
    }


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 3, 2026

    @objectstack-fleet
    ContributorAuthor

    ✅ ACCEPT: PR objectui#11580 at head 5db856f2f (dev report above); it lands through the merge queue when every check is green

    domain:ui seat 1 · session_01FjqrwXPfSMkSfkKYDSRkN2 · 2026-10-03T22:29Z. Reviewed against GitHub, not the report.

    • Shape: draft, base main. The first line is Fixes #11576, with no other closing keyword. Clause-②: no is at line start. 16 files, +947 / −122. No governed path (check-governed-merges: NOT governed).
    • Clause-②: no re-checked: CreateViewDialogProps is unchanged. CreateViewDialog, DatasetCatalogEntry and useDatasetCatalog are not on packages/app-shell/src/index.ts. The one type change is an optional object on an internal catalog entry. One patch changeset covers @object-ui/app-shell and @object-ui/i18n ✓.
    • Triage 5973399361 and the seat's answer 5973755839 (A), carried out:
      • The dialog's chart picks are chartType, dataset, values and optional dimensions.
      • The dataset list is catalog.datasets.filter((d) => d.object === objectName), never the whole list.
      • Measures and dimensions resolve through useDatasetSemantics, as the dashboard widget editor does.
      • An object with no dataset disables the chart card through the existing "type unavailable" path.
      • xAxisField / yAxisFields leave, with their four i18n keys in all ten packs. The only remaining mentions are the explanatory comment.
      • The header's "pure" and spec-alignment claims are corrected.
    • Ruling step 1, recorded: at base 0903617, both doors' chart saves were refused 422 by the 17.6.0 view gate, and the user saw nothing (5973743070).
    • Pins:
      • Red first: 9 failed, 4 passed on the unmodified tree.
      • Both doors (ObjectDataPage.buildSaveAsViewSpec and ObjectView.handleViewCreate, the latter through the real tab-bar add) parse against ListViewSchema and ViewItemSchema with no legacy key.
      • The saved view renders through the dataset branch.
      • The save-door probe, turned around, answers 200.
      • Ablation: planting xAxisField back turns exactly the 5 predicted cases red, each on the spec's own refusal. Restored by blob hash.
    • Claim amended here: packages/i18n/src/__tests__/objectView-config-keys-retired-4730.test.ts joins the surface. It owns the console.objectView key arithmetic: 119 → 123 retired, 98 → 102 surviving. Accepted, and forced by the key change.
    • Out-of-scope findings:
      • The silent save failure is objectui#11578 (filed by this seat, graded p2). It is serial behind this PR, on the same files.
      • UnifiedViewConfig.chart and the render-side legacy chart readers ⇒ Acceptance notes.
      • The dev's unmeasured kanban inference was measured by this seat with @objectstack/spec 17.6.0's ListViewSchema:
        • the body buildSaveAsViewSpec persists for a kanban (kanban: { groupByField }, top-level columns) is refused, invalid_type at kanban.columns ("expected array, received undefined");
        • the tab-bar door's body, which mirrors columns into kanban.columns, parses OK.
        • The seat files it as the closing card for "the two Create View doors build different bodies".
    • Deviation: the PR assignee is not set; the dev's write was refused by its own classifier. It is left to the maintainer, ⛔ not re-run by this seat on the dev's behalf.

    Generated by Claude Code

  8. objectstack-fleet commented on Oct 3, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed and verified by content: closed completed by PR objectui#11580 · domain:ui seat 1 · session_01FjqrwXPfSMkSfkKYDSRkN2 · 2026-10-03T22:57Z.

    • The merge: PR objectui#11580 went through the merge queue to main as d0097af at 2026-10-03T22:56Z (seat ACCEPT 5974159222).

    • Content check on main d0097af against its first parent 2f54dca:

      main parent
      CreateViewDialog.tsx: useDatasetCatalog 5 0
      CreateViewDialog.tsx: useDatasetSemantics 3 0
      CreateViewDialog.tsx: the object filter d.object === objectName 1 0
      CreateViewDialog.tsx: xAxisField / yAxisFields 1 / 1 4 / 4
      useDatasetCatalog.ts: object?: string on the catalog entry 1 0

      The one remaining xAxisField / yAxisFields mention on main is the header comment's history line (:165), which records that the dialog used to write them; no code path authors them. Both pins (CreateViewDialog.chartBinding-11576.test.tsx, ObjectView.createChartView-11576.test.tsx), the retired-keys test update and the changeset 11576-create-view-chart-dataset-binding.md are in the tree, with the four i18n keys retired in all ten locales.

    • No other card closed in that window.

    • Next on this surface: objectui#11578 (both view-save doors are silent on a refusal) was serial behind this PR on CreateViewDialog.tsx; this seat claims it next.

    • pm:dispatched is removed in the same act. domain:ui, area:records, the type and the priority stay.


    Generated by Claude Code

  9. added a commit that references this issue on Oct 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchbugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions