v0.32.0: Complete Configured Synchronous Subprocesses
Status: complete, published, and externally audited (2026-09-04). v0.32.0 completes one practical synchronous subprocess use case rather than publishing separate releases for each builder option. One owning Command configures arguments, environment, working directory, and finite input, then consumes itself into inherited-output status or captured output execution.
Completion Boundary
- working-directory selection has exact relative-path and failure semantics;
- inherited environments can be retained, changed, removed, or cleared without lossy reconstruction;
- finite arbitrary stdin bytes compose with both terminal operations;
- stdin, stdout, and stderr cannot deadlock through sequential whole-stream transfer;
- early child stdin closure cannot terminate the Nocter parent through
SIGPIPE; - every value and pointer vector needed after fork is prepared and owned before child creation;
- one I/O-session authority owns readiness, descriptor lifetime, progress fairness, and cleanup;
- one launch report distinguishes input setup, output setup, directory setup, and exec rejection;
- every created child is observed exactly once on every representable path;
- public examples and installed-home qualification exercise the complete configured operation;
- final review finds no duplicate launch, environment, polling, cleanup, or public-error authority.
The normative contract is spec/32-configured-subprocesses.md. Release identity, reproducible archive generation, publication, and public re-download evidence are owned by the release-preparation and immutable release records.
Release Sizing Rule
Phases and commits remain small enough to validate independently, but they are not release boundaries. v0.32.0 closes the complete configured synchronous-command use case. Environment, working-directory, and finite-input support must not be split into later versions merely because one component can be implemented first.
Phase 0: Contract and Feasibility
Status: complete. The contract fixes request mutation, environment replacement, explicit empty stdin, child setup order, full-duplex progress, broken-pipe behavior, public failure precedence, allocation policy, responsibility boundaries, and non-goals.
The installed Darwin SDK provides chdir syscall 12, POLLOUT value 4, and descriptor-local F_SETNOSIGPIPE command 73. Existing generic syscall capabilities can express all three without a compiler primitive or backend change. The current close-on-exec pipe and launch-report owners are sound inputs, but the two-stream capture poll/session must be generalized rather than wrapped by a parallel stdin implementation. The Phase 0 review records the architecture decision and hazards closed before implementation.
Phase 1: Owned Configuration and Prepared Launch Plan
Status: complete. Command now owns transactional environment changes, working-directory selection, and copied finite input. One Darwin prepared launch plan owns stable path, argv, working-directory, exact environment, and input facts before fork. Untouched inherited environment entries retain their original byte addresses and never pass through public UTF-8 reconstruction. The Phase 1 review records the ownership and authority boundaries.
Phase 2: Unified Command I/O Session
Status: complete. One command-I/O session now owns inherited I/O, input only, capture only, or all three directions. One three-slot poll fact, bounded per-ready-direction progress, descriptor-local SIGPIPE suppression, exact child setup stages, and one cleanup path replace the capture-only session. The obsolete raw environment-vector primitive and capture wrappers were removed rather than retained as alternate authorities. The Phase 2 review records the replacement boundary.
Phase 3: Native Lifecycle Qualification
Status: complete. Native execution now qualifies inherited and exact environments, repeated changes, removal, clearing, relative execution after directory change, empty and large input, early stdin closure, simultaneous large input/output, nonzero and signal termination, all setup failures, initially closed standard descriptors, repeated cleanup, and failure precedence across both terminal methods. Qualification exposed and removed a real full-duplex deadlock: writable readiness had been followed by one blocking whole-remainder write. The parent input endpoint is now nonblocking, would-block is a typed retry fact, and one completion authority selects terminal mode and public failure precedence. The Phase 3 review records the failure, replacement, and evidence.
Phase 4: Practical and Tooling Integration
Status: complete. The public subprocess-configured package uses repository-owned fixtures to exercise an exact environment, working directory, finite stdin, captured stdout/stderr, and typed terminal status in one operation. The shared public-example contract drives native execution and installed-home CLI qualification. Formatter coverage discovers every authored example source; dedicated LSP coverage verifies diagnostics, hover, completion, declaration navigation, and implementation navigation against the same package. The public chapter records the implemented contract. The Phase 4 review records the integration boundary.
Phase 5: Qualification and Review
Status: complete. Complete locked workspace tests, warnings-denied Clippy, no-default-features checking, formatting, deterministic documentation, public examples, installed-home integration, packaging-input syntax, and repository checks pass. The final review traces the full configuration, launch, I/O, observation, tooling, and public-example path and finds no open implementation or responsibility-boundary issue. The Phase 5 review records the qualification and final audit. The separate release-preparation record owns candidate identity, artifact qualification, and the publication boundary.
Non-goals
PATHsearch or shell execution;- asynchronous child ownership or incremental I/O;
- caller-provided descriptors or merged streams;
- size limits, timeouts, parent-sent signals, process groups, or terminal control;
- another native target;
- tuple syntax, which remains a separate compiler-wide v0.33.0 language milestone.