-- Track per-account failed login attempts for lockout enforcement (F-08). -- One row per account; window_start resets when the window expires or on -- a successful login. The DB layer enforces atomicity via UPDATE+INSERT. CREATE TABLE IF NOT EXISTS failed_logins ( account_id INTEGER NOT NULL PRIMARY KEY REFERENCES accounts(id) ON DELETE CASCADE, window_start TEXT NOT NULL, attempt_count INTEGER NOT NULL DEFAULT 1 );