Nocter v0.39.0 Release Notes
Nocter v0.39.0 adds numeric Internet addresses, synchronous TCP and UDP, and finite monotonic operation timeouts as one coherent std/net foundation. The only implemented host and native target remains arm64-darwin.
Numeric Address Values
Ipv4Address, Ipv6Address, IpAddress, and SocketAddress are copyable target-independent values. They contain logical address bytes and ports rather than native socket records or pointers. Complete parsing consumes numeric address forms without DNS or allocation. IPv4 output is dotted decimal; IPv6 output follows RFC 5952 lowercase compression; socket-address output uses brackets to keep IPv6 ports unambiguous.
The address types implement the standard formatting, hashing, equality, and total-order contracts over the same logical representation. Direct string conversion and Format share one canonical generator, and recoverable conversion accepts an explicit TryAllocator.
Synchronous TCP
TcpStream provides uniquely owned connected byte streams and implements the existing Reader and Writer contracts. TcpListener binds numeric addresses, reports the effective address after port-zero selection, and accepts a stream together with its peer address. Streams expose local and peer addresses plus explicit read, write, or bidirectional shutdown.
Descriptors close at most once through either explicit terminal close or destruction. Partial construction failures cannot leak a descriptor, descriptors do not leak into executed child processes, and stream writes cannot terminate the process through SIGPIPE. IPv6 listeners are IPv6-only, so an application serving both address families owns one listener for each family.
Boundary-Preserving UDP
UdpSocket supports unconnected send_to and connected send without pretending that datagrams are byte streams. Each successful send transmits one complete datagram. Each receive consumes at most one datagram and returns DatagramRead, which keeps the sender, copied length, and truncation status together. An unread truncated suffix is discarded, and a zero-length datagram remains a successful message rather than stream EOF.
Binding port zero, effective local-address reporting, peer observation, terminal close, stable errors, and IPv6-only behavior use the same ownership and target boundary as TCP.
Monotonic Operation Timeouts
TCP connection, listener acceptance, TCP reads and writes, and UDP connection, sends, and receives support finite timeouts. Every operation converts its relative Duration into one monotonic deadline. Interruption, readiness retries, and partial stream progress reuse that deadline rather than restarting the duration. Passing absence to a timeout setter restores unlimited waiting.
A zero timeout still makes one immediate operation attempt, allowing already-ready work to succeed. An operation that would wait after its deadline returns the stable std.net.timed_out error. Wall-clock changes cannot affect timeout accounting.
Stable Errors and Tooling
Public network failures use stable std.net.* codes instead of exposing native errno values. Raw descriptors, native address layouts, byte order, polling masks, and syscall classification remain inside the private target adapter. The compiler and language server consume the ordinary checked declarations; neither contains network-specific syntax or semantic rules.
The network-address.nct single-file example demonstrates numeric parsing and canonical output. The network-loopback package exchanges TCP and UDP payloads over a kernel-selected local port and observes a finite timeout without DNS or an external service. Hover, completion, signature help, definition, implementation navigation, references, rename, semantic tokens, and inlay hints work through the same public contracts.
Compatibility and Non-goals
v0.39.0 does not add DNS or service-name resolution, URLs, HTTP, WebSocket, TLS, asynchronous I/O, public nonblocking sockets, multicast, broadcast, ancillary messages, network-interface discovery, IPv6 zone identifiers, Unix-domain sockets, raw sockets, or another native target.
Candidate Qualification
Release-content commit 5cfa6352621f32b2dd9c94e61f25a270258c3af9 passed two independent complete compiler gates, the explicit public-HTTPS dependency-acquisition test, and two independent optimized package builds. The resulting archives and installed homes were identical. Fresh extraction passed the installed CLI, all public examples and process contracts, native execution, framed LSP analysis, installed-home immutability, and compiler and standard-library tamper rejection.
The nocter-v0.39.0-arm64-darwin.tar.gz release is the exact retained qualified archive. It is 8,600,636 bytes with SHA-256 3f0f656a2196d6be8413153b40ce46125f8780ad7a6de94ad7b4c72a2b5bc393; publication did not rebuild it.