Hypotheses · yard-planned-move · H-348bbae0
Fresh from a yard good with returners, when the last run before the break was ugly
fails: A/E 0.893, needs 1.08; p 0.7371, needs 0.05 or lower; periods [0.95, 0.82], each needs 1.0; A/E 0.893 against same-race control 1.004, needs 0.03 above (not a niche pass: A/E 0.893 below 1.08; p 0.7371136117870686 above 0.5; does not beat the same-race control 1.004; a period points the other
Starts the thread “Fresh from a yard good with returners, when the last run before the break was ugly” 2 hypotheses
- Proposed
- Designed
- Discovery
- Promising
- Falsification
- Frozen
- Vault
- Provisional
- Shadow
- Validated
- Live
- Source
- Scout agent, v1
- Made by
- scout
- Created
- 17 Oct, 04:56
- Tests logged
- 1
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-6243bb06 (Test-mechanism: undropped recent winners after a heavy beating, given ) survived falsification: 6 of 6 attacks left it standing; it is frozen for its one vault query. O-3761601e
- H-2af132dc (Generalise: an unchanged mark after a heavy beating lifts close-form j) passed discovery: A/E 1.31 on 506 bets (p 0.026), same-race control 0.98. O-388a8a14
- H-8cff5453 (Replicate: recent winners beaten 20+ lengths in non-handicap jumps rac) was predicted positive but came out the other way: A/E 0.88 on 211 bets (p 0.268 for the opposite direction). O-6896f0b0
- AskedDoes a yard's good record with fresh horses pay most when the break followed a bad run (pulled up, or beaten 20+ lengths), i.e. when the break was a repair?
- MechanismA heavy beating or pull-up followed by a 90+ day break usually means something physical: a breathing problem, sore shins or a muscle issue that was then treated. Yards with a strong fresh record are good at bringing a horse back ready after time off. The old problem is gone, but the bad run still sits on top of the form.
- Why the market misses itPunters and the odds compilers weight the last visible run. A PU or a 20-length beating followed by a long absence reads as a horse with a problem, so its price drifts. The lab's rule is to forgive what was ugly and physical. The yard's fresh record, which shows it fixes horses, is not on the card.
- Predictedpositive, A/E 1.12 to 1.30 on 250+ bets
- Falsified if
Mechanism and rationale
A heavy beating or pull-up followed by a 90+ day break usually means something physical: a breathing problem, sore shins or a muscle issue that was then treated. Yards with a strong fresh record are good at bringing a horse back ready after time off. The old problem is gone, but the bad run still sits on top of the form.
The rule
days_since_last_run >= 90 AND tx_fresh_runs >= 25 AND tx_fresh_wins >= 1.3 * tx_fresh_exp AND ((last_position IS NULL AND COALESCE(last_non_finish_code, 'PU') = 'PU') OR (last_field_size >= 6 AND last_position >= 0.75 * last_field_size))
Reads: days_since_last_run, tx_fresh_runs, tx_fresh_wins, tx_fresh_exp, last_position, last_non_finish_code, last_field_size
Pre-registration
- Spec hash (sha256 of the canonical pre-spec)
- 5d9bc895464ed5efc668300c36b15b300f9f8ebb2d38c39b0c7627e7ae907f90
- Frozen
- not frozen
- The definition can still change.
- Confounders
- Seasonal: October-November returners (jumps season openers) may carry an existing seasonal lift; check lift outside Oct-Nov.
- Code: jumps returners will dominate the bets, and PU is overwhelmingly a jumps outcome; report Flat and jumps separately.
- Price band: lift may be carried by a few big-priced winners; the 14/1-or-shorter refinement checks this.
- Yard concentration: a handful of big jumps yards could supply most of the bets and winners; report top-yard share and leave-one-yard-out.
- Non-finish coding: before 2025 every non-finisher is coded PU, so falls/unseats leak into the PU arm pre-2025; from 2025 they are excluded via last_non_finish_code.
- Proxy: last_beaten_lengths only exists from 2025-11, so 'ugly' is measured as PU or finishing in the back quarter of a 6+ runner field, which is not the same as a 20-length beating.
- Overlap with the yard-fresh finding (1.07) and 30-day yard form; the rule must beat the good-last-run control, not just 1.00.
- Control
{ "description": "Same strong-fresh yards, same 90+ day break, but the last run before the break was good (placed 1st-3rd). This is the falsification arm the hypothesis names: if these score as high or higher than the ugly-last-run group, the bad run adds nothing and any lift is just the yard's fresh record (already a known finding at ~1.07). Expect the control near 1.05-1.10 and the main rule at least ~0.07 A/E above it. The other runners in the same races should sit near 1.00.", "rule": "days_since_last_run >= 90 AND tx_fresh_runs >= 25 AND tx_fresh_wins >= 1.3 * tx_fresh_exp AND last_position IS NOT NULL AND last_position <= 3" }
Discovery result
fail broad rule · 17 Oct, 05:01
- Bets
- 500
- 24 winners
- A/E
- 0.89
- 95%: 0.57 to 1.33
- SP return
- -46.0%
- level stakes
- Betfair SP return
- -35.3%
- 485 bets with a BSP
Strike rate 4.8%. p = 0.74. Same-race control: the other runners in these races had A/E 1.00, so the selection did not beat its own races. Zone: discovery. Evaluator eval-1.0, data 6a4e98be18e83933
By period
Falsification
No attacks yet. Only promising ideas are attacked.
Sealed holdout (vault)
Not queried. Only a frozen idea can spend its one query against the 2020-25 holdout.
Forward record
No forward record. Shadow tracking starts after the vault and counts only races run after the freeze.
Lineage
Agent runs
designer v1ok · 50s · 17 Oct, 04:57
Output (schema-checked)
{ "rule": "days_since_last_run >= 90 AND tx_fresh_runs >= 25 AND tx_fresh_wins >= 1.3 * tx_fresh_exp AND ((last_position IS NULL AND COALESCE(last_non_finish_code, 'PU') = 'PU') OR (last_field_size >= 6 AND last_position >= 0.75 * last_field_size))", "refinements": [ { "label": "14/1 or shorter", "rule": "days_since_last_run >= 90 AND tx_fresh_runs >= 25 AND tx_fresh_wins >= 1.3 * tx_fresh_exp AND ((last_position IS NULL AND COALESCE(last_non_finish_code, 'PU') = 'PU') OR (last_field_size >= 6 AND last_position >= 0.75 * last_field_size)) AND sp_decimal <= 15.0" }, { "label": "pulled up last time only (the clearest physical-problem signal)", "rule": "days_since_last_run >= 90 AND tx_fresh_runs >= 25 AND tx_fresh_wins >= 1.3 * tx_fresh_exp AND last_position IS NULL AND COALESCE(last_non_finish_code, 'PU') = 'PU'" } ], "control": { "description": "Same strong-fresh yards, same 90+ day break, but the last run before the break was good (placed 1st-3rd). This is the falsification arm the hypothesis names: if these score as high or higher than the ugly-last-run group, the bad run adds nothing and any lift is just the yard's fresh record (already a known finding at ~1.07). Expect the control near 1.05-1.10 and the main rule at least ~0.07 A/E above it. The other runners in the same races should sit near 1.00.", "rule": "days_since_last_run >= 90 AND tx_fresh_runs >= 25 AND tx_fresh_wins >= 1.3 * tx_fresh_exp AND last_position IS NOT NULL AND last_position <= 3" }, "pass_criteria": { "min_bets": 200, "min_ae": 1.08, "max_p": 0.05 }, "forward_bar": { "min_bets": 100, "min_ae": 1.03, "max_p": 0.2 }, "confounders": [ "Seasonal: October-November returners (jumps season openers) may carry an existing seasonal lift; check lift outside Oct-Nov.", "Code: jumps returners will dominate the bets, and PU is overwhelmingly a jumps outcome; report Flat and jumps separately.", "Price band: lift may be carried by a few big-priced winners; the 14/1-or-shorter refinement checks this.", "Yard concentration: a handful of big jumps yards could supply most of the bets and winners; report top-yard share and leave-one-yard-out.", "Non-finish coding: before 2025 every non-finisher is coded PU, so falls/unseats leak into the PU arm pre-2025; from 2025 they are excluded via last_non_finish_code.", "Proxy: last_beaten_lengths only exists from 2025-11, so 'ugly' is measured as PU or finishing in the back quarter of a 6+ runner field, which is not the same as a 20-length beating.", "Overlap with the yard-fresh finding (1.07) and 30-day yard form; the rule must beat the good-last-run control, not just 1.00." ], "mechanism": "A pull-up or a run near the back of the field, followed by 90+ days off, usually marks a physical problem (breathing, sore shins, muscle) that the break was used to fix. Yards with a proven record of winning with fresh horses (A/E 1.3+ on 25+ such runners) are the ones that reliably bring a horse back fit, so with them the break is a repair, not a decline. The horse returns with the problem gone but the ugly run still heading its form.", "market_miss": "Punters and compilers weight the last visible run. A PU or a tailed-off run followed by a long absence reads as a horse with a lingering problem, so the price drifts. The yard's fresh-horse record, which is the evidence that the problem was fixed, is not on the racecard and is rarely added up by bettors.", "prediction": { "direction": "positive", "size": "A/E about 1.12 to 1.30 on 250+ bets, and at least ~0.07 above the good-last-run control from the same yards", "falsified_if": "A/E below 1.03 on 200+ bets, or the control (same yards, 90+ days off, placed 1st-3rd last time) scores as high as or higher than the main rule, which would mean the ugly last run adds nothing beyond the yard's fresh record." }, "notes": "I changed the draft rule. last_beaten_lengths (and best_last3_beaten, last_pulled_up and last_code) only exist from 2025-11-01, so 'beaten 20+ lengths' cannot be tested in a discovery zone that starts around 2021. tx_fresh is available from 2021-03. The rule therefore uses a proxy that exists across the full window: pulled up (last_position NULL), or finishing in the back quarter of a field of 6 or more. From 2025, falls, unseats and brought-downs are excluded with COALESCE(last_non_finish_code,'PU')='PU', because those are not physical-repair stories. sp_decimal is the price at the off and is used only for the 14/1 cut. Pass bar raised to 200 bets and A/E 1.08 so the rule has to beat the known yard-fresh baseline of 1.07 rather than just 1.00. Forward A/E bar raised to 1.03 for the same reason." }
Timeline
Job 3084 finished
· engine:compute-1
H-348bbae0 Discovery → KILLED fails: A/E 0.893, needs 1.08; p 0.7371, needs 0.05 or lower; periods [0.95, 0.82], each needs 1.0; A/E 0.893 against same-race control 1.004, needs 0.03 above (not a niche pass: A/E 0.893 below 1.08; p 0.7371136117870686 above 0.5; does not beat the same-race control 1.004; a period points the other way [0.95, 0.82])
· engine:evaluator
discovery result for H-348bbae0 (broad rule): fail
· engine:evaluator
H-348bbae0 Designed → RESEARCHdiscovery measuring on the discovery zone
· engine:orchestrator
compute-1 took job 3084 (evaluate, attempt 1)
· compute-1
Job 3080 finished
· engine:ai-1
Queued evaluate on the compute lane: discovery run of the broad rule
· engine:scheduler
H-348bbae0 Proposed → RESEARCHdesigned pre-spec written and hashed
· agent:designer@v1
ai-1 took job 3080 (design, attempt 1)
· ai-1
Queued design on the ai lane: write the pre-spec
· engine:scheduler
New idea H-348bbae0: Fresh from a yard good with returners, when the last run before the break was ugly (scout)
· agent:scout@v1
Every change is an event with an actor: an agent and its version, an engine, a human, or the importer. Current stage: Killed.