Filing-gate category: ④ a cross-repo child — the objectstack half of objectui#6356, filed by the seat that accepted its objectui PR (cross-repo rule 3: an accepted PR whose product flows into another repo gets its follow-up in the consuming repo at once). Reader: the objectstack domain:spec seat, which dispatches it once triage grades it and objectstack's .objectui-sha pin covers the objectui merge commit (the second reading, by REST compare). Filed by domain:ui seat #1 @ objectui, session_01DuWo5bdP9SdVebamn99GGk. ⛔ Not graded here.
Blocked-by: objectstack-ai/objectui#10822
What landed in objectui (PR objectstack-ai/objectui#10822, Fixes objectstack-ai/objectui#6356, merged 2026-09-27 as objectui 3a5817f07)
Maintainer ruling on objectui#6356, Q1 = A and Q2 = C:
@object-ui/types TimelineSchema.items is now an element union, TimelineFeedItem | TimelineGanttItem, in place of an element with an open string index signature.
- The feed arm (
variant absent, vertical or horizontal) declares the documented seven keys: time, title, description, variant, icon, content, className. title is required.
- The gantt arm (
variant: 'gantt') is a row: label is required, and items holds bars (title, startDate, endDate, variant).
- The zod mirror judges each element against the arm the node's
variant selects, with a node-level superRefine. A gantt row on a feed timeline is refused, and so is a feed item on a gantt one. The published TimelineSchema stays a ZodObject.
- The strict authoring face refuses undeclared keys by name (
meta, group, color, startDate, endDate, _data, date). The tolerant face keeps .passthrough().
- The five keys
ObjectTimeline composes from records are typed renderer-internal inside @object-ui/plugin-timeline and are not exported.
- objectui's
object-timeline renderer types its schema as TimelineSchema & { … } (packages/plugin-timeline/src/ObjectTimeline.tsx ObjectTimelineProps). So the authored items it passes straight to the renderer are that same element union.
What the spec says today (objectstack origin/main 1207baf0)
packages/spec/src/ui/component.zod.ts:4400, in ObjectTimelinePropsSchema:
items: z.array(z.unknown()).optional()
- It is described as 「Static inline entries … (the renderer becomes a pass-through and the author owns the item shape)」.
After the objectui merge, 「the author owns the item shape」 is no longer true: the element has a declared vocabulary. An author, human or AI, who reads the spec's ComponentPropsMap['object-timeline'] gets no guidance on it, and no refusal for a gantt row under a feed variant.
Direction (sequencing only, ⛔ not a shape ruling)
Order of work, decided by the objectui seat in box 5857426543 on objectui#6356 and not overturned by the ruling 5857468846: objectui first, then the spec follows. The element's implementation, docs and only producer live in objectui.
Which spelling the spec takes is the spec seat's to derive, under the posture this file's header gives for a contract that lives in objectui (mapping stays z.unknown() for that reason). The candidates:
- declare the element by name (feed and gantt arms, judged by
variant), or
- keep
z.unknown() and correct the describe, so that it names @object-ui/types TimelineFeedItem / TimelineGanttItem as the owner.
Either way, the pinned read points (:546 if (schema.items) return schema.items; and :745 hasAuthoredItems) are re-read at the pin that covers the merge.
Dedupe
REST listing of the 1,000 most recently updated objectstack issues and PRs (open and closed, down to #19633), grepped locally:
Dedupe words: object-timeline items element · author owns the item shape · TimelineFeedItem TimelineGanttItem spec
Generated by Claude Code
Filing-gate category: ④ a cross-repo child — the objectstack half of objectui#6356, filed by the seat that accepted its objectui PR (cross-repo rule 3: an accepted PR whose product flows into another repo gets its follow-up in the consuming repo at once). Reader: the objectstack
domain:specseat, which dispatches it once triage grades it and objectstack's.objectui-shapin covers the objectui merge commit (the second reading, by RESTcompare). Filed bydomain:uiseat #1 @ objectui,session_01DuWo5bdP9SdVebamn99GGk. ⛔ Not graded here.Blocked-by: objectstack-ai/objectui#10822
What landed in objectui (PR objectstack-ai/objectui#10822,
Fixes objectstack-ai/objectui#6356, merged 2026-09-27 as objectui3a5817f07)Maintainer ruling on objectui#6356, Q1 = A and Q2 = C:
@object-ui/typesTimelineSchema.itemsis now an element union,TimelineFeedItem | TimelineGanttItem, in place of an element with an open string index signature.variantabsent,verticalorhorizontal) declares the documented seven keys:time,title,description,variant,icon,content,className.titleis required.variant: 'gantt') is a row:labelis required, anditemsholds bars (title,startDate,endDate,variant).variantselects, with a node-levelsuperRefine. A gantt row on a feed timeline is refused, and so is a feed item on a gantt one. The publishedTimelineSchemastays aZodObject.meta,group,color,startDate,endDate,_data,date). The tolerant face keeps.passthrough().ObjectTimelinecomposes from records are typed renderer-internal inside@object-ui/plugin-timelineand are not exported.object-timelinerenderer types its schema asTimelineSchema & { … }(packages/plugin-timeline/src/ObjectTimeline.tsxObjectTimelineProps). So the authoreditemsit passes straight to the renderer are that same element union.What the spec says today (objectstack
origin/main1207baf0)packages/spec/src/ui/component.zod.ts:4400, inObjectTimelinePropsSchema:items: z.array(z.unknown()).optional()After the objectui merge, 「the author owns the item shape」 is no longer true: the element has a declared vocabulary. An author, human or AI, who reads the spec's
ComponentPropsMap['object-timeline']gets no guidance on it, and no refusal for a gantt row under a feedvariant.Direction (sequencing only, ⛔ not a shape ruling)
Order of work, decided by the objectui seat in box
5857426543on objectui#6356 and not overturned by the ruling5857468846: objectui first, then the spec follows. The element's implementation, docs and only producer live in objectui.Which spelling the spec takes is the spec seat's to derive, under the posture this file's header gives for a contract that lives in objectui (
mappingstaysz.unknown()for that reason). The candidates:variant), orz.unknown()and correct the describe, so that it names@object-ui/typesTimelineFeedItem/TimelineGanttItemas the owner.Either way, the pinned read points (
:546if (schema.items) return schema.items;and:745hasAuthoredItems) are re-read at the pin that covers the merge.Dedupe
REST listing of the 1,000 most recently updated objectstack issues and PRs (open and closed, down to #19633), grepped locally:
object-timelinenearitems→ 1 hit, [finding] the tracked rootsdui.manifest.jsonand the browser dump differ on the fields the parity gate consumes (18 of 57 components;dataSourcemissing on 15 in the root artefact) — the gate's verdict set is identical under both today, which is the configuration in which the drift is least visible #17735 (closed; the sdui manifest parity, not a carrier)TimelineFeedItem/TimelineGanttItem→ 0objectui#6356/objectui#10822→ 0author owns the item shape→ 0object-timeline→ 7 hitsDedupe words:
object-timeline items element·author owns the item shape·TimelineFeedItem TimelineGanttItem specGenerated by Claude Code