Hypotheses · story · H-070b2026
Rival: held-up PU lift comes from a switch of race code since the pull-up
forward A/E 0.0 on 0 bets, SP ROI None%, BSP ROI None% (p None)
Part of the thread “H36: pulled up after being held up” 60 hypotheses
- Proposed
- Designed
- Discovery
- Promising
- Falsification
- Frozen
- Vault
- Provisional
- Shadow
- Validated
- Live
- Source
- Investigator agent, v1
- Made by
- rival-explanation
- Created
- 17 Oct, 01:54
- Tests logged
- 16
Reasoning
Why this hypothesis exists: what the lab saw, the question it asked, the mechanism it proposed, what it predicted, and the result that would prove it wrong. Written before the test was run.
- Observed
- H-bd36b503 (Rival: held-up pull-ups moving onto softer ground show the same lift) was predicted positive but came out the other way: A/E 0.92 on 149 bets (p 0.511 for the opposite direction). O-00e05ce8
- H-658c845a (Sharpen: held-up pull-up in the mud, back on better ground) pointed the predicted way but failed the bar: A/E 1.05 on 377 bets (p 0.439), control 1.01. O-2975deac
- H-995c6f24 (Rival: held-up PU lift comes from a change of ground since the pull-up) passed discovery but was falsified: 2 of 5 attacks broke it. O-fcb8f2fd
- AskedWhich going transitions make up the roughly 400 changed-going held-up pull-ups that are neither mud-to-better nor better-to-softer, and do they include a change of surface or race code (jumps to Flat or AW)? answered
- MechanismAfter a pull-up, connections often switch a held-up horse to a code that suits it better (fences, or the Flat or AW in summer). A change of going group comes with that switch, especially onto AW or summer Flat ground. The pull-up told us nothing about the horse in the new code.
- Why the market misses itThe form line shows a P from a different discipline, and punters weigh it as if it were a failure in today's code.
- Predictedpositive, A/E 1.20 to 1.40 on 300+ bets, above the same-code complement
- Falsified if
Mechanism and rationale
After a pull-up, connections often switch a held-up horse to a code that suits it better (fences, or the Flat or AW in summer). A change of going group comes with that switch, especially onto AW or summer Flat ground. The pull-up told us nothing about the horse in the new code.
The rule
last_pulled_up = 1 AND last_run_style IN ('held_up', 'midfield') AND last_race_type IS NOT NULL AND race_type <> last_race_typeReads: last_pulled_up, last_run_style, last_race_type, race_type
Pre-registration
- Spec hash (sha256 of the canonical pre-spec)
- 06fbcfd369a25973cbc32ea84566210429c9c5a0bfd7d54e32bf12d0ceb38594
- Frozen
- 17 Oct, 01:59
- Nothing in the definition can change after this.
- Confounders
- Change of going group: a code switch often brings a ground change (onto AW or summer Flat ground). The same-going refinement and the same-code control are there to split the two.
- Long break between codes, e.g. a jumper resting before the Flat or AW. The 90-day refinement checks this.
- Seasonal mix: the thread shows a skew after 27 April 2026, so the result should be checked for both periods.
- Price band 16/1 or bigger: across this thread these runners sit below par and drag the result down.
- Trainer switching policy: a few dual-purpose yards may account for most of the switches.
- Hurdle or chase to Bumper switches and the reverse are counted as code switches, though they are a different kind of change from jumps to Flat.
- Control
{ "description": "Same-race other runners should be near par (about 0.95 to 1.02). The key comparison is the same-code complement: held-up or midfield pull-ups running today in the same race type as their pull-up. The rival explanation needs that group well below the code-switchers, at about 1.0 or lower. If same-code pull-ups on changed going still score about 1.25 or more, the lift comes from the going and not from the code switch.", "rule": "last_pulled_up = 1 AND last_run_style IN ('held_up', 'midfield') AND last_race_type IS NOT NULL AND race_type = last_race_type" }
Discovery result
pass broad rule (niche) · 17 Oct, 01:58
- Bets
- 304
- 23 winners
- A/E
- 1.36
- 95%: 0.86 to 2.04
- SP return
- -27.7%
- level stakes
- Betfair SP return
- +3.5%
- 302 bets with a BSP
Strike rate 7.6%. p = 0.092. Same-race control: the other runners in these races had A/E 0.98, so the selection beat its own races. Zone: discovery. Evaluator eval-1.0, data 6a4e98be18e83933
By period
Falsification
Each attack is a deliberate attempt to kill the idea. 6 of 6 survived.
- control: Control: same-code held-up/midfield pull-ups, 14/1 or shorterpass
403 bets · A/E 1.17 (0.89 to 1.51) · control 0.98 · 17 Oct, 01:59
Breakdown
betsA/E0.71.01.32025-10-01 to 2026-04-272701.02after 2026-04-271331.48Bars grow from 1.00, the market. Faded bars have fewer than 40 bets. - control: Control: same code but changed going, 14/1 or shorterpass
277 bets · A/E 1.30 (0.95 to 1.72) · control 0.96 · 17 Oct, 01:59
Sealed holdout (vault)
Not queried. Only a frozen idea can spend its one query against the 2020-25 holdout.
Forward record
- forward vs bar {'min_bets': 100, 'min_ae': 1.05, 'max_p': 0.2}info
0 bets · · 17 Oct, 01:59
Breakdown
betsA/E0.71.01.3forward0–Bars grow from 1.00, the market. Faded bars have fewer than 40 bets.
Other experiments
- neighbour: drop: last_pulled_up = 1pass
3,532 bets · A/E 1.01 (0.90 to 1.13) · control 1.00 · 17 Oct, 01:59
Breakdown
betsA/E0.71.01.32025-10-01 to 2026-04-271,5960.94after 2026-04-271,9361.05Bars grow from 1.00, the market. Faded bars have fewer than 40 bets. - neighbour: drop: last_run_style IN ('held_up', 'midfield')pass
476 bets · A/E 1.19 (0.82 to 1.67) · control 0.99 · 17 Oct, 01:59
Breakdown
Lineage
Agent runs
designer v1ok · 30s · 17 Oct, 01:54
Output (schema-checked)
{ "rule": "last_pulled_up = 1 AND last_run_style IN ('held_up', 'midfield') AND last_race_type IS NOT NULL AND race_type <> last_race_type", "refinements": [ { "label": "14/1 or shorter", "rule": "last_pulled_up = 1 AND last_run_style IN ('held_up', 'midfield') AND last_race_type IS NOT NULL AND race_type <> last_race_type AND sp_decimal <= 15" }, { "label": "code switch on the same going group (separates code from going)", "rule": "last_pulled_up = 1 AND last_run_style IN ('held_up', 'midfield') AND last_race_type IS NOT NULL AND race_type <> last_race_type AND last_going_group IS NOT NULL AND going_group IS NOT NULL AND going_group = last_going_group" }, { "label": "code switch, 14/1 or shorter, back within 90 days", "rule": "last_pulled_up = 1 AND last_run_style IN ('held_up', 'midfield') AND last_race_type IS NOT NULL AND race_type <> last_race_type AND sp_decimal <= 15 AND days_since_last_run IS NOT NULL AND days_since_last_run <= 90" } ], "control": { "description": "Same-race other runners should be near par (about 0.95 to 1.02). The key comparison is the same-code complement: held-up or midfield pull-ups running today in the same race type as their pull-up. The rival explanation needs that group well below the code-switchers, at about 1.0 or lower. If same-code pull-ups on changed going still score about 1.25 or more, the lift comes from the going and not from the code switch.", "rule": "last_pulled_up = 1 AND last_run_style IN ('held_up', 'midfield') AND last_race_type IS NOT NULL AND race_type = last_race_type" }, "pass_criteria": { "min_bets": 200, "min_ae": 1.1, "max_p": 0.05 }, "forward_bar": { "min_bets": 100, "min_ae": 1.05, "max_p": 0.2 }, "confounders": [ "Change of going group: a code switch often brings a ground change (onto AW or summer Flat ground). The same-going refinement and the same-code control are there to split the two.", "Long break between codes, e.g. a jumper resting before the Flat or AW. The 90-day refinement checks this.", "Seasonal mix: the thread shows a skew after 27 April 2026, so the result should be checked for both periods.", "Price band 16/1 or bigger: across this thread these runners sit below par and drag the result down.", "Trainer switching policy: a few dual-purpose yards may account for most of the switches.", "Hurdle or chase to Bumper switches and the reverse are counted as code switches, though they are a different kind of change from jumps to Flat." ], "mechanism": "After a pull-up, connections often move a held-up or midfield horse to a code that may suit it better: from hurdles to fences, or from jumps to the Flat or AW in summer. A pull-up in one discipline says little about the horse's ability in another, so the bad figure overstates how weak it is today. The changed-going lift (1.296 on 940, against 0.93 on 510 on the same going) may come mainly from these code switches, with the going change only a side effect.", "market_miss": "The form line shows a P with nothing to say it came in a different discipline. Punters and price-makers read it as a failure in today's code and push the horse out further than its ability in the new code deserves.", "prediction": { "direction": "positive", "size": "A/E 1.20 to 1.40 on 300+ bets, clearly above the same-code complement (expected about 1.0)", "falsified_if": "The broad rule scores A/E below 1.10, or the same-code held-up pull-ups score as high as the switchers (within 0.10 A/E), or the lift disappears on the same going group, which would leave it as a going effect." }, "notes": "The rule sketch is kept as it was: it uses only pre-off columns and does not read the result. 'Within 14/1' is coded as sp_decimal <= 15. The same-going refinement is the direct test of the question asked (code against going). Pass criteria are stricter than the lab floor because the parent lift is large and this rival should show at least 200 bets." }
Timeline
Job 2402 finished
· engine:compute-1
hypothesis note H-070b2026
· engine:perturb
perturbation result for H-070b2026 (neighbour: drop: race_type <> last_race_type): pass
· engine:perturb
perturbation result for H-070b2026 (neighbour: drop: last_race_type IS NOT NULL): pass
· engine:perturb
perturbation result for H-070b2026 (neighbour: drop: last_run_style IN ('held_up', 'midfield')): pass
· engine:perturb
perturbation result for H-070b2026 (neighbour: drop: last_pulled_up = 1): pass
· engine:perturb
compute-1 took job 2402 (mutate, attempt 1)
· compute-1
Queued mutate on the compute lane: parameter stability: do neighbouring thresholds hold?
· engine:scheduler
Job 2396 finished
· engine:compute-1
forward result for H-070b2026 (forward vs bar {'min_bets': 100, 'min_ae': 1.05, 'max_p': 0.2}): info
· engine:evaluator
compute-1 took job 2396 (forward_check, attempt 1)
· compute-1
Queued forward_check on the compute lane: daily forward check of a shadow system
· engine:scheduler
Job 2394 finished
· engine:compute-1
H-070b2026 Frozen → SHADOW vault skipped: last_pulled_up, last_run_style do not exist before the discovery zone; track it forward instead
· engine:orchestrator
compute-1 took job 2394 (vault, attempt 1)
· compute-1
Job 2387 finished
· engine:compute-1
Queued vault on the compute lane: frozen: one sealed vault query
· engine:scheduler