Context
Surfaced by the /audit-issue review of #52. Not a defect in #52's diff — an environment/test-infra hazard exposed while running the conformance E2E during that audit.
What happened
Two orphaned --auto-rearm emulator processes (run_secc.py / run_evcc.py), left over from a manual live-verify run, were still cycling SLAC/SDP on the shared virtual interface. The conformance E2E (tests/conformance/e2e) spins up its own run_secc/run_evcc subprocess pairs, which communicate over the same link-local multicast. The orphans and the E2E's pairs heard each other's frames, so every handshake collided and retried until timeout. A suite that normally finishes in ~60s sat stuck on a single scenario for 12+ minutes with no diagnostic.
Root cause is the shared virtual interface coupling plus the fact that an --auto-rearm process never self-exits (ADR-0005: only q quits), so a backgrounded one is immortal until killed.
What to build (in priority order)
- Fail-fast pre-flight in the E2E fixture (core, fully specified). In
tests/conformance/e2e/conftest.py, assert at session start that no run_secc.py/run_evcc.py processes are already alive (e.g. pgrep -f). If any are, fail immediately with a clear message listing the stale PIDs, instead of silently degrading into multi-minute timeouts.
- Per-test wall-clock bound (defense-in-depth). Add a
pytest-timeout cap (~30-60s/test) so a contended handshake aborts with a traceback rather than hanging indefinitely.
Optional / heavier follow-up (design decision — triage before doing)
- Per-run transport isolation. Run each E2E pair in its own network namespace / unique veth pair or multicast group so orphans on the default interface can't be heard at all. Removes the failure mode entirely rather than detecting it; larger lift — split into its own issue if pursued.
Acceptance criteria
Related
Context
Surfaced by the /audit-issue review of #52. Not a defect in #52's diff — an environment/test-infra hazard exposed while running the conformance E2E during that audit.
What happened
Two orphaned
--auto-rearmemulator processes (run_secc.py/run_evcc.py), left over from a manual live-verify run, were still cycling SLAC/SDP on the shared virtual interface. The conformance E2E (tests/conformance/e2e) spins up its ownrun_secc/run_evccsubprocess pairs, which communicate over the same link-local multicast. The orphans and the E2E's pairs heard each other's frames, so every handshake collided and retried until timeout. A suite that normally finishes in ~60s sat stuck on a single scenario for 12+ minutes with no diagnostic.Root cause is the shared virtual interface coupling plus the fact that an
--auto-rearmprocess never self-exits (ADR-0005: onlyqquits), so a backgrounded one is immortal until killed.What to build (in priority order)
tests/conformance/e2e/conftest.py, assert at session start that norun_secc.py/run_evcc.pyprocesses are already alive (e.g.pgrep -f). If any are, fail immediately with a clear message listing the stale PIDs, instead of silently degrading into multi-minute timeouts.pytest-timeoutcap (~30-60s/test) so a contended handshake aborts with a traceback rather than hanging indefinitely.Optional / heavier follow-up (design decision — triage before doing)
Acceptance criteria
run_secc.py/run_evcc.pyprocess alive fails within seconds with a message naming the offending PID(s), instead of timing out.Related