Repository navigation
ADR-0049 stage 2: tombstone events / orientation / position on TimelineSchema (plus TimelineEvent and the example fixture) #6354
Description
The routed half of #6170. Filed unassigned so it is triaged rather than assumed.
Where this comes from
#6170's maintainer ruling (2026-08-25, verbatim 「同意」) sends events / orientation / position down the ADR-0049 enforce-or-remove route. PR #6352 landed only the non-breaking subset of that ruling — the type now declares the keys TimelineRenderer actually reads, and events went required → optional so the docs page's own TypeScript example compiles. It removed nothing, because a removal here is a breaking narrowing of a published type.
This card is the removal.
The measurement PR #6352 recorded
Zero read points for all three keys, anywhere in the repo — not just in packages/plugin-timeline. A timeline authored with events renders an empty rail. TimelineEvent, the element type events names, is dead with it: its date key is not even the time key the renderer reads.
The house form is already in the same file
StaticTableColumn (#5474, maintainer ruling 2026-08-22, Option C) is the precedent, ~900 lines above TimelineSchema in packages/types/src/data-display.ts:
?: nevermembers with aRETIRED (…)doc comment and@deprecated;- twinned by
z.never().optional().describe('RETIRED …')inzod/data-display.zod.ts; - giving a
tscerror on the authoring side and a loud parse rejection on the validation side.
Checklist this card owns
-
TimelineSchema.events/.orientation/.position→?: nevertombstones, with the mirror twin. - Decide
TimelineEvent's fate — it exists only to typeevents. - Replace
packages/types/examples/data-display-examples.json'stimelinenode. It authors exactly the removed vocabulary, is imported by nothing and type-checked by nothing, and teaches a form that renders an empty rail. It must move when this lands.⚠️ scripts/check-lucide-icon-record-names.mjscounts 3 timeline icon names in that file — check the census does not drift. - Update the deprecation callout in
content/docs/plugins/plugin-timeline.mdx(added by PR fix(types): align TimelineSchema with the keys the timeline renderer reads #6352) to say removed rather than deprecated. -
packages/types/src/__tests__/timeline-declared-keys.test.tshas a describe block pinning these three as still declared; it is written to turn red on this change on purpose. Convert it to a tombstone pin.
Restart-when: pnpm view @object-ui/types time --json reports a publish time LATER than 2026-08-25T15:36:26Z (the merge of PR objectui#6352, stage 1) — i.e. the deprecate-then-delete window objectui#5674 ruled on has an actually-published stage 1 to count from
This line was ADDED at 2026-09-18T22:51Z by the domain:ui#2 execution seat. It existed in neither channel — not the body, not a comment — which made this hold illegal under the state model (a hold is legal only with a machine-fireable exit) and left objectui#6170 and objectui#6356, both pm:blocked behind this card, waiting on a mechanism that could never fire (patrol row H26). ⛔ Nothing about this card's direction, grade or route changed: the direction is already ruled on objectui#6170 (「同意」, ADR-0049 enforce-or-remove) and only the timing was ever open, as this section says in its own words. @object-ui/types@17.5.0 published 2026-08-14T15:42:14Z — EARLIER than stage 1 — and the tag listing answered with a different package family entirely, so that instrument is not clean enough to assert it either way. The predicate above names the reading someone must take; it is ⛔ not a reading taken.
The one open question
Timing, not direction. PR #6352 is effectively stage 1 of the deprecate-then-delete window #5674's ruling (2026-08-22) established for a published export whose external consumers cannot be measured from inside this repo. Whether stage 2 waits a release is a maintainer call.
Refs: #6170, PR #6352, #5474 (the tombstone precedent), #5674 (the deprecation-window ruling).
Generated by Claude Code
Activity
timelinerenderer reads seven keysTimelineSchemadoes not declare, and declares three it never reads #6170os-tesla commentedon Sep 18, 2026
Half-state repair — this hold had no exit in EITHER channel, and two cards were waiting on it
domain:ui#2执行席,session_018HrVaotisyhgmot9o2MLRq,2026-09-18T22:52Z。⛔ 本笔不改级别、不改路由、不改状态标签:pm:on-hold留在原处,domain:ui不动。加的只有正文里那条本来就欠着的Restart-when:行。读数
Restart-when:—— 正文与评论两个通道pm:blocked,Blocked-by: #6354)· objectui#6356(pm:blocked,经 objectui#6170 传递)pm:blockedon 1 target(s) that can never CLOSE」command—— 可点火⇒ 这三张卡此前是一条构造上永不释放的链:等待者的解锁谓词是「
Blocked-by:目标关闭」,而pm:on-hold按定义是卡开着时所处的状态。H26 那句话说得准确:「the release has to come from the target's own state changing … and someone has to want that」。本笔就是让那件事有机制可发生。⛔ 本笔没有做的事
@object-ui/types是 17.5.0 / 2026-08-14T15:42:14Z,早于阶段一的落地(2026-08-25T15:36:26Z);而同一次读的 tags 列表回的却是@objectstack/plugin-ui@*—— 另一个包族。⇒ 这个仪器不干净,两个方向都不足以断言,所以新行写的是「该谁去取的读数」,⛔ 不是「已取到的读数」。Blocked-by:指向本卡,本卡现在有了出口,链子自己就活了。给下一个读者
条件满足的那一刻,本卡照常走 hold 放行双查(只放最近一次转换评论的条件,其后卡上有更新的 merged PR 即拒),清单在正文「Checklist this card owns」那一节,五项,含那条故意写成会变红的 pin(
timeline-declared-keys.test.ts)。domain:ui#2执行席 ·session_018HrVaotisyhgmot9o2MLRq· 上表四个读数与两个通道的零、以及新行的分类,都在本动作 2026-09-18T22:52Z 现取;两个时间戳是平台的。Generated by Claude Code