01232e8e21
The post-update state.db integrity guard called verify_sqlite_integrity() with max_bytes=0, which disables the size ceiling and forces a full PRAGMA integrity_check. That pragma walks every b-tree page in the file, so its cost scales with database size — measured on a real 30 GB state.db: 143.5s with a cold page cache (worse under an update's memory pressure), with zero output on screen. The update looks hung right after "✓ Code updated!" and a CPU sits pegged. Multi-GB session databases are normal for heavy users, so a size-unbounded check is never an acceptable default on the update path. - verify_sqlite_integrity(): max_bytes now defaults to DEFAULT_INTEGRITY_CHECK_MAX_BYTES (2 GiB) instead of 0. max_bytes=0 remains the explicit opt-in for a full scan. - The oversized path no longer degrades to a header-only check: it adds a constant-time structural probe (read-only open + schema_version + sqlite_master read) so the malformed-schema class is still caught, not just the #68474 zeroed-file signature. - Drop the explicit max_bytes=0 at the post-update guard and in copy_db_and_verify() so both inherit the bounded default. Measured on the reporter's real 30 GB state.db: 143.5s cold → 0.001s, still valid=True. Corruption detection verified at multi-GB scale for both classes (zeroed header, malformed schema) — both still fail closed. Tests: default-is-bounded invariant, oversized probe catches malformed schema, max_bytes=0 still forces the full check.