Summary
Upgrading 0.6.24 → 0.6.25 makes an existing, healthy archive completely unopenable on Linux. Every readonly-first surface fails with fsqlite.open_read_failure; cass status reports db=open_failed and Search unavailable (database unusable).
The archive itself is fine. Downgrading the binary only — same DB file, byte-identical, mtime unchanged — restores full service immediately. I alternated the two binaries against the same untouched database and the result is perfectly deterministic.
This looks like a regression from the headline change in v0.6.25 (fsqlite =0.2.1 → =0.3.1), which reworked exactly this path ("sidecar-less read-only first-contact opens", fsqlite GH#140).
Reproduction
Both binaries run from separate paths against the same live data dir. No repair, rebuild, or mutating command was ever run.
db mtime before: 2026-08-15 23:17:27.726159863 -0700
0.6.25 run 1: db=open_failed
0.6.25 run 2: db=open_failed
0.6.25 run 3: db=open_failed
0.6.24 run 1: db=available
0.6.25 run 4: db=open_failed
0.6.24 run 2: db=available
db mtime after: 2026-08-15 23:17:27.726159863 -0700
4/4 failures on 0.6.25, 2/2 successes on 0.6.24, DB unmodified throughout.
Under 0.6.24 the archive is healthy and search works normally — e.g. cass search "frankenmermaid" --json returns 282 hits via the tantivy backend, db=available.
Verbatim error (0.6.25)
Database:
Exists, but could not be opened
Error: Failed to open state-meta database at /home/ubuntu/.local/share/coding-agent-search/agent_search.db: readonly storage open failed (opening frankensqlite db readonly at /home/ubuntu/.local/share/coding-agent-search/agent_search.db); raw readonly open failed (opening raw frankensqlite db readonly at /home/ubuntu/.local/share/coding-agent-search/agent_search.db)
cass diag reports the same with (code 9).
cass doctor check --json:
{"status":"unhealthy","reason_code":"db_unavailable","health_class":"degraded-archive-risk",
"risk_level":"high","needs_rebuild":true,
"root_cause":{"family":"frankensqlite-storage","locus":"dependency","confidence":"confirmed",
"evidence_refs":[{"kind":"fsqlite.open_read_failure","locator":"diag"}]}}
What I ruled out
Not stale namespace sidecars (#393). I decoded agent_search.db-fsqlite-ns-use (40 bytes):
00000000: 4653 514c 4e53 3031 0101 0000 0000 0000 FSQLNS01........
00000010: 0801 0000 0000 003c 09e1 0000 0000 0000 .......<........
That encodes dev=0x801 (2049) and inode=0x3C09E1 (3934689). stat on the live DB returns exactly dev=2049 inode=3934689. The sidecar is current, not stale, and this host has not rebooted between the working and failing runs.
Not a dirty WAL (#389). RUST_LOG=debug shows the WAL opening cleanly immediately before the failure, and it is 32 bytes:
DEBUG WAL file opened page_size=4096 big_endian_checksum=false checkpoint_seq=51 valid_frames=0
WARN failed to open database for diagnostics: ... readonly storage open failed ... (code 9)
Not a general inability to open any DB. 0.6.25 against a fresh empty --data-dir behaves correctly and reports db=missing, next=index_full. The failure is specific to opening a pre-existing 0.6.24-era archive.
Impact / workaround
cass upgrade --yes --force installs 0.6.25 and leaves the archive unusable with no in-product path back — cass upgrade only moves forward. Recovery required a manually retained copy of the previous binary. Anyone upgrading without one loses search until they re-download 0.6.24 from Releases.
Workaround: reinstall the 0.6.24 binary (the DB needs no repair), and set skipped_version in ~/.local/share/coding-agent-search/update_state.json to avoid the TUI re-prompting.
Worth noting: doctor check sets needs_rebuild: true and risk_level: high on an archive that is provably intact. Acting on that recommendation would trigger a reconstruct of a 9.4 GB data dir to fix a problem that is entirely in the binary. Related in spirit to #374 and #396.
Environment
- cass 0.6.24 (working) vs 0.6.25 (failing), official
cass-linux-amd64.tar.gz, checksum verified
- Ubuntu 26.04 LTS, kernel 7.0.0-29-generic, x86_64
- ext4,
rw,relatime,errors=remount-ro,commit=30, 205 GB free
- Data dir 9.44 GB total; canonical DB 1.63 GB; WAL 32 B; lexical index 387 MB; raw mirror 6.07 GB
- Archive state at time of failure: lexical stale-but-searchable, semantic backfill in progress
- This archive has pre-existing FTS5
%_data shadow damage (long-standing, benign — search runs on tantivy). It does not prevent 0.6.24 from opening the DB.
Summary
Upgrading 0.6.24 → 0.6.25 makes an existing, healthy archive completely unopenable on Linux. Every readonly-first surface fails with
fsqlite.open_read_failure;cass statusreportsdb=open_failedandSearch unavailable (database unusable).The archive itself is fine. Downgrading the binary only — same DB file, byte-identical, mtime unchanged — restores full service immediately. I alternated the two binaries against the same untouched database and the result is perfectly deterministic.
This looks like a regression from the headline change in v0.6.25 (fsqlite
=0.2.1→=0.3.1), which reworked exactly this path ("sidecar-less read-only first-contact opens", fsqlite GH#140).Reproduction
Both binaries run from separate paths against the same live data dir. No repair, rebuild, or mutating command was ever run.
4/4 failures on 0.6.25, 2/2 successes on 0.6.24, DB unmodified throughout.
Under 0.6.24 the archive is healthy and search works normally — e.g.
cass search "frankenmermaid" --jsonreturns 282 hits via the tantivy backend,db=available.Verbatim error (0.6.25)
cass diagreports the same with(code 9).cass doctor check --json:{"status":"unhealthy","reason_code":"db_unavailable","health_class":"degraded-archive-risk", "risk_level":"high","needs_rebuild":true, "root_cause":{"family":"frankensqlite-storage","locus":"dependency","confidence":"confirmed", "evidence_refs":[{"kind":"fsqlite.open_read_failure","locator":"diag"}]}}What I ruled out
Not stale namespace sidecars (#393). I decoded
agent_search.db-fsqlite-ns-use(40 bytes):That encodes
dev=0x801(2049) andinode=0x3C09E1(3934689).staton the live DB returns exactlydev=2049 inode=3934689. The sidecar is current, not stale, and this host has not rebooted between the working and failing runs.Not a dirty WAL (#389).
RUST_LOG=debugshows the WAL opening cleanly immediately before the failure, and it is 32 bytes:Not a general inability to open any DB. 0.6.25 against a fresh empty
--data-dirbehaves correctly and reportsdb=missing,next=index_full. The failure is specific to opening a pre-existing 0.6.24-era archive.Impact / workaround
cass upgrade --yes --forceinstalls 0.6.25 and leaves the archive unusable with no in-product path back —cass upgradeonly moves forward. Recovery required a manually retained copy of the previous binary. Anyone upgrading without one loses search until they re-download 0.6.24 from Releases.Workaround: reinstall the 0.6.24 binary (the DB needs no repair), and set
skipped_versionin~/.local/share/coding-agent-search/update_state.jsonto avoid the TUI re-prompting.Worth noting:
doctor checksetsneeds_rebuild: trueandrisk_level: highon an archive that is provably intact. Acting on that recommendation would trigger a reconstruct of a 9.4 GB data dir to fix a problem that is entirely in the binary. Related in spirit to #374 and #396.Environment
cass-linux-amd64.tar.gz, checksum verifiedrw,relatime,errors=remount-ro,commit=30, 205 GB free%_datashadow damage (long-standing, benign — search runs on tantivy). It does not prevent 0.6.24 from opening the DB.