{
  "integrity": {
    "feeds": [
      {
        "feed": "coinbase-btc-usd-1h",
        "rows": 41694,
        "asset": "BTC",
        "cutoffs": [
          {
            "cutoff": "2026-10-04T19:45:18.143378+00:00",
            "rows_captured_before": 41694,
            "rows_observed_before": 41694,
            "rows_live_recorded_before": 247
          }
        ],
        "gap_count": 3,
        "last_hour": "2026-10-04T18:00:00+00:00",
        "clock_rule": "usable_at = observed_at + 1 hour (exchange candle is public at hour close and not revised); live_recorded is an extra check that we captured it within 3h",
        "first_hour": "2022-01-01T00:00:00+00:00",
        "worst_gaps": [
          {
            "after": "2026-05-08T01:00:00+00:00",
            "before": "2026-05-08T07:00:00+00:00",
            "missing_hours": 5
          },
          {
            "after": "2025-10-25T15:00:00+00:00",
            "before": "2025-10-25T21:00:00+00:00",
            "missing_hours": 5
          },
          {
            "after": "2023-03-04T17:00:00+00:00",
            "before": "2023-03-04T21:00:00+00:00",
            "missing_hours": 3
          }
        ],
        "missing_hours": 13,
        "expected_hours": 41707,
        "backfilled_rows": 41447,
        "duplicate_hours": 0,
        "longest_gap_hours": 5,
        "impossible_candles": 0,
        "live_recorded_rows": 247,
        "live_recorded_since": "2026-09-22T06:00:00+00:00",
        "training_eligible": true
      },
      {
        "feed": "coinbase-cgld-usd-1h",
        "rows": 418,
        "asset": "CGLD",
        "cutoffs": [
          {
            "cutoff": "2026-10-04T19:45:18.143378+00:00",
            "rows_captured_before": 418,
            "rows_observed_before": 418,
            "rows_live_recorded_before": 23
          }
        ],
        "gap_count": 14,
        "last_hour": "2026-10-04T18:00:00+00:00",
        "clock_rule": "usable_at = observed_at + 1 hour (exchange candle is public at hour close and not revised); live_recorded is an extra check that we captured it within 3h",
        "first_hour": "2026-09-16T19:00:00+00:00",
        "worst_gaps": [
          {
            "after": "2026-09-18T06:00:00+00:00",
            "before": "2026-09-18T08:00:00+00:00",
            "missing_hours": 1
          },
          {
            "after": "2026-09-18T17:00:00+00:00",
            "before": "2026-09-18T19:00:00+00:00",
            "missing_hours": 1
          },
          {
            "after": "2026-09-19T06:00:00+00:00",
            "before": "2026-09-19T08:00:00+00:00",
            "missing_hours": 1
          },
          {
            "after": "2026-09-21T18:00:00+00:00",
            "before": "2026-09-21T20:00:00+00:00",
            "missing_hours": 1
          },
          {
            "after": "2026-09-22T08:00:00+00:00",
            "before": "2026-09-22T10:00:00+00:00",
            "missing_hours": 1
          }
        ],
        "missing_hours": 14,
        "expected_hours": 432,
        "backfilled_rows": 395,
        "duplicate_hours": 0,
        "longest_gap_hours": 1,
        "impossible_candles": 0,
        "live_recorded_rows": 23,
        "live_recorded_since": "2026-09-29T18:00:00+00:00",
        "training_eligible": true
      },
      {
        "feed": "coinbase-eth-usd-1h",
        "rows": 41694,
        "asset": "ETH",
        "cutoffs": [
          {
            "cutoff": "2026-10-04T19:45:18.143378+00:00",
            "rows_captured_before": 41694,
            "rows_observed_before": 41694,
            "rows_live_recorded_before": 239
          }
        ],
        "gap_count": 3,
        "last_hour": "2026-10-04T18:00:00+00:00",
        "clock_rule": "usable_at = observed_at + 1 hour (exchange candle is public at hour close and not revised); live_recorded is an extra check that we captured it within 3h",
        "first_hour": "2022-01-01T00:00:00+00:00",
        "worst_gaps": [
          {
            "after": "2025-10-25T15:00:00+00:00",
            "before": "2025-10-25T21:00:00+00:00",
            "missing_hours": 5
          },
          {
            "after": "2026-05-08T01:00:00+00:00",
            "before": "2026-05-08T07:00:00+00:00",
            "missing_hours": 5
          },
          {
            "after": "2023-03-04T17:00:00+00:00",
            "before": "2023-03-04T21:00:00+00:00",
            "missing_hours": 3
          }
        ],
        "missing_hours": 13,
        "expected_hours": 41707,
        "backfilled_rows": 41455,
        "duplicate_hours": 0,
        "longest_gap_hours": 5,
        "impossible_candles": 0,
        "live_recorded_rows": 239,
        "live_recorded_since": "2026-09-22T06:00:00+00:00",
        "training_eligible": true
      },
      {
        "feed": "coinbase-sol-usd-1h",
        "rows": 418,
        "asset": "SOL",
        "cutoffs": [
          {
            "cutoff": "2026-10-04T19:45:18.143378+00:00",
            "rows_captured_before": 418,
            "rows_observed_before": 418,
            "rows_live_recorded_before": 108
          }
        ],
        "gap_count": 0,
        "last_hour": "2026-10-04T18:00:00+00:00",
        "clock_rule": "usable_at = observed_at + 1 hour (exchange candle is public at hour close and not revised); live_recorded is an extra check that we captured it within 3h",
        "first_hour": "2026-09-17T09:00:00+00:00",
        "worst_gaps": [],
        "missing_hours": 0,
        "expected_hours": 418,
        "backfilled_rows": 310,
        "duplicate_hours": 0,
        "longest_gap_hours": 0,
        "impossible_candles": 0,
        "live_recorded_rows": 108,
        "live_recorded_since": "2026-09-29T18:00:00+00:00",
        "training_eligible": true
      }
    ],
    "generated_at": "2026-10-04T19:45:18.143378+00:00"
  },
  "forecast_skill": {
    "rows": [
      {
        "mae": 700.6029,
        "feed": "coinbase-btc-usd-1h",
        "year": 2022,
        "method": "crypto-replay/meanrev-7d-v1",
        "scored": 8568,
        "skill_vs_persistence": -0.0505
      },
      {
        "mae": 467.3514,
        "feed": "coinbase-btc-usd-1h",
        "year": 2023,
        "method": "crypto-replay/meanrev-7d-v1",
        "scored": 8751,
        "skill_vs_persistence": -0.0729
      },
      {
        "mae": 1364.173,
        "feed": "coinbase-btc-usd-1h",
        "year": 2024,
        "method": "crypto-replay/meanrev-7d-v1",
        "scored": 8784,
        "skill_vs_persistence": -0.0563
      },
      {
        "mae": 1641.2562,
        "feed": "coinbase-btc-usd-1h",
        "year": 2025,
        "method": "crypto-replay/meanrev-7d-v1",
        "scored": 8745,
        "skill_vs_persistence": -0.0358
      },
      {
        "mae": 1229.5408,
        "feed": "coinbase-btc-usd-1h",
        "year": 2026,
        "method": "crypto-replay/meanrev-7d-v1",
        "scored": 6605,
        "skill_vs_persistence": -0.0415
      },
      {
        "mae": 1002.467,
        "feed": "coinbase-btc-usd-1h",
        "year": 2022,
        "method": "crypto-replay/momentum-24h-v1",
        "scored": 8568,
        "skill_vs_persistence": -0.5031
      },
      {
        "mae": 665.9851,
        "feed": "coinbase-btc-usd-1h",
        "year": 2023,
        "method": "crypto-replay/momentum-24h-v1",
        "scored": 8751,
        "skill_vs_persistence": -0.5289
      },
      {
        "mae": 1932.016,
        "feed": "coinbase-btc-usd-1h",
        "year": 2024,
        "method": "crypto-replay/momentum-24h-v1",
        "scored": 8784,
        "skill_vs_persistence": -0.4959
      },
      {
        "mae": 2365.2,
        "feed": "coinbase-btc-usd-1h",
        "year": 2025,
        "method": "crypto-replay/momentum-24h-v1",
        "scored": 8745,
        "skill_vs_persistence": -0.4927
      },
      {
        "mae": 1688.1859,
        "feed": "coinbase-btc-usd-1h",
        "year": 2026,
        "method": "crypto-replay/momentum-24h-v1",
        "scored": 6605,
        "skill_vs_persistence": -0.43
      },
      {
        "mae": 666.9202,
        "feed": "coinbase-btc-usd-1h",
        "year": 2022,
        "method": "crypto-replay/persistence-v1",
        "scored": 8568,
        "skill_vs_persistence": 0
      },
      {
        "mae": 435.6018,
        "feed": "coinbase-btc-usd-1h",
        "year": 2023,
        "method": "crypto-replay/persistence-v1",
        "scored": 8751,
        "skill_vs_persistence": 0
      },
      {
        "mae": 1291.5109,
        "feed": "coinbase-btc-usd-1h",
        "year": 2024,
        "method": "crypto-replay/persistence-v1",
        "scored": 8784,
        "skill_vs_persistence": 0
      },
      {
        "mae": 1584.5137,
        "feed": "coinbase-btc-usd-1h",
        "year": 2025,
        "method": "crypto-replay/persistence-v1",
        "scored": 8745,
        "skill_vs_persistence": 0
      },
      {
        "mae": 1180.5401,
        "feed": "coinbase-btc-usd-1h",
        "year": 2026,
        "method": "crypto-replay/persistence-v1",
        "scored": 6605,
        "skill_vs_persistence": 0
      },
      {
        "mae": 0.0045,
        "feed": "coinbase-cgld-usd-1h",
        "year": 2026,
        "method": "crypto-replay/meanrev-7d-v1",
        "scored": 242,
        "skill_vs_persistence": -0.0201
      },
      {
        "mae": 0.0061,
        "feed": "coinbase-cgld-usd-1h",
        "year": 2026,
        "method": "crypto-replay/momentum-24h-v1",
        "scored": 242,
        "skill_vs_persistence": -0.3822
      },
      {
        "mae": 0.0044,
        "feed": "coinbase-cgld-usd-1h",
        "year": 2026,
        "method": "crypto-replay/persistence-v1",
        "scored": 242,
        "skill_vs_persistence": 0
      },
      {
        "mae": 66.2005,
        "feed": "coinbase-eth-usd-1h",
        "year": 2022,
        "method": "crypto-replay/meanrev-7d-v1",
        "scored": 8568,
        "skill_vs_persistence": -0.0527
      },
      {
        "mae": 31.1357,
        "feed": "coinbase-eth-usd-1h",
        "year": 2023,
        "method": "crypto-replay/meanrev-7d-v1",
        "scored": 8751,
        "skill_vs_persistence": -0.0317
      },
      {
        "mae": 75.5052,
        "feed": "coinbase-eth-usd-1h",
        "year": 2024,
        "method": "crypto-replay/meanrev-7d-v1",
        "scored": 8784,
        "skill_vs_persistence": -0.0523
      },
      {
        "mae": 85.8753,
        "feed": "coinbase-eth-usd-1h",
        "year": 2025,
        "method": "crypto-replay/meanrev-7d-v1",
        "scored": 8745,
        "skill_vs_persistence": -0.0331
      },
      {
        "mae": 49.224,
        "feed": "coinbase-eth-usd-1h",
        "year": 2026,
        "method": "crypto-replay/meanrev-7d-v1",
        "scored": 6604,
        "skill_vs_persistence": -0.041
      },
      {
        "mae": 92.1041,
        "feed": "coinbase-eth-usd-1h",
        "year": 2022,
        "method": "crypto-replay/momentum-24h-v1",
        "scored": 8568,
        "skill_vs_persistence": -0.4646
      },
      {
        "mae": 46.9343,
        "feed": "coinbase-eth-usd-1h",
        "year": 2023,
        "method": "crypto-replay/momentum-24h-v1",
        "scored": 8751,
        "skill_vs_persistence": -0.5553
      },
      {
        "mae": 105.7008,
        "feed": "coinbase-eth-usd-1h",
        "year": 2024,
        "method": "crypto-replay/momentum-24h-v1",
        "scored": 8784,
        "skill_vs_persistence": -0.4731
      },
      {
        "mae": 123.2579,
        "feed": "coinbase-eth-usd-1h",
        "year": 2025,
        "method": "crypto-replay/momentum-24h-v1",
        "scored": 8745,
        "skill_vs_persistence": -0.4828
      },
      {
        "mae": 69.0222,
        "feed": "coinbase-eth-usd-1h",
        "year": 2026,
        "method": "crypto-replay/momentum-24h-v1",
        "scored": 6604,
        "skill_vs_persistence": -0.4597
      },
      {
        "mae": 62.8867,
        "feed": "coinbase-eth-usd-1h",
        "year": 2022,
        "method": "crypto-replay/persistence-v1",
        "scored": 8568,
        "skill_vs_persistence": 0
      },
      {
        "mae": 30.1779,
        "feed": "coinbase-eth-usd-1h",
        "year": 2023,
        "method": "crypto-replay/persistence-v1",
        "scored": 8751,
        "skill_vs_persistence": 0
      },
      {
        "mae": 71.753,
        "feed": "coinbase-eth-usd-1h",
        "year": 2024,
        "method": "crypto-replay/persistence-v1",
        "scored": 8784,
        "skill_vs_persistence": 0
      },
      {
        "mae": 83.1263,
        "feed": "coinbase-eth-usd-1h",
        "year": 2025,
        "method": "crypto-replay/persistence-v1",
        "scored": 8745,
        "skill_vs_persistence": 0
      },
      {
        "mae": 47.2849,
        "feed": "coinbase-eth-usd-1h",
        "year": 2026,
        "method": "crypto-replay/persistence-v1",
        "scored": 6604,
        "skill_vs_persistence": 0
      },
      {
        "mae": 2.4909,
        "feed": "coinbase-sol-usd-1h",
        "year": 2026,
        "method": "crypto-replay/meanrev-7d-v1",
        "scored": 370,
        "skill_vs_persistence": 0.0007
      },
      {
        "mae": 4.6487,
        "feed": "coinbase-sol-usd-1h",
        "year": 2026,
        "method": "crypto-replay/momentum-24h-v1",
        "scored": 370,
        "skill_vs_persistence": -0.8651
      },
      {
        "mae": 2.4925,
        "feed": "coinbase-sol-usd-1h",
        "year": 2026,
        "method": "crypto-replay/persistence-v1",
        "scored": 370,
        "skill_vs_persistence": 0
      }
    ],
    "rule": "skill = 1 - MAE/MAE_persistence; below 0 means worse than \"price stays the same\"",
    "baseline": "crypto-replay/persistence-v1",
    "generated_at": "2026-10-04T19:45:18.133864+00:00"
  },
  "training_status": "trainable",
  "usage": [
    "All hourly candles are usable for training and testing: an exchange candle is public the moment its hour closes and is not revised, so each row is usable at observed_at + 1 hour. Use rows_observed_before for any cutoff.",
    "live_recorded_rows is an extra check (we saw it ourselves within 3h), not a requirement for training.",
    "Split by time: train on hours before your cutoff, test on hours after; never shuffle across time.",
    "A method with skill_vs_persistence below 0 is worse than assuming the price stays the same — that is the benchmark to beat."
  ]
}