Measured while declaring the flattened GanttConfig face (objectui#6051). Filed
unassigned, observational — recording a measurement and the decision it implies,
not proposing the fix.
The fact
getGanttConfig (packages/plugin-gantt/src/ObjectGantt.tsx) has two branches
and the first one returns early:
// 1. Check top-level properties (the flattened ObjectGanttSchema style)if(schema.startDateField&&schema.endDateField){config={/* built from top-level keys only */};returnconfig;// <- the `gantt` block below is never read}// 2. Check schema.gantt (the block face, ObjectGridSchema style)if(schema.gantt){config=schema.ganttasGanttConfigEx;}So a node carrying BOTH spellings renders the flat one, and every key inside the
gantt block is discarded with no diagnostic — not a warning, not a
dev-mode notice. The block branch is the one that runs
GanttConfigSchema.safeParse and warns; the flat branch returns before it.
Why it is worth a card
plugin-map had exactly this question ruled the OTHER way. Maintainer ruling on
objectui#5018 (2026-08-17), landed in PR #5156 / 578e02516:
Precedence flip (maintainer ruling on objectui#5018, 2026-08-17): the map
block wins over the internal flat spelling, with a dev-mode warning naming the
ignored top-level keys.
Two sibling view plugins, one shape of problem, opposite answers — and gantt's
answer was never ruled, it is just what the return happens to do. objectui#6051
declared both faces so they are provably one vocabulary, but deliberately did NOT
touch precedence: which face wins is a ruling, not a dev call.
What a decision would have to cover
- Does the
gantt block win (matching plugin-map), or does the flat spelling
keep winning (matching today's behaviour)? - Either way, the losing face's keys should be named in a dev-mode warning
rather than dropped silently — that half is not in dispute and is what
plugin-map shipped. - Producer safety:
ListView (packages/plugin-list/src/ListView.tsx) and
ObjectView (packages/plugin-view/src/ObjectView.tsx) both FLATTEN their
gantt options onto top-level keys and emit no gantt key, so neither
flattener is affected by a flip — the same check plugin-map's flip pinned.
Related: objectui#6051 (declared both faces), objectui#5018 / PR #5156 (the map
ruling this one is compared against).
Generated by Claude Code
Generated by Claude Code
Measured while declaring the flattened
GanttConfigface (objectui#6051). Filedunassigned, observational — recording a measurement and the decision it implies,
not proposing the fix.
The fact
getGanttConfig(packages/plugin-gantt/src/ObjectGantt.tsx) has two branchesand the first one returns early:
So a node carrying BOTH spellings renders the flat one, and every key inside the
ganttblock is discarded with no diagnostic — not a warning, not adev-mode notice. The block branch is the one that runs
GanttConfigSchema.safeParseand warns; the flat branch returns before it.Why it is worth a card
plugin-maphad exactly this question ruled the OTHER way. Maintainer ruling onobjectui#5018 (2026-08-17), landed in PR #5156 /
578e02516:Two sibling view plugins, one shape of problem, opposite answers — and gantt's
answer was never ruled, it is just what the
returnhappens to do. objectui#6051declared both faces so they are provably one vocabulary, but deliberately did NOT
touch precedence: which face wins is a ruling, not a dev call.
What a decision would have to cover
ganttblock win (matchingplugin-map), or does the flat spellingkeep winning (matching today's behaviour)?
rather than dropped silently — that half is not in dispute and is what
plugin-mapshipped.ListView(packages/plugin-list/src/ListView.tsx) andObjectView(packages/plugin-view/src/ObjectView.tsx) both FLATTEN theirganttoptions onto top-level keys and emit noganttkey, so neitherflattener is affected by a flip — the same check
plugin-map's flip pinned.Related: objectui#6051 (declared both faces), objectui#5018 / PR #5156 (the map
ruling this one is compared against).
Generated by Claude Code
Generated by Claude Code