Invalid event order and invalid decisions raise before rendering.

highlighted = computed this step

Fail closed invalid traces

The compiler rejects traces that skip required order or decide without the needed votes. This lesson renders a valid pending prefix instead of rendering an invalid decision.

invalid traces do not render\text{invalid traces do not render}

Pending is not commit

The prefix contains 1 vote for 2 participants, so commitAllowed is no. Adding a commit decision here raises before render.

votes=1,participants=2\text{votes}=1,\quad \text{participants}=2

two-phase commit is rendered here as a tiny exact FSM trace; timeouts, recovery, network partitions, availability, and database-product behavior are out of scope.

Pending is not commiteventcoordinatordecisionvotesparticipantsinitialinitpendingnoneP1:init, P2:initprepare CwaitingpendingnoneP1:prepared, P2:preparedvote P1 yeswaitingpendingP1:yesP1:voted_yes, P2:prepared participant statesparticipantvotestateP1yesvoted_yesP2noneprepared compiled summaryfactvaluedecisionpendingoutcomependingcoordinatorwaitingcommitAllowednoabortReasonnone

Summary

Fail-closed validation is part of the lesson source, not a reader exercise. Note: rejected bad traces are never used as displayed diagrams.

bad traces are rejected\text{bad traces are rejected}