#!/usr/bin/env python3 """Run the gate factorial: U / M / S / MS, Latin-square blocked. Arms (NVS gate_mode, applied live -- no reboot): 0 U elapsed-time gate, as upstream ships it 1 M mesh-aligned bucket gate (ours, 4b54ef8e) 2 S rx_seq selection + elapsed underneath 3 MS both stacked Why it is built this way, and what each guard is for: * Every arm is applied to the WHOLE fleet, never to a subset. The stopped 2026-09-04 run compared four gated nodes against four different control nodes; nodes differ, and that comparison could not be read. * After every switch the runner reads back `active.gate_mode` from EVERY node and refuses to sample unless all nine agree. "Config was stored" is not "gate is running" -- that gap is exactly what the previous run could not distinguish from a null result. * Arms are short and blocked in a Latin square rather than run in long sequential batches, so slow drift lands on all arms equally instead of being aliased onto whichever arm ran first. Measured drift over 20 min windows is sd 0.0045; counting noise is +/-0.002. * Metrics come from differenced cumulative counters, so the server is never restarted and the fleet stays in production throughout. Output: arms_