Skip to content

v0.69.0

Choose a tag to compare

@github-actions github-actions released this 09 Aug 19:33
· 7973 commits to main since this release

Conformance (test262)

Measured on 06b2394aa, the release commit, by the promote-baseline job —
official scope (standard + annex B, no proposals), honest oracle:

target pass / total rate
js-host (gc) 31,819 / 43,621 72.9 %
standalone (pure Wasm, no JS host) 29,088 / 43,621 66.7 %

gap: 2,731 tests pass under the JS host but not standalone.

ES5 subset, standalone: 6,907 → 7,242 of 8,115 (85.11 % → 89.24 %).
The 90 % goal (7,304) was missed by 62 tests; see the program-outcome
section of plan/goals/es5-standalone-90.md for why three lever estimates
collapsed under measurement.

Highlights

Performance — compiled acorn parsing itself. A sustained effort against the
gap between compiled Wasm and native Node on the standalone runtime-dynamic lane
(the only like-for-like lane; the static lane's huge ratios are compile-time
folding, not speed). Landed in measured slices, each with a paired A/B or a
deterministic census as its instrument:

  • Per-type fnctor layouts (#3927) — an AST node struct was a 292-byte union of
    every shape its constructor ever took; per-kind layouts cut it to ~94 B,
    −31.4% of all struct bytes, and shipped default-ON for standalone after a
    same-instrument CI conformance pair showed zero non-timeout flips.
  • The expando-registry scan (#4241) — a linear linked-list walk consulted
    ~39,000× per parse collapsed from 12.98% to 0.22% of parse self-time; the
    registry's unbounded growth (a real leak pinning dead carriers) is now zero per
    parse for un-split carriers.
  • __extern_get hash dispatch (#3926), scanner rope-flatten elimination
    (#4174), boxed strict-eq/truthiness (#4173), regexp scratch reuse
    (#4185/#4208), host-import wrapper arity dispatch (#4156).
  • Net effect over the window: the garbage-collector share of a standalone acorn
    parse fell from ~23% to ~2%, and the published npm-compat measurement moved
    correspondingly. The umbrella (#4157) carries the decomposition and the
    measurement rules; the remaining gap is representation and dispatch, not
    allocation.

Type derivation on by default (#743/#4155/#4250). Whole-program type-flow
analysis — call-graph completeness, .d.ts entrypoint seeding, typed instance
reads and bindings — now runs by default, with the one unsound narrowing fenced
behind an opt-in flag until #4250's per-field write-kind verdict made it safe.
Several of these levers measured null on acorn and are recorded as such rather
than quietly kept.

Standalone correctness — reflection over compiled objects. in,
hasOwnProperty, for…in and Object.keys over closed struct instances went
from answering nothing (or a constant) to answering correctly: the any-receiver
enumeration path (#3920), the folded-yes (#4229) and folded-no/cold-tail (#4225)
static-fold defects, the instance expando substrate (#4194), and computed-key
writes to closed structs (#4194) — which is what made the copyNode idiom
(for (var k in src) dst[k] = src[k]) work at all.

ES5 conformance in the standalone target. Annex B web-compat function
hoisting, the own-property MOP, live [[Prototype]] chains for reassigned
F.prototype, primitive-wrapper valueOf, named keys on builtin prototypes, and
the runtime-eval interpreter tier — many hundreds of test262 files.

Multi-file compiles run the optimizer at all (#4235). generateMultiModule
never ran the fnctor pipeline, so every optimization above was silently inert on
the multi-file path that most packages use — a default that claimed to be on and
was not. Now runs whole-program, with cross-module name collisions refused and
counted rather than mishandled.

Pipeline and measurement integrity. The npm-compat artifact now redeploys the
page it feeds, survives a busy merge queue, and stamps the time it was measured;
budget ratchets moved to commit time; a commit-msg guard keeps authorship
correct.


What's Changed

  • fix(#4119): runtime Object.prototype.toString classifier for standalone (arm 1) by @ttraenkler in #4109
  • release: v0.68.0 by @ttraenkler in #4111
  • fix(website): collapse feature tables per-edition, not the whole section by @ttraenkler in #4110
  • docs: carry-over handoff for the ES5-gap window (suspended 2026-08-04) by @ttraenkler in #4108
  • test(react-dom): run upstream tests against compiled Wasm by @ttraenkler in #4079
  • fix(#4152,#4153): cover lodash createHybrid; correct a stale CI header that overstates PR-time validation by @ttraenkler in #4107
  • fix(release): resolve the publishing remote by URL + draft release notes by @ttraenkler in #4112
  • feat(#4155): census why a fnctor field slot is boxed by @ttraenkler in #4113
  • docs(#4155): implementation plan — staged fnctor shape reconciliation, standalone first by @ttraenkler in #4114
  • feat(#4155): Phase 0+1 — fnctor shape regression tests, opt-in typed instances by @ttraenkler in #4115
  • feat(#4155): unbox fnctor instance types by default — acorn −8.1% by @ttraenkler in #4116
  • feat(#743): new-expression call sites for parameter inference — measured, worth 2 slots by @ttraenkler in #4117
  • fix(benchmarks): declare opsPerCall for the 6 unguarded array/dom benchmarks — array/indexOf has been publishing a 310x speedup that is a folded-away loop by @ttraenkler in #4118
  • perf(#4156): host-import wrapper — dispatch on arguments.length, not ...args (~4%, and the wasm→JS crossing is the real cost) by @ttraenkler in #4119
  • fix(#4025): admit any-typed receivers for .call/.apply this-binding by @ttraenkler in #4120
  • fix(#3982): wire the react-dom upstream suite into the npm-compat generator by @ttraenkler in #4121
  • docs(#4157): umbrella issue — close the acorn-vs-Node performance gap, scheduled by @ttraenkler in #4122
  • docs(analysis+issues): root-cause clusters for ES5+untagged standalone test262 failures, and the four issues they map to by @ttraenkler in #4123
  • fix(report): stop the class/private root-cause bucket swallowing the builtin-prototype corpus by @ttraenkler in #4125
  • docs(#4158, #4159): confirm the #3251 S2 salvage, and correct #4158 against a real repro by @ttraenkler in #4126
  • fix(#4161): standalone Object.defineProperty/defineProperties define into the closure bag (harvest of PR #4124's #3979 slice) by @ttraenkler in #4127
  • feat(#4159/#4160): shared AST pre-scan flags for the prototype-index and accessor-descriptor substrate by @ttraenkler in #4128
  • feat(#4160): prototype-index store + read-chokepoint fallbacks (standalone) — capability slice, +0 test262 by design by @ttraenkler in #4129
  • docs(#4160): release stale claims (#4160, #4161), return #4160 to ready by @ttraenkler in #4130
  • feat(#743): new-expression edges in the IR propagation fixpoint by @ttraenkler in #4131
  • fix(#2875): wire borrowed String.prototype.slice in standalone (+4 measured) by @ttraenkler in #4132
  • feat(#4155): Phase 2 — typed fnctor field reads, flag-gated; measured null on acorn by @ttraenkler in #4134
  • docs(#743): fixpoint null on acorn + .d.ts entrypoint-seeding design by @ttraenkler in #4135
  • feat(#2663): read-modify-write through a with scope (Slice 3) — +15 measured by @ttraenkler in #4133
  • fix(codegen): expando own-properties on standalone RegExp/Date carriers (#4008) by @ttraenkler in #4136
  • perf(#4150) + fix(#4139/#4144/#4149/#4154): benchmark parity work and the acorn-UMD chain — replaces #4106 by @ttraenkler in #4137
  • docs(#4162): file the in-process test262 runner's missing runtime-eval provider, + two lever handoffs by @ttraenkler in #4138
  • fix(#4137): standalone interpreter residuals — eval env null-deref + catch-parameter scope (+40 measured) by @ttraenkler in #4139
  • feat(#743): .d.ts entrypoint seeding, flag-gated — measured null on acorn, with the reason by @ttraenkler in #4140
  • ES5 standalone conformance: annexB B.3.3 (#3980 +95), own-prop MOP (#3979 +29/-1), .apply receiver (#3983), String.prototype borrowing (#3978) + harvest/census by @ttraenkler in #4124
  • feat(#2660): S3b binding retype, flag-gated — census 78→424, A/B wash on acorn by @ttraenkler in #4141
  • perf(#4157): post-campaign CPU profile of standalone acorn — reorder Workstream 2 by @ttraenkler in #4143
  • feat(#3251): S2-residual + S3 ArraySetLength — array-exotic length defines + accessor setter invoke (standalone) by @ttraenkler in #4142
  • docs(#4166,#4167): file the two unowned profile buckets — dynamic-eq 7.1%, per-char flatten 3.7% by @ttraenkler in #4144
  • fix(#4172): make the standalone [[Prototype]] chain live for reassigned F.prototype (+95 on the 219-file ES5 lever) by @ttraenkler in #4145
  • perf(#3926): hash dispatch in __extern_get — +4.1% acorn parse throughput, ships on by @ttraenkler in #4146
  • docs(#4177): file the IR-first hard-fail on lattice-narrowed + by @ttraenkler in #4147
  • docs(#4178): mixed-type ternary — IR bails, legacy fallback miscompiles concat (refutes the #3251 RESIDUAL BLOCKER framing) by @ttraenkler in #4148
  • docs: record the ES5 clustering method correction — signature clustering was wrong 6 times out of 6 by @ttraenkler in #4149
  • docs(memory): resume agents killed by a session limit instead of respawning them by @ttraenkler in #4150
  • fix(#4179): top-level with was silently dropped from __module_init (+40 on the dynamic-scope lever) by @ttraenkler in #4151
  • perf(#4174): eliminate per-character __str_flatten in the scanner — flatten String(x) once + inline flat fast path in charCodeAt by @ttraenkler in #4152
  • fix(#4180): stop fabricating a descriptor from a struct's internal wasm fields by @ttraenkler in #4153
  • perf(#4185): attribute the standalone 607k-allocation stream; kill the dead $ObjVec pairs on dynamic closure .call (−13.6% allocs/parse) by @ttraenkler in #4162
  • fix(#4176): per-brand proto-property store — named keys on builtin prototypes live through the chain (+76 on the 219-file ES5 lever) by @ttraenkler in #4155
  • fix(#4192): install the receiver for .call/.apply on a variable-held function expression by @ttraenkler in #4168
  • fix(#4195): name the target that actually refuses dynamic eval, and stop reporting top-level diagnostics twice by @ttraenkler in #4169
  • docs(#4194): standalone instances have no expando substrate — the cause of compiled-acorn's { f } rejection, + the #4158 eval-code +16 by @ttraenkler in #4170
  • feat(ir): #743 call-graph completeness — prototype/static-method + new-this edges in a fnctor graph fixpoint by @ttraenkler in #4166
  • docs(#4187): standalone hasOwnProperty constant-folds and ignores a runtime delete by @ttraenkler in #4164
  • docs(#4183, #4184): file two adjacent value-representation defects found while fixing #4178 by @ttraenkler in #4160
  • perf(#3927): fnctor union GC-sensitivity probe + measured slice pricing — demotion confirmed by @ttraenkler in #4161
  • fix(ir): #4177 — '+' provability consumes the fixpoint's lattice facts by @ttraenkler in #4159
  • fix(#4190): ES5 10.4.3 — sloppy unbound this is the global object; an inlined IIFE keeps its own strictness (+58) by @ttraenkler in #4167
  • perf(#4173): fast tag-pair dispatch for boxed strict-eq — no $AnyValue allocs on the identity-miss path by @ttraenkler in #4157
  • chore(docs): resync the standalone conformance number — main is out of sync and it is parking every PR by @ttraenkler in #4178
  • docs(memory): widen the pre-commit branch check to every mutating git op by @ttraenkler in #4174
  • docs: Opus implements / Fable specs the hard ones; + the #4197 implementation spec by @ttraenkler in #4173
  • docs(#4196, #4192): file the Function.prototype.bind bucket; size method invocation and retract it as a lever by @ttraenkler in #4171
  • docs: supersede the ES5 clustering method again — es5id attributes 100%, frames are a dead end by @ttraenkler in #4165
  • fix(#4162): one shared test262 import-object seam — and a second vacuity bug found en route by @ttraenkler in #4163
  • feat(#4182): annexB B.3.3.2 global-code — module-scope block-fn live bindings (+46 on the lever) by @ttraenkler in #4158
  • fix(#4178): concat of a boxed-any value returned null (then trapped) or folded numerically by @ttraenkler in #4156
  • fix(#4181): count non-assign binary drops in the #3623 telemetry; add missing **= to the module-init assignment-operator list by @ttraenkler in #4154
  • fix(#4199): keep top-level builtin-namespace expando writes in __module_init (+38 ES5 standalone) by @ttraenkler in #4179
  • fix(#4197): dispatch the runtime-eval AOT-callable carrier in __call_fn_method_N (+106) by @ttraenkler in #4177
  • fix(#4159): route typed-lane array element access through the #3251 vec overlay (+7); refute the descriptor-store framing and file #4197 by @ttraenkler in #4172
  • docs(memory): the default baseline path is the HOST lane — correct the standalone cross-check by @ttraenkler in #4180
  • fix(codegen): standalone <Builtin>.prototype.constructor own property (+10) by @ttraenkler in #4181
  • docs(memory): the harness scratchpad is shared by every lane, not per-agent by @ttraenkler in #4176
  • fix(#4196): [[Construct]] through a bound function in --target standalone (§10.4.1.2) by @ttraenkler in #4182
  • docs(#4200): retract the global-object slice — it fragments, and the pointer was wrong by @ttraenkler in #4183
  • docs(memory): an error signature is not a bucket boundary by @ttraenkler in #4184
  • docs(#4203): standalone cannot distinguish an explicit null receiver from an absent one — 12-file substrate slice by @ttraenkler in #4185
  • chore(gitignore): match .test262-cache as a symlink, not only a directory by @ttraenkler in #4187
  • fix(codegen): admit top-level this as a .call/.apply receiver (#4202) — +4, and repair a test that is RED on main by @ttraenkler in #4186
  • docs(#4202): census attribution correction + three new instrument-trap mechanisms by @ttraenkler in #4188
  • docs(memory): Fable can be out of credits — check before routing a spec by @ttraenkler in #4189
  • feat(ir): #743 field↔param mutual fixpoint — field slots as lattice variables in the fnctor-graph satellite by @ttraenkler in #4175
  • fix(#4201): standalone <wrapper>.valueOf() returns [[PrimitiveValue]], not the wrapper by @ttraenkler in #4190
  • docs: ranked ES5 standalone lever census — 80% of the failing residue attributed, four new levers filed by @ttraenkler in #4191
  • docs(#4205,#4206): retract the census masking analysis — measured 0 reclassified, not 96 by @ttraenkler in #4193
  • fix(#4203): explicit-null vs absent receiver — plus the .bind evaluate-and-drop defect (FIXED 12, BROKE 0) by @ttraenkler in #4194
  • chore(#3437): rebank the harness compile budget to main's actual 111,568 — the gate has 1.1% headroom and is a trap by @ttraenkler in #4195
  • fix(#4205): script-goal global object — pre-scan/lowering disagreement on which receivers ARE the global (FIXED 7, BROKE 0) by @ttraenkler in #4192
  • fix(#4204): widen a primitive-initialized module var provably assigned another JS type (FIXED 10, BROKE 0) by @ttraenkler in #4196
  • fix(#4206): standalone Tier-2 with HasBinding answered 0 for every name — a silent no-op whose writes cascaded to the global by @ttraenkler in #4197
  • docs(memory): two more ways the test262 harness measures the wrong compiler by @ttraenkler in #4198
  • docs(memory): a standalone refusal that throws TypeError is a vacuous-pass generator by @ttraenkler in #4199
  • fix(#4208) S1: run Type() before the f64 slot merge in strict equality (FIXED 6, BROKE 0) by @ttraenkler in #4200
  • docs(#4209): file the refusal-vacuous-pass census, and record that the pre-scan dirty gates cannot bound a blast radius by @ttraenkler in #4201
  • feat(ir): #743 satellite module-constant + condition-agnostic-conditional rules — Scope.flags flips, census 55/1/40 → 56/1/39 by @ttraenkler in #4202
  • fix(#4207): a primitive receiver resolves nothing from its wrapper prototype (FIXED 19, BROKE 0) by @ttraenkler in #4203
  • fix(ci): #4211 — sync the conformance docs AFTER the high-water raise, not before by @ttraenkler in #4204
  • docs(issues): #743 consumer-ABI DO-NOT-BUILD verdict + #4157 re-profile — GC is now the binding bucket by @ttraenkler in #4205
  • docs(issues): #743 local-variable typing spec — verified DO-NOT-IMPLEMENT; plus PR/issue number disambiguation in #4157 by @ttraenkler in #4206
  • docs(#4186) + debug: ABI-parity heap-type dump, and a rescue of suspended work whose wiring was lost by @ttraenkler in #4207
  • perf(regexp): reuse the standalone .test capture scratch and backtrack frames by @ttraenkler in #4208
  • docs(#4212): a missing argument becomes the zero value of the unified param type — and a second caller silently changes the first caller's answer by @ttraenkler in #4209
  • fix(#4187): route standalone hasOwnProperty past the const-fold when the receiver is deleted from (+1, −0); close #4165 as superseded; file #4210 by @ttraenkler in #4210
  • perf(codegen): hot/cold split of the widened fnctor struct, flag-OFF (#3927) by @ttraenkler in #4211
  • docs(#4157,#3552): the i31 lever is already spent; byte-ranked allocation census; root-test CI coverage by @ttraenkler in #4212
  • feat(codegen): per-type layout analysis for widened fnctor structs — 292 B → 98 B planned, 0 % overflow measured (#3927) by @ttraenkler in #4213
  • test(#4047): flip the two DATE refusal pins — the "no substrate" premise expired by @ttraenkler in #4214
  • docs: 2026-08-07 session handoff — two unmerged branches, five follow-ups, and the census-reliability record by @ttraenkler in #4215
  • docs: __box_number provability (13.6 % of calls, DON'T BUILD) + acorn-perf lane handoff by @ttraenkler in #4216
  • docs(#3927): correct the per-type-layout baseline, retract the copyNode mechanism, and make #3920 a hard blocker by @ttraenkler in #4218
  • fix(#3920): standalone reflection over closed structs enumerated nothing by @ttraenkler in #4219
  • perf(#3927): close the generator defect, replace the field ranking, ship the hot/cold split default ON by @ttraenkler in #4217
  • docs: complete the 2026-08-07 acorn-perf handoff; cross-reference #4157 by @ttraenkler in #4220
  • perf(codegen): hoist constant number boxes to module globals — boxed-number allocations to zero, binary smaller by @ttraenkler in #4221
  • fix(hooks): stop advising a direct merge to main; repair hook event logging by @ttraenkler in #4222
  • fix(scripts): sync-workspace-main must not detonate the pre-push chain on every hook fire by @ttraenkler in #4223
  • #4157/#743: acorn cross-runtime profile, second-corpus census, and the first two Parser.pos pin slices by @ttraenkler in #4224
  • feat(#743): Parser.pos pin-census instrument + builtin-receiver carve-out + arithmetic F64-producer by @ttraenkler in #4227
  • docs(#4218): file issue — in-house oracle backend to make the TS5 checker droppable by @ttraenkler in #4228
  • fix(#4216): declare vec-element inc/dec write-back temp with unpacked element type by @ttraenkler in #4226
  • fix(#4217): npm-compat refresh redeploys Pages after publishing by @ttraenkler in #4225
  • fix(#3920): answer closed-struct own-presence from the presence word, not the shape by @ttraenkler in #4229
  • feat(#3927): per-type fnctor layout emission behind JS2WASM_FNCTOR_LAYOUT_EMIT (default OFF) by @ttraenkler in #4230
  • fix(#4225): hasOwnProperty's folded-0 was blind to the cold tail by @ttraenkler in #4231
  • fix(#4194): route computed writes to closed-struct storage — closed-struct arms in __extern_set by @ttraenkler in #4232
  • feat: ES5 standalone conformance — waves 1+2 (~+124 test262 flips, 8 work packages) by @ttraenkler in #4234
  • Standalone eval interpreter lane: eval-code 747→797/816, Annex B 469/469 (#4137, #2200, #2929, #4194) by @ttraenkler in #4233
  • ci(#3927): layout_emit dispatch input — flag-ON test262 measurement lane by @ttraenkler in #4235
  • Expand ES edition sections on the landing page by default by @ttraenkler in #4236
  • docs(#4229): file playground REPL issue — standalone runtime-eval as the demo surface by @ttraenkler in #4238
  • fix(report): stop proposal-scope failures leaking into published editions by @ttraenkler in #4237
  • docs(#4236): file linear-lane QuickJS boxed-tier exploration + benchmark triangle by @ttraenkler in #4239
  • docs(#4236): spike findings — one-heap identity PROVEN, trampoline free, blocked only on the wasi-sdk artifact by @ttraenkler in #4240
  • feat(#3927): flip JS2WASM_FNCTOR_LAYOUT_EMIT default-ON (standalone) + the struct-typed fold's layout arm by @ttraenkler in #4241
  • docs(#4236): variant C estimate (GC-lane QuickJS eval via handle membrane) + linear-lane ADOPT decision by @ttraenkler in #4242
  • feat(#4236): QuickJS WASI artifact — build script, shim, draft CI workflow + slice-1 findings and adoption-review notes by @ttraenkler in #4243
  • docs(#4237, #4236): compile-time regex specialization exploration + post-slice-1 regex measurements by @ttraenkler in #4244
  • feat(#743): Parser.pos pin retirement — receiver provenance, locals, string substrate (acorn census 39→34) by @ttraenkler in #4246
  • docs(#4236, #4237): no-regex/split-module QuickJS measurements + Irregexp bytecode-backend estimate by @ttraenkler in #4245
  • docs: durable homes for session findings — census table, dispatch-gate artifact (#4239), presence unification (#4240) by @ttraenkler in #4248
  • docs(#4238): QuickJS-backed runtime-eval provider behind a flag — issue + spec by @ttraenkler in #4247
  • feat(#4238): QuickJS eval engine behind JS2WASM_EVAL_ENGINE flag — slice 1 (selection, acquisition, wasm-to-wasm bridge, indirect eval end-to-end) by @ttraenkler in #4250
  • docs(ci): reconcile the required-checks record with the live ruleset by @ttraenkler in #4251
  • docs(#4245, #4242): QuickJS eval migration endgame — membrane + default flip issues (no interpreter removal) by @ttraenkler in #4253
  • fix(hooks): budget ratchets run unconditionally at commit time by @ttraenkler in #4254
  • feat: ES5 standalone conformance — wave 3 (+63 measured test262 flips, 6 work packages) by @ttraenkler in #4249
  • feat(#743): derive types by default — flip the derivation flag family ON by @ttraenkler in #4255
  • docs(#4254): floor breaches land on the wrong PR after unmeasured queue crossings by @ttraenkler in #4257
  • perf(#4241): carrier-intrinsic $bag slot on the closure family — the 12.98% registry-scan frame goes to 0.22% by @ttraenkler in #4252
  • fix(#4249): ES5 standalone wave 4 — eval-spliced accessor crash + catch-body finally depth (+9 standalone, +4 gc) by @ttraenkler in #4256
  • fix(#3628): canonicalize computed assignment keys by @ttraenkler in #4259
  • feat(hooks): commit-msg guard — Claude may be co-author, never author by @ttraenkler in #4260
  • test(#4253): un-rot the two root tests that were red on main by @ttraenkler in #4262
  • feat(dogfood): complete React package test infrastructure by @ttraenkler in #4263
  • perf: close V8 gaps in host calls and native strings by @ttraenkler in #4261
  • feat(#4250): whole-program per-field write-kind verdict — fixes the literal-slot miscompile, flips JS2WASM_FNCTOR_CTOR_PARAM_SLOTS to unset⇒ON by @ttraenkler in #4265
  • fix(website): standalone edition filter + issue links that pointed at unrelated PRs by @ttraenkler in #4264
  • feat(website): npm-compat measured-at shows time, not only date by @ttraenkler in #4266
  • fix(#2107): stop the union-undefined erasure being silent; file #4258 by @ttraenkler in #4267
  • fix(#4235): run the fnctor pipeline on the multi-file compile path by @ttraenkler in #4269
  • refactor(ir): retire prepared class constructor bodies by @ttraenkler in #4268
  • perf: speed up cookie host bridge and clsx arguments by @ttraenkler in #4272
  • fix(#4241): carrier-intrinsic $bag on un-split fnctors — acorn's registry leak goes 1 entry/parse to 0 by @ttraenkler in #4273
  • feat: ES5 standalone conformance — wave 4 (#4246 this/new, #4247 array keys, #4248 wrapper protos, #4251 harness canary, #4252 computed-key calls) by @ttraenkler in #4258
  • feat(linear): cache literals and lower string searches by @ttraenkler in #4274
  • perf(codegen): cache ambient host globals per instance by @ttraenkler in #4275
  • fix(#4261): typed field access no longer erases a fnctor's prototype methods — escape-gate clause B yields to a dynamic use (standalone) by @ttraenkler in #4276
  • perf(strings): fuse native trim length scan by @ttraenkler in #4277
  • perf(strings): avoid integer format scratch allocation by @ttraenkler in #4278
  • perf(array): accelerate hot indexOf scans by @ttraenkler in #4279
  • refactor(ir): seal cross-owner bodies in one transaction by @ttraenkler in #4281
  • fix(dogfood): contain late jsdom host errors by @ttraenkler in #4285
  • feat(linear): add native String.repeat support by @ttraenkler in #4286
  • perf(strings): specialize proven rope concatenation by @ttraenkler in #4287
  • fix(linear): reclaim safe arenas between exported calls by @ttraenkler in #4288
  • perf(runtime): streamline non-throwing leaf imports by @ttraenkler in #4289
  • perf(strings): scalarize proven ASCII case conversions by @ttraenkler in #4292
  • perf(strings): inline constant-needle indexOf scans by @ttraenkler in #4291
  • perf(runtime): collapse fixed host method call crossings by @ttraenkler in #4293
  • fix(async): preserve Promise rejection payload identity by @ttraenkler in #4297
  • fix(benchmarks): verify array callback checksums by @ttraenkler in #4298
  • perf(strings): elide empty concat allocations by @ttraenkler in #4300
  • feat: ES5 standalone — wave 5 follow-up (#4266 vec own-key enumeration +7, #4269 object-literal method receiver) by @ttraenkler in #4299
  • feat: ES5 standalone conformance — wave 5 (#4262 error substrate, #4264 with value carriers +30, #4265 callable ToString) by @ttraenkler in #4302
  • feat(ir): retire Builtins legacy bodies by @ttraenkler in #4305
  • docs(conformance): map exact ES2015 gaps to IR work by @ttraenkler in #4294
  • perf(array): batch numeric indexOf misses by @ttraenkler in #4307
  • docs(#4256): multi-file path setup gaps + the proto-method write defect, narrowed by @ttraenkler in #4308
  • fix(#4276): host-free instanceof Object / instanceof Function in standalone (+6, −0) by @ttraenkler in #4311

Full Changelog: v0.68.0...v0.69.0