Impulse bypass does not skip the score gate

Compiled truth (2026-04-24): The README says “conviction ≥ 0.60 bypasses all scoring gates and fires immediately.” That is not true in the current code. Three gates must independently pass:

  1. Score-band gate (policy.py:80). abs(score − 50) < (min_score − 50) means any composite in the neutral band is SKIPPED regardless of impulse. With min_score: 65, band = (35, 65). Impulse bypass does NOT skip this. Hardened 2026-04-22 after chop-day losses (see project_losses_april16_chop). Scoring.py:866-870 has the comment: “The composite score must meet the real threshold on its own merit.”

  2. Fast-path score bonus (scoring.py:_maybe_apply_bear_fast_path_bonus, and the BULL twin). Safety valve that nudges composite across the band when impulse + flow agree. Gated on app.paper=True which is True only for the --paper simulator, NOT for IBKR-paper-account mode via ib_async. NOTE (corrected 2026-04-24 after Codex review): the fast_path.paper_only: true key in config.json is dead config - it is not read anywhere in src/. The only actual gate is the hard-coded if not getattr(app, "paper", False): return False at scoring.py:109 (BULL) and scoring.py:204 (BEAR). Flipping the config key alone would not change behavior. Most actual “paper trading” days run in IBKR-paper mode, so this bonus never fires in practice.

  3. Upper conviction cap (fast_path.bear.max_conviction: 0.80). Even if paper_only were off, conv ≥ 0.80 disqualifies the bonus - the “BEAR=1.00 reversal anti-signal” exclusion. Means the strongest impulse signals (hiro+strike_stack stacking at conv=0.91) cannot benefit from the bonus and will silently miss entries.

What impulse_bypass actually skips (all gated on bypass_persistence

  • matching bias): persistence gate, streak gate, confidence floor (lowered to LOW), flow-veto-in-reversal-with-REST-fallback. That’s it.

State:

  • README: wrong. Needs rewrite to match actual behavior.
  • Config: zero_dte.min_score: 65, fast_path.paper_only: true, fast_path.bear.max_conviction: 0.80.
  • Impact: miss rate unknown - would need to backtest “impulse bypass fired but score-band gate held” across 2026-04-22 → current and measure what we left on the table vs what the guardrail correctly prevented.

Open threads:

  • Rewrite README Architecture → Live Impulse Engine to reflect real bypass scope.
  • Decide: does IBKR-paper mode count as “paper” for fast-path purposes? Current answer is no, which makes the bonus a dead feature during dev.
  • Decide: is the 0.80 upper conv cap right? It was tuned against BEAR=1.00 climax reversals, but we’re now missing 0.80–0.95 confluence signals.

Timeline:

2026-04-24 | Live market at 8:55 CT - SPY 710.5 → 708.5 sell climax, then bounce. Impulse fired BEARISH conv=0.91 trigger=hiro+strike_stack on 46.1M call stack, price below VWAP, 5-bar LL/LH. Composite peaked at BEAR breakdown of −30 raw (PF=-9, VS=-8, PT=-11, SM=-2, DP=+3, Vol=+4) but normalized composite was 38. 38 ∈ (35, 65) → SKIPPED_SCORE. Fast-path bonus would have nudged 38→33 (crossing) but paper_only: true blocked it; upper conv cap 0.80 would have blocked it anyway. No alert fired. User asked “why aren’t you firing a signal” - this page is the answer. See writing/2026-04-24-bear-impulse-91-missed-at-open.md for the specific miss postmortem (to be written if we decide to replay it).