| … | … | @@ -2759,6 +2759,27 @@ SessionState's truncate / reorg / named-session machinery. |
| 2759 | 2759 | - **The interop gate:** JS ↔ keetd over a real pipe, both initiator roles, with real |
| 2760 | 2760 | randomness and real timers: data both ways, a keepalive while idle, and a timeout |
| 2761 | 2761 | that destroys. |
| 2762 | - **4e-3c DONE 2026-10-04** (keetd 3a55e92, 6369802, 5a8ef41 + gate / drill commits). |
| 2763 | **M5g-4e-3 COMPLETE.** |
| 2764 | - **Trace gate:** 28 deterministic scripts, identical to JS. Beyond the basic path they |
| 2765 | cover: |
| 2766 | - the udx channel, enableSend, opts.handshake; |
| 2767 | - async key pairs, autoStart / start with data, ended or a timeout; |
| 2768 | - flush, the atomic limit, and every bad header / frame / handshake path. |
| 2769 | - **Interop gate:** 13/13 against a real JS peer over a Unix socket, both roles, real |
| 2770 | randomness and timers: keepalive vs timeout, 2 MB each way. |
| 2771 | - **Drill `m5g4e3c`: 19/19 red.** The first run left 3 survivors, all script gaps: |
| 2772 | - early keepalive data fed at start; |
| 2773 | - keepAlive after end; |
| 2774 | - a datagram before the handshake. |
| 2775 | - **Measured:** a failed secretstream pull is sodium-native's "pull failed". |
| 2776 | `flush()` is async, so its result reaches the caller one microtask later (the gate |
| 2777 | caught the missing hop). |
| 2778 | - **TRAP:** JS's `start(raw, opts)` takes its OWN opts (a precomputed handshake must |
| 2779 | be passed there, not only to the constructor). |
| 2780 | - **TRAP:** Unix socket paths are limited to 108 bytes, and an accepted fd must be |
| 2781 | handed over, not dup'd (the dup kept the connection open after keetd's destroy). |
| 2782 | - ctest 68/68 (-j16, 145 s). |
| 2762 | 2783 | - **4e-3c `ss/secret-stream`:** |
| 2763 | 2784 | - `Handshake`; |
| 2764 | 2785 | - `NoiseSecretStream` over a Duplex, with a raw-stream interface (write → drained, |