* Regression tests for answering every inbound segment as it arrives
* Answer every segment of an inbound concatenated message as it arrives
* Record the segment-by-segment answer in AGENTS.md and README
* Regression tests for an empty message_id on deliver_sm_resp
* Answer a deliver_sm with the empty message_id SMPP 3.4 makes it
* Record Jasmin's refusal of a deliver_sm_resp message_id
* Mark the Jasmin multipart deadlock fixed
* Regression tests for the architecture review's findings
* Give the segment id notation an owner, and every segment a status
* Correct what the ids reach and what a lost group tells the application
* Regression tests for a group lost to its own octet overrun
* Report a group lost to its own overrun, and refuse by the command it arrived on
* Keep the docs true about what a segment is answered with
* Count only the answered segments of a group lost to an overrun
* Report only what a lost group cost, and say which cap bit
* Regression tests for a client that retries its first connect and bind
* Retry the first connect and bind on reconnect: { fromStart: true }
* Pin that the signal bounding the first bind also closes the session
* Name a failed connect once, default the backoff where it lives, and fix the deadline advice
* Carry the failure that started the retries on the abort that ends them
* Pin one retry announcement per attempt when a link drops mid-bind
* Announce a retry when its wait is over, not when it is scheduled
* Say what the process-hold assertion expects, not what a failure would mean
* Regression tests for a receipt body read under a data_coding it is not written in
* Read a delivery receipt's body as the octets that arrived, not by its data_coding
* Assert SMPPSim's UCS2 receipt body parses like every other segment's
* Record the receipt-body defect as fixed
* Retain a multipart segment's octets once, not twice
* Sort the new type import into its file's order
* Regression tests: a PDU the codec cannot read costs that PDU, not the link
* Refuse a single unreadable PDU instead of the whole link
* smscsim interop asserts the first attempt gets every DLR
* Record the smscsim sequence number defect as fixed
* One framing rule and one response-command lookup, per the architecture review
* Apply the stability review's nits: honest sessionError docs and one link-survives assertion
A framing or codec error tears the link down rather than the session, so
the loop retries it on a fresh socket with a fresh framer — which is what
a desynced stream needs. Removing that reset failed nothing before; the
reconnect test now leaves half a PDU on the dying link, and does.
`disconnected` counts failed links rather than outages, which the README
now says, and the transport wires its socket as it is built.
Ending a session while the link was down emitted nothing: the retried
drop had already torn it down, so close() found nothing left to do. The
terminal event is now guarded by its own flag rather than by `closed`.
The socket, the framer and the parse move to PduTransport, which is what
takes session.ts back under its line cap; `session.sock` reads through a
getter. The backoff also refuses an inverted pair and an unknown key.
`close` fires only where nothing will bring the session back; a drop the
reconnect loop will retry is `disconnected`, pairing with `reconnected`.
`minDelay: 0` never doubles, so the backoff never started — both delays
are range-checked now, and only `false` spells reconnect off.