Nocter v0.15.0 Release Notes
Download nocter-v0.15.0-arm64-darwin.tar.gz
Nocter v0.15.0 establishes a practical application foundation on the specification-first compiler. It separates public module contracts from physical implementation sources, generalizes argument packs, introduces typed compile-time constants, closes remaining compiler authority leaks, and qualifies those changes through a complete native text-processing application.
Source and Module Contracts
include ./file.nct now composes one exact physical source directly and directionally. It does not import a module, widen visibility to a directory, or expose declarations transitively. use selects directory modules only.
Each directory module exposes public API through its index.nct. A short module root can declare opaque types and bodyless public behavior while reciprocal direct includes join those contracts to private definitions in responsibility-named sources. Public documentation and editor presentation use the contract source; checking and implementation navigation retain the private definition.
Interface default methods use an explicit default modifier. Required methods, inline defaults, and bodyless defaults are therefore unambiguous, and a separated default body keeps the same semantic callable identity as its public contract.
Argument Packs
Functions, construction functions, methods, interface methods, and matching implementations can declare one final typed argument pack such as ...parts: &str. Calls may provide individual pack arguments, spread a sequence, or forward an incoming pack.
Call checking owns inference, moves, borrows, provenance, and cleanup across fixed and packed arguments. Target and native layers consume a compiler-owned pack transport plan instead of reconstructing callback or descriptor semantics. String.concat(...parts: &str) is the first standard-library API built on the generalized surface.
Compile-Time Constants
const defines typed, storage-independent boolean, integer, and static string values. Constants participate in ordinary imports and direct includes, can be separated into public contracts and private initializers, and supply fixed-array lengths.
One constant-expression planner and evaluator owns typing, arithmetic, conversions, short-circuiting, dependency ordering, and cycle detection. Header declarations and lexical body annotations provide their own already-selected name targets; neither layer reinterprets the other layer's scope. Standard Darwin syscall, flag, errno, path-limit, and stream-descriptor values now use constants.
Closed Compiler Boundaries
Checking consumes explicit frontend bindings rather than using the source presentation index as semantic input. Concrete specialization follows dispatch evidence frozen by checking instead of repeating lexical lookup. MIR publishes closed runtime type shapes rather than semantic type-store storage, and one ABI schema owns the numeric facts shared with ARM64 lowering.
These boundaries enforce a single dependency direction: each responsibility knows the contract published by its predecessor, not that predecessor's internal representation. Diagnostic and editor indexes project semantic results but cannot change them.
Practical Qualification
The new text-report example combines a package executable, child module, opaque contract-first type, direct source includes, borrowed iteration and search, owned strings, formatting, process arguments, and fallible file I/O. A shared public-example catalog compiles every package executable and runs successful and error scenarios as native processes with exact status and output checks.
That application exposed a lifetime mismatch for a loop-owned iterator. Ownership and provenance now consume the same checked loop-body scope: iterator borrows remain valid throughout the body but cannot escape into an outer binding or result.
Compatibility and Scope
v0.15.0 intentionally removes the former source-file interpretation of use and the implicit interface-default spelling. Source files must use include, and reusable interface bodies must say default. The compatibility boundary is the published specification, not undocumented compiler behavior or diagnostic wording.
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,137,169 bytes with SHA-256 50d63f70bff105b1abc5eb62e777fe31d89678913f3481b00c8fdf2c3d3429cf. It was generated twice from release-content commit d19c6951b79a58e0dc39bbfff4f36bcd869c6a74; 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 the complete framed LSP lifecycle. The installed home remained byte-identical throughout the smoke matrix. The published release contains exactly that qualified archive.