Parent
Epic: #1492 (Self-host critical path M3→M5)
Milestone
M4 — bootstrap loop: native gen-1 compiles gen-2 without Zend on the compile step
Problem (May 2026 harness)
Scaffold landed; remaining gap is M5 cold boot (no vendor/, compiled driver everywhere) — not “no gen-2 binary.”
| Slice |
Status (2026-05-27 probe) |
test/selfhost/bootstrap_loop_smoke/ lint + link |
✅ |
make bootstrap-loop-probe (full) |
✅ emit_path=native, exit 0 |
bootstrap-loop-gen1-full-spine-emit.sh |
✅ gen-2 compiler_lib_spine_smoke bundle OK |
| Zend-free cold boot |
⬜ #2771, #2768 |
Goal
Bootstrap loop closed for CI: gen-1 native binary compiles gen-2 smoke and (opt-in) full spine; no php bin/compile.php on the compile step; documented in docs/bootstrap-m5-fast-path.md.
Definition of done
Repro
# Smoke ladder (green)
./script/docker-exec.sh -- bash -lc 'make bootstrap-loop-probe'
# Inventory-scale gen-2 (green)
./script/docker-exec.sh -- bash -lc './script/bootstrap-loop-gen1-full-spine-emit.sh'
# Optional: full probe with spine env
BOOTSTRAP_M4_GEN1_COMPILE_FULL_SPINE=1 ./script/bootstrap-loop-probe.sh
Scope (next PRs)
| Piece |
Path |
| CI default |
script/ci-local.sh, script/ci-defaults.env |
| Full-spine in probe |
script/bootstrap-loop-probe.sh |
| M5 driver |
script/bootstrap-selfhost-driver-smoke.sh, #2769 |
Unblock order
#2768 Expr_Closure → #2771 cold boot → #2769 compiled wave-check → M5
Links
Parent
Epic: #1492 (Self-host critical path M3→M5)
Milestone
M4 — bootstrap loop: native gen-1 compiles gen-2 without Zend on the compile step
Problem (May 2026 harness)
Scaffold landed; remaining gap is M5 cold boot (no
vendor/, compiled driver everywhere) — not “no gen-2 binary.”test/selfhost/bootstrap_loop_smoke/lint + linkmake bootstrap-loop-probe(full)emit_path=native, exit 0bootstrap-loop-gen1-full-spine-emit.shcompiler_lib_spine_smoke bundle OKGoal
Bootstrap loop closed for CI: gen-1 native binary compiles gen-2 smoke and (opt-in) full spine; no
php bin/compile.phpon the compile step; documented indocs/bootstrap-m5-fast-path.md.Definition of done
test/selfhost/bootstrap_loop_smoke/+./script/bootstrap-loop-probe.shemit_path=native) — full probe exit 0bootstrap-loop-gen1-full-spine-emit.sh) green on harnessBOOTSTRAP_M4_LOOP_PROBE=1default-on inci-local.shllvm tail — Self-host: M4 full-spine probe target and wave-check driver smoke CLI #2777bootstrap-loop-probe.shwhenBOOTSTRAP_M4_GEN1_COMPILE_FULL_SPINE=1— Self-host M4: default-on full-spine gen-1 emit in bootstrap-loop-probe / ci-local #2770vendor/at loop step — Self-host M5: cold-boot wave-check without vendor/ on disk #2771 / M5: Prelink vendor (php-cfg, php-types, php-llvm) — no composer at cold boot #1416 M5docs/bootstrap-selfhost.mdM4 rows updated (no “exit 2” / partial HelloWorld)Repro
Scope (next PRs)
script/ci-local.sh,script/ci-defaults.envscript/bootstrap-loop-probe.shscript/bootstrap-selfhost-driver-smoke.sh, #2769Unblock order
Links
docs/self-host-target.mdM4docs/bootstrap-m5-fast-path.md