v0.32.0 Phase 0 Review
Result: complete with no open finding. This review evaluates the adopted configured-subprocess contract before source implementation begins.
Findings Closed by the Contract
Whole-stream transfer could deadlock in both directions
A child may wait for stdin while its stdout or stderr pipe is full, and the parent may block writing stdin while no output is drained. The contract requires one fair readiness loop over every active direction and permits only one bounded operation per ready direction before repolling.
Early stdin closure could terminate the parent
An ordinary pipe write can raise SIGPIPE. Changing the process-wide signal disposition would leak standard-library policy into unrelated user code. The Darwin SDK exposes descriptor-local F_SETNOSIGPIPE; the input-pipe owner must enable it before execution and classify EPIPE as an ordinary child refusal to consume remaining input.
Environment edits could become lossy reconstruction
The public environment query API validates UTF-8, while inherited process entries can contain arbitrary bytes. The prepared environment keeps untouched raw entry addresses and replaces only exactly matched configured names. It never reconstructs inherited state through public views.
Child setup failures could collapse into exec failure
Input descriptor installation, output descriptor installation, working-directory change, and executable replacement have different public meaning. The close-on-exec report receives distinct stages, while ordinary child exits remain entirely outside that protocol.
Stdin could create a second polling and cleanup authority
Adding a writer beside CaptureSession would duplicate readiness, failure precedence, and resource cleanup. Phase 2 instead replaces the capture-only session with one command-I/O owner. Raw poll classification remains target-specific and does not choose public errors.
Feasibility Evidence
The active macOS SDK declares:
SYS_chdiras syscall 12;POLLOUTas event bit 4;F_SETNOSIGPIPEas descriptor command 73.
A native descriptor probe applied command 73 to an ordinary pipe successfully; after its read end closed, writing returned EPIPE instead of terminating the process. The input design therefore does not depend on changing global signal handling.
Nocter already exposes generic one- and three-argument Darwin syscall roles, close-on-exec pipe ownership, bounded raw reads, raw writes, and staged child launch reporting. No parser, checker, semantic representation, MIR, machine, image-format, or compiler primitive change is required.
Boundary Review
- Public semantics remain in the specification; this review contains only implementation evidence.
Commandowns source configuration and a prepared plan owns every post-fork address.- The child receives only stable words and owned descriptors; it cannot allocate or validate.
- Target code returns typed syscall facts and cannot select public process errors.
- One lifecycle owner selects failure precedence only after exact-child observation.
- No compatibility alias, alternate API spelling, or feature-specific compiler path is introduced.
Phase 1 may begin without an unresolved design decision.