Purity / rebuild guarantee test (#30) #60
Reference in New Issue
Block a user
No description provided.
Delete Branch "feat/purity-rebuild-test"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #30.
Proves the D4 purity invariant: delete the cache → resync → no durable truth lost. The cache is a rebuildable index over gitea, never a source of truth. Two tests, one per durable cache that actually exists:
packages/core/src/cache/cache-purity-v0.test.ts— file-backednode:sqlite(main binds better-sqlite3 to the sameCacheDriverseam). Build the SQLite mirror from a representative gitea snapshot (open+closed, milestones, reassignment, empty labels), capture every re-derived field,rmthe .sqlite file, rebuild from the same snapshot → assert byte-identical. Plus a structural D4 guard: everyissuescolumn must map to a gitea field, so a future user-authored column that would break rebuild-ability fails the test instead of silently breaking the invariant.apps/desktop/src/main/snapshot-store.test.ts— the shipped durable cache is the JSON snapshot-store. Delete the file →loadSnapshotreturnsnull(degrades to no-cache, never throws), which forces the nextgetSnapshotto reconcile fresh from gitea. Corrupt/partial files likewise. This stands up vitest for the desktop main process (first unit tests there); electron is mocked, the snapshot path is injected.Scope note — no native better-sqlite3 shipped
The SQLite mirror has no consumer on any hot path yet (scheduler/forecast/agent all run off the in-memory reconcile snapshot). Wiring it into main — native module + electron-rebuild +
asarUnpack+ a fresh .dmg re-verify — would add packaging risk for zero runtime benefit and put the verified .dmg at risk. The purity invariant is proven at the seam for both caches; the native driver migration is deferred until SQLite is load-bearing.Verification
tsc --noEmitcleantsc --noEmitclean🤖 Generated with Claude Code