Programming Language

Nocter

A self-contained systems language built around simplicity, encapsulation, and foolproof design.

/releases/v0.32.0.md

Nocter v0.32.0 Release Notes

Nocter v0.32.0 completes configured synchronous subprocess execution. An owning Command can now select a working directory, construct the child environment, and provide finite standard-input bytes before it is consumed by status or output. The only implemented host and native target remains arm64-darwin.

Owned Command Configuration

std/process now supports:

use std/process.Command

var command = Command.new("./helper")?
command.current_dir("./workspace")?
command.clear_env()
command.env("MODE", "configured")?
command.remove_env("UNWANTED")?
command.input("request\n".bytes())
let output = command.output()?

Configuration changes only the owned request; it does not create a child. Repeated working directory and input settings replace earlier values. Environment edits retain untouched inherited entries unless clear_env selects an exact environment, and the last operation for a name wins. Invalid text is rejected without partially changing the command.

Calling input with an empty byte view supplies immediate end of file and therefore differs from leaving standard input inherited. status still inherits standard output and standard error; output still returns owning byte vectors and typed terminal status.

One Closed I/O Lifecycle

Arguments, environment entries, pointer vectors, working-directory text, and finite input are owned and prepared before child creation. The child performs only descriptor setup, directory selection, and executable replacement. A private close-on-exec launch report distinguishes input, output, directory, and executable setup failures from ordinary child exit.

Configured stdin writes and captured stdout and stderr reads share one fair readiness loop. Each ready direction performs one bounded nonblocking operation before readiness is polled again, so a child cannot deadlock by filling an output pipe while waiting for input. Early child input closure does not terminate the parent through SIGPIPE, and every successfully created child is observed exactly once on every representable path.

Practical Integration

The subprocess-configured package example combines an exact environment, a relative executable in a configured working directory, finite input, simultaneous output capture, UTF-8 validation, and typed status inspection. Its exact output is part of installed-home release qualification, while the same authored package drives formatter and editor checks.

Compatibility and Non-goals

This release preserves the existing Command.status and Command.output result shapes and the v0.31.0 capture rules. It does not add PATH search, shell parsing, asynchronous child ownership, incremental I/O, caller-provided descriptors, merged streams, size limits, timeouts, parent-sent signals, process groups, terminal control, or another native target.

Candidate Qualification

Release-content commit 14951f2350f58354cce1c8beab8447a13949be78 passed two independent locked workspace runs with 1,541 tests passed, zero failed, and one ignored in each run. The ignored public-HTTPS acquisition test passed separately. Warnings-denied all-target Clippy, no-default-features checking, deterministic documentation, formatter checks, and repository validation also passed.

Two independent optimized builds produced the same archive and installed home. The retained local archive is 8,289,509 bytes and has SHA-256 4cf4bd44ff163bc993f919fb2d652fde54492427418b3a46230d31df70e43d45. Its isolated installed home passed version and integrity checks, every public example, package run/build/test/graph operations, the exact text-banner, stdin-prefix, subprocess-status, subprocess-output, and subprocess-configured process contracts, framed LSP requests, immutability checking, and compiler and standard-library tamper rejection. Publication reuses that retained candidate without rebuilding it.