Nocter v0.66.0 Release Notes
Nocter v0.66.0 adds durable local application state. Applications can now replace files through a durability-preserving protocol and retain bounded byte-keyed state across orderly shutdown, interrupted writes, and process restart without importing an external database. The release changes no Nocter source-language syntax.
Durable Filesystem Replacement
std/io file owners now expose explicit synchronization on both executor-safe and blocking surfaces. Exclusive file creation prevents a replacement operation from truncating or reusing an unrelated sibling, while directory owners remain an internal filesystem authority.
std/fs.write_durable and write_text_durable write through a bounded, exclusively created sibling file. A successful call means that the complete content was synchronized, renamed exactly once over the destination, and followed by synchronization of the parent directory. Ordinary write retains its lighter contract and does not claim durable commitment.
Recoverable Byte Store
The new std/store module provides a single-writer Store with copied byte keys and values, explicit commit, removal, reopen recovery, and compaction. StoreLimits bounds keys, values, entries, snapshots, complete records, and physical journal bytes before untrusted lengths can drive allocation.
use std/store.Store
async func retain(path: &str): void! {
var store = await Store.open(path)?
store.set("answer".bytes(), "42".bytes())?
await store.commit()?
await store.close()?
}
Every committed record is one complete, versioned, length-delimited, CRC-32-protected snapshot. Recovery validates every complete record in order, discards only an incomplete final record, and publishes state only after the final complete snapshot passes structural and checksum validation. A failed or cancelled commit makes its owner terminal; reopening is the sole way to resolve an indeterminate durable outcome.
Compaction derives one durable replacement from the store's authoritative in-memory state instead of reparsing the journal. Entry order and encoded snapshots are deterministic and independent of the temporary hash index used while recovering duplicate keys.
Persistent Stateful Service
The http-service example now commits its structured event after admitted handlers drain, closes the store, reopens it to simulate restart, verifies the exact recovered bytes and sequence, and removes its example-owned state file. The installed-artifact qualification exercises this whole path rather than treating persistence as isolated unit behavior.
Compatibility and Non-goals
v0.66.0 adds standard-library APIs without removing a source-language form. It does not add SQL, an ORM, automatic serialization or schema migration, concurrent or multi-process writers, distributed storage, a compiler-recognized persistence type, an external database dependency, or a multithreaded executor.
Release Qualification
Release-content commit e3f499b5d38d87073fde1c06e1c474772a1c7752 passed the complete disposable compiler gate, deterministic 363-page documentation generation, two independent byte-identical package builds, installed-home workflows, every public example, interactive LSP checks, immutability checks, and compiler and standard-library tamper rejection. The retained arm64-darwin archive is 9,477,116 bytes with SHA-256 d5476913c5bf8033f6b9e2b6844a42615b166a3af98b02e95af34043539cf87c. Publication must reuse this exact archive without rebuilding it.