P1-5: lifecycle inference from the issue timeline (#5) #39
Reference in New Issue
Block a user
No description provided.
Delete Branch "p1-5/lifecycle-inference"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Stacked on #38 → #37. Retarget down the chain as each lands.
What
The board's Steeping and In-review columns were always empty (v0 could only place three columns honestly). This reads the real gitea issue timeline and fills all five — and derives the estimate-vs-actual working time the calibration fit (D3) will learn from.
Core (
@commitea/core)inferLifecycle(issue, events, asOf)— five-column inference: closed → done; open PR ref → review; commit ref → steeping; any triage signal (label/milestone/assign, or a current label) → triage; else diagnosis. Earliest event of each kind fixes the stage timestamp.actualWorkingDays(work-start → close — the actual calibration learns from) andsteepingDays(first commit → now) for the age badge.workingDaysBetween()— whole Mon–Fri days in [start, end), day-granular.normalizeTimeline()+client.getIssueTimeline()— map gitea's raw timeline (label/milestone→triage, commit_ref→commit, pull_ref→pull, close, reopen), drop the rest. Paginated.App
reconcilefetches every issue's timeline, returns it keyed by number; threaded through the bridge →useBacklog→ board/focus.issuesToBoardColumns+scheduleFocusruninferLifecycle: real Steeping/In-review columns, steeping-agedaysbadge, focus-card steeping badge.Live result
Against the real repo: Diagnosis 0 · Triage 17 · Steeping 0 · In-review 8 · Done 9. Done holds merged work; In-review holds issues with open PRs (#9 scheduler, #10 Monte Carlo — the live PRs).
Known refinements (later)
pull_reffires on any PR mention, so an issue merely referenced in a PR body can read as In-review; distinguishing a closing ref from a mention needs the PR link's state.Verified
63 core tests green (15 lifecycle:
workingDaysBetween+ the five transitions + earliest-event + fallback) · desktop typecheck clean · 14 fixture e2e green · live spec asserts Done is populated from real events.🤖 Generated with Claude Code