{
  "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": 376,
    "note": "counts here move when correlation improves; the five primary metrics do not (see docs/decisions/0002-unk-participants.md)",
    "objects": 16,
    "objects_not_in_advisory": 8,
    "tracks_resolved_beyond_advisory": 9,
    "tracks_with_object": 18,
    "tracks_without_object": 15,
    "unk_designations": 15
  },
  "correlation_run_id": 376,
  "correlation_version": 15,
  "date": "2026-08-29",
  "epoch_collisions": {
    "detail": [
      {
        "epoch": "2026-08-29T21:59:11.563873",
        "excluded_measurements": 2,
        "kind": "contradictory",
        "measurements": [
          "cee7f801-85ab-52bb-93f6-2765917d0859",
          "e939a27d-2326-591d-8523-befeff00d2ce"
        ],
        "object_norad_id": 68361,
        "positions": [
          "235.604209 43.569564",
          "236.444585 43.131936"
        ],
        "published_observations": 0,
        "scope": "sibling-tracks",
        "sibling_track_ids": [
          5657,
          5658
        ],
        "station_id": 7,
        "track_id": 5657
      }
    ],
    "detail_omitted": 0,
    "epochs": 1,
    "measurements_excluded": 2,
    "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": 1,
    "tracks_left_without_observations": 0
  },
  "generated_at": "2026-09-22T23:39:28.685212Z",
  "generation_id": "0f7cc99df2bf902d0b2b9dcbf052964ba86e8407fff5e23bd396ec052e72009c",
  "generator": "satnogs_optical_network.products",
  "iod": {
    "4": {
      "identified_lines": 616,
      "identified_tracks": 12,
      "lines": 1304,
      "skipped": 0,
      "skipped_reasons": [],
      "unk_lines": 688,
      "unk_tracks": 14,
      "wide_id_tracks": 0
    },
    "7": {
      "identified_lines": 389,
      "identified_tracks": 6,
      "lines": 489,
      "skipped": 0,
      "skipped_reasons": [],
      "unk_lines": 100,
      "unk_tracks": 1,
      "wide_id_tracks": 0
    }
  },
  "layout": {
    "generation_dir": "session_date=2026-08-29/generations/0f7cc99df2bf902d0b2b9dcbf052964ba86e8407fff5e23bd396ec052e72009c",
    "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-08-29",
    "stations": "stations",
    "tracks": "tracks.parquet"
  },
  "metrics": {
    "measurements": 1793,
    "objects": 12,
    "stations": 2,
    "tracks": 33,
    "unk_tracks": 20
  },
  "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": 1003,
    "tdm_observations_expected": 1003,
    "tdm_observations_verified": true,
    "tdm_tracks": 18
  },
  "per_station": [
    {
      "epoch_collisions": 0,
      "iod": {
        "identified_lines": 616,
        "identified_tracks": 12,
        "lines": 1304,
        "skipped": 0,
        "skipped_reasons": [],
        "unk_lines": 688,
        "unk_tracks": 14,
        "wide_id_tracks": 0
      },
      "iod_station_code": "4",
      "measurements": 1304,
      "name": "optical-bench1",
      "objects": 12,
      "station_id": 4,
      "tdm_tracks": 12,
      "tracks": 26,
      "unk_tracks": 13
    },
    {
      "epoch_collisions": 1,
      "iod": {
        "identified_lines": 389,
        "identified_tracks": 6,
        "lines": 489,
        "skipped": 0,
        "skipped_reasons": [],
        "unk_lines": 100,
        "unk_tracks": 1,
        "wide_id_tracks": 0
      },
      "iod_station_code": "7",
      "measurements": 489,
      "name": "Drachten",
      "objects": 0,
      "station_id": 7,
      "tdm_tracks": 6,
      "tracks": 7,
      "unk_tracks": 7
    }
  ],
  "products": [
    {
      "bytes": 10930,
      "conformance": null,
      "kind": "characterisation-station",
      "path": "session_date=2026-08-29/generations/0f7cc99df2bf902d0b2b9dcbf052964ba86e8407fff5e23bd396ec052e72009c/stations/station-4.json",
      "scope": "station-night",
      "scope_key": "4-2026-08-29",
      "sha256": "443181c020badb3ed996e439e9961dd5837617b4b9c28279f39442d1fe35aa0f"
    },
    {
      "bytes": 9620,
      "conformance": null,
      "kind": "characterisation-station",
      "path": "session_date=2026-08-29/generations/0f7cc99df2bf902d0b2b9dcbf052964ba86e8407fff5e23bd396ec052e72009c/stations/station-7.json",
      "scope": "station-night",
      "scope_key": "7-2026-08-29",
      "sha256": "ff368438effbf888a43faff7923cd11a1dfb01bc179dc14ef76c5863c04c6577"
    },
    {
      "bytes": 87368,
      "conformance": null,
      "kind": "iod-station-night",
      "path": "session_date=2026-08-29/generations/0f7cc99df2bf902d0b2b9dcbf052964ba86e8407fff5e23bd396ec052e72009c/iod/station-4-2026-08-29.iod",
      "scope": "station-night",
      "scope_key": "4-2026-08-29",
      "sha256": "ff3453e0160cc2e2839a46c0c027966e7eb09d7dcf3ee71b5c6c77cb848a84db"
    },
    {
      "bytes": 32763,
      "conformance": null,
      "kind": "iod-station-night",
      "path": "session_date=2026-08-29/generations/0f7cc99df2bf902d0b2b9dcbf052964ba86e8407fff5e23bd396ec052e72009c/iod/station-7-2026-08-29.iod",
      "scope": "station-night",
      "scope_key": "7-2026-08-29",
      "sha256": "44a35b92c8aebf18c3b8256111d9830c02d65b839fb89196d7098689809df674"
    },
    {
      "bytes": 174651,
      "conformance": null,
      "kind": "parquet-session",
      "path": "session_date=2026-08-29/generations/0f7cc99df2bf902d0b2b9dcbf052964ba86e8407fff5e23bd396ec052e72009c/measurements.parquet",
      "scope": "session",
      "scope_key": "2026-08-29",
      "sha256": "0ee4b72998d4a30cb78083c6d3fb301398410734368c8cf9db7ba4a4730d3ae6"
    },
    {
      "bytes": 10576,
      "conformance": null,
      "kind": "parquet-tracks",
      "path": "session_date=2026-08-29/generations/0f7cc99df2bf902d0b2b9dcbf052964ba86e8407fff5e23bd396ec052e72009c/tracks.parquet",
      "scope": "session",
      "scope_key": "2026-08-29",
      "sha256": "3e084d4fb0b5d85009e52ca27cdd8880fffcc2c573d51b5c92ff29a0cee83ed4"
    },
    {
      "bytes": 78455,
      "conformance": "SKIPPED: Orekit conformance NOT VERIFIED for station-4-2026-08-29.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": 616,
      "path": "session_date=2026-08-29/generations/0f7cc99df2bf902d0b2b9dcbf052964ba86e8407fff5e23bd396ec052e72009c/tdm/station-4-2026-08-29.tdm",
      "scope": "station-night",
      "scope_key": "4-2026-08-29",
      "sha256": "ea9b6a315b969a6fc4cebfd780c7baf37878512a53ddbe09874c0222585a1de0"
    },
    {
      "bytes": 49353,
      "conformance": "SKIPPED: Orekit conformance NOT VERIFIED for station-7-2026-08-29.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": 387,
      "path": "session_date=2026-08-29/generations/0f7cc99df2bf902d0b2b9dcbf052964ba86e8407fff5e23bd396ec052e72009c/tdm/station-7-2026-08-29.tdm",
      "scope": "station-night",
      "scope_key": "7-2026-08-29",
      "sha256": "4123e1da0986474ef88e7d5c85505583068f10047de02e38987bd13d9e6ce2cf"
    }
  ],
  "quarantined_excluded": 0,
  "station": [
    4,
    7
  ],
  "stations": [
    4,
    7
  ],
  "tdm_excluded_epoch_collisions": 2,
  "tdm_skipped_no_observations": 0,
  "tdm_skipped_unk": 15
}
