Resolute — programme activity

Every workstream on one page: what is built, what is running, what it is producing right now, and what is still to be executed. For Chelsea, Caroline and John DeReamer.

Measured 2026-08-24 23:00:05 UTC (2026-08-24 19:00:05 EDT). This page is static: it shows the state at that instant and does not update itself. It is regenerated at 07:00 and 19:00 America/New_York.

Warehouse scope for every Snowflake figure on this page: account MLA96789, user RESOLUTE_ADMIN, role RESOLUTE_ADMIN, warehouse RESOLUTE_AI_WH, database RESOLUTE_MIND.RACING_DATA.

3 measurement(s) failed on this build. Each failed figure reads ERROR in place, and the reason is in that cell's tooltip and in the footer. A failed measurement is never shown as a zero.

1 · Sale sites

The two sale-day field-sheet applications. Reachability was probed by HTTP GET from the Mac Studio at build time; everything else in this section was measured on 2026-08-12 and is carried forward.

Saratoga — Fasig-Tipton, 2026 — ABBI.023

Hips
226
across 2 sessions · recorded 2026-08-12
Reachable now
HTTP 502 0 bytes
HTTP GET, 20s timeout, from the Mac Studio at the measurement time

URL: https://abbi-m1-bigscreen.tailfb6577.ts.net:8443/ — Tailscale funnel :8443 -> 127.0.0.1:8787 (team build, served at path /FxEINNCkHa/)
Hosting: Mac Studio, supervised by a bare `while true` shell loop, not a LaunchAgent

Built and working

Still to be executed

Keeneland — September 2026 — ABBI.027

Hips
4,635
across 12 sessions · recorded 2026-08-12
Reachable now
HTTP 200 4,970 bytes
HTTP GET, 20s timeout, from the Mac Studio at the measurement time
Parity gap outstanding
11
features Saratoga has that Keeneland does not

URL: https://v200-webapp-kee27-fieldsheet.pages.dev/ — Cloudflare Pages, so reading survives the Mac; live ticking still posts to the Mac over Tailscale
Hosting: Cloudflare Pages `v200-webapp-kee27-fieldsheet` + two LaunchAgents on the Mac

Built and working

Still to be executed

The parity gap — 11 features Keeneland lacks that Saratoga has

#FeatureState
1Conformation moduleAbsent entirely — not a stub. The event schema has no slot for it: KINDS = ('vet','buy','out').
2PhotosAbsent; no <img> anywhere. Keeneland's feed media fields are 0% populated today.
3VideoAbsent; zero hits across the whole tree.
4Notes / comments with autosaveProtocol-ready but UI-absent: the server accepts note[:280], the client's mark() never sends one, and there is no textarea and no autosave.
5Prospect tickAbsent; only Vet list and Short list.
6Purchased tabAbsent — no ownership %, no partners, no shipper, no dates.
7Vet / repository panelAbsent; 'Vet list' is a tick, not a repository. No radiographs, no scope, no vet findings fields.
8Consignor filterDead code: honoured in applyView() but there is no control in the DOM.
9Broodmare-sire filterAbsent — a column and a search term only.
10Per-hip URL / pageAbsent; drawer only, and the hash does not change.
11Per-person chips, removal-with-reason, the 40-entry audit trail, the twin public/team build, the sub-tabbed vet listAll absent.

Scope: enumerated by reading both source trees on 2026-08-12; each entry was confirmed by a grep of the Keeneland tree that returned no implementing code. Not re-measured on this build.

2 · Data warehouse

Total rows
54,194,867
122 base tables in RESOLUTE_MIND.RACING_DATA
Empty tables
8
base tables holding exactly 0 rows
TableRowsWhat it is
PEDIGREE_LINKS40,705,303Sire/dam edges. The single largest object in the estate.
STARTERS1,609,270One row per runner per race. LAST_RACE_DATE is 0.0000% populated.
HORSES1,190,436The horse dimension. FOAL_DATE is populated on 3 rows.
DIM_HORSE1,153,274The reconciled horse dimension built by the identity lane.
SPEED_FIGURES982,450Multi-source figures. 14,027 rows are dated in the future and 1,393 have a NULL race date.
PRODUCE_RECORDS812,675Mare produce records. FOAL_GRADE is 100% NULL and was rejected as a source.
PAST_PERFORMANCES672,686Past-performance lines — a two-year window only.
SALE_ENTRIES488,349Auction lots. The comparables backbone of both sale sites.
COVERINGS437,998Coverings. COVERING_DATE is empty; only COVERING_YEAR is usable.
WORKOUTS367,860Published workouts.
RACE_RESULTS211,818Result rows.
RACES153,633Race header rows.
NARC_RATINGS85,479North American Rating Committee ratings.
SCRAPER_LOG32,669The extraction fleet's own audit log — the source for section 3 of this page.

