$ bash -e -o pipefail -c npm test > electrical-circuit-engine@2.0.0 test > node --test tests/*.test.mjs ✔ seal-in circuit holds until stop and overload deenergize it (1.2756ms) ✔ mutually energized reversing coils trip the software interlock (0.176282ms) ✔ TON resets when its input falls (0.782375ms) ✔ rejects repeated members in an interlock (0.355069ms) ✔ rejects invalid contact identifiers before scanning (0.128381ms) ✔ internal PLC names never collide with declared signals (1.670307ms) ✔ feedback uses the previous scan and commits outputs after interlocks (0.389951ms) ✔ nested TON blocks execute their inputs before their parent (1.318995ms) ✔ rejects invalid identifiers and timer precision instead of emitting broken PLC code (0.277503ms) ℹ tests 9 ℹ suites 0 ℹ pass 9 ℹ fail 0 ℹ cancelled 0 ℹ skipped 0 ℹ todo 0 ℹ duration_ms 51.718247 $ node src/cli.mjs examples/seal-in.json examples/inputs.json {"scans":3,"final":{"sequence":3,"timestampMs":200,"coils":{"MOTOR":false},"transitions":[{"id":"MOTOR","energized":false}],"interlockTrips":[]},"events":[{"sequence":1,"timestampMs":0,"coils":{"MOTOR":true},"transitions":[{"id":"MOTOR","energized":true}],"interlockTrips":[]},{"sequence":2,"timestampMs":100,"coils":{"MOTOR":true},"transitions":[],"interlockTrips":[]},{"sequence":3,"timestampMs":200,"coils":{"MOTOR":false},"transitions":[{"id":"MOTOR","energized":false}],"interlockTrips":[]}]}