Phases carry time
Phases are ordered and may name a quarter, nothing finer. now / next / lateris derived from one pointer, current_phase, never written by hand.
One roadmap.yaml per project says what you are doing, in what order, and how far along it is. nextup rolls status up from the issues, opens issues an agent can pick up, and renders the same file for the team and for the public.
npx @hansenexus/nextup init --pagesPhases are ordered and may name a quarter, nothing finer. now / next / lateris derived from one pointer, current_phase, never written by hand.
Once an item has issues, its status comes from them: closed → done, labelled → in progress, all blocked → blocked. A manual status on a linked item fails validation.
Only milestones carry day-dates, and only with who committed to it and when. Undated milestones render as drafts. A computed date is not a date.
$ nextup status done p0-simcore 4 closed, nothing opendone p0-save-envelope #4 closed, nothing openin-progress p1-garage-loop #7 in progress (2 open, 1 closed)planned p1-first-screens 2 task(s) not dispatched yet (0 closed)proposed p2-staff manual status since 2026-09-07 P1 · now 2/5 done next: P2 · 0/2
nextup next lists the frontier; nextup dispatch <item>opens one issue per task with acceptance criteria, verification commands andBlocked-by: lines, ready only where blockers are closed. A read-only MCP server answers the same questions in a lane.
build --audience public writes a whitelisted JSON feed — no issue numbers, owners or notes — plus a static page. Render it with the React component or the web component, on any site, in any locale the file carries.