Follow-up to the real (bracketed) MultiGP multi-main, now composable from atomic rounds. Distinct from the older flat-mains plan in #219/#234: each main is its own single-elim bracket (heats of N), wired bottom-up by the new range/union seeding rules, with per-tier finals.
Shipped (the foundation)
The structure is currently composed via the API/script (run-real-multi-main.mjs), NOT authorable in the console.
Future work
Relates to #219 (first-class multi-main), #234 (bump-ups). The seeding primitives + composition are done; this issue tracks per-tier configurability + making it authorable without scripting.
Follow-up to the real (bracketed) MultiGP multi-main, now composable from atomic rounds. Distinct from the older flat-mains plan in #219/#234: each main is its own single-elim bracket (heats of N), wired bottom-up by the new range/union seeding rules, with per-tier finals.
Shipped (the foundation)
FromRankingRange { source_rounds, skip, take }(ranking slice) +Combine { sources }(union, concat + dedupe-keep-first); recursiveresolve_seedingwith a depth guard (also closed a latent seeding-cycle stack-overflow).FromHeatWinnerskept the wrong advancers on 4-up levels viaGenerator::advancers()). Live-verified at 64 pilots on the rig: qual → C/B/A mains (brackets of 4-pilot heats) → bumps land → A-main Chase-the-Ace final → champion; every heat exactly 4 pilots.The structure is currently composed via the API/script (
run-real-multi-main.mjs), NOT authorable in the console.Future work
realMultiMainReqs(...)planner infrontend/apps/rd-console/src/lib/standings.ts+ a wizard that previews the qual-rank partition (seeds 1-6 / 7-12 / 13-20) and the bump arrows, then POSTs the rounds. Needs aFromRankingRange/Combineauthoring affordance in the seeding picker.Relates to #219 (first-class multi-main), #234 (bump-ups). The seeding primitives + composition are done; this issue tracks per-tier configurability + making it authorable without scripting.