{
  "additions": 3365,
  "body": "## Spec\nSpec-ID: scenario-timeline-page\n[specs/scenario-timeline-page.md](specs/scenario-timeline-page.md)\n\n## Summary\nImplements the `scenario-timeline-page` spec.\n\n## Review\nReview-Owner: local\n\n## Acceptance Criteria\n- [ ] New route `/scenario/:id/timeline` registered in `routes.tsx`. Add `'timeline'` to `SCENARIO_SECTIONS` (introduced by `scenario-dashboard-shell`), **not** `SCENARIO_TABS`.\n- [ ] New component `frontend/src/components/scenario/TimelinePage.tsx`. Renders header (title \"Timeline\", subtitle from the mock, summary pill), toolbar (filter seg, sort select, `+ Add\u2026 \u25be` menu), residency band (existing read-only band from `LifeEventsTimelineStrip` \u2014 wrapped, not replaced), and **3 grouped sections in this order**:\n- [ ] **`EventCard`** matches `EventCard` in `timeline.jsx`: top row glyph + name + kind pill + years span + sub-line + signed amount; below it a per-card life-strip showing when the event is active across the plan timespan. Expanded state shows an inline editable form (current `LifeEventsTimelineStrip` row editor \u2014 wrap, don't rewrite).\n- [ ] Section header for each group shows count + a context-appropriate total + a `+ add` quick-add: `Income & benefits` \u2192 signed `+$NK/yr at peak`; `Expenses` \u2192 signed `\u2212$NK/yr at peak` (lifestyle entries included in the total); `Strategies` \u2192 unsigned total of Roth conversion amounts across all years (e.g. `$240K over 8 yrs`), no `+`/`\u2212` prefix.\n- [ ] `+ Add\u2026 \u25be` dropdown reuses the current `LifeEventsTimelineStrip` `onAddEvent(kind: StripAddKind)` add flow. The current `StripAddKind` union (`LifeEventsTimelineStrip.tsx:34`) is `'income' | 'expense' | 'lifestyle' | 'benefit' | 'relocation' | 'roth-conversion' | 'retirement-A' | 'retirement-B'`. The menu must surface every **life-event** creation kind (i.e. all `StripAddKind` values except the retirement markers \u2014 `retirement-A` and `retirement-B` are retirement-timing controls that live on Essentials, not Timeline) so no existing creation path is silently dropped:\n- [ ] Filter segmented control filters cards in place (no re-fetch). The mock shows 4 buttons; this spec extends to **5** to cover all groups:\n- [ ] Dashboard `TimelineTile` (from `scenario-dashboard-shell`) navigates to `/scenario/:id/timeline` instead of opening the slide-over.\n- [ ] Mobile (`v4-mob-body` + `mobile-add-bar` in the mock): same content stacked vertically; sticky `+ Add event` bar at the bottom.\n- [ ] Playwright test at `frontend/e2e/ui-contract/scenario-timeline-page.spec.ts`: create an event of each kind, edit one, delete one \u2014 verify dashboard tile reflects updated count + range.\n\n## Known Issues\nNone.\n",
  "changed_files": 12,
  "created_at": "2026-05-16T12:28:33Z",
  "deletions": 305,
  "files": [
    {
      "additions": 132,
      "changeType": "ADDED",
      "deletions": 0,
      "path": "frontend/e2e/ui-contract/scenario-timeline-page.spec.ts"
    },
    {
      "additions": 6,
      "changeType": "MODIFIED",
      "deletions": 0,
      "path": "frontend/e2e/ui-contract/upgrade-intent.spec.ts"
    },
    {
      "additions": 50,
      "changeType": "MODIFIED",
      "deletions": 0,
      "path": "frontend/src/App.tsx"
    },
    {
      "additions": 20,
      "changeType": "MODIFIED",
      "deletions": 33,
      "path": "frontend/src/components/ScenarioDashboard.test.tsx"
    },
    {
      "additions": 36,
      "changeType": "MODIFIED",
      "deletions": 2,
      "path": "frontend/src/components/ScenarioDashboard.tsx"
    },
    {
      "additions": 4,
      "changeType": "MODIFIED",
      "deletions": 270,
      "path": "frontend/src/components/ScenarioForm.tsx"
    },
    {
      "additions": 268,
      "changeType": "ADDED",
      "deletions": 0,
      "path": "frontend/src/components/scenario/RelocationSubSections.tsx"
    },
    {
      "additions": 1885,
      "changeType": "ADDED",
      "deletions": 0,
      "path": "frontend/src/components/scenario/TimelinePage.tsx"
    },
    {
      "additions": 574,
      "changeType": "ADDED",
      "deletions": 0,
      "path": "frontend/src/components/scenario/useTimelineForm.ts"
    },
    {
      "additions": 1,
      "changeType": "MODIFIED",
      "deletions": 0,
      "path": "frontend/src/routes.tsx"
    },
    {
      "additions": 378,
      "changeType": "MODIFIED",
      "deletions": 0,
      "path": "frontend/src/styles.css"
    },
    {
      "additions": 11,
      "changeType": "ADDED",
      "deletions": 0,
      "path": "frontend/src/utils/relocationRegimes.ts"
    }
  ],
  "merge_commit": "5c07b11ee76ba2144c9353a612eac1f096222730",
  "merged_at": "2026-05-18T15:36:49Z",
  "number": 834,
  "repository_visibility": "private",
  "title": "Spec: scenario-timeline-page"
}
