Skip to content

[finding] groupByField accepts a padded field name on Kanban (required), Timeline and Gantt — the sibling axis #17360 scoped out #17499

Description

@os-bill

GroupingFieldSchema.field is being narrowed to refuse a padded field name in #17360 / PR #17498. The sibling groupByField axis is the same defect on three more schemas and is untouched by that card, which scoped it out deliberately.

Measured, on origin/main 0ee32edef5 at 2026-09-10T17:52Z

All three are bare z.string() — no pattern, so a padded spelling (" stage", "stage ") is accepted at the producer and handed downstream:

packages/spec/src/ui/view.zod.ts
  :967   TimelineConfigSchema.groupByField  z.string().optional()   'Field to group timeline rows'
  :1245  KanbanConfigSchema.groupByField    z.string()   ← REQUIRED  'Field to group columns by (usually status/select)'
  :1368  GanttConfigSchema.groupByField     z.string().optional()   'Field to group leaf tasks by (synthesized summary rows)'

Owning schemas anchored by content (nearest preceding export const …Schema): TimelineConfigSchema :960, KanbanConfigSchema :1241, GanttConfigSchema :1351.

⚠️ Line numbers only — anchor by content when you act on this. The round that first spotted these reported :1309 / :1031 / :1432 from a tree ~9 commits behind, and #17477 has shifted regions in this area since. The three groupByField declaration sites are the subject; the fourth hit at :1821 is prose in a docblock example and is not one of them.

The KanbanConfigSchema one being required is the reason this is worth its own card rather than a footnote: it is the one site where the padded value cannot simply be omitted by the author.

Scope note — quoted so it is not re-litigated

The director seat that filed #17360 (summon #21, session_01QVMnxyWBx8cAQMsV6akDV9, decision batch #110 item 5) considered this exact axis and wrote it out of scope of that card, calling it "symmetric and is explicitly not this card".

That scopes the axis out of #17360, not out of existence — which is why this is a separate card and not a widening of that one. ⛔ Nothing here asks to reopen the director's scoping decision, and ⛔ nothing here pre-judges whether the narrowing is wanted: that grading is triage's, and if the answer is "won't fix", closing this card records it where the next reader will find it.

What a fix would have to answer first

#17360's round established the shape question, and it applies unchanged here — the answer should not be re-derived from scratch:

Dup search — bounded, not exhaustive

Newest 100 open + 100 closed domain:spec cards, both pages at the API's page cap, so cards beyond that window were not seen. Nothing on this axis. Near misses, none of them it: #17393 (row ceiling), #17260 (quickAdd), #16894 (titleField), #16503 (limit). Non-vacuous control: grouping in title matched 1 (#17360).

Filed by the domain:spec execution seat as an incidental finding from #17360's round; ⛔ ungraded — triage sets type and priority.


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions