diff --git a/docs/DESIGN.md b/docs/DESIGN.md index a1ef34b..f12eb9d 100644 --- a/docs/DESIGN.md +++ b/docs/DESIGN.md @@ -165,7 +165,7 @@ Trade-off: no inline optimisations through the LLVM API. We rely on ## Decision 6: authoring surface (Iter 14b) -**Status: shipped.** Form (A) was chosen in Iter 14b and implemented as +Form (A) is implemented as the `ailang-surface` crate (parser + printer) in Iter 14c. Form-A is gated against drift by `ailang-surface/tests/round_trip.rs`, which parses every `.ailx` fixture, prints it back, re-parses, and demands @@ -506,7 +506,7 @@ JSON identical to their corresponding `.ail.json` files. ### Form (B) — human prose projection (Family 20) -**Status: shipped.** Family 20 (Iter 20a–20d, 2026-05-08) ships a +AILang ships a second textual projection of the AST: `ailang-prose`, a one-way projection from `Module → human-readable text`. It is **not** an authoring surface; it is the "display" projection that Decision 6's @@ -592,7 +592,7 @@ lowest-common-denominator fallback that always works. ## Decision 7: redundancy removal — `Term::If` is not a primitive -**Status: REVERTED in Iter 14g.** This decision was made on shaky grounds — +This decision was made on shaky grounds — applying CLAUDE.md's "no redundancies" rule to a case that turned out to be primitive control flow, not redundancy. The post-removal match-on-Bool form (3× the tokens, asymmetric `pat-wild` for the false case) was @@ -681,7 +681,7 @@ without a source-level rewrite. ## Decision 9: dual allocator — RC canonical, Boehm parity oracle -**Status: half-retirement as of 2026-05-09.** Originally framed +Originally framed (2026-05-07) as "transitional Boehm until the RC pipeline (Iters 18a–18g) lands and the default flips"; then re-framed (2026-05-08) as a symmetric dual-allocator policy with Boehm as