Scope: RESOLUTE_MIND.RACING_DATA. Every figure is a real SELECT COUNT(*) executed at the measurement time above — not the SHOW TABLES / INFORMATION_SCHEMA estimate. The total covers all 122 base tables in the schema, not only the rows listed here.

The gaps — base tables holding exactly zero rows

Empty tableWhat its emptiness costs
EQUIPMENT_CODESEquipment codes cannot be decoded.
HORSE_REGISTRYSuperseded by HORSES / DIM_HORSE.
NICK_RATINGS_INTLThe international nick lane never landed.
OWNERSOwnership joins return nothing, although STARTERS.OWNER_ID exists.
P360_MATING_RESULTSThe Pedigrees360 mating lane never landed, although its sibling P360 tables did — and matings are what Resolute's own breeding decisions turn on.
POINTS_OF_CALLNo running lines exist at all. Pace analysis is impossible.
RACE_FRACTIONALSNo sectional times exist at all. Pace analysis is impossible.
RESOLUTE_SALESResolute's OWN sales records are absent.

Scope: the same query as above. A table appears here only if its real count is exactly 0. An empty table is a measured fact; it is not the same thing as a table that failed to be measured, which would read ERROR.

3 · Extraction fleet

Fleet summary

Total scrapers
14
recorded 2026-08-24
OK
10
running and producing
Blocked on credentials
2
Architect unlock, not engineering
Minor errors
2
running, throwing non-fatal errors
LaneStatusReasonWho unlocks it
pedigreequeryBLOCKEDneeds PX-solver key (CAPTCHA bypass service)Architect unlock, not an engineering task
pedigrees360BLOCKEDneeds paid-figure-data subscription credentialsArchitect unlock, not an engineering task

Scope: fleet headcount and the two credential-blocked lanes are recorded as of 2026-08-24, source pm-state.json. Live per-lane row counts for every non-blocked lane are the table below, measured at the top-of-page timestamp.

How status is decided on this page, and why it differs from the old dashboard. A lane's status here is rows written over a window. It is never the age of the last run that reported OK. The dashboard at :3005 measures last-OK age, which is why it shows dead lanes as green — allbreed-pedigree has been logging STATUS='OK' | fetched 38 | written 0 | errors 5 around the clock since it last wrote a row. That is BUG-20260812-0014. On this page a lane that ran and wrote nothing is DEAD, and its run count is printed next to its zero so the shape of the failure is visible.

PRODUCING = wrote at least one row in the last 24 h. STALLED = wrote rows within 7 days but nothing in the last 24 h. DEAD = wrote nothing at all in 7 days, however many times it ran.

External lanes producing
6 / 20
wrote ≥1 row in the last 24 h
External lanes dead
12
0 rows written in 7 days
External rows collected
3,040
last 24 h · 126.7 rows/hour
Derived rows
731,097
last 24 h · computed from data already held, not collected

Collected and derived are reported separately on purpose: the derived lanes manufacture hundreds of thousands of rows a day out of data the warehouse already holds, and adding the two together hides a collection failure completely.

External collection lanes

LaneStatusRuns 24hRows written 24hRuns 7dRows written 7dFetched 7dErrors 7dDays since last productive run
brisnetDEAD000000never
equibase_chartsDEAD00000036
equibase_resultsDEAD0010604,2314,23138
equibase_workout_scraperDEAD004801,9051,90538
hkjcDEAD108060107,188020
pedigreequery-pod@3ba95bcad588DEAD00000038
pedigreequery-pod@dff74ceec122DEAD00000038
pedigrees360DEAD10808843
racelensDEAD0041400037
ragozinDEAD000000never
sl-race-scraperDEAD00000057
thorographDEAD000000never
allbreed-pedigreeSTALLED9506723,39426,0541,8852
pedigreequerySTALLED48002,77259166,320166,3185
equinedgePRODUCING52,19515224,3873,71540
racingpostPRODUCING147583,95142500
hrn-resultsPRODUCING131481,5028000
jbisPRODUCING1478479600
narcPRODUCING967674404,0241400
horse_newsPRODUCING4229102,61000

Derived / internal lanes

