A pass with no updates is a finite check on the shown rows. The run-table footer is part of the honesty contract: it only says separation when the final state really separates every displayed row.
highlighted = computed this step
A full pass with no updates
After 3 passes, the last pass through rows 0 through 3 has no updates.
last pass: no updates
Why the footer matters
The footer is recomputed from the final state. It says the state separates shown data only because every displayed margin has the correct sign.
yi(wxi+b)>0 for all shown rows
Summary
For this finite run, the final state is w=(2,-1), b=0. A shorter allowed run would render that it does not yet separate.