Chapter 11 deterministic teaching model, 2026-09-20 Run: python3 routing.py Python standard library only, no network, VM, dependency installation or file mutation at runtime. result.json is the normal invocation's stdout. Graph before: AB=1, BC=1, AC=5. Graph after: AB=1, AC=5. Destination C. Initial routes are computed by Dijkstra: A cost2 viaB, B cost1 viaC. No path result is hardcoded into the update algorithm; assertions compare computed outputs with independently expected costs for this fixed graph. DV event schedule after BC removal: B,A,B,A,B,A,B. Each receiver reads the other router's currently installed advertised distance into its own neighbor cache, then minimizes link cost plus cached distance. C advertises zero on the remaining direct AC link. The first five computed costs are 3,4,5,5,6, with next hops A,B,A,C,A respectively. The first three installed snapshots loop A->B->A. The fourth sends A directly to C. The last two events leave A5/B6 unchanged and check this fixed point. Neighbor caches are receiver-local; there is no poison reverse, split horizon, infinity metric, update timer, packet loss, RIP wire format or RIP simulation. Link-state event schedule: B gets version2 and runs Dijkstra/installs first; A still has version1 and forwards viaB. A->B->A is detected. A then receives version2 and installs directC cost5. B's computed route is viaA cost6. B,A recompute once more with version2; both remain unchanged. Version C remains1 because C is the destination with zero local route and is not an update receiver in this deliberately restricted event schedule. Flooding transport, acknowledgments, LSA aging, real OSPF and delayed FIB installation are not implemented. Installation occurs immediately at each chosen router event; only different routers' update times differ. Trace follows installed next hops for at most vertex-count+1 steps and detects repeated vertices. Every chosen next hop must also have an edge in the current physical graph; an absent edge returns link-down. Reverse-order LS check: A installs its new directC route first while B retains old directC; tracing from B returns link-down on B->C, not delivery and not an A/B loop. This is a bounded forwarding-decision trace, not packet I/O. Tie rule: lexicographically smallest next-hop name for equal total cost. The positive, immutable three-node graph is the entire supported input graph. --event-limit is a capacity check for the fixed seven-event DV schedule, not a clock, convergence proof, tunable scheduler or performance measurement. Verified: default execution, byte-identical repeated stdout, --help exit0, --event-limit 10 exit0, too-small/noninteger/unknown argument exit2. Python no-excuse checker: zero violations. No real protocol convergence or relative DV/LS performance claim follows from this selected schedule.