LaneStatusRuns 24hRows written 24hRuns 7dRows written 7dFetched 7dErrors 7dDays since last productive run
daily-freshness-auditDEAD10805617never
dedupDEAD002000never
derived-produceSTALLED10769002
derived-inbreedingPRODUCING1379,62172,657,321000
identity.reconcilePRODUCING48234,2153371,678,7621,680,43600
derived-nicks-structurePRODUCING1117,2417820,431000
completeness-audit-refreshPRODUCING1208160000

Scope: RESOLUTE_MIND.RACING_DATA.SCRAPER_LOG, one row per run. The 24 h and 7 d columns are SUM(RECORDS_WRITTEN) and COUNT(*) over RUN_STARTED_AT within that window. “Days since last productive run” is DATEDIFF from MAX(RUN_COMPLETED_AT) WHERE RECORDS_WRITTEN > 0 over ALL TIME, so it is not capped by the window; a lane with no productive run anywhere in the log reads never. Nothing in this table reads the STATUS column.

4 · Freshness

How old the newest row is, per source, for the two data classes the sale sites and the analytics depend on.

Races — days stale by source

SourceRowsNewest rowDays stale
horseracingnation.com1,7952026-08-231
jbis.or.jp302026-08-231
racingpost.com38,0512026-08-231
racing.hkjc.com14,6672026-07-1540
netkeiba.com11,0522026-07-1045
drf.com52,0522026-07-0946
equibase.com4,9242026-07-0847
sportinglife.com24,8772026-07-0847
open-pmu-api3,7602026-07-0550
sportinglife1,2292026-06-2857
HRN2752026-06-2857
timeform.com6162026-05-14102
eprochasson/horserace_data3051995-02-2211,506

Scope: RESOLUTE_MIND.RACING_DATA.RACES, grouped by SOURCE_SITE. Days stale is DATEDIFF(day, MAX(RACE_DATE), CURRENT_DATE()) at the measurement time above. Note the two duplicated source spellings (sportinglife vs sportinglife.com, HRN vs horseracingnation.com): they fragment any GROUP BY, including this one, and are listed here exactly as they appear in the column rather than merged.

Sales — days stale by source

SourceRowsNewest rowDays stale
keeneland.com298,6672026-04-24122
inglis.com.au4,3772026-03-01176
goffs.com2,6992026-01-01235
arqana.com1,5692026-01-01235
tattersalls.com92,8992025-10-01327
fasigtipton.com73,0202024-11-04658
obssales.com11,5332024-03-01906
capethoroughbredsales.com3,5852022-02-011,665

Scope: RESOLUTE_MIND.RACING_DATA.SALE_ENTRIES, grouped by SOURCE_SITE. Days stale is DATEDIFF(day, MAX(SALE_DATE), CURRENT_DATE()) at the measurement time above. This is the most degraded lane in the warehouse, and it is the table the Keeneland September comparables are built on.

5 · What remains

The work still to be executed, counted from the three companion documents that sit alongside this dashboard, plus the defects filed and not yet fixed.

Companion documentOpen itemsWhat is counted
Data Extraction Completion List
Data-Extraction-Completion-List.html
source document not readable on this build — the count shown is cached from 2026-08-18
21numbered work items (X1-Xn), in four blocks: Restoration, the licensing decision, genuine new coverage, and quality fixes
Keeneland Sale Site Completion List
Keeneland-Completion-List.html
source document not readable on this build — the count shown is cached from 2026-08-18
23 + 11numbered work items (K1-Kn), in four tiers: Preservation, the conformation module, availability, and parity features; plus 11 recorded risks (R1-Rn), carried rather than resolved
Continuous Data Refresh — Research Decision
Continuous-Refresh-Research-Decision.html
source document not readable on this build — the count shown is cached from 2026-08-18
n/aa decision document — it carries no numbered work items. The open decision it holds: obtain the negotiated commercial licence price, between the two measured anchors of ~$3,000/yr (TrackMaster retail) and ~$60,000/yr (the Equibase per-file equivalent)

Scope: these counts are parsed out of the companion documents themselves at build time, from /private/tmp/claude-501/-Users-abbiadmin/276e123c-6e99-46e3-a2c1-01644f8e81a5/scratchpad, by counting distinct item identifiers. They are not transcribed by hand and so cannot drift from the lists. If a document is unreadable the last successful count is shown with its date and marked stale; if there has never been one the cell reads ERROR.

Open defects — filed, none fixed

