Found while implementing objectui#8481 (teaching the shared @object-ui/fields renderers that an empty array is not a cell value). Filed unassigned, not claimed. Out of that card's fence: objectui#8481 fixes SelectCellRenderer / LookupCellRenderer / UserCellRenderer; this is a defect in ObjectKanban's own card-field loop, which for one field shape never dispatches to those renderers at all.
DOM shapes below are spelled out in words rather than written literally — tag-shaped fragments are eaten from GitHub bodies even inside backticks (AGENTS.md, "六种已实测的改写" ①).
What
packages/plugin-kanban/src/ObjectKanban.tsx:604 opens the explicit-card-field loop with
if (raw == null || raw === '') continue;
[] passes that guard — the same blindness objectui#8481 is about. Four lines later the loop forks:
const isPicklist =
def?.type === 'picklist' ||
def?.type === 'multipicklist' ||
(Array.isArray(def?.options) && def!.options.length > 0);
if (isPicklist) {
// ... cardBadges.push({ label: translatedLabel, colorClass, colorStyle })
} else {
const CellRenderer = getCellRenderer(fieldType); // the objectui#8481 path
}
Any field carrying declared options takes the badge branch, not the renderer branch. For []:
String(raw) is the empty string, so the option lookup misses,
rawLabel becomes the empty string,
- and a badge is pushed with an empty label.
The card then renders a fully styled, fully coloured pill with nothing inside it.
Measured, by rendering
Rendering a real ObjectKanban board (one lane, two cards, cardFields of three multi-value fields) on 7cf6f38fb, with objectui#8481's renderer fix applied:
| card field |
declared options? |
branch taken |
rendered for [] |
tags (multiselect) |
yes |
the card's own picklist branch |
an indigo pill, inline-flex items-center whitespace-nowrap rounded-full border px-2.5 py-0.5 … bg-indigo-50 text-indigo-700 border-indigo-200, zero children, empty text |
topics (multiselect) |
no |
getCellRenderer |
the shared No value affordance |
owners (user) |
n/a |
getCellRenderer |
the shared No value affordance |
So the same board, after objectui#8481, shows two correct placeholders and one empty coloured pill — and it is the most commonly authored of the three shapes that stays broken, because a picklist that declares its options is the normal case.
Why the shared renderer fix cannot reach it
The badge branch does not call a cell renderer. It reads def.options, resolves a label and a colour itself, and pushes a plain data object onto cardBadges. Nothing downstream of that has a value to test. Fixing it means the kanban's own guard learning what SelectCellRenderer's did — or, better, the picklist branch declining to push a badge whose resolved label is empty.
⚠️ Note the second half, which is independent of arrays: any value that resolves to an empty label (an option whose declared label is the empty string, a stored value that stringifies to nothing) produces the same empty pill. The array case is simply the one that is easy to hit.
Dedup
REST is 403 from this dev container (GitHub access is not enabled for this session), so one targeted MCP search_issues was used instead — declared channel switch. The query returned objectui#8481, objectui#8474 and objectui#8475 as control hits, so the channel is live in this session. Nothing returned covers the kanban card's own badge branch: objectui#8308 is cardTitle fallback spelling, objectui#7664 is validator/renderer face disagreement, objectui#5183 is badge colour quantization.
Filed by an ObjectUI dev agent working objectui#8481, session session_01YBWFb5YgMU5dw8p2VKj16S, from branch claude/issue-8481-selectcellrenderer-empty-array. (Attribution written as prose deliberately: a footer block is stripped from issue bodies on create.)
Found while implementing objectui#8481 (teaching the shared
@object-ui/fieldsrenderers that an empty array is not a cell value). Filed unassigned, not claimed. Out of that card's fence: objectui#8481 fixesSelectCellRenderer/LookupCellRenderer/UserCellRenderer; this is a defect inObjectKanban's own card-field loop, which for one field shape never dispatches to those renderers at all.DOM shapes below are spelled out in words rather than written literally — tag-shaped fragments are eaten from GitHub bodies even inside backticks (AGENTS.md, "六种已实测的改写" ①).
What
packages/plugin-kanban/src/ObjectKanban.tsx:604opens the explicit-card-field loop with[]passes that guard — the same blindness objectui#8481 is about. Four lines later the loop forks:Any field carrying declared
optionstakes the badge branch, not the renderer branch. For[]:String(raw)is the empty string, so the option lookup misses,rawLabelbecomes the empty string,The card then renders a fully styled, fully coloured pill with nothing inside it.
Measured, by rendering
Rendering a real
ObjectKanbanboard (one lane, two cards,cardFieldsof three multi-value fields) on7cf6f38fb, with objectui#8481's renderer fix applied:options?[]tags(multiselect)inline-flex items-center whitespace-nowrap rounded-full border px-2.5 py-0.5 … bg-indigo-50 text-indigo-700 border-indigo-200, zero children, empty texttopics(multiselect)getCellRendererNo valueaffordanceowners(user)getCellRendererNo valueaffordanceSo the same board, after objectui#8481, shows two correct placeholders and one empty coloured pill — and it is the most commonly authored of the three shapes that stays broken, because a picklist that declares its options is the normal case.
Why the shared renderer fix cannot reach it
The badge branch does not call a cell renderer. It reads
def.options, resolves a label and a colour itself, and pushes a plain data object ontocardBadges. Nothing downstream of that has a value to test. Fixing it means the kanban's own guard learning whatSelectCellRenderer's did — or, better, the picklist branch declining to push a badge whose resolved label is empty.labelis the empty string, a stored value that stringifies to nothing) produces the same empty pill. The array case is simply the one that is easy to hit.Dedup
REST is 403 from this dev container (
GitHub access is not enabled for this session), so one targeted MCPsearch_issueswas used instead — declared channel switch. The query returned objectui#8481, objectui#8474 and objectui#8475 as control hits, so the channel is live in this session. Nothing returned covers the kanban card's own badge branch: objectui#8308 iscardTitlefallback spelling, objectui#7664 is validator/renderer face disagreement, objectui#5183 is badge colour quantization.Filed by an ObjectUI dev agent working objectui#8481, session
session_01YBWFb5YgMU5dw8p2VKj16S, from branchclaude/issue-8481-selectcellrenderer-empty-array. (Attribution written as prose deliberately: a footer block is stripped from issue bodies on create.)