One idea for resolving the timing-vs-dependencies tension: a clean cyclical overview (what happens across the year, at a glance) sitting on top of a timeline drill-down (the real multi-year detail, with a dependency chain you can trace). Same data, two zoom levels. React freely — this exists to be argued with.
What is on each tab
Timeline detail — every milestone on a real calendar, one lane per system. Track width, month grid, dependency trace and the draggable current-date line live here.
Cyclical overview — the same records wrapped into a circle, to show what recurs rather than when exactly.
Data table — every underlying record in one list, for checking the data behind both visuals.
Milestone detail — clicking a marker on either visual opens its date history and its dependencies, read from the change log alongside the milestone data.
The time window
The window control on the Timeline and Cyclical tabs picks how much of the calendar both views show: 1, 2 or 3 years. The two views always show the same period — changing it on one changes it on the other.
At 2 or 3 years the ring is partitioned, with a divider and a year label at each January.
A system with records outside the chosen window is labelled in its lane, so a narrow window never looks like missing data.
Before you read the dates
Positions are month-precise. Where several events share a month they are spread evenly across that month's cell to keep them apart — that spacing is ordering, not a day of the month.
Systems with no records show as an explicitly empty lane or ring rather than being dropped.
The current-date line is the only day-precise element on the page.
Placeholder — to be completed before this is shared.
Data current as of:TBC
Source of the milestone dates: TBC
Owner / who to contact about a wrong date: TBC
Update cadence: TBC
Where this is hosted: TBC
Timeline detail — the calendar view. One lane per system across the selected window.
Window sets the period, and the Cyclical tab follows it. Narrowing the window is what relieves crowding: at one year each month cell gets three times the width it has at three.
Month grid switches itself off when a month cell is too narrow to read as a guide; the hint next to it says how narrow.
Small dots with no label are crowded milestones — hover for the name, or use Show all labels.
Click any marker for its record: the date history, what it waits on, and what waits on it. It opens at the foot of the window, and a Show detail button appears on the marker itself, which puts the same content in a draggable panel beside the dot. Click the marker again, or press Escape, to close.
Trace dependencies, in that record panel, draws the connections on the lanes, and the depth choice sits beside it. Direct links shows only what the record itself joins to; Full chain follows every connection to its end — on the current data that reaches 32 milestones from most starting points, so start direct. The panel also reports the counts and any member outside the window. This is timeline-only: the controls do not appear on the other tabs.
A chain member outside the selected window has no marker, so its link is drawn as a dashed line to the edge of its own lane — that lane tells you which system the chain continues into, and the record panel names the members themselves. Widen the window to bring them into view.
The date handle above the lanes is draggable. Focus it and use ← → for a day, shift + ← → for a month, Home to return to today. It turns amber once moved, and a reload always restores today.
Cyclical overview — the recurring rhythm. The selected window wrapped into a circle, read clockwise from January.
Rings run outer to inner in the same order as the legend above; hover any marker for its system, name and month.
Each slot is one month of one year — 12 slots at a 1-year window, 24 at 2 years, 36 at 3. Nothing is folded, so no slot is ambiguous.
Click any marker for its date history and dependencies, at the foot of the window, or via Show detail on the marker for a panel beside the dot. The timeline and the ring open the same record.
A ring with no markers says whether the system is awaiting data entirely, or simply has nothing inside this window.
Data table — every record behind both visuals. Built from the same array the timeline and ring read, so it cannot drift out of step with them.
Filter by system, by a month range, by frequency, or by searching the milestone text. Filters combine, and the count below the table reports what is showing.
Month is the milestone's real position. Where several events share a month the visuals spread them across the month's cell to keep them apart — that spacing is ordering, not a day of the month.
Milestone names read as the program year followed by the event — "2028 Measure Package Submissions". The program year is the year the work belongs to, not the year of the deadline beside it; the two differ on 22 of the 60 records. Searching the milestone text searches the whole name, so a year finds every record in that program year.
Frequency now carries a value on every record, so its filter is live. Reviewed by and Reviewed date are still empty on every record and nothing is inferred into either.
Use this view to check the dataset. Anything wrong here is wrong in both visuals.