Scope: six real finite Linux Reno transfers on new isolated A-R-B namespaces per round. No host route changes or production traffic. No dependencies added. A10.19.1.2/24 -- R10.19.1.1 and10.19.2.1 -- B10.19.2.2/24; TCP46019. Only R namespace enables forwarding. R/right is the shared bottleneck: tc qdisc add dev right root tbf rate5mbit burst16kb limit64kb (The actual argv includes separating spaces and is saved in every result.) All sockets set TCP_CONGESTION=reno before connect and read it back. Kernel6.18.10-200.fc43.aarch64, Python3.14.3, iproute2 tc/ss6.14.0. Available and allowed algorithms both read: reno cubic. These are runtime readbacks, not an assertion that Reno represents all TCP implementations. Each round starts fresh namespaces and sockets. Schedule alternates one and two flows, repeated3times. Receiver accepts all connections before READY; receiver GO establishes one monotonic epoch, then both senders receive GO. Thus starts are coordinated but not simultaneous at nanosecond precision. Receiver continuously drains all sockets for15s; first3s excluded as warmup. All flows share the same [start+3s,start+15s) receive-count interval. Each recv(max65536) block is attributed by a user-space timestamp taken after recv returns; a block crossing the boundary is wholly counted or excluded. Scheduling can delay a read, so this is application goodput, not exact wire arrival accounting. Both the target interval and actual finish time are saved. Goodput=actual counted bytes*8/12/1e6 Mbit/s (decimal). Sender local accepted bytes and ss's send/delivery-rate fields are NOT used as received goodput. The receiver checks every actual block contains the prescribed byte x before counting; neither receiver nor sender accumulates the whole stream in memory. Fixed-content integrity is checked, not a unique sequence-numbered application record stream. A continuous sender may have unreceived buffered bytes when the measurement ends; results are not a complete finite-file delivery claim. Every nominal200ms the parent records A's ss -tinm, bracketed by actual monotonic start/end times. Cadence is a target, not an exact sampling guarantee. Each snapshot identifies actual ports and Reno, cwnd, MSS, RTT, bytes_acked, retrans and snd_wnd when present. snd_wnd is the peer's advertised send window; rcv_wnd concerns the reverse direction and is not substituted for it. cwnd is in segments; use the corresponding MSS for a byte comparison. A sampled inequality cannot rule out rwnd effects between samples. No packet capture or tracepoints prove every congestion phase or the exact loss-recovery algorithm. Raw ss counters are retained rather than fabricating a sawtooth. Jain=(sum measured_bytes)^2/(flow_count*sum(each measured_bytes^2)) within the same12s interval. Single-flow Jain1 is algebraic, not a fairness comparison. Two-flow values describe these two starts, Reno, veth, TBF, queue limit, RTT, CPU scheduling and short duration; they do not establish long-run fairness, other congestion algorithms, unequal paths, Internet or production behavior. TBF -s -d snapshots are preserved before and after each run. overlimits counts shaping events, not dropped packets; dropped is a separate counter. TBF rate is not application-payload goodput: headers, retransmissions and boundary accounting differ. Queue backlog may remain at termination. End snapshots include warmup and termination traffic, while goodput excludes warmup. Receiver stops by the common deadline and closes with senders still producing; BrokenPipeError/ConnectionResetError from this termination is logged, not interpreted as a bottleneck outage. Senders have18s deadlines and1s I/O timeout, receiver15s measurement, bounded command/accept/start waits. Parent finally terminates owned children and deletes only the three owned namespaces. Run: sudo python3 lab.py in the dedicated podman-machine-default VM. One shell starts VM, runs SSH, and stops VM via EXIT trap. CLI --help0, --bad2, --flows3 exit2, macOS default guard1 before network mutations. Static Python no-excuse checker zero violations. No commit or push by this worker. Sources checked during this writing: https://man7.org/linux/man-pages/man7/tcp.7.html https://man7.org/linux/man-pages/man8/tc-tbf.8.html https://man7.org/linux/man-pages/man8/ss.8.html Final real run: all6 rounds passed on first attempt, shell exit0 and VM stopped. 18 owned namespaces deleted; six cleanup receipts retained. Round flows | measured bytes per flow | Mbit/s per flow | Jain | TBF drops 1 1 | [7170496] | [4.780331] | 1.000000000 | 33 1 2 | [2774368, 4375856] | [1.849579, 2.917237] | 0.952230555 | 59 2 1 | [7161808] | [4.774539] | 1.000000000 | 33 2 2 | [4025440, 3129128] | [2.683627, 2.086085] | 0.984547867 | 60 3 1 | [7158912] | [4.772608] | 1.000000000 | 31 3 2 | [4118112, 3037904] | [2.745408, 2.025269] | 0.977721430 | 49 75 snapshots per run; 540 measured-interval per-flow entries. Every such entry contains snd_wnd and has snd_wnd > cwnd*MSS. This only describes the recorded instants; it does not exclude transient rwnd or sender limits.