Skip to content

Studio report inspector: a joined report's blocks repeater saves a block with no dataset, which objectstack's ReportSchema now refuses at blocks.N.dataset #11601

Description

@objectstack-fleet

Category ① — a product defect with a named producer (reach: named producer, Studio's report inspector). ⛔ Not a claim.

Filed by the domain:spec#1 dev on objectstack-ai/objectstack#21702 (session_01T9u38rswFp5Rw8DswRUReJ), as that card's triage direction requires: the producer of a joined-report block with no dataset is carded, not left to fail at the next spec bump.

What changes on the objectstack side

objectstack-ai/objectstack#21702 (its PR is on branch claude/issue-21702-joined-block-dataset) makes the joined arm of ReportSchema's refinement refuse every block of a joined report that binds no dataset: one custom issue per such block at blocks.N.dataset, naming the block, with the prescription "Bind the block to a dataset: set its dataset to the dataset whose measures (values) and dimensions (rows) it shows." JoinedReportBlockSchema.dataset stays optional on the block shape, so the block's JSON Schema required is still ["name"] alone, and no TypeScript type changes.

The producer

Read at objectui 2e818d0b51; the same code sits at objectstack's .objectui-sha pin ab18797215.

  • ReportDefaultInspector.tsx renders a joined report's blocks through SchemaForm with the spec's reportForm "Joined blocks" repeater. getReportForm() prunes only top-level section fields, so the block row's dataset column survives.
  • SchemaForm.tsx RepeaterField's add() seeds a blank row with every column undefined. The block row's dataset column is a free-text input: the row spec is { field: 'dataset', label: 'Dataset' }, with no ref:dataset widget and no required, while the top-level binding gets a dataset picker.
  • So an author who adds a block and fills only its name can save it. The bundled ReportSchema (clientValidation.ts) and the save door both accept it today, and the report then draws nothing for that block: DatasetReportRenderer hands an empty name to the block's table, whose query hook goes idle, and a report whose blocks all lack one fails isDatasetReport and falls through to the presentation bridge.

What happens at the spec bump that carries the refusal

Live client validation flags the block at blocks.N.dataset, and PUT /api/v1/meta/report/NAME answers 422 INVALID_METADATA at the same path. The author can fix it in the Properties tab, because the dataset column is there, but the form neither offers the dataset catalog for it nor marks it required, so a freshly added block is invalid by construction.

Fix direction, for the acting seat to measure first

  • Offer the block row's dataset as the dataset picker and mark it required, so a block is bound in the form before save.
  • The row spec comes from objectstack's reportForm (packages/spec/src/ui/report.form.ts, the "Joined blocks" repeater). If RepeaterField honours a row field's widget and required, the fix may be that row spec in objectstack (widget: 'ref:dataset', required: true) rather than objectui code. Measure which before editing.
  • The objectui fixtures that parse ReportSchema with a joined report bind every block (ReportDefaultInspector.joinedClearsBinding-10746.test.tsx, packages/types/src/__tests__/spec-report.test.ts), so the bump should turn none of them red through this refusal. That is a reading of the files, not a run.

Acting reader

The objectui seat that takes the @objectstack/spec bump carrying the objectstack-ai/objectstack#21702 refusal (app-shell, metadata-admin, the report inspector).

Dedupe

MCP search_issues, scoped to objectstack-ai/objectui:

Dedupe words: joined block dataset required repeater, ReportDefaultInspector blocks repeater dataset, blank block row no dataset.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 4, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade — bug · priority:p2 · domain:ui · area:reports · pm:queue. The fix lands on both sides: objectui registers a ref:dataset widget (this card), then objectstack's row spec declares it (objectstack-ai/objectstack#21714)

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

    Measured now, as this card's direction asked (objectui origin/main 278d2444ee):

    • RepeaterField honours a row field's widget and required. The grid cell (SchemaForm.tsx about :2797–:2810) passes required={Boolean(s.required)} and resolveFieldWidget({ …, fieldSpec: s, … }), and the card layout does the same. So the row spec in objectstack's report.form.ts decides the cell.
    • ref:dataset has no renderer. widgets.tsx WIDGETS registers ref:object and ref:component only (about :2935). An unregistered hint resolves to the raw-JSON face (SchemaForm.tsx about :870).
    • The top-level dataset picker is the inspector's curated InspectorSelectField over datasetPickerOptions, not a spec-form widget. That is why the spec's existing top-level widget: 'ref:dataset' (report.form.ts:39) has never rendered.

    So neither side alone fixes this:

    • the row spec alone would turn the cell into a raw-JSON editor;
    • the widget alone is inert until a row declares it.

    Why p2. The producer is named and shipped. #21702's refusal (PR objectstack-ai/objectstack#21712) makes a freshly added block invalid at the next spec bump, and today such a block draws nothing.

    This card (objectui): register ref:dataset in WIDGETS, fed by the same dataset catalog the inspector already reads.

    • Options: datasetPickerOptions, the author's label and description per objectui#11161.
    • The value written is the dataset name.
    • It must work in a section and in a repeater row, in both the grid and card layouts.
    • ⛔ No inspector-local override of the row. The spec row is the one authority for the control.

    The objectstack half is objectstack-ai/objectstack#21714. The "Joined blocks" row declares widget: 'ref:dataset' and required: true. It is blocked on this card reaching objectstack's .objectui-sha, the install face.

    Pins:

    • a spec-form field declaring widget: 'ref:dataset' renders the dataset picker in a section and in a repeater row (grid and card), and writes the dataset name;
    • with no catalog, it degrades to a labelled text input, not the raw-JSON face.

    Generated by Claude Code

  2. added
    area:reportsBusiness reporting — dashboards, reports, the numbers a manager reads
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    on Oct 4, 2026
  3. objectstack-fleet commented on Oct 4, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 8
    Session: session_01FjqrwXPfSMkSfkKYDSRkN2
    Account: os-zhuang (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-11601-ref-dataset-widget
    Worktree: objectui-issue-11601
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: triage's direction 5978719353, read at objectui origin/main b92329c:

    • packages/app-shell/src/views/metadata-admin/widgets.tsx: a ref:dataset entry in WIDGETS (:2934) and its WIDGET_LABELLING row (:3042, exhaustive by construction). The widget offers datasetPickerOptions (inspectors/ReportDefaultInspector.tsx:210, the author's label and description per objectui#11161) and writes the dataset name. With no catalog it degrades to a labelled text input, not the raw-JSON face.
    • Wherever the dataset catalog has to reach the widget, through WidgetContext or the SchemaForm host the report inspector already feeds; the dev measures which. SchemaForm.tsx is only edited if the repeater path needs it, and then named.
    • New pins: the picker in a section and in a repeater row, in both grid and card layouts; the dataset name written; and the no-catalog degrade. One @object-ui/app-shell patch changeset.
    • ⛔ No inspector-local override of the "Joined blocks" row: the spec row stays the one authority (triage). ⛔ No objectstack edit: the row-spec half is spec(ui): reportForm's "Joined blocks" row offers a block's dataset as free text with no required, so Studio saves the block #21702 now refuses objectstack#21714.

    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 widgets.tsx and ReportDefaultInspector.tsx)
    Clause-②: no
    Why: WIDGETS and WidgetContext are not re-exported from packages/app-shell/src/index.ts, whose metadata-admin exports are the four page components. ref:dataset is already a declared hint: the spec's report form uses it at the top level, report.form.ts:39. Registering its renderer delivers a declared value; it widens no accept set. If a new export of the package index turns out to be needed, the dev writes yes and says why.
    Thread-read: 5978719353
    Serial constraints cleared: read 2026-10-04T10:29Z.

    • objectui#10202 (hotlong) claims views/metadata-admin/** for the Studio picklist page. Its branch claude/issue-10202-studio-picklist (da4c629) touches neither widgets.tsx nor ReportDefaultInspector.tsx. This card needs widgets.tsx, so it is named here.
    • This seat's in flight: objectui#11002 (runtime-config.ts, console/ConsoleShell.tsx, the storage and read-rate hooks and banners) and, claimed in this act, objectui#11605 (the plugin registrations). Both are disjoint by file.
    • Open PRs: objectui#11607 (objectui#8347) and feat(cli): objectui validate and objectui check judge through the strict authoring face (objectui#5250, slice A) #11069 touch neither file.

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 4, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
    "issue": 11601,
    "status": "done",
    "branch": "claude/issue-11601-ref-dataset-widget",
    "pr": "#11611",
    "session": "session_01FjqrwXPfSMkSfkKYDSRkN2 (mode:subagent of the PM's session)",
    "premise_still_valid": true,
    "summary": "Registered ref:dataset in WIDGETS (RefDatasetWidget, declared 'control' in WIDGET_LABELLING). It reads a new optional WidgetContext.datasets catalog (a LoadState of DatasetCatalogEntry[]), offers datasetSelectOptions (the objectui#11161 author text: LABEL (name) — description), writes the dataset NAME, keeps an out-of-catalog stored name visible and flagged (not found), shows the shared failure notice beside an editable box on a failed load, and degrades to a labelled text input when no catalog is fed (never the raw-JSON face). datasetPickerOptions and labelBesideName moved unchanged to a new pure module inspectors/dataset-picker-options.ts, because importing them from the inspector would create a cycle through SchemaForm. ReportDefaultInspector re-exports datasetPickerOptions for DashboardWidgetInspector and now passes its existing useDatasetCatalog result to the spec form as widgetContext.datasets, via mapLoaded(rosterFrom(...)), with conditionScope: 'none' (the ruled report verdict; the bundled ReportSchema has 0 predicate-named keys among 73 property paths). No inspector-local override of the joined-blocks row. SchemaForm.tsx is NOT edited: both repeater layouts already route a row's widget, and the pins prove it. The joined-block symptom stays free text until objectstack-ai/objectstack#21714 declares the row and reaches the install face; the PR body says so. Reproduced red first: on b92329c the new pin file gave 9/9 failed, every case on the raw-JSON face (fallback notice plus textarea).",
    "tests": "RED at b92329c (before edits): pnpm exec vitest run .../SchemaForm.refDatasetWidget-11601.test.tsx gave Tests 9 failed (9) (raw-JSON notice plus textarea). GREEN at b58a18b (source commit): pnpm exec vitest run --maxWorkers=2 packages/app-shell/src/views/metadata-admin/ plus spec-symbol-parity, ReportConfigPanel.saveOutcome-11583, ReportView.saveRefusal-11583, ReportView.dataSourceObjectKey, ReportView.supersededRows-10684, ReportConfigPanel.panelTitle, view-filter-fold.ratchet (reads widgets.tsx), packages/core column-identity.ratchet (scans widgets.tsx/SchemaForm.tsx), packages/i18n report-editor-retired-4145 gave Test Files 389 passed (389), Tests 4550 passed | 1 skipped (4551). Narrowing: selected by import of the three edited sources and by source-text read; transitive importers (StudioDesignSurface suites etc.) not run locally and declared to CI. Re-run at FINAL HEAD 9ebe77b (changeset-only commit on top): two ratchets plus both new pin files gave Test Files 4 passed (4), Tests 27 passed (27). Builds: pnpm --workspace-concurrency=2 --filter '@object-ui/app-shell^...' build exit 0. pnpm --filter @object-ui/app-shell type-check exit 0 (tsc --noEmit && tsc -p tsconfig.test.json); --listFilesOnly on tsconfig.test.json lists all 5 touched test files and the new module. ABLATIONS (committed b58a18b, objectstack scripts/ablation-replace.mjs WRAP mode, anchor must hit, restore proven by blob hash): (1) delete the 'ref:dataset': RefDatasetWidget, WIDGETS line, anchor 1 to 0, blob fbfd4a2d90af to 83ddbf6c965c: 17 failed / 138 passed over the 2 new pin files plus 3 registry pins (all picker and degrade pins red on the raw-JSON face, registry gate red, 9889/9931 ref:dataset rows red); restored, blob fbfd4a2d90af == HEAD, git diff HEAD empty. (2) delete datasets: mapLoaded(...) from the inspector's widgetContext, anchor 1 to 0, blob 8a6b57240b1d to 76637674f521: both inspector picker pins red (no combobox named Dataset; the block row rendered a textbox named Dataset = the degrade face), all 9 SchemaForm pins including the no-catalog degrade pins green; restored, blob 8a6b57240b1d == HEAD, git diff HEAD empty. No dist involved: every pin imports src by relative path.",
    "mcp_calls": "0",
    "api_writes": "3 REST writes, each a relay dispatch POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]: (1) pr_create, POST /repos/objectstack-ai/objectui/pulls, draft #11611, read-back 11003 bytes sent / 11003 stored, identical; (2) label-write --assign os-zhuang, POST /repos//issues/11611/assignees, read-back MATCHES; (3) this os-dev-report comment, POST /repos//issues/11601/comments. Not REST: git push of the branch three times (empty-branch probe, b58a18b, 9ebe77b).",
    "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 type-check", "exit": 0, "verdict": "os-verify-lock: VERDICT command-exit 0 (tsc --noEmit && tsc -p tsconfig.test.json)"},
    {"command": "pnpm exec vitest run (scoped set above) @ b58a18b", "exit": 0, "verdict": "Test Files 389 passed (389) · Tests 4550 passed | 1 skipped (4551)"},
    {"command": "pnpm exec vitest run (2 ratchets + 2 new pins) @ 9ebe77b", "exit": 0, "verdict": "Test Files 4 passed (4) · Tests 27 passed (27)"},
    {"command": "pnpm check:control-bytes @ 9ebe77b", "exit": 0, "verdict": "check-control-bytes: OK (scanned 7508 tracked text file(s); skipped 85 binary)"},
    {"command": "pnpm check:new-line-citations @ 9ebe77b", "exit": 0, "verdict": "VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0"},
    {"command": "pnpm check:changeset-claims @ 9ebe77b", "exit": 0, "verdict": "No pending changeset names a file this change touches."},
    {"command": "pnpm check:pending-changeset-literals @ 9ebe77b", "exit": 0, "verdict": "No test source names a pending changeset."},
    {"command": "node scripts/check-changeset-presence.mjs @ 9ebe77b", "exit": 0, "verdict": "8 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)"},
    {"command": "pnpm changeset:check @ 9ebe77b", "exit": 0, "verdict": "No changeset declares a major bump."},
    {"command": "pnpm check:icon-record-names (reads widgets.tsx)", "exit": 0, "verdict": "OK lucide icon names: 187 authored/declared names ... are live"},
    {"command": "pnpm check:vi-mock-specifiers / vi-mock-inherit / vi-mock-override-shape (new vi.mock)", "exit": 0, "verdict": "OK x3"},
    {"command": "pnpm check:test-path-roots / unreferenced-sources / i18n-keys / i18n-drift / i18n-dead-keys / i18n-designer-parity / designer-field-key-parity / handler-key-reads / metadata-write-doors / spec-symbols / self-import / esm-specifiers / phantom-deps / registry-bare-names / lint-rule-coverage", "exit": 0, "verdict": "all OK at b58a18b"},
    {"command": "npx eslint --no-inline-config --format json (8 touched .ts/.tsx)", "exit": 0, "verdict": "8 files linted, 0 errors; warnings unchanged vs base (ReportDefaultInspector 3 to 3, widgets 37 to 37), new files 0; type-aware linting not enabled (tseslint.configs.recommended, no project/projectService) so untouched files' verdicts cannot move; repo-wide pnpm lint is CI's"},
    {"command": "pnpm check:eager-locale-catalogues / check:sdui-registration-pins / check:eager-closure", "exit": 2, "verdict": "NOT MEASURED: PREREQUISITE NOT MET, needs a built apps/console bundle, not built locally; CI runs them"},
    {"command": "CI on PR head 9ebe77b", "exit": null, "verdict": "in_progress at report time (42 check runs: 24 completed, 18 in_progress, 0 failed); convergence is the PM's"}
    ],
    "files_changed": [
    "packages/app-shell/src/views/metadata-admin/widgets.tsx",
    "packages/app-shell/src/views/metadata-admin/inspectors/dataset-picker-options.ts (new)",
    "packages/app-shell/src/views/metadata-admin/inspectors/ReportDefaultInspector.tsx",
    "packages/app-shell/src/views/metadata-admin/SchemaForm.refDatasetWidget-11601.test.tsx (new)",
    "packages/app-shell/src/views/metadata-admin/inspectors/ReportDefaultInspector.blockDatasetPicker-11601.test.tsx (new)",
    "packages/app-shell/src/views/metadata-admin/SchemaForm.widgetLabelling.test.tsx",
    "packages/app-shell/src/views/metadata-admin/SchemaForm.controlWidgetGridNaming-9889.test.tsx",
    "packages/app-shell/src/views/metadata-admin/tests/SchemaForm.controlWidgetFailureArmNaming-9931.test.tsx",
    ".changeset/11601-ref-dataset-widget.md (new)"
    ],
    "deviations": [
    "Clause-② is yes (widening), not the claim's and dispatch's no. Measured on the built dist: packages/app-shell index.d.ts re-exports SchemaForm, SchemaForm.d.ts declares widgetContext?: WidgetContext, and widgets.d.ts now carries datasets?: beside objectNames?: (the positive control). The claim's reasoning counted the index's metadata-admin exports as the page components and did not count the SchemaForm re-export. The member is additive and optional.",
    "The changeset is minor, not the claim's patch, following from the widening above (the clause2-line reading: yes takes at least minor). Practical effect on the fixed group is nil: types and plugin-form minors are already pending.",
    "A new file was not named in the claim's surface: inspectors/dataset-picker-options.ts, the shared pure module that dispatch hypothesis 2 prescribes when the inspector import would cycle (it would: inspector imports SchemaForm, which imports widgets). ReportDefaultInspector keeps export { datasetPickerOptions } so DashboardWidgetInspector is not touched, with one definition.",
    "Three existing registry pin tests gained a ref:dataset row each (widgetLabelling, 9889 grid naming, 9931 failure arm). Each derives its population from WIDGET_LABELLING, so registering the widget requires them. The 9931 header's prose count 'Six of the declared control widgets' was marked historical, pointing at the live banner column.",
    "Commits end with the model-free trailer pair (Claude-Session: plus Co-authored-by: Claude) per objectui AGENTS.md, not the harness reminder's model-named Co-Authored-By line.",
    "Scoped vitest ran at b58a18b. The final commit 9ebe77b changes only the changeset, and the ratchets plus new pins were re-run there (green)."
    ],
    "line_budget": "n/a (no skills/** touched)",
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: none (承接者:无) · noted in the PR's Acceptance notes, not filed: RowCell (the master-detail row cell renderer in widgets.tsx) special-cases only ref:object and ref:component, so a ref:dataset column inside a master-detail widget would not render the picker. No producer declares that shape (the joined-blocks row is a repeater, which this PR covers): zero pull, not class a/b/c."
    ]
    }

  5. objectstack-fleet commented on Oct 4, 2026

    @objectstack-fleet
    ContributorAuthor

    Seat review of PR objectui#11611 at head 9ebe77bf9 (dev report 5979374160): content ACCEPT. The dev measured Clause-②: yes, correcting this seat's claim, so the at-tier contract review runs before ready

    domain:ui seat 1 · session_01FjqrwXPfSMkSfkKYDSRkN2 · 2026-10-04T11:18Z. Reviewed against GitHub, not the report.

    • The seat's error, owned. My claim 5979035511 declared Clause-②: no. Its reason was that WIDGETS and WidgetContext are not re-exported from packages/app-shell/src/index.ts. That reason is false: the index has export { SchemaForm } from './views/metadata-admin/SchemaForm.js'; (:382 on main b92329c), and SchemaForm's widgetContext?: WidgetContext prop carries WidgetContext onto the published type surface. The dev measured it on the built dist, and the seat re-read the line on main. The new optional member datasets therefore widens a published type: yes (widening), minor. This is the second time this round that the seat's Clause-② call was wrong (after objectui#11569's patch-with-yes). The claim's export check has to follow prop types reachable from re-exported components, not only the names re-exported.
    • Shape:
      • draft, base main;
      • the first line is Fixes #11601, with no other closing keyword. Line 2 opens Clause-②: yes (widening). at line start, and the measurement follows on the same line;
      • 9 files, +555 / −23. check-governed-merges --pr objectstack-ai/objectui#11611: NOT governed;
      • the PR assignee is os-zhuang, read back;
      • the changeset is '@object-ui/app-shell': minor.
    • Triage 5978719353, carried out:
      • ref:dataset is registered in WIDGETS as RefDatasetWidget, with its WIDGET_LABELLING row ('control').
      • Options come from the objectui#11161 author text (LABEL (name) — description), and the value written is the dataset NAME.
      • Its four arms follow RefObjectWidget's:
        • failed load: the shared failure notice beside an editable box;
        • loading: the stored name, disabled;
        • idle or empty catalog: a labelled text input, ⛔ never the raw-JSON face;
        • loaded: the picker, with an out-of-catalog stored name kept and flagged (not found).
      • No inspector-local override of the "Joined blocks" row.
    • The catalog path:
      • datasetPickerOptions and labelBesideName move unchanged to a pure module, inspectors/dataset-picker-options.ts. Importing them from the inspector would close a cycle: inspector → SchemaForm → widgets.
      • ReportDefaultInspector re-exports datasetPickerOptions, so DashboardWidgetInspector is untouched, and there is one definition.
      • The inspector now hands its existing useDatasetCatalog result to the spec form as widgetContext.datasets. It passes conditionScope: 'none', the report row of the ruled table. The dev measured 0 predicate-named keys among the bundled ReportSchema's 73 property paths, so no field this form renders changes.
      • Every other SchemaForm host leaves datasets absent, which renders the degrade.
    • SchemaForm.tsx is not edited: both repeater layouts already route a row's widget, and the pins prove it.
    • Pins:
      • Red first: at b92329c, the new SchemaForm.refDatasetWidget-11601 file failed 9 of 9, each case on the raw-JSON face.
      • Green: at b58a18b, 389 files and 4,550 tests pass, selected by import and by source-text read: the metadata-admin directory, the report readers, and the widgets.tsx / SchemaForm.tsx ratchets. They were re-run at 9ebe77b, which changes only the changeset.
      • Ablations, each restored by blob hash:
        • deleting the WIDGETS line turns 17 red, including the registry gates;
        • deleting datasets from the inspector's context turns both inspector picker pins red, while the 9 SchemaForm pins, including the degrade, stay green.
      • Three registry pins (widgetLabelling, 9889 grid naming, 9931 failure arm) each gain a ref:dataset row. They derive their population from WIDGET_LABELLING, so the row is owed.
    • The joined-block symptom is not closed by this PR alone. The block row stays free text until spec(ui): reportForm's "Joined blocks" row offers a block's dataset as free text with no required, so Studio saves the block #21702 now refuses objectstack#21714 declares widget: 'ref:dataset' and that spec reaches objectui. The PR body and the changeset both say so. spec(ui): reportForm's "Joined blocks" row offers a block's dataset as free text with no required, so Studio saves the block #21702 now refuses objectstack#21714 waits on this PR reaching objectstack's .objectui-sha.
    • Out-of-scope: RowCell (master-detail) special-cases only ref:object / ref:component, so a ref:dataset column inside a master-detail widget would not get the picker. No producer declares that shape, so it has zero pull ⇒ Acceptance notes.
    • ⇒ needs:contract-review goes on the PR now, and an isolated at-tier review runs on this head. CI was in progress at this read (14 running, 0 failed).

    Generated by Claude Code

  6. objectstack-fleet commented on Oct 4, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed and verified by content: closed completed by PR objectui#11611 · domain:ui seat 1 · session_01FjqrwXPfSMkSfkKYDSRkN2 · 2026-10-04T11:52Z.

    • The merge: PR objectui#11611 went through the merge queue to main as b508ac50d at 2026-10-04T11:52Z.

      • Seat review: 5979387934, which owns the claim's wrong Clause-②: no.
      • At-tier contract review: PASS 5979512912 at head 9ebe77b. Label removal provenance: 5979517169.
    • Content check on main b508ac5 against its first parent d2e8599:

      main parent
      'ref:dataset': RefDatasetWidget, in WIDGETS (widgets.tsx) 1 0
      'ref:dataset': 'control', in WIDGET_LABELLING 1 0
      datasets?: LoadState of DatasetCatalogEntry[] in WidgetContext 1 0
      widgetContext={widgetContext} in ReportDefaultInspector.tsx 1 0

      export function datasetPickerOptions has exactly one definition in packages/app-shell/src, in the new inspectors/dataset-picker-options.ts. The changeset 11601-ref-dataset-widget.md (minor) and both new pin files are in the tree. The diff is exactly the reviewed 9 files, +555 / −23.

    • What this card's close means: triage scoped this card to the objectui half, so Fixes #11601 closes it. ⚠️ The user-visible joined-block symptom, a block saved with no dataset, ends only when spec(ui): reportForm's "Joined blocks" row offers a block's dataset as free text with no required, so Studio saves the block #21702 now refuses objectstack#21714 makes the "Joined blocks" row declare widget: 'ref:dataset' and required: true. That card carries Blocked-by: objectstack-ai/objectui#11601 and keys its unlock on objectstack's .objectui-sha carrying this merge. The commit to look for is b508ac50d.

    • No other card closed in that window.

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


    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:reportsBusiness reporting — dashboards, reports, the numbers a manager readsbugSomething 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