Data Matrix — Three Pillars Audit
What we hold · what's missing · what it costs to get
Headline: of ~38 components across the three pillars, we hold 19,
partially hold 7, and lack 12. But 3 substantial datasets are already on
disk and never used — those come first, because they're free.
Pillar 1 · Core Form
| Component | Status | Where | To get it |
| Finishing position per run | HAVE |
nsw_all.pos | — |
| Days since last run | HAVE |
derived from date | — |
| 1st/2nd/3rd up (spells) | HAVE |
derived | ⚠ cross-state error, bounded |
| Career record (wins/places) | HAVE |
derived per horse | — |
| Record at distance | HAVE |
distance_m (fixed today) | — |
| Record at track | HAVE |
derived | — |
| Track × distance record | HAVE |
derived | — |
| Class / race grade | HAVE |
race_class | — |
| Prize money of race | HAVE |
prize | — |
| Career earnings | PARTIAL |
career_prize 55% · career_avg 51% | — |
| Winning time / margins | HAVE |
win_time_s · margin | — |
| In-running positions | PARTIAL |
at400m · at800m |
⚠ look-ahead — same race |
| Last-5 form string | MISSING |
null at source | not available |
| Sectional splits | PARTIAL + UNUSED |
sectionals_full.csv | ATC only, ~887 rows |
| Stewards' narratives | MISSING |
~200 PDFs unparsed | PDF extraction |
Pillar 2 · Physical Attributes
| Component | Status | Where | To get it |
| Age · sex · colour | HAVE |
nsw_all | — |
| Weight carried | HAVE |
weight | — |
| Barrier / draw | HAVE |
barrier | — |
| Handicap rating + movement | HAVE |
hr 64% · rating_prog | — |
| Sire + dam names | HAVE |
sire · dam — 100% | — |
| Progeny performance | MISSING |
— |
sire record · dam's produce · siblings |
| Gear / blinkers / tongue tie | MISSING |
null at source | not available |
| Track condition / going | MISSING |
null in nsw_all |
✅ PuntersEdge going_rating |
| Wet-track aptitude | MISSING |
needs going + years of history | blocks on going |
| Track penetrometer | MISSING |
— | Krok runner-form |
| Rail position | MISSING |
— | ✅ PuntersEdge next-to-go |
| Weather / rainfall | MISSING |
— | Krok /v1/weather |
Pillar 3 · Market Dynamics
| Component | Status | Where | To get it |
| Open / close price per runner | PARTIAL |
tips_all 20% · cl_all 100% | — |
| Per-bookmaker fluc paths | HELD · UNUSED |
tips_json ▸ flucsWin | already on disk |
| Tipster counts per horse | HELD · UNUSED |
tips_json ▸ RaceTippers | already on disk |
| Book coverage per race | HAVE |
14–18 books | — |
| Cross-book spread | HAVE |
up to 30% | — |
| Deductions / scratchings | HAVE |
res_ded · 7.46c mean | — |
| Overround by time-to-jump | HAVE |
1.202 → 1.126 | — |
| Tote exotic dividends | PARTIAL |
res_exotic 290 races | — |
| Betfair BSP | MISSING |
— | Krok /v1/exchange?source=bsp |
| Market movers | MISSING |
— | Krok /v1/racing/movers |
| Exchange liquidity / matched volume | MISSING |
— | Krok runner-form (confidence) |
| Steam / drift velocity | HELD · UNUSED |
flucs arrays in 2,700 files | already on disk |
Recommended sequencing
1 · Mine what's on disk — free, no new source
flucsWin per bookmaker → timing/steam angles on 2,000+ races
- Tipster counts → the follow-the-crowd question
sectionals_full.csv → pace and closing-speed angles
2 · Validate the candidate — the priority
- Fetch the 9,262 non-NSW races (~70 min)
- Run the five-condition score unchanged
- Win-rate gradient first, then ROI with tips
- Different state = different population = real test
3 · Fill the two cheap gaps
going_rating from PuntersEdge — already paid for
- Rail position + track condition from
next-to-go
- Unlocks wet-track angles, including your greys-in-the-wet example
4 · Only then, new sources
- Progeny data — needs a real source, not scraped
- Krok BSP, movers, exchange liquidity — 50 req/mo ceiling
- Stewards' PDFs — extraction pipeline, ~200 files
The risk to name: gathering is not evidence. Widening the matrix from 19 to 38
components does not raise the probability that the score works — it raises the number of
things we could overfit to. And every component added to a search is another chance to
find a false positive.
The one asymmetry in our favour: a component that's genuinely absent from the market
is worth having. Going, rail and penetrometer are the best candidates — they're
track-level, they change the going, and a general pricing model handles them coarsely.
19 held · 7 partial · 12 missing · 3 held-and-unused