{
  "schema_version": 2,
  "protocol_id": "spark-membrane-demo-v2",
  "supersedes": "spark-membrane-demo-v1 (sha256 c1d9d9e7f352dc0853a16abbabf0aea1af0c52896a72257f0f747c510a90c91d; in git history at ad849ad, never released)",
  "locked_at": "2026-10-05T21:30:00-04:00 (self-declared; the SHA-256 identifies the bytes, it does not prove when they were frozen)",
  "evidence_class": "SYNTHETIC",
  "calibration_status": "UNCALIBRATED: every threshold and cap below is an upstream default or an author choice. None was fitted to data, none is validated, none is a recommendation. See docs/PROTOCOL.md.",
  "frame_contract": "oes-telemetry-bench native-32 JSONL @ 48fc4d9b79e58557cc562b8dad0bc90b482d443f; 512 channels = 16 native-32 blocks; no resampling",
  "reference_vector": [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
  "residual": {
    "tolerance": 0.08,
    "fail_rule": "R > tolerance",
    "source": "oes32-residual @ b77b61254f15778c6ae221843dceac7a8571158e (normative, ADR-001)"
  },
  "sidecar_profile_a": {
    "tau_coherence": 0.08,
    "tau_sym": 0.08,
    "tau_fold": 0.08,
    "antisymmetric_odd": true,
    "mu_offset": 16,
    "source": "oes32_engine @ d66025f5d13c759650f1d6a180a3d8205640d044 (Profile A sidecar defaults)"
  },
  "weighted": {
    "weights": {"maximum": 0.45, "rms": 0.35, "mean_absolute": 0.2},
    "threshold": 0.5,
    "alarm_comparison": ">=",
    "source": "oes-resilience @ 1ee533cd4360a6b1415f923c4e52cfc166b8917a OES32Detector (one 32-channel block)"
  },
  "baselines": {
    "role": "advisory",
    "alarm_comparison": ">=",
    "maxabs": {"threshold": 0.5},
    "ewma": {"lambda": 0.2, "threshold": 3.0},
    "cusum": {"k": 0.5, "threshold": 5.0},
    "calibration": {
      "mode": "separate_stream",
      "frames": 64,
      "rule": "mu and sigma (ddof=1) of the frame means of a separate event-free calibration stream; the calibration frames are never audited and never mixed into the evaluation frames"
    },
    "in_stream_warmup_frames": 16,
    "reset_after_alarm": true,
    "reset_rule": "after a frame whose score reaches the threshold, that detector's state restarts at 0 for the next frame (Page-style restart); EWMA and CUSUM reset independently",
    "source": "oes-telemetry-bench @ 48fc4d9b79e58557cc562b8dad0bc90b482d443f detector_scores (formulas); oes-resilience defines no reset and standardises on 16 in-stream warm-up steps"
  },
  "gating": ["protocol_hash", "residual", "sidecar_A", "sidecar_C0", "sidecar_C1", "sidecar_Cfold", "weighted"],
  "explorer": {
    "max_abs_delta": 0.25,
    "candidates": 16,
    "indices_per_proposal": 1,
    "index_weight_floor": 0.001,
    "jitter": [0.5, 1.5],
    "may_modify_reference": false,
    "may_modify_thresholds": false,
    "evidence_class": "SYNTHETIC"
  },
  "provenance": {
    "reference_vector": "author choice (all-zero demo reference)",
    "residual.tolerance": "author choice (equal to the oes32_engine Profile A tau default 0.08; oes32-residual itself fixes the rule, not a value)",
    "sidecar_profile_a.tau_coherence": "upstream default (oes32_engine)",
    "sidecar_profile_a.tau_sym": "upstream default (oes32_engine)",
    "sidecar_profile_a.tau_fold": "upstream default (oes32_engine)",
    "sidecar_profile_a.antisymmetric_odd": "upstream default (oes32_engine)",
    "sidecar_profile_a.mu_offset": "upstream definition (oes32_engine)",
    "weighted.weights": "upstream definition (oes-resilience; frozen)",
    "weighted.threshold": "upstream default (oes-resilience OES32Detector.default_threshold)",
    "baselines.maxabs.threshold": "upstream default (oes-resilience MaxAbsDetector.default_threshold)",
    "baselines.ewma.lambda": "upstream default (oes-resilience EWMADetector)",
    "baselines.ewma.threshold": "upstream default (oes-resilience EWMADetector.default_threshold)",
    "baselines.cusum.k": "upstream default (oes-resilience CUSUMDetector)",
    "baselines.cusum.threshold": "upstream default (oes-resilience CUSUMDetector.default_threshold)",
    "baselines.calibration.frames": "author choice",
    "baselines.in_stream_warmup_frames": "upstream default (oes-resilience TemporalDetector warmup=16)",
    "baselines.reset_after_alarm": "author choice (upstream defines no reset)",
    "explorer.max_abs_delta": "author choice",
    "explorer.candidates": "author choice",
    "explorer.index_weight_floor": "author choice",
    "explorer.jitter": "author choice"
  }
}
