Nocter v0.67.0 Release Notes
Nocter v0.67.0 completes the foundation for operational local applications. One program can now combine validated configuration, exclusive durable state, safe reload, bounded request handling, and graceful restart recovery without importing an external runtime or database. The release changes no Nocter source-language syntax.
Process-exclusive Indexed Store
Opening a Store now acquires a non-waiting operating-system lock on a stable sibling identity. Another owner in the same or a different process receives an ordinary recoverable error, and process termination releases ownership without relying on stale marker bytes.
Retained entries use one transient seeded hash index for lookup while an insertion-order chain remains the persistence authority. entries() lends ordered key and value views without copying. Hash placement is never serialized and hash collisions are confirmed by exact key bytes.
Incremental Durable Transactions
Journal format version 2 appends bounded atomic mutation batches instead of rewriting the complete state for every commit. A batch becomes visible entirely or not at all; compaction and bounded fallback produce one deterministic checkpoint. Recovery discards only an incomplete final frame, rejects complete corruption, and enforces allocation bounds before reading untrusted lengths.
The published v0.66.0 snapshot format has one explicit reader. Opening a legacy store preserves its last committed data and sequence, then normalizes it through the same durable replacement path used by ordinary compaction.
Validated Configuration
The new std/config module defines schemas for text, Boolean, signed, and unsigned fields with required, secret, length, and inclusive-range constraints. Callers apply named sources in explicit order; each complete source is validated before it can replace any retained value. Finalization produces one immutable configuration with typed accessors and source provenance.
JSON objects, explicitly selected environment variables, structured command-line results, and authored defaults all enter this source-neutral model. Adapters do not choose precedence or repeat schema validation. Secret values are unavailable to configuration presentation and diagnostics.
Reloadable Service Lifecycle
std/service now distinguishes consumable Darwin SIGHUP reload requests from sticky SIGINT and SIGTERM shutdown. PublishedConfiguration shares only complete immutable configurations. An application validates a separate candidate before one atomic replacement, so a failed reload keeps the preceding generation without rollback.
The http-service example composes the complete operational workflow: defaults → JSON → environment → command-line precedence, redacted structured events, process-exclusive persistent state, incremental commits, bounded concurrent handlers, repeated valid reload around a rejected reload, startup-only policy, graceful drain, a final durable shutdown event, and restart verification. It also terminates cleanly before accepting any request.
Compatibility and Non-goals
v0.67.0 reads and normalizes v0.66.0 store journals. It does not add SQL, an ORM, distributed or multi-writer storage, automatic application-schema migration, implicit configuration precedence, background retry, a multithreaded executor, or executable hot replacement.
Release Qualification
Release-content commit 9a32c4a5dec2ce35320571e71bdbdee12a985d47 passed the complete compiler, native, LSP, documentation, example, installed-home, migration, crash-tail, contention, reload, deterministic packaging, and artifact-integrity gates. Two independent package builds produced the same 9,498,544-byte arm64-darwin archive with SHA-256 8d370918223ace0b1583f873bb47b826888ee5c531c1dcbd9d54eea748dc2f9a. Publication must reuse this exact retained archive without rebuilding it.