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
Category ① — a product defect with a named producer (
reach:named producer, Studio's report inspector). ⛔ Not a claim.Filed by the
domain:spec#1dev on objectstack-ai/objectstack#21702 (session_01T9u38rswFp5Rw8DswRUReJ), as that card's triage direction requires: the producer of a joined-report block with nodatasetis 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 ofReportSchema's refinement refuse every block of ajoinedreport that binds nodataset: onecustomissue per such block atblocks.N.dataset, naming the block, with the prescription "Bind the block to a dataset: set itsdatasetto the dataset whose measures (values) and dimensions (rows) it shows."JoinedReportBlockSchema.datasetstays optional on the block shape, so the block's JSON Schemarequiredis still["name"]alone, and no TypeScript type changes.The producer
Read at objectui
2e818d0b51; the same code sits at objectstack's.objectui-shapinab18797215.ReportDefaultInspector.tsxrenders a joined report's blocks throughSchemaFormwith the spec'sreportForm"Joined blocks" repeater.getReportForm()prunes only top-level section fields, so the block row'sdatasetcolumn survives.SchemaForm.tsxRepeaterField'sadd()seeds a blank row with every columnundefined. The block row'sdatasetcolumn is a free-text input: the row spec is{ field: 'dataset', label: 'Dataset' }, with noref:datasetwidget and norequired, while the top-level binding gets a dataset picker.ReportSchema(clientValidation.ts) and the save door both accept it today, and the report then draws nothing for that block:DatasetReportRendererhands an empty name to the block's table, whose query hook goes idle, and a report whose blocks all lack one failsisDatasetReportand 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, andPUT /api/v1/meta/report/NAMEanswers422 INVALID_METADATAat the same path. The author can fix it in the Properties tab, because thedatasetcolumn 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
datasetas the dataset picker and mark it required, so a block is bound in the form before save.reportForm(packages/spec/src/ui/report.form.ts, the "Joined blocks" repeater). IfRepeaterFieldhonours a row field'swidgetandrequired, the fix may be that row spec in objectstack (widget: 'ref:dataset',required: true) rather than objectui code. Measure which before editing.ReportSchemawith 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/specbump carrying the objectstack-ai/objectstack#21702 refusal (app-shell, metadata-admin, the report inspector).Dedupe
MCP
search_issues, scoped to objectstack-ai/objectui:joinedkeeps its now-hiddendataset/values/rows/columns, which the spec refuses on a joined report once objectstack PR #20160 lands #10746, Derive the published JoinedReportBlock from the spec at the first @objectstack/spec bump past 17.4.0: the local interface types the legacy inline-query block the spec's closed schema now refuses #10940, finding(plugin-report,plugin-form): report/spec-report over a dataset and an authored-parent record:line_items read once on mount with no bus reader — blocks objectui#10519 under decision B #10814, [low-pri] Studio: curated inspector for joined-report blocks (generic SchemaForm today) #1966). None names a block saved with nodataset. Studio report inspector: switching a report's type tojoinedkeeps its now-hiddendataset/values/rows/columns, which the spec refuses on a joined report once objectstack PR #20160 lands #10746 (the type-switch clear) is the known-hit control; [low-pri] Studio: curated inspector for joined-report blocks (generic SchemaForm today) #1966 asked for a curated joined-block inspector and is closed.Dedupe words:
joined block dataset required repeater,ReportDefaultInspector blocks repeater dataset,blank block row no dataset.Generated by Claude Code