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-15 23:00:05 UTC (2026-08-15 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.
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.
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
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
| # | Feature | State |
|---|---|---|
| 1 | Conformation module | Absent entirely — not a stub. The event schema has no slot for it: KINDS = ('vet','buy','out'). |
| 2 | Photos | Absent; no <img> anywhere. Keeneland's feed media fields are 0% populated today. |
| 3 | Video | Absent; zero hits across the whole tree. |
| 4 | Notes / comments with autosave | Protocol-ready but UI-absent: the server accepts note[:280], the client's mark() never sends one, and there is no textarea and no autosave. |
| 5 | Prospect tick | Absent; only Vet list and Short list. |
| 6 | Purchased tab | Absent — no ownership %, no partners, no shipper, no dates. |
| 7 | Vet / repository panel | Absent; 'Vet list' is a tick, not a repository. No radiographs, no scope, no vet findings fields. |
| 8 | Consignor filter | Dead code: honoured in applyView() but there is no control in the DOM. |
| 9 | Broodmare-sire filter | Absent — a column and a search term only. |
| 10 | Per-hip URL / page | Absent; drawer only, and the hash does not change. |
| 11 | Per-person chips, removal-with-reason, the 40-entry audit trail, the twin public/team build, the sub-tabbed vet list | All 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.
| Table | Rows | What it is |
|---|---|---|
PEDIGREE_LINKS | 40,701,853 | Sire/dam edges. The single largest object in the estate. |
STARTERS | 1,609,270 | One row per runner per race. LAST_RACE_DATE is 0.0000% populated. |
HORSES | 1,190,432 | The horse dimension. FOAL_DATE is populated on 3 rows. |
DIM_HORSE | 1,153,270 | The reconciled horse dimension built by the identity lane. |
SPEED_FIGURES | 958,063 | Multi-source figures. 14,027 rows are dated in the future and 1,393 have a NULL race date. |
PRODUCE_RECORDS | 812,606 | Mare produce records. FOAL_GRADE is 100% NULL and was rejected as a source. |
PAST_PERFORMANCES | 672,686 | Past-performance lines — a two-year window only. |
SALE_ENTRIES | 488,349 | Auction lots. The comparables backbone of both sale sites. |
COVERINGS | 437,998 | Coverings. COVERING_DATE is empty; only COVERING_YEAR is usable. |
WORKOUTS | 367,860 | Published workouts. |
RACE_RESULTS | 205,211 | Result rows. |
RACES | 152,692 | Race header rows. |
NARC_RATINGS | 85,430 | North American Rating Committee ratings. |
SCRAPER_LOG | 26,285 | The 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.
| Empty table | What its emptiness costs |
|---|---|
EQUIPMENT_CODES | Equipment codes cannot be decoded. |
HORSE_REGISTRY | Superseded by HORSES / DIM_HORSE. |
NICK_RATINGS_INTL | The international nick lane never landed. |
OWNERS | Ownership joins return nothing, although STARTERS.OWNER_ID exists. |
P360_MATING_RESULTS | The Pedigrees360 mating lane never landed, although its sibling P360 tables did — and matings are what Resolute's own breeding decisions turn on. |
POINTS_OF_CALL | No running lines exist at all. Pace analysis is impossible. |
RACE_FRACTIONALS | No sectional times exist at all. Pace analysis is impossible. |
RESOLUTE_SALES | Resolute'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.
: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.
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.
| Lane | Status | Runs 24h | Rows written 24h | Runs 7d | Rows written 7d | Fetched 7d | Errors 7d | Days since last productive run |
|---|---|---|---|---|---|---|---|---|
allbreed-pedigree | DEAD | 95 | 0 | 671 | 0 | 25,498 | 3,408 | 24 |
brisnet | DEAD | 0 | 0 | 0 | 0 | 0 | 0 | never |
equibase_charts | DEAD | 0 | 0 | 0 | 0 | 0 | 0 | 27 |
equibase_results | DEAD | 0 | 0 | 0 | 0 | 0 | 0 | 29 |
equibase_workout_scraper | DEAD | 0 | 0 | 0 | 0 | 0 | 0 | 29 |
hkjc | DEAD | 1 | 0 | 7 | 0 | 63 | 0 | 11 |
pedigreequery | DEAD | 0 | 0 | 148 | 0 | 8,838 | 8,838 | 10 |
pedigreequery-pod@3ba95bcad588 | DEAD | 0 | 0 | 0 | 0 | 0 | 0 | 29 |
pedigreequery-pod@dff74ceec122 | DEAD | 0 | 0 | 0 | 0 | 0 | 0 | 29 |
pedigrees360 | DEAD | 1 | 0 | 7 | 0 | 7 | 7 | 34 |
racelens | DEAD | 0 | 0 | 0 | 0 | 0 | 0 | 28 |
ragozin | DEAD | 0 | 0 | 0 | 0 | 0 | 0 | never |
sl-race-scraper | DEAD | 0 | 0 | 0 | 0 | 0 | 0 | 48 |
thorograph | DEAD | 0 | 0 | 0 | 0 | 0 | 0 | never |
jbis | STALLED | 1 | 0 | 7 | 108 | 84 | 0 | 1 |
narc | STALLED | 96 | 0 | 672 | 60 | 4,012 | 130 | 3 |
equinedge | PRODUCING | 7 | 3,664 | 38 | 20,311 | 867 | 0 | 0 |
racingpost | PRODUCING | 1 | 490 | 7 | 3,245 | 333 | 0 | 0 |
hrn-results | PRODUCING | 1 | 209 | 7 | 1,301 | 70 | 0 | 0 |
horse_news | PRODUCING | 4 | 3 | 28 | 9 | 2,420 | 0 | 0 |
| Lane | Status | Runs 24h | Rows written 24h | Runs 7d | Rows written 7d | Fetched 7d | Errors 7d | Days since last productive run |
|---|---|---|---|---|---|---|---|---|
daily-freshness-audit | DEAD | 1 | 0 | 7 | 0 | 49 | 11 | never |
dedup | DEAD | 0 | 0 | 1 | 0 | 0 | 0 | never |
derived-produce | DEAD | 1 | 0 | 7 | 0 | 0 | 0 | 10 |
derived-inbreeding | PRODUCING | 1 | 379,614 | 7 | 2,657,298 | 0 | 0 | 0 |
identity.reconcile | PRODUCING | 48 | 239,746 | 336 | 1,673,478 | 1,675,432 | 0 | 0 |
derived-nicks-structure | PRODUCING | 1 | 117,162 | 7 | 820,134 | 0 | 0 | 0 |
completeness-audit-refresh | PRODUCING | 1 | 20 | 7 | 140 | 0 | 0 | 0 |
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.
How old the newest row is, per source, for the two data classes the sale sites and the analytics depend on.
| Source | Rows | Newest row | Days stale |
|---|---|---|---|
horseracingnation.com | 1,345 | 2026-08-14 | 1 |
racingpost.com | 37,566 | 2026-08-14 | 1 |
jbis.or.jp | 24 | 2026-08-13 | 2 |
racing.hkjc.com | 14,667 | 2026-07-15 | 31 |
netkeiba.com | 11,052 | 2026-07-10 | 36 |
drf.com | 52,052 | 2026-07-09 | 37 |
sportinglife.com | 24,877 | 2026-07-08 | 38 |
equibase.com | 4,924 | 2026-07-08 | 38 |
open-pmu-api | 3,760 | 2026-07-05 | 41 |
sportinglife | 1,229 | 2026-06-28 | 48 |
HRN | 275 | 2026-06-28 | 48 |
timeform.com | 616 | 2026-05-14 | 93 |
eprochasson/horserace_data | 305 | 1995-02-22 | 11,497 |
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.
| Source | Rows | Newest row | Days stale |
|---|---|---|---|
keeneland.com | 298,667 | 2026-04-24 | 113 |
inglis.com.au | 4,377 | 2026-03-01 | 167 |
arqana.com | 1,569 | 2026-01-01 | 226 |
goffs.com | 2,699 | 2026-01-01 | 226 |
tattersalls.com | 92,899 | 2025-10-01 | 318 |
fasigtipton.com | 73,020 | 2024-11-04 | 649 |
obssales.com | 11,533 | 2024-03-01 | 897 |
capethoroughbredsales.com | 3,585 | 2022-02-01 | 1,656 |
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.
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 document | Open items | What is counted |
|---|---|---|
| Data Extraction Completion List Data-Extraction-Completion-List.html | 21 | numbered 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 | 23 + 11 | numbered 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 | n/a | a 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.
| Bug | Severity | What it is |
|---|---|---|
BUG-20260812-0012 | P2 / HIGH | The 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-0013 | P2 / HIGH | RESOLUTE_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-0014 | P3 / MEDIUM | A 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-0017 | P1 / CRITICAL | The 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.