Hypotheses · story · H-c36bf81d
Test-mechanism: the heavy beating misleads most when ground or trip changed since
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
- test-mechanism
- Created
- 17 Oct, 04:13
- Tests logged
- 18
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-332b49e9 (Rival: the lift is a one-bad-run rebound after close recent form, need) passed discovery: A/E 1.23 on 1600 bets (p 0.004), same-race control 0.98. O-10a4d6e5
- AskedIs the one-bad-run rebound strongest when the heavy beating came on different ground or at a different trip from today, as a temporary-cause mechanism predicts? answered
- MechanismIf the 20-length beating had a temporary cause, the commonest causes are unsuitable ground or trip. A horse back on different going from the beating faces conditions closer to those of its close run, so the beating says least about today.
- Why the market misses itThe form line shows the margin prominently. The going of each run is shown but is rarely used to discount a beating, so the latest heavy defeat drags the price whatever the conditions.
- Predictedpositive, A/E 1.25 to 1.45 on 500+ bets, above the same-going complement
- Falsified ifA/E at or below 1.15, or no higher than the same rule with last_going_group = going_group
- Rule sketch
is_handicap = 1 AND race_type IN ('Hurdle', 'Chase') AND last_beaten_lengths >= 20 AND best_last3_beaten <= 6 AND last_going_group IS NOT NULL AND going_group IS NOT NULL AND last_going_group <> going_group
Mechanism and rationale
If the 20-length beating had a temporary cause, the commonest causes are unsuitable ground or trip. A horse back on different going from the beating faces conditions closer to those of its close run, so the beating says least about today.
The rule
is_handicap = 1 AND race_type IN ('Hurdle', 'Chase') AND last_beaten_lengths >= 20 AND best_last3_beaten IS NOT NULL AND best_last3_beaten <= 6 AND last_going_group IS NOT NULL AND going_group IS NOT NULL AND last_going_group <> going_groupReads: is_handicap, race_type, last_beaten_lengths, best_last3_beaten, last_going_group, going_group
Pre-registration
- Spec hash (sha256 of the canonical pre-spec)
- ec7c6c1f630f8588761b5ae6007aeb5dc979dd71ebcdf1dc5fe2476ca2379d0e
- Frozen
- 17 Oct, 04:22
- Nothing in the definition can change after this.
- Confounders
- Season change shifts the going and the yard's form together, so a going change may stand in for a stable coming into form
- Going groups are coarse; a change across a group boundary may be small and one inside a group may be large
- best_last3_beaten exists only from November 2025, so the window is short and one season
- A few longshot winners can drive the A/E; the 16/1-or-shorter refinement checks this
- Overlaps the known close-finish rebound (1.23 on 1600); the result must beat the same-going complement, not just the floor
- Recent winners carry much of the GB lift in this family, so the close run may be a win rather than a near-miss
- Control
{ "description": "The key comparison is the same-going complement: the identical rule but with last_going_group = going_group. The mechanism says the rebound is concentrated where the ground changed, so the changed-going group should beat the same-going group clearly (the family baseline for beaten-20+ close finishers is about 1.23 on 1600). If both score alike, going change carries nothing and the lift belongs to the close-finish rebound already known. Other runners in the same races should be about 1.0; a high reading there would point to a race-level effect (e.g. going-change meetings with odd results) rather than the horse.", "rule": "is_handicap = 1 AND race_type IN ('Hurdle', 'Chase') AND last_beaten_lengths >= 20 AND best_last3_beaten IS NOT NULL AND best_last3_beaten <= 6 AND last_going_group IS NOT NULL AND going_group IS NOT NULL AND last_going_group = going_group" }
Discovery result
pass broad rule · 17 Oct, 04:14
- Bets
- 917
- 105 winners
- A/E
- 1.26
- 95%: 1.03 to 1.53
- SP return
- +8.2%
- level stakes
- Betfair SP return
- +54.9%
- 914 bets with a BSP
Strike rate 11.5%. p = 0.012. 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: Same-going complement: identical rule with last_going_group = going_grouppass
682 bets · A/E 1.20 (0.94 to 1.50) · control 0.99 · 17 Oct, 04:22
Breakdown
betsA/E0.71.01.32025-10-01 to 2026-04-272701.10after 2026-04-274121.26Bars grow from 1.00, the market. Faded bars have fewer than 40 bets. - price_band: 16/1 or shorter only: is the lift a handful of longshot winners?pass
650 bets · A/E 1.21 (0.97 to 1.48) · control 0.98 · 17 Oct, 04:22
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, 04:24
Breakdown
betsA/E0.71.01.3forward0–Bars grow from 1.00, the market. Faded bars have fewer than 40 bets.
Other experiments
- neighbour: >= 20 -> 16 (-20%)pass
1,182 bets · A/E 1.19 (0.99 to 1.41) · control 0.98 · 17 Oct, 04:15
Breakdown
betsA/E0.71.01.32025-10-01 to 2026-04-277431.19after 2026-04-274391.19Bars grow from 1.00, the market. Faded bars have fewer than 40 bets. - neighbour: >= 20 -> 24 (+20%)pass
735 bets · A/E 1.25 (0.99 to 1.56) · control 0.98 · 17 Oct, 04:15
Breakdown
Lineage
Agent runs
designer v1ok · 41s · 17 Oct, 04:13
Output (schema-checked)
{ "rule": "is_handicap = 1 AND race_type IN ('Hurdle', 'Chase') AND last_beaten_lengths >= 20 AND best_last3_beaten IS NOT NULL AND best_last3_beaten <= 6 AND last_going_group IS NOT NULL AND going_group IS NOT NULL AND last_going_group <> going_group", "refinements": [ { "label": "going and trip both changed (10%+)", "rule": "is_handicap = 1 AND race_type IN ('Hurdle', 'Chase') AND last_beaten_lengths >= 20 AND best_last3_beaten IS NOT NULL AND best_last3_beaten <= 6 AND last_going_group IS NOT NULL AND going_group IS NOT NULL AND last_going_group <> going_group AND last_distance_yards IS NOT NULL AND distance_yards IS NOT NULL AND (distance_yards >= 1.1 * last_distance_yards OR distance_yards <= 0.9 * last_distance_yards)" }, { "label": "16/1 or shorter, to check the lift is not a few longshot winners", "rule": "is_handicap = 1 AND race_type IN ('Hurdle', 'Chase') AND last_beaten_lengths >= 20 AND best_last3_beaten IS NOT NULL AND best_last3_beaten <= 6 AND last_going_group IS NOT NULL AND going_group IS NOT NULL AND last_going_group <> going_group AND sp_decimal <= 17" }, { "label": "excluding recent winners (close run was a defeat, not a win)", "rule": "is_handicap = 1 AND race_type IN ('Hurdle', 'Chase') AND last_beaten_lengths >= 20 AND best_last3_beaten IS NOT NULL AND best_last3_beaten > 0 AND best_last3_beaten <= 6 AND last_going_group IS NOT NULL AND going_group IS NOT NULL AND last_going_group <> going_group" } ], "control": { "description": "The key comparison is the same-going complement: the identical rule but with last_going_group = going_group. The mechanism says the rebound is concentrated where the ground changed, so the changed-going group should beat the same-going group clearly (the family baseline for beaten-20+ close finishers is about 1.23 on 1600). If both score alike, going change carries nothing and the lift belongs to the close-finish rebound already known. Other runners in the same races should be about 1.0; a high reading there would point to a race-level effect (e.g. going-change meetings with odd results) rather than the horse.", "rule": "is_handicap = 1 AND race_type IN ('Hurdle', 'Chase') AND last_beaten_lengths >= 20 AND best_last3_beaten IS NOT NULL AND best_last3_beaten <= 6 AND last_going_group IS NOT NULL AND going_group IS NOT NULL AND last_going_group = going_group" }, "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": [ "Season change shifts the going and the yard's form together, so a going change may stand in for a stable coming into form", "Going groups are coarse; a change across a group boundary may be small and one inside a group may be large", "best_last3_beaten exists only from November 2025, so the window is short and one season", "A few longshot winners can drive the A/E; the 16/1-or-shorter refinement checks this", "Overlaps the known close-finish rebound (1.23 on 1600); the result must beat the same-going complement, not just the floor", "Recent winners carry much of the GB lift in this family, so the close run may be a win rather than a near-miss" ], "mechanism": "A 20-length beating that sits next to a close finish in the last three runs is likely to have had a temporary cause, and the commonest are unsuitable ground or trip. When today's going group differs from the going of the beating, the horse is no longer facing the conditions that beat it, so that beating tells us least about today. The rebound seen in close-finishing heavily beaten jumps handicappers should therefore be concentrated where the going has changed.", "market_miss": "The form line shows the latest margin prominently, and the price is set largely off that. The going of each run is shown but is rarely used to discount a beating, so the heavy defeat drags the price the same whether or not today's ground differs from the ground it came on.", "prediction": { "direction": "positive", "size": "A/E 1.25 to 1.45 on 500+ bets, clearly above the same-going complement", "falsified_if": "A/E at or below 1.15, or no higher than the same-going control rule (last_going_group = going_group) on comparable bets" }, "notes": "I kept the rule sketch and added an explicit best_last3_beaten IS NOT NULL. The mechanism names trip as well as going, so trip goes in as a refinement and not into the broad rule. Pass criteria are stricter than the floor (200 bets, A/E 1.10) because this overlaps a known family effect. The real test is the gap against the same-going control." }
Timeline
Job 2899 finished
· engine:compute-1
forward result for H-c36bf81d (forward vs bar {'min_bets': 100, 'min_ae': 1.05, 'max_p': 0.2}): info
· engine:evaluator
compute-1 took job 2899 (forward_check, attempt 1)
· compute-1
Queued forward_check on the compute lane: daily forward check of a shadow system
· engine:scheduler
Job 2867 finished
· engine:compute-1
H-c36bf81d Frozen → SHADOW vault skipped: last_beaten_lengths, best_last3_beaten do not exist before the discovery zone; track it forward instead
· engine:orchestrator
compute-1 took job 2867 (vault, attempt 1)
· compute-1
Job 2856 finished
· engine:compute-1
Queued vault on the compute lane: frozen: one sealed vault query
· engine:scheduler
H-c36bf81d Falsification → FROZEN survived falsification
· engine:falsification
falsification result for H-c36bf81d (perturbation: Perturb looser: beaten 16+ last time, best of last 3 within 5 lengths): pass
· engine:evaluator
compute-1 took job 2856 (attack, attempt 1)
· compute-1
Job 2855 finished
· engine:compute-1
falsification result for H-c36bf81d (perturbation: Perturb tighter: beaten 25+ last time, best of last 3 within 7.5 lengths): pass
· engine:evaluator
compute-1 took job 2855 (attack, attempt 1)
· compute-1
Job 2854 finished
· engine:compute-1
falsification result for H-c36bf81d (partition: Quick return (60 days or less): going change without a season/yard-form shift): pass
· engine:evaluator
compute-1 took job 2854 (attack, attempt 1)
· compute-1
Job 2853 finished
· engine:compute-1