Roadmap & Gantt
Created: 2026-07-14 Basis:
docs/STATUS-2026-07-13.md(35 commits, branchreview-backend-foundation) Horizon: W1 (week of Mon 2026-07-14) → W12 (week of Mon 2026-09-29) Assumptions: solo developer, ~5 productive days/week; estimates are deliberately buffered (friction, debugging, verification, external back-and-forth already baked in — generous, per request). External waits are filled with parallel workstreams. Calendar: W1 Jul 14 · W2 Jul 21 · W3 Jul 28 · W4 Aug 4 · W5 Aug 11 · W6 Aug 18 · W7 Aug 25 · W8 Sep 1 · W9 Sep 8 · W10 Sep 15 · W11 Sep 22 · W12 Sep 29
Tier-2 (Rust/Garage) is off the launch critical path (degrades gracefully) but on the monitoring-readiness path.
Legend (text Gantt): ██ active work · ▒▒ external wait · ·· idle · ◆ milestone
1. Estimates by workstream (large task → subtasks → buffered days)
WS1 — Forgejo remote + CI activation · ~8 days · unblocks everything
- Create Forgejo repo + push
review-backend-foundation— 1d - Make
ci.yamlgreen (build +cargo test+nix build .#zola-site) — 3d - Add
cargo clippy -D warnings+cargo audit+gitleaks— 2d - First green CI run + fix flakes — 2d
WS2 — Phase 1 security hardening · ~17 days
- Obtain CF Access team domain + audience (external wait) — 2–5d
- RS256 JWT verify on
/api/staff/*— 4d - Rate limiting
/api/booking+/api/photos/presign— 2d - Tighten CSP off
'unsafe-inline'— 4d - Constant-time sig compare + require
webhook_secretin prod — 1d - R2 bucket policy + presign-expiry audit — 2d
- Security review pass — 2d
WS3 — Infra + first deploy · ~14 days
- Public R2 bucket +
PHOTOS_PUBLIC_BASE+BOOKING_DOMAIN— 2d deploy-secretsto prod (needs real keys ready) — 1dwrangler deploy4 workers (first-deploy friction) — 3d- CF Pages publish (zola-site) — 1d
- Stripe webhook endpoint registration + test event — 2d
- DNS
forbrisbane.org+ DKIM/SPF (Resend) — 3d - Prod end-to-end test booking (test pay + refund) — 2d
WS4 — Testing & QA · ~22 days
- Playwright scaffold + booking E2E (en) — 4d
- zh + zh-Hant E2E — 2d
- Staff workflow E2E (dashboard/surcharge/cancel/photos/complete) — 4d
- Integration suite (Stripe test-mode webhook) — 3d
- k6 load run + tune to p95 < 500ms — 3d
- OWASP ZAP scan + remediate findings — 4d
- Fixtures + CI integration — 2d
WS5 — Monitoring & alerts · ~10 days
- Alert rules (
RefundCronFailure,MirrorLagHigh,DetailingServiceDown,SyncErrors,SurchargeStuck,HighMemory) — 3d - ntfy routing + cron refund-failure alert (
workers/cron/src/lib.rs:105) — 2d - CF Dashboard alerts (Worker errors, D1 latency, Queue depth, Cron) — 2d
- UptimeRobot — 1d
- Alert-fire verification (stop-services test) — 2d
WS6 — Notifications polish · ~15 days (partly deferrable)
- Delivery-status tracking (ClickSend/Resend webhooks → audit) — 4d
- Cross-provider fallback (ClickSend↔Resend) — 3d
- Staff ntfy push for new bookings (from worker) — 2d
- ACMA Sender ID registration verification (external) — up to 2wk wait
- Inbound SMS (customer replies) — 4d (can move post-launch)
WS7 — Tier-2 Rust service + Garage · ~20 days
- Finish
cf_metrics(CF Analytics API call,rust-service/src/cf_metrics.rs:95) — 3d build-image.yaml(container build/push to Forgejo registry) — 3d- Garage deploy in
nixos-redbeanco(cross-repo) — 4d detailing-service.nixk3s module + ExternalSecret/OpenBao — 4d- ArgoCD deploy +
/metricsscrape verify — 2d - Daily 8am ntfy business summary — 2d
- D1/R2 mirror verification (data in Garage) — 2d
WS8 — Feature gaps + cleanup · ~9 days
- Customer status-tracking
/track?id=page — 3d - Services/pricing explainer page — 2d
- Form persistence (sessionStorage) — 1d
- Background Sync real-device verification — 2d
- Stale TODO cleanup + Lighthouse verify — 1d
WS9 — Launch prep · ~11 days + print lead time
- QR code design + order print (weatherproof) — 2d + 5–10d lead (order early)
- Staff training (PWA walkthrough) — 2d
- Runbook finalize — 2d
- Rollback drill — 2d
- Legal: Privacy/ToS published EN+ZH verified — 1d
- Prod e2e test booking (real payment + photos + MMS + refund) — 2d
WS10 — Post-launch · ongoing (not on finite Gantt)
2. Text Gantt (workstream-level, W1–W12)
Workstream W1 W2 W3 W4 W5 W6 W7 W8 W9 W10 W11 W12
Jul14 Jul21 Jul28 Aug4 Aug11 Aug18 Aug25 Sep1 Sep8 Sep15 Sep22 Sep29
WS1 Forgejo+CI ██ ██ ·· ·· ·· ·· ·· ·· ·· ·· ·· ··
WS2 Security ██ ██ ██ ██ ·· ·· ·· ·· ·· ·· ·· ··
WS3 Infra + deploy ·· ██ ██ ██ ·· ·· ·· ·· ·· ·· ·· ··
WS4 Testing & QA ·· ·· ██ ██ ██ ██ ██ ·· ·· ·· ·· ··
WS5 Monitoring ·· ·· ·· ·· ██ ██ ██ ·· ·· ·· ·· ··
WS6 Notifications ·· ·· ·· ·· ██ ██ ██ ██ ·· ·· ·· ··
WS7 Tier-2 + Garage ·· ·· ·· ██ ██ ██ ██ ██ ·· ·· ·· ··
WS8 Feature gaps ·· ·· ██ ██ ██ ·· ·· ·· ·· ·· ·· ··
WS9 Launch prep ·· ·· ·· ·· ▒▒ ·· ·· ██ ██ ██ ██ ··
Post-launch (ongoing) ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ·· ██→
Milestones ·· ·· ·· ◆A ·· ·· ·· ·· ·· ◆B ·· ◆C
Milestones
- ◆A W4 (Aug 4–10) — first production deploy (workers + Pages + Stripe webhook + test booking).
- ◆B W10 (Sep 15–21) — soft launch (internal / test customers; monitoring active).
- ◆C W12 (Sep 29–Oct 5) — public launch (QR placed at airport, full e2e verified).
3. Timeline (Gantt)
Pure-CSS timeline (no JS, renders in every browser). Red bars and red ◆ markers are the critical path; gold ◆ are non-critical milestones.
4. Critical path
WS1 (W1) → WS3 (W2–W4, ◆A) → WS4 (W3–W7) → WS9 (W8–W11) → ◆C (W12)
WS2 (security) runs parallel but must complete before ◆C; if the CF Access team-domain/audience info is delayed, WS2's JWT task becomes critical — chase it in W1.
5. Long poles / risks (the things that slip)
- CF Access team domain + audience (external) — can stall staff JWT. Submit request W1.
- ACMA Sender ID registration (external) — 1–2 wk; needed before real SMS. Submit W1.
- QR code print (external) — 1–2 wk lead. Order by W5 so it's ready for W10.
- Account verification (Stripe ABN, Resend domain) — external; gates WS3. Confirm W1.
- Garage / k3s (cross-repo
nixos-redbeanco) — coordination; can slip Tier-2 (not on launch path, but on monitoring-readiness). - First-deploy friction (Workers/Pages/Queues/Cron) — buffered in WS3.
6. Buffer / reality check
- Solo + external delays hitting: add +2–3 weeks → public launch could slip to mid–late October.
- Tier-2 (WS7) can be deferred past launch without blocking customers (it's async mirror/monitoring); prioritize launch-critical path first.