Summary
SimFS/DST excellently models crash + torn tail but never throws on append/fsync failure. Cannot prove fixes for B3 (fsyncgate), partial writes, or phantom-commit scenarios.
Audit ID: Section 3 High — Wave 2
Extends: #9 DST direction with concrete ship requirements
Gap
src/sim/simfs.ts:60-66 — append/fsync always succeed. No armAppendError, armFsyncError, or partial-byte append.
Required fault profiles (minimum)
| Profile |
Purpose |
armAppendError(partialBytes?) |
B3 torn mid-record |
armFsyncError() |
B3 latch after failed durability point |
error-then-continue schedule |
Ensure DB does not accept writes after fault |
| N× crash-recover-write loops |
Durability lower bound: all fsync'd commits before fault survive |
Integrate into src/sim/dst.ts seeded matrix alongside existing crash profiles.
Agent implementation guide
- Extend
SimFS with arm/disarm flags (mirror armShortRead).
- On armed append: write
partialBytes, throw Error with code property simulating EIO/ENOSPC.
- DST seeds: for each profile, assert invariant stated in B3 issue.
- Keep deterministic via mulberry32 — no real randomness.
Related issues
Acceptance criteria
Verification
Summary
SimFS/DST excellently models crash + torn tail but never throws on append/fsync failure. Cannot prove fixes for B3 (fsyncgate), partial writes, or phantom-commit scenarios.
Audit ID: Section 3 High — Wave 2
Extends: #9 DST direction with concrete ship requirements
Gap
src/sim/simfs.ts:60-66— append/fsync always succeed. NoarmAppendError,armFsyncError, or partial-byte append.Required fault profiles (minimum)
armAppendError(partialBytes?)armFsyncError()error-then-continuescheduleIntegrate into
src/sim/dst.tsseeded matrix alongside existing crash profiles.Agent implementation guide
SimFSwith arm/disarm flags (mirrorarmShortRead).partialBytes, throwErrorwithcodeproperty simulating EIO/ENOSPC.Related issues
Acceptance criteria
bun run gategreen; 100% coverage.Verification