From 20181786a3c0f3dd78662f6527fae6f828c48f8d Mon Sep 17 00:00:00 2001 From: Brummel Date: Fri, 15 May 2026 15:32:31 +0200 Subject: [PATCH] spec: correct it.3 corpus-migration scope (it.2-surfaced premise defect) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The original spec premise "21 .ail fixtures / 34 (tail-app …) sites" under-counted the corpus's non-structural-recursion surface. it.2 proved the true it.3 migration set is three classes: the ~20 tail-app-marked fixtures + ~18 no-ADT-candidate counter-recursion fixtures (deferred via it.2's no-candidate skip) + the 2 RC fixtures it.2 joined to the transitional grandfather. it.3 removes the tail==false grandfather AND the no-ADT-candidate skip together. No design decision (D1-D4) changes — factual scope-widening only, traceable to 2026-05-15-iter-it.2.md §Concerns. Not relitigating the complete, green it.2 (feedback: spec_over_plan_patches — fix the spec where it governs, not the plan around it). --- docs/specs/2026-05-15-iteration-discipline.md | 49 +++++++++++++++---- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/docs/specs/2026-05-15-iteration-discipline.md b/docs/specs/2026-05-15-iteration-discipline.md index 578463d..df1e57e 100644 --- a/docs/specs/2026-05-15-iteration-discipline.md +++ b/docs/specs/2026-05-15-iteration-discipline.md @@ -83,10 +83,29 @@ Iteration order: `tail` fields, the two keywords, the `musttail` lowering, `verify_tail_positions`'s old role, `TailCallNotInTailPosition`, Decision 8; rework the codegen block-termination invariant so the - seam is solely `recur`'s; migrate all 21 `.ail` fixtures / 34 - `(tail-app …)` sites. Destructive; last; depends on it.1 (loop - occupies the seam) and it.2 (the structural fixtures are *proven* - total before their redundant tail marker is stripped). + seam is solely `recur`'s; migrate the full corpus non-structural- + recursion set (scope-corrected — see note). Destructive; last; + depends on it.1 (loop occupies the seam) and it.2 (the structural + fixtures are *proven* total before their redundant tail marker is + stripped). + + > **Scope correction (it.2-surfaced).** The original estimate + > "21 `.ail` fixtures / 34 `(tail-app …)` sites" under-counted the + > corpus's non-structural-recursion surface. The true it.3 + > migration set is three classes: (1) the ~20 `tail-app`-marked + > fixtures; (2) the ~18 *no-ADT-candidate counter-recursion* + > fixtures (e.g. `build_tree(depth: Int)` in + > `bench_latency_explicit.ail`) that it.2 deferred via the + > no-candidate skip; (3) the two RC-regression fixtures + > (`rc_pin_recurse_implicit.ail`, `rc_let_alias_implicit_param.ail`) + > that it.2 joined to the transitional `tail-app` grandfather. + > it.3 removes the `tail==false` grandfather AND the no-ADT- + > candidate skip together — after it.3 every non-structural + > recursion is `loop`/`recur`. See + > `docs/journals/2026-05-15-iter-it.2.md` §Concerns §1/§2 for the + > discovery; the per-fixture enumeration is the it.3 plan's recon + > job (drive it off a corpus `cargo build`/`ail check` sweep, not + > this estimate). First-iteration planner scope: **it.1** in full. @@ -171,9 +190,14 @@ lower + escape → e2e example. is precisely the author's explicit "this is intended iteration, not accidental unbounded recursion" assertion — its original Decision-8 purpose — so grandfathering it keeps the it.1/it.2-additive vs - it.3-destructive split honest: the 21 corpus fixtures still - type-check through it.2 unchanged. it.3 removes the `tail` field - **and** this exemption in the same destructive step, by which point + it.3-destructive split honest: the corpus still type-checks + through it.2 unchanged. (it.2 discovered the grandfather needs two + cooperating exemptions, not one — the `tail==false` marker check + *and* a no-ADT-candidate skip for counter-recursions that have no + structural position to verify; see the Scope-correction note under + Architecture/it.3.) it.3 removes the `tail` field, the + `tail==false` grandfather, **and** the no-ADT-candidate skip in + the same destructive step, by which point every previously-exempt site has been migrated to `loop` or to a now-checked structural plain call. - **`Diverge` effect (first implementation; Decision 3 was a @@ -212,7 +236,9 @@ lower + escape → e2e example. `recur`'s (and the ordinary fall-through `ret`). This is the only non-mechanical part of it.3 and the reason it.1 ships the new seam first. -- **Corpus migration (21 fixtures / 34 sites).** +- **Corpus migration (full non-structural set — see the + Scope-correction note; ~20 tail-app + ~18 no-ADT-candidate + + the 2 RC fixtures, exact set is the it.3 plan's recon job).** Accumulator-shaped recursions (`bench_compute_collatz`, `bench_compute_intsum`, `bench_latency_explicit`/`_implicit`, `bench_list_sum*`, @@ -426,8 +452,11 @@ Architecture. Recording it here so a future reader does not `musttail` lowering / `verify_tail_positions`' tail-app role / `TailCallNotInTailPosition` / Decision 8 all removed; `design_schema_drift.rs` green with `loop`/`recur` anchors and no - `tail` anchors; all 21 migrated fixtures `ail check` clean and - `ail run` to byte-identical pre-migration stdout; milestone-close + `tail` anchors; every fixture in the full non-structural-recursion + migration set (Scope-correction note) `ail check` clean and + `ail run` to byte-identical pre-migration stdout; no `tail==false` + grandfather or no-ADT-candidate skip remains in the checker; + milestone-close `audit` clean (bench baseline pristine or regression ratified); `cargo test --workspace` green. - Milestone: the language has exactly two iteration forms; the only