{
  "schemaVersion": 1,
  "generatedAt": "2026-11-06T08:43:26.155Z",
  "revision": "60794e8973d9",
  "durationMs": 39271,
  "status": "passed",
  "suites": [
    {
      "name": "Frontend behaviour",
      "status": "passed",
      "durationMs": 17044,
      "passed": 309,
      "failed": 0,
      "skipped": 0,
      "cases": [
        {
          "name": "forest: synthCampfireCrackle schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 15.116628
        },
        {
          "name": "forest: synthWoodlandSnuffle schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 2.165362
        },
        {
          "name": "forest: synthHutWoodCreak schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.64738
        },
        {
          "name": "forest: synthBadgerGrumble schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.531364
        },
        {
          "name": "forest: synthOwlNightHoot schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.656136
        },
        {
          "name": "forest: synthPineNeedleRustle schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.523129
        },
        {
          "name": "forest: synthBirdFlockChirp schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.639736
        },
        {
          "name": "forest: synthTieredPineWind schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.380334
        },
        {
          "name": "ocean: synthCrabClick schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.560078
        },
        {
          "name": "ocean: synthWaterOarDip schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.60426
        },
        {
          "name": "ocean: synthLighthouseBell schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.489547
        },
        {
          "name": "ocean: synthSealSplashChime schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.640397
        },
        {
          "name": "ocean: synthSailboatWaveLapping schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.591576
        },
        {
          "name": "ocean: synthSeagullCryChime schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.53984
        },
        {
          "name": "ocean: synthSeagullFlockChorus schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.734051
        },
        {
          "name": "cosmic: synthMoonGlowChime schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.721848
        },
        {
          "name": "cosmic: synthCosmicWobble schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.566309
        },
        {
          "name": "cosmic: synthStargazerLantern schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.624948
        },
        {
          "name": "cosmic: synthCelestialStarGlass schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.654884
        },
        {
          "name": "cyberpunk: synthCatPurrChime schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.647761
        },
        {
          "name": "cyberpunk: synthHovercarSpinner schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.544759
        },
        {
          "name": "cyberpunk: synthCleanerRigWiper schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.538758
        },
        {
          "name": "cyberpunk: synthNoodleNeonBuzz schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.597727
        },
        {
          "name": "mist: synthMonkSingingBowl schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.583481
        },
        {
          "name": "mist: synthTempleBell schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.614168
        },
        {
          "name": "mist: synthGoatAlpineBell schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.610862
        },
        {
          "name": "mist: synthLanternShimmer schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.573313
        },
        {
          "name": "mist: synthShishiOdoshiClack schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.59347
        },
        {
          "name": "mist: synthToriiWindChime schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.67438
        },
        {
          "name": "mist: synthVillageBellHearth schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.514814
        },
        {
          "name": "lake: synthFrogCroakChime schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 2.437918
        },
        {
          "name": "lake: synthWoodBlockHit schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.895491
        },
        {
          "name": "lake: synthCraneWingFlap schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.621943
        },
        {
          "name": "lake: synthStoneBridgeBrook schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.567
        },
        {
          "name": "lake: synthStoneArchEcho schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.684228
        },
        {
          "name": "lake: synthWaterCarrierFootsteps schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 9.61541
        },
        {
          "name": "lake: synthVillageBarnTimber schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.820562
        },
        {
          "name": "lake: synthOakBarrelKnock schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.515855
        },
        {
          "name": "lake: synthVillageWellPulley schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.400752
        },
        {
          "name": "lake: synthSwanGlideRipples schedules finite sources into its output",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.509253
        },
        {
          "name": "ambient: synthCricketChirp builds a connected scheduled graph",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 2.775365
        },
        {
          "name": "ambient: synthOwlHoot builds a connected scheduled graph",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 2.608534
        },
        {
          "name": "ambient: synthSeagull builds a connected scheduled graph",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 2.666393
        },
        {
          "name": "ambient: synthChime builds a connected scheduled graph",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 2.614846
        },
        {
          "name": "ambient: synthMeteorWhistle builds a connected scheduled graph",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 2.554845
        },
        {
          "name": "ambient: synthTempleBowl builds a connected scheduled graph",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.752746
        },
        {
          "name": "ambient: synthBambooFlute builds a connected scheduled graph",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.727699
        },
        {
          "name": "ambient: synthWaterDrop builds a connected scheduled graph",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.525533
        },
        {
          "name": "ambient: synthRainDrop builds a connected scheduled graph",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.524502
        },
        {
          "name": "layer cyberHum starts and stops without leaving its sources connected",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 11.136635
        },
        {
          "name": "layer neonPulse starts and stops without leaving its sources connected",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 3.460648
        },
        {
          "name": "layer holoChimes starts and stops without leaving its sources connected",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 3.115427
        },
        {
          "name": "layer crickets starts and stops without leaving its sources connected",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 3.176881
        },
        {
          "name": "layer owl starts and stops without leaving its sources connected",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 2.990685
        },
        {
          "name": "layer rustle starts and stops without leaving its sources connected",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 2.952524
        },
        {
          "name": "layer seagulls starts and stops without leaving its sources connected",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 3.13343
        },
        {
          "name": "layer chimes starts and stops without leaving its sources connected",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 3.193512
        },
        {
          "name": "layer foam starts and stops without leaving its sources connected",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 3.007887
        },
        {
          "name": "layer glassChimes starts and stops without leaving its sources connected",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 3.960366
        },
        {
          "name": "layer stellarPulse starts and stops without leaving its sources connected",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 3.425242
        },
        {
          "name": "layer meteorWhistle starts and stops without leaving its sources connected",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 2.846166
        },
        {
          "name": "layer templeBowl starts and stops without leaving its sources connected",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 2.886131
        },
        {
          "name": "layer bambooFlute starts and stops without leaving its sources connected",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 2.89099
        },
        {
          "name": "layer mountainGust starts and stops without leaving its sources connected",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 2.782197
        },
        {
          "name": "layer waterDrops starts and stops without leaving its sources connected",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 2.811162
        },
        {
          "name": "layer lakeInsects starts and stops without leaving its sources connected",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 3.686738
        },
        {
          "name": "layer echoChimes starts and stops without leaving its sources connected",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 12.09229
        },
        {
          "name": "layer rain starts and stops without leaving its sources connected",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 3.240328
        },
        {
          "name": "forest: offline beds, music, drums and layers connect to the export bus",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 7.98967
        },
        {
          "name": "ocean: offline beds, music, drums and layers connect to the export bus",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 9.85802
        },
        {
          "name": "cosmic: offline beds, music, drums and layers connect to the export bus",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 22.926934
        },
        {
          "name": "mist: offline beds, music, drums and layers connect to the export bus",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 9.607074
        },
        {
          "name": "lake: offline beds, music, drums and layers connect to the export bus",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 8.939805
        },
        {
          "name": "cyberpunk: offline beds, music, drums and layers connect to the export bus",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 19.276674
        },
        {
          "name": "WAV export preserves 1 channels, PCM clipping, length and RIFF metadata",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 3.072676
        },
        {
          "name": "WAV export preserves 2 channels, PCM clipping, length and RIFF metadata",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.671034
        },
        {
          "name": "MP3 tags contain requested metadata and encoded PCM is clipped",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 2.469907
        },
        {
          "name": "spatial off: routing respects channels and saved preference",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.761722
        },
        {
          "name": "spatial binaural: routing respects channels and saved preference",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.474368
        },
        {
          "name": "spatial surround: routing respects channels and saved preference",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.580305
        },
        {
          "name": "drum voice lofi: all percussion sources schedule and stop",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 2.337692
        },
        {
          "name": "drum voice electro: all percussion sources schedule and stop",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.712571
        },
        {
          "name": "drum voice sf2-kit: all percussion sources schedule and stop",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 1.431048
        },
        {
          "name": "drum voice brush-acoustic: all percussion sources schedule and stop",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 2.044868
        },
        {
          "name": "drum voice lofi-electric: all percussion sources schedule and stop",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 2.088179
        },
        {
          "name": "forest: playback toggles, gain controls and transport preserve explicit state",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 50.173532
        },
        {
          "name": "ocean: playback toggles, gain controls and transport preserve explicit state",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 11.831927
        },
        {
          "name": "cosmic: playback toggles, gain controls and transport preserve explicit state",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 9.893323
        },
        {
          "name": "mist: playback toggles, gain controls and transport preserve explicit state",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 12.566892
        },
        {
          "name": "lake: playback toggles, gain controls and transport preserve explicit state",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 9.407714
        },
        {
          "name": "cyberpunk: playback toggles, gain controls and transport preserve explicit state",
          "file": "src/__tests__/Audio.test.ts",
          "status": "passed",
          "durationMs": 26.572087
        },
        {
          "name": "Master export wav, active tracks=false: output type, channel count and completion progress",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 43.325132
        },
        {
          "name": "Master export wav, active tracks=true: output type, channel count and completion progress",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 42.13444
        },
        {
          "name": "Master export wav51, active tracks=false: output type, channel count and completion progress",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 15.232863
        },
        {
          "name": "Master export wav51, active tracks=true: output type, channel count and completion progress",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 24.088252
        },
        {
          "name": "Master export mp3, active tracks=false: output type, channel count and completion progress",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 13.725203
        },
        {
          "name": "Master export mp3, active tracks=true: output type, channel count and completion progress",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 22.245108
        },
        {
          "name": "Chord and harmony voice sine supports key, volume and stop transitions",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 10.010623
        },
        {
          "name": "Chord and harmony voice vangelis supports key, volume and stop transitions",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 8.209418
        },
        {
          "name": "Chord and harmony voice space-organ supports key, volume and stop transitions",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 8.196163
        },
        {
          "name": "Chord and harmony voice angelic supports key, volume and stop transitions",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 7.212657
        },
        {
          "name": "Chord and harmony voice glass supports key, volume and stop transitions",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 7.365431
        },
        {
          "name": "Chord and harmony voice warm-pad supports key, volume and stop transitions",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 11.684841
        },
        {
          "name": "Chord and harmony voice sf2-acoustic-harp supports key, volume and stop transitions",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 12.816546
        },
        {
          "name": "Chord and harmony voice sf2-strings supports key, volume and stop transitions",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 8.972495
        },
        {
          "name": "Chord and harmony voice sf2-music-box supports key, volume and stop transitions",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 16.545011
        },
        {
          "name": "Chord and harmony voice sf2-tubular-bells supports key, volume and stop transitions",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 9.507339
        },
        {
          "name": "Spatial wind drift uses modern panner API and cleanup",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 2.578189
        },
        {
          "name": "Spatial wind drift uses legacy panner API and cleanup",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 1.535442
        },
        {
          "name": "Spatial wind drift uses stereo panner API and cleanup",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 1.409507
        },
        {
          "name": "Spatial wind drift uses surround panner API and cleanup",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 1.523399
        },
        {
          "name": "Spatial water drift uses modern panner API and cleanup",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 1.465783
        },
        {
          "name": "Spatial water drift uses legacy panner API and cleanup",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 1.536884
        },
        {
          "name": "Spatial water drift uses stereo panner API and cleanup",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 2.251182
        },
        {
          "name": "Spatial water drift uses surround panner API and cleanup",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 1.573412
        },
        {
          "name": "Spatial bird drift uses modern panner API and cleanup",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 1.424255
        },
        {
          "name": "Spatial bird drift uses legacy panner API and cleanup",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 1.407535
        },
        {
          "name": "Spatial bird drift uses stereo panner API and cleanup",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 1.427431
        },
        {
          "name": "Spatial bird drift uses surround panner API and cleanup",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 1.390973
        },
        {
          "name": "Spatial cosmic drift uses modern panner API and cleanup",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 1.403918
        },
        {
          "name": "Spatial cosmic drift uses legacy panner API and cleanup",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 1.403937
        },
        {
          "name": "Spatial cosmic drift uses stereo panner API and cleanup",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 1.342433
        },
        {
          "name": "Spatial cosmic drift uses surround panner API and cleanup",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 1.446466
        },
        {
          "name": "Spatial vehicle drift uses modern panner API and cleanup",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 13.09385
        },
        {
          "name": "Spatial vehicle drift uses legacy panner API and cleanup",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 1.602286
        },
        {
          "name": "Spatial vehicle drift uses stereo panner API and cleanup",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 1.401022
        },
        {
          "name": "Spatial vehicle drift uses surround panner API and cleanup",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 1.436628
        },
        {
          "name": "Spatial preferences resolve legacy booleans, inferred hardware and legacy panners",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 1.764338
        },
        {
          "name": "Mobile media controls call supplied callbacks, recover focus and release wake locks",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 3.318364
        },
        {
          "name": "Soundfont decoded zones select pitch, loop points and scheduling safely",
          "file": "src/__tests__/AudioEdges.test.ts",
          "status": "passed",
          "durationMs": 3.026491
        },
        {
          "name": "Card page controls, story selection and settings remain in sync with storage",
          "file": "src/__tests__/Controllers.test.ts",
          "status": "passed",
          "durationMs": 48.590262
        },
        {
          "name": "Card service narration 1ch: starts, caches, pauses and completes a story",
          "file": "src/__tests__/Controllers.test.ts",
          "status": "passed",
          "durationMs": 19.71206
        },
        {
          "name": "Card service narration 2ch: starts, caches, pauses and completes a story",
          "file": "src/__tests__/Controllers.test.ts",
          "status": "passed",
          "durationMs": 15.416139
        },
        {
          "name": "Card service narration prefetches the next paragraph during playback and shares an in-flight request",
          "file": "src/__tests__/Controllers.test.ts",
          "status": "passed",
          "durationMs": 22.591617
        },
        {
          "name": "Older narrators send their deeper pitch and cache separately from the plain voice",
          "file": "src/__tests__/Controllers.test.ts",
          "status": "passed",
          "durationMs": 12.434432
        },
        {
          "name": "Card global hooks pause, resume, apply URL story and clean up subscriptions",
          "file": "src/__tests__/Controllers.test.ts",
          "status": "passed",
          "durationMs": 18.710707
        },
        {
          "name": "Shared narration autoplay waits for gesture when unlocked=false",
          "file": "src/__tests__/Controllers.test.ts",
          "status": "passed",
          "durationMs": 16.883067
        },
        {
          "name": "Shared narration autoplay waits for gesture when unlocked=true",
          "file": "src/__tests__/Controllers.test.ts",
          "status": "passed",
          "durationMs": 26.750984
        },
        {
          "name": "New playlist modal confirm commits only deliberate confirmation",
          "file": "src/__tests__/Controllers.test.ts",
          "status": "passed",
          "durationMs": 6.044925
        },
        {
          "name": "New playlist modal cancel commits only deliberate confirmation",
          "file": "src/__tests__/Controllers.test.ts",
          "status": "passed",
          "durationMs": 3.322881
        },
        {
          "name": "Edit track save does not leak handlers",
          "file": "src/__tests__/Controllers.test.ts",
          "status": "passed",
          "durationMs": 3.643498
        },
        {
          "name": "Edit track cancel does not leak handlers",
          "file": "src/__tests__/Controllers.test.ts",
          "status": "passed",
          "durationMs": 4.17173
        },
        {
          "name": "Edit playlist save does not leak handlers",
          "file": "src/__tests__/Controllers.test.ts",
          "status": "passed",
          "durationMs": 4.034065
        },
        {
          "name": "Edit playlist cancel does not leak handlers",
          "file": "src/__tests__/Controllers.test.ts",
          "status": "passed",
          "durationMs": 3.133309
        },
        {
          "name": "Playlist conflict keep-both resolves once and hides dialog",
          "file": "src/__tests__/Controllers.test.ts",
          "status": "passed",
          "durationMs": 3.672532
        },
        {
          "name": "Playlist conflict merge resolves once and hides dialog",
          "file": "src/__tests__/Controllers.test.ts",
          "status": "passed",
          "durationMs": 3.221753
        },
        {
          "name": "Playlist conflict overwrite resolves once and hides dialog",
          "file": "src/__tests__/Controllers.test.ts",
          "status": "passed",
          "durationMs": 3.097813
        },
        {
          "name": "Playlist conflict cancel resolves once and hides dialog",
          "file": "src/__tests__/Controllers.test.ts",
          "status": "passed",
          "durationMs": 12.459919
        },
        {
          "name": "Mix title prompt and generic confirmation confirm",
          "file": "src/__tests__/Controllers.test.ts",
          "status": "passed",
          "durationMs": 4.848219
        },
        {
          "name": "Mix title prompt and generic confirmation cancel",
          "file": "src/__tests__/Controllers.test.ts",
          "status": "passed",
          "durationMs": 4.658506
        },
        {
          "name": "Shared playlist welcome existing=false owner=false",
          "file": "src/__tests__/Controllers.test.ts",
          "status": "passed",
          "durationMs": 6.571745
        },
        {
          "name": "Shared playlist welcome existing=false owner=true",
          "file": "src/__tests__/Controllers.test.ts",
          "status": "passed",
          "durationMs": 4.303295
        },
        {
          "name": "Shared playlist welcome existing=true owner=false",
          "file": "src/__tests__/Controllers.test.ts",
          "status": "passed",
          "durationMs": 4.975616
        },
        {
          "name": "Shared playlist welcome existing=true owner=true",
          "file": "src/__tests__/Controllers.test.ts",
          "status": "passed",
          "durationMs": 7.936535
        },
        {
          "name": "Owned playlist auto-sync reports success without modifying ownership",
          "file": "src/__tests__/Controllers.test.ts",
          "status": "passed",
          "durationMs": 5.55847
        },
        {
          "name": "Owned playlist auto-sync reports error without modifying ownership",
          "file": "src/__tests__/Controllers.test.ts",
          "status": "passed",
          "durationMs": 1.823282
        },
        {
          "name": "Owned playlist auto-sync reports network without modifying ownership",
          "file": "src/__tests__/Controllers.test.ts",
          "status": "passed",
          "durationMs": 23.7387
        },
        {
          "name": "Playlist CRUD validates missing targets, isolates forks and round trips import",
          "file": "src/__tests__/Controllers.test.ts",
          "status": "passed",
          "durationMs": 4.715071
        },
        {
          "name": "Followed playlist refresh updates public data and preserves local identity",
          "file": "src/__tests__/Controllers.test.ts",
          "status": "passed",
          "durationMs": 8.122761
        },
        {
          "name": "Mulberry32 matches reference vectors and preserves deterministic seed contracts",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 3.131335
        },
        {
          "name": "Procedural far/flat: stable seed, finite geometry and SVG output",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 283.641085
        },
        {
          "name": "Procedural far/triangular: stable seed, finite geometry and SVG output",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 212.455213
        },
        {
          "name": "Procedural mid/flat: stable seed, finite geometry and SVG output",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 188.918364
        },
        {
          "name": "Procedural mid/triangular: stable seed, finite geometry and SVG output",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 159.619076
        },
        {
          "name": "Procedural near/flat: stable seed, finite geometry and SVG output",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 182.382272
        },
        {
          "name": "Procedural near/triangular: stable seed, finite geometry and SVG output",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 155.13825
        },
        {
          "name": "Scene catalog has complete stories, playable defaults and stable text helpers",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 0.675737
        },
        {
          "name": "Storage round trips settings, recovers malformed JSON and clears all domains",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 11.281086
        },
        {
          "name": "Power policy respects explicit preferences and battery changes",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 3.845724
        },
        {
          "name": "Interactive trigger campfire reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 3.434599
        },
        {
          "name": "Interactive trigger hedgehog reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 2.614533
        },
        {
          "name": "Interactive trigger hut reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 1.482959
        },
        {
          "name": "Interactive trigger badger reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 1.436883
        },
        {
          "name": "Interactive trigger owl reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 1.481906
        },
        {
          "name": "Interactive trigger pinetree reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 1.536268
        },
        {
          "name": "Interactive trigger bird reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 1.486786
        },
        {
          "name": "Interactive trigger birdflock reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 1.493628
        },
        {
          "name": "Interactive trigger tieredpine reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 1.419321
        },
        {
          "name": "Interactive trigger crab reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 1.522272
        },
        {
          "name": "Interactive trigger boat reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 1.60164
        },
        {
          "name": "Interactive trigger lighthouse reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 1.639079
        },
        {
          "name": "Interactive trigger seal reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 2.163234
        },
        {
          "name": "Interactive trigger sailboat reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 2.148287
        },
        {
          "name": "Interactive trigger seagull reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 2.080049
        },
        {
          "name": "Interactive trigger seagullflock reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 2.190855
        },
        {
          "name": "Interactive trigger monk reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 2.421946
        },
        {
          "name": "Interactive trigger pagoda reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 2.337568
        },
        {
          "name": "Interactive trigger goat reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 2.158495
        },
        {
          "name": "Interactive trigger lanterns reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 1.880208
        },
        {
          "name": "Interactive trigger shishiodoshi reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 1.496353
        },
        {
          "name": "Interactive trigger toriigate reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 1.507014
        },
        {
          "name": "Interactive trigger village reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 1.49418
        },
        {
          "name": "Interactive trigger moon reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 1.504158
        },
        {
          "name": "Interactive trigger observatory reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 1.444698
        },
        {
          "name": "Interactive trigger stargazer reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 1.477919
        },
        {
          "name": "Interactive trigger celestialbird reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 1.484992
        },
        {
          "name": "Interactive trigger cat reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 1.486295
        },
        {
          "name": "Interactive trigger hovercar reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 1.418549
        },
        {
          "name": "Interactive trigger cleanerrig reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 1.39227
        },
        {
          "name": "Interactive trigger noodlebar reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 1.599015
        },
        {
          "name": "Interactive trigger frog reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 1.770063
        },
        {
          "name": "Interactive trigger crane reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 1.599365
        },
        {
          "name": "Interactive trigger bridge reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 1.819835
        },
        {
          "name": "Interactive trigger stonearch reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 2.249915
        },
        {
          "name": "Interactive trigger carrier reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 2.312602
        },
        {
          "name": "Interactive trigger barn reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 2.187278
        },
        {
          "name": "Interactive trigger barrels reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 1.894674
        },
        {
          "name": "Interactive trigger well reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 1.475244
        },
        {
          "name": "Interactive trigger swan reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 1.55893
        },
        {
          "name": "Interactive trigger default reaches the selected scene destination",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 1.509639
        },
        {
          "name": "Story customisation uses text nodes, persists values and restores defaults",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 10.590481
        },
        {
          "name": "Offline story 1 channels: fetch cache reuse and ordered starts",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 5.054002
        },
        {
          "name": "Offline story 2 channels: fetch cache reuse and ordered starts",
          "file": "src/__tests__/Core.test.ts",
          "status": "passed",
          "durationMs": 2.842638
        },
        {
          "name": "Seeded random numerical contract covers zero, negatives, strings, bounds and shuffle independence",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 4.945009
        },
        {
          "name": "Story label formatting hero_name",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 0.39271
        },
        {
          "name": "Story label formatting companion_name",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 0.185415
        },
        {
          "name": "Story label formatting magic_item",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 0.126044
        },
        {
          "name": "Story label formatting HERO_NAME",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 1.690712
        },
        {
          "name": "Story label formatting empty",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 0.11848
        },
        {
          "name": "Story label formatting foo_bar_baz",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 0.107971
        },
        {
          "name": "Story speech punctuation: \"*soft*\"",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 0.35552
        },
        {
          "name": "Story speech punctuation: \"a—b\"",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 0.263129
        },
        {
          "name": "Story speech punctuation: \"a–b\"",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 0.118771
        },
        {
          "name": "Story speech punctuation: \"Wait...Next\"",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 0.152824
        },
        {
          "name": "Story speech punctuation: \"“hello”\"",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 0.145731
        },
        {
          "name": "Story speech punctuation: \"one,,two\"",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 0.106037
        },
        {
          "name": "Story speech punctuation: \" a \\n b\"",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 0.110816
        },
        {
          "name": "Story speech punctuation: \"\"",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 0.099204
        },
        {
          "name": "Story speech punctuation: \"plain\"",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 0.095237
        },
        {
          "name": "Paragraph hash uses published FNV-1a vector and unsigned encoding",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 0.319333
        },
        {
          "name": "Surround reference vector 0,-5 matches discrete speaker gains",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 13.745974
        },
        {
          "name": "Surround reference vector -5,-5 matches discrete speaker gains",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 4.445601
        },
        {
          "name": "Surround reference vector 5,-5 matches discrete speaker gains",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.286178
        },
        {
          "name": "Surround reference vector -5,5 matches discrete speaker gains",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.438211
        },
        {
          "name": "Surround reference vector 5,5 matches discrete speaker gains",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.533007
        },
        {
          "name": "Surround reference vector 0,0 matches discrete speaker gains",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.059076
        },
        {
          "name": "Surround reference vector 2.5,0 matches discrete speaker gains",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.244111
        },
        {
          "name": "Surround reference vector 50,-50 matches discrete speaker gains",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.003723
        },
        {
          "name": "Spatial resolution 2ch / automatic -> off",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.925928
        },
        {
          "name": "Spatial resolution 6ch / automatic -> surround",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.204607
        },
        {
          "name": "Spatial resolution 8ch / automatic -> surround",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.156658
        },
        {
          "name": "Spatial resolution 2ch / surround -> off",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.156547
        },
        {
          "name": "Spatial resolution 6ch / surround -> surround",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.135639
        },
        {
          "name": "Spatial resolution 2ch / binaural -> binaural",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 1.87818
        },
        {
          "name": "Spatial resolution 8ch / off -> off",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 1.693236
        },
        {
          "name": "Panner configuration, listener orientation and legacy coordinate APIs are exact",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.524411
        },
        {
          "name": "Panning chain off / direct preserves routing",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.778563
        },
        {
          "name": "Panning chain off / stereoPan,panSlewTo preserves routing",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.438251
        },
        {
          "name": "Panning chain off / spatialStart,spatialSwoopTo preserves routing",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.240914
        },
        {
          "name": "Panning chain binaural / direct preserves routing",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.221508
        },
        {
          "name": "Panning chain binaural / stereoPan,panSlewTo preserves routing",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.153782
        },
        {
          "name": "Panning chain binaural / spatialStart,spatialSwoopTo preserves routing",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.240363
        },
        {
          "name": "Panning chain surround / direct preserves routing",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.253888
        },
        {
          "name": "Panning chain surround / stereoPan,panSlewTo preserves routing",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.257866
        },
        {
          "name": "Panning chain surround / spatialStart,spatialSwoopTo preserves routing",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.337263
        },
        {
          "name": "Element viewport mapping 0,0",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.520694
        },
        {
          "name": "Element viewport mapping 500,250",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.113387
        },
        {
          "name": "Element viewport mapping 1000,500",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.070657
        },
        {
          "name": "Drift reference wind/modern: position, travel time, alternation and stop",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 3.048395
        },
        {
          "name": "Drift reference wind/stereo: position, travel time, alternation and stop",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.486991
        },
        {
          "name": "Drift reference wind/legacy: position, travel time, alternation and stop",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.267273
        },
        {
          "name": "Drift reference wind/surround: position, travel time, alternation and stop",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.399539
        },
        {
          "name": "Drift reference water/modern: position, travel time, alternation and stop",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.449002
        },
        {
          "name": "Drift reference water/stereo: position, travel time, alternation and stop",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.371086
        },
        {
          "name": "Drift reference water/legacy: position, travel time, alternation and stop",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 11.339482
        },
        {
          "name": "Drift reference water/surround: position, travel time, alternation and stop",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 1.981432
        },
        {
          "name": "Drift reference bird/modern: position, travel time, alternation and stop",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 1.989978
        },
        {
          "name": "Drift reference bird/stereo: position, travel time, alternation and stop",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 1.870336
        },
        {
          "name": "Drift reference bird/legacy: position, travel time, alternation and stop",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 1.891414
        },
        {
          "name": "Drift reference bird/surround: position, travel time, alternation and stop",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 1.899169
        },
        {
          "name": "Drift reference cosmic/modern: position, travel time, alternation and stop",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 1.914898
        },
        {
          "name": "Drift reference cosmic/stereo: position, travel time, alternation and stop",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 3.484785
        },
        {
          "name": "Drift reference cosmic/legacy: position, travel time, alternation and stop",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 3.956782
        },
        {
          "name": "Drift reference cosmic/surround: position, travel time, alternation and stop",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 5.543839
        },
        {
          "name": "Drift reference vehicle/modern: position, travel time, alternation and stop",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.370568
        },
        {
          "name": "Drift reference vehicle/stereo: position, travel time, alternation and stop",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.202623
        },
        {
          "name": "Drift reference vehicle/legacy: position, travel time, alternation and stop",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.154384
        },
        {
          "name": "Drift reference vehicle/surround: position, travel time, alternation and stop",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.24941
        },
        {
          "name": "Orbit reference advances with specified speed, radius and elevation",
          "file": "src/__tests__/Mutation.test.ts",
          "status": "passed",
          "durationMs": 2.726176
        },
        {
          "name": "device fallback selects voice, speed and volume and advances with pause",
          "file": "src/__tests__/Narration.test.ts",
          "status": "passed",
          "durationMs": 12.483106
        },
        {
          "name": "stop cancels device speech and stale completion cannot advance",
          "file": "src/__tests__/Narration.test.ts",
          "status": "passed",
          "durationMs": 0.501722
        },
        {
          "name": "last paragraph completes and device errors stop playback",
          "file": "src/__tests__/Narration.test.ts",
          "status": "passed",
          "durationMs": 0.45729
        },
        {
          "name": "unsupported devices show clear status",
          "file": "src/__tests__/Narration.test.ts",
          "status": "passed",
          "durationMs": 0.216913
        },
        {
          "name": "service error switches to device narration",
          "file": "src/__tests__/Narration.test.ts",
          "status": "passed",
          "durationMs": 14.478587
        },
        {
          "name": "Drawer opens and closes properly on handle click",
          "file": "src/__tests__/PlaylistFlyout.test.ts",
          "status": "passed",
          "durationMs": 213.040577
        },
        {
          "name": "Grab bars and reordering are only enabled when user has permission",
          "file": "src/__tests__/PlaylistFlyout.test.ts",
          "status": "passed",
          "durationMs": 4.850353
        },
        {
          "name": "removing item 0 preserves the playing item and persisted cursor",
          "file": "src/__tests__/QueueStore.test.ts",
          "status": "passed",
          "durationMs": 30.44208
        },
        {
          "name": "removing item 1 preserves the playing item and persisted cursor",
          "file": "src/__tests__/QueueStore.test.ts",
          "status": "passed",
          "durationMs": 4.151942
        },
        {
          "name": "removing item 3 preserves the playing item and persisted cursor",
          "file": "src/__tests__/QueueStore.test.ts",
          "status": "passed",
          "durationMs": 3.52671
        },
        {
          "name": "Pub/Sub: emits \"queue:updated\" and updates state on addToQueue and clearQueue",
          "file": "src/__tests__/QueueStore.test.ts",
          "status": "passed",
          "durationMs": 3.372442
        },
        {
          "name": "Pub/Sub: emits \"queue:track-started\", \"queue:track-ended\", and \"queue:completed\" on lifecycle progression",
          "file": "src/__tests__/QueueStore.test.ts",
          "status": "passed",
          "durationMs": 8.036787
        },
        {
          "name": "reorderQueue: dynamically updates queue positions on the fly and maintains active index",
          "file": "src/__tests__/QueueStore.test.ts",
          "status": "passed",
          "durationMs": 6.414981
        },
        {
          "name": "localStorage: persists queue and current active track position across store reloads",
          "file": "src/__tests__/QueueStore.test.ts",
          "status": "passed",
          "durationMs": 5.303985
        },
        {
          "name": "audio: settings remain usable when browser storage is unavailable",
          "file": "src/__tests__/Storage.test.ts",
          "status": "passed",
          "durationMs": 14.080318
        },
        {
          "name": "voice: settings remain usable when browser storage is unavailable",
          "file": "src/__tests__/Storage.test.ts",
          "status": "passed",
          "durationMs": 4.307571
        },
        {
          "name": "ui: settings remain usable when browser storage is unavailable",
          "file": "src/__tests__/Storage.test.ts",
          "status": "passed",
          "durationMs": 3.326057
        },
        {
          "name": "content: settings remain usable when browser storage is unavailable",
          "file": "src/__tests__/Storage.test.ts",
          "status": "passed",
          "durationMs": 4.266876
        },
        {
          "name": "chillspace_audio_settings: missing settings return independent nested defaults",
          "file": "src/__tests__/Storage.test.ts",
          "status": "passed",
          "durationMs": 11.44127
        },
        {
          "name": "chillspace_audio_settings: {broken settings return independent nested defaults",
          "file": "src/__tests__/Storage.test.ts",
          "status": "passed",
          "durationMs": 2.609163
        },
        {
          "name": "chillspace_audio_settings: {} settings return independent nested defaults",
          "file": "src/__tests__/Storage.test.ts",
          "status": "passed",
          "durationMs": 1.787655
        },
        {
          "name": "chillspace_voice_settings: missing settings return independent nested defaults",
          "file": "src/__tests__/Storage.test.ts",
          "status": "passed",
          "durationMs": 1.582964
        },
        {
          "name": "chillspace_voice_settings: {broken settings return independent nested defaults",
          "file": "src/__tests__/Storage.test.ts",
          "status": "passed",
          "durationMs": 2.154638
        },
        {
          "name": "chillspace_voice_settings: {} settings return independent nested defaults",
          "file": "src/__tests__/Storage.test.ts",
          "status": "passed",
          "durationMs": 1.464945
        },
        {
          "name": "chillspace_user_content: missing settings return independent nested defaults",
          "file": "src/__tests__/Storage.test.ts",
          "status": "passed",
          "durationMs": 6.432916
        },
        {
          "name": "chillspace_user_content: {broken settings return independent nested defaults",
          "file": "src/__tests__/Storage.test.ts",
          "status": "passed",
          "durationMs": 1.975714
        },
        {
          "name": "chillspace_user_content: {} settings return independent nested defaults",
          "file": "src/__tests__/Storage.test.ts",
          "status": "passed",
          "durationMs": 1.324313
        },
        {
          "name": "server-side storage defaults remain isolated without localStorage",
          "file": "src/__tests__/Storage.test.ts",
          "status": "passed",
          "durationMs": 0.222174
        },
        {
          "name": "narration uses the same-origin API in production and the Functions host locally",
          "file": "src/__tests__/TtsEndpoint.test.ts",
          "status": "passed",
          "durationMs": 1.109043
        },
        {
          "name": "narration URLs encode parameters and carry the audio version past stale browser caches",
          "file": "src/__tests__/TtsEndpoint.test.ts",
          "status": "passed",
          "durationMs": 0.250767
        }
      ],
      "coverage": {
        "tool": "c8 / V8",
        "scope": "All runtime TypeScript files in src, including utilities and configuration modules not loaded by the tests. Astro templates, CSS, assets, type declarations and test files are excluded.",
        "totals": {
          "lines": {
            "covered": 10961,
            "total": 12884,
            "pct": 85.07
          },
          "branches": {
            "covered": 1598,
            "total": 2027,
            "pct": 78.84
          },
          "functions": {
            "covered": 390,
            "total": 423,
            "pct": 92.2
          },
          "statements": {
            "covered": 10961,
            "total": 12884,
            "pct": 85.07
          }
        },
        "files": [
          {
            "path": "src/config/drums.ts",
            "lines": {
              "covered": 125,
              "total": 125,
              "pct": 100
            },
            "branches": {
              "covered": 1,
              "total": 1,
              "pct": 100
            },
            "functions": {
              "covered": 0,
              "total": 0,
              "pct": 100
            },
            "statements": {
              "covered": 125,
              "total": 125,
              "pct": 100
            }
          },
          {
            "path": "src/config/music.ts",
            "lines": {
              "covered": 265,
              "total": 265,
              "pct": 100
            },
            "branches": {
              "covered": 0,
              "total": 0,
              "pct": 100
            },
            "functions": {
              "covered": 0,
              "total": 0,
              "pct": 100
            },
            "statements": {
              "covered": 265,
              "total": 265,
              "pct": 100
            }
          },
          {
            "path": "src/config/narratives.ts",
            "lines": {
              "covered": 42,
              "total": 42,
              "pct": 100
            },
            "branches": {
              "covered": 0,
              "total": 0,
              "pct": 100
            },
            "functions": {
              "covered": 0,
              "total": 0,
              "pct": 100
            },
            "statements": {
              "covered": 42,
              "total": 42,
              "pct": 100
            }
          },
          {
            "path": "src/config/sceneDefaults.ts",
            "lines": {
              "covered": 131,
              "total": 131,
              "pct": 100
            },
            "branches": {
              "covered": 0,
              "total": 0,
              "pct": 100
            },
            "functions": {
              "covered": 0,
              "total": 0,
              "pct": 100
            },
            "statements": {
              "covered": 131,
              "total": 131,
              "pct": 100
            }
          },
          {
            "path": "src/config/sounds.ts",
            "lines": {
              "covered": 67,
              "total": 67,
              "pct": 100
            },
            "branches": {
              "covered": 1,
              "total": 1,
              "pct": 100
            },
            "functions": {
              "covered": 0,
              "total": 0,
              "pct": 100
            },
            "statements": {
              "covered": 67,
              "total": 67,
              "pct": 100
            }
          },
          {
            "path": "src/utils/PlaylistStore.ts",
            "lines": {
              "covered": 831,
              "total": 1013,
              "pct": 82.03
            },
            "branches": {
              "covered": 96,
              "total": 136,
              "pct": 70.59
            },
            "functions": {
              "covered": 27,
              "total": 30,
              "pct": 90
            },
            "statements": {
              "covered": 831,
              "total": 1013,
              "pct": 82.03
            }
          },
          {
            "path": "src/utils/QueueStore.ts",
            "lines": {
              "covered": 456,
              "total": 510,
              "pct": 89.41
            },
            "branches": {
              "covered": 44,
              "total": 72,
              "pct": 61.11
            },
            "functions": {
              "covered": 20,
              "total": 24,
              "pct": 83.33
            },
            "statements": {
              "covered": 456,
              "total": 510,
              "pct": 89.41
            }
          },
          {
            "path": "src/utils/SleepscapeCardController.ts",
            "lines": {
              "covered": 974,
              "total": 1127,
              "pct": 86.42
            },
            "branches": {
              "covered": 186,
              "total": 252,
              "pct": 73.81
            },
            "functions": {
              "covered": 35,
              "total": 40,
              "pct": 87.5
            },
            "statements": {
              "covered": 974,
              "total": 1127,
              "pct": 86.42
            }
          },
          {
            "path": "src/utils/SoundEngine.ts",
            "lines": {
              "covered": 1527,
              "total": 1901,
              "pct": 80.33
            },
            "branches": {
              "covered": 225,
              "total": 331,
              "pct": 67.98
            },
            "functions": {
              "covered": 73,
              "total": 82,
              "pct": 89.02
            },
            "statements": {
              "covered": 1527,
              "total": 1901,
              "pct": 80.33
            }
          },
          {
            "path": "src/utils/audioData.ts",
            "lines": {
              "covered": 100,
              "total": 100,
              "pct": 100
            },
            "branches": {
              "covered": 5,
              "total": 5,
              "pct": 100
            },
            "functions": {
              "covered": 0,
              "total": 0,
              "pct": 100
            },
            "statements": {
              "covered": 100,
              "total": 100,
              "pct": 100
            }
          },
          {
            "path": "src/utils/interactions.ts",
            "lines": {
              "covered": 283,
              "total": 318,
              "pct": 88.99
            },
            "branches": {
              "covered": 11,
              "total": 17,
              "pct": 64.71
            },
            "functions": {
              "covered": 8,
              "total": 9,
              "pct": 88.89
            },
            "statements": {
              "covered": 283,
              "total": 318,
              "pct": 88.99
            }
          },
          {
            "path": "src/utils/powerUtils.ts",
            "lines": {
              "covered": 78,
              "total": 78,
              "pct": 100
            },
            "branches": {
              "covered": 18,
              "total": 22,
              "pct": 81.82
            },
            "functions": {
              "covered": 7,
              "total": 7,
              "pct": 100
            },
            "statements": {
              "covered": 78,
              "total": 78,
              "pct": 100
            }
          },
          {
            "path": "src/utils/storage.ts",
            "lines": {
              "covered": 292,
              "total": 308,
              "pct": 94.81
            },
            "branches": {
              "covered": 29,
              "total": 38,
              "pct": 76.32
            },
            "functions": {
              "covered": 13,
              "total": 13,
              "pct": 100
            },
            "statements": {
              "covered": 292,
              "total": 308,
              "pct": 94.81
            }
          },
          {
            "path": "src/utils/audio/SpatialAudioHelper.ts",
            "lines": {
              "covered": 451,
              "total": 451,
              "pct": 100
            },
            "branches": {
              "covered": 113,
              "total": 122,
              "pct": 92.62
            },
            "functions": {
              "covered": 17,
              "total": 17,
              "pct": 100
            },
            "statements": {
              "covered": 451,
              "total": 451,
              "pct": 100
            }
          },
          {
            "path": "src/utils/audio/ambientLayers.ts",
            "lines": {
              "covered": 783,
              "total": 819,
              "pct": 95.6
            },
            "branches": {
              "covered": 143,
              "total": 162,
              "pct": 88.27
            },
            "functions": {
              "covered": 13,
              "total": 13,
              "pct": 100
            },
            "statements": {
              "covered": 783,
              "total": 819,
              "pct": 95.6
            }
          },
          {
            "path": "src/utils/audio/audioExporter.ts",
            "lines": {
              "covered": 656,
              "total": 688,
              "pct": 95.35
            },
            "branches": {
              "covered": 182,
              "total": 202,
              "pct": 90.1
            },
            "functions": {
              "covered": 12,
              "total": 13,
              "pct": 92.31
            },
            "statements": {
              "covered": 656,
              "total": 688,
              "pct": 95.35
            }
          },
          {
            "path": "src/utils/audio/drumVoices.ts",
            "lines": {
              "covered": 319,
              "total": 371,
              "pct": 85.98
            },
            "branches": {
              "covered": 57,
              "total": 81,
              "pct": 70.37
            },
            "functions": {
              "covered": 16,
              "total": 17,
              "pct": 94.12
            },
            "statements": {
              "covered": 319,
              "total": 371,
              "pct": 85.98
            }
          },
          {
            "path": "src/utils/audio/mobileAudio.ts",
            "lines": {
              "covered": 186,
              "total": 226,
              "pct": 82.3
            },
            "branches": {
              "covered": 38,
              "total": 48,
              "pct": 79.17
            },
            "functions": {
              "covered": 6,
              "total": 6,
              "pct": 100
            },
            "statements": {
              "covered": 186,
              "total": 226,
              "pct": 82.3
            }
          },
          {
            "path": "src/utils/audio/interactions/NoiseHelper.ts",
            "lines": {
              "covered": 10,
              "total": 10,
              "pct": 100
            },
            "branches": {
              "covered": 3,
              "total": 3,
              "pct": 100
            },
            "functions": {
              "covered": 2,
              "total": 2,
              "pct": 100
            },
            "statements": {
              "covered": 10,
              "total": 10,
              "pct": 100
            }
          },
          {
            "path": "src/utils/audio/interactions/cosmicInteractions.ts",
            "lines": {
              "covered": 85,
              "total": 85,
              "pct": 100
            },
            "branches": {
              "covered": 7,
              "total": 7,
              "pct": 100
            },
            "functions": {
              "covered": 4,
              "total": 4,
              "pct": 100
            },
            "statements": {
              "covered": 85,
              "total": 85,
              "pct": 100
            }
          },
          {
            "path": "src/utils/audio/interactions/cyberpunkInteractions.ts",
            "lines": {
              "covered": 96,
              "total": 96,
              "pct": 100
            },
            "branches": {
              "covered": 5,
              "total": 5,
              "pct": 100
            },
            "functions": {
              "covered": 4,
              "total": 4,
              "pct": 100
            },
            "statements": {
              "covered": 96,
              "total": 96,
              "pct": 100
            }
          },
          {
            "path": "src/utils/audio/interactions/forestInteractions.ts",
            "lines": {
              "covered": 235,
              "total": 235,
              "pct": 100
            },
            "branches": {
              "covered": 14,
              "total": 14,
              "pct": 100
            },
            "functions": {
              "covered": 8,
              "total": 8,
              "pct": 100
            },
            "statements": {
              "covered": 235,
              "total": 235,
              "pct": 100
            }
          },
          {
            "path": "src/utils/audio/interactions/lakeInteractions.ts",
            "lines": {
              "covered": 268,
              "total": 268,
              "pct": 100
            },
            "branches": {
              "covered": 19,
              "total": 19,
              "pct": 100
            },
            "functions": {
              "covered": 10,
              "total": 10,
              "pct": 100
            },
            "statements": {
              "covered": 268,
              "total": 268,
              "pct": 100
            }
          },
          {
            "path": "src/utils/audio/interactions/mistInteractions.ts",
            "lines": {
              "covered": 136,
              "total": 136,
              "pct": 100
            },
            "branches": {
              "covered": 12,
              "total": 12,
              "pct": 100
            },
            "functions": {
              "covered": 7,
              "total": 7,
              "pct": 100
            },
            "statements": {
              "covered": 136,
              "total": 136,
              "pct": 100
            }
          },
          {
            "path": "src/utils/audio/interactions/oceanInteractions.ts",
            "lines": {
              "covered": 214,
              "total": 214,
              "pct": 100
            },
            "branches": {
              "covered": 13,
              "total": 13,
              "pct": 100
            },
            "functions": {
              "covered": 7,
              "total": 7,
              "pct": 100
            },
            "statements": {
              "covered": 214,
              "total": 214,
              "pct": 100
            }
          },
          {
            "path": "src/utils/playlist/PlaylistController.ts",
            "lines": {
              "covered": 340,
              "total": 970,
              "pct": 35.05
            },
            "branches": {
              "covered": 50,
              "total": 70,
              "pct": 71.43
            },
            "functions": {
              "covered": 37,
              "total": 45,
              "pct": 82.22
            },
            "statements": {
              "covered": 340,
              "total": 970,
              "pct": 35.05
            }
          },
          {
            "path": "src/utils/playlist/PlaylistModals.ts",
            "lines": {
              "covered": 356,
              "total": 376,
              "pct": 94.68
            },
            "branches": {
              "covered": 55,
              "total": 69,
              "pct": 79.71
            },
            "functions": {
              "covered": 12,
              "total": 12,
              "pct": 100
            },
            "statements": {
              "covered": 356,
              "total": 376,
              "pct": 94.68
            }
          },
          {
            "path": "src/utils/playlist/PlaylistRenderer.ts",
            "lines": {
              "covered": 232,
              "total": 294,
              "pct": 78.91
            },
            "branches": {
              "covered": 23,
              "total": 36,
              "pct": 63.89
            },
            "functions": {
              "covered": 7,
              "total": 7,
              "pct": 100
            },
            "statements": {
              "covered": 232,
              "total": 294,
              "pct": 78.91
            }
          },
          {
            "path": "src/utils/procedural/cyberBuildingGenerator.ts",
            "lines": {
              "covered": 597,
              "total": 597,
              "pct": 100
            },
            "branches": {
              "covered": 73,
              "total": 74,
              "pct": 98.65
            },
            "functions": {
              "covered": 7,
              "total": 7,
              "pct": 100
            },
            "statements": {
              "covered": 597,
              "total": 597,
              "pct": 100
            }
          },
          {
            "path": "src/utils/procedural/cyberClientSync.ts",
            "lines": {
              "covered": 208,
              "total": 213,
              "pct": 97.65
            },
            "branches": {
              "covered": 67,
              "total": 76,
              "pct": 88.16
            },
            "functions": {
              "covered": 4,
              "total": 4,
              "pct": 100
            },
            "statements": {
              "covered": 208,
              "total": 213,
              "pct": 97.65
            }
          },
          {
            "path": "src/utils/procedural/prng.ts",
            "lines": {
              "covered": 90,
              "total": 90,
              "pct": 100
            },
            "branches": {
              "covered": 25,
              "total": 25,
              "pct": 100
            },
            "functions": {
              "covered": 13,
              "total": 13,
              "pct": 100
            },
            "statements": {
              "covered": 90,
              "total": 90,
              "pct": 100
            }
          },
          {
            "path": "src/utils/procedural/types.ts",
            "lines": {
              "covered": 0,
              "total": 184,
              "pct": 0
            },
            "branches": {
              "covered": 0,
              "total": 1,
              "pct": 0
            },
            "functions": {
              "covered": 0,
              "total": 1,
              "pct": 0
            },
            "statements": {
              "covered": 0,
              "total": 184,
              "pct": 0
            }
          },
          {
            "path": "src/utils/sleepscape/storyCustomizer.ts",
            "lines": {
              "covered": 185,
              "total": 185,
              "pct": 100
            },
            "branches": {
              "covered": 27,
              "total": 37,
              "pct": 72.97
            },
            "functions": {
              "covered": 10,
              "total": 10,
              "pct": 100
            },
            "statements": {
              "covered": 185,
              "total": 185,
              "pct": 100
            }
          },
          {
            "path": "src/utils/sleepscape/storyExporter.ts",
            "lines": {
              "covered": 94,
              "total": 94,
              "pct": 100
            },
            "branches": {
              "covered": 20,
              "total": 28,
              "pct": 71.43
            },
            "functions": {
              "covered": 2,
              "total": 2,
              "pct": 100
            },
            "statements": {
              "covered": 94,
              "total": 94,
              "pct": 100
            }
          },
          {
            "path": "src/utils/sleepscape/storyVoiceData.ts",
            "lines": {
              "covered": 95,
              "total": 95,
              "pct": 100
            },
            "branches": {
              "covered": 9,
              "total": 9,
              "pct": 100
            },
            "functions": {
              "covered": 2,
              "total": 2,
              "pct": 100
            },
            "statements": {
              "covered": 95,
              "total": 95,
              "pct": 100
            }
          },
          {
            "path": "src/utils/sleepscape/ttsEndpoint.ts",
            "lines": {
              "covered": 18,
              "total": 18,
              "pct": 100
            },
            "branches": {
              "covered": 8,
              "total": 8,
              "pct": 100
            },
            "functions": {
              "covered": 3,
              "total": 3,
              "pct": 100
            },
            "statements": {
              "covered": 18,
              "total": 18,
              "pct": 100
            }
          },
          {
            "path": "src/utils/soundfonts/SoundFontLoader.ts",
            "lines": {
              "covered": 136,
              "total": 184,
              "pct": 73.91
            },
            "branches": {
              "covered": 19,
              "total": 31,
              "pct": 61.29
            },
            "functions": {
              "covered": 4,
              "total": 4,
              "pct": 100
            },
            "statements": {
              "covered": 136,
              "total": 184,
              "pct": 73.91
            }
          }
        ]
      }
    },
    {
      "name": "Backend behaviour",
      "status": "passed",
      "durationMs": 1829,
      "passed": 39,
      "failed": 0,
      "skipped": 0,
      "cases": [
        {
          "name": "audio magic bytes validation",
          "file": "api/tests/test_backend.py",
          "status": "passed",
          "durationMs": 0.24
        },
        {
          "name": "custom words creates unique hash",
          "file": "api/tests/test_backend.py",
          "status": "passed",
          "durationMs": 0.26
        },
        {
          "name": "deterministic hash",
          "file": "api/tests/test_backend.py",
          "status": "passed",
          "durationMs": 0.15
        },
        {
          "name": "duration creates unique hash",
          "file": "api/tests/test_backend.py",
          "status": "passed",
          "durationMs": 0.13
        },
        {
          "name": "speaker and speed creates unique hash",
          "file": "api/tests/test_backend.py",
          "status": "passed",
          "durationMs": 0.17
        },
        {
          "name": "audio stream formats download and missing",
          "file": "api/tests/test_contracts.py",
          "status": "passed",
          "durationMs": 38.04
        },
        {
          "name": "audio upload authorization and size limits",
          "file": "api/tests/test_contracts.py",
          "status": "passed",
          "durationMs": 9.23
        },
        {
          "name": "audio upload formats and storage failures",
          "file": "api/tests/test_contracts.py",
          "status": "passed",
          "durationMs": 413.16
        },
        {
          "name": "auto hash resolves prior custom slug and audio",
          "file": "api/tests/test_contracts.py",
          "status": "passed",
          "durationMs": 4.03
        },
        {
          "name": "custom mix conflict overwrite and idempotency",
          "file": "api/tests/test_contracts.py",
          "status": "passed",
          "durationMs": 9.25
        },
        {
          "name": "discovery configuration empty success and failure",
          "file": "api/tests/test_contracts.py",
          "status": "passed",
          "durationMs": 6.32
        },
        {
          "name": "each audio source can make a shareable mix",
          "file": "api/tests/test_contracts.py",
          "status": "passed",
          "durationMs": 4.19
        },
        {
          "name": "mix availability taken free and storage failure",
          "file": "api/tests/test_contracts.py",
          "status": "passed",
          "durationMs": 4.42
        },
        {
          "name": "mix missing invalid and short identifiers",
          "file": "api/tests/test_contracts.py",
          "status": "passed",
          "durationMs": 3.54
        },
        {
          "name": "mix reads data and reports storage errors",
          "file": "api/tests/test_contracts.py",
          "status": "passed",
          "durationMs": 4.89
        },
        {
          "name": "mix rejects bad json missing params and silent mix",
          "file": "api/tests/test_contracts.py",
          "status": "passed",
          "durationMs": 2.08
        },
        {
          "name": "mix write and index failures",
          "file": "api/tests/test_contracts.py",
          "status": "passed",
          "durationMs": 4.45
        },
        {
          "name": "options all endpoints",
          "file": "api/tests/test_contracts.py",
          "status": "passed",
          "durationMs": 2.04
        },
        {
          "name": "playlist owner private keys and conflicts",
          "file": "api/tests/test_contracts.py",
          "status": "passed",
          "durationMs": 6.66
        },
        {
          "name": "playlist storage failure paths",
          "file": "api/tests/test_contracts.py",
          "status": "passed",
          "durationMs": 6.21
        },
        {
          "name": "playlist validation",
          "file": "api/tests/test_contracts.py",
          "status": "passed",
          "durationMs": 3.57
        },
        {
          "name": "recent mix order limit missing audio and corrupt metadata",
          "file": "api/tests/test_contracts.py",
          "status": "passed",
          "durationMs": 5.82
        },
        {
          "name": "tts validation conditional cache and parameter forms",
          "file": "api/tests/test_contracts.py",
          "status": "passed",
          "durationMs": 21.31
        },
        {
          "name": "allowed origins and rejected hosts",
          "file": "api/tests/test_contracts.py",
          "status": "passed",
          "durationMs": 1.37
        },
        {
          "name": "audio headers and slug normalisation",
          "file": "api/tests/test_contracts.py",
          "status": "passed",
          "durationMs": 4.93
        },
        {
          "name": "blob client initialisation handles unconfigured and failures",
          "file": "api/tests/test_contracts.py",
          "status": "passed",
          "durationMs": 3.64
        },
        {
          "name": "tokens authenticate slug and enforce time windows",
          "file": "api/tests/test_contracts.py",
          "status": "passed",
          "durationMs": 1.37
        },
        {
          "name": "allows first party domains and same deployment",
          "file": "api/tests/test_origins.py",
          "status": "passed",
          "durationMs": 0.32
        },
        {
          "name": "referer fallback does not override untrusted origin",
          "file": "api/tests/test_origins.py",
          "status": "passed",
          "durationMs": 0.18
        },
        {
          "name": "rejects non http sources and embedded credentials",
          "file": "api/tests/test_origins.py",
          "status": "passed",
          "durationMs": 0.24
        },
        {
          "name": "rejects suffix lookalikes and unrelated azure tenants",
          "file": "api/tests/test_origins.py",
          "status": "passed",
          "durationMs": 0.28
        },
        {
          "name": "azure requires configuration",
          "file": "api/tests/test_tts.py",
          "status": "passed",
          "durationMs": 1.72
        },
        {
          "name": "azure session is reused within a loop",
          "file": "api/tests/test_tts.py",
          "status": "passed",
          "durationMs": 35.89
        },
        {
          "name": "azure ssml escapes text and attributes",
          "file": "api/tests/test_tts.py",
          "status": "passed",
          "durationMs": 1.19
        },
        {
          "name": "cache avoids provider and refresh failure uses cache",
          "file": "api/tests/test_tts.py",
          "status": "passed",
          "durationMs": 18.52
        },
        {
          "name": "failure and empty audio are unavailable",
          "file": "api/tests/test_tts.py",
          "status": "passed",
          "durationMs": 5.93
        },
        {
          "name": "first play caches under azure prefix without expiry",
          "file": "api/tests/test_tts.py",
          "status": "passed",
          "durationMs": 10.48
        },
        {
          "name": "outage returns 503",
          "file": "api/tests/test_tts.py",
          "status": "passed",
          "durationMs": 8.66
        },
        {
          "name": "success",
          "file": "api/tests/test_tts.py",
          "status": "passed",
          "durationMs": 3.66
        }
      ],
      "coverage": {
        "tool": "coverage.py",
        "scope": "All Python application modules in api. Test files are excluded. Cloud storage and speech providers are mocked; this is not a live service availability check.",
        "totals": {
          "lines": {
            "covered": 567,
            "total": 591,
            "pct": 95.94
          },
          "branches": {
            "covered": 207,
            "total": 226,
            "pct": 91.59
          }
        },
        "files": [
          {
            "path": "api/function_app.py",
            "lines": {
              "covered": 420,
              "total": 433,
              "pct": 97
            },
            "branches": {
              "covered": 163,
              "total": 178,
              "pct": 91.57
            }
          },
          {
            "path": "api/helpers.py",
            "lines": {
              "covered": 114,
              "total": 119,
              "pct": 95.8
            },
            "branches": {
              "covered": 39,
              "total": 40,
              "pct": 97.5
            }
          },
          {
            "path": "api/tts_providers.py",
            "lines": {
              "covered": 33,
              "total": 39,
              "pct": 84.62
            },
            "branches": {
              "covered": 5,
              "total": 8,
              "pct": 62.5
            }
          }
        ]
      }
    }
  ],
  "typecheck": {
    "status": "passed",
    "errors": 0
  },
  "limitations": [
    "Unit and integration tests use simulated browser APIs and mocked cloud services.",
    "Coverage measures executed code, not correctness or a guarantee of reliability.",
    "Real device speech, physical surround output and every mobile/browser combination require separate manual checks.",
    "Browser screenshots document the captured interface; they do not certify audio quality or production uptime."
  ]
}
