Found while implementing objectui#5453 (retire the dead per-column wrap forward in ObjectGrid). Out of that card's fence — it named packages/plugin-grid and packages/components' data-table.tsx — so it is filed rather than fixed there.
What
packages/react/src/spec-bridge/bridges/list-view.ts, in mapColumn():
if(col.wrap!=null)mapped.wrap=col.wrap;
@objectstack/spec (17.2.0) declares wrap on ListColumn — wrap: z.ZodOptional(z.ZodBoolean) — so an author may legitimately write it on a spec list view. The bridge forwards it into the object-grid schema. Until #5453, ObjectGrid.generateColumns() then forwarded it once more into the TableColumn[] slot, where data-table.tsx never read it.
#5453 removed that second hop, on the measurement that data-table.tsx has zero reads of a column-level wrap and offers no clamp / expand / wrap affordance for long cell text at all. So the chain is now one hop shorter and still terminates in nothing:
author writes ListColumn.wrap (spec-declared, valid)
-> spec-bridge mapColumn() forwards it <- this line
-> object-grid schema column
-> [#5453 deleted the hop that used to be here]
-> nothing reads it, anywhere
Evidence
Repo-wide, on f241a4df plus #5453's branch, every .wrap read outside wrapper / nowrap / flex-wrap:
| site | what it is |
|---|
react/spec-bridge/bridges/list-view.ts:71 | the forward above |
react/spec-bridge/__tests__/SpecBridge.test.ts:180 | pins the forward (expect(col.wrap).toBe(true)) |
components/renderers/layout/flex.tsx, stack.tsx | schema.wrap on flex/stack layout — unrelated key |
core/actions/ActionRunner.ts, app-shell action runtime | bodyShape.wrap — unrelated key |
No renderer resolves a column-level wrap. The pin test asserts only that the bridge passes the key through; it would stay green if every consumer vanished, which is what has now happened.
Why it is worth a card rather than a silent deletion
The bridge's own docblock states its contract deliberately: "A spec ListColumn in, the same column out — in the spelling the spec declares", and "Nothing is invented on the way through". Under that contract, forwarding wrap is the bridge doing its job faithfully, not a bug in the bridge. That is exactly why #5453 stopped at the plugin-grid hop and did not reach in here: deleting this line would make the bridge deliberately lossy for a spec-declared key, which is a different judgement from "a producer must not write keys its consumer never reads".
So the real question is one level up and it is a spec question: should @objectstack/spec keep declaring ListColumn.wrap when no renderer in the ecosystem implements it? That is ADR-0049 enforce-or-remove on a spec property, and the resolution likely lands in objectstack/packages/spec rather than here, with this repo's bridge line and pin test following it. Routing that is triage's call, not this seat's — hence a finding, unassigned, with no pm:queue.
Two honest resolutions, in the order the enforce-or-remove default suggests:
Related: #5453 (the forward that was retired), #6458 (ObjectGrid honours four undeclared authored column keys), #6004 (the untyped emit that hid both).
Found while implementing objectui#5453 (retire the dead per-column
wrapforward inObjectGrid). Out of that card's fence — it namedpackages/plugin-gridandpackages/components'data-table.tsx— so it is filed rather than fixed there.What
packages/react/src/spec-bridge/bridges/list-view.ts, inmapColumn():@objectstack/spec(17.2.0) declareswraponListColumn—wrap: z.ZodOptional(z.ZodBoolean)— so an author may legitimately write it on a spec list view. The bridge forwards it into theobject-gridschema. Until #5453,ObjectGrid.generateColumns()then forwarded it once more into theTableColumn[]slot, wheredata-table.tsxnever read it.#5453 removed that second hop, on the measurement that
data-table.tsxhas zero reads of a column-levelwrapand offers no clamp / expand / wrap affordance for long cell text at all. So the chain is now one hop shorter and still terminates in nothing:Evidence
Repo-wide, on
f241a4dfplus #5453's branch, every.wrapread outsidewrapper/nowrap/flex-wrap:react/spec-bridge/bridges/list-view.ts:71react/spec-bridge/__tests__/SpecBridge.test.ts:180expect(col.wrap).toBe(true))components/renderers/layout/flex.tsx,stack.tsxschema.wrapon flex/stack layout — unrelated keycore/actions/ActionRunner.ts,app-shellaction runtimebodyShape.wrap— unrelated keyNo renderer resolves a column-level
wrap. The pin test asserts only that the bridge passes the key through; it would stay green if every consumer vanished, which is what has now happened.Why it is worth a card rather than a silent deletion
The bridge's own docblock states its contract deliberately: "A spec
ListColumnin, the same column out — in the spelling the spec declares", and "Nothing is invented on the way through". Under that contract, forwardingwrapis the bridge doing its job faithfully, not a bug in the bridge. That is exactly why #5453 stopped at the plugin-grid hop and did not reach in here: deleting this line would make the bridge deliberately lossy for a spec-declared key, which is a different judgement from "a producer must not write keys its consumer never reads".So the real question is one level up and it is a spec question: should
@objectstack/speckeep declaringListColumn.wrapwhen no renderer in the ecosystem implements it? That is ADR-0049 enforce-or-remove on a spec property, and the resolution likely lands inobjectstack/packages/specrather than here, with this repo's bridge line and pin test following it. Routing that is triage's call, not this seat's — hence afinding, unassigned, with nopm:queue.Two honest resolutions, in the order the enforce-or-remove default suggests:
wrapfromListColumn, then drop this forward and re-point the pin test. Consistent with [finding] ObjectGrid forwards a per-columnwrapinto the DataTable column object, but nothing indata-table.tsxever reads it #5453's verdict and with the zero measured pull on this side.data-table.tsxa real long-text affordance and read the key. This is a behaviour addition and wants its own card and a product decision; [finding] ObjectGrid forwards a per-columnwrapinto the DataTable column object, but nothing indata-table.tsxever reads it #5453 was explicitly graded for removal and stopped short of it for that reason.Related: #5453 (the forward that was retired), #6458 (
ObjectGridhonours four undeclared authored column keys), #6004 (the untyped emit that hid both).