Nocter v0.55.0 Release Notes
Nocter v0.55.0 introduces explicit owning callable erasure and uses it to provide deterministic HTTP routing and a complete practical service application. Heterogeneous callbacks now have one checked source model, one closed runtime dispatch path, and one destruction authority.
Explicit Erased Callables
any func, any &func, and any &+func are sized, move-only callable values. They preserve the enclosed parameter and result types, invocation capability, effect guarantees, result provenance, and capture lifetime. Readonly and readwrite values may be called repeatedly through their stated access; an owning any func call consumes the callable exactly once.
Erasure occurs only when an explicit erased destination type requests it. It allocates compiler-owned environment storage and therefore remains visible to noalloc checking even when invocation itself is allocation-free. Ordinary func, &func, and &+func annotations retain their existing statically witnessed behavior and do not acquire hidden boxing.
One Closed Dispatch Path
Checking records the concrete witness and erased contract once. Executable closure freezes the environment layout, invocation target, optional destruction target, and consuming adapter before MIR. Later compiler layers receive dense identities and typed indirect operations instead of repeating callable selection or recovering targets from names.
Consuming invocation stages the callable before later arguments. If a later fallible argument exits early, cleanup releases the staged environment exactly once; on invocation, ownership passes to the generated adapter, which preserves the result before destroying captures and releasing the environment mapping.
Parsed Request Targets
HTTP requests now expose a RequestTarget that retains the validated original spelling together with path boundaries, decoded path segments, and query iteration. Routing and applications consume this value rather than reparsing raw target text. Malformed percent encoding has one recoverable failure boundary, and owned decoded values are created only when an application asks for them.
Deterministic HTTP Routing
Router validates exact and named-segment patterns during construction, rejects duplicate or ambiguous routes, and selects method, pattern, and typed route parameters deterministically. Handler stores heterogeneous application handlers through readonly any &func values without owning tasks, connections, allocators, or response framing.
Small response conveniences derive from the existing Responder and ResponseWriter transitions. Applications still choose not-found, method-not-allowed, handler-failure, connection, admission, and shutdown policy explicitly; the router owns selection only.
Practical HTTP Application
The http-service example now demonstrates exact and parameter routes, query decoding, handler failure, malformed input, request timeout, a 32 KiB streamed request and response, sequential keep-alive, bounded TaskGroup admission, and deadline-bounded graceful draining using public APIs. It provides a complete reference for composing routing with the streaming service lifecycle rather than a second hidden HTTP execution model.
Editor Support
Hover, completion, declaration navigation, and diagnostics understand erased callable contracts, Router, Handler, and application dispatch. Presentation derives from the same checked callable model used by compilation; the editor does not infer erasure or reconstruct handler types from source spelling.
Compatibility and Non-goals
Existing statically witnessed callables and direct HTTP service APIs retain their behavior. This release does not add general any Interface objects, inline erased environments, user-selected callable allocators, middleware stacks, automatic request decoding or response serialization, HTTP/2, HTTP/3, WebSocket framing, or concurrent pipelined execution.
Release Qualification
Release-content commit c76a55d77924d4c691d087a5284d0958605aa80d passed the complete disposable compiler gate. Two independent optimized builds produced byte-identical archives and recursively identical installed homes. The retained archive is 9,229,595 bytes with SHA-256 06ecea489a2e01adc2549fd4f29d41b02aa4b4f1278b58d7c4747100924c89ad and contains exactly 322 standard-library files. A fresh extraction passed version and installation diagnosis, locked/offline package workflows, native build and execution, every public example, the complete routed HTTP application, interactive LSP analysis and edit recovery, immutability checks, and compiler and standard-library tamper rejection. The published release reused this exact retained archive without rebuilding it.