Skip to content

spec(ui): declare titleField on KanbanConfigSchema — the one item-titled view config of five that omits the key its four siblings already declare (executes objectui#8367 ruling A, decision batch #87) #16894

Description

@os-warren

Filed by the domain:spec @ objectui seat (session_01Jmxdo7bmeqCQHLSfmLVX9w, os-warren) as the cross-repo leg the ruling below assigns to it. ⛔ Filed unassigned, not claiming — this is objectstack's lane to dispatch.

The ruling this executes — ⛔ not a proposal, and ⛔ not re-openable here

Director seat, decision batch #87, 2026-09-08, recorded at objectstack-ai/objectui#8367 comment 5582071618, and confirmed by the maintainer at comment 5582246697, verbatim: 「批 #87 同意」.

Ruled. titleField joins KanbanConfigSchema in objectstack/packages/spec: optional z.string(), absence resolving through the ADR-0079 record display-name chain exactly as the CalendarConfigSchema docblock already states (ruling #13748 「不要求超过渲染器真正需要的」). This is a regularisation of a family where Calendar / Gallery / Timeline / Gantt already declare the same key under the same name and type — not new surface.

B refused, and refused as a class: this repo does not declare a key the spec refuses by name. A live key either goes upstream or is removed (契约优先; commandment #0.1 — no renderer-side dialect).

⇒ The direction is settled. What is open here is the implementation, not the choice.

The measurement behind it — taken by the objectui#8367 dev, ⛔ re-derive before quoting

All of the following is quoted from objectui#8367 comment 5574629565, measured against the installed @objectstack/spec 17.3.0 (resolved at node_modules/.pnpm/@objectstack+spec@17.3.0_ai@7.0.65_zod@4.4.3_ — the version was read, not assumed). ⚠️ It was measured on the published dist of 17.3.0, ⛔ not on this repo's source tree, so the first thing to do here is re-derive it against packages/spec/src on current main.

Spec 17.3.0 KanbanConfigSchema = { groupByField: z.string() (required), summarizeField: z.string().optional(), columns: z.array(z.string()) (required) }, z.core.$strict.

titleField is already declared — same spelling, same z.string() — on four sibling view configs:

schema titleField
CalendarConfigSchema optional
GalleryConfigSchema optional
TimelineConfigSchema optional
GanttConfigSchema required
KanbanConfigSchema absent — this card

Probes, with both controls firing on the same call shape (this is the discipline the reading rests on, and a "not found" without both legs does not count):

KanbanConfigSchema  CONTROL-1  bogus key   -> ok=false  unrecognized_keys=["zzUnlikelyBogusKey__"]   (the parser CAN refuse)
KanbanConfigSchema  CONTROL-2  canonical   -> ok=true   unrecognized_keys=[]                          (a refusal is about the NAME)
KanbanConfigSchema  PROBE      titleField  -> ok=false  unrecognized_keys=["titleField"]
CalendarConfigSchema POSITIVE  titleField  -> ok=true   unrecognized_keys=[]                          (ACCEPTED)

Six other candidate spellings were probed on the same shape and every one was refused: title, titleKey, displayField, primaryField, nameField, labelField.

Why this is a defect and not a wish

The key is live in objectui today. kanbanViewOptions floors it at 'name', ListView forwards it onto the generated object-kanban node, and objectui carries a pin literally named "floors titleField at name, as the four sibling faces do". Today an author writing titleField gets opposite answers from two validation faces — the spec refuses it by name, objectui's mirror accepts it only by not looking (.passthrough()).

⇒ That is the declared-vs-enforced gap, and under ruling A the repair is here, upstream, not in the consumer.

Shape — pre-decided by the spec's own docblock, ⛔ do not redesign

The ruling names the shape rather than leaving it open, because the spec has already written it down for this exact key on CalendarConfigSchema:

@objectstack/spec: minor. ⛔ No ADR text — the ruling says so explicitly; ADR-0079 and #13748 already carry the semantics.

Clause-②: yes

This widens the published accept set of KanbanConfigSchema. The ruling's "not new surface" is about product judgement (the key exists on four siblings under the same name and type), ⛔ not a claim that clause ② does not apply. It applies, and the card carries the tier and the pre-enqueue contract review that go with it.

⚠️ One item deliberately NOT ruled into this card

objectui#7742 records the node-level titleField — the board reading an undeclared titleField on ObjectKanbanSchema. The batch-#87 ruling says the same direction disposes it, "in the same objectstack card if the shape allows".

This seat did not measure whether the shape allows it, and is ⛔ not asserting that it does. That conditional is handed over as a question, not a fence: does the node-level kanban face have a home in this same schema family, such that one declaration serves both? If yes, land both here and say so. If no, report back on objectui#7742 and it gets its own leg. ⛔ Do not widen this card on an assumption either way.

Executable acceptance criterion

A published @objectstack/spec release whose KanbanConfigSchema accepts titleField — i.e. the four-leg probe above re-run against the released package, with both controls firing, and the PROBE line flipping from unrecognized_keys=["titleField"] to ok=true.

⚠️ The downstream unblock criterion is installability, ⛔ not "merged here": objectui#8367 stays blocked until a released version carrying this is pinned in objectui (its console pin bump), because objectui consumes this package as a published artifact.

Downstream, blocked on this card

Refs: objectstack-ai/objectui#8367 (the ruling and the measurement) · objectstack-ai/objectui#8221 (the same principle for sort, ⛔ ruled separately and ⛔ not assumed to take the same outcome) · objectstack-ai/objectui#7742 · objectstack-ai/objectui#8356 · ADR-0079 · #13748

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

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions