cd22b51377
test_gem300_scenario.cpp drives EquipmentDataModel in-memory. This companion test does the same lifecycle through actual hsms::Connection frames on a loopback socket pair: S1F13/F14 establish comm S3F17/F18 carrier action ProceedWithCarrier (E87) S16F11/F12 process job create (E40) S14F9/F10 control job create (E94) S16F27/F28 CJSTART → CJ → Executing S6F11 ControlJobExecuting CEID auto-emitted on transition CJ → Completed via internal AllJobsComplete EquipmentEmulator owns the data model + a passive Connection, registers state-change handlers that synthesize S6F11/S16F9 on transitions, and dispatches the inbound primaries above. HostEmulator wraps the active Connection and captures everything the equipment sends unsolicited. This is the wire-level equivalent of the existing in-memory scenario, which closes the gap between "FSM works" and "full GEM 300 stack works on a wire". Closes #10 in the test-gap backlog. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>