blaise-phases-map.md 4.0 KB

Blaise phase sync map (checked 2026-09-20 against graemeg/blaise master)

Blaise's 10 phases (README status: 1–5 + 7 complete, 6 ongoing, 8–10 planned). This file tracks where m2compiler-V3 stands against each, and records deliberate divergences so they aren't rediscovered. Refresh after every major step.

Phase table

Blaise Status there Us Status here
1 Bootstrap pipeline ✅ Step 1 (M2→QBE hello) ✅ done (v3-step1)
2 Type system (classes, records, ARC, exceptions) ✅ Steps 2–4.3 (scalars ✅, composites ✅, calls/frames/recursion ✅, nested + display ✅, separate compilation ✅) ✅ complete modulo deliberate outs
3 Generics + interfaces ✅ Explicitly OUT (R10 blueprints rejected) ❌ deliberate
4 OPDF debug info ✅ Deferred (listing only) ❌ deferred
5 Self-hosting ✅ Step 8 (last) ⚠️ same mechanism, later slot
6 RTL/StdLib expansion 🔄 ongoing Step 5 (Benjamin stdlib) Not started
7 Native backend ✅ Not planned (QBE is terminal) ❌ deliberate
8 Windows/macOS ARM64 Planned Out of scope (amd64_sysv) ❌
9 LSP + VS Code Planned Deferred vaguely ❌
10 Migration analyser Planned 1.12 TopSpeed grammar, 662-file corpus parse-clean ✅ convergent

What "in sync" means here

Process, not phases: phased steps with per-step design docs (their design.adoc rhythm → our summary_stepN.md), test-guarded progress, QBE-first backend for speed-to-hosting (their stated reason, ours too), fixpoint verification (their 3-stage byte-identical bootstrap → our planned bootstrap/fixpoint.sh over .ssa).

Two places we're ahead of their learning curve, per graemeg's own v0.12.0 retrospective: our harness has been end-to-end (qbe→cc→run) since step 1 — exactly the gap (IR-only tests missing link/runtime bugs) he's now closing. Keep it that way: no step lands on IR inspection alone.

Warnings adopted from Blaise experience

  • Rolling bootstrap. Their scripts/rolling-bootstrap.sh exists because new parser features break old binaries: once M2 compiles itself (step 8), a grammar extension can strand the stage-1 binary. Our fixpoint.sh must rebuild commit-by-commit from the last green binary, not just diff three stages. (Recorded pre-emptively; hits at step 8.)
  • Stabilisation cycles. Their v0.12.0 goes thin-on-features to harden the suite. After step 3.4 (composites complete), do the same before step 4 calls: a hardening pass over the 50+ suite (fuzz bounds, cross-span copies, trap paths) instead of new syntax.
  • Turnkey gap. Self-hosting ≠ turnkey: they still need GCC/FPC scaffolding. Our step 8 must define "done" as: pinned qbe+cc plus documented host-gm2 bootstrap, nothing else.

Deliberate divergences (do not relitigate without cause)

  • No ARC/GC, no exceptions, no generics, no native backend, no second platform: Modula-2 scope discipline, not Pascal parity.
  • Self-hosting last, not middle: full-language-first was locked; the cost is accepted (hygiene rules from step 1 pay it down).
  • Two grammars, not one: modern M2.atg + legacy TopSpeed-V3-M2.atg (1.12). This mirrors their phase-10 split (modern core + migration sidecar) and quarantines the opposite dialect decisions (_, <>, H/C/B suffixes). Never merge them; the modern grammar stays Redux-clean.

Drift log

  • 2026-09-20: map created. plan.md refreshed (0x-only, no-AST-module reality, two-grammar strategy, step-3 substeps).
  • 2026-09-22: 3.5 showcase8, 3.6 pointers, 3.7 hardening (68/68); Phase-2 row → near-complete (calls remaining = step 4).
  • 2026-09-22: 4.1 call emission (79/79); Phase-2 row → complete modulo deliberate outs (ARC/exceptions/generics).
  • 2026-09-22: 4.2 nested procedures + static-link display (81/81).
  • 2026-09-22: 4.3 separate compilation, single-image session (87/87). Step 4 complete; Phase-2 row closed.
  • Next refresh: start of step 5 (Benjamin stdlib).