feat: capacity-aware scheduling (#8) — real focus factors drive every forecast #50
Reference in New Issue
Block a user
No description provided.
Delete Branch "feat/capacity"
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?
The last backlog item. Turns the single-serial-worker scheduler into a capacity-aware, multi-lane one. Configured members become lanes; an issue runs on its assignee's lane (or the earliest-free lane), its duration scaled by that lane's throughput (
focusFactor × allocation). Every forecast — Focus cone, Runway, milestone drill-in — is now capacity-aware.Core (
@commitea/core)CapacityMember,capacityPerWorkday,parseCapacityConfig(clamps, drops invalid →[]).scheduleWithCapacityreuses the v0 topo order + critical path, re-lays across lanes (layoutOnLanes/resolveLanes/makespan). Empty workers → the single serial plan verbatim (v0 untouched, lower risk).forecast(..., { workers }): each Monte Carlo trial lays sampled durations across the lanes and takes the makespan; the serial path is unchanged.SchedulableIssuegainsassignee,ScheduledItemgainsworker.App
capacity/members.jsonread (readCapacity+pmstate:capacitybridge);useCapacity→ workers;forecastBacklog/runwayView/milestoneViewpass workers. Runway Capacity card shows the real config.Live result
Capacity card is real — christian (focus 0.8 · 0.80 pd/day), stephen (0.6 × 50% · 0.30 pd/day) from pm-state. The P2 forecast shifts 32d → 37d — more honest: v0 assumed a mythical focus-1.0 worker; real focus factors (<1) make work realistically longer, and adding full-focus people speeds it up (unit-proven).
Config
Lives in pm-state (D4); seeded. Degrades to fixture/serial when absent. Estimates are ideal person-days (pm-state.md).
Verified
128 core tests green · desktop typecheck clean · 14 fixture e2e green · live: real capacity card + capacity-aware forecast shift.
The backlog is complete
With this, every screen and every forecast runs on real, capacity-aware data.
🤖 Generated with Claude Code