23 lines
1.3 KiB
Markdown
23 lines
1.3 KiB
Markdown
# 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<string,number>`, `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.
|