Skip to main content

SERVICE_RISK_REGISTER — billing-service

Risks tracked at service level, scored Likelihood × Impact (1–5 each, 25 max). Reviewed monthly. P1 items have a named owner and an active mitigation plan; P2 items have a watch in observability; P3 items are documented and accepted.

#RiskLikelihoodImpactScoreTierOwnerMitigation
R1PCI scope creep: a future contributor stores card data inadvertently (e.g., logging a processorRawResponse, joining a dev table that contains test PANs)3515P1SecurityCI guard rejecting PAN-shaped column names + Luhn-pattern strings in code, logs sample, outbox sample (see TESTING §9); architecture forbids payment-gateway-service from passing PAN to billing; PR review checklist item; quarterly DLP scan in audit-service
R2Cash variance fraud (insider): cashier and supervisor collude to under-report counted floats3515P1Finance OpsTwo-staff sign-off enforced cryptographically + AI cash pattern detector + nightly variance trend per actor + GM weekly review + drawer rotation policy in tenant playbooks
R3Dunning regulatory exposure: auto-suspending a tenant where local law requires written notice with N days lead time3412P1CompliancePer-tenant configurable gracePeriodDays and dunningNotificationTemplate; suspend step blocked if last dunning notification.sent.v1 < gracePeriodDays ago; legal review per market on plan launch
R4Cross-tenant data leak via misrouted connection2510P1Security4-layer defense (SECURITY_MODEL §2); cross-tenant attack test in CI; audit.cross_tenant_access alert
R5Multi-currency rounding drift over time: small per-folio residuals accumulate to a material number on the platform's books4312P2Finance EngBanker's half-up enforced; nightly reconciliation alert on Settlement.residual_micro != 0; quarterly platform-wide reconciliation against gateway; minimum residual absorbed via adjustment charge
R6Tax-rule out-of-date: jurisdiction changes a VAT rate; tenant doesn't update; incorrect tax issued4416P1Tenant SuccesstaxRules.effectiveTo field + taxRules.staleness job alerts after 180 days; per-jurisdiction subscription to gov-tax-board feeds where available; tenant-admin nudge on rule expiry
R7Invoice numbering gap or duplication after re-open or void3515P1Finance EngNumbering uses per-tenant + per-jurisdiction monotonic DB sequence with UNIQUE constraint; void preserves the number; re-open issues a new sequenced number; CI assertion on number monotonicity per tenant per day
R8Cash drawer "stuck" sessions block shift handover during prolonged offline period > shift length339P2EngineeringDesktop UX prominently displays pending close + "use cloud console to close" supervisor escape hatch (FAILURE_MODES §8)
R9AI false positive flood: anomaly detector overwhelms supervisors with low-quality signals; "alert fatigue" hides real fraud4312P2Engineering + FinancePer-tenant signal threshold; weekly precision review on a labeled sample; capability kill switch per tenant (AI_INTEGRATION §7)
R10Subscription invoice payment-method token revoked by processor (card expired, PayPal closed)4312P2EngineeringPre-cycle freshness check; tenant nudge 7d before cycle if token age > 11 months; processor-emitted token-status events update subscriptions.payment_method_token
R11Per-tenant schema migrator drift: a tenant skips a migration window, then runs into a forward-incompatible release3412P1SREMigrator is run for every tenant before deploying API revision that requires the new schema; expand-and-contract pattern across two releases; integrity audit job alerts on tenants > 2 schema versions behind
R12Sharia-compliant invariant bypass via API: caller posts kind='late_fee' with feeKind!='interest' to evade the rejection but text labels suggest interest248P3ComplianceDomain enforces feeKind taxonomy; tax-engine rule blocks computation; copy review per template at launch
R13PDF tampering after issuance155P3SecurityPDF embeds sha256(payload) signed by per-tenant key; verifier endpoint; PDFs stored in CMEK GCS with versioning
R14Data-residency mismatch for Saudi tenant (request to host in me-central1)339P2SREv2 work item to add per-tenant region pinning; until then, contractual disclosure in tenant onboarding
R15Outbox drainer single-point bottleneck during burst (e.g., POS posting hour)236P3SREDrainer scales on outbox lag custom metric; per-schema sharding tactic in FAILURE_MODES §4
R16Test data with PAN-shaped strings leaks into production logs via fixture import155P3SecurityFixtures live in test/; production code path cannot import; CI fence; runtime DLP scan

Risk-tier conventions

  • P1 (≥ 12 or any catastrophic): active mitigation, named owner, monthly review; documented in this register.
  • P2 (8 ≤ score < 12): observed via metrics / alerts; quarterly review.
  • P3 (< 8): accepted; documented; reviewed annually.

Cross-references