Behind the data
How the archive behind the rankings was built, how much of each regatta it covers, which consistency checks it fails and where, and the assumptions it rests on. The methodology page explains how ratings are computed from it.
From web pages to results
Results are collected only from original sources: organizers, timing vendors, governing bodies and clubs. 1,615 URLs were found; 607 were catalogued as results pages, of which 589 could be fetched and 14 could not (4 skipped as out of scope). They yielded 539 distinct files (74 were copies of another file), and 477 of those parsed into 18,625 races and 100,595 crew results, 97,707 of them with a finish time.
3 of the results files were downloaded by hand from pages the fetcher cannot reach (live-results sheets, file viewers) and are recorded with the page they came from; they hold 453 crew results and appear as "manual" in the diagram.
Funnel table (85 flows)
| From | To | Count |
|---|---|---|
| Parser family: alkame | Edition status: parsed | 57 |
| Parser family: csv blocks | Edition status: parsed | 20 |
| Parser family: dbc htm | Edition status: parsed | 9 |
| Parser family: csv cards | Edition status: parsed | 4 |
| Parser family: event blocks | Edition status: parsed | 13 |
| Parser family: dbbc grid | Edition status: parsed | 103 |
| Parser family: team place html | Edition status: parsed | 3 |
| Parser family: jy html | Edition status: parsed | 13 |
| Parser family: lane grid | Edition status: parsed | 5 |
| Parser family: lane grid | Edition status: partial | 5 |
| Parser family: ordered list | Edition status: parsed | 80 |
| Parser family: ordered list | Edition status: partial | 2 |
| Parser family: placings sheet | Edition status: parsed | 25 |
| Parser family: club pdf heats | Edition status: parsed | 40 |
| Parser family: dbc pdf | Edition status: parsed | 7 |
| Parser family: gwn pdf | Edition status: parsed | 50 |
| Parser family: gwn pdf | Edition status: partial | 3 |
| Parser family: race cards | Edition status: parsed | 12 |
| Parser family: race rows | Edition status: parsed | 1 |
| Parser family: racegrid html | Edition status: parsed | 12 |
| Parser family: results of racing | Edition status: parsed | 1 |
| Parser family: standings | Edition status: found | 1 |
| Parser family: standings | Edition status: partial | 2 |
| Parser family: alkame | Edition status: parsed | 4 |
| Parser family: crash | Edition status: found | 3 |
| Parser family: not results | Edition status: parsed | 12 |
| Parser family: ocr low quality | Edition status: ocr low quality | 2 |
| Parser family: ocr needed | Edition status: found | 1 |
| Parser family: unknown | Edition status: found | 31 |
| Parser family: unknown | Edition status: partial | 6 |
| Parser family: titled list | Edition status: parsed | 6 |
| Parser family: titled list | Edition status: partial | 2 |
| Parser family: two lane | Edition status: parsed | 3 |
| Parser family: two lane | Edition status: partial | 1 |
| Fetched: ok | Parser family: alkame | 57 |
| Fetched: ok | Parser family: csv blocks | 20 |
| Fetched: ok | Parser family: dbc htm | 9 |
| Fetched: ok | Parser family: csv cards | 4 |
| Fetched: ok | Parser family: duplicate | 74 |
| Fetched: ok | Parser family: event blocks | 13 |
| Fetched: ok | Parser family: dbbc grid | 103 |
| Fetched: ok | Parser family: team place html | 3 |
| Fetched: ok | Parser family: jy html | 13 |
| Fetched: ok | Parser family: lane grid | 10 |
| Fetched: ok | Parser family: ordered list | 82 |
| Fetched: ok | Parser family: placings sheet | 25 |
| Fetched: ok | Parser family: club pdf heats | 40 |
| Fetched: ok | Parser family: dbc pdf | 7 |
| Fetched: ok | Parser family: gwn pdf | 53 |
| Fetched: ok | Parser family: race cards | 12 |
| Fetched: ok | Parser family: race rows | 1 |
| Fetched: ok | Parser family: racegrid html | 12 |
| Fetched: ok | Parser family: results of racing | 1 |
| Fetched: ok | Parser family: standings | 3 |
| Fetched: ok | Parser family: alkame | 4 |
| Fetched: ok | Parser family: crash | 3 |
| Fetched: ok | Parser family: not results | 12 |
| Fetched: ok | Parser family: ocr low quality | 2 |
| Fetched: ok | Parser family: ocr needed | 1 |
| Fetched: ok | Parser family: unknown | 37 |
| Fetched: ok | Parser family: titled list | 8 |
| Fetched: ok | Parser family: two lane | 4 |
| Catalogued as: results | Fetched: http 4xx | 14 |
| Catalogued as: results | Fetched: ok | 589 |
| Catalogued as: results | Fetched: skipped | 4 |
| Found by: catalog override | Catalogued as: results | 3 |
| Found by: catalog override | Catalogued as: review | 1 |
| Found by: manual | Catalogued as: results | 3 |
| Found by: seed crawl | Catalogued as: not results | 52 |
| Found by: seed crawl | Catalogued as: results | 243 |
| Found by: seed crawl offsite | Catalogued as: index | 88 |
| Found by: seed crawl offsite | Catalogued as: not results | 75 |
| Found by: seed crawl offsite | Catalogued as: results | 11 |
| Found by: seed crawl page | Catalogued as: index | 95 |
| Found by: seed crawl page | Catalogued as: not results | 77 |
| Found by: seed crawl page | Catalogued as: results | 108 |
| Found by: seed crawl page | Catalogued as: review | 16 |
| Found by: seed known | Catalogued as: results | 7 |
| Found by: wayback cdx | Catalogued as: index | 64 |
| Found by: wayback cdx | Catalogued as: not results | 364 |
| Found by: wayback cdx | Catalogued as: results | 144 |
| Found by: wayback cdx | Catalogued as: review | 147 |
| Found by: wp media | Catalogued as: not results | 28 |
| Found by: wp media | Catalogued as: results | 88 |
| Found by: wp media | Catalogued as: review | 1 |
Coverage by event and year
The coverage register lists every edition of every event the project knows of, with how far its results got: 331 of 566 editions across 62 events are parsed. Events are sorted by parsed editions. A blank cell is a year with no known edition; hover or focus a cell for its detail.
- PA: parsed: results in the archive (331)
- PT: partial: some of the results parsed (6)
- FD: found: results located, not parsed yet (30)
- SU: summary only: no race-level results published (1)
- OC: scanned, OCR too poor to parse (2)
- NF: searched, no results found (89)
- NS: not yet searched (105)
- NH: not held (2)
| Event | 1989 | 1990 | 1991 | 1992 | 1993 | 1994 | 1995 | 1996 | 1997 | 1998 | 1999 | 2000 | 2001 | 2002 | 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 | 2026 | no year |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| concord-pacific | NF | NF | NF | NF | NF | NF | NF | NF | NF | NF | NF | NF | NF | NF | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | NS | PA | PA | PA | PA | PA | PA | |
| ottawa-dbf | PA | PA | PT | PA | PA | PA | PA | NS | PA | PA | PA | PA | PA | PA | PA | PA | NS | NS | PA | PA | PA | PA | PA | ||||||||||||||||
| tidbrf | NS | NS | NS | NS | NS | NS | NS | NS | NS | NS | NS | NS | NS | NS | NS | PA | NF | PA | PA | PA | PA | NF | PA | PA | PA | PA | PA | PA | NF | PA | PA | NS | NS | PA | PA | PA | PA | PA | |
| halifax-manulife | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | ||||||||||||||||||||||
| penticton | NS | NS | NS | NS | NS | NS | NS | NF | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | NS | NS | PA | PA | PA | PA | PA | ||||||||||||
| dbc-nationals | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | |||||||||||||||||||||||
| pickering | PA | NF | PA | PA | PA | PA | PA | PA | NF | PA | PA | PA | PA | PA | PA | PA | PA | PA | |||||||||||||||||||||
| lachine | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | ||||||||||||||||||||||||||
| coupe-du-quebec | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | |||||||||||||||||||||||||||
| pickering-youth | PA | PA | PA | PA | PA | NF | PA | PA | PA | PA | PA | PA | |||||||||||||||||||||||||||
| dz-500 | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | |||||||||||||||||||||||||||||
| dz-youth-regatta | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | |||||||||||||||||||||||||||||
| richmond-steveston | PA | PA | PA | PA | PA | PA | PA | PA | PA | PA | |||||||||||||||||||||||||||||
| calgary | FD | NS | FD | FD | PA | NF | NF | NF | NF | NF | NF | NF | NF | NF | NF | PA | PA | PA | NS | NS | PA | PA | PA | PA | PA | ||||||||||||||
| montreal-challenge | PA | PA | PA | PA | PA | PA | PA | PA | PA | ||||||||||||||||||||||||||||||
| gwn-challenge | NS | NS | NS | NS | NS | NS | NS | NS | NS | NS | NS | NF | NF | PA | PA | NF | NF | NF | NF | NF | NF | PA | PA | NF | NS | NS | PA | PA | NF | PA | PA | ||||||||
| gwn-chicago | PA | PA | PA | PA | PA | PA | PA | PA | |||||||||||||||||||||||||||||||
| gwn-mercer | PA | FD | FD | FD | PA | PA | PA | PA | PA | PA | PA | ||||||||||||||||||||||||||||
| dz-spring-sprint | PA | PA | PA | PA | FD | PA | PA | PA | |||||||||||||||||||||||||||||||
| christie-lake | PA | PA | PA | PA | PA | PA | |||||||||||||||||||||||||||||||||
| gwn-sarasota | PA | PA | PA | PA | FD | PA | PA | ||||||||||||||||||||||||||||||||
| gwn-sport-regatta | PA | PA | PA | PA | PA | PA | |||||||||||||||||||||||||||||||||
| hamilton-waterfest | FD | PA | PA | PA | PA | PA | PA | ||||||||||||||||||||||||||||||||
| milton | NS | PA | PA | PA | PA | PA | PA | ||||||||||||||||||||||||||||||||
| port-perry | PA | PA | PA | PA | PA | PA | |||||||||||||||||||||||||||||||||
| dz-fall-classic | PA | PA | PA | PA | PA | ||||||||||||||||||||||||||||||||||
| gwn-orlando | PT | PA | PA | PA | PA | PA | |||||||||||||||||||||||||||||||||
| edmonton | NS | PA | NF | NF | NF | NF | NF | NF | NF | NF | SU | NF | NF | NF | NF | NF | PA | PA | PA | ||||||||||||||||||||
| gwn-ridbf | PA | PA | PA | PA | |||||||||||||||||||||||||||||||||||
| hope-floats | PA | PA | PA | PA | |||||||||||||||||||||||||||||||||||
| regina | PA | PT | PA | FD | PA | PT | PA | OC | FD | ||||||||||||||||||||||||||||||
| h2o-open | PA | PA | PA | ||||||||||||||||||||||||||||||||||||
| pan-am-ccc | PA | PA | PA | NS | |||||||||||||||||||||||||||||||||||
| victoria | PA | PA | PA | NF | NS | NF | NF | NF | NF | NF | NF | NF | NF | NF | NF | NF | NF | NF | NF | NF | NF | NF | NF | ||||||||||||||||
| can-am-ccc | PA | PA | |||||||||||||||||||||||||||||||||||||
| gwn-kcdbf | PA | PA | |||||||||||||||||||||||||||||||||||||
| gwn-nyc | PA | PA | |||||||||||||||||||||||||||||||||||||
| lethbridge | NF | PA | PA | ||||||||||||||||||||||||||||||||||||
| okanagan-super-sprints | FD | NS | FD | FD | NS | FD | FD | FD | FD | FD | FD | NS | NS | NS | NS | NS | FD | PA | PA | ||||||||||||||||||||
| vernon | NS | PA | PA | FD | NS | FD | NF | NF | FD | NS | NS | FD | FD | NF | NS | NS | |||||||||||||||||||||||
| dz-oddball-2k | PA | ||||||||||||||||||||||||||||||||||||||
| harrison | NS | NS | NS | NS | NS | NS | NS | NS | NS | NS | NS | NS | NS | NS | NS | NS | NS | NS | NF | NF | NF | PA | |||||||||||||||||
| kamloops | PA | ||||||||||||||||||||||||||||||||||||||
| kelowna | PA | OC | PT | ||||||||||||||||||||||||||||||||||||
| osoyoos-flag-race | PA | ||||||||||||||||||||||||||||||||||||||
| ottawa-ice-dragon | PA | ||||||||||||||||||||||||||||||||||||||
| winnipeg-september | PT | PA | NS | ||||||||||||||||||||||||||||||||||||
| alberta-long-tail | NS | ||||||||||||||||||||||||||||||||||||||
| atlantic-long-tail | NS | ||||||||||||||||||||||||||||||||||||||
| barrie | NS | ||||||||||||||||||||||||||||||||||||||
| dbc-race-series | NS | ||||||||||||||||||||||||||||||||||||||
| gwn-other | NS | ||||||||||||||||||||||||||||||||||||||
| idbf-champs | NS | ||||||||||||||||||||||||||||||||||||||
| manitoba-school | NS | ||||||||||||||||||||||||||||||||||||||
| montreal-festival-historic | NS | ||||||||||||||||||||||||||||||||||||||
| ontario-long-tail | NS | ||||||||||||||||||||||||||||||||||||||
| shuswap | FD | NF | FD | FD | FD | NH | NH | NF | NF | NF | NF | NF | NF | NF | NF | ||||||||||||||||||||||||
| sudbury | NS | NS | NS | NS | NS | NS | NS | ||||||||||||||||||||||||||||||||
| sydenham-challenge | NS | NS | NS | ||||||||||||||||||||||||||||||||||||
| triple-crown-qc | NS | ||||||||||||||||||||||||||||||||||||||
| winnipeg | NS | NS | |||||||||||||||||||||||||||||||||||||
| woodstock | NS |
Consistency checks
Every build counts the rows that break one of these invariants. Each count has a ceiling it may not rise above without a logged decision, so the archive can only get cleaner. Races that fail I3, I6 or I12 are kept on their event page but left out of the ratings (see which races count).
| ID | Violation | Rows | Editions | Top editions |
|---|---|---|---|---|
| I1_time_in_name | team_name holds a finish time anywhere (H:MM:SS / M:SS.ff / M:SS.fff) | 0 | 0 | - |
| I2_rule_as_crew | team_key is progression or heading text (fastest, from race, advances, ...) or a bare division word | 25 | 5 | gwn-sarasota-2023 (8), dbc-nationals-2007 (7), pickering-2013 (5) |
| I3_empty_result | race_level entry with no time, no place and nothing printed in the time column (status NULL, or NO_RESULT from a blank time_raw) | 1,409 | 66 | concord-pacific-2023 (254), concord-pacific-2025 (214), coupe-du-quebec-2024 (167) |
| I4_edition_id | edition_id is not <event_id>-<4-digit year>, or event_id itself contains a 4-digit year | 0 | 0 | - |
| I5_time_range | time_ms outside the plausible band for the race distance (200 m 0:30-4:00, 250 m 0:35-5:00, 500 m 1:20-7:00, 1000 m 3:00-12:00, 2000 m 7:00-25:00) | 106 | 27 | gwn-challenge-2026 (16), dz-oddball-2k-2022 (11), montreal-challenge-2024 (11) |
| I6_place_order | within a race, a place repeated more than twice, or a place greater than the number of entries | 1,412 | 58 | ottawa-dbf-2006 (157), ottawa-dbf-2005 (140), ottawa-dbf-2018 (120) |
| I7_blank_name | team_key blank or NULL | 21 | 9 | montreal-challenge-2013 (7), dbc-nationals-2015 (4), gwn-orlando-2019 (3) |
| I8_footnote_in_name | team_raw holds penalty/bonus footnote text (penalty, bonus for, impeded, interference, second credit, ...) | 2 | 1 | ottawa-dbf-2014 (2) |
| I9_doubled_glyphs | team_name holds fake-bold doubled glyphs (three doubled letters in a row, '::', or a time with 4+ decimals) | 0 | 0 | - |
| I10_glued_text | team_name over 70 characters or holding instruction text (determines N, start first, minute gap, +N sec, Race N:, turn left/right, merge onto, Rang Équipe, ...) | 1 | 1 | halifax-manulife-2009 (1) |
| I11_club_wrap | club cell is a bare continuation word (Club, Centre, ...), or the team name ends with the first words of a club printed in the same edition (a two-line club read into the crew name) | 5 | 2 | tidbrf-2004 (3), dbc-nationals-2018 (2) |
| I12_split_places | race not marked combined in which a printed place is shared by finishers whose times differ by more than 0.5 s (divisions ranked separately inside one race) | 320 | 65 | can-am-ccc-2024 (50), dbc-nationals-2014 (32), gwn-mercer-2017 (29) |
| I13_short_key_span | short crew key (digits, or 1-2 letters and at most one digit) whose team_id spans more than one province (or, for events without a single province, more than one edition) | 0 | 0 | - |
| I14_bib_prefix_split | in a bib-printing file, team_name '<token> <rest>' whose <rest> is printed with the same bib in the same edition under another team_id (a division/progression code or seed read into the name) | 13 | 2 | can-am-ccc-2026 (8), gwn-challenge-2010 (5) |
| I15_place_time_order | timed, placed race (3+ entries, not combined) in which more than n // 2 pairs of crews have their place order reversed against their time order (places read from another column) | 155 | 58 | dbc-nationals-2014 (21), can-am-ccc-2024 (17), gwn-mercer-2017 (9) |
| I16_team_twice_in_race | entry whose team_id holds more than one entry in its race, any status (two crews merged into one team, a heading or same-name crew keyed alike, or a row the parser duplicated); C57, D80 | 41 | 15 | lachine-2014 (6), ottawa-dbf-2024 (4), richmond-steveston-2023 (4) |
Assumptions
Values the data relies on that no source prints, each with its basis, where it applies, how confident the project is and what would make it revisit the assumption. Process decisions are logged separately and are not listed here.
| ID | Assumption | Basis | Applies to | Confidence | Revisit if | Status | Source |
|---|---|---|---|---|---|---|---|
| A1 | The Ottawa live Google Sheets with no printed year are 2026 results. | The Ottawa page already announces the 2027 dates; the raw snapshot is dated 2026-11-07. | ottawa 2026 published-sheet tabs (catalog year 2026). | high | The sheets are overwritten in 2027 (keep the 2026-11-07 snapshot). | active | owner 2026-11-07 |
| A2 | Regina crews printed only as entry codes (AMR 1, S101, W3) are kept as event-scoped identities: they race within their own edition, never merge with a team in another edition, and a code is never guessed to be a team name. | No code-to-name key exists on reginadragonboat.com or in Wayback copies. Safe; loses cross-event linkage for those crews. | regina 2013, 2014 (sprint and heats), 2017 (lane_grid, D15). Implemented in T6. | high | Team lists are obtained from the organizer (keep on the outreach list). | active | owner 2026-11-07 |
| A3 | The Lachine course is 200 m. | Winning times of 0:48–0:58 match 200 m standard-boat times. No file prints the distance. | All lachine races 2008–2024 with no printed distance: default_distance_m: 200 in sources.yaml, distance_inferred = TRUE. | medium | Mission Dragon Boat or another source states a different course length. | active | owner 2026-11-07 |
| A4 | Halifax times printed as SS:FF with SS ≥ 30 are seconds and hundredths ("55:27" = 55.27 s), and plain seconds ≥ 60 are m:ss ("65.38" = 1:05.38). Rewritten in time_raw with a warning. | Read as minutes, SS:FF ≥ 30 would be implausibly slow for a 200–500 m race; plain seconds ≥ 60 can't be parsed as printed. Both styles appear in the same files (D12). | halifax event_blocks / team_place_html files. | high | A Halifax file states its time format differently. | active | D12 |
| A5 | The Ottawa 2013 alumni sheet's SS:FF times are seconds and hundredths ("26:24" = 26.24 s). Rewritten with a warning. | Same reasoning as A4: read as minutes the times would be implausible for a sprint. | ottawa 2013 alumni sheet (titled_list). | high | A source prints a different reading. | active | D19 |
| A6 | When no place is printed, or printed ranks are ambiguous (repeat within one race), place is the rank by finish time (confidence = inferred). | Finish order by time is what places mean when crews race the same distance together. | lane_grid (Regina, D15); race_cards cards with repeated ranks (D16); titled_list (D19); race_rows (D19); csv_cards ambiguous lane splits (D20). | high | A file shows places that disagree with time order (penalties, adjustments). | active | D15, D16, D19, D20 |
| A7 | When a list has no place column, the printed row order is the finish order (confidence = inferred). | Parsed as finish-order lists in D5, D14 and D19; the sources print no place, so the order is the only signal. | ordered_list (D14) rows without a printed place; csv_blocks tables with no rank column; titled_list lists with neither lane header nor rank; standings pseudo-races (D5). | medium | A source lists crews in lane or draw order instead. | active | D5, D14, D19 |
| A8 | Ottawa 2016 charity places are re-derived from the on-water time, not the printed "adjusted time including fundraising incentive". | The adjusted ranking is not a race result; the on-water time is. | ottawa 2016 charity finals (titled_list). | high | The project decides fundraising-adjusted standings should be kept. | active | D19 |
| A9 | 09:99.99 and 09:95.95 are timing placeholders meaning no time (NT), not real times. | No crew takes ~10 min over a sprint course; the values recur as fillers. | Ottawa 2025–26 Saturday sheets (ordered_list), 2026 charity challenge cup (race_rows), csv_blocks. | high | A sheet uses these values as real times. | active | D14, D19 |
| A10 | "DNC" (did not compete) is the same as DNS. | The Can-Am sheet's own note defines DNC as did not compete. | csv_cards (Can-Am 2026). | high | A source distinguishes DNC from DNS in a way that matters for ratings. | active | D20 |
| A11 | Printed Can-Am times already include penalties (footnote stars are stripped). | D20 reading of the sheet: the stars are penalty footnotes and the printed times are taken as final. Not confirmed by the organizer. | csv_cards (Can-Am 2026). | medium | The organizer publishes raw times plus penalties separately. | active | D20 |
| A12 | When neither the file name, link text nor URL path has a year, the year comes from the page the link was found on. | Ottawa posts year-less files (/media/342461/sunday-race-results.pdf) from per-year pages (/teams/race-results/2019.aspx). | _year() fallback in ingest/catalog.py. | medium | A source page links files from other years. | active | D7 |
| A13 | A race with no printed distance gets its event's default_distance_m (distance_inferred = TRUE). | Events that run a single course length. | dz-500 (500 m), dz-oddball-2k (2000 m), lachine (200 m, A3). Applied in build_db.race_distance; a race_overrides.yaml entry beats both the printed value and the default (D82). | medium | A race in those events is printed at another distance (the printed value always wins). | active | D6, D82 |
| A14 | A club acronym (PDBC, FCRCC, 22D …) names the club whose full name is printed beside it, and only that club; trailing age, gender, tier and boat-size words (Snr B Mixed, Premier, SM, _10, PM2) name a crew of the club, not a different club. Used for teams.club_id only, never to merge teams. | ingest/normalize/club_aliases.yaml: each acronym is expanded only when a source prints it in the team name with the full name in the club column (or in the same club column); 32 rows, cited by edition. Acronyms with conflicting evidence (CSBD, MDBC, SNS) stay unexpanded. Suffix words: Pan Am CCC names (Pickering DBC Snr B Mixed), DBC Nationals 2025 SM crews in boat_size = small races. | ingest/identity.py club_match_keys (C5); all teams with a club. | medium | A source shows one acronym used by two clubs, or a suffix word that is part of a club's name. | active | D40 |
| A15 | A trailing class suffix of a crew name (Snr B Mixed, U21 Open, Masters C Women, 60+ women) is the crew's age and gender class: Snr/Senior/Sr/Masters + letter A-D = senior_a-d, 40+/50+/60+/70+ = senior_a-d, bare Masters = senior_a, Junior/Jr = u18, U<nn> = u<nn>, Men = open; a bare Senior gives no age. Used only where the race prints no class for that field. | pan-am-ccc-2019 pages print the class beside each crew and in the race's left margin (U16, Snr C, U21 for race 1) while the title reads only "Mixed"; crews keep the same suffix across rounds. The letter and + mappings follow AGE_RULES for race titles. | normalize.rounds.class_suffix / entry_class in build_db (entries.age_group, gender_class, class_suffix); teams.age_group. 2,059 entries take their age class from a suffix. | medium | A source shows Masters C or a bare Senior meaning another age band, or a suffix that is part of a club's name. | active | D55 |
| A16 | A race with no printed or default distance is in the sprint bucket (≤ 500 m) when its winning time is under 4:00, else in the long bucket (≥ 1000 m); a race with neither distance nor time takes its edition's majority bucket. | DB winning times: 99th percentile 2:38 for 200 m and 3:09 for 500 m races, 1st percentile 4:12 for 1000 m. Null-distance winners cluster at 0:30–3:30 and 8:00–12:30, with 24 races between 3:30 and 8:00. | Rating pools in ratings/data.py (R1, D67): 7,972 rating races bucketed by winning time, 8 by edition majority (reports/ratings/events.md). | medium | A source prints a distance that contradicts the bucket, or 1000 m races under 4:00 appear (fast small-boat 1000 m). | superseded by A19 (D78) | D67 |
| A17 | A race with no printed boat size is a standard (20-seat) boat race. | Small-boat races are labelled (Small, Petit, SB, 10s) wherever the DB marks them (487 races since C71, D102: the bare word in a race title counts, 316 before); standard is the festival default in every series the DB covers. A title naming both sizes is mixed (22 races) and not rated, so the assumption no longer covers it. Known gaps: a small crew entered in a standard division is rated there (hamilton-waterfest-2023, 8 races; C73), and 6 dbc-nationals-2023 races under a stray "Small" section line have no size word of their own. | Rating pools in ratings/data.py (R1, D67): races with boat_size NULL go to the standard_* pools (17,234 races). | medium | An event runs only small boats without printing it (a small-boat regatta or festival). | active | D67, D102 |
| A18 | An edition with no start_date is dated 1 July of its year for rating order (the year's midpoint, phase_2_SPEC §2). | No edition in the DB has a start_date (0 of 314). | Rating event timestamps in ratings/data.py (R1, D67): every rating race today. Editions sharing a date interleave by race order. | low | Edition dates are filled (MP task R1b): the within-year order of events then comes from the dates. | active | D67 |
| A19 | A race with no printed or event-default distance is rated at the distance its winning time points to: 35 s to under 62 s → 200 m; 1:40 to under 4:00 → 500 m; 7:00 or more → 2000 m. Any other winning time, or none, leaves the race unrated (distance_unknown). An event default (A13) is a distance and always comes first. | Validated (D79) on Canadian races that print their distance, defaults excluded (data.band_validation, generated in reports/ratings/events.md): 200 m band 96.2 % raw / 98.4 % clean (1,715 races; misses: 26 races at 250 m, 1 at 175 m); 500 m band 94.0 % raw / 100 % clean (2,609); 2000 m band 97.7 % raw / 99.7 % clean (296). 'Clean' left out 214 printed distances the winning time rules out (200 m in 1:40+, 500 m under 1:15 or 7:00+): TIDBRF 2019/2023-2026 and GWN 2018 '200 m' at about 2:15, Nationals 2023 '500 m' at 43-57 s, Pan Am 2015 '500 m' at 10 min. C59 (D82) traced them to the parser (section headings swallowed into the block above), to labels naming two distances ("500m + 2000m": such a label now gives no distance, so A19 decides) and to one misprint; after it, raw accuracy is 98.45 / 100 / 99.3 % and the one race left (gwn-challenge-2026 race 37, placeholder times) is kept as printed with its reason in race_overrides.yaml. The first band (under 1:15, D78) was 84.5 % / 93.0 %: 100 m super sprints (Ottawa, winners 20-34 s) and 250 m races (59-74 s) fell in it, so D79 narrowed it to 35-62 s, the widest range at ≥ 98 % clean. Owner chose winning-time inference over excluding null-distance races (D78). | ratings/data.py rated_distance (DATA_VERSION 3): 7,699 of 13,006 rating races take their distance from the winning time (D82); 393 null-distance races are distance_unknown. | medium | A clean accuracy drops below 98 % in the generated validation; a series with unlabelled 100 m, 250 m or 1000 m races is added; a keep_printed reason in race_overrides.yaml turns out wrong. | active | D78, D79, D82 |
| A20 | The leaderboard floor is the 10th percentile (rounded down) of the Nationals crews' rated regattas and rated races in the season at any rated distance (D79: all-distances activity), with an absolute minimum of 2 regattas and 6 races; seasons without Nationals inherit the last earlier floor. It applies to every view, judged on the crew's all-distances activity; a view also needs 3 rated races in it. | Owner decisions D78 §7 and D79 §1: a crew is ranked when it raced at least as much as the least-active crews at that season's Canadian National Championships. In the data every season's computed floor is at or below the minimum (most Nationals crews appear at one regatta a season), so 2 regattas / 6 races applies throughout (reports/ratings/eligibility.md, 2026-11-09). | ratings/ranking.py season_floors, eligible, MIN_VIEW_RACES; meta.json eligibility; ranked standard_all 264, standard_500 262, standard_200 235, standard_2000 4, small-boat views 0 (D79). | medium | It ranks too few crews in a view (today: every small-boat view), or coverage per season grows so the computed floor rises above the minimum (C58 may link Nationals crews to their other regattas). | active | D78, D79 |
| A21 | dragonboat.net/media/675699/sunday-race-results.pdf is the 2024 Ottawa Sunday results (the file prints no year). | PDF created 2024-06-28 (the festival ran June 21-23, 2024); a crew named "2024: A Space ODC"; linked as "SUNDAY RACE RESULTS" from raceresults.aspx in the Wayback captures of 2024-08-11 and 2024-11-03; its divisions and crews match the 2024 Saturday file. | ottawa-dbf 2024 Sunday races (catalog_overrides.yaml, 48 races). | high | The festival re-links or re-labels the file, or a different 2024 Sunday file appears at media/675696. | active | D100 |
| A22 | Every race on a Manitoba Paddling Association "Upstream / Down Stream" sheet is a pursuit-format race, including the 2023 finals sheet, which does not print the word. | The 2024 September sheet is headed "Sunday September 8th, 2024 - PURSUIT" over its rounds and finals; the 2023 totals sheet (Sept DB Results 2.pdf) names the two rounds "Pursuit 1" and "Pursuit 2"; the 2023 finals sheet has the same two-boat Upstream / Down Stream columns and "Nth fastest in ..." seeding from those rounds. | winnipeg-september 2023-2024: section "Pursuit ..." on 72 races (two_lane), so relay_or_pursuit leaves them unrated. | medium | MPA describes the September format (side-by-side lanes would make them ordinary two-boat races), or G10 parses the 2026 sheet and finds a different heading. | active | D104 |
| A23 | A club's home province is the one club_provinces.yaml gives it, or, for a club not listed there, the province where all of its crews race mostly, when there are enough of them: two for a club a sheet prints in a club column, three for a club that is only a shared beginning of crew names, and crews at two or more US regattas for a US club (D131). Any other club has no province. | No results sheet prints a club's province. Register entries (59) rest on a place in the club's own name (Pickering, Edmonton, Calgary, Fort Langley, Toronto, Vermont, NYC), on what the sheets print beside the name ("Dragnum - Dragon Boat Calgary", "Dasa/Lethbridge", "Catch22 Racing Ltd (New York)"), or on a clear majority of crews for a name that is one club (22Dragons 223 of 232 in QC). The all-crews-agree case holds for 618 clubs (845 before D131: two crews sharing a first word, or one visit to a US regatta, proved thin: "Dragonflies", "Toba"). | The province shown for 4,561 crews (home_province_basis club), the Canadian-home rule (D78) and the province floor. | medium | A club moves, a listed name turns out to cover two clubs, or a source that prints club addresses is found (a governing body's club list). | active | D121, D131 |
This build
Built from commit 512abfd, data as of : 100,595 crew results in 18,625 races across 337 editions; 15,104 races and 81,429 results feed the ratings of 11,697 crews.