Skip to content

v0.6.25: existing 0.6.24 archive fails every readonly-first open (fsqlite.open_read_failure) on Linux; same untouched DB opens fine on 0.6.24 #402

Description

@ericziko

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions