# M12-01D Status status: done task: define and verify schema v1 to v2 forward migration updated: 2026-08-17 America/New_York enablingTask: true parityStateChange: false ## Scope The forward migration first validates the current production schema v1 manifest and rejects undeclared fields before conversion. Canonical UUIDs are preserved; legacy catalog IDs map deterministically through RFC 4122 UUIDv5 with a fixed namespace. The v1 parent graph becomes Blender cleaned slash paths, and assets receive SHA-256 IDs from Blender weak-reference identity. Logical revision is preserved. Author/license/tag/source bindings, optional source paths, preview receipts, and the complete library dependency graph survive migration. Metadata absent from v1 receives explicit defaults recorded in the migration report. The report binds canonical source/target hashes and every legacy-to-v2 catalog/asset identity mapping. ## Evidence - `npm --prefix web run test:asset-catalog-migration` passed 3/3. - A schema v1 fixture with three catalogs, two asset kinds, one preview, two source bindings, and two dependent libraries migrated to the checked-in schema v2 golden and exact report. - Repeating the migration on a cloned source produced byte-equivalent semantic objects and the same source/target SHA-256 values. A canonical source UUID remained unchanged. - M12-01C regression, typecheck, lint, and `git diff --check` passed. ## Artifact Hashes - migration protocol: `6d74bc5605f94e05208eda82830192d38f88066dfc409058555a8876c785f226` - generator: `954d15c02d68e3f644b57c8c4c136ce09bd037a0af2012bf74b97f681c77dd60` - unit suite: `6b927e7a8238e4e0a77cc0fdf783b099d8add22c5f875df2299012eb32730186` - v1 fixture: `1cc43d181afefd63b53cb9c3626bb58195fad20187d6e534adc1ecbe65f75da5` - v2 fixture: `38e5d1771b3d2d63ce5e10268eac4513f2043b0cbf71ab1799c1868bc2aa97fb` - migration report: `57b972c1bbb9ae326c3f264c225c21546682442ff3194fbc343e1c46a2cd410a` - manifest: `fea9e01b51f64a7e9c15dcfc521b3e84636525ffbe0a849f7a6f1b0be2b02e9d` ## Next Task `M12-01E`: define the read-only/block policy when a schema v1 reader encounters schema v2. ## Rollback Remove the migration protocol, generator, unit suite, M12-01D fixtures/report/manifest, package command, and this status entry. Restore M12-01D to pending and `nextTask` to M12-01D. No parity ledger rollback is required.