Importing service defines the contract without starting a child. Select a named implementation before requiring nupp.io.process. Every operation receives the retained provider table as its first argument. Options, Exit, and Interest use the canonical declarations in nupp.io.process.types.
Spawn returns the child owner, optional stdin/stdout/stderr handles, process ID, and optional failure message. Pipes and process lifetime are separate resources: closeStream releases a pipe, while reap releases the child owner after settlement. Construct exit results with nupp.io.process.types.exited so callers receive the shared identity and timeout/killed semantics.
Readiness probes must distinguish pending input from EOF and backpressure from a closed pipe. waitReady services the requested read/write interests and child completion for a bounded interval; now supplies its monotonic millisecond clock. Process cleanup must remain valid after cancellation, kill, and partial spawn.