The store every money movement posts through stalled at roughly 25 transactions per second on a single account. The team read the resulting retry storm as insufficient capacity and wanted to scale the database out.
I reconstructed a failing request query-by-query from the logs and found a 28.5ms UPDATE sitting in lock wait. The design held one row per account and updated it on every posting, so concurrent writers serialised behind a single row lock. The system was contended, not underprovisioned — and adding capacity would have made it worse, because more writers means more contention on the same row.
I re-architected it onto hash-partitioned buckets, so a hot account's balance spreads across buckets that grow and shrink with measured write contention. A control loop sizes the partition set, bounded by a growth cap per cycle and a cross-pod cooldown so concurrent pods cannot oscillate a hot account. Accounts partition independently, so throughput now scales horizontally.
The decision I would defend hardest: I built the reconciliation and self-repair harness before migrating. It caught a snapshot-ordering defect and a floating-point precision drift while both were still cheap. On a ledger, a correctness bug found in production is not a bug — it is someone's money.