The default ORB grade (quality.py) pins catalyst RUNNERS at F/C: its two heaviest
components structurally break on a vertical spike -- STRUCTURE (30%) reads 0 (no
pullback to classify) and adv-RVOL (25%) reads 1.0x (NULL rolling-20d on fresh
reverse-split names). On the 2026-06-30 tape the source trader's winners (SVRE
+247%, JEM +348%, CELZ +472%) all graded C 0.565, indistinguishable from the bot's
F-grade chop. Two parallel, shadow-only artifacts fix this without touching the live
ORB path:
- strategy/evaluation/runner_quality.py::calculate_runner_quality -- a PARALLEL
grade that drops the two broken components and scores the traits that actually
separate runners from chop (gap saturating at +100% not +10%, price velocity,
own-name volume burst, above-VWAP, catalyst). Validated on the real tape:
CELZ/JEM/SVRE -> B/A, chop (SLS/RIVN/CCXI/BB/NVDX) -> F. quality.py untouched.
- strategy/evaluation/runner.py::detect_leading_gainer_runner -- catches the mover
detect_momentum_ignition is blind to (it requires blue-sky > prior ATH, so it
fires ZERO on beaten-down catalyst pops). Blue-sky deleted; gates = leading-gainer
run + verticality + own-name burst + holding session-cumulative VWAP; PM-inclusive;
tags (never gates) PM-exhaustion. Real-tape in-sample: 5/5 runners fire, 7/7 chop
silent, zero false-fires. Cumulative VWAP is a prefix function, so a precomputed
session_vwap makes a bar-by-bar slide O(n) not O(n^2) (identity verified exact).
- research/labeler.py -- build-runner/report-runner/validate-runner shadow track,
mirroring vwap_reclaim: emit a non-tradeable setup on each fresh fire, score with
the SAME _forward_labels. Pre-registered promotion bar LOCKED before forward data
(median fwd-max >= +15%, median adverse > -8%, +1R > 50%, beat vwap_reclaim,
PM-exhaustion tag must earn its keep). SHADOW-ONLY: never routes to approve_order,
never gates live until the bar clears out-of-sample. The honest open question the
track exists to answer: the detector confirms AT/AFTER the top for PM-driven names
(SVRE fires at +242% already run) -- does that late entry actually convert to +1R?
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>