Howth Yacht Club club-racing reference data, a maintained capture of the
club's published results site, and the as-published ingest pipeline that
feeds that history into Sail Scoring — kept out of
the app repo, where reference/data/ is for small illustrative fixtures.
It is the HYC counterpart of the sibling dbsc-archive
and iodai-archive repos, and
the first archive built natively on the as-published model (app ADR-010,
docs/design/decisions/010-as-published-archives.md): the originally-published
results are ingested and displayed faithfully — structured ranks plus verbatim
display cells — never re-scored.
📋 CLARIFICATIONS.md — known coverage gaps and approximations between the archive and the original published record.
The payoff is the cross-series identity and ranking work on the Sail Scoring
horizon (docs/design/horizon.md in the app repo — the competitor-identity
spine, the workspace season ladder, the per-competitor multi-year career-arc
page). Those features only come alive with years of real history in one
workspace, and HYC's multi-season club racing — Howth 17s, Puppeteers, Squibs,
cruisers under HPH/IRC, dinghies — is exactly that fuel.
It also keeps a bulky scraped corpus (~70 MB of published HTML and PDFs) out of the app repo.
2026-club-racing/ HYC's 2026 spring/summer reference data (see its README)
halsail-2025/ Puppeteer pilot — HalSail-import CSVs + build guide
scripts/
ftp-paths.ts resolve the catalogue → JSON for the app's update-ftp-paths
emit-as-published-config.ts admin CSVs + capture → as-published.config.json
admin/ hyc.ie admin scrapers (the capture tooling, from reshyc)
sources/
reshyc/ the published results-site capture (see SOURCES.md)
results.hyc.ie/reshyc/ the FTP-site backup, seasons 2011–2026
admin/ per-year (event, class) → page catalogues, with the
display names the club published under
summaries/ yearly prize-winner summary PDFs, 1996–
Makefile the capture targets: backup / admin-backup / summaries-backup
as-published.config.json generated ingest config (committed; input to the app's
archive-generate)
as-published-skips.json series the archive-kit can't ingest yet, with reasons
.github/workflows/
backup-ftp.yml daily FTP-site capture → PR → auto-merge
backup-admin.yml daily admin-DB capture → PR → auto-merge
backup-summaries.yml on-demand summaries capture → PR → auto-merge
as-published.yml emit → generate → push to the hyc workspace (gated)
The capture automation moved here from markmc/reshyc
(which pre-dates Sail Scoring); the origin repo retains the pre-2026 history.
- Capture — daily workflows mirror the FTP results site and the admin DB
into
sources/reshyc/(verbatim, third-party, never edited). - Emit —
pnpm emit-as-publishedjoins the admin catalogues (display names) to the captured pages: one as-published series per (year, club/open, event), one fleet page per class at/p/hyc/{year}/{event}/{class}, with deterministic UUIDv5 series ids that can never re-mint. Coverage gaps are reported, never papered over. - Ingest — CI checks out the app repo, runs
pnpm archive-generateover the config (parsing the Sailwave HTML), and pushes the documents withpnpm cli as-published push … --workspace hyc, authenticated by a workspace- and capability-scoped archivist token. Ingest is idempotent — unchanged documents are no-ops by content hash. Not yet armed: the push step is skipped untilSAILSCORING_ARCHIVIST_TOKENis configured.
Currently: 371 series / 1,312 fleet pages / ~15,000 competitor rows across 2013–2025 emit and generate cleanly; see CLARIFICATIONS.md for what doesn't (and why).
This repo assumes the sibling app checkout exists at ../sailscoring. Two
things deliberately stay in the app, next to the code they document:
- the Sailwave importer behaviour reference
(
../sailscoring/docs/notes/sailwave/import-behaviour.md) — it documents shipped behaviour oflib/sailwave-import.ts; - the NHC1 reverse-engineering write-up
(
../sailscoring/docs/notes/sailwave/nhc1-reverse-engineering.md) — distilled docs; it points back at the.xls/.pysources here.
The as-published toolkit (parsers, generator, ingest client) lives in the app's
lib/archive-kit/ and is driven from here via config; the generic FTP-path
threading also lives in the app (../sailscoring/scripts/update-ftp-paths.ts),
with scripts/ftp-paths.ts here as the HYC-specific caller.
- ✅ Reference data + reshyc capture vendored (this extraction, app issue #233).
- ✅ Capture automation (FTP, admin DB, summaries) moved here from reshyc.
- ✅ As-published config emission + clean
archive-generaterun over 2013–2025. - ⬜ Arm the ingest: provision the hyc workspace archivist token and CI secrets.
- ⬜ Extend coverage: single-race pages (the skip-list); the ~1,170 captured
pages the admin catalogue never linked (all of 2011–2014 plus later
revision/overall pages), which need display names sourced some other way;
the identity manifest; prize-winner (summaries/) data — mirror
dbsc-archive's
yearbook/. - ⬜ Thread the 2026 live-series FTP paths into the HYC workspace.
Our own code and derived artifacts are MIT (LICENSE); normalised
data we produce is CC0 (LICENSE-DATA). The verbatim captured
pages and PDFs under sources/reshyc/ are third-party HYC output, kept for
reproducibility and not relicensed.