Skip to content

html-kind page: object-table renders rows but no data columns — columns never reaches the renderer because the registration's declared inputs omit it #6598

Description

@os-litant

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:

  1. 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.
  2. 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).
  3. 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:

  1. JSX array literal for columns
  2. JSON-string columns
  3. object-array columns ({field, label})
  4. viewName reference to a saved view
  5. view reference to a saved view
  6. child column elements
  7. no columns at all (default-columns expectation)
  8. 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.

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:dispatched

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions