Risk Register

Cross-phase risks. Update as discovered.


Active risks

IDRiskPhaseLikelihoodImpactOwnerMitigationStatus
R-01LIFF iOS Safari WebView quirks break auth1MHJulianUse in-memory token (1.D-3); test matrix iOS+AndroidOpen
R-02LINE Pay merchant onboarding delays > 4 weeks3MMr_gotoShip MVP without LINE Pay (3.D-2); add laterOpen
R-03HMAC secret leaks → unauthorized webhooks0+LHJulianKey versioning (0.D-1); rotation; restrict log outputOpen
R-04Multi-tenant LIFF routing breaks all tenants1LCRITICALJulianCanary tenant first; feature flag; explicit rollbackOpen
R-05Order webhook backlog if Curva down0+MMJulianBullMQ retry + DLQ + alerting (X.I-5)Open
R-06Identify endpoint hammered (DDoS or bot)1MMJulianRate limit per IP; CAPTCHA fallbackOpen
R-07LINE rate limits on push messages exceeded2+MMCurva teamReuse BulkMessage batching; monitor quotaOpen
R-08PII (line_user_id) exposed in logs0+MHJulianHash/mask in log statements; PII review of all new logsOpen
R-09Stripe + LINE Pay race condition (double charge)3LHJulianIdempotency key per order; lock on payment stateOpen
R-10Curva develop branch deploys break Pasukuru integrationallMMbothContract version in headers (v1, v2); both sides backward-compatOpen
R-11Pasukuru tenant-per-Host changes break LIFF flow1LHJulianDecision 1.D-1 final; explicit middleware orderOpen
R-12LINE Console LIFF endpoint URL drift between envsXMMr_gotoDocument each env’s IDs in vault; verify in CIOpen
R-13Member double-account (LINE-linked + email-linked)1MMJulianMerge UX in account settings (post-Phase 3 work)Open
R-14Agent commission attributed to wrong agent (multi-QR)3LMJulianFirst-touch attribution; document policyOpen
R-15Curva and Pasukuru DBs become inconsistentallMHJulianPeriodic reconciliation cron; smoke test alertsOpen
R-16Da Vinci accidentally touchedallLCRITICALJulianNO-TOUCH rule; pre-commit hook check (existing)Mitigated

Incident response framework

If something breaks in prod:

Severity scale

  • SEV-1 — payment fails, data loss, security breach → all hands, 15min response
  • SEV-2 — feature degraded for many users → 1hr response
  • SEV-3 — feature degraded for few users → next-day response
  • SEV-4 — cosmetic / non-critical → backlog

Runbook per system

  • Webhook delivery failures → check BullMQ board (X.I-4) → rerun from DLQ
  • LIFF identify failures → check Pasukuru BE logs → likely LINE API issue → fall back to web
  • Order events not received → check Pasukuru emit logs → check Curva inbound logs → check feature flags
  • Multi-tenant resolution wrong → check JWT decode logs → fall back to Host header (flag off)

Kill switches (feature flags)

FlagEffect when OFF
integration.order_eventsPasukuru stops emitting order webhooks
integration.webhook.v1_hmacFalls back to v0 bearer auth
integration.curva_inbound_receiverReturns 503; Pasukuru retries to DLQ
liff.enabledLIFF init disabled; pure-web mode
liff.auto_identifyManual login required
flex.pasukuru_pickerPicker button hidden
payment.line_payLINE Pay option hidden in checkout
tenant.line_resolutionFalls back to Host-only tenant resolution

All flips reversible within 5 min.


Pre-launch risk review

Before going to prod, walk through this register. For each Open risk:

  • Mitigation in place?
  • Tested?
  • Owner aware?

If any risk Open + not mitigated + Severity ≥ M → block launch.


Post-launch monitoring (first 48hr)

Watch:

  • Webhook DLQ depth (target: 0; alert: >10)
  • Identify endpoint p95 latency (target: <500ms)
  • LIFF init success rate (target: >99%)
  • LINE Pay sandbox vs prod confirm rate match
  • Curva inbound 5xx rate (target: <0.1%)

If anything red → activate kill switch, debug, re-deploy.