ferrovec

Crash test

1,000 tab kills per browser. Zero acknowledged writes lost.

A write is acknowledged when its insert() promise has resolved; ferrovec only resolves it after the write has been appended to an on-disk write-ahead log in OPFS and flushed. The chaos harness repeatedly inserts a random batch of documents into a real ferrovec store in a headless browser and kills the page at a random moment, often while the next insert is still in flight, with no close() or flush(). It then reopens the store in a fresh page and checks that every acknowledged document is still there and still answers its own query.

Browser Cycles Acked writes Lost Torn tails recovered Reopen p50 / p95 (ms) Date Commit
Chromium 149 1,000 5,518 0 0 65.3 / 83.9 2026-10-10 c53f7b0
Firefox 151 1,000 5,445 0 0 171 / 303 2026-10-10 c53f7b0
WebKit 26.5 — — — — — not run could not launch on the test host

Strict durability mode, which is the default. The store grows to about 5,500 documents over a run, with a checkpoint every 50 logged records. A torn tail is a partially written last log record; it is cut off on reopen and never applied. These results cover tab and worker kills, not power loss: OPFS flush() is not an fsync. Rivals (EdgeVec, VecLite, @ruvector/wasm): pending.

Re-run it yourself: cd js && CYCLES=1000 BROWSER=firefox npm run test:chaos. The method and caveats are in RESULTS.md.