text / mime: separate text-ness from well-formedness in the detector — new isTextCodePoint excludes control characters, so valid-but-control blobs are no longer mislabelled as text/plain#1183
BREAKING CHANGES:text: move the Unicode code-point predicates into fs/text/code_point/module.f.ts; isValidCodePoint is no longer exported from fs/text/utf8/module.f.ts#1182
cas/mcp: make metadata-only cas_get size-independent — the read stream is folded through the new fs/mimedetectStream state machine instead of being drained into one Vec#1181
BREAKING CHANGE:bnf: split the backends out of fs/bnf/data, leaving it as the pure serializable IR — LL(1) moves to fs/bnf/ll1 and recursive descent to fs/bnf/descent#1179
cas: extract casAddFile — streams a file through cas.write() and returns the content hash; the CLI cas add and MCP cas_add both delegate to it #1158
cas: move the CLI command handlers into fs/cas/cli/module.f.ts, mirroring fs/cas/mcp/; fs/cas/module.f.ts keeps only shared types and primitives #1157
fs/html: replace escapeCharCode's four-arm switch with an escapeTable lookup and a single fallback — the escape set is now data #1145
cas: reimplement casUpload on top of fileCas.write(), inheriting lease GC, dedup-on-publish, and stat size verification; the source is deleted only after a successful write #1153
cas: implement the lock-free staging upload — fileCas.write streams each chunk to a leased _stage/ file while hashing, then publishes by rename. Adds the createExclusive, writeBytes, and stat effects #1149