Freeze a carry seeding's field at first fill (#334)#343
Merged
Conversation
A round seeded from another round's outcome (FromRanking / FromRankingRange / FromHeatWinners / Combine) re-resolved its field LIVE on every read, so an adjudication on the source round landing after the dependent round had raced silently rewrote who its field "was" — raced results vanished from its ranking and class points. The field is now drawn ONCE, at the round's first fill, recorded in the log (new additive Event::RoundFieldDrawn, appended before the first HeatScheduled), and every later read — fills, ranking, standings, dependent seeding — replays the recorded draw. Before the first fill resolution stays live (build-ahead rounds keep tracking their source until they draw). Roster seedings (FromRoster / AllChannels) never freeze: late entrants still join mid-round. This is D18's "one grouping decision at fill" extended to the field itself; recorded in decisions.html D8. User decision 2026-07-03: freeze, not warn. Closes #334. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Implements the user decision on #334 (freeze at fill, not warn).
A carry-seeded round (FromRanking / FromRankingRange / FromHeatWinners / Combine) resolved its field live on every read — so adjudicating the source round after the dependent round had already raced silently rewrote the dependent round's field, vanishing raced results from its ranking.
Model (D18's "one grouping decision at fill" extended to the field):
Event::RoundFieldDrawn, appended before the firstHeatScheduled).round_fieldshort-circuits on it).FromRoster/AllChannels): a late entrant added mid-round still joins the field — freezing those would have broken a legitimate flow.Regression tests: the full #334 scenario (source DQ after dependent fill → filled round keeps its drawn field
[A,B], draw recorded once, while an unfilled sibling resolves the adjudicated carry[B,C]live) + roster-stays-live. Replay determinism preserved — the draw is an event, so a re-fold reproduces it exactly.All 37 workspace suites green, clippy clean, contract 90/90. D8 updated in decisions.html.
Closes #334.
🤖 Generated with Claude Code