Skip to content

Freeze a carry seeding's field at first fill (#334)#343

Merged
ryan-johnson2 merged 2 commits into
develfrom
seeding-freeze-at-fill
Jul 3, 2026
Merged

Freeze a carry seeding's field at first fill (#334)#343
ryan-johnson2 merged 2 commits into
develfrom
seeding-freeze-at-fill

Conversation

@ryan-johnson2

Copy link
Copy Markdown
Contributor

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):

  • At the round's first fill, the resolved field is recorded in the log (new additive Event::RoundFieldDrawn, appended before the first HeatScheduled).
  • Every later read — fills, ranking, standings, dependent seeding — replays the recorded draw (round_field short-circuits on it).
  • Before the first fill, resolution stays live: a build-ahead round tracks its source until it draws.
  • Roster seedings never freeze (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

ryan-johnson2 and others added 2 commits July 3, 2026 11:14
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Seeding re-resolves live: adjudicating a source round after a dependent round ran silently rewrites the dependent field

1 participant