Nocter v0.16.0 Release Notes
Download nocter-v0.16.0-arm64-darwin.tar.gz
Nocter v0.16.0 makes recoverable failures practical without introducing a hierarchy of error types. Every T! still uses the single built-in error payload, while that payload now safely owns runtime messages, supports context and classification, and cleans up deterministically.
Owned Failure Values
The built-in error is now a one-word, move-only handle to an immutable runtime node. error.new(code, message) snapshots both input strings, so errors may safely escape the storage that produced their text. failure.context(message) consumes an existing error and adds an outer reporting frame without changing its root code.
Readonly code(), message(), and has_code() operations support inspection and exact classification. Process reporting prints context from outermost to innermost, followed by the leaf message, releases the complete node chain once, and exits with status one. Deep context chains use iterative cleanup rather than the native call stack.
Every fallible value is move-only because its failure branch may own an error. A newly produced fallible temporary still works with postfix ?; propagating a stored outcome uses the canonical move outcome? form.
Closed Runtime and Standard-Library Boundaries
One compiler runtime contract owns the error handle, node kinds, field offsets, static-node discrimination, and reporting scratch layout. Machine layout, generated destruction, and ARM64 lowering consume that schema instead of maintaining parallel numeric rules.
The standard error API remains ordinary Nocter source. Implementation primitives are private to the source that uses them whenever possible. A closed registry validates the exact exposure of trusted primitives without making source visibility a backend concern or exposing implementation operations through package namespaces.
Dynamic error construction aborts if its infallible private allocation fails. Recoverable memory allocation failure uses a prebuilt static error node, so reporting an exhausted allocator cannot recursively allocate another error.
Editor and Source Presentation
Opening an installed standard-library contract or implementation source now analyzes that file as part of the one selected toolchain standard package. The language server no longer registers the same canonical standard root as a second path package, including when the editor workspace itself contains the installed home.
Source rendering also preserves the canonical as spelling, and hover for a mutable local now renders var rather than changing the declaration to let.
Compatibility and Scope
The source-level failure channel remains T! with the built-in error; no user-defined failure payload, implicit conversion, interface object, vtable, or reference count is introduced. Code that stores a fallible value may need an explicit move when propagating or consuming it. Code and message views are tied to the borrowed error handle rather than to constructor inputs.
The only implemented host and native target remains arm64-darwin. Unsupported language and runtime forms are rejected before machine-code emission.
Qualification
The qualified arm64-darwin archive is 7,140,438 bytes with SHA-256 516b212138f8af2d1fef8d7b6a7c3577a670608d86b02c31ed6ca48d006f37b0. It was generated twice from release-content commit 1d656283f27fb02a61f9ff1b1593040989e54cf2; both compressed archives and both extracted homes were identical.
A fresh extraction without environment configuration passed release identity and installation diagnosis, package initialization, locked/offline check and native test, deterministic JSON graph, run, explicit build, direct Mach-O execution, and framed LSP analysis of installed standard contract and implementation sources. The installed home remained byte-identical throughout the smoke matrix. The published release contains exactly that qualified archive.