# ICTSB01 — ICT Silver Bullet (10:00–11:00 New York), US100 CFD, Discovery — PRE-REGISTRATION

**Written by:** Claude (2026-10-20), on the owner's order for the Aydeus Lab public re-test. `EMPIRICAL RESEARCH CANDIDATE (NOT LAW / NOT DEPLOYED)`.
**Script:** `experiments/_ictsb01_silver_bullet_20261020.py` (modes `--precheck`, `--freeze`, `--run`). **Lock:** `prereg/ICTSB01_PREREG.lock` (sha256 of this file, of the script and of `hdam/hdam_sim.py`). The run refuses to start if any of the three changed.
**Stage:** Discovery only (`data_loader.load_true_clock("nas100usd", "discovery")`, 2005-01-02 .. 2020-12-31). Validation (2021-01 .. 2023-06) and holdout (2023-07 ..) stay sealed; opening them needs Kaloyan's own word.

## 0. Pre-checks (answered before any outcome was computed; receipt `experiments/_ictsb01_precheck_20261020.out`)

* **Graveyard.**
  * `ICT_SILVER_BULLET_NQ_10_11AM` (Antigravity, 2026-10-18, STRATEGY_STATUS §3): KILLED, n 1,014, net −0.008R, t −0.17, script `experiments/_test_ict_silver_bullet_clinical.py`, never audited. Defects that justify the re-test: fixed 3-pt gap and 5–100 pt risk filters on an index that went from ~1,500 to ~13,000 in this sample; the first FVG of either direction with no draw-on-liquidity bias; a limit filled at the far gap edge on any touch; mid prices and a flat 1.5 pt cost; data file `nsxusd_m1_est` whose clock was not re-checked.
  * `F1` (CANDIDATES.md, 2026-09-25): ICT sweep → displacement → ATR-FVG + H1 gate on MNQ 1m, Feb–Dec 2025, 2 trades: K2 FAIL (a five-filter stack produced no signal; nothing was learned about the setup). The record calls the ICT family closed; re-tests of killed families are allowed (owner, 2026-10-11).
  * Related, different mechanics: R003 IFVG proxy fade (KILLED t −4.97), PILLAR2_NY_SWEEP01 sweep fade with FVG/MSS (KILLED, CME t −1.74), APJ IFVG sweep scripts (Antigravity), external SMC/FVG mass study (INFO, not ours).
  * Structural difference of ICTSB01: the plain public setup, all sizes in ATR, the draw on liquidity fixed before the window, a limit filled only on a trade-through, bid/ask execution on the true clock, 16 years.
* **Cost wall (K4).** Median cost per trade at the planned stop, 1,500 primary orders (M5): **hdam ex-ante (file spread + 2 × 0.5 pt) 0.223R**; declared execution worst case (spread + one 0.5 pt slip on a stop exit) 0.130R; lab model (1.70 pt round trip × price / 29,794.05) **0.029R** (52% of orders ≤ 0.030R). M1 version: 0.476R / 0.280R / 0.061R. The planned stop is small: median 1R = 1.13–1.37 × ATR14(M5), 3.0 pt in 2005 to 31.2 pt in 2020. **K4 is FAILED before the run under the template's measure (hdam `cost_r_ex_ante`).** By the HDAM template a hypothesis at the cost wall is not run for deployment; it is run here only because the purpose is a public test of a widely sold claim, and the run's job is to measure whether there is any gross edge to pay costs from. The verdict cannot be better than KILLED at K4.
  * The file has bid = ask before 2012-03 (spread 0.00 in 2005–2011). In those years the hdam list carries only the 0.5 pt slippage; the GROSS (mid, zero cost) and lab-model lines are reported next to it.
* **Clock.** `nas100usd` in `lab_utc.TZ_MAP` (Chicago-stamped, end of minute), converted by the loader to UTC start of minute. All session times below are America/New_York.
* **Staleness.** Flat-minute share 10:00–10:59 NY per year: max 0.067 (2005), ≤ 0.033 from 2006 (limit 10%): PASS.
* **Power.** Hoped-for edge +0.10R/trade, SD ≈ 1.4R (targets at liquidity pools, often > 2R): t = 2 needs ~780 trades, t = 3.43 needs ~2,300. Discovery has 1,500 orders on 4,136 eligible days (36.3%); fills are expected at roughly 60–75% of orders, i.e. ~900–1,100 trades. An edge of +0.10R would show t ≈ 2.2–2.5 here and could not reach K1; the claim sold for the setup (75–80% win rate at 1:2, i.e. about +1.25R a trade) would show t > 25. The test can therefore reject the claim, but cannot certify a small edge.
* **Overlap with the production strategy.** Computed only if K1–K6 pass: daily-R correlation limit 0.20.

## 1. Rule (one primary rule, zero free parameters after this freeze)

Session day = 18:00 ET → 17:00 ET. All pattern levels on mid prices ((bid + ask) / 2).

