Batch A — Runtime bootstrap (ctor, initVmContext, parse pipeline) ❌ BLOCKED
Owner: #2568 (initParsePipeline/initCompiler/loadCoreModules)
Gate: BOOTSTRAP_M3_RUNTIME_COMPILE=1 ./script/bootstrap-selfhost-runtime-compile-smoke.sh
Today: parseAndCompile returned null (link OK)
Batch B — Parse bridge (parseAndCompile / parseAndCompileEmitSmoke native) ❌ BLOCKED
Owner: #2566
Gate: same as Batch A + compile-smoke probe
TU ladder: #2559 → #2561 → #2567
Batch C — Compiler::compileCfg* hot paths + stub retirement (#1520) 📋
Gate: COMPILER_DRIVER_SMOKE_GATE=1 make bootstrap-selfhost-compiler-driver-smoke
Batch D — Emit-TU execute gate 📋 (after A+B)
Gate: ./script/bootstrap-m3-emit-tu-execute.sh (#2552 reopened)
Batch E — Native bin/compile.php execute → #2466 (after Batch D + #2540 if needed)
Problem
M3 compile-driver native emit still falls back to Zend (
emit_path=zend partial) becauselib/JIT.phponly real-lowers a hand-maintained allowlist (isM3CompileDriverRealLoweringName(),m3CompileDriverSpineDenyNames()). Each new symbol can link yet return null at execute until init/parse spine is real (#2566, #2568).SSOT files
lib/JIT.php—isM3CompileDriverRealLoweringName(),m3CompileDriverSpineDenyNames(),compileRuntime*M3Native()docs/m3-allowlist-snapshot.txt— #1905 /M3_ALLOWLIST_SYNC_GATE=1test/bootstrap-aot/*_m3_emit_native_entry.phplib/JIT/RuntimeEmitTuInit.php,lib/JIT/BootstrapCompileSmokeM3Emit.phplib/JIT/SelfHostBuiltinPolicy.php— retirement tracked in #1520docs/bootstrap-m5-fast-path.mdOrdered batches (May 2026 harness status)
After each batch:
Prerequisites
BOOTSTRAP_LIB_SPINE_SMOKE=1)Acceptance criteria
compile OK/emit_path=nativeLinks