Roadmap
What's shipped, what's in flight, what's gated on hardware.
Tracked against the engineering spec at
docs/superpowers/specs/2026-04-29-revised-roadmap.md.
Sprint A — foundation cleanup ✓
- A1 — drop legacy StageMode / DelayPreset / ParMode from the live path
- A2 — TrainingMode is the sole mode enum, closed-set documented
- A3 — Drift v1→v2 Attempt schema migration (+20 columns, backfill UUID)
- A4 — single Results / Analytics surface, _DoneOverlay race fixed
- A5 — HF display contract: 2-decimal everywhere, ≥ 0.00, helper + tests
- A6 — welcome cover deleted from boot path
- A7 — home screen: mode buttons above the fold
- A8 — help screen rewrite around the new live flow
Sprint B — calibration & detection trust ✓ (code) / ☐ (field)
- B1 — real EnvironmentChecker inputs (no more 0.7 / 0.1 hardcodes)
- B2 — test-shot gate before live
- B3 — SAM tap-to-segment default ON
- B4 — visible 5-4-3-2-1 prep countdown
- B5 — calibration re-validation on REPEAT (auto SAM centroid compare)
- B6 — debug-share zip on Results screen
- B-tech — 3-layer detection pipeline, 5-filter validator, weighted confidence, per-candidate JSONL log
- B7 — 10×Free Drill + 10×Draw 2-Shots field validation on the ambassador's hardware (FP < 5 % / miss < 5 % across 4 lighting conditions)
Sprint C — drills foundation ✓
- C1+C2+C3 — DrillTemplate first-class, 3 built-in drills, drill-only par wiring
- C4 — per-drill stats in analytics
- C5 — drill picker UI + boot path
- C6 — drill progression mastery rule on each picker tile
Sprint D — multi-device sync ✓ (infra) / ☐ (2-phone E2E)
- D1 — schema additions (multidev_session_id, device_role, time_offset_to_master_ms)
- D2 — NTP-style time offset sync + ClockDriftMonitor
- D-fs.5 — MasterEventStore with dedupe + sort-by-global-time invariant
- D-fs.4 — MasterSession state machine with grace-window finalisation
- D-cloud — Dart shelf relay (this server) with WebSocket pub/sub by 6-digit code
- D-client — RelayClient transport, MultiDeviceHomeScreen UI, heartbeat sender, disconnect banner
- D-fs.11 — 2-phone field test (10 normal + 5 airplane mode + 5 master network loss)
Coaching engine (§3.2 / §3.7–3.10) ✓
- DerivedMetrics + zero-shot guard (§3.9.2)
- BaselinePhase building / basic / full (§3.7.5)
- SkillTier internal-only (§3.10.3)
- ConfidenceCalculator with reasons (§3.2.7 / §3.10.9)
- CoachingEngine priority rules (§3.9.4) + tier-tagged phrases (§3.10.4)
- ShooterBaseline (§3.10.2) + DrillProgressionAdvisor (§3.10.5)
- Result-screen card with strict §3.9.9 layout
- Persistence — confidence + insight ids saved on Attempt rows
- Trust degradation §3.5: 3-LOW prompt, INVALID excluded from PB
Performance contract (§3.4) ✓
- PerfMonitor singleton, 4 latency budgets, debug overlay
- Two-strikes regression detector → remote log entry
practicalhit.com platform — this site
- P0 — telemetry endpoints (attempt, detection_log, crash) + admin dashboard
- P0 — Flutter TelemetryService + crash hook
- P1 — public leaderboards + server-verified anti-cheat
- P2 — shooter handles + profiles + weekly challenge
- P3 — adaptive: cohort percentiles + miss heatmap + trend nudges
- DNS — buy practicalhit.com (currently parably.bunnybag.space)
- iOS build (post-launch)
Demoted / out of scope
- Cloud accounts + global leaderboards (anonymous device id is enough at staging)
- M5Stack slave cameras (post Sprint D, optional)
- Video replay / per-shot scrubbing (storage cost too high)
- Friends / chat / social (this is a scoreboard, not a network)