BugSeverityWhat it is
BUG-20260812-0012P2 / HIGHThe collection controller has been inert for 24 days. Every guard in monitor/racing_monitor.py — proxy recovery, bandwidth, duplicate recovery, silent-stall detection, the staleness sweep, alerting and paging — runs only in the else-branch that requires all six docker containers up. The 2026-07-19 Azure migration put worker and flaresolverr behind a compose profile, so they are permanently absent and the loop takes the missing: branch every 300s forever. Last healthy pass 2026-07-18T23:31:17.
BUG-20260812-0013P2 / HIGHRESOLUTE_SCRAPEDO_KEY is absent from the live Azure worker. The four Equibase-family lanes fetch exclusively via scrapedo_get, and scrape.do is the only method proven to clear PerimeterX. With the key absent the code logs 'RESOLUTE_SCRAPEDO_KEY not set' and writes nothing. RESOLUTE_RESIDENTIAL_PROXY is also absent, disabling the IPRoyal metered-escalation path.
BUG-20260812-0014P3 / MEDIUMA dead lane reads green. Both health consumers — the old dashboard's status column and check_all_scrapers — measure the AGE OF THE LAST OK RUN, never rows produced. THIS DASHBOARD IS BUILT AGAINST THAT DEFECT: every status in section 3 is rows-written-over-window.
BUG-20260812-0017P1 / CRITICALThe Saratoga generator source root is a Claude Code session scratchpad under /private/tmp, 502 files, no .git anywhere, supervised by a bare `while true` loop rather than a LaunchAgent. /private/tmp is subject to OS temp reaping; if either scratchpad is reaped the sheet cannot be rebuilt and the conformation module source is lost outright.

Scope: the four defects filed against the Resolute programme and open as of 2026-08-12. Recorded, not re-measured on this build.

6 · Keeneland site readiness

Feature-by-feature parity against the Saratoga build (section 1 above lists all 11 parity gaps in full; this checklist is the PM tracking view of the same work, plus items Saratoga does not have either). DATA-BLOCKED means no engineering unblocks it — the item needs data that will not exist until the sale itself runs.

Done
3
of 14 tracked items
To do
7
engineering work, unblocked
Data-blocked
4
waiting on the sale itself
StatusItemNote
DONEValue rank renamedwas a trap — price rank, not value
DONElocalStorage Safari Private fix
DONEPass control 'out' button wired
TODOComments surfacezero comment UI exists
TODOMare NARC ratingsavailable for 1,935 identity-corroborated dams
TODORead tile with merit percentile
TODOBroodmare sire and consignor filtersapplyView already honours f.consignor — control not added to shell
TODOPer-person selectionSaratoga filters to 10 named people
TODOTicked-by sort fixkey 'mk' not carried by index rows
TODOConformation module portfrom Saratoga dev build
DATA-BLOCKEDVet layerno vendor vetting for Sept 2026 yet
DATA-BLOCKEDMarket per-hipsale hasn't run
DATA-BLOCKEDPurchases tabnothing bought yet
DATA-BLOCKEDLive sale-day results feed

Scope: recorded 2026-08-24, last updated 2026-08-24 via pm-state.json. This is a tracked checklist, not a live measurement — it changes when the work changes, not on every build.

7 · Open items & actions

Every open action across the programme, one owner and one due date each. Edited directly in pm-state.json alongside this generator, so ownership and status can change without a code deploy.

ItemOwnerStatusDue
PX-solver key for pedigreequeryArchitectBLOCKEDTBD
Paid-figure-data credentials for pedigrees360ArchitectBLOCKEDTBD
Keeneland site feature parityABBIIN PROGRESS2026-09-10
Data completeness auditABBIIN PROGRESS2026-09-01
Conformation module portABBITODO2026-09-10
Email team for statusABBIDONE2026-08-24

Scope: 6 item(s), source pm-state.json, as of 2026-08-24. Two items are Architect unlocks (a credential only he holds), not engineering tasks — they cannot be closed by building anything.

8 · Project timeline

Days remaining, counted from this build's measurement time to Keeneland September 2026 (Sept 14–26).

Until sale opens
21 days
2026-09-14
Until sale ends
33 days
2026-09-26

Preparation window 2026-08-01 → 2026-09-14 — 52.3% elapsed

Milestones

Data completeness audit due (2026-09-01)8d
Keeneland site feature parity due (2026-09-10)17d
Conformation module port due (2026-09-10)17d
Keeneland September sale opens (2026-09-14)21d
Keeneland September sale ends (2026-09-26)33d

Scope: dates are fixed calendar constants in this generator (Keeneland September 2026-09-14–2026-09-26, milestone due dates matching section 7); days-remaining is computed live at each build against the measurement timestamp above. The preparation-window bar's start date (2026-08-01) is a display anchor for the bar's width, not a recorded project-kickoff date.