Crash test
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.