{
 "generated_at_utc": "2026-11-07T20:20:54Z",
 "hypotheses_registered": 15,
 "preregistration_events": 4423,
 "research_events_total": 4427,
 "markets": 657,
 "snapshots": 11290,
 "frozen_strategy_versions": 15,
 "paper_fills": 168,
 "forward_versions_total": 22,
 "forward_versions_active": 1,
 "forward_events_total": 580,
 "active_forward_versions": [
  {
   "version_id": "FSV-20261103-F1_trend_continuation_40_180_30d_v1-3f978114",
   "frozen_at_utc": "2026-11-03T21:51:25Z",
   "forward_start_utc": "2026-11-03T21:51:25Z",
   "symbols": 84,
   "forward_events": 0,
   "days_live": 3
  }
 ],
 "experiments": 991,
 "nights": 17,
 "validations": 68,
 "validations_qualified": 32,
 "validations_research_candidate": 36,
 "freezes": 53,
 "last_night": "20261107",
 "decisions": [
  {
   "decision": "DISCARD",
   "n": 458,
   "label": "discarded — did not beat the gate"
  },
  {
   "decision": "DUPLICATE",
   "n": 437,
   "label": "duplicate — already measured, no new evidence"
  },
  {
   "decision": "KEEP",
   "n": 64,
   "label": "kept — beat the incumbent's gate"
  },
  {
   "decision": "BASELINE",
   "n": 17,
   "label": "baseline — reference run, not a hypothesis"
  },
  {
   "decision": "INVALID",
   "n": 14,
   "label": "invalid — could not be evaluated"
  },
  {
   "decision": "INCONCLUSIVE",
   "n": 1,
   "label": "inconclusive — not decidable at this sample size"
  }
 ],
 "integrity": {
  "chain_ok": true,
  "first_bad_experiment": null,
  "signed_zero_legacy_rows": 3
 },
 "families": [
  {
   "h": "Breakouts in contracting volatility persist longer.",
   "n": 30,
   "qualified": 0,
   "rejected": 0,
   "share": 3.1,
   "falsification": "Expectancy does not improve over the parent."
  },
  {
   "h": "Breakouts are better when not already overbought.",
   "n": 26,
   "qualified": 2,
   "rejected": 2,
   "share": 2.7,
   "falsification": "Fewer trades with no expectancy improvement."
  },
  {
   "h": "Keine Einstiege in Volumen-Ausreisser.",
   "n": 25,
   "qualified": 1,
   "rejected": 1,
   "share": 2.6,
   "falsification": "Die Volumenspitze markiert den Beginn der Bewegung, der Filter entfernt die Gewinner."
  },
  {
   "h": "Breakouts that close near the bar high continue.",
   "n": 23,
   "qualified": 0,
   "rejected": 0,
   "share": 2.3,
   "falsification": "No improvement in expectancy or halves."
  },
  {
   "h": "A shorter hold captures the fast part of the move.",
   "n": 22,
   "qualified": 0,
   "rejected": 0,
   "share": 2.2,
   "falsification": "Expectancy falls because costs are paid more often per unit of move."
  },
  {
   "h": "Keine Einstiege in Explosionskerzen.",
   "n": 21,
   "qualified": 0,
   "rejected": 0,
   "share": 2.1,
   "falsification": "Gerade die grossen Kerzen setzen sich fort; der Filter schneidet die beste Haelfte."
  },
  {
   "h": "Nur nach einem Aufwaertstag einsteigen.",
   "n": 20,
   "qualified": 0,
   "rejected": 0,
   "share": 2.0,
   "falsification": "Der Vortag ist irrelevant und der Filter kostet nur Trades."
  },
  {
   "h": "Keine Einstiege nach einem Gap nach unten.",
   "n": 18,
   "qualified": 1,
   "rejected": 1,
   "share": 1.8,
   "falsification": "Gaps nach unten werden systematisch aufgekauft, der Filter kostet die Erholung."
  },
  {
   "h": "A wider stop survives noise without changing the thesis.",
   "n": 17,
   "qualified": 3,
   "rejected": 4,
   "share": 1.7,
   "falsification": "Expectancy falls and drawdown rises."
  },
  {
   "h": "Nur bis 10 % unter dem 20-Tage-Hoch handeln.",
   "n": 17,
   "qualified": 2,
   "rejected": 0,
   "share": 1.7,
   "falsification": "Tiefe Ruecklaeufe liefern die besseren Einstiege, der Filter kostet Rendite."
  },
  {
   "h": "A new 20-day high on a liquid EUR pair continues for up to ten days.",
   "n": 17,
   "qualified": 0,
   "rejected": 0,
   "share": 1.7,
   "falsification": "Net expectancy after 80 bps taker fees is <= 0 on the training slice."
  },
  {
   "h": "Taking profit at 15% improves risk-adjusted return.",
   "n": 12,
   "qualified": 0,
   "rejected": 0,
   "share": 1.2,
   "falsification": "Expectancy falls because winners are cut."
  },
  {
   "h": "A tighter stop improves risk-adjusted return.",
   "n": 11,
   "qualified": 0,
   "rejected": 2,
   "share": 1.1,
   "falsification": "Stopped-out trades destroy more expectancy than they save."
  },
  {
   "h": "Only take breakouts above the long-term mean.",
   "n": 11,
   "qualified": 0,
   "rejected": 2,
   "share": 1.1,
   "falsification": "The filter removes the profitable half of the sample."
  },
  {
   "h": "A longer hold lets the trend develop.",
   "n": 9,
   "qualified": 2,
   "rejected": 1,
   "share": 0.9,
   "falsification": "Drawdown rises faster than expectancy."
  },
  {
   "h": "BTC-Schritt wird von einem zurückgebliebenen Alt in zehn Tagen teilweise nachgeholt.",
   "n": 2,
   "qualified": 0,
   "rejected": 0,
   "share": 0.2,
   "falsification": "Netto-Alpha gegenüber der Basisrate <= 0 bei t >= 2 über getrennte Teilperioden"
  },
  {
   "h": "Does vol_ratio carry information the incumbent ignores? Entry only when vol_ratio is in its upper decile and a 20-bar breakout confirms.",
   "n": 2,
   "qualified": 0,
   "rejected": 0,
   "share": 0.2,
   "falsification": ""
  },
  {
   "h": "Fuenf-Tage-Momentum muss positiv sein.",
   "n": 2,
   "qualified": 0,
   "rejected": 0,
   "share": 0.2,
   "falsification": "Das Momentum ist bereits im Ausbruch enthalten; der Filter ist doppelt gezaehlt."
  },
  {
   "h": "20-bar breakouts confirmed by abnormal volume (vol_z(60) > 1) have higher per-trade follow-through than unconfirmed breakouts, so adding this one filter to the incumbent entry raises the cost-adjusted score above 3857.",
   "n": 1,
   "qualified": 1,
   "rejected": 0,
   "share": 0.1,
   "falsification": "A backtest with >= 8 trades scoring below the incumbent (score < 3857, or expectancy < 124.18 EUR, or sharpe < 0.84), or showing per-trade expectancy of confirmed breakouts no higher than the unfiltered baseline, proves volume confirmation adds no edge after 80 bps per leg."
  },
  {
   "h": "20-bar-high breakouts confirmed by above-average volume (vol_z(30) > 1.0) deliver higher per-trade expectancy than unconfirmed breakouts.",
   "n": 1,
   "qualified": 1,
   "rejected": 0,
   "share": 0.1,
   "falsification": "A score below the incumbent (9891.6) or per-trade expectancy below 367 EUR on at least 8 trades proves volume confirmation adds no edge here."
  },
  {
   "h": "20-day breakouts confirmed by a volume surge (vol_z(10) > 1) have higher per-trade expectancy than unconfirmed breakouts.",
   "n": 1,
   "qualified": 1,
   "rejected": 0,
   "share": 0.1,
   "falsification": "A backtest with cost-stress expectancy at or below the incumbent's 123.08 EUR, or fewer than 8 trades, disproves volume confirmation as an edge."
  },
  {
   "h": "Buying 10-bar instead of 20-bar high breakouts, with the same trend and close-quality filters, increases trade frequency enough to raise total score above the incumbent without collapsing per-trade expectancy.",
   "n": 1,
   "qualified": 1,
   "rejected": 0,
   "share": 0.1,
   "falsification": "Score below the incumbent's 14864 (expectancy or sharpe falling faster than the extra trades compensate), or per-trade expectancy dropping toward the 80 bps round-trip cost level, or fewer than 8 trades."
  },
  {
   "h": "Buying 30-bar breakouts only when price sits in the top decile of the 60-bar range (donchian_pos(60) >= 0.9) yields higher per-trade expectancy than the incumbent's volume filter, because breakouts below a two-month peak fail on overhead supply.",
   "n": 1,
   "qualified": 1,
   "rejected": 0,
   "share": 0.1,
   "falsification": "Score, expectancy (incumbent: 550.25 EUR/trade) or Sharpe (0.427) below the incumbent, or fewer than 8 trades, proves the overhead-resistance mechanism adds nothing over volume confirmation."
  },
  {
   "h": "Capping winners at +20% with a take-profit raises the incumbent's score because post-breakout gains beyond 20% within the 20-bar hold are largely surrendered before the time exit.",
   "n": 1,
   "qualified": 1,
   "rejected": 0,
   "share": 0.1,
   "falsification": "Score at or below the incumbent's 9891.6 (i.e., expectancy_eur falls under 367 with n still ~895) proves the uncapped right tail, not give-back, carries the edge."
  },
  {
   "h": "Crypto breakout momentum persists beyond 10 bars, so extending the time exit to 20 bars lets winners run and raises per-trade expectancy above the incumbent.",
   "n": 1,
   "qualified": 1,
   "rejected": 0,
   "share": 0.1,
   "falsification": "Score or expectancy below the incumbent (score 5327, expectancy 173.43 EUR) on a comparable trade count, proving momentum decays within 10 bars."
  },
  {
   "h": "Entering when the close sits in the top 5% of the prior 20-bar range (donchian_pos(20) >= 0.95), rather than only after a fresh 20-bar high, improves after-cost expectancy by buying breakouts earlier at better prices.",
   "n": 1,
   "qualified": 1,
   "rejected": 0,
   "share": 0.1,
   "falsification": "After-cost expectancy per trade below the incumbent's 123 EUR (or <= 0) on at least 8 trades, proving the added near-high entries lose more than the 160 bps round-trip costs."
  },
  {
   "h": "Narrowing the stop from 4x to 3x ATR raises cost-stressed expectancy because eventual winners rarely draw down 3x ATR within 30 bars, while the trades stopped between 3x and 4x are dominated by tail losers.",
   "n": 1,
   "qualified": 1,
   "rejected": 0,
   "share": 0.1,
   "falsification": "Expectancy or Sharpe below the incumbent (930.7 EUR / 0.725) with n_trades >= 8, meaning the 3x stop is knocking out eventual winners and the wide stop is protective."
  },
  {
   "h": "Relaxing close_loc(1) from >0.6 to >0.5 admits midpoint-closing breakout bars that remain profitable after costs and raises total score via higher trade count.",
   "n": 1,
   "qualified": 1,
   "rejected": 0,
   "share": 0.1,
   "falsification": "Score below the incumbent's 16181 (or expectancy below 666.74 EUR) on at least 8 trades proves the added mid-close entries are net losers after costs."
  },
  {
   "h": "Relaxing the drawdown gate from -0.1 to -0.15 adds profitable high-volatility continuation entries the incumbent currently excludes.",
   "n": 1,
   "qualified": 1,
   "rejected": 0,
   "share": 0.1,
   "falsification": "Score or expectancy below the incumbent (24661 / 930.68 EUR), or fewer than 8 trades, proves the excluded deep-pullback entries were losers and the tighter gate was load-bearing."
  },
  {
   "h": "Relaxing the volume-confirmation clause on the breakout entry from vol_z(30)>1 to vol_z(30)>0.5 retains most of the +12% per-trade expectancy gain while recovering enough trades (~750-800) to beat the incumbent score.",
   "n": 1,
   "qualified": 1,
   "rejected": 0,
   "share": 0.1,
   "falsification": "Falsified if score <= 9891.6: either n_trades < 750 (relaxation recovered no volume-confirmed trades) or expectancy <= 392 EUR (quality gain washed out), proving the dose-response between z=0.5 and z=1 is flat or negative."
  },
  {
   "h": "Replacing the inert gap_pct filter with a positive 20-bar drift requirement (ret(20) > 0) raises total expectancy by removing range-top entries inside 20-bar downtrends while preserving the profitable pullback band.",
   "n": 1,
   "qualified": 1,
   "rejected": 0,
   "share": 0.1,
   "falsification": "The hypothesis is wrong if expectancy_eur x n_trades falls below the incumbent's ~897k EUR, or if n_trades collapses below ~700 without a proportional per-trade gain."
  },
  {
   "h": "Replacing the near-inert dd_from_high(20) > -0.1 clause with a volatility-expansion filter (vol_ratio(20) > 1, i.e. 5-bar realized vol above its 20-bar baseline) raises net expectancy, because expansion-confirmed breakouts follow through while contraction breakouts mean-revert after costs.",
   "n": 1,
   "qualified": 1,
   "rejected": 0,
   "share": 0.1,
   "falsification": "Fewer than 8 trades, or cost-stress expectancy at/below the incumbent's 666.74 EUR (score at/below 16181), proves expansion confirmation adds no edge over the incumbent; a trade count collapse below ~100 shows the filter is mis-calibrated rather than informative."
  },
  {
   "h": "Replacing the redundant 20-bar drawdown filter with a long-horizon trend filter (close at least 2% above its 50-bar SMA) improves expectancy because 10-day breakouts occurring inside established long-term uptrends persist more reliably than breakouts in flat contexts.",
   "n": 1,
   "qualified": 1,
   "rejected": 0,
   "share": 0.1,
   "falsification": "A backtest of this candidate scoring below the incumbent (score < 16181 or expectancy < 666.7 EUR) or producing fewer than 8 trades proves the long-horizon trend filter is worse than the redundant drawdown clause."
  },
  {
   "h": "Requiring 5-bar momentum (ret5 > 2%) alongside the 20-bar breakout raises cost-stressed expectancy above the incumbent's 123.41 EUR, because breakouts without recent momentum are exhaustion fades.",
   "n": 1,
   "qualified": 1,
   "rejected": 0,
   "share": 0.1,
   "falsification": "A backtest with at least 8 trades showing cost-stress expectancy <= 123.41 EUR or negative expectancy disproves it."
  },
  {
   "h": "Requiring breakout_dist(10) > 0.01 — a close at least 1% above the prior 10-day high — removes marginal noise-breakouts whose follow-through is smaller than the round-trip cost, raising per-trade expectancy.",
   "n": 1,
   "qualified": 1,
   "rejected": 0,
   "share": 0.1,
   "falsification": "A score or expectancy below the incumbent (16181 / 666.7 EUR), or fewer than 8 trades, proves the displacement buffer destroys edge rather than improving it."
  },
  {
   "h": "The ema_gap(50)-filtered breakout entry (exp-0007: score 593.9, expectancy 132.9, Sharpe 0.87, maxDD 9.44%) failed only the same-capital drawdown gate (45.2%); scaling position_fraction 0.25 to 0.175 projects that gate metric to ~31.6% (<35%) while keeping score (~416 if size-linear) above the incumbent's 320.76.",
   "n": 1,
   "qualified": 1,
   "rejected": 0,
   "share": 0.1,
   "falsification": "Same-capital drawdown at 0.175 still exceeds 35% (sizing nonlinearity), or score falls below the incumbent's 320.76, or per-trade edge drops below the incumbent's 125.08 EUR, or n_trades < 8."
  },
  {
   "h": "Volume-confirmed 20-day breakouts with price above the 50-EMA carry higher 10-bar forward expectancy than those below it, so adding ema_gap(50) > 0 improves net expectancy after costs.",
   "n": 1,
   "qualified": 1,
   "rejected": 0,
   "share": 0.1,
   "falsification": "Cost-stressed expectancy or score at or below the incumbent (160.55 EUR / 4058.9), or fewer than 8 trades, proves the trend filter adds nothing."
  },
  {
   "h": "Widening the stop from 2.5x to 3.0x ATR raises same-capital score because post-breakout retests pierce a 2.5xATR stop and forfeit the continuation drift.",
   "n": 1,
   "qualified": 1,
   "rejected": 0,
   "share": 0.1,
   "falsification": "A score at or below the incumbent 3308.95, same-capital drawdown above 35%, or fewer than 8 trades proves the retest-survival mechanism wrong."
  },
  {
   "h": "Widening the stop from 2x to 4x ATR raises net per-trade expectancy because breakout entries carry elevated ATR and normal post-breakout pullbacks exceed 2xATR, stopping out eventual winners.",
   "n": 1,
   "qualified": 1,
   "rejected": 0,
   "share": 0.1,
   "falsification": "Net expectancy_eur <= 123.41 (incumbent) or sharpe < 0.84 on >= 8 trades; then the 2xATR stop is not truncating winners and this exit mechanism is dead."
  },
  {
   "h": "10-bar breakouts occurring during volatility contraction (short-horizon return std below its 20-bar baseline) yield higher expectancy than breakouts without contraction.",
   "n": 1,
   "qualified": 0,
   "rejected": 0,
   "share": 0.1,
   "falsification": "Score or expectancy_eur falls below the incumbent (12115 / 499 EUR) when the vol_ratio(20) < 1 clause is added, or trade count collapses with no per-trade improvement, proving contraction adds no selection value."
  }
 ],
 "recent_nights": [
  {
   "night": "20261107",
   "status": "OK",
   "n_experiments": 8,
   "n_kept": 0,
   "n_frozen": 0
  },
  {
   "night": "20261106",
   "status": "OK",
   "n_experiments": 12,
   "n_kept": 0,
   "n_frozen": 0
  },
  {
   "night": "20261105",
   "status": "OK",
   "n_experiments": 10,
   "n_kept": 0,
   "n_frozen": 0
  },
  {
   "night": "20261104",
   "status": "OK",
   "n_experiments": 68,
   "n_kept": 4,
   "n_frozen": 0
  },
  {
   "night": "20261103",
   "status": "OK",
   "n_experiments": 68,
   "n_kept": 4,
   "n_frozen": 0
  },
  {
   "night": "20261102",
   "status": "CHAIN_BROKEN",
   "n_experiments": 13,
   "n_kept": 0,
   "n_frozen": 0
  },
  {
   "night": "20261101",
   "status": "CHAIN_BROKEN",
   "n_experiments": 36,
   "n_kept": 1,
   "n_frozen": 0
  },
  {
   "night": "20261031",
   "status": "OK",
   "n_experiments": 0,
   "n_kept": 0,
   "n_frozen": 0
  },
  {
   "night": "20261030",
   "status": "OK",
   "n_experiments": 22,
   "n_kept": 1,
   "n_frozen": 0
  },
  {
   "night": "20261029",
   "status": "OK",
   "n_experiments": 50,
   "n_kept": 7,
   "n_frozen": 0
  },
  {
   "night": "20261028",
   "status": "OK",
   "n_experiments": 93,
   "n_kept": 8,
   "n_frozen": 2
  },
  {
   "night": "20261027",
   "status": "OK",
   "n_experiments": 8,
   "n_kept": 0,
   "n_frozen": 0
  },
  {
   "night": "20261026",
   "status": "OK",
   "n_experiments": 0,
   "n_kept": 0,
   "n_frozen": 0
  },
  {
   "night": "20261025",
   "status": "OK",
   "n_experiments": 25,
   "n_kept": 1,
   "n_frozen": 0
  }
 ],
 "families_total": 712
}