Features
- Engine-held values flow through dynamic code: values born in the embedded engine now cross into
unknown/object-typed slots and back —typeof, strict equality,String(), keyed reads and writes, calls, and method dispatch route through the engine (its own prototypes run, JS-exact), with reference-preserving identity on the round trip. Unions likestring | objectcompile wholesale into the checked-dynamic representation, and nullish coalescing and optional chains work on every dynamic value. Operations not yet routed fail loudly by name — the boundary's silent wrong answers (typeofmisreporting, phantom.length) are gone. Object.create(null), arrayentries()/keys(), and variadicObject.assign: real null-prototype dictionaries with Node's inspect/toString/comparison behavior (the dynamic tier delegates to the engine's ownObject.createfor live prototypes); live index-walking pair iterators;Object.assign(target, ...sources)with JavaScript's exact evaluation order and V8's position-dependent error texts.- Erased ambient declarations behave like Node: chains rooted in
declared values compile and throw the catchableReferenceErrorNode produces at first touch; never-read unmappable bindings vanish; nullish-cast bindings answer Node's exactTypeErroron member access; assertion-shaped generic signatures monomorphize per call. - Misuse of fs, net, dgram, tls, and stream APIs throws Node's validation ladders: argument checks run in Node's order with
ERR_*codes and message-exact texts;fs.existsis genuinely async (including its no-error-argument wart), andmkdtempSyncandlchmodare real. - Keyed writes land on dynamic receivers (
bag[key] = valueon objects built up dynamically, withToPropertyKey-exact key handling), and array destructuring walks dynamic sources with V8's exact non-iterable error wordings. - Library mode: profiles deny surfaces by manifest id — a
fencesarray refuses fenced surfaces reached by the compiled graph, with the profile's guidance attached as a visibly-attributed note; teachings generalize to any refusal; fence evaluation reads the same dead-stripped graph as the determinism attestation, so full fences imply a deterministic attestation by construction.
Fixes
- Mixed engine-vs-native
deepStrictEqualcomparisons fence loudly instead of fabricating a failure result. - The LLVM code generator marshals dynamic values in
jsMarshalpositions identically to the C backend (a latent gap). - Concurrent plain and sanitized test-suite runs no longer race each other's scratch directories (a test-infrastructure fix).