Repository navigation
Closed
Labels
app/pm-stackpm-stack (Pad/Grist) in developing-today/codepm-stack (Pad/Grist) in developing-today/codeeffort/mMedium: expected under 1 day of workMedium: expected under 1 day of workkind/featureNew feature or capability requestNew feature or capability requestpriority/normalOrdinary priority (the default)Ordinary priority (the default)source/queue-workerFiled or worked by the queue/worker pilotFiled or worked by the queue/worker pilottask/triageQueue packet kind: verify, reproduce, and route this itemQueue packet kind: verify, reproduce, and route this item
Description
Parent chain: #1184 → #1256 → this issue. GitHub currently caps #1184 at 100 direct sub-issues and rejects additional links (REST 422), so implementation slices are nested under #1256, already a native child of #1184; no existing parent links were changed.
Design context: #1256; doc/2026-11-01T21-07-00Z_design_pm-stack_forecasting/2026-11-01T21-07-00Z_design_pm-stack_forecasting.md (§1, §3). Depends on the reusable item-history source in #3981. Coordinate with #1281: reuse its history/throughput seam, but do not duplicate its charts.
Goal
Add pure, deterministic derivations for project/epic ETA distributions and item stall-risk explanations. The current project/coverage inputs do not contain enough item-level history to calculate these values.
Acceptance criteria
- ETA uses complete observed weekly item-history buckets, including zero-completion weeks, over trailing 4-week and 8-week windows; incomplete windows are excluded and the scope/sample are returned.
- One direct native child closure is the documented default unit; merged PRs do not double-count. Reopened issues are not counted as currently complete. Existing effort weights and open-ended/unsized work remain explicit and never create invented precision.
- With fewer than 3 completions or 4 complete weeks, the result is low-confidence/borrowed from a clearly named comparable scope or “not enough history”; with no defensible baseline, no ETA date is returned. Numeric forecasts include P50/P80 ranges, confidence, input coverage, and model version.
- Stall risk is a versioned, explainable 0–100 rule score with contributing reason codes/timestamps; first-observed blocker age is labelled a lower bound, and unavailable heartbeat/requeue signals stay unknown.
- Score ≥60 is surfaced as informational “at risk”; score alone does not create a Needs-you escalation. Tests cover missing history, zero pace, reopen, sparse samples, borrowed baseline, and each risk signal.
Metadata
Metadata
Assignees
Labels
app/pm-stackpm-stack (Pad/Grist) in developing-today/codepm-stack (Pad/Grist) in developing-today/codeeffort/mMedium: expected under 1 day of workMedium: expected under 1 day of workkind/featureNew feature or capability requestNew feature or capability requestpriority/normalOrdinary priority (the default)Ordinary priority (the default)source/queue-workerFiled or worked by the queue/worker pilotFiled or worked by the queue/worker pilottask/triageQueue packet kind: verify, reproduce, and route this itemQueue packet kind: verify, reproduce, and route this item
Activity
developing-today commentedon Nov 3, 2026
agent-note:v1
state: triaged (coverage pass)
Coverage pass 2026-11-03: reviewed in the fleet-wide per-issue pass (drift / overlap / already-handled / stale / blockers / ordering). Verdict: still live; queued in repo-health-code-pilot as triage at priority 40 (priority/normal). If this is already handled at current main, the triage closes it with evidence; if it needs splitting, the triage files the split.
Found via: coverage pass 2026-11-03
65 remaining items
dezren39 commentedon Nov 4, 2026
🤖 Agent note · picked up
direct; this lane works it per the runbookaggregator(forecast): compare as-of timestamps as instants, not strin…
dezren39 commentedon Nov 4, 2026
🤖 Agent note · parked — CI pending
aggregator(forecast): bound blocker age to effective asOf; unknown re…
Merge pull request #5236 from developing-today/queue/8962-3982-epic-eta
dezren39 commentedon Nov 4, 2026
🤖 Agent note · done
bun test test/forecast-3982.test.tson the laptop — 25 pass, 0 fail. Full aggregator suite: 1486 pass; the only failures are alerts/notifications suites failing to resolve theweb-pushpackage because this worktree has no node_modules install (empty directory) — pre-existing/environmental, disjoint from this diff (forecast.ts + its test only).