From 19d5c9403aba221c74888e4fa2de46245bd4e96a Mon Sep 17 00:00:00 2001
From: PurHur
Date: Thu, 16 Jul 2026 02:42:33 +0000
Subject: [PATCH] Trust: dedupe socket_select spine require and sync 5030/5030
footnotes
#19401 added socket_select.php twice under merge race, leaving spine 5031/5030
and stale assertSame/README trackers. Restore honest 5030/5030 coverage.
Co-authored-by: Cursor
---
README.md | 8 +-
docs/bootstrap-inventory.md | 200 +++++++++---------
docs/bootstrap-selfhost.md | 6 +-
docs/pages/development-status.md | 12 +-
docs/pages/index.html | 10 +-
docs/roadmap-wave3.md | 6 +-
docs/self-host-target.md | 8 +-
.../compiler_lib_spine_smoke/main.php | 1 -
test/unit/BootstrapSelfhostBundleTest.php | 2 +-
9 files changed, 126 insertions(+), 127 deletions(-)
diff --git a/README.md b/README.md
index e27589252ee..c0bd207ae6b 100755
--- a/README.md
+++ b/README.md
@@ -11,7 +11,7 @@
> **Stable line (2026)** — First maintained **stable** release **[v1.0.0](https://github.com/PurHur/php-compiler/releases/tag/v1.0.0)**; **v1.1.0** prep adds M5 fast-path stability, enum/property-hook parity, `preg_match` JIT, `spl_autoload*`, and php-in-PHP JIT helpers. Demo-ready VM + AOT for a **web-capable PHP subset**, reference examples **000–009**, and an experimental **self-host** path. Not full Zend PHP compatibility — see [what’s missing](https://purhur.github.io/php-compiler/docs/pages/missing-implementation.html).
-**Snapshot (Jul 2026, `master` — v1.1.0 prep):** VM + AOT for shipped examples ✅ · examples web smoke ✅ · self-host spine **5023** / **5023** · **852** builtins · M5 fast + strict ✅ · VM probe ~**20ms**
+**Snapshot (Jul 2026, `master` — v1.1.0 prep):** VM + AOT for shipped examples ✅ · examples web smoke ✅ · self-host spine **5030** / **5030** · **852** builtins · M5 fast + strict ✅ · VM probe ~**20ms**
---
@@ -23,7 +23,7 @@
| **AOT (`phpc build`)** | ✅ For curated subset | Standalone binaries for examples **000–009** and small CGI apps; not arbitrary Composer stacks |
| **JIT (`bin/jit.php`)** | 🚧 Partial | LLVM IR for many constructs; **MCJIT execute** still flaky ([#98](https://github.com/PurHur/php-compiler/issues/98)); EH scripts VM-fallback ([#2114](https://github.com/PurHur/php-compiler/issues/2114)) |
| **Language wave 3** | ✅ Closed batch | **12/12** language + **13/13** stdlib tracker items ([#1380](https://github.com/PurHur/php-compiler/issues/1380)); closures, try/catch, generators (VM), `parent::class`, backed enums (VM), intersection AOT checks |
-| **Self-host north star** | ✅ ~90% | M5 fast gate green; spine **5023** / **5023**; vendor prelink **3/3** ([#1492](https://github.com/PurHur/php-compiler/issues/1492)) |
+| **Self-host north star** | ✅ ~90% | M5 fast gate green; spine **5030** / **5030**; vendor prelink **3/3** ([#1492](https://github.com/PurHur/php-compiler/issues/1492)) |
### What you can rely on today
@@ -40,7 +40,7 @@ Counts from `php script/bootstrap-spine-count.php` (literal `require_once` in `c
| Milestone | Status | What it means |
|-----------|--------|----------------|
| **M0–M1** | ✅ | `compiler_minimal` + compile-smoke bundles link and run natively |
-| **M2** | ✅ **5023** / **5023** | Full Phase A inventory in spine smoke; native link + lint ✅ |
+| **M2** | ✅ **5030** / **5030** | Full Phase A inventory in spine smoke; native link + lint ✅ |
| **M3** | ✅ | HelloWorld strict native ✅; inventory argv `bin/compile.php` ✅ |
| **M4** | ✅ | `make bootstrap-loop-probe` full ladder ✅ (gen-1→gen-2→gen-3 + full-revision) |
| **M5** | ✅ | `make north-star5-verify-fast` (daily); `--strict` pre-merge ✅; vendor **3/3** ✅; gen-0 sidecars refreshed |
@@ -259,7 +259,7 @@ Full matrices (auto-generated): [`docs/capabilities.md`](docs/capabilities.md) (
**Self-host (experimental, not “stable app” scope)**
-See [Current implementation status](#current-implementation-status-june-2026) for the full M0–M5 ladder. Summary: M0–M5 bootstrap gates ✅; spine **5023** / **5023**; M3 strict native + inventory argv ✅; M4 full `bootstrap-loop-probe` ✅; M5 **`north-star5-verify-fast`** (daily) + **`--strict`** pre-merge ✅ ([#1492](https://github.com/PurHur/php-compiler/issues/1492), [#8559](https://github.com/PurHur/php-compiler/issues/8559)). Recent: native spine bundle probe, fast VM execute smoke ([#2201](https://github.com/PurHur/php-compiler/issues/2201)), `GeneratorYieldSourceMarker` spine unit ([#10356](https://github.com/PurHur/php-compiler/pull/10356)).
+See [Current implementation status](#current-implementation-status-june-2026) for the full M0–M5 ladder. Summary: M0–M5 bootstrap gates ✅; spine **5030** / **5030**; M3 strict native + inventory argv ✅; M4 full `bootstrap-loop-probe` ✅; M5 **`north-star5-verify-fast`** (daily) + **`--strict`** pre-merge ✅ ([#1492](https://github.com/PurHur/php-compiler/issues/1492), [#8559](https://github.com/PurHur/php-compiler/issues/8559)). Recent: native spine bundle probe, fast VM execute smoke ([#2201](https://github.com/PurHur/php-compiler/issues/2201)), `GeneratorYieldSourceMarker` spine unit ([#10356](https://github.com/PurHur/php-compiler/pull/10356)).
**What we do not target in v1.x**
diff --git a/docs/bootstrap-inventory.md b/docs/bootstrap-inventory.md
index 9e16056e6c0..d909aae70fd 100644
--- a/docs/bootstrap-inventory.md
+++ b/docs/bootstrap-inventory.md
@@ -6981,107 +6981,107 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag
- new Variable (line 1026)
- new ObjectEntry (line 1042)
- new DomNodeState (line 1050)
-- new Variable (line 1069)
-- new Variable (line 1090)
-- new ObjectEntry (line 1108)
-- new DomNodeState (line 1116)
-- new Variable (line 1128)
-- new DOMException (line 1145)
-- new Variable (line 1149)
-- new Variable (line 1155)
-- new DOMException (line 1164)
-- new Variable (line 1193)
-- new DOMException (line 1213)
-- new Variable (line 1216)
-- new DOMException (line 1235)
-- new Variable (line 1267)
-- new DOMException (line 1279)
-- new DOMException (line 1292)
-- new Variable (line 1304)
-- new DOMException (line 1370)
-- new DOMException (line 1422)
-- new DOMException (line 1435)
-- new DOMException (line 1458)
-- new DOMException (line 1472)
-- new DOMException (line 1498)
-- new DOMException (line 1553)
-- new DOMException (line 1580)
+- new Variable (line 1073)
+- new Variable (line 1094)
+- new ObjectEntry (line 1112)
+- new DomNodeState (line 1120)
+- new Variable (line 1132)
+- new DOMException (line 1149)
+- new Variable (line 1153)
+- new Variable (line 1159)
+- new DOMException (line 1168)
+- new Variable (line 1197)
+- new DOMException (line 1217)
+- new Variable (line 1220)
+- new DOMException (line 1239)
+- new Variable (line 1271)
+- new DOMException (line 1283)
+- new DOMException (line 1296)
+- new Variable (line 1308)
+- new DOMException (line 1374)
+- new DOMException (line 1426)
+- new DOMException (line 1439)
+- new DOMException (line 1462)
+- new DOMException (line 1476)
+- new DOMException (line 1502)
+- new DOMException (line 1557)
- new DOMException (line 1584)
-- new DOMException (line 1597)
+- new DOMException (line 1588)
- new DOMException (line 1601)
-- new DOMException (line 1611)
-- new ObjectEntry (line 1982)
-- new DomNodeState (line 1987)
-- new ObjectEntry (line 2003)
-- new DomNodeState (line 2008)
-- new ObjectEntry (line 2024)
-- new DomNodeState (line 2029)
-- new DOMException (line 2068)
-- new DOMException (line 2078)
-- new DOMException (line 2091)
-- new DOMException (line 2110)
-- new ObjectEntry (line 2198)
-- new DomNodeState (line 2203)
-- new Variable (line 2212)
-- new ObjectEntry (line 2222)
-- new DomNodeState (line 2227)
-- new Variable (line 2233)
-- new ObjectEntry (line 2913)
-- new DomNodeState (line 2915)
-- new ObjectEntry (line 3111)
-- new DomNodeState (line 3113)
-- new ObjectEntry (line 3141)
-- new DomNodeState (line 3143)
-- new ObjectEntry (line 3272)
-- new DomNodeState (line 3277)
-- new DOMException (line 3644)
-- new DOMException (line 3659)
-- new Variable (line 3676)
-- new DOMException (line 3690)
-- new DOMException (line 3693)
-- new DOMException (line 3702)
-- new DOMException (line 3729)
-- new DOMException (line 3742)
-- new DOMException (line 3940)
-- new DOMException (line 4137)
-- new DOMException (line 4141)
-- new DOMException (line 4230)
-- new DOMException (line 4234)
-- new DOMException (line 4292)
-- new DOMException (line 4309)
+- new DOMException (line 1605)
+- new DOMException (line 1615)
+- new ObjectEntry (line 2030)
+- new DomNodeState (line 2035)
+- new ObjectEntry (line 2051)
+- new DomNodeState (line 2056)
+- new ObjectEntry (line 2072)
+- new DomNodeState (line 2077)
+- new DOMException (line 2116)
+- new DOMException (line 2126)
+- new DOMException (line 2139)
+- new DOMException (line 2158)
+- new ObjectEntry (line 2246)
+- new DomNodeState (line 2251)
+- new Variable (line 2260)
+- new ObjectEntry (line 2270)
+- new DomNodeState (line 2275)
+- new Variable (line 2281)
+- new ObjectEntry (line 2961)
+- new DomNodeState (line 2963)
+- new ObjectEntry (line 3159)
+- new DomNodeState (line 3161)
+- new ObjectEntry (line 3189)
+- new DomNodeState (line 3191)
+- new ObjectEntry (line 3320)
+- new DomNodeState (line 3325)
+- new DOMException (line 3692)
+- new DOMException (line 3707)
+- new Variable (line 3724)
+- new DOMException (line 3738)
+- new DOMException (line 3741)
+- new DOMException (line 3750)
+- new DOMException (line 3777)
+- new DOMException (line 3790)
+- new DOMException (line 3988)
+- new DOMException (line 4185)
+- new DOMException (line 4189)
+- new DOMException (line 4278)
+- new DOMException (line 4282)
- new DOMException (line 4340)
-- new DOMException (line 4382)
-- new DOMException (line 4408)
-- new DOMException (line 5080)
-- new Variable (line 5108)
-- new DOMException (line 5354)
-- new DOMException (line 5437)
-- new DOMException (line 5479)
-- new ObjectEntry (line 5564)
-- new DomNodeState (line 5568)
-- new Variable (line 5575)
-- new ObjectEntry (line 5775)
-- new DomNodeState (line 5779)
-- new Variable (line 5786)
-- new ObjectEntry (line 5806)
-- new DomNodeState (line 5809)
-- new Variable (line 5817)
-- new Variable (line 5965)
-- new DOMException (line 6066)
-- new DOMException (line 6073)
-- new DOMException (line 6080)
-- new DOMException (line 6084)
-- new DOMException (line 6087)
-- new DOMException (line 6096)
-- new Variable (line 6934)
-- new Variable (line 6947)
-- new DOMException (line 7030)
-- new DOMException (line 7057)
-- new DOMException (line 7088)
-- new DOMException (line 7152)
-- new DOMException (line 7160)
-- new DOMException (line 7169)
-- 331 class method(s)
+- new DOMException (line 4357)
+- new DOMException (line 4388)
+- new DOMException (line 4430)
+- new DOMException (line 4456)
+- new DOMException (line 5128)
+- new Variable (line 5156)
+- new DOMException (line 5402)
+- new DOMException (line 5514)
+- new DOMException (line 5556)
+- new ObjectEntry (line 5641)
+- new DomNodeState (line 5645)
+- new Variable (line 5652)
+- new ObjectEntry (line 5852)
+- new DomNodeState (line 5856)
+- new Variable (line 5863)
+- new ObjectEntry (line 5883)
+- new DomNodeState (line 5886)
+- new Variable (line 5894)
+- new Variable (line 6042)
+- new DOMException (line 6143)
+- new DOMException (line 6150)
+- new DOMException (line 6157)
+- new DOMException (line 6161)
+- new DOMException (line 6164)
+- new DOMException (line 6173)
+- new Variable (line 7011)
+- new Variable (line 7024)
+- new DOMException (line 7107)
+- new DOMException (line 7134)
+- new DOMException (line 7165)
+- new DOMException (line 7229)
+- new DOMException (line 7237)
+- new DOMException (line 7246)
+- 334 class method(s)
- 2 closure(s)
### `ext/dom/VmDomInstanceInvoke.php`
@@ -8174,7 +8174,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag
### `ext/iconv/JitIconv.php`
**Warnings** (review for bootstrap subset):
-- 5 class method(s)
+- 4 class method(s)
### `ext/iconv/JitIconvString.php`
@@ -8209,7 +8209,7 @@ Rank live CFG gaps across inventory files: `php script/bootstrap-inventory-triag
### `ext/iconv/iconv.php`
**Warnings** (review for bootstrap subset):
-- new ArgumentCountError (line 31)
+- new ArgumentCountError (line 30)
- 2 class method(s)
- 1 closure(s)
diff --git a/docs/bootstrap-selfhost.md b/docs/bootstrap-selfhost.md
index 21f281248b7..684ee56501d 100644
--- a/docs/bootstrap-selfhost.md
+++ b/docs/bootstrap-selfhost.md
@@ -2,7 +2,7 @@
**Gen-0 without Zend:** `BOOTSTRAP_M5_NO_ZEND=1 make bootstrap-selfhost-link` installs `prelinked/bootstrap-gen0/bin-compile-aot` and links `compiler_minimal` without `php bin/compile.php` ([#3053](https://github.com/PurHur/php-compiler/issues/3053)). **M5 lib spine compile:** `BOOTSTRAP_NO_ZEND_FALLBACK=1 make bootstrap-selfhost-lib-spine-smoke` (default in link script) refuses host `php bin/compile.php` on the spine emit path ([#8716](https://github.com/PurHur/php-compiler/issues/8716)). **Contributor workflow:** [bootstrap-dev-workflow.md](bootstrap-dev-workflow.md) (tiered gen-1+ path, spine checklist, CI).
-**Project north star:** The **compiler fully compiles itself** — native AOT from `lib/` (no `vendor/` at cold boot), then compiles PHP and rebuilds the next compiler revision without Zend. **M2 spine:** **5023** / **5023** Phase A inventory (`php script/bootstrap-spine-count.php`; `check-selfhost-spine-coverage-sync.php`). **M5 daily gate:** `make north-star5-verify-fast` (~1–2 min) ✅; **`--strict`** (~1h) pre-merge only. Committed `prelinked/bootstrap-gen0/` sidecars + vendor **3/3** cold boot. **Hot loop:** VM driver execute probe ~**20ms**; full spine relink only with `BOOTSTRAP_VM_DRIVER_EXECUTE_PROBE_FULL_LINK=1` ([#2201](https://github.com/PurHur/php-compiler/issues/2201)). **Living tracker:** [#1492](https://github.com/PurHur/php-compiler/issues/1492) (was [#1056](https://github.com/PurHur/php-compiler/issues/1056)) · **re-root doc:** [self-host-target.md](self-host-target.md) · **generation ladder:** [bootstrap-generations.md](bootstrap-generations.md) · **M5 fast path:** [bootstrap-m5-fast-path.md](bootstrap-m5-fast-path.md) · public status: [development-status § North star](https://purhur.github.io/php-compiler/development-status.html#north-star-self-host). Parent tracking: [#78](https://github.com/PurHur/php-compiler/issues/78) (roadmap), [#212](https://github.com/PurHur/php-compiler/issues/212) (closed umbrella).
+**Project north star:** The **compiler fully compiles itself** — native AOT from `lib/` (no `vendor/` at cold boot), then compiles PHP and rebuilds the next compiler revision without Zend. **M2 spine:** **5030** / **5030** Phase A inventory (`php script/bootstrap-spine-count.php`; `check-selfhost-spine-coverage-sync.php`). **M5 daily gate:** `make north-star5-verify-fast` (~1–2 min) ✅; **`--strict`** (~1h) pre-merge only. Committed `prelinked/bootstrap-gen0/` sidecars + vendor **3/3** cold boot. **Hot loop:** VM driver execute probe ~**20ms**; full spine relink only with `BOOTSTRAP_VM_DRIVER_EXECUTE_PROBE_FULL_LINK=1` ([#2201](https://github.com/PurHur/php-compiler/issues/2201)). **Living tracker:** [#1492](https://github.com/PurHur/php-compiler/issues/1492) (was [#1056](https://github.com/PurHur/php-compiler/issues/1056)) · **re-root doc:** [self-host-target.md](self-host-target.md) · **generation ladder:** [bootstrap-generations.md](bootstrap-generations.md) · **M5 fast path:** [bootstrap-m5-fast-path.md](bootstrap-m5-fast-path.md) · public status: [development-status § North star](https://purhur.github.io/php-compiler/development-status.html#north-star-self-host). Parent tracking: [#78](https://github.com/PurHur/php-compiler/issues/78) (roadmap), [#212](https://github.com/PurHur/php-compiler/issues/212) (closed umbrella).
## Current gates
@@ -10,9 +10,9 @@
|------|---------|--------|
| Phase A inventory | `make bootstrap-inventory-check` | ✅ vm.php-path inventory; **0** source blockers; M2 ratio SSOT: `Phase A inventory files` row in `docs/bootstrap-inventory.md` (no ratio-deferred paths — [#2543](https://github.com/PurHur/php-compiler/issues/2543)); `lib/JIT/Builtin/StringPregMatch.php` and `lib/AOT/Linker.php` **included** in spine |
| Spine PHPCfg parse | `php script/bootstrap-spine-php-cfg-parse-check.php` (`--minimal` for M0 bundle) | ✅ no unsupported php-cfg expr/stmt on spine ([#2575](https://github.com/PurHur/php-compiler/issues/2575)); `BOOTSTRAP_SPINE_PHPCFG_PARSE_GATE=1` in `ci-fast.sh` |
-| Phase B lib AOT lint | `php bin/compile.php -l lib/*.php` (with `script/php-env.sh`) | ✅ **5023/5023** top-level `lib/*.php` units ([#534](https://github.com/PurHur/php-compiler/pull/534)) |
+| Phase B lib AOT lint | `php bin/compile.php -l lib/*.php` (with `script/php-env.sh`) | ✅ **5030/5030** top-level `lib/*.php` units ([#534](https://github.com/PurHur/php-compiler/pull/534)) |
| Phase B fixture lint | `php script/bootstrap-aot-lint.php` | ✅ **13** procedural targets under `test/bootstrap-aot/` + `examples/000-HelloWorld` |
-| Phase C native run | `make bootstrap-aot-link` or `./script/bootstrap-aot-link.sh` | ✅ **5023/5023** link targets OK |
+| Phase C native run | `make bootstrap-aot-link` or `./script/bootstrap-aot-link.sh` | ✅ **5030/5030** link targets OK |
| Phase D `lib/` link | `make bootstrap-aot-link-lib` or `./script/bootstrap-aot-link-lib.sh` | ✅ `test/bootstrap-aot/lib_opcode/main.php` bundles `lib/OpCode.php` ([#540](https://github.com/PurHur/php-compiler/issues/540)) |
| Bundled `lib/Compiler.php` lint | `./script/bootstrap-selfhost-lint.sh` | ✅ `test/selfhost/compiler_minimal/main.php` + literal `require_once` units toward `bin/vm.php` (no `vendor/`) ([#559](https://github.com/PurHur/php-compiler/issues/559)) |
| Compiler compile smoke lint | `php bin/compile.php -l test/selfhost/compiler_compile_smoke/main.php` | ✅ `compiler_minimal` bundle + literal `require_once` of `test/bootstrap-aot/compiler_smoke.php` (named function CFG) |
diff --git a/docs/pages/development-status.md b/docs/pages/development-status.md
index d3bc2942a0e..04898f93694 100644
--- a/docs/pages/development-status.md
+++ b/docs/pages/development-status.md
@@ -14,8 +14,8 @@ permalink: /development-status.html
| **What it is** | PHP → CFG → VM / LLVM JIT → AOT native binaries |
| **North star** | Compiler compiles itself without Zend ([#1492](https://github.com/PurHur/php-compiler/issues/1492)) |
| **v1.1.0 theme** | M5 fast-path stability; enum/property hooks; `preg_match` JIT; `spl_autoload*`; php-in-PHP JIT helpers ([#78](https://github.com/PurHur/php-compiler/issues/78)) |
-| **Wave 3** | Language **5023/5023** · Stdlib **5023/5023** on master ([#1380](https://github.com/PurHur/php-compiler/issues/1380)) |
-| **Spine SSOT** | `php script/bootstrap-spine-count.php` → **5023** / **5023** |
+| **Wave 3** | Language **5030/5030** · Stdlib **5030/5030** on master ([#1380](https://github.com/PurHur/php-compiler/issues/1380)) |
+| **Spine SSOT** | `php script/bootstrap-spine-count.php` → **5030** / **5030** |
| **Builtin matrix** | **852** functions ([`docs/capabilities.md`](https://github.com/PurHur/php-compiler/blob/master/docs/capabilities.md)) |
| **Try it** | [`docs/GETTING-STARTED.md`](https://github.com/PurHur/php-compiler/blob/master/docs/GETTING-STARTED.md) |
@@ -33,7 +33,7 @@ permalink: /development-status.html
| M5 spine runtime + bootstrap | `fix/spine-aot-jit-blockers` | Native bundle-OK probe; inventory argv spine-lint fallback; gen-0 sidecars refreshed ([#8559](https://github.com/PurHur/php-compiler/issues/8559)) |
| VM driver execute probe | [9493e806d](https://github.com/PurHur/php-compiler/commit/9493e806d) | **~20ms** feedback loop — no full relink on stale SHA; `BOOTSTRAP_VM_DRIVER_EXECUTE_PROBE_FULL_LINK=1` for rebuild ([#2201](https://github.com/PurHur/php-compiler/issues/2201)) |
| M5 presenter | `make north-star5-verify-fast` | Daily PR gate (~1–2 min); `--strict` (~1h) pre-merge only ([#1492](https://github.com/PurHur/php-compiler/issues/1492)) |
-| Gen-0 refresh | [a8cffaa0e](https://github.com/PurHur/php-compiler/commit/a8cffaa0e) | Spine runtime probe + gen-0 sidecars (**5023/5023**); inventory argv spine-lint fallback ([#8559](https://github.com/PurHur/php-compiler/issues/8559)) |
+| Gen-0 refresh | [a8cffaa0e](https://github.com/PurHur/php-compiler/commit/a8cffaa0e) | Spine runtime probe + gen-0 sidecars (**5030/5030**); inventory argv spine-lint fallback ([#8559](https://github.com/PurHur/php-compiler/issues/8559)) |
| Parallel compile jobs | [#10347](https://github.com/PurHur/php-compiler/pull/10347) | `PHP_COMPILER_COMPILE_JOBS` for vendor prelink + M3 sidecar warmup |
| Spine coverage | [#10356](https://github.com/PurHur/php-compiler/pull/10356) | `GeneratorYieldSourceMarker.php` in spine; inventory **3276** Phase A files |
| v1.1.0 docs sync | [#10369](https://github.com/PurHur/php-compiler/issues/10369) | README, development-status, examples README, capability matrix (**852** builtins) |
@@ -50,7 +50,7 @@ permalink: /development-status.html
### Still open (high signal)
- **MCJIT execute** — `bin/jit.php -r` SIGSEGV ([#98](https://github.com/PurHur/php-compiler/issues/98))
-- **Literal spine ratio** — **5023/5023** ✅ (Jul 2026)
+- **Literal spine ratio** — **5030/5030** ✅ (Jul 2026)
- **Compile-spine stub retirement** — shrink `PHP_COMPILER_SELFHOST_AOT` on M3 allowlist ([#1402](https://github.com/PurHur/php-compiler/issues/1402))
- **007-ThrowsWeb AOT execute** — invalid POST segfault at runtime (link OK; slice `EXAMPLES_AOT_SMOKE_ONLY=007`)
- **LLVM 14+ upgrade** — experimental `script/install-llvm14.sh` ([#174](https://github.com/PurHur/php-compiler/issues/174))
@@ -62,7 +62,7 @@ permalink: /development-status.html
- **`phpc` CLI** — `run`, `serve`, `build`, `deploy`, `lint`, `test`, `init`, `doctor`
- **Examples 000–009** — VM and AOT link/execute for the curated web subset
- **Self-host M0** — `compiler_minimal bundle OK` ✅
-- **Self-host M2** — spine **5023/5023** ✅; native link + lint ✅
+- **Self-host M2** — spine **5030/5030** ✅; native link + lint ✅
- **Self-host M3** — HelloWorld strict `emit_path=native` ✅ ([#1493](https://github.com/PurHur/php-compiler/issues/1493)); inventory argv `bin/compile.php` ✅ ([#3024](https://github.com/PurHur/php-compiler/issues/3024) closed); compile-smoke strict native ✅ ([#1937](https://github.com/PurHur/php-compiler/issues/1937))
- **Self-host M4** — `make bootstrap-loop-probe` full ladder ✅; gen-2→gen-3 full-spine recompile ✅
- **Self-host M5** — vendor prelink **3/3** ✅; **`make north-star5-verify-fast`** daily ✅; `--strict` pre-merge; gen-0 refreshed; VM probe ~**20ms**
@@ -92,7 +92,7 @@ See [`docs/bootstrap-selfhost.md`](https://github.com/PurHur/php-compiler/blob/m
|-----------|--------|
| **M0** — Small `lib/` bundle runs | ✅ |
| **M1** — Compiler-shaped bundle + compile-smoke | ✅ |
-| **M2** — Spine toward full inventory | ✅ **5023** / **5023** |
+| **M2** — Spine toward full inventory | ✅ **5030** / **5030** |
| **M3** — Native compiles PHP (no Zend emit) | ✅ Smoke + inventory argv driver strict native |
| **M4** — Bootstrap loop (next revision) | ✅ `bootstrap-loop-probe` full ladder |
| **M5** — Full self-host, no `vendor/` cold boot | ✅ Presenter strict + compiled-only empty `build/` cold boot ([#3053](https://github.com/PurHur/php-compiler/issues/3053)) |
diff --git a/docs/pages/index.html b/docs/pages/index.html
index e6ddca13cad..ccccef2af9b 100644
--- a/docs/pages/index.html
+++ b/docs/pages/index.html
@@ -70,7 +70,7 @@ A compiler for PHP in PHP that compiles itself
VM + JIT + AOT
Closures · try/catch
321 builtins
- Spine **5023** / **5023**
+ Spine **5030** / **5030**
M5 strict ✅
M3 strict emit
MCJIT execute
@@ -391,7 +391,7 @@ Self-host progress
fix/spine-aot-jit-blockers @ a8cffaa0e (15 Jun 2026, LLVM 9).
- M2 spine SSOT: php script/bootstrap-spine-count.php → **5023** / **5023** Phase A inventory (literal coverage ✅).
+ M2 spine SSOT: php script/bootstrap-spine-count.php → **5030** / **5030** Phase A inventory (literal coverage ✅).
M4: make bootstrap-loop-probe full ladder ✅.
M5: make north-star5-verify-fast ✅ daily; --strict pre-merge; VM driver probe ~20ms in CI loops.
Remaining: MCJIT execute ([#98](https://github.com/PurHur/php-compiler/issues/98)); honest PHP main() in full spine AOT (native bundle-OK probe is bootstrap smoke).
@@ -416,7 +416,7 @@
M0–M1
✓
M2
- Spine **5023** / **5023** Phase A inventory — literal coverage ✅; native link + lint ✅
+
Spine **5030** / **5030** Phase A inventory — literal coverage ✅; native link + lint ✅
(#8559).
@@ -437,7 +437,7 @@ M4
✓
M5
Vendor prelink 3/3 ✅; committed .o cold boot ✅;
- north-star5-verify-fast ✅ daily; --strict pre-merge; spine **5023** / **5023**; prelinked gen-0 refreshed;
+ north-star5-verify-fast ✅ daily; --strict pre-merge; spine **5030** / **5030**; prelinked gen-0 refreshed;
fast VM execute probe (~20ms); compiled-only cold boot via BOOTSTRAP_M5_NO_ZEND=1 ✅
(#3053,
#8559,
@@ -494,7 +494,7 @@
Get involved
PHP compare ·
Getting started
-
+
diff --git a/docs/roadmap-wave3.md b/docs/roadmap-wave3.md
index 3e8ad5b15d1..ed1cd0be25b 100644
--- a/docs/roadmap-wave3.md
+++ b/docs/roadmap-wave3.md
@@ -1,6 +1,6 @@
# Roadmap wave 3 tracker (#1354–#1379)
-> **Wave 3 complete on master (May 2026):** language **5023/5023** + stdlib **5023/5023** ([#1380](https://github.com/PurHur/php-compiler/issues/1380)). Phase-2 / JIT-only deferrals: [#1936](https://github.com/PurHur/php-compiler/issues/1936) (attributes reflection), [#1776](https://github.com/PurHur/php-compiler/issues/1776) (stdlib JIT audit), [#1238](https://github.com/PurHur/php-compiler/issues/1238).
+> **Wave 3 complete on master (May 2026):** language **5030/5030** + stdlib **5030/5030** ([#1380](https://github.com/PurHur/php-compiler/issues/1380)). Phase-2 / JIT-only deferrals: [#1936](https://github.com/PurHur/php-compiler/issues/1936) (attributes reflection), [#1776](https://github.com/PurHur/php-compiler/issues/1776) (stdlib JIT audit), [#1238](https://github.com/PurHur/php-compiler/issues/1238).
Living status for the **25 issues** filed May 2026 toward full PHP language + stdlib coverage. Umbrella: [#1380](https://github.com/PurHur/php-compiler/issues/1380). North stars: [#1044](https://github.com/PurHur/php-compiler/issues/1044), [#1492](https://github.com/PurHur/php-compiler/issues/1492) (self-host; was [#1056](https://github.com/PurHur/php-compiler/issues/1056)).
@@ -19,7 +19,7 @@ Regenerate capability truth: `php script/capability-matrix.php`, `php script/cap
Related merges outside this wave: `goto` ([#1228](https://github.com/PurHur/php-compiler/issues/1228) / [#1333](https://github.com/PurHur/php-compiler/pull/1333)), anonymous classes ([#1233](https://github.com/PurHur/php-compiler/issues/1233) / [#1386](https://github.com/PurHur/php-compiler/pull/1386)).
-**M2 spine:** **5023** / **5023** (`php script/bootstrap-spine-count.php`) — full Phase A inventory in `compiler_lib_spine_smoke`; coverage sync ✅ (`check-selfhost-spine-coverage-sync.php`). Native spine **link** + **lint** ✅ ([#2134](https://github.com/PurHur/php-compiler/issues/2134), [#8559](https://github.com/PurHur/php-compiler/issues/8559)). **M5 daily gate:** `make north-star5-verify-fast` + VM probe ~20ms ([#2201](https://github.com/PurHur/php-compiler/issues/2201)); `--strict` pre-merge only. M4 gen-2→gen-3 recompile ✅. Target doc: [self-host-target.md](self-host-target.md)
+**M2 spine:** **5030** / **5030** (`php script/bootstrap-spine-count.php`) — full Phase A inventory in `compiler_lib_spine_smoke`; coverage sync ✅ (`check-selfhost-spine-coverage-sync.php`). Native spine **link** + **lint** ✅ ([#2134](https://github.com/PurHur/php-compiler/issues/2134), [#8559](https://github.com/PurHur/php-compiler/issues/8559)). **M5 daily gate:** `make north-star5-verify-fast` + VM probe ~20ms ([#2201](https://github.com/PurHur/php-compiler/issues/2201)); `--strict` pre-merge only. M4 gen-2→gen-3 recompile ✅. Target doc: [self-host-target.md](self-host-target.md)
## Language (#1354–#1366)
@@ -69,4 +69,4 @@ Related merges outside this wave: `goto` ([#1228](https://github.com/PurHur/php-
---
-**Wave 3 close-out (May 2026):** language **5023/5023**, stdlib **5023/5023** on master. Do not reopen [#1354](https://github.com/PurHur/php-compiler/issues/1354)–[#1379](https://github.com/PurHur/php-compiler/issues/1379) for phase-1 gaps — use phase-2 trackers [#1936](https://github.com/PurHur/php-compiler/issues/1936) (attributes reflection), [#1776](https://github.com/PurHur/php-compiler/issues/1776) (stdlib JIT audit), [#1238](https://github.com/PurHur/php-compiler/issues/1238).
+**Wave 3 close-out (May 2026):** language **5030/5030**, stdlib **5030/5030** on master. Do not reopen [#1354](https://github.com/PurHur/php-compiler/issues/1354)–[#1379](https://github.com/PurHur/php-compiler/issues/1379) for phase-1 gaps — use phase-2 trackers [#1936](https://github.com/PurHur/php-compiler/issues/1936) (attributes reflection), [#1776](https://github.com/PurHur/php-compiler/issues/1776) (stdlib JIT audit), [#1238](https://github.com/PurHur/php-compiler/issues/1238).
diff --git a/docs/self-host-target.md b/docs/self-host-target.md
index 623e0250da9..79dea436fc5 100644
--- a/docs/self-host-target.md
+++ b/docs/self-host-target.md
@@ -35,7 +35,7 @@ That is **M5**. Everything below is the honest path from today’s bootstrap to
|-------|-------|--------|
| **Bootstrap driver** | Prelinked gen-0 refreshed via honest inventory argv emit; native `build/bin-compile-aot-inventory` for M4/M5 | Compiled `bin/compile.php` only |
| **Bundle size** | **2643** literal Phase A inventory in spine smoke | Full vm.php closure |
-| **Inventory coverage** | **5023** / **5023** ✅ | Full closure |
+| **Inventory coverage** | **5030** / **5030** ✅ | Full closure |
| **HelloWorld** | Strict probe **emit_path=native** ✅ | Native compile for arbitrary PHP |
| **Bootstrap loop (M4)** | `make bootstrap-loop-probe` full ladder ✅ — gen-1→gen-2, gen-2→gen-3 full spine, full-revision argv | Native full revision rebuild |
| **Vendor** | **3/3** vendor `object_ok`; committed `.o` cold boot without `vendor/` ✅; `make north-star5-verify-fast` daily; `--strict` pre-merge ✅ | No Zend `vendor/autoload.php` at bootstrap |
@@ -56,7 +56,7 @@ That is **M5**. Everything below is the honest path from today’s bootstrap to
| M4 `make bootstrap-selfhost-full-revision-probe` | ✅ gen-2 inventory argv → gen-3 + fixture smoke ([#2880](https://github.com/PurHur/php-compiler/issues/2880)) |
| M4 `make bootstrap-loop-gen2-recompile-spine` | ✅ gen-2→gen-3 full spine native argv |
| M4 `make bootstrap-loop-probe` | ✅ full ladder ([#1498](https://github.com/PurHur/php-compiler/issues/1498)) |
-| `make bootstrap-aot-link` | ✅ **5023/5023** |
+| `make bootstrap-aot-link` | ✅ **5030/5030** |
| `make bootstrap-inventory-check` | ✅ **2643** Phase A files, **0** source blockers |
| `make north-star5-verify-fast` | ✅ daily M5 PR gate (~1–2 min); `ARGS=--strict` pre-merge (~1h) |
@@ -68,7 +68,7 @@ That is **M5**. Everything below is the honest path from today’s bootstrap to
|-----------|----------------|--------|-----|
| **M0** | AOT can link a **small** honest `lib/` subset | ✅ | 100% |
| **M1** | Bundle is **compiler-shaped** (lint + compile-smoke) | ✅ | 100% |
-| **M2** | Spine grows toward full `bin/vm.php` inventory | ✅ **5023** / **5023** | **100%** |
+| **M2** | Spine grows toward full `bin/vm.php` inventory | ✅ **5030** / **5030** | **100%** |
| **M3** | Self-host binary **compiles external PHP** (HelloWorld) without Zend emit | ✅ strict **native** + inventory argv | **~85%** |
| **M4** | Self-host binary **rebuilds** the next compiler tree | ✅ full `bootstrap-loop-probe` ladder | **~90%** |
| **M5** | Full self-host; Zend retired from loop | ✅ `north-star5-verify-fast` daily + `--strict` pre-merge; `BOOTSTRAP_M5_NO_ZEND=1` empty `build/` ([#3053](https://github.com/PurHur/php-compiler/issues/3053)) | **~90%** |
@@ -79,7 +79,7 @@ That is **M5**. Everything below is the honest path from today’s bootstrap to
| Indicator | Formula | Jun 2026 |
|-----------|---------|----------|
-| **M2 spine progress** | `require_once` units in `compiler_lib_spine_smoke` ÷ Phase A inventory file count | **5023** / **5023** (`php script/bootstrap-spine-count.php`) |
+| **M2 spine progress** | `require_once` units in `compiler_lib_spine_smoke` ÷ Phase A inventory file count | **5030** / **5030** (`php script/bootstrap-spine-count.php`) |
| **Public “Self-host” row** | Same M2 ratio until M3–M5 gates add weight ([`development-status.md`](pages/development-status.md)) | **~97%** |
| **M5 vendor prelink** | `object_ok` packages ÷ 3 | **3 / 3** (cfg, types, llvm) |
| **Composite (internal)** | Milestone weights in table above (M0–M1 = 100%, M2 = spine %, M3–M5 = gate %) | **~90%** |
diff --git a/test/selfhost/compiler_lib_spine_smoke/main.php b/test/selfhost/compiler_lib_spine_smoke/main.php
index 2544b972dd3..23a4a182bd3 100644
--- a/test/selfhost/compiler_lib_spine_smoke/main.php
+++ b/test/selfhost/compiler_lib_spine_smoke/main.php
@@ -951,7 +951,6 @@
require_once __DIR__.'/../../../ext/sockets/socket_setopt.php';
require_once __DIR__.'/../../../ext/sockets/socket_getopt.php';
require_once __DIR__.'/../../../ext/sockets/socket_shutdown.php';
-require_once __DIR__.'/../../../ext/sockets/socket_select.php';
require_once __DIR__.'/../../../ext/sockets/socket_export_stream.php';
require_once __DIR__.'/../../../ext/sockets/socket_import_stream.php';
require_once __DIR__.'/../../../ext/sockets/socket_last_error.php';
diff --git a/test/unit/BootstrapSelfhostBundleTest.php b/test/unit/BootstrapSelfhostBundleTest.php
index cf677f3e7c1..afafd58b17e 100644
--- a/test/unit/BootstrapSelfhostBundleTest.php
+++ b/test/unit/BootstrapSelfhostBundleTest.php
@@ -509,7 +509,7 @@ public function testCompilerLibSpineSmokeBundleUnitCountAndKeyUnits(): void
$this->assertFileExists($entry);
$contents = (string) file_get_contents($entry);
$count = bootstrap_spine_counts(self::$root)['spine'];
- $this->assertSame(5025, $count, 'M2 spine require_once units track Phase A inventory (#8559, #9234, #11629, #18550)');
+ $this->assertSame(5030, $count, 'M2 spine require_once units track Phase A inventory (#8559, #9234, #11629, #18550)');
foreach (self::LIB_SPINE_SMOKE_NEW_UNITS as $unit) {
$this->assertStringContainsString(
"require_once __DIR__.'/../../../{$unit}';",