# M12-01F Status status: done task: reject duplicate IDs, catalog cycles, oversized text, and unknown fields updated: 2026-08-17 America/New_York enablingTask: true parityStateChange: false ## Scope The negative matrix executes production schema v2 and migration parsers against duplicate catalog/asset IDs, a legacy parent cycle, an inconsistent v2 `parentPath`, 64-byte UTF-8 simple-name/tag values, and unknown top-level/nested fields in both v1 and v2. The byte cases use multi-byte text to prove limits are not JavaScript character counts. Every failure returns a stable asset error code. The valid v2 fixture is parsed after each negative case to prove the failed input did not poison parser state. This task adds negative evidence only and does not change catalog parity status. ## Evidence - `npm --prefix web run test:asset-catalog-negatives` passed 2/2 with 9/9 negative cases. - Duplicate/cycle/parent/unknown cases returned `ASSET_MANIFEST_INVALID`; both 64-byte UTF-8 payloads returned `ASSET_BUDGET_EXCEEDED`. - Typecheck, lint, and `git diff --check` passed. ## Artifact Hashes - unit suite: `3a11605ac8666c8c4e1e2e85ccfd423115915820d0de6f92bdf72dff1f01ce41` - negative cases: `74672fa0aec248fd5d9a265743ef4dfe4d417fce8a24622b8b3d6be2f95c8874` - manifest: `127b2b605ac79a891cd6ab516ee031c02624a512e1043b111bfac2ebf1d8278d` ## Next Task `M12-01G`: prove an IndexedDB migration failure preserves the old transaction and index. ## Rollback Remove the M12-01F negative suite, golden/manifest, package command, and this status entry. Restore M12-01F to pending and `nextTask` to M12-01F. No parity ledger rollback is required.