Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Phases & Gates

Five phases. Each ends in a hard go/no-go gate owned by a named person. A later phase may overlap an earlier one, but a gate must pass before the work it guards is declared done. Phase 4 (cutover) cannot begin until Gates 0–3 are ✅.

Status legend: ⬜ not started · 🟡 in progress · ✅ done · 🔴 blocked


Phase 0 — Stand up test infrastructure (blocker for everything)

The docs claim this exists; it does not. Build it first or the rest is fiction.

#TaskOwnerStatus
0.1Install + configure Vitest in apps/ionic and packages/*; add test:unit + coverage scripts; wire into turbo.json (cached)Saiqul + Afif⬜
0.2Install + configure Cypress (component + E2E) against dev-server; add test:e2e scriptAfif⬜
0.3Add Playwright for cross-browser + mobile-viewport smoke (Capacitor web target)Afif⬜
0.4Make lint, typecheck, test:unit, test:e2e required PR checks (GitHub Actions + branch ruleset on main)Saiqul⬜
0.5Define coverage targets per FSD layer; fail CI below thresholdDetta⬜
0.6Correct stale “tests exist” claims in CLAUDE.md + project noteSaiqul⬜

Gate 0 — owner: Saiqul. CI green on all four checks against a placeholder test = infra proven end-to-end. State: ⬜


Phase 1 — Parity inventory + test pyramid (overlaps Phase 0)

Cannot test “parity” without a parity definition. Consolidate the 11 loose migration docs.

#TaskOwnerStatus
1.1Build screen-by-screen parity checklist — every customer-facing legacy screen mapped to monorepo status. See 04-parity-checklist.mdTompi⬜
1.2Critical-path catalogue — rank flows by revenue/traffic (discovery → booking → package → payment → account → reviews)Tompi + Growth⬜
1.3Unit tests land with each ported shared-* function/store (TDD per PR, not after)Afif + Growth⬜
1.4Component tests for ported shared-uiGrowth⬜

Gate 1 — owner: Tompi + Detta. Parity checklist 100% populated; every “ported” screen has its critical-path E2E written (may still be red). State: ⬜


Phase 2 — E2E critical-flow coverage + feature freeze

#TaskOwnerStatus
2.1Feature freeze on hh-pegasus — new features → monorepo only; legacy = bugfix onlyTompi⬜
2.2Author E2E (Cypress + Playwright) for all ranked critical paths against staging (hh-ionic-staging.pages.dev)Afif + Detta⬜
2.3Payment/booking flows tested against sandbox/test-mode API — never prod payment railsDetta + backend⬜
2.4Cross-device matrix: iOS Safari, Android Chrome, desktop Chrome/Safari/Firefox + mobile viewportsDetta⬜
2.5Accessibility smoke (axe in Cypress) on critical screensAfif⬜

Gate 2 — owner: Detta (QA sign-off). 100% of ranked critical-path E2E green on staging across the device matrix; coverage thresholds met. State: ⬜


Phase 3 — Non-functional / stability hardening

Functional parity ≠ stable. Cutover failures are usually perf/error-rate, not missing buttons.

#TaskOwnerStatus
3.1Performance budgets — Lighthouse CI on staging (LCP, CLS, TTI, bundle). Must be ≥ legacy parity. Use PERFORMANCE_IMPROVEMENT_PLAN.mdSaiqul + Afif⬜
3.2Error monitoring live before any traffic — Sentry (or equiv) + JS error-rate alertingSaiqul⬜
3.3Load/soak synthetic traffic against staging at expected peak; watch API error rate + CF PagesSaiqul⬜
3.4Rollback rehearsal — practice reverting CF Pages traffic split in staging; document runbookIrfan⬜
3.5Analytics/conversion-event parity (booking funnel events fire identically)Tompi + Growth⬜

Gate 3 — owner: Saiqul + Irfan. Perf ≥ legacy parity; error monitoring live + alerting; rollback runbook tested + documented. State: ⬜


Phase 4 — Canary cutover (gated, reversible)

Detailed steps in 05-canary-cutover-runbook.md.

#TaskOwnerStatus
4.1Internal dogfood (team + beta, header/cookie routing) — 3–5 daysTompi⬜
4.2Canary 5% real users — 24–48hIrfan + Saiqul⬜
4.325% → 48hIrfan⬜
4.450% → 48hIrfan⬜
4.5100% → 1-week soakIrfan⬜
4.6Decommission hh-pegasus infraIrfan⬜

Gate 4 (final) — owner: Tompi (business) + Irfan (execution). 100% on monorepo, 1-week clean soak, no rollback trigger fired → decommission legacy. State: ⬜