# M12-01G Status status: done task: preserve the old catalog index when an IndexedDB migration fails updated: 2026-08-17 America/New_York enablingTask: true parityStateChange: false ## Scope The production IndexedDB migration prepares schema v2 with the existing schema v1 parser and migrator before opening a write transaction. It then rechecks the source row and atomically writes the v2 index and migration receipt while deleting the v1 row. A concurrent source change returns `REVISION_CONFLICT`; a transaction failure returns `STORAGE_TRANSACTION`. The browser suite injects failures after the v2 target write and after the v1 source delete. After each abort it closes and reopens the database, proving the database version, complete v1 index, unrelated legacy migration row, absent v2 row, and absent receipt are byte-for-byte equivalent to the baseline. A subsequent retry commits the v2 index and receipt together. ## Evidence - `WEB_TEST_PORT=5593 npm --prefix web run test:asset-catalog-indexeddb-migration` passed the M12-01D production migration unit suite 3/3, the M12-01G artifact binding unit 1/1, and Chromium 1/1. - Both `AFTER_TARGET_PUT` and `AFTER_SOURCE_DELETE` returned `STORAGE_TRANSACTION`; reopening IndexedDB after either fault produced the exact pre-migration snapshot. - The successful retry preserved revision 7 and the M12-01D source/target hashes, removed only the v1 row, and retained the unrelated migration row. - Typecheck and `git diff --check` passed. ## Artifact Hashes - production IndexedDB migration: `283a08bccb5ea301bd2aef8f01d4496972e3962f75e340479336c50e3539ba57` - browser suite: `82c40f38898277b4053a9654537ec9c21bc01a784d1091831e139361575a81e9` - artifact unit: `a4366a16f28b91b3ff213e0232308eaecd392731f27972cfa49a11568eb0feca` - manifest: `2596067956211698f1b7a07d9423411e2db830b72e6b78593354953a568738e7` ## Next Task `M12-01H`: prove catalog ordering and asset identity survive page and Worker restarts. ## Rollback Remove the IndexedDB migration module, M12-01G unit/browser suites, manifest, package command, and this status entry. Restore M12-01G to pending and `nextTask` to M12-01G. No parity ledger rollback is required.