The same twelve steps as the figure above, one at a time. Click a step or use the stepper; the phase buttons jump ahead. The diagram shows each message against the trees the earlier steps already built.
Joins are hop-by-hop: a PIM Join is addressed to the RPF neighbor, not to the RP or source. Every router on the path creates its own (*,G) or (S,G) state and sends its own Join upstream — the arrows spanning several hops above are shorthand for that chain.
Two different RPF lookups: (*,G) RPF points toward the RP, (S,G) RPF points toward the source — one tree is rooted at the RP, the other at S, so the incoming interfaces can differ. Both come straight from the unicast routing table.
Register-Stop is not proof of receivers: the RP sends it when it receives the traffic natively (SPTbit set) or when it has no receivers at all — a zero-listener source gets a Register-Stop too, just for the opposite reason.
Everything is soft state: Joins must be refreshed periodically or the state expires — including the steady state of step 12, which is held up by refreshed Joins and the ~once-a-minute Null-Register / Register-Stop heartbeat.