BREAKING CHANGES:compiler: parameterless calls of inline functions lower to their bodies, changing their EDAG, Rust output and module hashes; unused parameter, frame-slot and rest aliases anchor nothing. (#2398)
BREAKING CHANGES:edag: frame reads are ['frame', N] and closures are ['=>', length, slots[], body], with [] for no captures. Recompile source lowered to the previous frame format. (#2393, #2395)
BREAKING CHANGES:edag: call arguments are item lists, such as ['()', f, [a, ['...', b]]], instead of array-valued nodes; serialized calls and their content hashes change. (#2466)
BREAKING CHANGES:edag/memo and edag/amnesia return represented Result<EdagValue, EdagValue> values, with represented arguments and contexts. Use represented invocation and explicit runtime compilation; memo's unused public frame field is removed. (#2590, #2591)
BREAKING CHANGES:edag/operations: operation takes a represented, state-threaded evaluator and returns [state, ValueResult] from (node, state); the host-valued operations table and Operations type are removed. (#2591)
BREAKING CHANGES:compiler/transpiler: transpile yields runtime data directly through Effect<ReadWhole | ResolveFileModule | CompileValue, unknown, SourceError | IoChannel>. Remove the { value } wrapper and compose a CompileValue handler for callable exports. (#2595, #2601, #2724)
BREAKING CHANGES:compiler: custom runners implement readWhole instead of readFile; reader exports and _Source / _ImportSource move to compiler/source, with parse still re-exported. Initialization errors carry thrown: EdagValue. (#2595, #2724)
BREAKING CHANGES:compiler/ast: remove run, values, _own, Import, Denotation, ModuleDenotation, Sharing and sharing. Interpret through compiler/transpiler.interpret or EDAG lowering and memo, with explicit runtime conversion. (#2526, #2595, #2601)
BREAKING CHANGES:edag/analysis returns Result<Analysis, string>; handle or unwrap it. bindingError is replaced by checked(a, root?), returning the original analysis or a diagnostic. (#2544, #2611)
BREAKING CHANGES:compiler/parser: blocks admit terminating if statements alongside const; syntax gains If / BlockStatement, and grammar block reads statement instead of constStatement. (#2413)
BREAKING CHANGES:compiler/ast: array items and call arguments are AstItem (a value or AstSpread); parser syntax and grammar use Item in those positions too. (#2515)
BREAKING CHANGES:compiler/ast: object members are tagged [':', name, value] and objects hold AstEntry (member or spread). Read members as [, name, value], and distinguish entries with isSpread. (#2519, #2523)
BREAKING CHANGES:compiler/parser: object syntax holds Entry[] (member or spread); Member.spelling replaces computed. Grammar exports member, entry, entries; key is folded into the variant Member rule. (#2523, #2641)
BREAKING CHANGES:ebnf/lib/js: number is a leading-digit variant instead of [uint, { bigint, real }]; numeric helper annotations widen parts of its inferred type to Rule and Tuple. (#2453, #2645)
BREAKING CHANGES:compiler: Number and Array are reserved binding names; Array cannot be referenced as a value. Property names remain permitted. (#2667, #2664)
BREAKING CHANGES:edag: binary own is replaced by the no-operand ['entry'] function; represented functions are Closure | EntryFunction. nanvm-lib's Any::own_property becomes Any::entry. (#2661)
BREAKING CHANGES:compiler/serializer: generated bindings share one $n counter, skipping export-name collisions. function_text.parameter is removed; use renderFunction(analysis, index) for complete function text rather than constructing names by depth. (#2636)
BREAKING CHANGES:edag/rust: scope returns { lines, uses }; useLines renders imports, operator entries may return Printed<string>, and Printer members return Printed values. (#2487)
BREAKING CHANGES:nanvm: OpId moves to edag/types.ts; media/rust removes withoutStringLiterals. (#2487)
BREAKING CHANGES:nanvm-lib: IStaticFunction::static_function takes a fourth argument, Option<&'static str> function text; pass None for a function without text. (#2385)
BREAKING CHANGES:nanvm-lib: multiplying BigInt returns Result<BigInt, Any> and throws RangeError past 2^14 words; handle the result with ?, unwrap or expect. (#2730)
BREAKING CHANGES:nanvm-lib: Uint requires AddAssign; implement it for custom index types used by SizedIndex. (#2692)
BREAKING CHANGES:nanvm-lib: remove Iter::try_reduce; use Iterator::try_fold over result items, noting that it also combines the first item with the default. Add Iter::zip_longest. (#2508)
BREAKING CHANGES:media/json: serializers write negative zero as -0 instead of 0, preserving round trips and changing document bytes and content hashes where negative zero occurs. (#2717)
BREAKING CHANGES:compiler removes _tryJson; use the new media/datajs / media/datajs/serializer exports tryJsonSerialize and tryJsonStringify for JSON output. (#2533)
BREAKING CHANGES:media/json/parser.lexeme moves to ebnf/utf16, alongside unitAt; it refuses non-code-unit leaves and strings outside variant tags rather than answering text for them. (#2691)
BREAKING CHANGES:media/datajs/vectors/matrix: matrix failures carry readonly string[] defects instead of one prose string; new check reports those defects without rendering. (#2743)
BREAKING CHANGES:types/bit_vec: byte-list conversion throws on non-bytes and -0; tryU8ListToVec still returns null only for excess length. isByte moves from ebnf/byte to types/number. (#2424)
BREAKING CHANGES:types/byte_set, types/nibble_set: refuse fractional or out-of-universe members and reversed ranges; has refuses negative or fractional members. Add the shared types/bit_set algebra. (#2468)
BREAKING CHANGES:types/bit_set: refuse -0 members, sizes and bounds; UTF-8 and UTF-16 decoders flag -0 units with errorMask. types/number exports isUintUpTo(max). (#2673)
BREAKING CHANGES:types/set: PersistentSet is a common/monoid.Stack<ReadonlySet<T>>, with empty now null. common/monoid exports step, runs, Run and Stack. (#2674)
BREAKING CHANGES:js/prototype: prototypeNames widens from a literal tuple to readonly PrototypeName[]; its values and the PrototypeName union are unchanged. (#2474)
BREAKING CHANGES:crypto/sign: fromCurve returns { rfc6979, nf, mul, g }; use .rfc6979 for the old record, whose type All is now Rfc6979 and which gains bits2intModQ. (#2483)
BREAKING CHANGES:crypto/sign: remove variadic concat; use msb.listToVec([a, b, ...]) or msb.concat(a)(b) from types/bit_vec. (#2444)
BREAKING CHANGES:effects/node: writeUtf8File needs WriteFile | WriteBytes | Rm rather than only WriteFile; add those operations to callers' declared sets. (#2485)
BREAKING CHANGES:effects/node: virtual State.internet is StringMap<Vec>; handle missing URLs. Env is StringMap<string>, so keys passed through keyof Env must be strings. (#2507)
BREAKING CHANGES:effects/node: readdir yields UTF-8 name order and breadth-first directory order across Node and virtual runners, replacing native enumeration order. (#2582)
BREAKING CHANGES:effects/node: NodeOp adds spawn and childWait, with Child, SpawnOptions, ExitStatus; full NodeOperationMap implementations must handle both. (#2659)
BREAKING CHANGES:mcp.casMcpHandlers and mcp/cas.casToolRegistry take a built FileCas instead of a home path; pass fileCas(sha256)(home). casMcpServer(home) is unchanged. (#2510)
BREAKING CHANGES:cas/cli.main is a Commands table, not a Program; call cli.dispatch(main) for a program. fjs run now accepts command tables, with dispatch and new isMain handling both forms. (#2732)
BREAKING CHANGES:git/store.alternatesIn moves to git/alternates; change the import path. git/refname.sameBytes is removed; use types/list.sameItems. (#2495, #2675)
BREAKING CHANGES:effects/node.versionLessThan and website/changelog.numbers are removed; use types/version.cmp and tryParse, stripping a leading v or prerelease/build suffix first. (#2414)
BREAKING CHANGES:emergent_testing: isInteger and isIdentifier move to js/identifier; browser formatDuration moves to emergent_testing.formatDuration(digits)(ms), with reportDuration providing the one-decimal form. (#2676, #2448)
BREAKING CHANGES:text: remove flat, Block, Item, with no replacement; users can copy the deleted short flat implementation, built on types/list.flatMap, where needed. (#2479)
BREAKING CHANGES:text/sgr: remove createConsoleText, backspace, Stdout, WriteText; the control-character code unit is available as text/ascii.backspace. (#2714)
BREAKING CHANGES:web.resolve returns Result<Resolved, Refusal>, where Resolved is { path, notFound }; read .path for the old value. Directory 404s identify the missing index.html. (#2742)
BREAKING CHANGES:website/page: Dir requires demoDirs and Build requires funding; pass empty arrays to retain unmarked entries and no funding footer. (#2457, #2538)
BREAKING CHANGES:compiler/examples/module.f.mjs is now module.f.js; compiler/edag/demo no longer exports examples. Import the shared six-demo list from compiler/examples/module.f.js. (#2626, #2648)
BREAKING CHANGES:ci: generated Nix environments move from nix/ to gen.nix/, with non-executable scripts run through sh. ci/node.nodeMainSteps is removed in favor of platformNodeSteps. (#2409, #2429)
BREAKING CHANGES:ci: packed-package checks close node26 instead of a package-check job; ci/package exposes packageCheckSteps / consumerDirectory instead of job builders. nodeVersionJobs takes PackageConsumer | undefined. (#2497)
BREAKING CHANGES:ci: remove ci/node.packageArtifact and the upload/download-artifact action pins; the workflow step schema accepts optional working-directory. (#2497)
BREAKING CHANGES:ci: Job / jobSchema require timeout-minutes; generated jobs use 15 minutes. (#2689)
BREAKING CHANGES:ci: the wasm job's checks move into ubuntu-arm; remove the wasm required status before regenerating. ci/rust removes wasmJobId / rustWasmSteps and adds shellRustVersionSteps. (#2716)
compiler: accepts terminating if guards, array/call/object spreads, hexadecimal and binary literals, numeric separators, !, typeof and shorthand members. (#2413, #2453, #2515, #2523, #2622, #2623, #2638, #2639, #2641)
compiler: accepts optional chains, recursive functions through their own const name, Number(exp), a[Number(i)], instanceof Array, and the enumerable-own-property entry helper. (#2630, #2660, #2661, #2667, #2664)
edag: add ['self'], the current function, supported by analysis, both interpreters, Rust output and both JavaScript writers. (#2629)
compiler: reads and writes files larger than 128 KiB, reports failed source reads in the host's words, and counts CR, CRLF, U+2028 and U+2029 correctly in token locations. (#2485, #2724, #2737)
compiler/parser: export errorLocation to render a ParseError location as a path, point or span; it replaces compiler's private _errorLocation. (#2681)
compiler/serializer: spells eager/lazy operators with correct grouping, establishes shared nodes inside lazy operands, and no longer falsely refuses accesses over named constants. (#2398, #2408, #2449)
compiler: JSON output expands shared nodes instead of refusing them; compileFile is exported, and repository walks skip target. (#2526, #2659, #2486)
edag/value: represented values retain code, captures and identity; toData materializes function-free data, while effectful toUnknown compiles callable values through CompileValue. (#2541, #2599, #2601, #2608)
edag/value: metadata validates evaluated object properties; validateClosure checks function lengths, bindings and scopes. (#2543, #2544, #2548)
edag/value: add value evaluation helpers for arrays, objects and spreads, function construction and calls, property access, primitive coercion, and result sequencing. Operation tables cover arithmetic, exponentiation, bitwise operations, shifts, comparisons, relative indexing and slicing; non-coercive operations are also available. (#2549, #2551, #2553, #2554, #2555, #2557, #2560, #2561, #2562, #2563, #2566, #2567, #2568, #2570, #2571, #2576, #2584, #2585, #2586, #2587, #2588, #2589)
edag/rust, nanvm-lib: emit spreads, arbitrary-size bigint literals, Object.is, Number, computed indices/keys and functions returning undefined; compiled functions answer their source text. Any::get_iterator and public IteratorRecord iterate array elements and string code points; other values throw as non-iterable. (#2385, #2472, #2482, #2484, #2496, #2504, #2525, #2527, #2528, #2602)
nanvm-effects-node: add a synchronous effect loop and native console, file/directory, readWhole and resolveFileModule operations; unsupported requests return notImplemented through their continuation. (#2653, #2654, #2655, #2656, #2724)
nanvm-lib: flat, join, to_json use explicit traversal stacks; spread-buffer reservation failures throw RangeError instead of aborting. Sole-owned deep-value destruction and final container allocation remain resource limits. (#2522, #2728)
nanvm-lib: VM throws use "<Name>: <message>"; failed TryFrom<Any> conversions now throw "TypeError: unexpected type". (#2706)
effects/node: writeBytes rejects unsafe offsets and writes ending beyond maxOffset before opening the path. (#2735)
effects/node: export fileSizeRefusal(path, size) for the readFile size limit shared by the host and virtual runners. The virtual runner's oversized-file diagnostic now includes the file size. (#2682)
effects: toIoError honors string message fields, own or inherited, and uses the thrown value's string form otherwise. Node operations, including import_, and the EDAG JavaScript loader's compileValue return an IoError with message thrown value could not be read when reading a thrown value fails, including hostile toString methods or throwing message / code getters. (#2671)
effects/schema: publish RTTI schemas for data-shaped compiler I/O and console-input requests and results, with shared result/error schemas and structs. The operation schemas are checked against the handwritten TypeScript declarations. (#2535)
types/bit_vec: add wholeBytes, bitsIn and tryU8ListToVecMsb; text/utf8 adds vecToCodePointList and checked fromU8List. (#2423, #2430, #2446, #2724)
types/list: add sameItems, intersperse, mergeAdjacent; types/array adds dedup / assoc, and types/function/operator adds cascade. types/range_map adds mapValue to map an entry's value while keeping its bound, and values to list values without their bounds. (#2428, #2438, #2432, #2502, #2699)
git/header: new field and optionalField descriptors expose .get, .tryGet, .check views as applicable; tryReadAtLeast, Field, OptionalField, Parse accompany them. (#2445, #2721)
git: export object.tryType and ref.writeLoose; media/revision exports hashEntries / mapHashes, and basen/cbase32 adds canonicalCBase32. (#2425, #2719, #2509)
text/sgr: add stripSgr; text/ascii exports nul and latinSmallLetterM. text/percent adds percentEncodePath, and the media/html DOM adapter exports macrotask. (#2421, #2422, #2742, #2707)
website: add UTF-8, Base64/CBase32, persistent-tree, RTTI, compiler, SHA-1, HMAC, PoW and VDF demos; SHA-2 offers six variants and copyable outputs. Demos retain input nodes and can schedule incremental work. The RTTI demo's "Used in this project" view offers fourteen project schemas with accepted sample values and copyable package imports; website/funding publicly exports fundingSchema for reuse. RTTI panes show TypeScript, JSON Schema and canonical data, compare schemas, and mark validation-error paths. B-tree and Patricia-trie graphs show the new version, with new nodes blue and shared nodes plain; parents are centred beside their children. DataJS adds a Nested tree example of the aligned layout. (#2406, #2412, #2455, #2458, #2461, #2513, #2516, #2529, #2531, #2536, #2545, #2546, #2615, #2617, #2619, #2621, #2632, #2651)
website: demo labels and captions are bold; Contents marks demo subtrees, and page footers show funding links. (#2650, #2457, #2538)
ci: Setup.mergeQueueOnly optionally limits platform jobs to the merge queue; generated CI cancels superseded PR runs. (#2688, #2687)