Blocked-by: #6614
Moved from objectstack-ai/objectstack#12649 by central triage (file-at-destination: the fix lands in objectui). Original filed by yinlianghui from promo-video production recon (internal ref: steedos-labs/video-studio#61).
⛔ THE TITLE AND THE "Triage anchoring evidence" SECTION BELOW ARE DISPROVEN — do not implement from them
Measured on origin/main and carried by merged PR #6613:
- The block is
list-view, not object-table. objectstack#12649 names it literally; object-table has no live registration anywhere in this repo — fixtures only. The object-table spelling entered at triage. - The live
list-view registration DOES declare columns (packages/plugin-list/src/index.tsx), and declared it at the reporter's 17.1.0 too. No registration is short — the maintainer's aggregate follow-up was measured the same way and also comes back negative (it already draws unknown-prop, and no renderer reads it; the grid vocabulary is aggregations). - The declared-inputs hypothesis could never have produced this symptom.
parse.ts keeps every attribute and validateTree only warns on undeclared ones — compile never strips a prop.
The real mechanism:interpretBrace materialises strict-JSON braced values only. Every other spelling — including the single-quoted array every JSX author writes — compiles to a { $expr } marker that nothing downstream evaluates (this tier parses, never executes, per ADR-0080). It reaches the renderer opaque, ListView's defensive non-array read degrades it to no-columns, rows still fetch → row count + toolbar + index column, zero diagnostics. The react tier works because its scope wrappers fold real evaluated JS props into the node, so the braced value never has to survive materialisation.
Status: PR #6613 (merged, Part of) landed the loud half only — a warning-severity inert-expression diagnostic. ⛔ It does not fix the reported page, and no production surface displays warnings yet. The page fix is the grammar decision on #6614, which is what this card is blocked on.
The title is a triage-authored artifact, so re-titling is triage's write, not this seat's — flagged rather than edited.
Environment (as originally reported)
@objectstack/*17.1.0 (hotcrm reference app, hotcrm @ a76b69ff003605e0d1512c4bbf304031bb5c5fec, dev server)- Page written via metadata API into a fresh writable package (PUT /api/v1/meta/page/ with mode=draft and package, then publish-drafts)
Actual
In a kind: 'html' page, the object-table block renders the row count (e.g. "23 records") and the filter/group/sort toolbar, but no data columns at all — only the index column. Eight binding forms all tried, none renders columns:
- JSX array literal for
columns - JSON-string
columns - object-array
columns ({field, label}) viewName reference to a saved viewview reference to a saved view- child column elements
- no
columns at all (default-columns expectation) - kebab/camel attribute-name variants of the above
Expected / contrast
The same block in a kind: 'react' page works fully: all four columns render (Opportunity Name / Stage / Amount / Close Date). So the data path and the block itself are fine — the html-tier attribute-to-prop binding for columns is dropped.
Triage anchoring evidence (⛔ SUPERSEDED — see the correction at the top; retained only as the record of how the card was mis-anchored)
⚠️ That third bullet is the one part of this section that held up — the authorised fork fired, and the fork is what produced the real mechanism above. The two bullets before it reasoned from fixtures, and a fixture is evidence about the fixture.
Impact
Any html-tier page (the "parse, never execute" tier meant for AI-drafted/unreviewed pages) cannot show a usable data table — rows without columns. Not a P0 for the reporting team (they re-scoped the demo page), but it undercuts the html tier's headline use case of safely accepting AI-authored pages that include data blocks.
Blocked-by: #6614
Moved from objectstack-ai/objectstack#12649 by central triage (file-at-destination: the fix lands in objectui). Original filed by yinlianghui from promo-video production recon (internal ref: steedos-labs/video-studio#61).
Environment (as originally reported)
@objectstack/*17.1.0 (hotcrm reference app, hotcrm @a76b69ff003605e0d1512c4bbf304031bb5c5fec, dev server)Actual
In a
kind: 'html'page, the object-table block renders the row count (e.g. "23 records") and the filter/group/sort toolbar, but no data columns at all — only the index column. Eight binding forms all tried, none renders columns:columnscolumnscolumns({field, label})viewNamereference to a saved viewviewreference to a saved viewcolumnsat all (default-columns expectation)Expected / contrast
The same block in a
kind: 'react'page works fully: all four columns render (Opportunity Name / Stage / Amount / Close Date). So the data path and the block itself are fine — the html-tier attribute-to-prop binding forcolumnsis dropped.Triage anchoring evidence (⛔ SUPERSEDED — see the correction at the top; retained only as the record of how the card was mis-anchored)
packages/sdui-parser/src/__tests__/compile.test.tscompilescolumns={["name","amount"]}green against a test fixture whose manifest declarescolumns: array.manifestFromConfigsin objectuipackages/sdui-parserbuilds the html-tier manifest from each registration's declaredinputs, and the object-table fixture inpackages/sdui-parser/src/__tests__/tier.test.tsdeclares onlyobject+pageSize— nocolumnsentry. An input the registration does not declare never survives compile, which matches the symptom exactly (rows arrive via theobjectbinding;columnssilently vanishes in every spelling).inputs) whethercolumnsis declared; if it is, the drop is in the manifest serialization or compile path instead — report the fork rather than assuming. Adjacent cards worth reading before writing anything: [finding]ComponentInput'sinputType/min/max/step/placeholderhave no reader — the manifest serializer forwards six keys and none of them #5905 (manifest serializer forwards six keys; severalComponentInputfields have no reader), finding(types): 13 top-level schema keys that component renderers genuinely READ are declared by no shipped type — measured across all 76content/docs/componentspages #6150 (top-level schema keys renderers read but no shipped type declares).Impact
Any html-tier page (the "parse, never execute" tier meant for AI-drafted/unreviewed pages) cannot show a usable data table — rows without columns. Not a P0 for the reporting team (they re-scoped the demo page), but it undercuts the html tier's headline use case of safely accepting AI-authored pages that include data blocks.