PAR-212
Issue-delivery analytics: throughput, cycle/lead time per status, churn, status aging, burndown
Remaining scope of PAR-192 after the DORA dashboard shipped (tesks-ui/app/(app)/w/[workspace]/analytics/page.tsx + lib/sql/analytics.ts getDora + AnalyticsCharts). The issue-delivery metrics — the part that distinguishes this from usage/billing reporting (PAR-203) — are not built:
- Throughput (issues completed per period), churn (reopened), status aging (time sitting in each state), cycle/lead time per status, burndown (sprint progress, ties to PAR-199).
- Aggregation queries: extend
lib/sql/analytics.ts(onlygetDoratoday) with these; respect RBAC (who can see workspace analytics). - Charts/sections: more
AnalyticsChartscomponents + analytics-page sections (recharts already in use). - State-transition history: per-status timing currently must be reconstructed from
issue_eventrows wherekind='status'(there's no dedicated history table). Decide: derive fromissue_event(cheaper, lossy if events were ever pruned) vs add astatus_historytable written on state change. Needed for accurate per-status lead/aging.
Resources
- commitcc2f7b6 Emit a 'reopened' event on completed→open transitions (PAR-212 churn signal)ParadauxIO/tesks
Comments
tesks · Jun 17, 2026, 5:56 AM
Progress shipped (tesks-ui 7229393): throughput (completed/week + 90d), cycle time (median created→done + weekly trend), and status aging (open issues by current state with median time-in-state, derived from the last issue_event kind='status'). New getFlow DAL, ThroughputChart/CycleTimeChart, and a "Delivery flow" section + aging table on /analytics. Typecheck clean.
Still remaining on this issue:
- Churn (reopen rate) and proper per-status lead/cycle time — both need a reliable state-transition history; today
completed_atis nulled on reopen so reopens aren't distinguishable, and per-status durations can only be approximated fromissue_event. Decide derive-from-events vs astatus_historytable. - Burndown — needs sprint windows (ties to PAR-199 sprint dates).
tesks · Jun 17, 2026, 8:17 AM
Complete. Beyond the earlier throughput/cycle-time/status-aging, this adds:
- Churn: a
reopenedissue_event is now emitted on completed→open transitions (tesks cc2f7b6, tested), and the analytics page shows a Churn card (reopened/90d + % of completions) + a weekly reopened chart. - Sprint burndown: open-issues-remaining over the active sprint's window (
getActiveSprintBurndown) as a line chart.
Shipped tesks-ui c0a38d7 and browser-verified in the seeded harness (Churn card, reopened chart, and the Sprint-1 burndown curve all render). Closing PAR-212.
Activity
- tesks commented
- tesks changed status to Status → Done
- ParadauxIO linked a commit — Commit cc2f7b6 — Emit a 'reopened' event on completed→open transitions (PAR-212 churn signal)
- tesks changed status to Status → In Progress
- tesks commented
- tesks created the issue