# WBV2-P2-002 status - task: `WBV2-P2-002` - parent: `WBV2-P2-001` - parity: `OBJECT.TRANSFORM_HIERARCHY` - implementationClass: `LOCAL_EXACT` - status: `done` - fixture: `tests/files/web/generated/WBV2-P2-002-OBJECT.TRANSFORM_HIERARCHY.blend` ## Evidence - Desktop and WASM preserve stable parent/child object IDs, local transforms, world matrices, and source/target collection membership. - `setObjectTransform` commits parent translation and propagates child world translation to `[2, 2, 0]`. - Parent-cycle and invalid linked/locked target edits reject before commit without changing revision. - Collection move and unparent-with-keep-world commit through authoritative Main; undo and redo are exact. - Desktop and WASM save/reopen preserve nodes and collections; malformed input is rejected without Main mutation. ## Production fixes - Failed command history restoration no longer advances session revision; undo/redo still advance it. - Unparent keep-world uses authoritative raw parent/local matrices and decomposes the captured world matrix. ## Commands - `npm --prefix web run test:generated-gap -- --task WBV2-P2-002` - `node tools/web/check-generated-gap.mjs --task WBV2-P2-002` - `node tools/web/check-task-context.mjs --task WBV2-P2-002 --write` ## Handoff - nextTask: `WBV2-P2-003` - queue mutation: allowed after manifest and parent hash validation