From 6265973b730230009b6d07705f1641a948120105 Mon Sep 17 00:00:00 2001 From: BL Date: Sun, 13 Sep 2026 09:47:20 +0000 Subject: [PATCH 1/4] perf: qualify compiler SIMD FLAC decoder candidate --- .../006-measured-wasm-simd-decode.md | 74 ++++++++++++++++++ README.md | 5 ++ scripts/build-decoder-wasm.ts | 7 +- src/decoder-wasm.ts | 2 +- wasm/flac-decoder.manifest.json | 7 +- wasm/flac-decoder.wasm | Bin 74338 -> 75923 bytes 6 files changed, 92 insertions(+), 3 deletions(-) create mode 100644 .github/ISSUE_SPECS/006-measured-wasm-simd-decode.md diff --git a/.github/ISSUE_SPECS/006-measured-wasm-simd-decode.md b/.github/ISSUE_SPECS/006-measured-wasm-simd-decode.md new file mode 100644 index 0000000..51aa508 --- /dev/null +++ b/.github/ISSUE_SPECS/006-measured-wasm-simd-decode.md @@ -0,0 +1,74 @@ +# Measure and qualify a small Wasm SIMD decoder improvement + +GitHub: https://github.com/misofm/codec/issues/6 + +## Objective and immutable scope + +Enable standard Wasm SIMD in the existing FLAC decoder only if comparable repeated measurements show a useful improvement. Preserve exact canonical PCM, libFLAC integrity validation, bounded memory/foreign calls, cancellation, backpressure, public APIs, and existing supported-runtime qualification. No libFLAC rewrite, storage/delivery policy, WebGPU, format migration, or engine work. + +Published baseline: codec 0.1.0 at `12f54c988a2df319064e6ca3885268d976319cc1`; decoder SHA-256 `5e282f9874ecb3f49b8ee8437efc318ec14ef5cff5b7580da9d875f94e5c5925`. Candidate base is origin/main `970119ce723666267aa28856f315d7b702945a93`, retaining source-equivalent release/docs fixes. Candidate tree `/tmp/miso-simd-study/candidates/codec`, branch `perf/simd-codec-6`. Read-only baseline tree `/tmp/miso-simd-study/worktrees/codec` must remain unchanged. + +User-selected sequence supersedes local launch defaults: Sol high baseline → Astra xhigh scoped plan → Luna xhigh implementation → fresh Astra medium independent verification → identical after benchmarks → root release and app integration only if positive. Current status: baseline and scope complete; implementation, independent verification, positive comparison, and release pending. User authorizes the conditional sequence; no new routine approval step is required. + +## Evidence informing the slice + +Study root `/tmp/miso-simd-study`. Representative Bun 1.4.2 seven-round median: decode 57.345 ms (55.566–58.863) for 5,124,876 compressed bytes / 7,938,000 PCM bytes; adapter JS SHA 395.068 ms. Chromium 153.0.8010.12 whole Ghost r1 corpus: eight stems / 35 chunks / 92,685,354 compressed bytes / 249,323,400 active PCM bytes. Five-round one-worker decoder median 2,258.0 ms (2,248.4–2,330.8); eight-worker makespan 391.9 ms (390.7–394.8). All eight package, 35 compressed chunk, 35 decoded PCM chunk, and eight canonical hashes pass. Evidence files: `evidence/representative-bun-baseline.json`, `evidence/browser-baseline.json`. + +These are isolated compute measurements, not HTTP/OPFS installation or app-open timings. The adapter's larger PCM verification cost is addressed separately in adapter #82, without changing delivery/storage or removing checks. + +## Smallest implementation + +1. Add `-msimd128` to actual decoder/libFLAC/wrapper/runtime compilation in `scripts/build-decoder-wasm.ts`, enable the necessary Binaryen SIMD feature through the existing Asyncify pipeline, and record flags/features in the reproducibility manifest. Keep Emscripten 6.0.9 and libFLAC 1.5.0 pins, `-O3`, ABI/imports, fixed 2 MiB memory, stack bounds, 256 KiB asset/input caps, and 384 KiB PCM output cap. +2. Update `wasm/flac-decoder.wasm`, its manifest, and `src/decoder-wasm.ts` public hash. Inspect actual Wasm disassembly for SIMD instructions and record the finding. Flags alone do not prove acceleration. +3. Compare the compiler-only candidate using the frozen benchmark workload before any manual SIMD work. If neutral/negative, retain published scalar and record the rejected experiment. Do not start a predictor rewrite or broad libFLAC fork. Return any proposed follow-on source adjustment to root with measured justification. +4. For a positive candidate, retain the existing asset URL/public API and document standard Wasm SIMD requirements. All currently advertised Bun/Node/browser worker gates must pass. If a supported runtime fails, keep scalar for this release rather than silently dropping support or building an unplanned dual-asset framework. + +Owned files: decoder build script, decoder Wasm/manifest/public hash, focused decoder test adjustments, README, numbered spec/evidence, and eventual version/lock changes. Do not change encoder implementation, decoder Effect/control APIs, or original research worktrees. If Effect implementation changes become necessary, read and pin the user-requested Effect guidance first. + +## Correctness and performance acceptance + +Existing tests must retain exact mono/stereo16/24 PCM, variable-block behavior, CRC/MD5/truncation/count/metadata rejection, allocator/ABI cleanup, bounded inputs/outputs, downstream backpressure, and cancellation. Rebuild reproducibly and verify fixed memory/imports/exports/asset size. Add only a missing discriminating SIMD-boundary test if existing tests do not cover it. + +Rerun `harness/representative.mjs` and `harness/run-browser.mjs` with the same source fragmentation, corpus, CPU/runtime/browser, warmups, seven Bun rounds and five browser decode rounds. Record actual candidate source/tree/version and Wasm hash; source labels must be parameterized without changing timed work. Run CPU-heavy work serially with benchmark ownership. Accept a repeatable whole-corpus improvement larger than observed variation, without a material regression in single/eight-worker modes or supported runtimes. Keep raw samples, medians/ranges, percent differences, initialization/compile cost, asset size, and bounds. A single fast sample is insufficient; do not retry repeatedly looking for a win. + +## Required qualification and release + +Run `bun run check`, pinned-native `bun run test:integration`, `bun run build:wasm:verify`, `bun run build`, and `bun run pack:check`. Keep the existing isolated packed consumer matrix: Bun 1.4.2, Node 22.23.2, Effect rc.112/rc.115, Chromium/Firefox/WebKit workers. Preserve source/toolchain/license provenance and both Wasm reproducibility gates. Do not commit corpus media, caches, dependencies, secrets, or tarballs. + +Fresh Astra medium independently verifies a frozen candidate and records full commit/tree, files, commands/results, packed archive provenance, benchmark comparison, verdict, and remaining blockers here. Root owns versioning, merge, trusted publication using `.github/RELEASING.md`, registry artifact verification, and downstream adapter/app installation. Codec may remain unchanged if its candidate is not positive; that does not prevent a qualified adapter-only improvement. No implementation or publication is claimed by this scope. + +Companion plan: `/tmp/miso-simd-study/simd-plan.md`; adapter issue https://github.com/misofm/engine-web-adapter/issues/82. Technical reference: https://emscripten.org/docs/porting/simd.html . + +## Luna implementation evidence (candidate, not published) + +The compiler-only candidate was built with the pinned Emscripten 6.0.9 +checkout and libFLAC 1.5.0 archive. `-msimd128` is present in configure +`CFLAGS` and every decoder, libFLAC, wrapper, and runtime compile. The existing +Asyncify pipeline now passes `--enable-simd`; the manifest records the exact +compiler flag and `bulk-memory`/`simd128` features. The rebuilt fixed-memory +asset is 75,923 bytes with SHA-256 +`70caf38185675dff89498e89f98171d49ec6f143a56c6895088d93c35e2018cd`. + +`wasm2wat wasm/flac-decoder.wasm` contains 62 `v128.const`, 23 `v128.load`, +80 `v128.store`, 20 `i8x16.shuffle`, and additional typed SIMD operations. +This is actual SIMD in the asset; the compiler flag alone was not used as +evidence. No libFLAC source or decoder control-flow changes were made. + +On the frozen representative Bun workload (Bun 1.4.2, seven rounds), decode +was 54.872 ms (53.596–71.818) versus the scalar baseline 57.345 ms +(55.566–58.863), a 4.31% median reduction. On Chromium 153.0.8010.12 and the +full eight-stem/35-chunk corpus, one-worker decode medians were 2,179.1 ms +(2,140.4–2,191.7) and 2,155.5 ms (2,150.3–2,192.5) in two candidate runs; +the published baseline was 2,258.0 ms (2,248.4–2,330.8), with an adjacent +unchanged baseline at 2,243.9 ms (2,229.0–2,298.4). Eight-worker makespan +medians were 378.1 ms (370.2–390.4) and 377.7 ms (372.5–379.8), versus the +published 391.9 ms (390.7–394.8) and adjacent unchanged 394.1 ms +(388.8–422.4). All package, compressed chunk, decoded PCM chunk, canonical +PCM, libFLAC MD5, and count checks passed in each harness run. + +Local gates passed: `bun run check` (40 passed, 5 skipped native-only), +`CODEC_NATIVE_FLAC=/data/codec-tooling/flac-scalar/src/flac/flac bun run +test:integration` (5 passed), `bun run build:wasm:verify`, `bun run build`, and +`bun run pack:check` (Bun/Node and Chromium/Firefox/WebKit packed consumers for +Effect rc.112 and rc.115). Fresh independent review and root release remain +pending; this candidate does not claim publication. diff --git a/README.md b/README.md index eca8c91..0129fce 100644 --- a/README.md +++ b/README.md @@ -144,6 +144,11 @@ round trips, cancellation, and typed truncation failures on Bun 1.4.2, Node 22.23.2, and Chromium, Firefox, and WebKit workers. Consumer examples are compiled from an isolated installed tarball, without workspace aliases. +The decoder asset uses standard WebAssembly SIMD (`simd128`). The advertised +Bun, Node, Chromium, Firefox, and WebKit worker matrix is qualified with that +feature enabled; environments that cannot compile standard Wasm SIMD should +retain a scalar decoder asset supplied by the caller. + Rebuilding Wasm requires the pinned Emscripten 6.0.9 toolchain. Set `CODEC_EMSCRIPTEN_ROOT` to its `upstream/emscripten` directory, then run: diff --git a/scripts/build-decoder-wasm.ts b/scripts/build-decoder-wasm.ts index 1fef7e8..3370c41 100644 --- a/scripts/build-decoder-wasm.ts +++ b/scripts/build-decoder-wasm.ts @@ -39,6 +39,7 @@ const WASM_OPT_VERSION = "wasm-opt version 132 (version_132-49-gd03c25ea4)"; const MEMORY_BYTES = 2 * 1024 * 1024; const STACK_BYTES = 64 * 1024; const ASYNCIFY_STACK_BYTES = 64 * 1024; +const SIMD_COMPILER_FLAG = "-msimd128"; const sha256 = (bytes: Uint8Array): string => createHash("sha256").update(bytes).digest("hex"); @@ -113,7 +114,7 @@ const main = async (): Promise => { const reproducibleEnv = { SOURCE_DATE_EPOCH: "1735689600", ZERO_AR_DATE: "1", - CFLAGS: "-O3 -DNDEBUG", + CFLAGS: `-O3 -DNDEBUG ${SIMD_COMPILER_FLAG}`, }; await run( emconfigure, @@ -139,6 +140,7 @@ const main = async (): Promise => { ); const commonCompile = [ "-O3", + SIMD_COMPILER_FLAG, "-ffreestanding", "-fno-builtin", "-DFLAC__NO_DLL", @@ -264,6 +266,7 @@ const main = async (): Promise => { "--asyncify", "--pass-arg=asyncify-imports@codec.read", "--enable-bulk-memory", + "--enable-simd", "-O3", "--strip-debug", "-o", @@ -342,6 +345,7 @@ const main = async (): Promise => { libflacUnits: units, compilerFlags: [ "-O3", + SIMD_COMPILER_FLAG, "-ffreestanding", "-fno-builtin", "-DFLAC__NO_DLL", @@ -353,6 +357,7 @@ const main = async (): Promise => { stripAll: true, }, asyncifyImports: ["codec.read"], + wasmFeatures: ["bulk-memory", "simd128"], }, } as const; const serializedManifest = `${JSON.stringify(manifest, null, 2)}\n`; diff --git a/src/decoder-wasm.ts b/src/decoder-wasm.ts index 815fdfd..7aba53f 100644 --- a/src/decoder-wasm.ts +++ b/src/decoder-wasm.ts @@ -11,7 +11,7 @@ export const FLAC_DECODER_WASM_URL = new URL( // Updated only by the explicit reproducible Wasm build command. export const FLAC_DECODER_WASM_SHA256 = - "5e282f9874ecb3f49b8ee8437efc318ec14ef5cff5b7580da9d875f94e5c5925"; + "70caf38185675dff89498e89f98171d49ec6f143a56c6895088d93c35e2018cd"; export const FLAC_DECODER_LIMITS = { maxInputChunkBytes: 256 * 1024, diff --git a/wasm/flac-decoder.manifest.json b/wasm/flac-decoder.manifest.json index ecca467..8139de3 100644 --- a/wasm/flac-decoder.manifest.json +++ b/wasm/flac-decoder.manifest.json @@ -1,6 +1,6 @@ { "asset": "flac-decoder.wasm", - "assetSha256": "5e282f9874ecb3f49b8ee8437efc318ec14ef5cff5b7580da9d875f94e5c5925", + "assetSha256": "70caf38185675dff89498e89f98171d49ec6f143a56c6895088d93c35e2018cd", "libflac": { "version": "1.5.0", "archive": "vendor/libflac-1.5.0/flac-1.5.0.tar.xz", @@ -88,6 +88,7 @@ ], "compilerFlags": [ "-O3", + "-msimd128", "-ffreestanding", "-fno-builtin", "-DFLAC__NO_DLL", @@ -102,6 +103,10 @@ }, "asyncifyImports": [ "codec.read" + ], + "wasmFeatures": [ + "bulk-memory", + "simd128" ] } } diff --git a/wasm/flac-decoder.wasm b/wasm/flac-decoder.wasm index 62abfe67987012184e2361944cdf031a2a670aa7..9327b8460ed7aa2f95ceb6d432300834a74de368 100644 GIT binary patch literal 75923 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 EKPhlXvH$=8 literal 74338 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¥t|+KwT&-1& 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 D&%#&$ From 8c2823b041594a38284b01b5a39d77a6b515716e Mon Sep 17 00:00:00 2001 From: BL Date: Sun, 13 Sep 2026 09:49:25 +0000 Subject: [PATCH 2/4] docs: record decoder candidate benchmark revision --- .github/ISSUE_SPECS/006-measured-wasm-simd-decode.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/ISSUE_SPECS/006-measured-wasm-simd-decode.md b/.github/ISSUE_SPECS/006-measured-wasm-simd-decode.md index 51aa508..98ea1a3 100644 --- a/.github/ISSUE_SPECS/006-measured-wasm-simd-decode.md +++ b/.github/ISSUE_SPECS/006-measured-wasm-simd-decode.md @@ -72,3 +72,10 @@ test:integration` (5 passed), `bun run build:wasm:verify`, `bun run build`, and `bun run pack:check` (Bun/Node and Chromium/Firefox/WebKit packed consumers for Effect rc.112 and rc.115). Fresh independent review and root release remain pending; this candidate does not claim publication. + +The frozen implementation commit is `6265973b730230009b6d07705f1641a948120105`. +The post-commit final browser record is +`/tmp/miso-simd-study/evidence/browser-candidate-final.json`; it reports this +codec commit and decoder hash, with one-worker decode 2,200.9 ms +(2,181.7–2,239.6), eight-worker makespan 386.2 ms (371.3–397.9), and all +547,303,704 bytes of indexed PCM verification passing. From 5bfd00579a117a5e5366a062a6bfbc1c4df8b48f Mon Sep 17 00:00:00 2001 From: BL Date: Sun, 13 Sep 2026 10:10:15 +0000 Subject: [PATCH 3/4] release: prepare codec 0.1.1 with verified SIMD evidence --- .../006-measured-wasm-simd-decode.md | 6 + .github/RELEASE_EVIDENCE/006/AFTER.md | 135 ++++ .../browser-official-adjacent-baseline.json | 640 ++++++++++++++++++ .../006/browser-official-candidate.json | 640 ++++++++++++++++++ ...tative-bun-official-adjacent-baseline.json | 52 ++ ...representative-bun-official-candidate.json | 52 ++ .github/RELEASE_EVIDENCE/006/verification.md | 46 ++ package.json | 2 +- 8 files changed, 1572 insertions(+), 1 deletion(-) create mode 100644 .github/RELEASE_EVIDENCE/006/AFTER.md create mode 100644 .github/RELEASE_EVIDENCE/006/browser-official-adjacent-baseline.json create mode 100644 .github/RELEASE_EVIDENCE/006/browser-official-candidate.json create mode 100644 .github/RELEASE_EVIDENCE/006/representative-bun-official-adjacent-baseline.json create mode 100644 .github/RELEASE_EVIDENCE/006/representative-bun-official-candidate.json create mode 100644 .github/RELEASE_EVIDENCE/006/verification.md diff --git a/.github/ISSUE_SPECS/006-measured-wasm-simd-decode.md b/.github/ISSUE_SPECS/006-measured-wasm-simd-decode.md index 98ea1a3..0f400a0 100644 --- a/.github/ISSUE_SPECS/006-measured-wasm-simd-decode.md +++ b/.github/ISSUE_SPECS/006-measured-wasm-simd-decode.md @@ -79,3 +79,9 @@ The post-commit final browser record is codec commit and decoder hash, with one-worker decode 2,200.9 ms (2,181.7–2,239.6), eight-worker makespan 386.2 ms (371.3–397.9), and all 547,303,704 bytes of indexed PCM verification passing. + +## Independent verification and official acceptance + +Fresh Astra medium verified the frozen runtime and the adapter CI correction; no implementation blockers remain. Sol high repeated the frozen corpus after review: Chromium serial decode 2232.9 → 2175.5 ms, eight-worker decode 399.9 → 382.7 ms, indexed PCM verification 11568.0 → 2193.2 ms. Every digest and count passed. Both candidates are accepted for release. Most hashing improvement comes from scalar Wasm; the separately measured SIMD increment is 1.54%. These are compute measurements, not app-open timings. + +Full review, report, and immutable raw measurements are retained in `.github/RELEASE_EVIDENCE/006/`. Root is preparing the release; publication remains pending. diff --git a/.github/RELEASE_EVIDENCE/006/AFTER.md b/.github/RELEASE_EVIDENCE/006/AFTER.md new file mode 100644 index 0000000..f44f520 --- /dev/null +++ b/.github/RELEASE_EVIDENCE/006/AFTER.md @@ -0,0 +1,135 @@ +# Official post-verification comparison + +Measured 2026-09-13 after the fresh Astra medium review passed and its sole CI +blocker was repaired/rechecked. The compared candidate trees stayed clean and +frozen throughout the run: + +- Codec `8c2823b041594a38284b01b5a39d77a6b515716e`, tree + `0028688d80b1baf794508340bc477da590be4b38`, decoder asset SHA-256 + `70caf38185675dff89498e89f98171d49ec6f143a56c6895088d93c35e2018cd`. +- Adapter `088a14f57a945e6feb93145f3338943276a335dc`, tree + `d453f0937c99954bd7a8917cec06ce2682f77ee5`, generated selected SHA module + payload SHA-256 + `4435c2078c2783a77c06532e480d195ce314f500b849688d89d494432789fc28`. + +The adjacent unchanged controls are published codec `0.1.0` +`12f54c988a2df319064e6ca3885268d976319cc1` and adapter `0.4.0` +`9b8172fd52746907c113442995dc7538cfe5ad13`. Both runs used the same Linux +x86_64 AMD EPYC 7313P host, Node 22.23.2 runner, Playwright Core 1.62.1, Vite +8.2.2, and headless Chromium 153.0.8010.12 binary +`8c599d43aec53f2460a31ae2f4af6bd863f8258b34ff519564bc5d4726bfaa1e`. +System load after the serial benchmark sequence was 0.76/1.06/1.10. No +competing builds or study benchmarks ran in the window. + +## Correctness and workload identity + +The official baseline and candidate each admitted the same eight published +Ghost `r1` `MISOSTM1` packages and passed all 8 package SHA-256, 35 compressed +FLAC SHA-256, 35 decoded chunk PCM SHA-256, and 8 reconstructed canonical PCM +SHA-256 checks. The corpus remained 92,722,644 container bytes, 92,685,354 +compressed payload bytes, 249,323,400 decoded active PCM bytes, 48,656,904 +synthesized zero bytes, and 297,980,304 canonical PCM bytes. The indexed PCM +verification workload remained 547,303,704 hashed bytes. Maximum observed PCM +output remained 27,648 bytes. The raw JSON records each source identity and +package digest; the representative chunk independently matched compressed +SHA-256 `ab35d73ddbfb7cbeb9384a34c585edc0141e88bb812d047caad4969a4abe884b` +and PCM SHA-256 +`649b462aa016a111211498488ffca8da24e16f1a9b594f58bf38fb03933bb4f5` +with both adapter and Node crypto, and libFLAC MD5 was checked and verified. + +## Official adjacent Chromium results + +Each decoder case had one untimed warm-up and five measured rounds. Main-thread +PCM verification had one warm-up and three measured rounds. Local HTTP reads, +package/compressed correctness hashes, manifest admission, Wasm fetch/compile, +worker construction, network/CDN, OPFS, quota estimation, structured-clone +acknowledgements, and input/output waits are outside the timed sections. + +| Slice | Published adjacent samples (ms) | Candidate samples (ms) | Median change | Candidate CV / throughput | +| --- | --- | --- | ---: | ---: | +| One-worker FLAC decode | 2197.2, 2232.9, 2268.7, 2243.6, 2226.3 | 2155.4, 2175.5, 2187.5, 2167.5, 2199.7 | 2232.9 → 2175.5, **2.57% faster** | 0.71%; 109.30 MiB/s | +| Eight-worker decode makespan | 399.9, 404.9, 399.9, 391.7, 416.3 | 371.3, 404.3, 379.3, 382.7, 394.6 | 399.9 → 382.7, **4.30% faster** | 3.02%; 621.30 MiB/s | +| Main-thread indexed PCM SHA | 11589.8, 11568.0, 11550.9 | 2184.3, 2201.6, 2193.2 | 11568.0 → 2193.2, **81.04% faster** | 0.32%; 237.99 MiB/s | + +The unchanged-control CVs were 1.04%, 2.01%, and 0.14% respectively. Decoder +gains are modest. The one-worker median improvement exceeds run variation and +the result agrees with the earlier independent candidate runs. The eight-worker +ranges overlap under greater scheduling noise, but its 4.30% median gain and +the earlier adjacent 4.16% result have the same direction and magnitude. The +compiler-only decoder candidate therefore passes this host's compute gate in +both serial and default-eight-worker modes. + +The SHA result is decisive and does not overlap the control. For attribution, +the same-host development control measured scalar Wasm at a 2224.7 ms median +against its adjacent unchanged-JS median of 11540.5 ms: **scalar Wasm reduces +time by 80.72% versus JS**. Selected SIMD measured +2190.4 ms in the paired control, another **1.54% faster than scalar Wasm**; its +adjacent repeat was 2189.8 ms and the official frozen result is 2193.2 ms. SIMD +adds a small repeatable gain to the much larger Wasm gain. + +## Representative Bun results + +The identical largest indexed chunk was rerun for seven rounds on Bun 1.4.2. +Bun's reported `process.version` is compatibility metadata and is not a Node 26 +qualification. + +| Slice | Published adjacent median (range; CV) | Candidate median (range; CV) | Change | +| --- | ---: | ---: | ---: | +| FLAC decode, 7,938,000 PCM bytes | 60.117 ms (57.117–63.479; 3.85%) | 55.460 ms (51.870–62.195; 5.68%) | **7.75% faster** | +| PCM SHA-256, 7,938,000 bytes | 389.382 ms (385.286–391.515; 0.55%) | 33.247 ms (33.181–33.836; 0.66%) | **91.46% faster** | + +Exact samples are retained in the official Bun JSON files. The representative +result supports the browser direction; the whole-corpus Chromium comparison is +the primary gate. + +## Assets, initialization, and memory + +The decoder asset grew from 74,338 to 75,923 bytes: +1,585 bytes (+2.13%). Its +fixed 2 MiB memory, ABI, imports/exports, 256 KiB input cap, and 384 KiB maximum +output cap are unchanged. Browser decoder compile/validation was 2.0 ms for the +adjacent control and 3.3 ms for the candidate; Bun measured 4.676 and 4.332 ms. +These are single setup observations and are excluded from throughput. + +The selected SHA compression module is 957 bytes, versus 1,347 bytes for the +scalar Wasm control. It has no imports, one fixed 64 KiB memory, a 16 KiB input +scratch/batch cap, and no growth. A single Bun observation of the candidate's +first 16 KiB hash was 1.094 ms versus 0.280 ms warm, placing a coarse upper bound +of about 0.814 ms on lazy compile/instance overhead on this host. The operation +also includes hashing and JIT effects, so it is not a pure compile measurement. + +Adapter fixed-buffer accounting rises by 131,072 bytes, from 4,853,776 to +4,984,848 bytes, leaving 3,403,760 bytes within the unchanged 8 MiB worker +reservation. Per-hash JS state/tail/length ownership and API semantics remain +unchanged. Independent verification confirmed fixed memories, failed growth, +bounded copies, digest equivalence, packed deployment, and full test gates. + +## Recommendation and limits + +**Codec decoder: ship the reviewed SIMD candidate.** It gives a repeatable but +modest 2.57% one-worker and 4.30% eight-worker Chromium improvement with exact +PCM and unchanged bounds. The small asset/compile changes are acceptable in the +measured scope. + +**Adapter SHA: ship the reviewed selected SIMD candidate.** The production +selection reduces current indexed main-thread PCM verification compute by +81.04%; scalar Wasm separately reduces time by 80.72% versus JS, and SIMD adds a +measured 1.54% reduction versus scalar Wasm. Correctness and bounded-memory +gates remain intact. + +These are isolated cached-compute findings. They make no app-open, CDN/network, +OPFS, mobile, or end-to-end latency claim. App integration and release remain +root-owned follow-up work. + +Official raw evidence: + +- `browser-official-adjacent-baseline.json` SHA-256 + `514844c7c52396fa94f861f0a9b4ca27fc0feba5bb1d7ca7c477dd1dfa6bc9df` +- `browser-official-candidate.json` SHA-256 + `44d1c75c80963317bbe8033f6732ac0770e274fcbf60e23e1e48c3dc09731dbf` +- `representative-bun-official-adjacent-baseline.json` SHA-256 + `8070ac00dc4bfdbcb756c033c3c634a4ef8f20e927bf5ae1b4c645829a5f3809` +- `representative-bun-official-candidate.json` SHA-256 + `e094254f2838e75ff4769f9c6d63b54f9a6b76eac1fc4ae7dd14c6993befe272` + +Exact rerun commands and the parameterized source-root contract remain in +`../harness/README.md`. diff --git a/.github/RELEASE_EVIDENCE/006/browser-official-adjacent-baseline.json b/.github/RELEASE_EVIDENCE/006/browser-official-adjacent-baseline.json new file mode 100644 index 0000000..30408c4 --- /dev/null +++ b/.github/RELEASE_EVIDENCE/006/browser-official-adjacent-baseline.json @@ -0,0 +1,640 @@ +{ + "generatedAt": "2026-09-13T10:02:45.185Z", + "browser": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/153.0.0.0 Safari/537.36", + "hardwareConcurrency": 32, + "receipt": { + "path": "/data/sparse-pcm-launch/publication-per-stem-20260911/receipt.json", + "completedAt": "2026-09-11T21:48:24.317111+00:00", + "inputQualificationSha256": "b3e7c511719a01cbb33ef49dfaf06919d5dcafc346c6fa3a08519059b871c7cb" + }, + "totals": { + "containerBytes": 92722644, + "payloadBytes": 92685354, + "chunks": 35, + "activePcmBytes": 249323400, + "omittedPcmBytes": 48656904, + "canonicalPcmBytes": 297980304, + "indexedPcmVerificationBytes": 547303704, + "maximumPcmBlockBytes": 27648 + }, + "source": { + "codecVersion": "0.1.0", + "codecCommit": "12f54c988a2df319064e6ca3885268d976319cc1", + "adapterVersion": "0.4.0", + "adapterCommit": "9b8172fd52746907c113442995dc7538cfe5ad13", + "decoderWasmSha256": "5e282f9874ecb3f49b8ee8437efc318ec14ef5cff5b7580da9d875f94e5c5925" + }, + "correctness": { + "admittedPackages": [ + { + "id": "drums", + "identity": "sha256:03328fc288eda889bb9bb7813a48bf87d3e011b1698778fc456f57c8561b9db2", + "bytes": 16542989, + "payloadBytes": 16538208, + "chunks": 4, + "fetchMs": 88.79999995231628, + "admissionMs": 1.4000000953674316, + "compressedVerificationMs": 38, + "packageSha256": "9e12a781f0596d78f177463570203389999bd6312f1b340506a163b10b370824" + }, + { + "id": "lead-vox", + "identity": "sha256:27c2485abef9b9791cf127b08108e9982383fdbf7736095f8411647e5b82a7ac", + "bytes": 19754378, + "payloadBytes": 19752920, + "chunks": 5, + "fetchMs": 115.10000002384186, + "admissionMs": 0.7000000476837158, + "compressedVerificationMs": 45.299999952316284, + "packageSha256": "8d9595ec06be9422d2a8bd5622790c2e78a03451d92db294ee6c391eba74dbc9" + }, + { + "id": "vocal-fx", + "identity": "sha256:361eb2581ace51a5a34c59d83c06ebe6dad73300115db995e6c0692fb4061ae3", + "bytes": 4223284, + "payloadBytes": 4217158, + "chunks": 4, + "fetchMs": 24, + "admissionMs": 0.6000000238418579, + "compressedVerificationMs": 9.700000047683716, + "packageSha256": "b703951ff75704a35a5c3aa0254da5d8fe10e9d4a0d54efe21732eeee9062f82" + }, + { + "id": "fx", + "identity": "sha256:9184f49ee35fa748ecf4d898eb06058d2f499b8348b80736c5c252a99fe36b98", + "bytes": 8777838, + "payloadBytes": 8766086, + "chunks": 4, + "fetchMs": 44.60000002384186, + "admissionMs": 1.100000023841858, + "compressedVerificationMs": 20.5, + "packageSha256": "e7a2b1ba6519adffc8618c12e9d4331840f7b02b9abda0b7e8e915bd2c2303f3" + }, + { + "id": "synth-6", + "identity": "sha256:9a57207ac802bad426435d920b77048ba9dd391797c6a462444c6e375716d36f", + "bytes": 8486166, + "payloadBytes": 8481847, + "chunks": 4, + "fetchMs": 42.39999997615814, + "admissionMs": 0.5, + "compressedVerificationMs": 19.5, + "packageSha256": "b951265b6d86af8c93148d77e547d36e8015e2d370e5ea58c73937ad1bc9c68a" + }, + { + "id": "bass", + "identity": "sha256:ba8f39a6c7b1f22bded6ce6d97361a01ce751282b3f1ab08f931b876c6734ae1", + "bytes": 4192048, + "payloadBytes": 4186111, + "chunks": 4, + "fetchMs": 21.5, + "admissionMs": 0.5, + "compressedVerificationMs": 9.300000071525574, + "packageSha256": "0724e73b3b3f737deedd3dfe685be7323674596cef963ec5331a1eab19700bd3" + }, + { + "id": "bv_s", + "identity": "sha256:c48e9a6b5621bb213de9d6c0c016c557a4516ba0e02de06deb1141fe7946332f", + "bytes": 22224639, + "payloadBytes": 22223178, + "chunks": 5, + "fetchMs": 65.39999997615814, + "admissionMs": 0.19999992847442627, + "compressedVerificationMs": 51.40000009536743, + "packageSha256": "376641bd8b9d97160d26e9cff6ecce224676f0674d4d5b40e64130cd4200e354" + }, + { + "id": "guitar", + "identity": "sha256:e5c44270be4bd0862850977ef3d8a06f1b3803d75c276bb243139bae1f56db62", + "bytes": 8521302, + "payloadBytes": 8519846, + "chunks": 5, + "fetchMs": 42.699999928474426, + "admissionMs": 0.20000004768371582, + "compressedVerificationMs": 19.799999952316284, + "packageSha256": "bbed614e9d8020e592657fd6e8ce726f89eb1d5a42317bd58c04b0bd7457df97" + } + ], + "decodedPcmBytes": 249323400, + "chunkPcmSha256Checks": 35, + "canonicalPcmSha256Checks": 8, + "compressedChunkSha256Checks": 35, + "packageSha256Checks": 8 + }, + "ioAndSetup": { + "oneWorker": { + "setupWallMs": 672.3999999761581, + "wasmFetchMs": 7, + "compileMs": 2, + "wasmSha256": "5e282f9874ecb3f49b8ee8437efc318ec14ef5cff5b7580da9d875f94e5c5925", + "stems": [ + { + "id": "drums", + "identity": "sha256:03328fc288eda889bb9bb7813a48bf87d3e011b1698778fc456f57c8561b9db2", + "bytes": 16542989, + "payloadBytes": 16538208, + "chunks": 4, + "fetchMs": 88.79999995231628, + "admissionMs": 1.4000000953674316, + "compressedVerificationMs": 38, + "packageSha256": "9e12a781f0596d78f177463570203389999bd6312f1b340506a163b10b370824" + }, + { + "id": "lead-vox", + "identity": "sha256:27c2485abef9b9791cf127b08108e9982383fdbf7736095f8411647e5b82a7ac", + "bytes": 19754378, + "payloadBytes": 19752920, + "chunks": 5, + "fetchMs": 115.10000002384186, + "admissionMs": 0.7000000476837158, + "compressedVerificationMs": 45.299999952316284, + "packageSha256": "8d9595ec06be9422d2a8bd5622790c2e78a03451d92db294ee6c391eba74dbc9" + }, + { + "id": "vocal-fx", + "identity": "sha256:361eb2581ace51a5a34c59d83c06ebe6dad73300115db995e6c0692fb4061ae3", + "bytes": 4223284, + "payloadBytes": 4217158, + "chunks": 4, + "fetchMs": 24, + "admissionMs": 0.6000000238418579, + "compressedVerificationMs": 9.700000047683716, + "packageSha256": "b703951ff75704a35a5c3aa0254da5d8fe10e9d4a0d54efe21732eeee9062f82" + }, + { + "id": "fx", + "identity": "sha256:9184f49ee35fa748ecf4d898eb06058d2f499b8348b80736c5c252a99fe36b98", + "bytes": 8777838, + "payloadBytes": 8766086, + "chunks": 4, + "fetchMs": 44.60000002384186, + "admissionMs": 1.100000023841858, + "compressedVerificationMs": 20.5, + "packageSha256": "e7a2b1ba6519adffc8618c12e9d4331840f7b02b9abda0b7e8e915bd2c2303f3" + }, + { + "id": "synth-6", + "identity": "sha256:9a57207ac802bad426435d920b77048ba9dd391797c6a462444c6e375716d36f", + "bytes": 8486166, + "payloadBytes": 8481847, + "chunks": 4, + "fetchMs": 42.39999997615814, + "admissionMs": 0.5, + "compressedVerificationMs": 19.5, + "packageSha256": "b951265b6d86af8c93148d77e547d36e8015e2d370e5ea58c73937ad1bc9c68a" + }, + { + "id": "bass", + "identity": "sha256:ba8f39a6c7b1f22bded6ce6d97361a01ce751282b3f1ab08f931b876c6734ae1", + "bytes": 4192048, + "payloadBytes": 4186111, + "chunks": 4, + "fetchMs": 21.5, + "admissionMs": 0.5, + "compressedVerificationMs": 9.300000071525574, + "packageSha256": "0724e73b3b3f737deedd3dfe685be7323674596cef963ec5331a1eab19700bd3" + }, + { + "id": "bv_s", + "identity": "sha256:c48e9a6b5621bb213de9d6c0c016c557a4516ba0e02de06deb1141fe7946332f", + "bytes": 22224639, + "payloadBytes": 22223178, + "chunks": 5, + "fetchMs": 65.39999997615814, + "admissionMs": 0.19999992847442627, + "compressedVerificationMs": 51.40000009536743, + "packageSha256": "376641bd8b9d97160d26e9cff6ecce224676f0674d4d5b40e64130cd4200e354" + }, + { + "id": "guitar", + "identity": "sha256:e5c44270be4bd0862850977ef3d8a06f1b3803d75c276bb243139bae1f56db62", + "bytes": 8521302, + "payloadBytes": 8519846, + "chunks": 5, + "fetchMs": 42.699999928474426, + "admissionMs": 0.20000004768371582, + "compressedVerificationMs": 19.799999952316284, + "packageSha256": "bbed614e9d8020e592657fd6e8ce726f89eb1d5a42317bd58c04b0bd7457df97" + } + ] + }, + "eightWorkersWallMs": 937.7999999523163, + "eightWorkers": [ + { + "setupWallMs": 189.5, + "wasmFetchMs": 2.5999999046325684, + "compileMs": 1.5, + "wasmSha256": "5e282f9874ecb3f49b8ee8437efc318ec14ef5cff5b7580da9d875f94e5c5925", + "stems": [ + { + "id": "drums", + "identity": "sha256:03328fc288eda889bb9bb7813a48bf87d3e011b1698778fc456f57c8561b9db2", + "bytes": 16542989, + "payloadBytes": 16538208, + "chunks": 4, + "fetchMs": 140.40000009536743, + "admissionMs": 1.5999999046325684, + "compressedVerificationMs": 43.40000009536743, + "packageSha256": "9e12a781f0596d78f177463570203389999bd6312f1b340506a163b10b370824" + } + ] + }, + { + "setupWallMs": 215, + "wasmFetchMs": 4.699999928474426, + "compileMs": 1.5, + "wasmSha256": "5e282f9874ecb3f49b8ee8437efc318ec14ef5cff5b7580da9d875f94e5c5925", + "stems": [ + { + "id": "lead-vox", + "identity": "sha256:27c2485abef9b9791cf127b08108e9982383fdbf7736095f8411647e5b82a7ac", + "bytes": 19754378, + "payloadBytes": 19752920, + "chunks": 5, + "fetchMs": 161.70000004768372, + "admissionMs": 0.6999999284744263, + "compressedVerificationMs": 46.300000071525574, + "packageSha256": "8d9595ec06be9422d2a8bd5622790c2e78a03451d92db294ee6c391eba74dbc9" + } + ] + }, + { + "setupWallMs": 77.39999997615814, + "wasmFetchMs": 21, + "compileMs": 2.0999999046325684, + "wasmSha256": "5e282f9874ecb3f49b8ee8437efc318ec14ef5cff5b7580da9d875f94e5c5925", + "stems": [ + { + "id": "vocal-fx", + "identity": "sha256:361eb2581ace51a5a34c59d83c06ebe6dad73300115db995e6c0692fb4061ae3", + "bytes": 4223284, + "payloadBytes": 4217158, + "chunks": 4, + "fetchMs": 43.39999997615814, + "admissionMs": 1.3000000715255737, + "compressedVerificationMs": 9.600000023841858, + "packageSha256": "b703951ff75704a35a5c3aa0254da5d8fe10e9d4a0d54efe21732eeee9062f82" + } + ] + }, + { + "setupWallMs": 134.39999997615814, + "wasmFetchMs": 2.4000000953674316, + "compileMs": 1.6999999284744263, + "wasmSha256": "5e282f9874ecb3f49b8ee8437efc318ec14ef5cff5b7580da9d875f94e5c5925", + "stems": [ + { + "id": "fx", + "identity": "sha256:9184f49ee35fa748ecf4d898eb06058d2f499b8348b80736c5c252a99fe36b98", + "bytes": 8777838, + "payloadBytes": 8766086, + "chunks": 4, + "fetchMs": 99.70000004768372, + "admissionMs": 3.5, + "compressedVerificationMs": 27.09999990463257, + "packageSha256": "e7a2b1ba6519adffc8618c12e9d4331840f7b02b9abda0b7e8e915bd2c2303f3" + } + ] + }, + { + "setupWallMs": 118.70000004768372, + "wasmFetchMs": 3.5, + "compileMs": 1.7999999523162842, + "wasmSha256": "5e282f9874ecb3f49b8ee8437efc318ec14ef5cff5b7580da9d875f94e5c5925", + "stems": [ + { + "id": "synth-6", + "identity": "sha256:9a57207ac802bad426435d920b77048ba9dd391797c6a462444c6e375716d36f", + "bytes": 8486166, + "payloadBytes": 8481847, + "chunks": 4, + "fetchMs": 87.10000002384186, + "admissionMs": 1, + "compressedVerificationMs": 25.200000047683716, + "packageSha256": "b951265b6d86af8c93148d77e547d36e8015e2d370e5ea58c73937ad1bc9c68a" + } + ] + }, + { + "setupWallMs": 80.80000007152557, + "wasmFetchMs": 5.600000023841858, + "compileMs": 1.600000023841858, + "wasmSha256": "5e282f9874ecb3f49b8ee8437efc318ec14ef5cff5b7580da9d875f94e5c5925", + "stems": [ + { + "id": "bass", + "identity": "sha256:ba8f39a6c7b1f22bded6ce6d97361a01ce751282b3f1ab08f931b876c6734ae1", + "bytes": 4192048, + "payloadBytes": 4186111, + "chunks": 4, + "fetchMs": 60.5, + "admissionMs": 1.4000000953674316, + "compressedVerificationMs": 11.699999928474426, + "packageSha256": "0724e73b3b3f737deedd3dfe685be7323674596cef963ec5331a1eab19700bd3" + } + ] + }, + { + "setupWallMs": 156.60000002384186, + "wasmFetchMs": 3.100000023841858, + "compileMs": 1.7000000476837158, + "wasmSha256": "5e282f9874ecb3f49b8ee8437efc318ec14ef5cff5b7580da9d875f94e5c5925", + "stems": [ + { + "id": "bv_s", + "identity": "sha256:c48e9a6b5621bb213de9d6c0c016c557a4516ba0e02de06deb1141fe7946332f", + "bytes": 22224639, + "payloadBytes": 22223178, + "chunks": 5, + "fetchMs": 97.39999997615814, + "admissionMs": 1.100000023841858, + "compressedVerificationMs": 53.299999952316284, + "packageSha256": "376641bd8b9d97160d26e9cff6ecce224676f0674d4d5b40e64130cd4200e354" + } + ] + }, + { + "setupWallMs": 69, + "wasmFetchMs": 2.3000000715255737, + "compileMs": 1.600000023841858, + "wasmSha256": "5e282f9874ecb3f49b8ee8437efc318ec14ef5cff5b7580da9d875f94e5c5925", + "stems": [ + { + "id": "guitar", + "identity": "sha256:e5c44270be4bd0862850977ef3d8a06f1b3803d75c276bb243139bae1f56db62", + "bytes": 8521302, + "payloadBytes": 8519846, + "chunks": 5, + "fetchMs": 43.90000009536743, + "admissionMs": 1, + "compressedVerificationMs": 20.09999990463257, + "packageSha256": "bbed614e9d8020e592657fd6e8ce726f89eb1d5a42317bd58c04b0bd7457df97" + } + ] + } + ] + }, + "measurements": { + "oneWorkerDecodeMs": { + "values": [ + 2197.1999999284744, + 2232.899999976158, + 2268.6999999284744, + 2243.600000023842, + 2226.3000000715256 + ], + "min": 2197.1999999284744, + "median": 2232.899999976158, + "max": 2268.6999999284744, + "mean": 2233.739999985695, + "coefficientOfVariation": 0.010423636530554482 + }, + "browserMainThreadIndexedPcmSha256Ms": { + "values": [ + 11589.799999952316, + 11568, + 11550.900000095367 + ], + "min": 11550.900000095367, + "median": 11568, + "max": 11589.799999952316, + "mean": 11569.566666682562, + "coefficientOfVariation": 0.001375976336848006 + }, + "eightWorkerDecodeWallMs": { + "values": [ + 399.89999997615814, + 404.89999997615814, + 399.89999997615814, + 391.7000000476837, + 416.2999999523163 + ], + "min": 391.7000000476837, + "median": 399.89999997615814, + "max": 416.2999999523163, + "mean": 402.53999998569486, + "coefficientOfVariation": 0.020070079528227324 + }, + "eightWorkerPerStem": [ + [ + { + "id": "drums", + "elapsedMs": 344.5, + "pcmBytes": 30791214 + }, + { + "id": "lead-vox", + "elapsedMs": 399.60000002384186, + "pcmBytes": 37247538 + }, + { + "id": "vocal-fx", + "elapsedMs": 347.90000009536743, + "pcmBytes": 30161286 + }, + { + "id": "fx", + "elapsedMs": 321.90000009536743, + "pcmBytes": 26982702 + }, + { + "id": "synth-6", + "elapsedMs": 280.10000002384186, + "pcmBytes": 24399084 + }, + { + "id": "bass", + "elapsedMs": 265.10000002384186, + "pcmBytes": 25258248 + }, + { + "id": "bv_s", + "elapsedMs": 397, + "pcmBytes": 37235790 + }, + { + "id": "guitar", + "elapsedMs": 384, + "pcmBytes": 37247538 + } + ], + [ + { + "id": "drums", + "elapsedMs": 325.2999999523163, + "pcmBytes": 30791214 + }, + { + "id": "lead-vox", + "elapsedMs": 404.1999999284744, + "pcmBytes": 37247538 + }, + { + "id": "vocal-fx", + "elapsedMs": 313.89999997615814, + "pcmBytes": 30161286 + }, + { + "id": "fx", + "elapsedMs": 285.59999990463257, + "pcmBytes": 26982702 + }, + { + "id": "synth-6", + "elapsedMs": 263, + "pcmBytes": 24399084 + }, + { + "id": "bass", + "elapsedMs": 243.79999995231628, + "pcmBytes": 25258248 + }, + { + "id": "bv_s", + "elapsedMs": 404.6999999284744, + "pcmBytes": 37235790 + }, + { + "id": "guitar", + "elapsedMs": 362.6999999284744, + "pcmBytes": 37247538 + } + ], + [ + { + "id": "drums", + "elapsedMs": 338.39999997615814, + "pcmBytes": 30791214 + }, + { + "id": "lead-vox", + "elapsedMs": 395.89999997615814, + "pcmBytes": 37247538 + }, + { + "id": "vocal-fx", + "elapsedMs": 321.7999999523163, + "pcmBytes": 30161286 + }, + { + "id": "fx", + "elapsedMs": 270.7000000476837, + "pcmBytes": 26982702 + }, + { + "id": "synth-6", + "elapsedMs": 245.10000002384186, + "pcmBytes": 24399084 + }, + { + "id": "bass", + "elapsedMs": 229.10000002384186, + "pcmBytes": 25258248 + }, + { + "id": "bv_s", + "elapsedMs": 399.7000000476837, + "pcmBytes": 37235790 + }, + { + "id": "guitar", + "elapsedMs": 385.6999999284744, + "pcmBytes": 37247538 + } + ], + [ + { + "id": "drums", + "elapsedMs": 324, + "pcmBytes": 30791214 + }, + { + "id": "lead-vox", + "elapsedMs": 391.7000000476837, + "pcmBytes": 37247538 + }, + { + "id": "vocal-fx", + "elapsedMs": 308.2000000476837, + "pcmBytes": 30161286 + }, + { + "id": "fx", + "elapsedMs": 274.5, + "pcmBytes": 26982702 + }, + { + "id": "synth-6", + "elapsedMs": 254.20000004768372, + "pcmBytes": 24399084 + }, + { + "id": "bass", + "elapsedMs": 225.5, + "pcmBytes": 25258248 + }, + { + "id": "bv_s", + "elapsedMs": 383.5, + "pcmBytes": 37235790 + }, + { + "id": "guitar", + "elapsedMs": 371.60000002384186, + "pcmBytes": 37247538 + } + ], + [ + { + "id": "drums", + "elapsedMs": 373, + "pcmBytes": 30791214 + }, + { + "id": "lead-vox", + "elapsedMs": 414.60000002384186, + "pcmBytes": 37247538 + }, + { + "id": "vocal-fx", + "elapsedMs": 367.7999999523163, + "pcmBytes": 30161286 + }, + { + "id": "fx", + "elapsedMs": 314.2999999523163, + "pcmBytes": 26982702 + }, + { + "id": "synth-6", + "elapsedMs": 313.2999999523163, + "pcmBytes": 24399084 + }, + { + "id": "bass", + "elapsedMs": 294.7999999523163, + "pcmBytes": 25258248 + }, + { + "id": "bv_s", + "elapsedMs": 416.1999999284744, + "pcmBytes": 37235790 + }, + { + "id": "guitar", + "elapsedMs": 405, + "pcmBytes": 37247538 + } + ] + ] + }, + "browserVersion": "153.0.8010.12", + "runner": { + "node": "v22.23.2", + "chrome": "/home/bl/.cache/ms-playwright/chromium-1243/chrome-linux64/chrome", + "codecRoot": "/tmp/miso-simd-study/worktrees/codec", + "adapterRoot": "/tmp/miso-simd-study/worktrees/adapter", + "decodeRounds": 5, + "shaRounds": 3 + } +} diff --git a/.github/RELEASE_EVIDENCE/006/browser-official-candidate.json b/.github/RELEASE_EVIDENCE/006/browser-official-candidate.json new file mode 100644 index 0000000..b7d24d5 --- /dev/null +++ b/.github/RELEASE_EVIDENCE/006/browser-official-candidate.json @@ -0,0 +1,640 @@ +{ + "generatedAt": "2026-09-13T10:03:22.676Z", + "browser": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/153.0.0.0 Safari/537.36", + "hardwareConcurrency": 32, + "receipt": { + "path": "/data/sparse-pcm-launch/publication-per-stem-20260911/receipt.json", + "completedAt": "2026-09-11T21:48:24.317111+00:00", + "inputQualificationSha256": "b3e7c511719a01cbb33ef49dfaf06919d5dcafc346c6fa3a08519059b871c7cb" + }, + "totals": { + "containerBytes": 92722644, + "payloadBytes": 92685354, + "chunks": 35, + "activePcmBytes": 249323400, + "omittedPcmBytes": 48656904, + "canonicalPcmBytes": 297980304, + "indexedPcmVerificationBytes": 547303704, + "maximumPcmBlockBytes": 27648 + }, + "source": { + "codecVersion": "0.1.0", + "codecCommit": "8c2823b041594a38284b01b5a39d77a6b515716e", + "adapterVersion": "0.4.0", + "adapterCommit": "088a14f57a945e6feb93145f3338943276a335dc", + "decoderWasmSha256": "70caf38185675dff89498e89f98171d49ec6f143a56c6895088d93c35e2018cd" + }, + "correctness": { + "admittedPackages": [ + { + "id": "drums", + "identity": "sha256:03328fc288eda889bb9bb7813a48bf87d3e011b1698778fc456f57c8561b9db2", + "bytes": 16542989, + "payloadBytes": 16538208, + "chunks": 4, + "fetchMs": 86, + "admissionMs": 1.5, + "compressedVerificationMs": 37.40000009536743, + "packageSha256": "9e12a781f0596d78f177463570203389999bd6312f1b340506a163b10b370824" + }, + { + "id": "lead-vox", + "identity": "sha256:27c2485abef9b9791cf127b08108e9982383fdbf7736095f8411647e5b82a7ac", + "bytes": 19754378, + "payloadBytes": 19752920, + "chunks": 5, + "fetchMs": 112.90000009536743, + "admissionMs": 1.1999999284744263, + "compressedVerificationMs": 44.700000047683716, + "packageSha256": "8d9595ec06be9422d2a8bd5622790c2e78a03451d92db294ee6c391eba74dbc9" + }, + { + "id": "vocal-fx", + "identity": "sha256:361eb2581ace51a5a34c59d83c06ebe6dad73300115db995e6c0692fb4061ae3", + "bytes": 4223284, + "payloadBytes": 4217158, + "chunks": 4, + "fetchMs": 25.399999976158142, + "admissionMs": 0.6000000238418579, + "compressedVerificationMs": 9.299999952316284, + "packageSha256": "b703951ff75704a35a5c3aa0254da5d8fe10e9d4a0d54efe21732eeee9062f82" + }, + { + "id": "fx", + "identity": "sha256:9184f49ee35fa748ecf4d898eb06058d2f499b8348b80736c5c252a99fe36b98", + "bytes": 8777838, + "payloadBytes": 8766086, + "chunks": 4, + "fetchMs": 50, + "admissionMs": 1.2000000476837158, + "compressedVerificationMs": 19.699999928474426, + "packageSha256": "e7a2b1ba6519adffc8618c12e9d4331840f7b02b9abda0b7e8e915bd2c2303f3" + }, + { + "id": "synth-6", + "identity": "sha256:9a57207ac802bad426435d920b77048ba9dd391797c6a462444c6e375716d36f", + "bytes": 8486166, + "payloadBytes": 8481847, + "chunks": 4, + "fetchMs": 54.40000009536743, + "admissionMs": 0.2999999523162842, + "compressedVerificationMs": 19.100000023841858, + "packageSha256": "b951265b6d86af8c93148d77e547d36e8015e2d370e5ea58c73937ad1bc9c68a" + }, + { + "id": "bass", + "identity": "sha256:ba8f39a6c7b1f22bded6ce6d97361a01ce751282b3f1ab08f931b876c6734ae1", + "bytes": 4192048, + "payloadBytes": 4186111, + "chunks": 4, + "fetchMs": 25.600000023841858, + "admissionMs": 0.3999999761581421, + "compressedVerificationMs": 9.100000023841858, + "packageSha256": "0724e73b3b3f737deedd3dfe685be7323674596cef963ec5331a1eab19700bd3" + }, + { + "id": "bv_s", + "identity": "sha256:c48e9a6b5621bb213de9d6c0c016c557a4516ba0e02de06deb1141fe7946332f", + "bytes": 22224639, + "payloadBytes": 22223178, + "chunks": 5, + "fetchMs": 78.69999992847443, + "admissionMs": 0.20000004768371582, + "compressedVerificationMs": 50.199999928474426, + "packageSha256": "376641bd8b9d97160d26e9cff6ecce224676f0674d4d5b40e64130cd4200e354" + }, + { + "id": "guitar", + "identity": "sha256:e5c44270be4bd0862850977ef3d8a06f1b3803d75c276bb243139bae1f56db62", + "bytes": 8521302, + "payloadBytes": 8519846, + "chunks": 5, + "fetchMs": 42.200000047683716, + "admissionMs": 0.20000004768371582, + "compressedVerificationMs": 19.299999952316284, + "packageSha256": "bbed614e9d8020e592657fd6e8ce726f89eb1d5a42317bd58c04b0bd7457df97" + } + ], + "decodedPcmBytes": 249323400, + "chunkPcmSha256Checks": 35, + "canonicalPcmSha256Checks": 8, + "compressedChunkSha256Checks": 35, + "packageSha256Checks": 8 + }, + "ioAndSetup": { + "oneWorker": { + "setupWallMs": 695.8000000715256, + "wasmFetchMs": 2.799999952316284, + "compileMs": 3.3000000715255737, + "wasmSha256": "70caf38185675dff89498e89f98171d49ec6f143a56c6895088d93c35e2018cd", + "stems": [ + { + "id": "drums", + "identity": "sha256:03328fc288eda889bb9bb7813a48bf87d3e011b1698778fc456f57c8561b9db2", + "bytes": 16542989, + "payloadBytes": 16538208, + "chunks": 4, + "fetchMs": 86, + "admissionMs": 1.5, + "compressedVerificationMs": 37.40000009536743, + "packageSha256": "9e12a781f0596d78f177463570203389999bd6312f1b340506a163b10b370824" + }, + { + "id": "lead-vox", + "identity": "sha256:27c2485abef9b9791cf127b08108e9982383fdbf7736095f8411647e5b82a7ac", + "bytes": 19754378, + "payloadBytes": 19752920, + "chunks": 5, + "fetchMs": 112.90000009536743, + "admissionMs": 1.1999999284744263, + "compressedVerificationMs": 44.700000047683716, + "packageSha256": "8d9595ec06be9422d2a8bd5622790c2e78a03451d92db294ee6c391eba74dbc9" + }, + { + "id": "vocal-fx", + "identity": "sha256:361eb2581ace51a5a34c59d83c06ebe6dad73300115db995e6c0692fb4061ae3", + "bytes": 4223284, + "payloadBytes": 4217158, + "chunks": 4, + "fetchMs": 25.399999976158142, + "admissionMs": 0.6000000238418579, + "compressedVerificationMs": 9.299999952316284, + "packageSha256": "b703951ff75704a35a5c3aa0254da5d8fe10e9d4a0d54efe21732eeee9062f82" + }, + { + "id": "fx", + "identity": "sha256:9184f49ee35fa748ecf4d898eb06058d2f499b8348b80736c5c252a99fe36b98", + "bytes": 8777838, + "payloadBytes": 8766086, + "chunks": 4, + "fetchMs": 50, + "admissionMs": 1.2000000476837158, + "compressedVerificationMs": 19.699999928474426, + "packageSha256": "e7a2b1ba6519adffc8618c12e9d4331840f7b02b9abda0b7e8e915bd2c2303f3" + }, + { + "id": "synth-6", + "identity": "sha256:9a57207ac802bad426435d920b77048ba9dd391797c6a462444c6e375716d36f", + "bytes": 8486166, + "payloadBytes": 8481847, + "chunks": 4, + "fetchMs": 54.40000009536743, + "admissionMs": 0.2999999523162842, + "compressedVerificationMs": 19.100000023841858, + "packageSha256": "b951265b6d86af8c93148d77e547d36e8015e2d370e5ea58c73937ad1bc9c68a" + }, + { + "id": "bass", + "identity": "sha256:ba8f39a6c7b1f22bded6ce6d97361a01ce751282b3f1ab08f931b876c6734ae1", + "bytes": 4192048, + "payloadBytes": 4186111, + "chunks": 4, + "fetchMs": 25.600000023841858, + "admissionMs": 0.3999999761581421, + "compressedVerificationMs": 9.100000023841858, + "packageSha256": "0724e73b3b3f737deedd3dfe685be7323674596cef963ec5331a1eab19700bd3" + }, + { + "id": "bv_s", + "identity": "sha256:c48e9a6b5621bb213de9d6c0c016c557a4516ba0e02de06deb1141fe7946332f", + "bytes": 22224639, + "payloadBytes": 22223178, + "chunks": 5, + "fetchMs": 78.69999992847443, + "admissionMs": 0.20000004768371582, + "compressedVerificationMs": 50.199999928474426, + "packageSha256": "376641bd8b9d97160d26e9cff6ecce224676f0674d4d5b40e64130cd4200e354" + }, + { + "id": "guitar", + "identity": "sha256:e5c44270be4bd0862850977ef3d8a06f1b3803d75c276bb243139bae1f56db62", + "bytes": 8521302, + "payloadBytes": 8519846, + "chunks": 5, + "fetchMs": 42.200000047683716, + "admissionMs": 0.20000004768371582, + "compressedVerificationMs": 19.299999952316284, + "packageSha256": "bbed614e9d8020e592657fd6e8ce726f89eb1d5a42317bd58c04b0bd7457df97" + } + ] + }, + "eightWorkersWallMs": 918.2999999523163, + "eightWorkers": [ + { + "setupWallMs": 213.20000004768372, + "wasmFetchMs": 2.5, + "compileMs": 1.399999976158142, + "wasmSha256": "70caf38185675dff89498e89f98171d49ec6f143a56c6895088d93c35e2018cd", + "stems": [ + { + "id": "drums", + "identity": "sha256:03328fc288eda889bb9bb7813a48bf87d3e011b1698778fc456f57c8561b9db2", + "bytes": 16542989, + "payloadBytes": 16538208, + "chunks": 4, + "fetchMs": 168.40000009536743, + "admissionMs": 1.2999999523162842, + "compressedVerificationMs": 39.60000002384186, + "packageSha256": "9e12a781f0596d78f177463570203389999bd6312f1b340506a163b10b370824" + } + ] + }, + { + "setupWallMs": 248, + "wasmFetchMs": 2.700000047683716, + "compileMs": 1.399999976158142, + "wasmSha256": "70caf38185675dff89498e89f98171d49ec6f143a56c6895088d93c35e2018cd", + "stems": [ + { + "id": "lead-vox", + "identity": "sha256:27c2485abef9b9791cf127b08108e9982383fdbf7736095f8411647e5b82a7ac", + "bytes": 19754378, + "payloadBytes": 19752920, + "chunks": 5, + "fetchMs": 198, + "admissionMs": 0.7999999523162842, + "compressedVerificationMs": 45, + "packageSha256": "8d9595ec06be9422d2a8bd5622790c2e78a03451d92db294ee6c391eba74dbc9" + } + ] + }, + { + "setupWallMs": 51.299999952316284, + "wasmFetchMs": 5.399999976158142, + "compileMs": 1.899999976158142, + "wasmSha256": "70caf38185675dff89498e89f98171d49ec6f143a56c6895088d93c35e2018cd", + "stems": [ + { + "id": "vocal-fx", + "identity": "sha256:361eb2581ace51a5a34c59d83c06ebe6dad73300115db995e6c0692fb4061ae3", + "bytes": 4223284, + "payloadBytes": 4217158, + "chunks": 4, + "fetchMs": 31.5, + "admissionMs": 1.399999976158142, + "compressedVerificationMs": 11, + "packageSha256": "b703951ff75704a35a5c3aa0254da5d8fe10e9d4a0d54efe21732eeee9062f82" + } + ] + }, + { + "setupWallMs": 148.70000004768372, + "wasmFetchMs": 7, + "compileMs": 2, + "wasmSha256": "70caf38185675dff89498e89f98171d49ec6f143a56c6895088d93c35e2018cd", + "stems": [ + { + "id": "fx", + "identity": "sha256:9184f49ee35fa748ecf4d898eb06058d2f499b8348b80736c5c252a99fe36b98", + "bytes": 8777838, + "payloadBytes": 8766086, + "chunks": 4, + "fetchMs": 108.90000009536743, + "admissionMs": 2.6999999284744263, + "compressedVerificationMs": 28.100000023841858, + "packageSha256": "e7a2b1ba6519adffc8618c12e9d4331840f7b02b9abda0b7e8e915bd2c2303f3" + } + ] + }, + { + "setupWallMs": 125.09999990463257, + "wasmFetchMs": 2.5, + "compileMs": 1.6999999284744263, + "wasmSha256": "70caf38185675dff89498e89f98171d49ec6f143a56c6895088d93c35e2018cd", + "stems": [ + { + "id": "synth-6", + "identity": "sha256:9a57207ac802bad426435d920b77048ba9dd391797c6a462444c6e375716d36f", + "bytes": 8486166, + "payloadBytes": 8481847, + "chunks": 4, + "fetchMs": 95.09999990463257, + "admissionMs": 1.3000000715255737, + "compressedVerificationMs": 24.5, + "packageSha256": "b951265b6d86af8c93148d77e547d36e8015e2d370e5ea58c73937ad1bc9c68a" + } + ] + }, + { + "setupWallMs": 92.70000004768372, + "wasmFetchMs": 13.399999976158142, + "compileMs": 1.5, + "wasmSha256": "70caf38185675dff89498e89f98171d49ec6f143a56c6895088d93c35e2018cd", + "stems": [ + { + "id": "bass", + "identity": "sha256:ba8f39a6c7b1f22bded6ce6d97361a01ce751282b3f1ab08f931b876c6734ae1", + "bytes": 4192048, + "payloadBytes": 4186111, + "chunks": 4, + "fetchMs": 62.60000002384186, + "admissionMs": 3.100000023841858, + "compressedVerificationMs": 12, + "packageSha256": "0724e73b3b3f737deedd3dfe685be7323674596cef963ec5331a1eab19700bd3" + } + ] + }, + { + "setupWallMs": 199.70000004768372, + "wasmFetchMs": 3.4000000953674316, + "compileMs": 1.5, + "wasmSha256": "70caf38185675dff89498e89f98171d49ec6f143a56c6895088d93c35e2018cd", + "stems": [ + { + "id": "bv_s", + "identity": "sha256:c48e9a6b5621bb213de9d6c0c016c557a4516ba0e02de06deb1141fe7946332f", + "bytes": 22224639, + "payloadBytes": 22223178, + "chunks": 5, + "fetchMs": 135.20000004768372, + "admissionMs": 1, + "compressedVerificationMs": 58.59999990463257, + "packageSha256": "376641bd8b9d97160d26e9cff6ecce224676f0674d4d5b40e64130cd4200e354" + } + ] + }, + { + "setupWallMs": 134.60000002384186, + "wasmFetchMs": 2.600000023841858, + "compileMs": 1.7000000476837158, + "wasmSha256": "70caf38185675dff89498e89f98171d49ec6f143a56c6895088d93c35e2018cd", + "stems": [ + { + "id": "guitar", + "identity": "sha256:e5c44270be4bd0862850977ef3d8a06f1b3803d75c276bb243139bae1f56db62", + "bytes": 8521302, + "payloadBytes": 8519846, + "chunks": 5, + "fetchMs": 99.5, + "admissionMs": 0.8999999761581421, + "compressedVerificationMs": 29.899999976158142, + "packageSha256": "bbed614e9d8020e592657fd6e8ce726f89eb1d5a42317bd58c04b0bd7457df97" + } + ] + } + ] + }, + "measurements": { + "oneWorkerDecodeMs": { + "values": [ + 2155.399999976158, + 2175.5, + 2187.5, + 2167.5, + 2199.7000000476837 + ], + "min": 2155.399999976158, + "median": 2175.5, + "max": 2199.7000000476837, + "mean": 2177.1200000047684, + "coefficientOfVariation": 0.007069770184553304 + }, + "browserMainThreadIndexedPcmSha256Ms": { + "values": [ + 2184.2999999523163, + 2201.600000023842, + 2193.2000000476837 + ], + "min": 2184.2999999523163, + "median": 2193.2000000476837, + "max": 2201.600000023842, + "mean": 2193.0333333412805, + "coefficientOfVariation": 0.0032209627349599084 + }, + "eightWorkerDecodeWallMs": { + "values": [ + 371.3000000715256, + 404.2999999523163, + 379.2999999523163, + 382.7000000476837, + 394.60000002384186 + ], + "min": 371.3000000715256, + "median": 382.7000000476837, + "max": 404.2999999523163, + "mean": 386.44000000953673, + "coefficientOfVariation": 0.030172282853619007 + }, + "eightWorkerPerStem": [ + [ + { + "id": "drums", + "elapsedMs": 312.60000002384186, + "pcmBytes": 30791214 + }, + { + "id": "lead-vox", + "elapsedMs": 371.10000002384186, + "pcmBytes": 37247538 + }, + { + "id": "vocal-fx", + "elapsedMs": 304.1999999284744, + "pcmBytes": 30161286 + }, + { + "id": "fx", + "elapsedMs": 270.2999999523163, + "pcmBytes": 26982702 + }, + { + "id": "synth-6", + "elapsedMs": 245.39999997615814, + "pcmBytes": 24399084 + }, + { + "id": "bass", + "elapsedMs": 226.39999997615814, + "pcmBytes": 25258248 + }, + { + "id": "bv_s", + "elapsedMs": 366.5, + "pcmBytes": 37235790 + }, + { + "id": "guitar", + "elapsedMs": 355.60000002384186, + "pcmBytes": 37247538 + } + ], + [ + { + "id": "drums", + "elapsedMs": 309.8000000715256, + "pcmBytes": 30791214 + }, + { + "id": "lead-vox", + "elapsedMs": 404, + "pcmBytes": 37247538 + }, + { + "id": "vocal-fx", + "elapsedMs": 349.5, + "pcmBytes": 30161286 + }, + { + "id": "fx", + "elapsedMs": 284.60000002384186, + "pcmBytes": 26982702 + }, + { + "id": "synth-6", + "elapsedMs": 264.39999997615814, + "pcmBytes": 24399084 + }, + { + "id": "bass", + "elapsedMs": 231.70000004768372, + "pcmBytes": 25258248 + }, + { + "id": "bv_s", + "elapsedMs": 359.8000000715256, + "pcmBytes": 37235790 + }, + { + "id": "guitar", + "elapsedMs": 365, + "pcmBytes": 37247538 + } + ], + [ + { + "id": "drums", + "elapsedMs": 315.1999999284744, + "pcmBytes": 30791214 + }, + { + "id": "lead-vox", + "elapsedMs": 378.90000009536743, + "pcmBytes": 37247538 + }, + { + "id": "vocal-fx", + "elapsedMs": 303.89999997615814, + "pcmBytes": 30161286 + }, + { + "id": "fx", + "elapsedMs": 285.2999999523163, + "pcmBytes": 26982702 + }, + { + "id": "synth-6", + "elapsedMs": 241, + "pcmBytes": 24399084 + }, + { + "id": "bass", + "elapsedMs": 219.19999992847443, + "pcmBytes": 25258248 + }, + { + "id": "bv_s", + "elapsedMs": 365.39999997615814, + "pcmBytes": 37235790 + }, + { + "id": "guitar", + "elapsedMs": 363.89999997615814, + "pcmBytes": 37247538 + } + ], + [ + { + "id": "drums", + "elapsedMs": 313.8000000715256, + "pcmBytes": 30791214 + }, + { + "id": "lead-vox", + "elapsedMs": 382.5, + "pcmBytes": 37247538 + }, + { + "id": "vocal-fx", + "elapsedMs": 310.89999997615814, + "pcmBytes": 30161286 + }, + { + "id": "fx", + "elapsedMs": 257.39999997615814, + "pcmBytes": 26982702 + }, + { + "id": "synth-6", + "elapsedMs": 236.5, + "pcmBytes": 24399084 + }, + { + "id": "bass", + "elapsedMs": 215.89999997615814, + "pcmBytes": 25258248 + }, + { + "id": "bv_s", + "elapsedMs": 378.2000000476837, + "pcmBytes": 37235790 + }, + { + "id": "guitar", + "elapsedMs": 357.7000000476837, + "pcmBytes": 37247538 + } + ], + [ + { + "id": "drums", + "elapsedMs": 327.5, + "pcmBytes": 30791214 + }, + { + "id": "lead-vox", + "elapsedMs": 394.5, + "pcmBytes": 37247538 + }, + { + "id": "vocal-fx", + "elapsedMs": 332.2999999523163, + "pcmBytes": 30161286 + }, + { + "id": "fx", + "elapsedMs": 303.6999999284744, + "pcmBytes": 26982702 + }, + { + "id": "synth-6", + "elapsedMs": 291, + "pcmBytes": 24399084 + }, + { + "id": "bass", + "elapsedMs": 237.60000002384186, + "pcmBytes": 25258248 + }, + { + "id": "bv_s", + "elapsedMs": 381.7999999523163, + "pcmBytes": 37235790 + }, + { + "id": "guitar", + "elapsedMs": 375.1999999284744, + "pcmBytes": 37247538 + } + ] + ] + }, + "browserVersion": "153.0.8010.12", + "runner": { + "node": "v22.23.2", + "chrome": "/home/bl/.cache/ms-playwright/chromium-1243/chrome-linux64/chrome", + "codecRoot": "/tmp/miso-simd-study/candidates/codec", + "adapterRoot": "/tmp/miso-simd-study/candidates/adapter", + "decodeRounds": 5, + "shaRounds": 3 + } +} diff --git a/.github/RELEASE_EVIDENCE/006/representative-bun-official-adjacent-baseline.json b/.github/RELEASE_EVIDENCE/006/representative-bun-official-adjacent-baseline.json new file mode 100644 index 0000000..0bc82db --- /dev/null +++ b/.github/RELEASE_EVIDENCE/006/representative-bun-official-adjacent-baseline.json @@ -0,0 +1,52 @@ +{ + "runtime": { + "bun": "1.4.2", + "processVersionCompatibility": "v26.3.0", + "platform": "linux", + "arch": "x64" + }, + "source": { + "codecCommit": "12f54c988a2df319064e6ca3885268d976319cc1", + "adapterCommit": "9b8172fd52746907c113442995dc7538cfe5ad13", + "wasmSha256": "5e282f9874ecb3f49b8ee8437efc318ec14ef5cff5b7580da9d875f94e5c5925", + "shaVariant": "js" + }, + "selection": { + "path": "/data/sparse-pcm-launch/final-per-stem/r1/c48e9a6b5621bb213de9d6c0c016c557a4516ba0e02de06deb1141fe7946332f.mspcm", + "identity": "sha256:c48e9a6b5621bb213de9d6c0c016c557a4516ba0e02de06deb1141fe7946332f", + "chunkIndex": 3, + "compressedBytes": 5124876, + "pcmBytes": 7938000, + "frames": 1323000, + "maximumPcmBlockBytes": 27648, + "expectedCompressedSha256": "ab35d73ddbfb7cbeb9384a34c585edc0141e88bb812d047caad4969a4abe884b", + "compressedSha256": "ab35d73ddbfb7cbeb9384a34c585edc0141e88bb812d047caad4969a4abe884b", + "expectedPcmSha256": "649b462aa016a111211498488ffca8da24e16f1a9b594f58bf38fb03933bb4f5", + "nodePcmSha256": "649b462aa016a111211498488ffca8da24e16f1a9b594f58bf38fb03933bb4f5", + "adapterPcmSha256": "649b462aa016a111211498488ffca8da24e16f1a9b594f58bf38fb03933bb4f5", + "md5Checked": true, + "md5Verified": true + }, + "compileMs": 4.675515999999988, + "shaColdInit16KiBMs": 6.720191, + "shaWarm16KiBMs": 2.259253000000001, + "rounds": 7, + "decodeMs": [ + 62.73593500000004, + 63.47894099999996, + 61.545367000000056, + 58.001526999999896, + 57.11715200000003, + 60.116514999999936, + 58.16211300000009 + ], + "shaMs": [ + 385.286429, + 390.2649530000001, + 389.3823309999998, + 387.09250900000006, + 390.3272310000002, + 386.59131400000024, + 391.51541499999985 + ] +} diff --git a/.github/RELEASE_EVIDENCE/006/representative-bun-official-candidate.json b/.github/RELEASE_EVIDENCE/006/representative-bun-official-candidate.json new file mode 100644 index 0000000..825c0fa --- /dev/null +++ b/.github/RELEASE_EVIDENCE/006/representative-bun-official-candidate.json @@ -0,0 +1,52 @@ +{ + "runtime": { + "bun": "1.4.2", + "processVersionCompatibility": "v26.3.0", + "platform": "linux", + "arch": "x64" + }, + "source": { + "codecCommit": "8c2823b041594a38284b01b5a39d77a6b515716e", + "adapterCommit": "088a14f57a945e6feb93145f3338943276a335dc", + "wasmSha256": "70caf38185675dff89498e89f98171d49ec6f143a56c6895088d93c35e2018cd", + "shaVariant": "simd" + }, + "selection": { + "path": "/data/sparse-pcm-launch/final-per-stem/r1/c48e9a6b5621bb213de9d6c0c016c557a4516ba0e02de06deb1141fe7946332f.mspcm", + "identity": "sha256:c48e9a6b5621bb213de9d6c0c016c557a4516ba0e02de06deb1141fe7946332f", + "chunkIndex": 3, + "compressedBytes": 5124876, + "pcmBytes": 7938000, + "frames": 1323000, + "maximumPcmBlockBytes": 27648, + "expectedCompressedSha256": "ab35d73ddbfb7cbeb9384a34c585edc0141e88bb812d047caad4969a4abe884b", + "compressedSha256": "ab35d73ddbfb7cbeb9384a34c585edc0141e88bb812d047caad4969a4abe884b", + "expectedPcmSha256": "649b462aa016a111211498488ffca8da24e16f1a9b594f58bf38fb03933bb4f5", + "nodePcmSha256": "649b462aa016a111211498488ffca8da24e16f1a9b594f58bf38fb03933bb4f5", + "adapterPcmSha256": "649b462aa016a111211498488ffca8da24e16f1a9b594f58bf38fb03933bb4f5", + "md5Checked": true, + "md5Verified": true + }, + "compileMs": 4.332292999999993, + "shaColdInit16KiBMs": 1.0941039999999589, + "shaWarm16KiBMs": 0.28046399999999494, + "rounds": 7, + "decodeMs": [ + 62.19507500000003, + 54.903835999999956, + 55.460425999999984, + 52.37742299999991, + 55.628777000000014, + 51.869777, + 56.829834000000005 + ], + "shaMs": [ + 33.836445000000026, + 33.51659600000005, + 33.29868099999999, + 33.199231000000054, + 33.24026900000001, + 33.18149799999992, + 33.24723300000005 + ] +} diff --git a/.github/RELEASE_EVIDENCE/006/verification.md b/.github/RELEASE_EVIDENCE/006/verification.md new file mode 100644 index 0000000..c290816 --- /dev/null +++ b/.github/RELEASE_EVIDENCE/006/verification.md @@ -0,0 +1,46 @@ +# Independent verification — 2026-09-13 + +Updated verdict: implementation and targeted CI repair pass independent review; no remaining implementation blocker found. The original CI finding below is resolved by the addendum. No production/spec edits, pushes, publication or performance campaign by this reviewer. + +Reviewed frozen identities: + +- Codec HEAD `8c2823b041594a38284b01b5a39d77a6b515716e`, tree `0028688d80b1baf794508340bc477da590be4b38`; implementation `6265973b730230009b6d07705f1641a948120105`, base `970119ce723666267aa28856f315d7b702945a93`. +- Adapter HEAD `41fb6cd6f1c87d69e68717be18ab64ba18a5e1a1`, tree `296474913d9bded5fcc59780cd66388593a8dc20`; implementation `faf88955fd5c35282c0123554a475bed853014e6`, base `9b8172fd52746907c113442995dc7538cfe5ad13`. + +## Required repair + +Adapter package.json makes `build:sha256:wasm` mandatory in `npm run check`. Its npm-publish workflow runs that check after installing only Node/npm. It does not install Emscripten or set CODEC_EMSCRIPTEN_ROOT; the SHA build script defaults to `/data/codec-tooling/emsdk/upstream/emscripten`. Both hosted publish and verify dispatches therefore fail before qualification. Independently reproduced missing-toolchain `spawn .../emcc ENOENT` with a nonexistent toolchain override. Provision the pinned toolchain in that workflow and retain reproducibility verification. This is the sole implementation blocker found. + +## Correctness and bounds + +Decoder changes are compiler flags, feature/provenance metadata, generated asset/hash and documentation. Decoder source/control flow and encoder source remain unchanged. Disassembly confirms 222 SIMD instruction lines, only codec.read import, unchanged exports and fixed 32-page (2 MiB) memory. Asset: 75,923 bytes, SHA-256 `70caf38185675dff89498e89f98171d49ec6f143a56c6895088d93c35e2018cd`. Existing input/output caps, stacks and ABI remain intact. + +SHA C preserves the existing constants, unsigned 32-bit schedule/round arithmetic and ordered chaining. SIMD reverses bytes within four independent big-endian words. Selected module: 957 bytes, SHA-256 `4435c2078c2783a77c06532e480d195ce314f500b849688d89d494432789fc28`. It contains 12 SIMD instruction lines (the spec's 13 appears to include the v128 local declaration), no imports, only memory/compression exports, fixed 64 KiB memory, 4 KiB stack and 256-byte schedule. State at 0 and input at 16 KiB do not overlap emitted stack/schedule/constants. Input batches stay within 16 KiB/256 blocks. Independent memory growth attempt throws RangeError. + +Each hasher retains JS-owned state, tail, length and finished flag. Synchronous bridge copies state in/out and retains no caller view; no callbacks/await while scratch is borrowed. Initialization selects once and capability failure uses JS; runtime compression failures propagate. Padding/finalization are unchanged. The 131,072-byte accounting addition retains 8 MiB reservations. Resolver/store/worker readiness, integrity, cancellation and backpressure pipelines have no production edits. Existing NOTICE identifies the authorized SHA source; this C port introduces no separately borrowed algorithm/license dependency. + +## Independently executed checks + +- Adapter `npm run check`: passed SHA reproducibility, formatting, types/source policy, decoder audit, all 329 tests, build and package policy (208 files, 352,214 bytes). Log: verification-adapter-check.log. +- Codec `bun run check`: 40 passed, 5 expected native-only skips. Log: verification-codec-check.log. +- Codec `CODEC_NATIVE_FLAC=/data/codec-tooling/flac-scalar/src/flac/flac bun run test:integration`: 5 passed. Log: verification-codec-native.log. +- Codec `bun run build:wasm:verify`: encoder and decoder reproduced exactly. Log: verification-codec-rebuild.log. +- Independent Node crypto checks at lengths 0/3/55/56/63/64/65/16320/16383/16384/16385/16448/32768/49153/1000001, with offset DataViews and 113-byte streaming partitions. Fresh-module scenarios: WebAssembly absent; Module throws CompileError; normal accelerated backend. All passed. Instrumented normal path created one module/instance and performed 18,297 compression calls; capability failure attempted compilation once. An injected compression trap propagated without JS retry. Existing tests cover independent interleaved states, input mutation and finalization. Initial review instrumentation needed correction to preserve nonenumerable WebAssembly properties; these are the corrected results with explicit backend call counts. +- Packed rebuilt adapter with `npm pack --ignore-scripts`. Archive `/tmp/miso-simd-study/misofm-engine-web-adapter-0.4.0.tgz`, SHA-256 `df522f6e9d408f255d03e35c764f2da61680b911c693cfb180ab9b2284f851f1`. Extracted main dist/stems/sha256-wasm.js and bundled dist/internal/engine-web-flac-worker.js each contain exactly one payload with the selected SHA hash. No external SHA fetch is needed. This archive retains declared published codec 0.1.0; joint codec dependency/version qualification remains root-owned. + +Implementation-reported gates, not redundantly rerun: codec packed Bun/Node and Chromium/Firefox/WebKit consumers with both Effect peers; adapter ordinary/indexed sparse packed browser profiles and Chromium OPFS. Root independently reports actual macOS Chromium/WebKit OPFS passing frozen adapter HEAD: https://github.com/misofm/engine-web-adapter/actions/runs/34750387870 . This resolves the Linux WebKit capability limitation for that revision. + +## Measurement and release limits + +Reviewed baseline/scalar/SIMD/adjacent/final evidence with matching totals: 35 chunks and 547,303,704 indexed PCM hash bytes including canonical zero gaps. Final record identifies frozen implementation commits and selected decoder hash. Preliminary evidence uses precommit HEADs with working changes; final postcommit evidence is the provenance anchor. Approximately 80% hash reduction is predominantly JS-to-Wasm; SIMD-versus-scalar adds approximately 1.5%. Decoder improvement is modest. These are isolated compute results, not app-open/network/OPFS speedups. Official post-verification comparison remains pending and determines which candidates ship. + +After CI repair, perform targeted verification and record its revision. Root owns official measurements, version/dependency changes, publication and registry/app qualification. Tracked frozen source stayed unchanged; transient adapter SHA build cache created by verification was removed afterward. + + +## Targeted CI repair recheck — 2026-09-13 + +Reviewed adapter `088a14f57a945e6feb93145f3338943276a335dc`, tree `d453f0937c99954bd7a8917cec06ce2682f77ee5`; working tree clean. Diff from frozen `41fb6cd` contains only npm-publish workflow provisioning and issue-spec evidence. Runtime source and generated bytes are unchanged. + +The workflow now clones Emscripten SDK tag 6.0.9, asserts SDK commit `5eb0bde7585670252e8ba05e9d361627bffd08b5`, installs/activates 6.0.9 and writes CODEC_EMSCRIPTEN_ROOT to GITHUB_ENV before the subsequent npm run check step. Its path resolves to the SDK root expected by the SHA build script, including sibling wasm-ld/wasm-opt and SDK release mapping. Provisioning is unconditional for both publish and verify modes. It matches the codec's existing pinned provisioning recipe. The build script continues verifying compiler commit, SDK commit/release mapping and Binaryen version; no gate was weakened. + +Original CI blocker is resolved by inspection. Luna reports npm run check passing again (329 tests); full suites were not repeated because this repair changes no runtime/build-script bytes. Hosted execution of the repaired release workflow is still a release gate, not claimed as performed here. Independent verification is complete; hand off to the official after measurements and root-owned release qualification. diff --git a/package.json b/package.json index 6936f3a..b159eb2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@misofm/codec", - "version": "0.1.0", + "version": "0.1.1", "description": "Effect-based audio codec primitives backed by pinned libFLAC WebAssembly", "license": "Apache-2.0", "repository": { From 834e149998037cc91a09d2057c3e2477bc261618 Mon Sep 17 00:00:00 2001 From: BL Date: Sun, 13 Sep 2026 10:13:07 +0000 Subject: [PATCH 4/4] docs: format release verification evidence --- .github/RELEASE_EVIDENCE/006/AFTER.md | 18 +++++++++--------- .github/RELEASE_EVIDENCE/006/verification.md | 1 - 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/.github/RELEASE_EVIDENCE/006/AFTER.md b/.github/RELEASE_EVIDENCE/006/AFTER.md index f44f520..b2b5ebf 100644 --- a/.github/RELEASE_EVIDENCE/006/AFTER.md +++ b/.github/RELEASE_EVIDENCE/006/AFTER.md @@ -45,11 +45,11 @@ package/compressed correctness hashes, manifest admission, Wasm fetch/compile, worker construction, network/CDN, OPFS, quota estimation, structured-clone acknowledgements, and input/output waits are outside the timed sections. -| Slice | Published adjacent samples (ms) | Candidate samples (ms) | Median change | Candidate CV / throughput | -| --- | --- | --- | ---: | ---: | -| One-worker FLAC decode | 2197.2, 2232.9, 2268.7, 2243.6, 2226.3 | 2155.4, 2175.5, 2187.5, 2167.5, 2199.7 | 2232.9 → 2175.5, **2.57% faster** | 0.71%; 109.30 MiB/s | -| Eight-worker decode makespan | 399.9, 404.9, 399.9, 391.7, 416.3 | 371.3, 404.3, 379.3, 382.7, 394.6 | 399.9 → 382.7, **4.30% faster** | 3.02%; 621.30 MiB/s | -| Main-thread indexed PCM SHA | 11589.8, 11568.0, 11550.9 | 2184.3, 2201.6, 2193.2 | 11568.0 → 2193.2, **81.04% faster** | 0.32%; 237.99 MiB/s | +| Slice | Published adjacent samples (ms) | Candidate samples (ms) | Median change | Candidate CV / throughput | +| ---------------------------- | -------------------------------------- | -------------------------------------- | ----------------------------------: | ------------------------: | +| One-worker FLAC decode | 2197.2, 2232.9, 2268.7, 2243.6, 2226.3 | 2155.4, 2175.5, 2187.5, 2167.5, 2199.7 | 2232.9 → 2175.5, **2.57% faster** | 0.71%; 109.30 MiB/s | +| Eight-worker decode makespan | 399.9, 404.9, 399.9, 391.7, 416.3 | 371.3, 404.3, 379.3, 382.7, 394.6 | 399.9 → 382.7, **4.30% faster** | 3.02%; 621.30 MiB/s | +| Main-thread indexed PCM SHA | 11589.8, 11568.0, 11550.9 | 2184.3, 2201.6, 2193.2 | 11568.0 → 2193.2, **81.04% faster** | 0.32%; 237.99 MiB/s | The unchanged-control CVs were 1.04%, 2.01%, and 0.14% respectively. Decoder gains are modest. The one-worker median improvement exceeds run variation and @@ -73,10 +73,10 @@ The identical largest indexed chunk was rerun for seven rounds on Bun 1.4.2. Bun's reported `process.version` is compatibility metadata and is not a Node 26 qualification. -| Slice | Published adjacent median (range; CV) | Candidate median (range; CV) | Change | -| --- | ---: | ---: | ---: | -| FLAC decode, 7,938,000 PCM bytes | 60.117 ms (57.117–63.479; 3.85%) | 55.460 ms (51.870–62.195; 5.68%) | **7.75% faster** | -| PCM SHA-256, 7,938,000 bytes | 389.382 ms (385.286–391.515; 0.55%) | 33.247 ms (33.181–33.836; 0.66%) | **91.46% faster** | +| Slice | Published adjacent median (range; CV) | Candidate median (range; CV) | Change | +| -------------------------------- | ------------------------------------: | -------------------------------: | ----------------: | +| FLAC decode, 7,938,000 PCM bytes | 60.117 ms (57.117–63.479; 3.85%) | 55.460 ms (51.870–62.195; 5.68%) | **7.75% faster** | +| PCM SHA-256, 7,938,000 bytes | 389.382 ms (385.286–391.515; 0.55%) | 33.247 ms (33.181–33.836; 0.66%) | **91.46% faster** | Exact samples are retained in the official Bun JSON files. The representative result supports the browser direction; the whole-corpus Chromium comparison is diff --git a/.github/RELEASE_EVIDENCE/006/verification.md b/.github/RELEASE_EVIDENCE/006/verification.md index c290816..9f59759 100644 --- a/.github/RELEASE_EVIDENCE/006/verification.md +++ b/.github/RELEASE_EVIDENCE/006/verification.md @@ -36,7 +36,6 @@ Reviewed baseline/scalar/SIMD/adjacent/final evidence with matching totals: 35 c After CI repair, perform targeted verification and record its revision. Root owns official measurements, version/dependency changes, publication and registry/app qualification. Tracked frozen source stayed unchanged; transient adapter SHA build cache created by verification was removed afterward. - ## Targeted CI repair recheck — 2026-09-13 Reviewed adapter `088a14f57a945e6feb93145f3338943276a335dc`, tree `d453f0937c99954bd7a8917cec06ce2682f77ee5`; working tree clean. Diff from frozen `41fb6cd` contains only npm-publish workflow provisioning and issue-spec evidence. Runtime source and generated bytes are unchanged.