{
  "kind": "meridian_synthetic_recordings",
  "revision": "recordings-v1",
  "synthetic": true,
  "partnerData": false,
  "start": "2026-08-14T21:00:00.000Z",
  "durationSeconds": 240,
  "scope": "Authored visualization sources. The original Meridian canonical validation receipt does not cover these new recordings. Canonical acquisition/product adapters remain a later checkpoint.",
  "authoringScenarioSha256": "f2c0904f35f47da44532d8122b88e00797b27d3133c895e83e8b48945de881a2",
  "instruments": [
    {
      "id": "meridian-ptz-camera",
      "label": "PTZ (Pan-Tilt-Zoom) Camera",
      "recipe": {
        "shape": "frame_sequence",
        "parameters": {
          "seed": 14014,
          "durationSeconds": 240,
          "fps": 12,
          "width": 640,
          "height": 360,
          "exposureMode": "fixed",
          "unit": "DN",
          "bitDepth": 8,
          "pointingUnit": "deg"
        },
        "model": "Dark ridge and a generated light following the existing angular trace. Pixel brightness is synthetic DN; no physical radiance conversion.",
        "sourceLocator": "clip digest + frame index + device timestamp",
        "prng": "xorshift32 with nonzero uint32 seed; state ^= state << 13; state ^= state >>> 17; state ^= state << 5; unsigned state / 4294967296 for uniform [0,1)",
        "rounding": "Keep native numerical precision in source; round only display values. Any encoded integer quantization must declare its scale."
      },
      "generated": true,
      "station": "North",
      "calibration": "Synthetic model; no physical calibration",
      "timing": "Authored common UTC clock; no measured synchronization uncertainty"
    },
    {
      "id": "meridian-thermal-a",
      "label": "Thermal Camera A",
      "recipe": {
        "shape": "numerical_grid_sequence",
        "parameters": {
          "seed": 14015,
          "durationSeconds": 240,
          "cadenceSeconds": 2,
          "width": 80,
          "height": 60,
          "backgroundCel": 18.2,
          "peakApparentCel": 24,
          "kernelSigmaPixels": 3,
          "unit": "Cel",
          "bitDepth": null
        },
        "model": "Numerical apparent-temperature field with a moving Gaussian patch and a declared fixed scale. An independent preview is rendered from the same array.",
        "sourceLocator": "array digest + timestamp index + row + column",
        "prng": "xorshift32 with nonzero uint32 seed; state ^= state << 13; state ^= state >>> 17; state ^= state << 5; unsigned state / 4294967296 for uniform [0,1)",
        "rounding": "Keep native numerical precision in source; round only display values. Any encoded integer quantization must declare its scale."
      },
      "generated": true,
      "station": "North",
      "calibration": "Synthetic model; no physical calibration",
      "timing": "Authored common UTC clock; no measured synchronization uncertainty"
    },
    {
      "id": "meridian-sdr-spectrum",
      "label": "SDR — Spectrum Analyzer",
      "recipe": {
        "shape": "time_frequency_grid",
        "parameters": {
          "seed": 14018,
          "durationSeconds": 240,
          "cadenceSeconds": 2,
          "bins": 128,
          "startMHz": 430,
          "endMHz": 440,
          "carrierMHz": 435,
          "backgroundDbm": -90,
          "peakDbm": -42,
          "unit": "dBm_per_bin",
          "binConvention": "128 equal-width bins; centers computed from edges"
        },
        "model": "Synthetic per-bin power with a carrier near t=90 s, from an independent generator. Declared per-bin power, not a power-spectral-density claim.",
        "sourceLocator": "time index + frequency-bin index",
        "prng": "xorshift32 with nonzero uint32 seed; state ^= state << 13; state ^= state >>> 17; state ^= state << 5; unsigned state / 4294967296 for uniform [0,1)",
        "rounding": "Keep native numerical precision in source; round only display values. Any encoded integer quantization must declare its scale."
      },
      "generated": true,
      "station": "North",
      "calibration": "Synthetic model; no physical calibration",
      "timing": "Authored common UTC clock; no measured synchronization uncertainty"
    },
    {
      "id": "meridian-co2-temp",
      "label": "CO₂ / Temperature Meter",
      "recipe": {
        "shape": "environmental_series",
        "parameters": {
          "seed": 14025,
          "durationSeconds": 240,
          "cadenceSeconds": 10,
          "units": [
            "ppm",
            "Cel",
            "%"
          ],
          "baseline": [
            430,
            18.2,
            54
          ],
          "amplitude": [
            5,
            0.15,
            1
          ],
          "channels": [
            "co2",
            "temperature",
            "humidity"
          ]
        },
        "model": "Keep existing temperature formula; independently model bounded humidity/pressure/air-quality channels. Lightning emits distance-only events without bearings.",
        "sourceLocator": "channel CSV row or event ID",
        "prng": "xorshift32 with nonzero uint32 seed; state ^= state << 13; state ^= state >>> 17; state ^= state << 5; unsigned state / 4294967296 for uniform [0,1)",
        "rounding": "Keep native numerical precision in source; round only display values. Any encoded integer quantization must declare its scale."
      },
      "generated": true,
      "station": "South",
      "calibration": "Synthetic model; no physical calibration",
      "timing": "Authored common UTC clock; no measured synchronization uncertainty"
    },
    {
      "id": "meridian-humidity-baro",
      "label": "Humidity / Barometric Pressure Meter",
      "recipe": {
        "shape": "environmental_series",
        "parameters": {
          "seed": 14025,
          "durationSeconds": 240,
          "cadenceSeconds": 10,
          "units": [
            "hPa",
            "%"
          ],
          "baseline": [
            1008,
            54
          ],
          "amplitude": [
            0.1,
            1
          ],
          "channels": [
            "pressure",
            "humidity"
          ]
        },
        "model": "Keep existing temperature formula; independently model bounded humidity/pressure/air-quality channels. Lightning emits distance-only events without bearings.",
        "sourceLocator": "channel CSV row or event ID",
        "prng": "xorshift32 with nonzero uint32 seed; state ^= state << 13; state ^= state >>> 17; state ^= state << 5; unsigned state / 4294967296 for uniform [0,1)",
        "rounding": "Keep native numerical precision in source; round only display values. Any encoded integer quantization must declare its scale."
      },
      "generated": true,
      "station": "South",
      "calibration": "Synthetic model; no physical calibration",
      "timing": "Authored common UTC clock; no measured synchronization uncertainty"
    }
  ],
  "arrays": {
    "encoding": "IEEE 754 float32 little-endian; C row-major; no header, missing values or scale factor",
    "thermal": {
      "shape": [
        120,
        60,
        80
      ],
      "chunkShape": [
        10,
        60,
        80
      ],
      "cadenceSeconds": 2,
      "unit": "Cel",
      "quantity": "apparent_temperature",
      "displayRange": [
        18,
        24.5
      ],
      "samplePolicy": "Hold most recent frame; each frame is instantaneous. No interpolation.",
      "model": "Frame i uses xorshift32 seed 14015+i. Center x=15+i/119*48; y=32-12*exp(-((2*i-90)/45)^2); sigma=3 pixels. Background 18.2 Cel plus uniform +/-0.06 Cel; patch amplitude 5.8 Cel. Float32 quantization."
    },
    "spectrum": {
      "shape": [
        120,
        128
      ],
      "cadenceSeconds": 2,
      "startMHz": 430,
      "endMHz": 440,
      "binWidthMHz": 0.078125,
      "unit": "dBm_per_bin",
      "displayRange": [
        -92,
        -40
      ],
      "samplePolicy": "Instantaneous synthetic spectra every 2 seconds. Bin power is not spectral density.",
      "model": "Seed 14018. -90 + 48*exp(-((2*time-90)/28)^2)*exp(-((bin-63.5)/2.8)^2) + uniform +/-1.5 dB, quantized float32."
    }
  },
  "video": {
    "file": "visible.mp4",
    "fps": 12,
    "frameCount": 2880,
    "width": 640,
    "height": 360,
    "source": "Procedural RGB8 imagery; H.264 is a lossy viewing product, not radiometry",
    "exposure": "Fixed synthetic exposure; no gain calibration",
    "frameMetadata": "frames.csv",
    "model": "Static seeded ridge and stars. Light x=96+t/240*448, y=180-(elevation(t)-25)*10. Boresight elevation 25 deg; vertical FOV 36 deg. Elevation follows the unrounded original Meridian optical formula; fixed camera, no inferred tracking.",
    "encoder": {
      "args": [
        "-hide_banner",
        "-loglevel",
        "error",
        "-y",
        "-f",
        "rawvideo",
        "-pixel_format",
        "rgb24",
        "-video_size",
        "640x360",
        "-framerate",
        "12",
        "-i",
        "pipe:0",
        "-an",
        "-c:v",
        "libx264",
        "-threads",
        "1",
        "-preset",
        "medium",
        "-crf",
        "22",
        "-pix_fmt",
        "yuv420p",
        "-movflags",
        "+faststart",
        "-map_metadata",
        "-1",
        "visible.mp4"
      ],
      "version": "ffmpeg version 8.0.1 Copyright (c) 2000-2025 the FFmpeg developers"
    }
  },
  "weather": {
    "file": "weather.csv",
    "cadenceSeconds": 10,
    "samplePolicy": "Hold most recent sample; show sample time and age. No interpolation.",
    "model": "Temperature 18.2+0.15*sin(sample/4) Cel. Seed 14025 for CO2 (430 +/-5 ppm), first humidity (54 +/-1%), pressure (1008 +/-0.1 hPa), second humidity (54 +/-1%) in CSV order. Numerical JS precision retained."
  },
  "files": {
    "thermal-00.f32": {
      "sha256": "e4ab857673458718ff921bb917f3f5fcf06c75196ec153043e11da4fa22e73fd",
      "byteLength": 192000
    },
    "thermal-01.f32": {
      "sha256": "cb4a61bf5ba0017a506e3036802fadfe0b8e773ba4940289e29e802f62cb74a6",
      "byteLength": 192000
    },
    "thermal-02.f32": {
      "sha256": "93a67232d396e12c413a0820677e42b487797e88e481f383e482cc9fbd9aaee4",
      "byteLength": 192000
    },
    "thermal-03.f32": {
      "sha256": "dc2304a6a1b37dbb578bb508ee84d9272dba443c6de590030ca235baf58cf4bc",
      "byteLength": 192000
    },
    "thermal-04.f32": {
      "sha256": "069c350622fb1dd9b67524bdbbdeb9d73993d9be10ea4673041c1c84f9467ca3",
      "byteLength": 192000
    },
    "thermal-05.f32": {
      "sha256": "691e228c114fd5a1dacec6fee78475d5a97a09720530980d1eb79553a74a3e2e",
      "byteLength": 192000
    },
    "thermal-06.f32": {
      "sha256": "434ee09c976e2ccb0f360b7ff83fdfa1fa1508b094ade5f61aa784b9ecb856b6",
      "byteLength": 192000
    },
    "thermal-07.f32": {
      "sha256": "55ecc417f901240d05568e51b3cb30d5408532b9954453b5896c0d5f252b5a01",
      "byteLength": 192000
    },
    "thermal-08.f32": {
      "sha256": "b520caf2ebe9be7b396dcfd70ab1c05090ca5f0ad0d9649de470043ffdcf0906",
      "byteLength": 192000
    },
    "thermal-09.f32": {
      "sha256": "b5d1d64a37b2b55aa661cb4b541ab086515ff223105c5be7cc27c16cdcea1379",
      "byteLength": 192000
    },
    "thermal-10.f32": {
      "sha256": "e307697c3bec57f397cc9ee528bacae5e542a0f5763b20843c3234a367eb5e89",
      "byteLength": 192000
    },
    "thermal-11.f32": {
      "sha256": "99eb9276d4c2d0e0b6883992c966440c8978a81709e9f0bdc6414401448686a2",
      "byteLength": 192000
    },
    "spectrum.f32": {
      "sha256": "bf933a24c4c8fdde7df1f1f4487997f9476065abd8414a692e18791a5b9a5809",
      "byteLength": 61440
    },
    "weather.csv": {
      "sha256": "cc16fb4354e43317535d124e81de40b2f0d0858a30698fd0f9d934ecd5bb004d",
      "byteLength": 9491
    },
    "frames.csv": {
      "sha256": "6175a240dd09d2635c089cd85266b8be730bdf5a70be894502a8aa52bb5fd931",
      "byteLength": 206195
    },
    "visible.mp4": {
      "sha256": "cbfe3374dbb8833904fd52f05ae1fc331d41fd89f9d07154f551c2bdcd7fea19",
      "byteLength": 722688
    }
  }
}
