# M16-GAP-00022 Status status: done task: Sound data-block LOCAL_EXACT slice updated: 2026-08-20 America/New_York scope: Blender 5.2 `bSound` identity and bounded sound resource fields through the same generated fixture in desktop and WASM/Main: source path, packing state, volume, pitch, channel count and sample rate. evidence: - `tools/web/generated/M16-GAP-00022.py` deterministically creates `sound:WebGapSound` from the repository WAV fixture and saves the Blend fixture. - Desktop reopen report matches exactly: `sound:WebGapSound`, `//WebGapSound.wav`, unpacked, volume/pitch `0.0`, one audio channel and `8000` Hz. - The reader matches Blender's DNA `bSound` type and emits the same `sounds` resource in Scene IR; protocol validation bounds the resource fields. - WASM/Main opened the same fixture, matched every desktop sound field, saved and reopened with an identical snapshot, and rejected a truncated Blend without mutating the loaded Main. - `build_blender_5.2.0/bin/blender -b --factory-startup --python tools/web/generated/M16-GAP-00022.py -- tests/files/web/generated/M16-GAP-00022-datablock-Sound.blend` exited 0. - `npm --prefix web run test:generated-gap -- --task M16-GAP-00022` exited 0. - `node tools/web/check-generated-gap.mjs --task M16-GAP-00022` exited 0. artifacts: `tests/golden/M16-GAP-00022/manifest.json` contains SHA-256 for the parent manifest, fixture, generator, desktop/Web checkers, reader/protocol/runtime and both reports. knownRisk: This closes only the `datablock:Sound` resource-observability slice. Audio playback, sequencer editing and other data-blocks remain separate tasks. rollback: remove this task's fixture, generator, desktop checker, checker branch, reader/protocol/runtime changes, reports, manifest, status and context; restore `M16-GAP-00021` as the queue tail without editing its successful evidence. nextTask: `M16-GAP-00023`