The with statement
Allegedly part of the language. We checked. We disagree.
A JavaScript engine that has heard enough.
Strict-only, and hardened from the first line — the primordials freeze before your code runs, so a dependency can't redefine Array.prototype out from under you. It already parses, compiles, and runs real JavaScript: async, generators, a module graph, proper tail calls. And WebAssembly, through a second engine built from scratch — called Sarcasm, because of course. Everything the language spent twenty years trying to forget, it forgets on purpose: no with, no sloppy mode, eval off unless you ask. Ready for production? Eventually.
--jit; spec coverage is still climbing. Read docs/ROADMAP.md before opening issues. Better yet, don't.
Every feature an engine ships is surface it can never take back. Cynic carries less of it by design — the legacy syntax, the sloppy-mode quirks, the deprecated globals, and the sharper tools a hardened runtime is better off without.
with statementAllegedly part of the language. We checked. We disagree.
The 0o prefix exists for a reason. The bare-leading-zero form does not.
Annex B's sloppy-only function-in-block hoisting is gone. Declare it where it lives.
for-in headAnnex B accident. Doesn't parse here. Hoist your initializer like an adult.
Yes, that's real ECMAScript. Yes, we are pretending it isn't.
Use encodeURI / encodeURIComponent. They've been correct since 1999.
String.prototype HTML wrappersAll thirteen of them — anchor, bold, fontcolor, … — left at the door. This is a string, not an HTML formatter.
Date.prototype.{getYear, setYear}The two-digit-year ones. Cynic keeps the normative aliases (substr, trimLeft, toGMTString) — these don't make the cut.
Off by default — code is code here, not strings assembled at runtime. Aligns with SES / Hardened JavaScript and removes the supply-chain bait. --allow=eval opens a real evaluator when you mean it; the frozen primordials still box it in. Multi-file scripts use a host hook, not user-reachable.
Lexer, parser, and bytecode interpreter ship. The runtime is filling in. Mark-sweep GC ships; a baseline JIT runs behind --jit, with the optimising tier and a generational GC still future. Below is what works, what kind-of works, and what Cynic refuses to pretend works yet.
JSGeneratoryield* delegation · for await ofIteratorClose on every abrupt path the spec describesawaitu/v flagsWebAssembly JS API — compile / instantiate, Module / Instance / Memory / Table / Global; SIMD, reference types, memory64, multi-memory, tail calls, exception handling, cross-module linking--allow=wasm.Symbol & BigInt primitivesArrayBuffer + DataView%TypedArray%.prototype surfaceProxy traps[[Get]] ReferenceError on uninit, dynamic import()[[Get]] ReferenceError the spec asked for.import()awaitwith { type: "json" }import()Set union / intersection / difference / symmetricDifference / isSubsetOf / isSupersetOf / isDisjointFrom · Promise.try · Promise.withResolversMap / WeakMap getOrInsert (upsert)using / await usingSymbol.dispose / Symbol.asyncDispose, DisposableStack / AsyncDisposableStack, SuppressedError; disposal on every abrupt pathfinally you keep forgetting to write.Iterator.zip · ShadowRealm--enable=<name> or --enable-experimental; off by default. Each scored as its own isolated test262 sweep.WeakRef · FinalizationRegistryreturn f(x) reuses the caller's frame instead of pushing a fresh onelda_property / sta_property / call_method + proto-load; /perf & /profile harness scaffoldedIntl · the internationalization APISharedArrayBuffer · AtomicsAtomics.wait / notify / waitAsync, cross-agent notify, a multi-agent realm pool; the SES isolation boundary stays intact--no-jit opts out. The optimising tier (Ohaimark) is still future.
Full per-bucket scoreboard, history, and per-day deltas live in test262-results.md.