# engineer — Jira statusDurations + movements + chart #17 **Date:** 2026-08-27 · v2.3.0 ## Built - **Seed**: `dump-to-archives.mjs` enriches the jira map with `statusDurations` (ms) from `jira_board_state.colIssues[*]._statusDurations` (keyed to RITM via customfield_26001), and adds `jiraColumns` (workflow order) to config. 95 jira entries / 73 DB tickets get durations. - **Types**: `JiraInfo` += `statusDurations: Record`, `movements:{at,who?,from?,to?}[]`. `ForgeConfig` += `jiraColumns`. - **Server**: `analytics.getJiraDurations()` averages `jira.statusDurations` per status (ms→days), in `jiraColumns` order, min-2 tickets. `GET /api/analytics/jira-durations` (requireRole pm). - **Client**: Active-stats page fetches it and renders a "Jira status durations (avg days)" BarList. - **Extension**: `collectFromJira` adds `expand=changelog`; `jiraFromChangelog(issue)` reconstructs time-per-status (created → transitions → now) and movements, sent inside `jira`. ## Verified (live) - `/api/analytics/jira-durations` → 18 statuses, workflow-ordered (Analysis…Closed) then extras; e.g. UAT 16.1d/21, Closed 23.5d/16, In-Progress 4.9d/37. server+client tsc clean; build OK; 9/9 tests. ## Not yet: live changelog untested (no Jira instance); movements only stored (chart #19 later). ## Next: done.