First release: public UFCStats fight pages as flat typed dataset rows, one row
per fight, fighter and round.
- One row per (fight, fighter, round), plus one optional fight-level
scope: "total" row per fighter, with 45 typed columns. A value the source
does not carry is null; 0 appears only where the page prints a genuine
zero, so 0 of 0 stays 0 and --- stays null.
- Two ways to name targets. Put an
event-details URL or a bare 16-hex
event id in eventUrls and every fight the card lists becomes a target, in
the card's own order; or name fights directly in fightUrls, in which case
the event card each one is listed on is read once per event so that
eventDate and eventLocation are joined on rather than invented.
- Raw counts only. Landed and attempted counts are emitted as the page
prints them; the percentages the page computes from them are read and
dropped rather than re-derived.
- Every outcome is named. A target that produces no rows is recorded in the
run's
ERRORS record with its own class and a safe reason, never as a
dataset row, and a malformed input is reported by field name before any
request is made.