Roadmap Timeline
Generates a complete, self-contained HTML visualization by (1) interviewing the user or parsing their data, (2) constructing and validating a JSON document, then (3) rendering that JSON into HTML using assets/roadmap-timeline-template.html. The JSON is the authoritative source of truth; the HTML is fully determined by it.
Step 1: Determine the Data Source
Check what the user has already provided before asking anything:
- SharePoint lists: Call
list_items on the relevant lists. Read all needed columns before proceeding.
- CSV or table pasted in chat: Parse all rows. Do not ask for data you already have.
- Verbal description only: Proceed to Step 2.
Step 2: Interview the User
If the data or intent is not fully clear, ask these questions in a single message — not one at a time:
- Topic: What is this timeline about? (e.g., "Q3 product launch plan," "cloud migration phases," "new employee onboarding")
- Date range: What is the overall span? (start and end dates for the full view)
- Swimlanes / tracks: Are there parallel workstreams or teams? (e.g., "Engineering," "Product," "Marketing") If yes → roadmap mode. If items are point-in-time events only → milestones mode.
- Items: List the phases or milestones with their dates, owners, and status.
- Palette: Warm paper (cream/terra-cotta), deep ink (dark/gold), clean white (white/green), or slate (gray/blue)? Default to slate for roadmaps, warm-paper for milestone lists.
- Footer: Any footer text (date, project name, audience)?
Confirm your understanding before building the JSON.
Step 3: Choose the Rendering Mode
Roadmap mode — use when items have start and end date ranges (duration blocks):
- Items span days, weeks, or months
- Multiple parallel workstreams exist (or a single flat track is still cleaner as roadmap)
- The user mentions "phases," "sprints," "quarters," "swimlanes," or "gantt"
Milestones mode — use when items are point-in-time events:
- Items have a single date (no duration)
- The user mentions "milestones," "deliverables," "checkpoints," "onboarding steps," or "run of show"
When data is mixed (some ranges, some points), use roadmap mode and mark point-in-time items as "milestone": true.
Step 4: Build and Validate the JSON Document
Construct the JSON object. Full schema:
report object
| Field |
Required |
Description |
title |
yes |
Report title, shown in header strip |
subtitle |
no |
Subtitle or context line |
date_range_start |
roadmap only |
ISO date string, e.g. "2026-01-01" |
date_range_end |
roadmap only |
ISO date string, e.g. "2026-06-30" |
palette |
yes |
warm-paper, deep-ink, clean-white, or slate |
footer |
no |
Footer text |
mode string
"roadmap" or "milestones".
swimlanes array (roadmap mode only)
| Field |
Required |
Description |
id |
yes |
Short identifier, e.g. "eng" |
label |
yes |
Display name, e.g. "Engineering" |
items array
| Field |
Required |
Description |
id |
yes |
Unique short identifier, e.g. "item-1" |
title |
yes |
Display label for the block or card |
swimlane_id |
roadmap only |
References a swimlane id |
start |
yes |
ISO date string |
end |
roadmap mode |
ISO date string (omit for pure milestones mode) |
status |
yes |
on-track, at-risk, delayed, complete, or planned |
milestone |
no |
true if this is a point-in-time event within a roadmap |
owner |
no |
Text name of the owner (no Person column — plain text only) |
description |
no |
Additional detail shown in tooltip (roadmap) or card body (milestones) |
dependencies |
no |
Array of id strings; rendered as a text note, not as arrows |
Date-to-Percentage Computation (roadmap mode)
The skill pre-computes all layout positions as percentages. No JavaScript is required for positioning — all values are embedded in the HTML as inline styles.
| Value |
Formula |
total_days |
Days between date_range_end and date_range_start (inclusive span) |
item_left_pct |
((item_start − date_range_start) / total_days) × 100 |
item_width_pct |
((item_end − item_start) / total_days) × 100 |
today_left_pct |
((today − date_range_start) / total_days) × 100 |
Rules:
- Clamp all results to 0.00–100.00
- Round to 2 decimal places
- Minimum rendered width for any block: 1.50% (so very short items are always visible)
- If
item_end equals item_start, treat the item as a milestone (diamond) regardless of the milestone flag
Today's date is known from the system context. If today falls outside the date range, omit the today-line entirely.
Validation Checklist
Run every check before rendering. Fix any failure before proceeding.
Document level:
Per item:
Computation check:
Step 5: Render the HTML
Read assets/roadmap-timeline-template.html.
For both modes:
- Replace
{{REPORT_TITLE}} in <title> with a concise page title.
- Replace
{{PALETTE_CLASS}} on <body> with palette- + palette name.
- Replace
{{HEADER}} with the .rpt-header strip (title, subtitle, date range).
- Replace
{{CONTENT}} with the full rendered visualization (roadmap or milestones).
- Replace
{{FOOTER}} with footer text (or empty string).
- Replace
{{INLINE_SCRIPT}} with any enhancement JS (tooltip hover, palette switcher if needed).
See references/components.md for the exact HTML structure of each mode.
Roadmap Mode Rendering
Generate the month-marker ruler, then one .swimlane row per swimlane entry. Within each row:
- Render phase blocks as
<div class="phase-block status-{status}"> with inline left and width percentage styles.
- Render milestone items as
<div class="milestone-diamond status-{status}"> with inline left percentage style.
- Render the today-line as
<div class="today-line"> with inline left percentage style (omit if today is out of range).
Milestones Mode Rendering
Group items by phase (if phases are named in description or a group field is provided). For each item render a .milestone-card with a date badge, status dot, title, owner, and description.
Hard Constraints
- No external URLs, CDN links, or web fonts in the output HTML.
- No
<script src> tags. All JavaScript must be inline.
- All data values must be pre-rendered into the HTML — the page must be fully correct with JavaScript disabled. JS adds tooltips and animations but must never be required for correctness.
- Do not generate Python, PowerShell, or any other scripts — output is always the HTML file.
- Do not render until the validation checklist passes.
- Owner fields must be plain text — no Person column types.
1---2name: roadmap-timeline3description: Generates a polished, self-contained HTML roadmap or milestone timeline from any project data — SharePoint lists, pasted tables, or a verbal description. Use when asked to build a project roadmap, product roadmap, migration timeline, release plan, onboarding sequence, run-of-show, phase plan, or any visual schedule showing items over time. Interviews the user if data is incomplete, constructs a validated JSON document, then renders it into a single sandbox-safe HTML file. Chooses between two layouts automatically: horizontal roadmap with swimlanes (for phase-range data) or vertical milestone list (for point-in-time events). No external dependencies — output runs inside a SharePoint sandboxed iframe.4---56# Roadmap Timeline78Generates a complete, self-contained HTML visualization by (1) interviewing the user or parsing their data, (2) constructing and validating a JSON document, then (3) rendering that JSON into HTML using `assets/roadmap-timeline-template.html`. The JSON is the authoritative source of truth; the HTML is fully determined by it.910---1112## Step 1: Determine the Data Source1314Check what the user has already provided before asking anything:1516- **SharePoint lists**: Call `list_items` on the relevant lists. Read all needed columns before proceeding.17- **CSV or table pasted in chat**: Parse all rows. Do not ask for data you already have.18- **Verbal description only**: Proceed to Step 2.1920---2122## Step 2: Interview the User2324If the data or intent is not fully clear, ask these questions in a single message — not one at a time:25261. **Topic**: What is this timeline about? (e.g., "Q3 product launch plan," "cloud migration phases," "new employee onboarding")272. **Date range**: What is the overall span? (start and end dates for the full view)283. **Swimlanes / tracks**: Are there parallel workstreams or teams? (e.g., "Engineering," "Product," "Marketing") If yes → roadmap mode. If items are point-in-time events only → milestones mode.294. **Items**: List the phases or milestones with their dates, owners, and status.305. **Palette**: Warm paper (cream/terra-cotta), deep ink (dark/gold), clean white (white/green), or slate (gray/blue)? Default to slate for roadmaps, warm-paper for milestone lists.316. **Footer**: Any footer text (date, project name, audience)?3233Confirm your understanding before building the JSON.3435---3637## Step 3: Choose the Rendering Mode3839**Roadmap mode** — use when items have start and end date ranges (duration blocks):40- Items span days, weeks, or months41- Multiple parallel workstreams exist (or a single flat track is still cleaner as roadmap)42- The user mentions "phases," "sprints," "quarters," "swimlanes," or "gantt"4344**Milestones mode** — use when items are point-in-time events:45- Items have a single date (no duration)46- The user mentions "milestones," "deliverables," "checkpoints," "onboarding steps," or "run of show"4748When data is mixed (some ranges, some points), use roadmap mode and mark point-in-time items as `"milestone": true`.4950---5152## Step 4: Build and Validate the JSON Document5354Construct the JSON object. Full schema:5556### `report` object5758| Field | Required | Description |59|---|---|---|60| `title` | yes | Report title, shown in header strip |61| `subtitle` | no | Subtitle or context line |62| `date_range_start` | roadmap only | ISO date string, e.g. `"2026-01-01"` |63| `date_range_end` | roadmap only | ISO date string, e.g. `"2026-06-30"` |64| `palette` | yes | `warm-paper`, `deep-ink`, `clean-white`, or `slate` |65| `footer` | no | Footer text |6667### `mode` string6869`"roadmap"` or `"milestones"`.7071### `swimlanes` array (roadmap mode only)7273| Field | Required | Description |74|---|---|---|75| `id` | yes | Short identifier, e.g. `"eng"` |76| `label` | yes | Display name, e.g. `"Engineering"` |7778### `items` array7980| Field | Required | Description |81|---|---|---|82| `id` | yes | Unique short identifier, e.g. `"item-1"` |83| `title` | yes | Display label for the block or card |84| `swimlane_id` | roadmap only | References a swimlane `id` |85| `start` | yes | ISO date string |86| `end` | roadmap mode | ISO date string (omit for pure milestones mode) |87| `status` | yes | `on-track`, `at-risk`, `delayed`, `complete`, or `planned` |88| `milestone` | no | `true` if this is a point-in-time event within a roadmap |89| `owner` | no | Text name of the owner (no Person column — plain text only) |90| `description` | no | Additional detail shown in tooltip (roadmap) or card body (milestones) |91| `dependencies` | no | Array of `id` strings; rendered as a text note, not as arrows |9293### Date-to-Percentage Computation (roadmap mode)9495The skill pre-computes all layout positions as percentages. No JavaScript is required for positioning — all values are embedded in the HTML as inline styles.9697| Value | Formula |98|---|---|99| `total_days` | Days between `date_range_end` and `date_range_start` (inclusive span) |100| `item_left_pct` | `((item_start − date_range_start) / total_days) × 100` |101| `item_width_pct` | `((item_end − item_start) / total_days) × 100` |102| `today_left_pct` | `((today − date_range_start) / total_days) × 100` |103104Rules:105- Clamp all results to 0.00–100.00106- Round to 2 decimal places107- Minimum rendered width for any block: 1.50% (so very short items are always visible)108- If `item_end` equals `item_start`, treat the item as a milestone (diamond) regardless of the `milestone` flag109110Today's date is known from the system context. If today falls outside the date range, omit the today-line entirely.111112### Validation Checklist113114Run every check before rendering. Fix any failure before proceeding.115116**Document level:**117- [ ] `mode` is `"roadmap"` or `"milestones"`118- [ ] `report.palette` is one of: `warm-paper`, `deep-ink`, `clean-white`, `slate`119- [ ] `items` array has at least one entry120- [ ] Roadmap mode: `report.date_range_start` and `report.date_range_end` are present and parseable as ISO dates121- [ ] Roadmap mode: `date_range_end` is after `date_range_start`122- [ ] Roadmap mode: `swimlanes` array has at least one entry123124**Per item:**125- [ ] `id` is unique within the `items` array126- [ ] `title` is present and non-empty127- [ ] `start` is a valid ISO date string128- [ ] Roadmap mode: `end` is present and not before `start`129- [ ] `status` is one of: `on-track`, `at-risk`, `delayed`, `complete`, `planned`130- [ ] Roadmap mode: `swimlane_id` references a valid swimlane `id`131- [ ] `dependencies` entries (if present) each reference a valid item `id`132- [ ] `item_left_pct + item_width_pct` does not exceed 101 (floating-point tolerance)133134**Computation check:**135- [ ] All percentage values computed and clamped to 0–100136- [ ] Milestone items have `item_width_pct = 0` (rendered as diamonds, not blocks)137- [ ] Today-line computed only when today is within the date range138139---140141## Step 5: Render the HTML142143Read `assets/roadmap-timeline-template.html`.144145For both modes:1461. Replace `{{REPORT_TITLE}}` in `<title>` with a concise page title.1472. Replace `{{PALETTE_CLASS}}` on `<body>` with `palette-` + palette name.1483. Replace `{{HEADER}}` with the `.rpt-header` strip (title, subtitle, date range).1494. Replace `{{CONTENT}}` with the full rendered visualization (roadmap or milestones).1505. Replace `{{FOOTER}}` with footer text (or empty string).1516. Replace `{{INLINE_SCRIPT}}` with any enhancement JS (tooltip hover, palette switcher if needed).152153See `references/components.md` for the exact HTML structure of each mode.154155### Roadmap Mode Rendering156157Generate the month-marker ruler, then one `.swimlane` row per swimlane entry. Within each row:158- Render phase blocks as `<div class="phase-block status-{status}">` with inline `left` and `width` percentage styles.159- Render milestone items as `<div class="milestone-diamond status-{status}">` with inline `left` percentage style.160- Render the today-line as `<div class="today-line">` with inline `left` percentage style (omit if today is out of range).161162### Milestones Mode Rendering163164Group items by phase (if phases are named in `description` or a `group` field is provided). For each item render a `.milestone-card` with a date badge, status dot, title, owner, and description.165166---167168## Hard Constraints169170- No external URLs, CDN links, or web fonts in the output HTML.171- No `<script src>` tags. All JavaScript must be inline.172- All data values must be pre-rendered into the HTML — the page must be fully correct with JavaScript disabled. JS adds tooltips and animations but must never be required for correctness.173- Do not generate Python, PowerShell, or any other scripts — output is always the HTML file.174- Do not render until the validation checklist passes.175- Owner fields must be plain text — no Person column types.