Skip to content

finding(docs): guide/building-crud-app.md addresses every renderer with object, but object-grid / object-form / detail-view all declare objectName — the whole guide binds to nothing #5377

Description

@os-support-ai

Found while implementing #5342 (PR #5376), which fixed the type keys on the same five snippets. Filed unassigned, not claimed, and deliberately NOT carried in that PR — #5342's gate answers one question ("does this type name a registered component") and its docblock states that whether a snippet's OTHER keys are read is out of scope. This is that second dimension.

Measured, on f2e11ae6f

content/docs/guide/building-crud-app.md is the getting-started CRUD walkthrough. Every SchemaRenderer call in it names the object with a key called object:

212: type: 'object-grid',
213: object: 'task',
214: view: 'all',
...
249: type: 'object-form',
250: object: 'task',
...
320: type: 'detail-view',
321: object: 'task',
322: recordId: taskId,

(The type values above are post-#5376; before it they were ObjectGrid / ObjectForm / ObjectDetail, which is what that card fixed.)

None of the three renderers declares object. All three declare objectName, and it is required:

keydeclared inputsite
object-grid{ name: 'objectName', type: 'string', required: true }packages/plugin-grid/src/index.tsx:167 (GRID_QUERY_INPUTS)
object-form{ name: 'objectName', type: 'string', required: true }packages/plugin-form/src/index.tsx:105
detail-view{ name: 'objectName', … }, plus resourceId not recordIdpackages/plugin-detail/src/index.tsx:139-141

So a reader who follows the guide end to end now gets the right component (after #5376) addressed at no object. detail-view carries a second instance in the same snippet: the guide writes recordId, the declared input is resourceId.

Why this is worth a card

This is the first-run guide. Before #5376 the failure was loud — an OBJUI-001 red panel — and a reader would at least know something was wrong. After it the failure is quiet: the grid renders, and renders empty. #5349 is the measured shape of that quiet mode ("ObjectGrid renders a header-only grid in total silence when no column resolves"), and #5057 / #5352 are the same family on other pages — a documented key surface the renderer does not read.

Note that fixing the type alone is what converts loud into quiet, which is an argument for doing both, not for reverting either.

What needs deciding

Whether the fix is the page or the contract is genuinely open, which is why this is filed rather than patched:

  1. Fix the page — re-spell object as objectName and recordId as resourceId in all five snippets. Smallest diff, and the declared surface is unambiguous.
  2. Fix the contract — if object is meant to be authorable (it reads like the more natural spelling, and ViewData already uses { provider: 'object', object } one level down), declare it. But per AGENTS.md #0.1 that has to be a deliberate spec move at the producer, never a lenient alias in the renderer, and objectui#5091's ruling of 2026-08-18 already pushed in the direction of a narrow declared surface for exactly these grid keys.

The ViewData overlap is the reason this needs a person: object is a real key in this system, just one level deeper, and a guide that spells it at the top level is a plausible mis-read rather than a typo.

Reproduce

grep -n "object: 'task'\|recordId:\|objectName" content/docs/guide/building-crud-app.md
grep -n "name: 'objectName'" packages/plugin-grid/src/index.tsx packages/plugin-form/src/index.tsx packages/plugin-detail/src/index.tsx

Related: #5342 / PR #5376 (the type half of these same snippets), #5349 (the silent-empty-grid mode this lands in), #5352 / #5057 (same family: documented keys the renderer does not read), #5091 (the declared-surface ruling for the grid keys).

Generated by Claude Code

Metadata

Metadata

Assignees

Labels

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions