- portable-pty 0.9.0's ExitStatus flattens a signal-terminated child to
code 1 with the signal only as a strsignal name string, so a SIGTERM
death reported {"code":1} — indistinguishable from a real exit 1 and
a violation of ADR-004 decision 1's negative-code convention (review
#004, consumer input from alkssh)
- on Unix the waiter now skips the portable-pty conversion entirely:
libc::waitpid(pid) on the direct child, decoded WIFEXITED/WEXITSTATUS
and WIFSIGNALED/-WTERMSIG (numeric, locale-independent); Child::wait()
remains as the waitpid-failure fallback and the non-Unix primary
(std::process::Child's Drop neither kills nor reaps, so the two paths
never double-reap)
- signal features now round-trip: signal("TERM") -> -15, ADR-056 cancel
kill (SIGHUP) -> -1 (the documented ADR-004 sentinel collision)
- tests: SIGINT -> -2, SIGTERM -> -15, SIGHUP fallback -> -1 pinned
- docs: ADR-004 decision 1, tty-local.md, ADR-005, tty-adapter.md,
review #004 closed as resolved with disposition
Verification: cargo test (113), cargo test --all-features (138 + the
tests/pty.rs, tests/pipe.rs, tests/negotiation.rs integrations),
clippy --all-targets --all-features -D warnings, fmt, doc,
fuzz/shared corpus replay (9)