Summary
Discovered by sealed holdout H4b during PR #77 (doctor-events); reproduced on unfixed base, so it predates that PR.
All EventStore read verbs — status, replay, simulate, and now doctor — leave .loop/events.db-wal + .loop/events.db-shm sidecar files behind when run against a store-backed workspace. The mode=ro URI connections in loop/runtime.py recreate the WAL sidecars but cannot checkpoint/delete them on close (read-only connections can't checkpoint).
Impact
- Zero content mutation:
events.db stays byte-identical; no other files change. The read verbs are data-read-only.
- But they are not tree-byte-identical: any S4-style zero-carve-out tree-equality smoke over a store-backed workspace will false-flag after a read verb runs.
Fix surface
loop/runtime.py readers + connection lifecycle in loop/events.py — e.g. open read connections in a mode that doesn't recreate sidecars, or checkpoint/clean via a writable connection where safe.
References
Summary
Discovered by sealed holdout H4b during PR #77 (doctor-events); reproduced on unfixed base, so it predates that PR.
All EventStore read verbs —
status,replay,simulate, and nowdoctor— leave.loop/events.db-wal+.loop/events.db-shmsidecar files behind when run against a store-backed workspace. Themode=roURI connections inloop/runtime.pyrecreate the WAL sidecars but cannot checkpoint/delete them on close (read-only connections can't checkpoint).Impact
events.dbstays byte-identical; no other files change. The read verbs are data-read-only.Fix surface
loop/runtime.pyreaders + connection lifecycle inloop/events.py— e.g. open read connections in a mode that doesn't recreate sidecars, or checkpoint/clean via a writable connection where safe.References