You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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
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.
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:
⛔ Not required — GanttConfigSchema spells it required, and that is the one sibling this card does not copy.
@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-leveltitleField — 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.
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 comment5582246697, verbatim: 「批 #87 同意」.⇒ 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⚠️ 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
5574629565, measured against the installed@objectstack/spec17.3.0 (resolved atnode_modules/.pnpm/@objectstack+spec@17.3.0_ai@7.0.65_zod@4.4.3_— the version was read, not assumed).packages/spec/srcon currentmain.Spec 17.3.0
KanbanConfigSchema={ groupByField: z.string() (required), summarizeField: z.string().optional(), columns: z.array(z.string()) (required) },z.core.$strict.titleFieldis already declared — same spelling, samez.string()— on four sibling view configs:titleFieldCalendarConfigSchemaGalleryConfigSchemaTimelineConfigSchemaGanttConfigSchemaKanbanConfigSchemaProbes, 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):
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.
kanbanViewOptionsfloors it at'name',ListViewforwards it onto the generatedobject-kanbannode, and objectui carries a pin literally named "floorstitleFieldatname, as the four sibling faces do". Today an author writingtitleFieldgets 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:titleField: optionalz.string().titleFormat→displayNameField→ type-aware derivation →'Untitled'), per ruling 视图声明 calendar 可视化但缺 calendar 配置块时,平台不报错——直接渲染成一屏错位画面(全部记录堆在今天) #13748 「不要求超过渲染器真正需要的」.GanttConfigSchemaspells it required, and that is the one sibling this card does not copy.@objectstack/spec:minor. ⛔ No ADR text — the ruling says so explicitly; ADR-0079 and #13748 already carry the semantics.Clause-②: yesThis 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.objectui#7742 records the node-level
titleField— the board reading an undeclaredtitleFieldonObjectKanbanSchema. 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/specrelease whoseKanbanConfigSchemaacceptstitleField— i.e. the four-leg probe above re-run against the released package, with both controls firing, and thePROBEline flipping fromunrecognized_keys=["titleField"]took=true.Downstream, blocked on this card
titleFieldis undeclared on BOTH faces — the spec refuses it by name, this repo's mirror accepts it only via.passthrough(), and it is live objectui#8367 — flipped topm:blockedwithBlocked-by:pointing here in the same stroke as this filing. Once the pin moves, objectui declarestitleFieldas a real member,.passthrough()stops carrying it, and PR fix(app-shell): stop emitting the third kanban lane spellinggroupByobjectui#8356's pinned refused set narrows to exactly['cardFields']— ⛔ that pin is never widened.KanbanSchemacarries three zero-read members (allowCollapse,cardTemplates,columnWidths) and the board reads an undeclaredtitleField— enforce-or-remove on the shape objectui#7664 declared objectui#7742 — see the conditional above.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