1. **Liquidity pools** known at 10:00: PDH / PDL = high / low of the previous session day; ONH / ONL = high / low of the current session day before 09:30. A pool is *taken* when a mid high exceeds it (a mid low goes below it) after it formed, using minutes before 10:00 only.
2. **Draw on liquidity (DOL).** P0 = mid close of the last minute before 10:00. The DOL is the untaken pool nearest to P0 (above: PDH / ONH; below: PDL / ONL). No untaken pool = no trade. Trade direction = towards the DOL; the DOL level is the target.
3. **Fair-value gap.** M5 mid bars (5-minute buckets of the true-clock minutes). Three consecutive bars c1, c2, c3 inside 10:00–11:00 (c1 opens at or after 10:00). Bullish FVG: low(c3) − high(c1) ≥ 0.10 × ATR14; bearish: low(c1) − high(c3) ≥ 0.10 × ATR14. ATR14 = mean true range of the 14 M5 bars before c1. Only FVGs in the DOL's direction count.
4. **Order.** Limit at the FVG's near edge (long low(c3), short high(c3)), live from the close of c3 to the last minute before 11:00. Stop beyond the FVG's first candle: long low(c1), short high(c1). 1R = |limit − stop|.
5. **Qualification.** Room to the DOL ≥ 1R (signed, from the limit); 1R ≤ 5 × ATR14 (data-error guard); the DOL must not have been reached between 10:00 and the close of c3 (draw delivered = no trade that day). The first FVG that qualifies is the day's only order; one trade a day at most.
6. **Cancel** before the fill when the target is reached (long: bid high ≥ target).
7. **Exit:** target, stop, or flat at the open of the 16:00 minute.

## 2. Execution (G9, pessimistic)

`hdam/hdam_sim.py` unchanged (sha256 `d0752e2305fe92303f9941ca0c811a3cb2bd51791702ff9fde8e5ab70c203fa9`); the script imports its `_manage`, `_flat`, `_row` helpers and adds the limit entry, which hdam does not have:

* **Limit entry:** a long fills only when the ask low is ≤ limit − 0.25 pt (trade-through; file tick 0.1), at the limit: no price improvement, no slippage (G9). Shorts on the bid. When the fill minute opens at or through the limit, the whole minute is after the fill (stop, then target, checked); otherwise the stop is checked in the fill minute (price passes the limit before the stop) and the target is not credited.
* **Target** = a limit: needs a 0.25 pt trade-through, filled at the target, no slippage. Stop first when stop and target fall in one minute.
* **Stop / flat:** long stop on the bid, fill min(bid open, stop) − 0.5 pt (gap through the stop fills at the open); flat at the bid open − 0.5 pt; shorts on the ask. Real file spread in every fill.
* **R** = (exit − entry) × side / 1R, net (hdam `_row`). Cost multiples: R − (m − 1) × cost_r, cost_r = (½ spread in + ½ spread out + 2 × 0.5 pt) / 1R.
* Decision on this list. Also printed: GROSS (the same fill rules on mid prices, zero spread, zero slip), NET at the lab model (GROSS − 1.70 pt × price / 29,794.05 per trade), NAIVE (mid, touch fills, stop first from the fill minute, no cost: what a simple backtest shows).
* Auction embargo (09:30–09:31): 0 entries by construction (orders live from 10:15 at the earliest). 10:00 ET news releases fall before the earliest entry.

## 3. Reported with the primary (declared now; none of them can be selected or rescue the primary)

* n, mean R, t at 1×, 2×, 3× cost; win rate; exits; by year; positive years; halves (split at the median trade date); calendar regimes 2008, 2011, 2015–16, 2020 (2022 and 2023–26 lie outside Discovery).
* **Diagnostics:** D1 no draw filter (first qualifying FVG of either direction, target = nearest untaken pool on its side); D2 sweep-reversal draw (exactly one side swept before 10:00 → draw on the other side); D3 the same rules on M1 bars (ATR14 on M1); D4 fixed 2R target in the DOL direction (no room check); D5 limit at the FVG midpoint (consequent encroachment). Always-long / always-short (same engine, nearest pool on that side) as the drift reference.
* **Placebo (G2):** per day a coin flip picks the direction; same engine, same target rule on that side; 200 seeds; share of seeds whose mean R ≥ the primary's.
* **Bar phase −3..+3 min (G10 / rule 9):** the whole rule with the clock shifted by k minutes.

## 4. Kill gates (Discovery; FAIL ANYWHERE = FAIL)

K1 net t ≥ 3.43 · K2 both halves positive · K3 2× cost t ≥ 1.0 · K4 median hdam ex-ante cost ≤ 0.030R (**already FAIL at the precheck, 0.223R**) · K5 phases −3..+3 all the same sign as phase 0, phase 0 positive, min t ≥ 0.5 × t₀ · K6 placebo share < 0.01 · K7 n/a (the draw picks a side; it is not a keep/drop filter; K6 tests it) · K8 overlap only if K1–K6 pass.
If every K passes: label `UNVERIFIED CANDIDATE — GATES PENDING` (G9 bridge, G11, G12 still to run). Otherwise KILLED in Discovery; nothing else is opened.

## 5. Freeze

`--freeze` writes the lock and one ledger event (`prop_gpu_miner/out/ledger.sqlite`, run_id `ICTSB01`, n = 1 primary rule; 5 diagnostics + placebo declared, not selectable). Then `--run` once.
