{
  "title": "Data downloads status",
  "updated_at": "2026-10-31T11:34:18+10:00",
  "timezone": "Australia/Brisbane",
  "readme": "Written by /workspace/ceo/publish_download_status.py on the box. Times are ISO 8601 with offset. null means not happened yet; never invent a time.",
  "jobs": {
    "tick": {
      "name": "Futures ticks → 1-second bars",
      "contracts": {
        "NQ": {
          "started": "2026-10-06T17:54:43+10:00",
          "finished": "2026-10-06T17:59:02+10:00",
          "status": "finished",
          "empty_days": [
            "2025-12-25",
            "2026-01-01"
          ],
          "empty_days_checked": true,
          "data_finish": "2026-10-06",
          "verified": "clean"
        },
        "ES": {
          "started": "2026-10-06T18:01:02+10:00",
          "finished": "2026-10-06T18:05:51+10:00",
          "status": "finished",
          "empty_days": [
            "2025-12-25",
            "2026-01-01",
            "2026-04-03"
          ],
          "empty_days_checked": true,
          "data_finish": "2026-10-06",
          "verified": "clean"
        },
        "YM": {
          "started": "2026-10-06T18:05:51+10:00",
          "finished": "2026-10-06T18:07:49+10:00",
          "status": "finished",
          "empty_days": [
            "2025-12-25",
            "2026-01-01",
            "2026-04-03"
          ],
          "empty_days_checked": true,
          "data_finish": "2026-10-06",
          "verified": "clean"
        },
        "RTY": {
          "started": "2026-10-06T18:07:49+10:00",
          "finished": "2026-10-06T18:10:05+10:00",
          "status": "finished",
          "empty_days": [
            "2025-12-25",
            "2026-01-01",
            "2026-04-03"
          ],
          "empty_days_checked": true,
          "data_finish": "2026-10-06",
          "verified": "clean"
        },
        "GC": {
          "started": "2026-10-06T17:59:02+10:00",
          "finished": "2026-10-06T18:01:02+10:00",
          "status": "finished",
          "empty_days": [
            "2025-12-25",
            "2026-01-01",
            "2026-04-03"
          ],
          "empty_days_checked": true,
          "data_finish": "2026-10-06",
          "verified": "clean"
        },
        "SI": {
          "started": "2026-10-06T18:19:58+10:00",
          "finished": "2026-10-06T18:21:56+10:00",
          "status": "finished",
          "empty_days": [
            "2025-12-25",
            "2026-01-01",
            "2026-04-03"
          ],
          "empty_days_checked": true,
          "data_finish": "2026-10-06",
          "verified": "clean"
        },
        "CL": {
          "started": "2026-10-06T18:10:05+10:00",
          "finished": "2026-10-06T18:12:28+10:00",
          "status": "finished",
          "empty_days": [
            "2025-12-25",
            "2026-01-01",
            "2026-04-03"
          ],
          "empty_days_checked": true,
          "data_finish": "2026-10-06",
          "verified": "clean"
        },
        "NG": {
          "started": "2026-10-06T18:21:56+10:00",
          "finished": "2026-10-06T18:24:10+10:00",
          "status": "finished",
          "empty_days": [
            "2025-12-25",
            "2026-01-01",
            "2026-04-03"
          ],
          "empty_days_checked": true,
          "data_finish": "2026-10-06",
          "verified": "clean"
        },
        "ZN": {
          "started": "2026-10-06T18:24:10+10:00",
          "finished": "2026-10-06T18:27:25+10:00",
          "status": "finished",
          "empty_days": [
            "2025-12-25",
            "2026-01-01"
          ],
          "empty_days_checked": true,
          "data_finish": "2026-10-06",
          "verified": "clean"
        },
        "6E": {
          "started": "2026-10-06T18:14:13+10:00",
          "finished": "2026-10-06T18:16:03+10:00",
          "status": "finished",
          "empty_days": [
            "2025-12-25",
            "2026-01-01"
          ],
          "empty_days_checked": true,
          "data_finish": "2026-10-06",
          "verified": "clean"
        },
        "6B": {
          "started": "2026-10-06T18:16:03+10:00",
          "finished": "2026-10-06T18:17:59+10:00",
          "status": "finished",
          "empty_days": [
            "2025-12-25",
            "2026-01-01"
          ],
          "empty_days_checked": true,
          "data_finish": "2026-10-06",
          "verified": "clean"
        },
        "6A": {
          "started": "2026-10-06T18:17:59+10:00",
          "finished": "2026-10-06T18:19:58+10:00",
          "status": "finished",
          "empty_days": [
            "2025-12-25",
            "2026-01-01"
          ],
          "empty_days_checked": true,
          "data_finish": "2026-10-06",
          "verified": "clean"
        },
        "FDAX": {
          "started": "2026-10-06T18:12:28+10:00",
          "finished": "2026-10-06T18:14:13+10:00",
          "status": "finished",
          "empty_days": [
            "2025-12-24",
            "2025-12-25",
            "2025-12-26",
            "2025-12-31",
            "2026-01-01",
            "2026-04-03",
            "2026-04-06",
            "2026-05-01"
          ],
          "empty_days_checked": true,
          "data_finish": "2026-10-06",
          "verified": "clean"
        },
        "MBT": {
          "status": "finished",
          "group": "cme_crypto",
          "asset_class": "futures",
          "source": "NinjaTrader historical data (PC4), Futures connection; front month by NT rollover table, ET",
          "range": {
            "first": "2026-05-17",
            "last": "2026-10-30"
          },
          "data_finish": "2026-10-30",
          "output": "/workspace/data_pull/ticks_secbars/MBT/",
          "finished": "2026-10-30T22:59:16+10:00",
          "known_gaps": {
            "MBT": {
              "missing_weekday_trading_dates": [],
              "low_tick_days": 49,
              "intraday_gaps_ge60min": 40
            },
            "MBT/_topup_20261030": {
              "missing_weekday_trading_dates": [],
              "low_tick_days": 0,
              "intraday_gaps_ge60min": 2
            }
          },
          "note": "Not counted in the 13-contract library totals (outside contract_order). Top-up 21-30 Oct 2026 landed as new files in _topup_20261030/ (library files untouched).",
          "delivery": "sha256 manifest verified 30 Oct 2026 on PC5 C:\\roman_T10\\dl, PC1 (C:), PC2, PC3, PC4 farm_offload\\data_pull\\ticks_secbars (top-up folder _topup_20261030 verified on all 5 PCs; main library files on PCs untouched)",
          "verified": null
        },
        "MET": {
          "status": "finished",
          "group": "cme_crypto",
          "asset_class": "futures",
          "source": "NinjaTrader historical data (PC4), Futures connection; front month by NT rollover table, ET",
          "range": {
            "first": "2025-11-03",
            "last": "2026-10-30"
          },
          "data_finish": "2026-10-30",
          "output": "/workspace/data_pull/ticks_secbars/MET/",
          "finished": "2026-10-30T23:00:00+10:00",
          "known_gaps": {
            "MET": {
              "missing_weekday_trading_dates": [],
              "low_tick_days": 27,
              "intraday_gaps_ge60min": 161
            }
          },
          "note": "Not counted in the 13-contract library totals (outside contract_order).",
          "delivery": "sha256 manifest verified 30 Oct 2026 on PC5 C:\\roman_T10\\dl, PC1 (C:), PC2, PC3, PC4 farm_offload\\data_pull\\ticks_secbars",
          "verified": null
        },
        "BTC_CME": {
          "status": "finished",
          "group": "cme_crypto",
          "asset_class": "futures",
          "source": "NinjaTrader historical data (PC4), Futures connection; front month by NT rollover table, ET",
          "range": {
            "first": "2025-05-20",
            "last": "2026-10-30"
          },
          "data_finish": "2026-10-30",
          "output": "/workspace/data_pull/ticks_secbars/BTC/",
          "finished": "2026-10-30T22:59:16+10:00",
          "known_gaps": {
            "BTC": {
              "missing_weekday_trading_dates": [
                "2026-01-01"
              ],
              "low_tick_days": 106,
              "intraday_gaps_ge60min": 196
            },
            "BTC/_topup_20261030": {
              "missing_weekday_trading_dates": [],
              "low_tick_days": 0,
              "intraday_gaps_ge60min": 7
            }
          },
          "note": "Not counted in the 13-contract library totals (outside contract_order). Top-up 21-30 Oct 2026 landed as new files in _topup_20261030/ (library files untouched).",
          "delivery": "sha256 manifest verified 30 Oct 2026 on PC5 C:\\roman_T10\\dl, PC1 (C:), PC2, PC3, PC4 farm_offload\\data_pull\\ticks_secbars (top-up folder _topup_20261030 verified on all 5 PCs; main library files on PCs untouched)",
          "verified": null
        },
        "ETH_CME": {
          "status": "finished",
          "group": "cme_crypto",
          "asset_class": "futures",
          "source": "NinjaTrader historical data (PC4), Futures connection; front month by NT rollover table, ET",
          "range": {
            "first": "2025-11-03",
            "last": "2026-10-30"
          },
          "data_finish": "2026-10-30",
          "output": "/workspace/data_pull/ticks_secbars/ETH/",
          "finished": "2026-10-30T23:00:00+10:00",
          "known_gaps": {
            "ETH": {
              "missing_weekday_trading_dates": [
                "2026-01-01"
              ],
              "low_tick_days": 22,
              "intraday_gaps_ge60min": 189
            }
          },
          "note": "Not counted in the 13-contract library totals (outside contract_order).",
          "delivery": "sha256 manifest verified 30 Oct 2026 on PC5 C:\\roman_T10\\dl, PC1 (C:), PC2, PC3, PC4 farm_offload\\data_pull\\ticks_secbars",
          "verified": null
        }
      },
      "contracts_total": 13,
      "range": "1 Jan 2025 → 6 Oct 2026",
      "source": "NinjaTrader on DESKTOP-09E03F9",
      "output": "/workspace/data_pull/ticks_secbars/",
      "status": "finished",
      "started": "2026-10-06T15:05:00+10:00",
      "finished": "2026-10-06T18:27:25+10:00",
      "done": 13,
      "size": "2.4 GB",
      "notes": "All three passes are done for all 13 and on the box (Jan–Jul 2026, 2025, and 1 Aug–6 Oct 2026; last root ZN finished 18:27 AEST, 0 failed days). Re-checked at 18:37 AEST: every PC2 day file is on the box and all 193 month files pass their sha256 check. NinjaTrader's tick history only reaches back to 10 Oct 2025 (that day only from 16:00 New York), so earlier 2025 days are unavailable from NT, not failures. NQ, ES, GC and FDAX also have cached days from mid-May 2025 (plus 4 Apr); a few cached days are partial and NT cannot re-supply them. Known NT tick holes (accepted): 9 Jun 2026 ~11:00–11:37 ET, 24 Jul 2026 ~11:01–11:53 ET, no ticks 3 Apr 2026 for ES/YM/RTY. David approved the FDAX, 6B and 6A repair; it runs on the PC after the forex tick pass.",
      "verify_status": "issues",
      "verify_notes": "Forensic audit done for all 13 (per-root reruns 18:05–19:34 AEST, 1 Jan 2025–6 Oct 2026). FDAX repaired 19:25–19:33 AEST (David approved 18:32): 7 tick days re-pulled from NinjaTrader (13, 14, 19, 20, 22, 26, 27 May 2026), rerun_FDAX_1933 has 0 reload days, so FDAX is green. 6B/6A re-pull returned identical data: 6B 25 May 2026 ticks end 13:00 ET (NT Memorial Day session), plus the accepted 9 Jun/24 Jul holes, so they stay yellow. Every other root still has at least one tick reload day, mostly the accepted NT holes.",
      "contract_order": [
        "NQ",
        "ES",
        "YM",
        "RTY",
        "GC",
        "SI",
        "CL",
        "NG",
        "ZN",
        "6E",
        "6B",
        "6A",
        "FDAX"
      ]
    },
    "m1": {
      "name": "Fresh 1-minute bars",
      "contracts": {
        "NQ": {
          "started": "2026-10-06T15:10:14+10:00",
          "finished": "2026-10-06T15:55:09+10:00",
          "status": "finished",
          "data_finish": "2026-10-06",
          "verified": "clean"
        },
        "ES": {
          "started": "2026-10-06T15:11:30+10:00",
          "finished": "2026-10-06T16:13:52+10:00",
          "status": "finished",
          "data_finish": "2026-10-06",
          "verified": "clean"
        },
        "YM": {
          "started": "2026-10-06T15:12:06+10:00",
          "finished": "2026-10-06T16:10:30+10:00",
          "status": "finished",
          "data_finish": "2026-10-06",
          "verified": "clean"
        },
        "RTY": {
          "started": "2026-10-06T15:12:38+10:00",
          "finished": "2026-10-06T16:10:45+10:00",
          "status": "finished",
          "data_finish": "2026-10-06",
          "verified": "clean"
        },
        "GC": {
          "started": "2026-10-06T15:13:15+10:00",
          "finished": "2026-10-06T16:11:00+10:00",
          "status": "finished",
          "verified": "clean",
          "data_finish": "2026-10-06"
        },
        "SI": {
          "started": "2026-10-06T15:13:57+10:00",
          "finished": "2026-10-06T16:11:09+10:00",
          "status": "finished",
          "data_finish": "2026-10-06",
          "verified": "clean"
        },
        "CL": {
          "started": "2026-10-06T15:14:45+10:00",
          "finished": "2026-10-06T16:11:18+10:00",
          "status": "finished",
          "data_finish": "2026-10-06",
          "verified": "clean"
        },
        "NG": {
          "started": "2026-10-06T15:16:27+10:00",
          "finished": "2026-10-06T16:11:26+10:00",
          "status": "finished",
          "data_finish": "2026-10-06",
          "verified": "clean"
        },
        "ZN": {
          "started": "2026-10-06T15:18:05+10:00",
          "finished": "2026-10-06T16:11:34+10:00",
          "status": "finished",
          "data_finish": "2026-10-06",
          "verified": "clean"
        },
        "6E": {
          "started": "2026-10-06T15:18:39+10:00",
          "finished": "2026-10-06T16:11:44+10:00",
          "status": "finished",
          "data_finish": "2026-10-06",
          "verified": "clean"
        },
        "6B": {
          "started": "2026-10-06T15:19:17+10:00",
          "finished": "2026-10-06T16:11:52+10:00",
          "status": "finished",
          "verified": "clean",
          "data_finish": "2026-10-06"
        },
        "6A": {
          "started": "2026-10-06T15:19:53+10:00",
          "finished": "2026-10-06T16:12:00+10:00",
          "status": "finished",
          "verified": "clean",
          "data_finish": "2026-10-06"
        },
        "FDAX": {
          "started": "2026-10-06T15:20:31+10:00",
          "finished": "2026-10-06T16:12:06+10:00",
          "status": "finished",
          "verified": "clean",
          "data_finish": "2026-10-05"
        },
        "MBT": {
          "status": "finished",
          "group": "cme_crypto",
          "asset_class": "futures",
          "source": "NinjaTrader historical data (PC4), Futures connection; front month by NT rollover table, ET",
          "range": {
            "first": "2026-05-17",
            "last": "2026-10-30"
          },
          "data_finish": "2026-10-30",
          "output": "/workspace/data_pull/ticks_secbars/MBT/",
          "finished": "2026-10-30T22:59:16+10:00",
          "known_gaps": {
            "MBT": {
              "missing_weekday_trading_dates": [],
              "low_tick_days": 49,
              "intraday_gaps_ge60min": 40
            },
            "MBT/_topup_20261030": {
              "missing_weekday_trading_dates": [],
              "low_tick_days": 0,
              "intraday_gaps_ge60min": 2
            }
          },
          "note": "Not counted in the 13-contract library totals (outside contract_order). Top-up 21-30 Oct 2026 landed as new files in _topup_20261030/ (library files untouched).",
          "delivery": "sha256 manifest verified 30 Oct 2026 on PC5 C:\\roman_T10\\dl, PC1 (C:), PC2, PC3, PC4 farm_offload\\data_pull\\ticks_secbars (top-up folder _topup_20261030 verified on all 5 PCs; main library files on PCs untouched)",
          "verified": null
        },
        "MET": {
          "status": "finished",
          "group": "cme_crypto",
          "asset_class": "futures",
          "source": "NinjaTrader historical data (PC4), Futures connection; front month by NT rollover table, ET",
          "range": {
            "first": "2025-05-25",
            "last": "2026-10-30"
          },
          "data_finish": "2026-10-30",
          "output": "/workspace/data_pull/ticks_secbars/MET/",
          "finished": "2026-10-30T23:00:00+10:00",
          "known_gaps": {
            "MET": {
              "missing_weekday_trading_dates": [],
              "low_tick_days": 27,
              "intraday_gaps_ge60min": 161
            }
          },
          "note": "Not counted in the 13-contract library totals (outside contract_order).",
          "delivery": "sha256 manifest verified 30 Oct 2026 on PC5 C:\\roman_T10\\dl, PC1 (C:), PC2, PC3, PC4 farm_offload\\data_pull\\ticks_secbars",
          "verified": null
        },
        "BTC_CME": {
          "status": "finished",
          "group": "cme_crypto",
          "asset_class": "futures",
          "source": "NinjaTrader historical data (PC4), Futures connection; front month by NT rollover table, ET",
          "range": {
            "first": "2025-05-20",
            "last": "2026-10-30"
          },
          "data_finish": "2026-10-30",
          "output": "/workspace/data_pull/ticks_secbars/BTC/",
          "finished": "2026-10-30T22:59:16+10:00",
          "known_gaps": {
            "BTC": {
              "missing_weekday_trading_dates": [
                "2026-01-01"
              ],
              "low_tick_days": 106,
              "intraday_gaps_ge60min": 196
            },
            "BTC/_topup_20261030": {
              "missing_weekday_trading_dates": [],
              "low_tick_days": 0,
              "intraday_gaps_ge60min": 7
            }
          },
          "note": "Not counted in the 13-contract library totals (outside contract_order). Top-up 21-30 Oct 2026 landed as new files in _topup_20261030/ (library files untouched).",
          "delivery": "sha256 manifest verified 30 Oct 2026 on PC5 C:\\roman_T10\\dl, PC1 (C:), PC2, PC3, PC4 farm_offload\\data_pull\\ticks_secbars (top-up folder _topup_20261030 verified on all 5 PCs; main library files on PCs untouched)",
          "verified": null
        },
        "ETH_CME": {
          "status": "finished",
          "group": "cme_crypto",
          "asset_class": "futures",
          "source": "NinjaTrader historical data (PC4), Futures connection; front month by NT rollover table, ET",
          "range": {
            "first": "2025-05-25",
            "last": "2026-10-30"
          },
          "data_finish": "2026-10-30",
          "output": "/workspace/data_pull/ticks_secbars/ETH/",
          "finished": "2026-10-30T23:00:00+10:00",
          "known_gaps": {
            "ETH": {
              "missing_weekday_trading_dates": [
                "2026-01-01"
              ],
              "low_tick_days": 22,
              "intraday_gaps_ge60min": 189
            }
          },
          "note": "Not counted in the 13-contract library totals (outside contract_order).",
          "delivery": "sha256 manifest verified 30 Oct 2026 on PC5 C:\\roman_T10\\dl, PC1 (C:), PC2, PC3, PC4 farm_offload\\data_pull\\ticks_secbars",
          "verified": null
        }
      },
      "contracts_total": 13,
      "range": "1 Jan 2025 → 6 Oct 2026",
      "source": "NinjaTrader on DESKTOP-09E03F9",
      "output": "/workspace/data_pull/m1_fullsize_2025-01_2026-07/",
      "status": "finished",
      "started": "2026-10-06T15:10:14+10:00",
      "finished": "2026-10-06T16:18:33+10:00",
      "done": 13,
      "size": "761 MB",
      "notes": "Fresh NT 1m, 13 roots, 1 Jan 2025 - 6 Oct 2026 (6 Oct partial). Per-contract unadjusted + stitched (NT roll rule) + NT back-adj. 38 NT-DB holes/corruptions patched from held copy (overlap-verified, logged). COVERAGE.md + coverage.csv in output folder.",
      "verify_status": "issues",
      "verify_notes": "FDAX fixed 19:33 AEST (David approved 18:32): the 17 missing + 3 partial days (13–27 May, 17–29 Sep 2026) were filled from NinjaTrader. 15 days come from NT's own 1m re-export and 5 (13–15 May, 17–18 Sep) from NT tick bars, which match NT 1m bar-for-bar on the other days. rerun_FDAX_1933: 447/447 trading days, 0 reload gaps. Open: 6B and 6A 2025-07-04 missing; CME FX traded until 13:00 ET, but NT's FX trading-hours template drops the session (re-pull at 19:31 confirmed no bars), and there's no second source. 6E was patched from a held copy. ES 2026-01-25 gap was filled 16:50 from ES ticks. 2025-04-18 is Good Friday (a holiday, not a gap). 11 roots clean.",
      "contract_order": [
        "NQ",
        "ES",
        "YM",
        "RTY",
        "GC",
        "SI",
        "CL",
        "NG",
        "ZN",
        "6E",
        "6B",
        "6A",
        "FDAX"
      ]
    },
    "fx_tick": {
      "name": "Forex ticks → 1-second bars",
      "contract_order": [
        "EURUSD",
        "GBPUSD",
        "USDJPY",
        "AUDUSD",
        "USDCHF",
        "USDCAD"
      ],
      "contracts_total": 6,
      "contracts": {
        "EURUSD": {
          "started": "2026-10-06T16:20:37+10:00",
          "finished": "2026-10-06T19:08:06+10:00",
          "status": "finished",
          "empty_days": [
            "2025-12-25",
            "2026-01-01",
            "2026-05-14",
            "2026-05-15"
          ],
          "empty_days_checked": true,
          "verified": "clean",
          "data_finish": "2026-10-06"
        },
        "GBPUSD": {
          "started": "2026-10-06T16:20:37+10:00",
          "finished": "2026-10-06T18:58:46+10:00",
          "status": "finished",
          "empty_days": [
            "2025-12-25",
            "2026-01-01"
          ],
          "empty_days_checked": true,
          "verified": "clean",
          "data_finish": "2026-10-06"
        },
        "USDJPY": {
          "started": "2026-10-06T16:20:37+10:00",
          "finished": "2026-10-06T19:21:20+10:00",
          "status": "finished",
          "empty_days": [
            "2025-12-25",
            "2026-01-01"
          ],
          "empty_days_checked": true,
          "verified": "clean",
          "data_finish": "2026-10-06"
        },
        "AUDUSD": {
          "started": "2026-10-06T16:20:37+10:00",
          "finished": "2026-10-06T19:03:02+10:00",
          "status": "finished",
          "empty_days": [
            "2025-12-25",
            "2026-01-01"
          ],
          "empty_days_checked": true,
          "verified": "clean",
          "data_finish": "2026-10-06"
        },
        "USDCHF": {
          "started": "2026-10-06T16:20:37+10:00",
          "finished": "2026-10-06T19:23:50+10:00",
          "status": "finished",
          "empty_days": [
            "2025-12-25",
            "2026-01-01"
          ],
          "empty_days_checked": true,
          "verified": "clean",
          "data_finish": "2026-10-06"
        },
        "USDCAD": {
          "started": "2026-10-06T16:20:37+10:00",
          "finished": "2026-10-06T19:16:01+10:00",
          "status": "finished",
          "empty_days": [
            "2025-12-25",
            "2026-01-01"
          ],
          "empty_days_checked": true,
          "verified": "clean",
          "data_finish": "2026-10-06"
        }
      },
      "range": "1 Jan 2025 → 6 Oct 2026",
      "source": "NinjaTrader on DESKTOP-09E03F9",
      "output": "/workspace/data_pull/ticks_secbars_fx/",
      "status": "finished",
      "started": "2026-10-06T16:20:37+10:00",
      "finished": "2026-10-06T19:23:50+10:00",
      "done": 6,
      "size": "5.3 GB",
      "notes": "6 pairs done and on the box. Dukascopy ticks cover 1 Jan 2025–6 Oct 2026, 458 trading days per pair, in /workspace/data_pull/forex/<PAIR>/tick_1s (3.6 GB); only 1 Jan 2026 (holiday) is absent. NinjaTrader ticks are in /workspace/data_pull/ticks_secbars_fx/<PAIR>/ (1s/5s/15s + csv_gz, 1.7 GB). NT's forex history starts 19 May 2025 for EURUSD (358 days) and 10 Oct 2025 16:00 New York for the other 5 (256 days each); earlier days are unavailable from NT, not failures. 6 Oct 2026 is a part day (pulled at ~04:30–05:15 New York). Holidays: no NT data 25 Dec 2025 or 1 Jan 2026; early close ~14:00 New York on 24 and 31 Dec; late open ~01:30 on 26 Dec and 2 Jan.",
      "verify_status": "passed",
      "verify_notes": "Rechecked 7 Oct 2026 14:25 AEST, every trading day per pair (/workspace/ceo/forensic_forex_20261007/): only documented holes - NinjaTrader source hole 2 Mar 2026 04:13-20:04 ET (all 6 pairs), EURUSD 13 May 04:44 -> 17 May 17:13 ET and 24 Jun 2026 21:23-21:53 ET, Christmas/New Year (and Good Friday 3 Apr 2026 early stop on AUDUSD/USDJPY), 17:00 ET rollover gaps. All listed in /dev/data/known_gaps.json (forex); do not test through them. No reload day. All 6 green per David 7 Oct 2:24 PM."
    }
  }
}
