What the fixture provides
This walkthrough launches against the same synthetic Sample Invitational fixture as the M2 and W2 walkthroughs, plus the M-series 16-athlete roster across 3 teams. Two things change in this run:
- A 17th athlete (Test Athlete) is added manually through the New Athlete sheet — demonstrating the "I just signed a new kid up" flow.
- A second meet (E2E Smoke Meet) is created from the Mac via the New Meet sheet, then immediately filled with heats via the Seed Meet Wizard. The Sample Invitational keeps its pre-existing finishes so the awards step has real data to work with.
Launch state. Live Meet shows the Sample Invitational; no other windows open. The Seed Wizard window from any prior session is closed automatically before the journey starts so it doesn't mask the first navigation.
Open the Archive window and land on Athletes
The Athletes page lives inside the DM Track Archive window (Window menu → DM Track Archive, then click Athletes in the LIBRARY sidebar). The fixture preloads 16 athletes across 3 teams; you can see them all in the inspector pane on the right.
LIBRARY → Athletes selected. Center pane shows the anchor list across every meet; right pane is the roster grid with one card per athlete.
Add a new athlete via the toolbar
The Athletes page's toolbar binds ⌘N to the New Athlete sheet — the same sheet a coach uses when walking a kid in mid-meet. Identity fields up top, an optional headshot picker, and a Group dropdown that prevents the typed-team-name fragmentation that plagues most roster tools (a coach typing "Branson" three different ways shouldn't fragment the roster into three groups).
New Athlete sheet, fresh open. Create button is disabled until at least one of First/Last name has content.
Fill in the name, hit Create
Type a first and last name. The Create button activates as soon as either field has non-whitespace content. The wire op submitAthleteRegistration queues through deferOrSend so this works whether or not the iPad's online — the new athlete ships on reconnect.
Both name fields populated; Create button enabled.
The new athlete appears in the roster
After the sheet dismisses, the roster's inspector pane gains a new card. The "Sunset — waiting for first race" badge marks the athlete as having no analytics index entries yet; they'll get a real bib and full profile once they appear in a heat's finishes.
Test Athlete appears with the Sunset badge. The wire op shipped to the iPad (or queued for it); the analytics index picks them up on next refresh.
Open the New Meet sheet from Live Meet
Switch back to the Live Meet window. The fixture meet is active, so the empty-state hero buttons aren't visible — but the ⋯ menu next to the meet name surfaces New meet… regardless of state. The whole point of Phase 1 of the Mac-as-co-author plan is that meet authoring is reachable from anywhere.
Meet menu open · New meet… highlighted.
Fill the New Meet sheet
The New Meet sheet asks the bare minimum to bootstrap a meet: name, date, optional location, lanes per heat. Team scoring and field-event display unit have sensible defaults that the operator can change here or later in EditMeetSheet. The "iPad not connected — meet will queue and ship on reconnect" chip at the bottom is informational, not a gate — sendCreateMeet queues via deferOrSend so Save works offline.
New Meet sheet, fresh open. Create Meet button stays disabled until Name has content.
Name populated. Create Meet button enabled.
EditMeetSheet auto-presents on the new meet
Operators almost always want to tweak metadata or add events right after creating a meet, so the New Meet sheet's Save handler chains straight into EditMeetSheet on the just-created meet. No extra clicks. The Name + scoring + awards fields are pre-populated from what you just entered; you can leave defaults or dial in scheme, max events per athlete, awards policy, etc., before moving on.
Edit Meet sheet auto-chained on the just-created E2E Smoke Meet. Awards policy, scoring scheme, and per-athlete max all editable in one place before the meet's first event ships.
sendUpdateMeet → deferOrSend. The "iPad not connected" chip is informational; changes queue alongside the parent createMeet op and drain together on reconnect.
Live Meet shows the new pending meet
After dismissing the EditMeetSheet, Live Meet renders the new E2E Smoke Meet as PENDING (orange chip) with the synthesized empty event list from the pending-ops queue. The action row's purple Auto-Seed Athletes… button is the gateway into the Seed Meet Wizard — same window the ⌘⇧J shortcut opens.
E2E Smoke Meet PENDING. Auto-Seed Athletes button (purple, wand icon) is the discoverable entry into the Seed Wizard.
Step 1 — Roster
The wizard opens on the Roster step. All 17 athletes (the 16 fixture athletes plus the Test Athlete we just added) are pickable; Select all visible takes them all in one click. SceneStorage round-trips the selection so closing and reopening the wizard preserves your pick.
Roster step on first open. The dedicated M2 walkthrough covers this step in depth.
Step 2 — Events
Step 2 sources events from four places simultaneously: the archive's analytics-index vocabulary, the curated MacMeetTemplates.all presets, the iPad's currently-broadcast meet, and a free-form name+category row. All four push rows into the same selection set; the picker dedupes via Set semantics.
Event picker with the four sources stacked at the bottom. This walkthrough applies the Sprints & Relays template — 6 events that fit a smoke-test meet cleanly.
Step 3 — Policy
Three sub-pickers govern engine behavior: Lane count (4 / 6 / 8 standard / 9 / Custom), Distribution (similar skill — slow heat first, fast heat last; or mixed-skill tertile + team round-robin), and Data window (All-time / Last 6 months / Last 8 weeks / Last 2 weeks). The Summary block computes the implied heat count live as you change pickers.
8-lane similar-skill, all-time data window. The summary at the bottom reads 17 athletes · 8-lane heats · 3 track events → 4 heats each = 12 heats total · ≈ 96 lane assignments to commit.
Step 4 — Review
The wizard runs MeetSeedEngine.seed(...) once per selected event with the chosen policy and renders per-event sections with heat cards inside. Drag a lane onto another lane in the same event to swap athletes; both swapped lanes pick up an "edited" pill that survives step navigation. Cross-event drags are blocked at the drop site.
Review pane with per-event sections. Every lane shows seed: none because our just-created meet has no race history; in a real archive each lane would carry the athlete's PR-derived seed time.
Step 5 — Commit
The commit step asks where (add to current meet vs create a new meet) and shows a Will create tally. Because we're committing into the just-created E2E Smoke Meet, the destination defaults to "Add to current meet"; one click on Commit to iPad fans out createMeet → createEventGroup → createDivision → createHeat → submitLaneAssignment for every lane in the draft.
Commit pane on the brand-new E2E Smoke Meet. 6 new event groups × 1 division each, 12 heats, 96 lane assignments. Re-committing the same draft is a no-op on the iPad side; lane assignments overwrite by (heatID, laneNumber).
Open the Winners window
The actual race timing happens on the iPad; that's not driven from this walkthrough's automation (XCUITest can't reach the iPad's clock). The fixture preloads the Sample Invitational meet with completed finishes so the awards step has real data to work with — same shape as a meet you've actually run.
The Winners window (⌘⇧W) aggregates the meet's standings into a per-event podium view. From here, one click generates the awards ledger.
Winners window. Top-3 podium per event; click Generate Awards to fan out into the W2 ledger.
Awards ledger with IAAF tie handling
The Awards window opens on the just-generated ledger. Top-3 per event with the meet's awards policy applied (default Top 3 · Medal). IAAF inclusive ties are handled — see the 100m · Boys event where Emma Davis and Sam Chen both tied for 3rd; both get a 3rd-place medal label. The header counters tally 10 awards / 22 labels / 3 events — 22 labels because the relay's 4-athlete medals count once per athlete, per the default relay sub-policy.
Sample Invitational · Awards. 10 Awards · 22 Labels · 3 Events · Top 3 · Medal policy. The two tied 3rds at 100m each get a medal label per IAAF inclusive ties.
What "end-to-end" actually means here
- One XCUITest, one launch, 17 screenshots. The walkthrough above is generated by
E2EFullPathTest.testE2EFullPathdriving every step from a singleapp.launch(). The test passes against the fixture in ~100 seconds. - Offline-first throughout. Every mutation (new athlete, new meet, edit meet, create events, create heats, create lane assignments) routes through
deferOrSendon the Mac coordinator. The walkthrough drives the path with the iPad disconnected; the wire ops queue to disk and ship on reconnect. - Race timing lives on the iPad. The "Phase D — Awards" step uses the fixture's pre-installed finishes because XCUITest on the Mac can't reach the iPad's timing engine. In production, the iPad runs the clock, the Mac visualizes + authorizes; this walkthrough models that split honestly.
- Window state reset at launch. macOS's SwiftUI scene restoration tried to re-open the Seed Wizard from the previous test session — which would have masked the Athletes phase. The test's
closeAuxiliaryWindows(app:)helper drains the restoration stack so the journey starts clean every run. - Accessibility identifiers for resilient text input. Both the New Athlete sheet and New Meet sheet expose their Name fields via
accessibilityIdentifier. Earlier versions of the test relied on placeholder-based lookup and silently no-op'd when macOS routed keystrokes to the wrong field; the identifier path lands text reliably.
Drill into any phase
M2 — Seed Meet Wizard takes Phase C standalone, end-to-end, with the wizard's drag-to-tweak review pane covered in depth.
M1 — single-event seeder is the wand button inside the Heat Editor footer — same engine, one heat at a time, for when you've already built the meet shape manually.
M3 — per-athlete event suggestion ranks each athlete's events vs their team and hands them off to the wizard pre-populated.
W1 — Awards policy editor is the same Awards section visible in Phase B's auto-chained EditMeetSheet; this walkthrough covers meet-level defaults + per-event-group overrides.
W2 — Awards ledger generator covers Phase D's ledger in depth, including the IAAF inclusive tie handling, color-coded medals, and search/filter affordances.