{
  "status": "Implemented; validation deferred to Main as assigned",
  "path": ".spt/preserved/302/step2-gate.py",
  "cli": "python .spt/preserved/302/step2-gate.py --capture <collector-directory> --out <NEW-sibling-directory> --subnet SPT_DEV --subnet SPT_MANTLE --subnet BIGNET --broker-pid <expected-positive-PID> --run-id <expected-run-id>",
  "contract": {
    "required_capture_files": [
      "field-receipt.json",
      "samples.jsonl",
      "log-after.log",
      "analysis/summary.json"
    ],
    "additional_input_reason": "Existing collector declares samples SHA only in its retained v1 analysis/summary.json. Append-only verified independently by hashing the log-after prefix against receipt log_before bytes/SHA; log-before.log not required.",
    "outputs": [
      "gate-receipt.json",
      "analysis.stdout.txt",
      "analysis.stderr.txt",
      "analysis-exit.json",
      "analysis/ (unchanged frozen v2 outputs)",
      "window-evidence.json"
    ],
    "exits": {
      "0": "PASS",
      "1": "FAIL",
      "2": "INSUFFICIENT"
    },
    "timeout_seconds": 30,
    "behavior": "Verifies approved analyzer SHA and DELIVERY module hashes; executes unchanged v2 main and reuses parse_stamps/interval_coverage in an isolated bytecode-disabled finite child. Preserves raw analyzer exit separately from evidence-worker exit. Accepts only >=180000ms usable span, zero stale intervals, v2 cadence/usability and epoch coverage, expected sample PID/run_id, and structured per-subnet PAIR_MEET_UP within the same observed window. Waives only no_stale_episode_observed; never demands mechanism CONFIRMED. Deterministic receipt includes concrete reasons, input/code/output hashes. Existing output paths refused."
  },
  "main_checks": [
    "Historical field capture with PID42904/run_id976b346f-4cf7-4c54-93e5-9eabe885a744: expect FAIL for4 stale intervals and INSUFFICIENT reason for178966ms span; retain raw analyzer exit2/mechanismCONFIRMED.",
    "Synthetic valid >=180000ms zero-stale window with bracketing heartbeat cadence and all3 structured meet events: expect PASS despite raw v2 no_stale_episode_observed/exit2.",
    "Omit one subnet event, put it outside observed sample window, or use only plain-text PAIR_MEET_UP: must not pass.",
    "Mismatched expected PID/run_id, overlapping epochs, sequence gaps, dropped records, or heartbeat coverage gaps: must not pass.",
    "Missing v1 summary/input, changed declared hashes, corrupted append-only prefix, nonzero collector completion, duplicate subnet arguments, and existing output directory: refuse explicitly.",
    "Analyzer timeout/failure: retain captured streams and raw exit when available; never pass.",
    "Repeat same immutable capture into separate NEW output dirs: compare gate receipts for determinism."
  ],
  "scope": "Only requested new Python file created; no validation commands, remote actions, lifecycle mutation, or predecessor edits performed."
}