Client computeLiveProjection ignores snowball_exempt bills
parseUserAgent in ProfilePage.jsx has weak OS detection
updateCheckService.js Forgejo URL is hard-coded with no env override
isRamseyMode() called twice per snowball projection request
Client snowball projection duplicates server simulation (drift risk)
PATCH /api/snowball/order silently swallows invalid rows
PATCH /api/snowball/order doesn't exclude soft-deleted bills
Imported payments have no payment_source
rotateSessionId uses raw BEGIN/COMMIT/ROLLBACK instead of db.transaction()
Imported payments don't update debt balance (balance_delta always NULL)
Mortgage category not auto-detected as debt (snowball DEBT_LIKE_CLAUSES gap)
Phase 2: Data Sources & Shared Transactions
Phase 1: Standardize Payments as the Manual Bill Payment Model + Surface on Bills Detail