{
  "conformance": {
    "checked": 2,
    "counts": {
      "SKIPPED": 2
    },
    "missing": [
      "orekit_jpype not importable (ModuleNotFoundError: No module named 'orekit_jpype'); pip install 'satnogs-optical-network[od]'",
      "no JVM (JAVA_HOME unset and no 'java' on PATH)",
      "orekit-data not found (set OREKIT_DATA_PATH to the orekit-data zip or directory, or put orekit-data.zip in the working directory)"
    ],
    "note": "Orekit is the conformance authority (ADR 0014). SKIPPED means it did not run here; it does not mean the file conforms. NOT_RUN means nothing was checked at all, which is not a pass either. This deployment does not carry a JVM, by decision (network #11): the gate runs on bench machines that install the optional [od] extra, not on the deployed service.",
    "status": "SKIPPED",
    "structural_problems": []
  },
  "correlation_metrics": {
    "basis": "correlation",
    "correlation_run_id": 831,
    "note": "counts here move when correlation improves; the five primary metrics do not (see docs/decisions/0002-unk-participants.md)",
    "objects": 39,
    "objects_not_in_advisory": 7,
    "tracks_resolved_beyond_advisory": 13,
    "tracks_with_object": 51,
    "tracks_without_object": 13,
    "unk_designations": 13
  },
  "correlation_run_id": 831,
  "correlation_version": 4,
  "date": "2026-09-19",
  "epoch_collisions": {
    "detail": [
      {
        "epoch": "2026-09-20T03:01:14.385698",
        "excluded_measurements": 3,
        "kind": "contradictory",
        "measurements": [
          "79d0a52b-7d8a-5e58-8d9d-b66a80694ab8",
          "95a3bc54-c771-5c73-a753-ca1116681af9",
          "cf824cbc-e753-5e26-9de8-efa980e3cce2"
        ],
        "object_norad_id": 62184,
        "positions": [
          "172.507268 54.590191",
          "173.021375 54.184198",
          "173.526513 53.769467"
        ],
        "published_observations": 0,
        "scope": "sibling-tracks",
        "sibling_track_ids": [
          74856,
          74857,
          74858
        ],
        "station_id": 11,
        "track_id": 74856
      },
      {
        "epoch": "2026-09-20T03:19:14.522099",
        "excluded_measurements": 3,
        "kind": "contradictory",
        "measurements": [
          "0ad1c5fa-369e-5114-8ac9-458dc91570fa",
          "5323d930-a3a6-522d-ba3e-6584b31d6b0f",
          "b976dbcf-ded6-5007-9f12-db6e8aaa1b78"
        ],
        "object_norad_id": 25286,
        "positions": [
          "162.962503 62.352642",
          "165.201885 62.554411",
          "166.457011 62.641397"
        ],
        "published_observations": 0,
        "scope": "sibling-tracks",
        "sibling_track_ids": [
          74873,
          74874,
          74875
        ],
        "station_id": 11,
        "track_id": 74873
      },
      {
        "epoch": "2026-09-20T03:20:09.482584",
        "excluded_measurements": 3,
        "kind": "contradictory",
        "measurements": [
          "65aa793f-de16-5566-bb6c-58eaef1cc898",
          "8ab10f47-4ad2-5c7b-9c2b-dddd871a6af5",
          "c8ae1cd2-39ac-5940-9807-e6f85655398b"
        ],
        "object_norad_id": 43249,
        "positions": [
          "171.832281 60.184327",
          "173.360154 60.264830",
          "175.422828 60.343963"
        ],
        "published_observations": 0,
        "scope": "sibling-tracks",
        "sibling_track_ids": [
          74877,
          74878,
          74879
        ],
        "station_id": 11,
        "track_id": 74877
      }
    ],
    "detail_omitted": 0,
    "epochs": 3,
    "measurements_excluded": 9,
    "note": "one epoch stated twice costs its own measurements, never the session: a repeated epoch is published once, a contradicted one is published not at all, and every excluded row is still in the parquet archive. Counted over tracks with a correlated object, which are the only tracks a TDM is written for. See docs/decisions/0004-duplicate-epochs.md",
    "tracks": 3,
    "tracks_left_without_observations": 5
  },
  "generated_at": "2026-09-22T22:37:51.593124Z",
  "generation_id": "543a589c2873c0c542f2de9ac0d70b23bfeefa0adb22c970ac0513b4cc9508f8",
  "generator": "satnogs_optical_network.products",
  "iod": {
    "11": {
      "identified_lines": 4095,
      "identified_tracks": 38,
      "lines": 4882,
      "skipped": 0,
      "skipped_reasons": [],
      "unk_lines": 787,
      "unk_tracks": 6,
      "wide_id_tracks": 0
    },
    "7": {
      "identified_lines": 301,
      "identified_tracks": 13,
      "lines": 308,
      "skipped": 0,
      "skipped_reasons": [],
      "unk_lines": 7,
      "unk_tracks": 7,
      "wide_id_tracks": 0
    }
  },
  "layout": {
    "generation_dir": "session_date=2026-09-19/generations/543a589c2873c0c542f2de9ac0d70b23bfeefa0adb22c970ac0513b4cc9508f8",
    "measurements": "measurements.parquet",
    "note": "Resolve products through this manifest. Retained generations must not be combined with a recursive Parquet wildcard.",
    "session_dir": "session_date=2026-09-19",
    "stations": "stations",
    "tracks": "tracks.parquet"
  },
  "metrics": {
    "measurements": 5190,
    "objects": 33,
    "stations": 2,
    "tracks": 64,
    "unk_tracks": 25
  },
  "metrics_basis": "as-ingested",
  "packaging": {
    "note": "TDM file count is a packaging artifact, not a headline metric: it both overstates the claim to experts and understates the data volume (ADR 0010). tdm_observations is the count actually read back out of the published station-night TDMs and checked against the measurement rows; it is the number to compare a published file against. tdm_tracks is the number of segments across them.",
    "tdm_files": 2,
    "tdm_observations": 4387,
    "tdm_observations_expected": 4387,
    "tdm_observations_verified": true,
    "tdm_tracks": 46
  },
  "per_station": [
    {
      "epoch_collisions": 0,
      "iod": {
        "identified_lines": 301,
        "identified_tracks": 13,
        "lines": 308,
        "skipped": 0,
        "skipped_reasons": [],
        "unk_lines": 7,
        "unk_tracks": 7,
        "wide_id_tracks": 0
      },
      "iod_station_code": "7",
      "measurements": 308,
      "name": "Drachten",
      "objects": 6,
      "station_id": 7,
      "tdm_tracks": 13,
      "tracks": 20,
      "unk_tracks": 14
    },
    {
      "epoch_collisions": 3,
      "iod": {
        "identified_lines": 4095,
        "identified_tracks": 38,
        "lines": 4882,
        "skipped": 0,
        "skipped_reasons": [],
        "unk_lines": 787,
        "unk_tracks": 6,
        "wide_id_tracks": 0
      },
      "iod_station_code": "11",
      "measurements": 4882,
      "name": "dwingeloo",
      "objects": 27,
      "station_id": 11,
      "tdm_tracks": 38,
      "tracks": 44,
      "unk_tracks": 11
    }
  ],
  "products": [
    {
      "bytes": 9552,
      "conformance": null,
      "kind": "characterisation-station",
      "path": "session_date=2026-09-19/generations/543a589c2873c0c542f2de9ac0d70b23bfeefa0adb22c970ac0513b4cc9508f8/stations/station-11.json",
      "scope": "station-night",
      "scope_key": "11-2026-09-19",
      "sha256": "6c6ebc0e289c19833afc418c37837ee756c7726ae0224ab4857400ee1b1624f6"
    },
    {
      "bytes": 9651,
      "conformance": null,
      "kind": "characterisation-station",
      "path": "session_date=2026-09-19/generations/543a589c2873c0c542f2de9ac0d70b23bfeefa0adb22c970ac0513b4cc9508f8/stations/station-7.json",
      "scope": "station-night",
      "scope_key": "7-2026-09-19",
      "sha256": "295cdc50d915b2983e92e715c5b562d422b3bfdf6d34d2a732d4028f45e018d4"
    },
    {
      "bytes": 327094,
      "conformance": null,
      "kind": "iod-station-night",
      "path": "session_date=2026-09-19/generations/543a589c2873c0c542f2de9ac0d70b23bfeefa0adb22c970ac0513b4cc9508f8/iod/station-11-2026-09-19.iod",
      "scope": "station-night",
      "scope_key": "11-2026-09-19",
      "sha256": "16d8736da87b407f66a1fcebda21600f6d115d77855a42a0119addd32640247e"
    },
    {
      "bytes": 20636,
      "conformance": null,
      "kind": "iod-station-night",
      "path": "session_date=2026-09-19/generations/543a589c2873c0c542f2de9ac0d70b23bfeefa0adb22c970ac0513b4cc9508f8/iod/station-7-2026-09-19.iod",
      "scope": "station-night",
      "scope_key": "7-2026-09-19",
      "sha256": "f0f1c4cfda471c91820d8a5b681795ee6b8a06708681ffb796bc170a1086b916"
    },
    {
      "bytes": 559822,
      "conformance": null,
      "kind": "parquet-session",
      "path": "session_date=2026-09-19/generations/543a589c2873c0c542f2de9ac0d70b23bfeefa0adb22c970ac0513b4cc9508f8/measurements.parquet",
      "scope": "session",
      "scope_key": "2026-09-19",
      "sha256": "3960a5efba82493e2de3dd6d1697bc8557dc8849a4490aa97e17ec2a25fe172b"
    },
    {
      "bytes": 12660,
      "conformance": null,
      "kind": "parquet-tracks",
      "path": "session_date=2026-09-19/generations/543a589c2873c0c542f2de9ac0d70b23bfeefa0adb22c970ac0513b4cc9508f8/tracks.parquet",
      "scope": "session",
      "scope_key": "2026-09-19",
      "sha256": "443982987339364eb0668894bf284e26d28933f155002473f022ffecebe7a4e6"
    },
    {
      "bytes": 490822,
      "conformance": "SKIPPED: Orekit conformance NOT VERIFIED for station-11-2026-09-19.tdm: orekit_jpype not importable (ModuleNotFoundError: No module named 'orekit_jpype'); pip install 'satnogs-optical-network[od]'; no JVM (JAVA_HOME unset and no 'java' on PATH); orekit-data not found (set OREKIT_DATA_PATH to the orekit-data zip or directory, or put orekit-data.zip in the working directory). Offline structural check: clean.",
      "kind": "tdm-station-night",
      "observations": 4086,
      "path": "session_date=2026-09-19/generations/543a589c2873c0c542f2de9ac0d70b23bfeefa0adb22c970ac0513b4cc9508f8/tdm/station-11-2026-09-19.tdm",
      "scope": "station-night",
      "scope_key": "11-2026-09-19",
      "sha256": "a829ebaf73652434709f4ea50db6fbbc63b3466d2f7c551ca72b6a6675cf9dbd"
    },
    {
      "bytes": 47520,
      "conformance": "SKIPPED: Orekit conformance NOT VERIFIED for station-7-2026-09-19.tdm: orekit_jpype not importable (ModuleNotFoundError: No module named 'orekit_jpype'); pip install 'satnogs-optical-network[od]'; no JVM (JAVA_HOME unset and no 'java' on PATH); orekit-data not found (set OREKIT_DATA_PATH to the orekit-data zip or directory, or put orekit-data.zip in the working directory). Offline structural check: clean.",
      "kind": "tdm-station-night",
      "observations": 301,
      "path": "session_date=2026-09-19/generations/543a589c2873c0c542f2de9ac0d70b23bfeefa0adb22c970ac0513b4cc9508f8/tdm/station-7-2026-09-19.tdm",
      "scope": "station-night",
      "scope_key": "7-2026-09-19",
      "sha256": "63da6b023ab6d0dca6c2e1299dea075e991509a842c832a50c658edfa061d803"
    }
  ],
  "quarantined_excluded": 0,
  "station": [
    7,
    11
  ],
  "stations": [
    7,
    11
  ],
  "tdm_excluded_epoch_collisions": 9,
  "tdm_skipped_no_observations": 5,
  "tdm_skipped_unk": 13
}
