DUMMY_HASH + bcrypt.compare on user-not-found and inactive paths in Auth.js authorize() (src/auth.ts). Vitest guard in loginTimingEqualization.test.ts. Shipped as Phase D step 1.
Status: done (2026-05-24) · Source: [[Projects/personal-finance-notion/context/audit-2026-05-17-auth|Auth audit 2026-05-17 §H2]]
DUMMY_HASH constant; compare before InvalidCredentials when !user || !user.isActiveuser.save() on not-found pathsrc/lib/auth/loginTimingEqualization.test.tsNone (optional manual 20× curl timing check is ops/QA, not tracked separately).