Stage 1
Your `reads` file has one row for every time a timing mat saw a chip. Your `entrants` file lists everyone with a bib.
1. A read belongs to an entrant when its `chip` is that entrant's `chip`.
2. Only entrants whose `status` is `confirmed` count. Reads from chips that are not in the entrant list, and from entrants whose status is `pacer` or `withdrawn`, do not count.
3. This stage is about the finish line only. Use reads whose `mat` is `FINISH` and ignore every other mat. FINISH chips are always written in upper case, like the entrant list.
4. `t` is the read time in Unix milliseconds, UTC. No two FINISH reads have the same `t`. A chip can be read more than once at the same mat; that does not matter here, because the earliest read is still the earliest read.
5. Both files are longer than one page. Read every page of both.
Stage 2
The race is decided by official time, not by who crossed the line first. Fetch `file=rulings` with `stage1=<your stage 1 answer>`, then apply these rules to your `reads`, `entrants` and `rulings`.
1. Only confirmed entrants can have a result.
2. The 30K mat writes chip ids in lower case. Every other mat and the entrant list use upper case. Compare chip ids in upper case.
3. A mat can read the same chip more than once. For each chip at each mat, only the earliest read counts (the smallest `t`). The order of rows in the file means nothing.
4. A runner has a result only if their chip has at least one read at every one of the seven mats: `START`, `5K`, `10K`, `HALF`, `30K`, `35K`, `FINISH`.
5. Chip time = the earliest FINISH read minus the earliest START read, in milliseconds. Waves started at different times, which is why the start gun plays no part.
6. Rulings. For each bib, only the ruling with the highest `ruling_no` counts. Every other ruling for that bib is ignored completely, whatever its kind. The file is not in `ruling_no` order.
- `DQ`: the runner has no result.
- `PENALTY`: add `seconds` × 1000 milliseconds to the chip time.
- `CLEARED`: the runner keeps their chip time. An earlier `DQ` or `PENALTY` for that bib no longer applies.
A ruling affects only the bib it names. It never gives a result to a runner who has none under rules 1 to 4. Rulings for bibs that are not in the entrant list change nothing. A runner with no ruling keeps their chip time.
7. Official time = chip time, plus the penalty when the ruling that counts is a `PENALTY`. The lowest official time wins. No two official times are equal, and the winner is at least 2 seconds ahead of second place.
Stage 3
Fetch `file=prizes` (the prize table, which never changes during the week and does not depend on your answers) and `file=claims` with `stage2=<your stage 2 answer>`. Prizes follow your official results from stage 2, with every rule and ruling applied.
1. Overall. The three lowest official times win `OVERALL` places 1, 2 and 3, whatever their category.
2. Categories. In each category, the three lowest official times among runners who did not win an overall prize win places 1, 2 and 3 of that category. Nobody wins two prizes. A category with fewer than three such runners awards fewer places.
3. A runner's category is the `category` field in the entrant list.
4. Claims were typed by hand. Before comparing, trim spaces from `bib` and `award` and put both in upper case. `place` and `amount_cents` in claims, and `place` and `prize_cents` in the prize table, are JSON numbers, never text.
5. If the same `bib`, `award` and `place` were claimed more than once (after rule 4), only the claim with the lowest `claim_no` is considered. The later ones are never paid, even when the first one is wrong.
6. A claim is paid when that bib really won that award at that place, and its `amount_cents` equals `prize_cents` for that award and place. Otherwise it is not paid. A prize nobody claimed is not paid.
Allowed nodes
Use exactly one Manual Trigger. These are the reviewed node type versions, not n8n application versions.
manualTrigger 1; set 3.4; httpRequest 4.2; splitOut 1; filter 2.2; if 2.2; switch 3.2; merge 3.2; sort 1; limit 1; summarize 1.1; aggregate 1; removeDuplicates 2; renameKeys 1; dateTime 2; compareDatasets 2.3; splitInBatches 3; noOp 1; stickyNote 1
No Code, Function, AI, SQL Merge, code-mode Sort, raw-JSON Edit Fields, external HTTP calls or embedded array-processing expressions. HTTP Request may call only this challenge. Use Settings.username, Settings.key and Settings.base. Keep base as downloaded, without a trailing slash. Keep the three named result nodes and calculate b1, b2 and b3 from upstream nodes, never typed constants.
Submit at most 200 KB of workflow JSON and an explanation of 150 to 2,000 characters with at least 30 words naming three of your processing nodes. Your workflow is private. A correct entry awaits replay on two unseen races after close; only a replay pass earns 11 points.