Stellar · Volleyball

Rotation Correction & The Rally

The short version

Found
Four of the eighteen formations were wrong, and wrong in a way a referee would whistle. R2, R3, R5 and R6 receive asserted a different zone map than base — the setter standing in front of her own front/back partner. All four were stamped card-confirmed. Base and defense were correct in all six rotations.
Fixed
Corrected in the Press Raven corpus, with two export invariants that make the whole class of error impossible to ship again, plus an overlap checker in Swift and 15 new tests. The app now models zone (the legal truth) and spot (where inside it she stands) as two different things, which is what the receive diagrams were always about.
Also
The Whiteboard is rebuilt around the fork, and The Rally is built and playable. One correction to your brief: it is we serve → Defense and they serve → Receive, not the other way round — the new screen is built so that cannot be misread.

1 · Validation, all eighteen formations

The doc's six rotations are internally consistent, and worth naming: the system is a 6-2. S and RS are the two setters — the back-row one sets, the front-row one plays right side. That is why S is never front row and RS never back row, and why R4–R6 repeat R1–R3's shapes with the other bodies in them. Your Role.isRowLocked model reproduces it correctly.

PhaseR1R2R3R4R5R6Verdict
Base matchmatchmatch matchmatchmatch All six correct. Cycle closes both ways.
Receive matchFAULTFAULT matchFAULTFAULT Four wrong. See below.
Defense matchmatchmatch matchmatchmatch All six correct, including R1's as-drawn exception.

What R2 receive claimed, and what it should have been

FL (4)FM (3)FR (2)BL (5)BM (6)BR (1)
wasRSSMLOHOH
nowOHRSMLSOH

Two faults in one picture: the setter (zone 6) was standing in front of her partner RS (zone 3), and the outside (zone 4) had drifted to the right of the setter in the front row. Either is a free point for the other team. The app's Whiteboard was teaching as correct a formation its own Thread mode exists to flag as broken.

2 · The root cause — and why it matters beyond these four rows

The rule
A legal serve-receive formation always occupies the same six zones as base. Overlap is judged at the moment of service contact, so the receive diagram is not a new alignment — it is the same alignment stretched into different spots on the floor. The dropped outside, the setter stacked behind her, the right side sliding along the net: all of that happens inside unchanged zones.

Whoever transcribed the handout read stretched locations as changed zones. R1 and R4 survived only because nobody in that shape stretches across a zone boundary. And the app's six-cell court could not have expressed it correctly even if the transcription had been right — there was no way to say "same zone, different spot".

That is now the model: zone is the legal truth and never changes between base and receive; spot is a named place on the floor. Twenty spots cover all eighteen formations and every rally beat — off-net-left, stack-behind-right, pass-centre-left, deep-cross, and so on. Each is a name a coach would actually say, which means the narrator has words and the answer line has something to read out.

3 · What now stops it happening again

Export invariant · receive vs base

The exporter refuses to write if any receive formation differs from its base, and names the exact zones. Verified by reverting R2 to the broken row: it stopped the build and printed all three disagreements.

Export invariant · overlap

Every pre-contact formation is checked at its resolved coordinates — row order plus front/back partner. Defense is exempt, deliberately: overlap expires at contact, which is why one defensive picture is legal in all six rotations.

Export invariant · near misses

Seven near_positions named the correct answer as a natural mistake. Latent — no view reads the field yet — but it would have bitten the moment the diagnostic feedback your guide calls "what is missing" got wired up. Now impossible.

Export invariant · dangling frames

Renaming the phase broke three Stories that cite formations by id. Caught by a Swift test, not by the export — so the export now checks it too.

Overlap in Swift · 15 new tests

The rule existed in three doc comments and no code. It is now a type, with the corpus held against it: receive must match base, every pre-contact formation must be legal at its spots, and no two spots may sit too close to read as two places.

Provenance corrected

The four rows were card-confirmed. Confidence notes now record what was wrong and why. R1 defense stays flagged conflicted — the doc confirms it is drawn that way, but not why it differs from R4.

4 · The Whiteboard, rebuilt around the fork

The old screen offered three phases as peers — "we serve / they serve / ball's live" — which reads as three different rotations. It is one rotation with one base and a fork, and the fork is now drawn rather than described:

Flow
Base (hold till contact)  →  the serve  →  they serve → Receive  /  we serve → Defense

The two branches also pose different questions, because they are different kinds of thing. Base asks which zone — the part a referee judges. Receive and defense ask where you stand, because the zones do not change. The receive screen says so out loud in its prompt: "same six zones — now where does she stand". Without that, correcting the data would have made receive a pixel-identical duplicate of base, with nothing left to teach.

5 · The Rally

A point, narrated beat by beat, under a clock. Six rings appear on the floor — the six places you and your teammates could be — and you tap yours before the next contact. Six rallies, covering all three shapes and both branches.

It never stops to correct her

A missed beat flashes the right spot and the rally plays on, because that is what a rally does. The misses come back at the end, where there is time to look at them.

The distractors are free and diagnostic

The wrong rings are always a teammate's real spot, so a miss reads "that's Madison's spot" rather than a red circle. No distractor authoring exists or is needed.

It cannot drift from the table

A beat naming a phase cites the rotation's own base / receive / defense entry rather than restating it. Only genuinely rally-shaped moments — free ball, transition, coverage, dig — carry their own spots.

It teaches the rotation rule

Points resolve with an explicit note: you rotate when you win the serve back — not when you win a point, and not when you keep serving. Rally 5 exists specifically to make that third case land.

6 · A bonus the doc unlocked

Your Press Raven note on The Tag records that the mode's original question — who serves next? — had to be abandoned, because back-right across the six rotations reads S / OH / L / S / OH / L, "which is not a legal serving order, and the libero cannot serve twice".

The doc resolves it. The libero reaches zone 1 twice per cycle because the pairs repeat every three rotations, and she may serve in one of those slots — the other is served by the middle she replaced. R3 the middle serves; R6 is the libero's own turn. The order is six distinct people and entirely legal. The Tag can ask its original question. I have not changed that mode — flagging it as available.

7 · Final review

What I am confident about

Where it could be inadequate

Adjustments worth considering

88/ 100 confidence

High on the correction and the model — those are rule-derived and machine-checked, and I would defend them against the handout. Lower on the rally content, which is the part I authored rather than validated: the shapes are conventional and the voice is modelled, and both want a human pass before you trust them in front of her.

Stellar · rotation correction & The Rally · 29 July 2026 · corpus backed up to PressRaven-Corpus/guides/stellar-backup-pre-rotation-fix