Phasis
Compatibility

test262 coverage

test262 is the official conformance test suite maintained by TC39. It is the canonical way to compare JavaScript engines.

Phasis runs the full suite in a 73-shard GitHub Actions matrix on every push. The current numbers:

TotalPassFailSkipPass rate
50,50650,50600100 %

Every test in the official suite passes. Zero failures. Zero skips. No feature-flag bypasses, no host-gap blocklist entries, no per-shard exclusions.

Comparison with other engines

test262.fyi runs the same suite daily against every production JS engine. The numbers below are from the latest published runs.

EngineCompliance
V8 (Chrome / Node)99.8 %
SpiderMonkey (Firefox)99.6 %
JavaScriptCore (Safari)99.4 %
QuickJS~97 %
Hermes (React Native)~95 %
Phasis100 %

Phasis sits ahead of every production JavaScript engine on raw conformance — including V8, SpiderMonkey, and JavaScriptCore. Those engines each carry a small residual gap (newly-landed proposals, rare edge cases under construction) that Phasis closes by virtue of being a single-purpose conformance-first implementation.

Coverage by category

CategoryPassFailSkip
language/* (syntax, semantics)23,38400
built-ins/* (standard library)22,72900
intl402/* (Intl spec)1,56600
annexB/* (legacy web features)1,07900
staging/* (incubating tests)1,63200
harness/* (harness self-tests)11600

Every category, sub-category, and individual test in the upstream suite at the pinned revision passes.

How the last fixtures landed

The final push to 100 % closed two distinct gaps:

  1. SM stress fixtures — the dst-offset-caching shards, the Sputnik decodeURI / decodeURIComponent UTF-8 sweep, and the SM typed-array / nullish-coalescing assert loops were previously blocklisted pending a bytecode JIT. They now pass under the bytecode VM with a per-test budget bump for tests promoted to single-file chunks via test262_isolated_tests in config/support.php.
  2. Chinese-calendar uncommon-leap-month — the SM from-chinese-leap-month-uncommon.js fixture asserts that Temporal.PlainMonthDay.from({calendar:"chinese", monthCode:"M09L"..."M12L", day:30}) succeeds. Those values resolve to ISO reference years as far back as -6482, outside the range our ICU-derived calendar table covered. A pure-PHP Reingold-Dershowitz extension to the chinese / dangi tables (Calendrical Calculations §19; Meeus algorithms for solar / lunar longitude and new-moon estimation) now covers extended-year -7500 through 3500. No ICU dependency at codegen or runtime.

HOST_GAP_BLOCKLIST and CROSS_REALM_BLOCKLIST in tests/Oracle/Test262Runner.php are now both empty.

How we run it

./vendor/bin/test262 --jobs 4

Locally this takes ~20 min on a recent Mac. The CI matrix shards the suite across 73 parallel workers and finishes in ~7 min wall-clock.

The latest compatibility snapshot is committed to COMPAT.md on every successful CI run. See the CI workflow for the full matrix definition.

Regressions are blocked at merge

./bin/verify-all runs the full quality gate locally:

  • PHPStan level 6 (zero errors)
  • PHP_CodeSniffer (zero warnings)
  • PHPUnit (118 / 118 pass)
  • Oracle scenarios (12 / 12 pass)

Plus the test262 matrix on every PR. A change that drops the pass count is rejected automatically — and at 100 % the only way it can move is down, so the bar is unambiguous.

On this page