convention: counter-prefix file naming across docs/specs/, docs/plans/, design/contracts/, design/models/

All 176 files in the four accumulating directories now use a
zero-padded 4-digit counter prefix that reflects creation order
(`NNNN-slug.md`). The counter is assigned per directory in strict
git-log creation order; ties broken alphabetically by original name.
The old `YYYY-MM-DD-` prefix on docs/specs/ and docs/plans/ files is
dropped — the date is recoverable from git log and the counter
carries the ordering.

A file's counter is stable for the life of the file: never reassigned,
never reused, never compacted. Deleted files retire their counter;
subsequent files do not fill the gap. This is the property that lets
cross-references stay literal — refs use the full filename including
the counter (`design/contracts/0007-honesty-rule.md`) so they grep
cleanly and resolve directly without a glob step.

313 cross-references updated across .md/.rs/.toml/.c/.json files
(test pins, include_str! paths, design-INDEX entries, baseline notes,
runtime C comments, inter-contract markdown links incl. bare basename
and `../models/foo.md` forms).

CLAUDE.md gets a new "File-naming convention" section spelling out
the rule and rationale. skills/brainstorm/SKILL.md and
skills/planner/SKILL.md updated so new spec/plan creation produces
counter-prefixed names from the start.

The full test suite (cargo test --workspace) passes.
This commit is contained in:
2026-05-28 13:31:31 +02:00
parent 7b8596cef0
commit 832375f2ac
227 changed files with 785 additions and 751 deletions
@@ -1,6 +1,6 @@
# Skill System Build-out — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-09-skill-system.md`
> **Parent spec:** `docs/specs/0001-skill-system.md`
>
> **Discipline:** Skill construction follows TDD per
> `superpowers:writing-skills` (RED → GREEN → REFACTOR with subagent
@@ -748,8 +748,8 @@ Insert at the bottom (after the latest existing entry):
## 2026-05-09 — Milestone 22c: skill system live
The five-skill development pipeline shipped today. Spec at
`docs/specs/2026-05-09-skill-system.md`; build-out plan at
`docs/plans/2026-05-09-skill-system-buildout.md`. Five `SKILL.md`
`docs/specs/0001-skill-system.md`; build-out plan at
`docs/plans/0001-skill-system-buildout.md`. Five `SKILL.md`
files under `skills/<name>/`, six agents migrated to
`skills/<name>/agents/`, `CLAUDE.md` split into orchestrator-identity
and skill-pointers, `.claude/agents/` symlinks installed, this entry
@@ -1,6 +1,6 @@
# 22b.2 — Typecheck Arms — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-09-22-typeclasses.md`
> **Parent spec:** `docs/specs/0002-22-typeclasses.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# Iteration 22b.3 — Monomorphisation Pass — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-09-22-typeclasses.md`
> **Parent spec:** `docs/specs/0002-22-typeclasses.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# 22b.4a — Form-A parser+printer arms for ClassDef/InstanceDef + spec amendment
> **Parent spec:** `docs/specs/2026-05-09-22-typeclasses.md`
> **Parent spec:** `docs/specs/0002-22-typeclasses.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -55,7 +55,7 @@ arbitrary polymorphic top-levels.
- Modify: `crates/ailang-surface/tests/round_trip.rs` — removes the
`test_22b1_*` / `test_22b2_*` / `test_22b3_*` filter clauses; lets
the gate exercise every fixture.
- Modify: `docs/specs/2026-05-09-22-typeclasses.md` — appends an
- Modify: `docs/specs/0002-22-typeclasses.md` — appends an
"Amendments" section recording the 22b.4a / 22b.4b split, the
Form-A vs Form-B terminology fix, the `__` separator decision, and
the 22c-and-beyond impact.
@@ -1157,7 +1157,7 @@ git commit -m "iter 22b.4a.5: retire round-trip skip-list for class/instance fix
## Task 6: Spec amendment
**Files:**
- Modify: `docs/specs/2026-05-09-22-typeclasses.md` — append an
- Modify: `docs/specs/0002-22-typeclasses.md` — append an
"Amendments" section.
- Modify: `docs/DESIGN.md` — locate Decision 11 §"Resolution and
monomorphisation" (DESIGN.md mono-symbol naming subsection) and
@@ -1165,7 +1165,7 @@ git commit -m "iter 22b.4a.5: retire round-trip skip-list for class/instance fix
- [ ] **Step 6.1: Append the spec amendments section**
Open `docs/specs/2026-05-09-22-typeclasses.md`. Append at end of
Open `docs/specs/0002-22-typeclasses.md`. Append at end of
file:
```markdown
@@ -1270,7 +1270,7 @@ the right home for naming-convention micro-decisions.)
- [ ] **Step 6.3: Commit**
```
git add docs/specs/2026-05-09-22-typeclasses.md docs/DESIGN.md
git add docs/specs/0002-22-typeclasses.md docs/DESIGN.md
git commit -m "iter 22b.4a.6: spec + DESIGN amendments — 22b.4 split, terminology fix, '__' separator"
```
@@ -1,6 +1,6 @@
# 22c — User-class e2e fixture
> **Parent spec:** `docs/specs/2026-05-09-22-typeclasses.md`
> **Parent spec:** `docs/specs/0002-22-typeclasses.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -354,7 +354,7 @@ done — there is nothing left to wire.
22b.4b (Prelude for primitives) dropped from milestone scope; 22c's
fixture re-scoped to vocabulary AILang already has (no `++`, no
named-field record syntax, no top-level polymorphic `print`). See
`docs/specs/2026-05-09-22-typeclasses.md` "Amendments" §"22b.4b
`docs/specs/0002-22-typeclasses.md` "Amendments" §"22b.4b
dropped" and §"22c scope tightened".
**Milestone-22 acceptance check:**
@@ -1,6 +1,6 @@
# 22-tidy — DESIGN.md and spec drift after milestone-22 close
> **Parent spec:** `docs/specs/2026-05-09-22-typeclasses.md` (already
> **Parent spec:** `docs/specs/0002-22-typeclasses.md` (already
> amended for the 22b.4b drop and 22c rescope).
>
> **Trigger:** `audit` skill found drift between `docs/DESIGN.md`
@@ -26,7 +26,7 @@ as the gate.
- Modify: `docs/DESIGN.md:1725-1766` — rewrite §"Prelude (built-in)
classes" and §"What this decision does NOT commit to" to match
the 22b.4b-deferral + `__` separator decisions.
- Modify: `docs/specs/2026-05-09-22-typeclasses.md:50-56` — split
- Modify: `docs/specs/0002-22-typeclasses.md:50-56` — split
the 22b.4 components-table row into 22b.4a (shipped) + 22b.4b
(post-22); mark 22c shipped.
- Modify: `crates/ailang-prose/src/lib.rs:80-101` — update the
@@ -90,7 +90,7 @@ case for primitive `Show` is weak (LLM-natural form is `int_to_str
x`, not `show x` through a single-instance class). The user-class
end-to-end path is the milestone's typeclass acceptance gate
(22c's `class Foo a` + `data IntBox` + `instance Foo IntBox`
fixture); see `docs/specs/2026-05-09-22-typeclasses.md`
fixture); see `docs/specs/0002-22-typeclasses.md`
"Amendments" §"22b.4b dropped" for the substantive rationale.
A future milestone may add a Prelude when concrete LLM-author code
@@ -151,7 +151,7 @@ git commit -m "iter 22-tidy.1: DESIGN.md — reconcile Decision 11 with mileston
## Task 2: Spec components-table drift
**Files:** `docs/specs/2026-05-09-22-typeclasses.md` lines 50-56.
**Files:** `docs/specs/0002-22-typeclasses.md` lines 50-56.
The Components table still has the original 22b.4 row (Prelude +
Form-B + retire) which the amendments section supersedes. Reader
@@ -179,7 +179,7 @@ remains as-is — it's still historically accurate.)
### Step 2.2 — Commit
```bash
git add docs/specs/2026-05-09-22-typeclasses.md
git add docs/specs/0002-22-typeclasses.md
git commit -m "iter 22-tidy.2: spec — components table reflects 22b.4a/b split + 22c shipped"
```
@@ -1,6 +1,6 @@
# Env-construction unify — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-10-env-construction-unify.md`
> **Parent spec:** `docs/specs/0003-env-construction-unify.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -630,8 +630,8 @@ Tasks:
(preserves pre-refactor fail-fast behaviour without re-mutating
the shared env).
Spec: `docs/specs/2026-05-10-env-construction-unify.md`. Plan:
`docs/plans/2026-05-10-env-construction-unify.md`. Tests: pin test
Spec: `docs/specs/0003-env-construction-unify.md`. Plan:
`docs/plans/0007-env-construction-unify.md`. Tests: pin test
green, the three RED tests
(`typeclass_22c`, `mono_recursive_fn`, `mono_xmod_qualified_ref`)
remain green, full workspace test suite green, bench gates 0/0/0.
@@ -1,6 +1,6 @@
# 22-tidy primitive-name-set consolidation — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-09-22-typeclasses.md` (milestone 22, closed 2026-05-09)
> **Parent spec:** `docs/specs/0002-22-typeclasses.md` (milestone 22, closed 2026-05-09)
>
> **Audit anchor:** `docs/JOURNAL.md` 2026-05-09 entry "Iteration 22-tidy: DESIGN.md and spec drift after milestone-22 close" → "Carried debt" → primitive-name-set consolidation.
>
@@ -1,6 +1,6 @@
# 22-tidy.5 strict duplicate-clause detection — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-09-22-typeclasses.md` (milestone 22, closed 2026-05-09)
> **Parent spec:** `docs/specs/0002-22-typeclasses.md` (milestone 22, closed 2026-05-09)
>
> **Carried-debt anchor:** `docs/JOURNAL.md` 2026-05-09 entry "Iteration 22-tidy" → "Strict duplicate-clause detection in `parse_fn` / `parse_data` / `parse_const` (sibling parsers to the 22b.4a additions). The asymmetry is documented; promoting siblings to the strict pattern is queued."
>
@@ -1,6 +1,6 @@
# 22-tidy.6 Form-B prose printer arms for ClassDef + InstanceDef — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-09-22-typeclasses.md` (milestone 22, closed 2026-05-09)
> **Parent spec:** `docs/specs/0002-22-typeclasses.md` (milestone 22, closed 2026-05-09)
>
> **Carried-debt anchor:** `docs/JOURNAL.md` 2026-05-09 entry "Iteration 22-tidy" → "Form-B (prose) printer arms for ClassDef / InstanceDef. One-way, not gating."
>
@@ -1,6 +1,6 @@
# 22-tidy.7 strict-clause helper consolidation — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-09-22-typeclasses.md` (milestone 22, closed 2026-05-09)
> **Parent spec:** `docs/specs/0002-22-typeclasses.md` (milestone 22, closed 2026-05-09)
>
> **Trigger:** 22-tidy.5 JOURNAL entry observation that the duplicate-clause check pattern now appears at 17 sites across the parser (10 from 22b.4a + 8 from 22-tidy.5; the JOURNAL entry's "18 sites" was an off-by-one — re-grep confirms 17). 17 × ~12 LOC of identical structure is past the tipping point for the "three similar lines beats a premature abstraction" rule.
>
@@ -1,6 +1,6 @@
# design-md-consolidation iter 1 — sweep 1: history anchors
> **Parent spec:** `docs/specs/2026-05-10-design-md-consolidation.md`
> **Parent spec:** `docs/specs/0004-design-md-consolidation.md`
> §"Sweep 1 — Remove history anchors"
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
@@ -250,11 +250,11 @@ Edit:
- [ ] **Step 8: Decision 11 §"Prelude" (line 1753)**
Edit:
- old: `fixture); see `docs/specs/2026-05-09-22-typeclasses.md``
- old: `fixture); see `docs/specs/0002-22-typeclasses.md``
- new: `fixture); see `docs/specs/22-typeclasses.md``
NOTE: this step renames the spec-file reference. The actual file
`docs/specs/2026-05-09-22-typeclasses.md` exists on disk; sweep 1
`docs/specs/0002-22-typeclasses.md` exists on disk; sweep 1
does NOT rename the file (that would lose git history). Instead,
the in-text reference is left as the date-prefixed actual filename
because it points to a real file. **Revert this step** if the
@@ -262,7 +262,7 @@ filename on disk uses the date prefix.
Verify before editing:
```bash
ls docs/specs/2026-05-09-22-typeclasses.md
ls docs/specs/0002-22-typeclasses.md
```
If the file exists with the date prefix, KEEP the reference and
@@ -296,7 +296,7 @@ grep -nE '2026-[0-9]{2}-[0-9]{2}' docs/DESIGN.md
```
Expected: empty, OR exactly one line — the spec-file path
`docs/specs/2026-05-09-22-typeclasses.md` (if the file on disk
`docs/specs/0002-22-typeclasses.md` (if the file on disk
uses that prefix). Record this in the JOURNAL exception list.
- [ ] **Step 12: Commit**
@@ -410,7 +410,7 @@ grep -nE 'Iter [0-9]+[a-z]?(\.[0-9]+)?' docs/DESIGN.md
Expected: empty output, OR the date-prefixed spec-file reference
from Task 3 Step 11 (the path
`docs/specs/2026-05-09-22-typeclasses.md` does not match this iter
`docs/specs/0002-22-typeclasses.md` does not match this iter
pattern, so the exception list need not grow here).
- [ ] **Step 5: Commit**
@@ -498,7 +498,7 @@ grep -nE 'Iter [0-9]+[a-z]?(\.[0-9]+)?|Family [0-9]+|^[^/]*2026-[0-9]{2}-[0-9]{2
```
Expected: empty, OR up to one line (the
`docs/specs/2026-05-09-22-typeclasses.md` path from Task 3 Step 11,
`docs/specs/0002-22-typeclasses.md` path from Task 3 Step 11,
*if* the file on disk has that prefix). The leading `^[^/]*` in the
date regex pre-filters paths that begin with `docs/specs/`.
@@ -533,7 +533,7 @@ Append to `docs/JOURNAL.md` (after the last entry):
## 2026-05-10 — Iteration design-md-consolidation 1: history-anchor sweep
First iteration of the milestone defined in
`docs/specs/2026-05-10-design-md-consolidation.md`. Sweep 1 closes
`docs/specs/0004-design-md-consolidation.md`. Sweep 1 closes
the "history anchors in DESIGN.md" item: every iter tag, family
tag, date anchor, status marker, and historical bench data-point
that anchored the document to a specific moment is removed.
@@ -565,7 +565,7 @@ Specific anchor examples discarded (representative):
(bench notes in JOURNAL).`
Deliberate exceptions to the sweep-1 grep pattern (if any):
- `docs/specs/2026-05-09-22-typeclasses.md` — date-prefixed spec
- `docs/specs/0002-22-typeclasses.md` — date-prefixed spec
filename, kept verbatim because the on-disk file uses that
prefix and renaming would lose git history. Record only.
@@ -1,6 +1,6 @@
# design-md-consolidation iter 2 — sweep 2: REVERTED + migration plans + correction history + future speculations
> **Parent spec:** `docs/specs/2026-05-10-design-md-consolidation.md`
> **Parent spec:** `docs/specs/0004-design-md-consolidation.md`
> §"Sweep 2 — REVERTED + migration plans out".
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
@@ -682,7 +682,7 @@ Append to `docs/JOURNAL.md`. Template:
## 2026-05-10 — Iteration design-md-consolidation 2: REVERTED + migration + correction history + future speculations
Second iteration of the milestone defined in
`docs/specs/2026-05-10-design-md-consolidation.md`. Sweep 2 closes
`docs/specs/0004-design-md-consolidation.md`. Sweep 2 closes
the "REVERTED + migration plans + correction history + future
speculations" item: the audit-trail preservation of Decision 7,
the 7-point Decision 10 Migration plan, the Decision 9
@@ -1,6 +1,6 @@
# design-md-consolidation iter 3 — sweep 3: schema SoT inversion + data-model hardening
> **Parent spec:** `docs/specs/2026-05-10-design-md-consolidation.md`
> **Parent spec:** `docs/specs/0004-design-md-consolidation.md`
> §"Sweep 3 — Schema SoT inversion + Data-model hardening".
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
@@ -860,7 +860,7 @@ Template (adjust specifics to actual outcome):
## 2026-05-10 — Iteration design-md-consolidation 3: schema SoT inversion + data-model hardening
Third iteration of the milestone defined in
`docs/specs/2026-05-10-design-md-consolidation.md`. Sweep 3
`docs/specs/0004-design-md-consolidation.md`. Sweep 3
inverts the schema source-of-truth between `docs/DESIGN.md`
§"Data model" and `crates/ailang-core/src/ast.rs`: DESIGN.md is
canonical, `ast.rs` is the projection, and a new drift test
@@ -1,6 +1,6 @@
# design-md-consolidation iter 4 — sweep 4: workflow / cross-reference cleanup
> **Parent spec:** `docs/specs/2026-05-10-design-md-consolidation.md`
> **Parent spec:** `docs/specs/0004-design-md-consolidation.md`
> §"Sweep 4 — Workflow / cross-reference cleanup".
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
@@ -488,7 +488,7 @@ DESIGN.md line count and any cross-reference inventory specifics):
## 2026-05-10 — Iteration design-md-consolidation 4: workflow / cross-reference cleanup
Fourth and final iteration of the milestone defined in
`docs/specs/2026-05-10-design-md-consolidation.md`. Sweep 4
`docs/specs/0004-design-md-consolidation.md`. Sweep 4
closes the "workflow / cross-reference cleanup" item: the
stale `agents/` ecosystem entry is replaced with a `Skills`
entry pointing to `skills/<name>/agents/`; the workflow-detail
@@ -646,7 +646,7 @@ Edit `docs/roadmap.md`:
becomes a state-only specification across four thematic sweeps
(history anchors out, migration plans out, schema-SoT inversion +
data-model hardening, workflow / cross-reference cleanup).
- context: `docs/specs/2026-05-10-design-md-consolidation.md`
- context: `docs/specs/0004-design-md-consolidation.md`
- sub-entries:
- [x] Sweep 1 — remove history anchors
- [x] Sweep 2 — REVERTED + migration plans out
@@ -660,7 +660,7 @@ Edit `docs/roadmap.md`:
(history anchors out, REVERTED + migration plans out,
schema-SoT inversion + data-model hardening, workflow /
cross-reference cleanup). Closed 2026-05-10.
- context: `docs/specs/2026-05-10-design-md-consolidation.md`,
- context: `docs/specs/0004-design-md-consolidation.md`,
JOURNAL milestone-close entry of same date.
```
@@ -1,6 +1,6 @@
# Floats Iteration 1 — Schema Layer (Implementation Plan)
> **Parent spec:** `docs/specs/2026-05-10-floats.md` (committed
> **Parent spec:** `docs/specs/0005-floats.md` (committed
> `e37366f`, approved 2026-05-10)
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
@@ -1,6 +1,6 @@
# Floats Iteration 2 — Surface Layer (Implementation Plan)
> **Parent spec:** `docs/specs/2026-05-10-floats.md` (committed
> **Parent spec:** `docs/specs/0005-floats.md` (committed
> `e37366f`, approved 2026-05-10) — sections A2 and the
> `crates/ailang-surface/` Components subsection.
>
@@ -1,6 +1,6 @@
# Floats Iteration 3 — Typecheck + Builtins (Implementation Plan)
> **Parent spec:** `docs/specs/2026-05-10-floats.md` (committed
> **Parent spec:** `docs/specs/0005-floats.md` (committed
> `e37366f`, approved 2026-05-10) — section A3 + the
> `crates/ailang-check/` Components subsection.
>
@@ -1,6 +1,6 @@
# Floats Iteration 4 — Codegen + Runtime (Implementation Plan)
> **Parent spec:** `docs/specs/2026-05-10-floats.md` (committed
> **Parent spec:** `docs/specs/0005-floats.md` (committed
> `e37366f`, approved 2026-05-10) — sections A3 (codegen-side
> dispatch), A4 (conversions), A5 (determinism), and the
> `crates/ailang-codegen/` + `runtime/` Components subsections.
@@ -1,6 +1,6 @@
# Floats Iteration 5 — Prose + DESIGN.md + Milestone Close (Implementation Plan)
> **Parent spec:** `docs/specs/2026-05-10-floats.md` (committed
> **Parent spec:** `docs/specs/0005-floats.md` (committed
> `e37366f`, approved 2026-05-10) — section A5 (determinism
> contract) + the `crates/ailang-prose/` Components subsection.
>
@@ -1,6 +1,6 @@
# ct.1 — Canonical Type Names: Validator + Migration — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-10-canonical-type-names.md` (Components row ct.1)
> **Parent spec:** `docs/specs/0007-canonical-type-names.md` (Components row ct.1)
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# Iteration ct.2: Typechecker Cleanup — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-10-canonical-type-names.md`
> **Parent spec:** `docs/specs/0007-canonical-type-names.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1011,7 +1011,7 @@ allows — see `skills/audit/SKILL.md`).
- [ ] **Step C2: Confirm the four obsolete mechanisms catalogue**
After ct.2 closes, two of the four mechanisms named in
`docs/specs/2026-05-10-canonical-type-names.md` ct.1 JOURNAL
`docs/specs/0007-canonical-type-names.md` ct.1 JOURNAL
entry are gone:
- ✅ `Pattern::Ctor` imports-fallback (was lib.rs:2486-2521).
- ✅ `Term::Ctor` synth imports-fallback (was lib.rs:1979-2025).
@@ -1,6 +1,6 @@
# Iteration ct.3: Codegen + Mono Cleanup — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-10-canonical-type-names.md`
> **Parent spec:** `docs/specs/0007-canonical-type-names.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# Iteration ct.4: Milestone Close — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-10-canonical-type-names.md`
> **Parent spec:** `docs/specs/0007-canonical-type-names.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -828,7 +828,7 @@ policy. No new regressions vs. baseline.
- [ ] **Step C2: Confirm all acceptance criteria from the spec**
Verify each item in `docs/specs/2026-05-10-canonical-type-names.md`
Verify each item in `docs/specs/0007-canonical-type-names.md`
§ "Acceptance criteria":
1. ✅ `load_workspace` validates every `Type::Con` (ct.1).
@@ -1,6 +1,6 @@
# Orchestrator-Refactor — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-11-implement-orchestrator-agent.md`
> **Parent spec:** `docs/specs/0008-implement-orchestrator-agent.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# Iteration pr.1 — Plan-recon Subagent — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-11-plan-recon-subagent.md`
> **Parent spec:** `docs/specs/0009-plan-recon-subagent.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -455,7 +455,7 @@ Replace with:
during Step 1 when the milestone enters code territory the Boss
has not recently read; this is opt-in and not part of the standard
process. Rationale: brainstorm's recon phase is interwoven with
the user Q&A — see `docs/specs/2026-05-11-plan-recon-subagent.md`
the user Q&A — see `docs/specs/0009-plan-recon-subagent.md`
for the full reasoning.
```
@@ -1,6 +1,6 @@
# Audit / fieldtest / docwriter cadence restructure — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-11-audit-fieldtest-docwriter-cadence.md`
> **Parent spec:** `docs/specs/0012-audit-fieldtest-docwriter-cadence.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement` to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# gc.1 — Grounding-Check Agent — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-11-brainstorm-grounding-check.md`
> **Parent spec:** `docs/specs/0013-brainstorm-grounding-check.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -410,7 +410,7 @@ Current (lines 213-219):
during Step 1 when the milestone enters code territory the Boss
has not recently read; this is opt-in and not part of the standard
process. Rationale: brainstorm's recon phase is interwoven with
the user Q&A — see `docs/specs/2026-05-11-plan-recon-subagent.md`
the user Q&A — see `docs/specs/0009-plan-recon-subagent.md`
for the full reasoning.
```
@@ -420,14 +420,14 @@ Replace with:
- **Private agent:** `skills/brainstorm/agents/ailang-grounding-check.md`
— dispatched in Step 7.5 as a hard-gate. The agent reads the spec
with fresh context and reports PASS / BLOCK / INFRA_ERROR. See
`docs/specs/2026-05-11-brainstorm-grounding-check.md` for the
`docs/specs/0013-brainstorm-grounding-check.md` for the
design rationale.
- **Ad-hoc dispatch.** The Boss MAY also ad-hoc dispatch
`skills/planner/agents/ailang-plan-recon.md` during Step 1 when
the milestone enters code territory the Boss has not recently
read; this is opt-in and not part of the standard process.
Rationale: brainstorm's recon phase is interwoven with the user
Q&A — see `docs/specs/2026-05-11-plan-recon-subagent.md` for the
Q&A — see `docs/specs/0009-plan-recon-subagent.md` for the
full reasoning.
```
@@ -1,6 +1,6 @@
# Iter 23.4 — Mono-Pass Unification — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-11-23-eq-ord-prelude.md` (commit 841d65d, re-grounded 2026-05-11 against main HEAD 51da9fa, PASS)
> **Parent spec:** `docs/specs/0014-23-eq-ord-prelude.md` (commit 841d65d, re-grounded 2026-05-11 against main HEAD 51da9fa, PASS)
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement` to run this plan. Steps use `- [ ]` checkboxes for tracking. The implementer does NOT commit — work accumulates in the working tree; the Boss commits the iter at the end.
@@ -1267,11 +1267,11 @@ The implement orchestrator's terminal Phase 4 (journal write) includes a "Bench"
## Hand-off
This plan is written to the working tree at `docs/plans/2026-05-11-iter-23.4.md` (uncommitted). The Boss reviews and commits when handing off to `implement` (suggested commit subject: `plan: 23.4 mono-pass unification`).
This plan is written to the working tree at `docs/plans/0033-iter-23.4.md` (uncommitted). The Boss reviews and commits when handing off to `implement` (suggested commit subject: `plan: 23.4 mono-pass unification`).
Hand-off to `implement` carries:
- `plan_path`: `docs/plans/2026-05-11-iter-23.4.md`
- `plan_path`: `docs/plans/0033-iter-23.4.md`
- `iter_id`: `23.4`
- `task_range`: full (Tasks 111)
- Notes for the orchestrator-agent:
@@ -43,7 +43,7 @@ or any on-disk fixture (including the prelude).
**Out of scope:**
- The five prelude free fns themselves (`ne`/`lt`/`le`/`gt`/`ge`).
They land in iter 23.4 unchanged from the existing
`docs/plans/2026-05-11-iter-23.4.md`.
`docs/plans/0033-iter-23.4.md`.
- Any modification to `examples/prelude.ail.json`.
- Any new diagnostic for the hypothetical multi-implicit-import
ambiguity case.
@@ -1,6 +1,6 @@
# Iter 23.5 — Prelude free fns + E2E — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-11-23-eq-ord-prelude.md`
> **Parent spec:** `docs/specs/0014-23-eq-ord-prelude.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking. No
@@ -1224,7 +1224,7 @@ Same command as Step 1. Confirm empty output. (This is the "RED" state.)
- [ ] **Step 3: Write minimal implementation**
Edit `docs/DESIGN.md`. After line 1702 (the line ending with
`"... see `docs/specs/2026-05-09-22-typeclasses.md` 'Amendments' for the substantive rationale."`),
`"... see `docs/specs/0002-22-typeclasses.md` 'Amendments' for the substantive rationale."`),
insert two blank lines and the following paragraph block:
```markdown
@@ -1409,7 +1409,7 @@ record per-script exit codes in the `Stats` section.
## Handoff
Plan file: `docs/plans/2026-05-12-iter-23.5.md`.
Plan file: `docs/plans/0035-iter-23.5.md`.
Hand off to `skills/implement` with: this plan path. Boss commits the
plan with subject `plan: iter 23.5 prelude free fns + E2E — 8 tasks`
@@ -1,6 +1,6 @@
# rt.1 — Roundtrip Invariant Audit Tests — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-12-roundtrip-invariant.md`
> **Parent spec:** `docs/specs/0015-roundtrip-invariant.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# Iter boss — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-12-boss-skill.md`
> **Parent spec:** `docs/specs/0016-boss-skill.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# cma.1 — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-12-cross-model-authoring-form-test.md`
> **Parent spec:** `docs/specs/0017-cross-model-authoring-form-test.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -74,7 +74,7 @@ Empirical measurement of whether `.ail.json` or `.ailx` is the form a
foreign LLM author reaches for and succeeds with. Single subject for
v1: Qwen3-Coder-Next via IONOS. Two blind cohorts; same four tasks.
Parent spec: `docs/specs/2026-05-12-cross-model-authoring-form-test.md`.
Parent spec: `docs/specs/0017-cross-model-authoring-form-test.md`.
## Layout
@@ -1,6 +1,6 @@
# cma.2 — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-12-cross-model-authoring-form-test.md`
> **Parent spec:** `docs/specs/0017-cross-model-authoring-form-test.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# ms.1 — Pipeline anyhow-chain preservation — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-12-multi-subject-codellama.md`
> **Parent spec:** `docs/specs/0018-multi-subject-codellama.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# ms.2 — Multi-subject run + DESIGN.md addendum extension — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-12-multi-subject-codellama.md`
> **Parent spec:** `docs/specs/0018-multi-subject-codellama.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -309,7 +309,7 @@ rejected and a different model ran in its place.)
- [ ] **Step 1: Confirm all spec acceptance criteria are green**
For each of the 7 criteria in
`docs/specs/2026-05-12-multi-subject-codellama.md` §"Acceptance
`docs/specs/0018-multi-subject-codellama.md` §"Acceptance
criteria", verify the corresponding artefact exists in the working
tree. Report green/red per criterion in the iter journal.
@@ -1,6 +1,6 @@
# hs.1 — Heap-Str ABI: Static-Str Layout Migration — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-12-heap-str-abi.md`
> **Parent spec:** `docs/specs/0019-heap-str-abi.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# hs.2 — Static-Str sentinel-slot retrofit — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-12-heap-str-abi.md`
> **Parent spec:** `docs/specs/0019-heap-str-abi.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# hs.3 — Heap-Str runtime additions — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-12-heap-str-abi.md`
> **Parent spec:** `docs/specs/0019-heap-str-abi.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# hs.4 — IR + checker + linker wiring for int_to_str / float_to_str — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-12-heap-str-abi.md`
> **Parent spec:** `docs/specs/0019-heap-str-abi.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# eob.1 — Effect-op arguments borrow — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-12-effect-op-borrow.md`
> **Parent spec:** `docs/specs/0020-effect-op-borrow.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# ctt.1 — Env-overlay shape ratification — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-12-ct-tidy.md`
> **Parent spec:** `docs/specs/0021-ct-tidy.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# ctt.2 — `Registry.type_def_module` re-key — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-12-ct-tidy.md`
> **Parent spec:** `docs/specs/0021-ct-tidy.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# ctt.3 — `KindMismatch` retire — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-12-ct-tidy.md`
> **Parent spec:** `docs/specs/0021-ct-tidy.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# 24.1 — `bool_to_str` + `str_clone` Runtime + Codegen Wiring — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-12-24-show-print.md` (commit 953f2e1)
> **Parent spec:** `docs/specs/0022-24-show-print.md` (commit 953f2e1)
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# Iter mq.1 — Canonical-form extension for class-ref fields — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-13-module-qualified-class-names.md`
> **Parent spec:** `docs/specs/0023-module-qualified-class-names.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement` to
> run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# Iter mq.2 — Type-driven dispatch mechanism (installed, not yet exercised) — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-13-module-qualified-class-names.md`
> **Parent spec:** `docs/specs/0023-module-qualified-class-names.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# Iter mq.3 — Retire MethodNameCollision + multi-class E2E + DESIGN.md sync — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-13-module-qualified-class-names.md`
> **Parent spec:** `docs/specs/0023-module-qualified-class-names.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement` to run
> this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# Iter mq.tidy — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-13-module-qualified-class-names.md`
> **Parent spec:** `docs/specs/0023-module-qualified-class-names.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# Iter 24.2 — class Show + 4 instances + 22b migration — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-13-24-show-print.md`
> **Parent spec:** `docs/specs/0024-24-show-print.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# Iter 24.3 — `fn print` polymorphic free fn + E2E + DESIGN.md sync — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-13-24-show-print.md`
> **Parent spec:** `docs/specs/0024-24-show-print.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# Iter form-a.0 — Prelude Pilot — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-13-form-a-default-authoring.md`
> **Parent spec:** `docs/specs/0025-form-a-default-authoring.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -140,8 +140,8 @@ recon-observed values; if Task 1 Step 2 observed different values
# Iter form-a.0 — Prelude Pilot
**Date:** 2026-05-13
**Parent spec:** `docs/specs/2026-05-13-form-a-default-authoring.md`
**Parent plan:** `docs/plans/2026-05-13-iter-form-a.0.md`
**Parent spec:** `docs/specs/0025-form-a-default-authoring.md`
**Parent plan:** `docs/plans/0059-iter-form-a.0.md`
## Outcome
@@ -1,6 +1,6 @@
# Iter form-a.1 — Big-bang Migration + Milestone Close — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-13-form-a-default-authoring.md`
> **Parent spec:** `docs/specs/0025-form-a-default-authoring.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,7 +1,7 @@
# form-a.tidy — Implementation Plan
> **Parent specs:**
> - `docs/specs/2026-05-13-fieldtest-form-a.md` §Findings 2-3 (spec_gap: form_a.md missing class/instance/constraint sections + canonical-form qualifier rule)
> - `docs/specs/0026-fieldtest-form-a.md` §Findings 2-3 (spec_gap: form_a.md missing class/instance/constraint sections + canonical-form qualifier rule)
> - `docs/journals/2026-05-13-audit-form-a.md` §"Drift items" (3 of 4 documentary items; item #2 dropped per recon — see Architecture)
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement` to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -17,7 +17,7 @@
**Files this plan creates or modifies:**
- Modify: `crates/ailang-core/specs/form_a.md` — three new sections (Tasks 1-3) + line 66 intro update (Task 1)
- Modify: `docs/specs/2026-05-13-form-a-default-authoring.md` — 5 site edits (Task 4)
- Modify: `docs/specs/0025-form-a-default-authoring.md` — 5 site edits (Task 4)
- Modify: `crates/ailang-core/src/hash.rs:50-57` — delete 8 lines (Task 5)
- Modify: `crates/ailang-surface/tests/round_trip.rs` — module docstring + test inner docstring rewrite (Task 6)
@@ -234,7 +234,7 @@ Expected: total `559 passed`.
### Task 4: form-a spec — fix 5 contradictory "seven carve-outs" sites
**Files:**
- Modify: `docs/specs/2026-05-13-form-a-default-authoring.md` at five line ranges
- Modify: `docs/specs/0025-form-a-default-authoring.md` at five line ranges
The audit-form-a journal flagged three sections (§C1, §C2, §"Data flow")
contradicting the §C4(b) amendment. Recon expanded the find to 5 sites
@@ -251,7 +251,7 @@ the §"Data flow" diagram.
- [ ] **Step 1: Fix preamble line 11**
Replace at `docs/specs/2026-05-13-form-a-default-authoring.md:11`:
Replace at `docs/specs/0025-form-a-default-authoring.md:11`:
```
that remain in the repository are seven specific negative-test
@@ -265,7 +265,7 @@ that remain in the repository are eight specific negative-test
- [ ] **Step 2: Fix §C1 line 170**
Replace at `docs/specs/2026-05-13-form-a-default-authoring.md:170`:
Replace at `docs/specs/0025-form-a-default-authoring.md:170`:
```
walks examples/*.ail.json, skips the seven carve-outs (named
@@ -279,7 +279,7 @@ walks examples/*.ail.json, skips the eight carve-outs (named
- [ ] **Step 3: Fix §C2 line 191**
Replace at `docs/specs/2026-05-13-form-a-default-authoring.md:191`:
Replace at `docs/specs/0025-form-a-default-authoring.md:191`:
```
`ailang_surface::parse_module_from_str`. The seven carve-outs
@@ -293,7 +293,7 @@ with:
- [ ] **Step 4: Fix §C3 line 218**
Replace at `docs/specs/2026-05-13-form-a-default-authoring.md:218`:
Replace at `docs/specs/0025-form-a-default-authoring.md:218`:
```
**Carve-out anchor.** The seven .ail.json-only fixtures are
@@ -307,7 +307,7 @@ with:
- [ ] **Step 5: Fix §"Data flow" lines 363, 374**
Replace at `docs/specs/2026-05-13-form-a-default-authoring.md:363`:
Replace at `docs/specs/0025-form-a-default-authoring.md:363`:
```
except for the seven carve-outs:
@@ -319,7 +319,7 @@ with:
except for the eight carve-outs:
```
Replace at `docs/specs/2026-05-13-form-a-default-authoring.md:374`:
Replace at `docs/specs/0025-form-a-default-authoring.md:374`:
```
only by the seven carve-outs (and by any test that explicitly mixes
@@ -333,7 +333,7 @@ only by the eight carve-outs (and by any test that explicitly mixes
- [ ] **Step 6: Sanity-check no other "seven" → "eight" candidates were missed**
Run: `grep -n 'seven' docs/specs/2026-05-13-form-a-default-authoring.md`
Run: `grep -n 'seven' docs/specs/0025-form-a-default-authoring.md`
Expected output (post-edit; verbatim — these surviving "seven" sites
are correct under §C4(a) scope or are arithmetic / future-state, not
defects):
@@ -497,7 +497,7 @@ Expected output: empty (zero hits).
## Decision recorded — Drift item B2 (plan-file "seven carve-outs" orphans)
Recon verified that `docs/plans/2026-05-13-iter-form-a.1.md` contains
Recon verified that `docs/plans/0060-iter-form-a.1.md` contains
**zero** defective `seven` mentions; the four hits are all internally
scoped to §C4(a) (which IS seven), arithmetic, or future-state. The
audit-form-a journal's "two sites" claim against this file does not
@@ -1,6 +1,6 @@
# str-concat — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-13-fieldtest-form-a.md` §"[friction] No primitive str_concat / str_append in builtins" (lines 186-212).
> **Parent spec:** `docs/specs/0026-fieldtest-form-a.md` §"[friction] No primitive str_concat / str_append in builtins" (lines 186-212).
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement` to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# rpe.1 — Retire per-type print effect-ops — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-14-retire-per-type-print-effects.md`
> **Parent spec:** `docs/specs/0027-retire-per-type-print-effects.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# pd.1 — core API split (load_modules_with + build_workspace) — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-14-prelude-decouple.md`
> **Parent spec:** `docs/specs/0028-prelude-decouple.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -796,7 +796,7 @@ touched in pd.1:
- Deleting `examples/prelude.ail.json` (pd.3).
- Deleting the defensive include in `crates/ail/src/main.rs:472-484` (pd.3).
- Updating `crates/ailang-core/tests/carve_out_inventory.rs` (pd.3).
- Updating `docs/specs/2026-05-13-form-a-default-authoring.md` §C4 (b)
- Updating `docs/specs/0025-form-a-default-authoring.md` §C4 (b)
(pd.3).
A pd.1 implementer who finds themselves about to edit any of the above
@@ -1,6 +1,6 @@
# pd.2 — surface assumes prelude ownership; core shim retired — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-14-prelude-decouple.md`
> **Parent spec:** `docs/specs/0028-prelude-decouple.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -793,7 +793,7 @@ in pd.2:
`crates/ail/src/main.rs:472-484` (pd.3 work).
- Updating `crates/ailang-core/tests/carve_out_inventory.rs` to reflect
§C4 (b) becoming empty (pd.3 work).
- Updating `docs/specs/2026-05-13-form-a-default-authoring.md` §C4 (b)
- Updating `docs/specs/0025-form-a-default-authoring.md` §C4 (b)
(pd.3 work).
- Creating `prelude_decouple_carve_out_pin.rs` (pd.3 work — asserts
the JSON file does not exist; pd.2-time the file IS still present).
@@ -1,6 +1,6 @@
# pd.3 — retire prelude.ail.json + carve-out cleanup — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-14-prelude-decouple.md`
> **Parent spec:** `docs/specs/0028-prelude-decouple.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -32,7 +32,7 @@ dev-dep edge.
delete), `ailang-surface/tests/` (one test fn + supporting bytes
delete + new carve-out pin), `ailang-core` (one in-mod test re-point),
`ailang-core/tests/carve_out_inventory.rs` (list + comment update),
`docs/specs/2026-05-13-form-a-default-authoring.md` (§C4 (b) status
`docs/specs/0025-form-a-default-authoring.md` (§C4 (b) status
note), `examples/prelude.ail.json` (deleted).
---
@@ -63,7 +63,7 @@ note), `examples/prelude.ail.json` (deleted).
class-def rejection); §C4 (b) compile-time-embed: retired by
prelude-decouple milestone, 2026-05-14"; update the header sentence
at line 2 from "eight" to "seven".
- Modify: `docs/specs/2026-05-13-form-a-default-authoring.md:270-311`
- Modify: `docs/specs/0025-form-a-default-authoring.md:270-311`
— add a "Status: RETIRED 2026-05-14 by prelude-decouple milestone"
marker at the top of §C4 (b) and a one-paragraph epitaph at the
bottom; preserve the original §C4 (b) text below as historical
@@ -370,10 +370,10 @@ order is correct.
---
### Task 5: Update `docs/specs/2026-05-13-form-a-default-authoring.md` §C4 (b)
### Task 5: Update `docs/specs/0025-form-a-default-authoring.md` §C4 (b)
**Files:**
- Modify: `docs/specs/2026-05-13-form-a-default-authoring.md:270-311`
- Modify: `docs/specs/0025-form-a-default-authoring.md:270-311`
add a "Status: RETIRED" marker at top of §C4 (b) and a one-paragraph
epitaph at the bottom; preserve the original text as historical
context.
@@ -389,7 +389,7 @@ qualifiers preserve correctness.
- [ ] **Step 1: Insert a status marker at the top of §C4 (b)**
Edit `docs/specs/2026-05-13-form-a-default-authoring.md`. Find the
Edit `docs/specs/0025-form-a-default-authoring.md`. Find the
`**(b) Compile-time-embed carve-outs (one file as of 2026-05-13):**`
heading (line 270 area). Insert immediately above:
@@ -400,7 +400,7 @@ heading (line 270 area). Insert immediately above:
> and parsed at compile time via `ailang_surface::parse_prelude`. The
> original §C4 (b) framing below is preserved as historical context;
> it documents the doctrine inconsistency that prelude-decouple
> resolved. See `docs/specs/2026-05-14-prelude-decouple.md` and the
> resolved. See `docs/specs/0028-prelude-decouple.md` and the
> per-iter journals 2026-05-14-iter-pd.{1,2,3}.md for the resolution.
```
@@ -456,7 +456,7 @@ fn prelude_ail_json_does_not_exist_on_disk() {
re-introduced this file, you must also: (a) remove this pin, \
(b) restore the §C4 (b) entry in carve_out_inventory.rs, \
(c) revert the §C4 (b) status marker in \
docs/specs/2026-05-13-form-a-default-authoring.md, and \
docs/specs/0025-form-a-default-authoring.md, and \
(d) record the rationale in a per-iter journal."
);
}
@@ -561,7 +561,7 @@ Per the parent spec (§Acceptance criteria):
didn't regress.
4. `cargo test --workspace` is green — verified Task 7 Step 5 + Task 8 Step 1.
5. Baselines green at unchanged values — verified Task 8 Step 1.
6. `docs/specs/2026-05-13-form-a-default-authoring.md` §C4 (b) is
6. `docs/specs/0025-form-a-default-authoring.md` §C4 (b) is
updated — verified by Task 5.
7. CLAUDE.md and `docs/DESIGN.md` reviewed — spot-check now.
@@ -1,6 +1,6 @@
# mut.1 — schema + surface — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-15-mut-local.md`
> **Parent spec:** `docs/specs/0029-mut-local.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -907,7 +907,7 @@ always sees a single `body: Term`. A `(mut ...)` form with neither
vars nor body is rejected at parse; `(var ...)` and `(assign ...)`
outside a `(mut ...)` are rejected at parse for `var` and at
typecheck for `assign` (mut.2). See spec
`docs/specs/2026-05-15-mut-local.md`.
`docs/specs/0029-mut-local.md`.
```
- [ ] **Step 5: Extend DESIGN.md §"Term (expression)"**
@@ -930,7 +930,7 @@ line 2364), append:
// Iter mut.1: in-block update of a mut-var. Legal only as a
// sub-term of a `Term::Mut` whose `vars` includes a var with the
// same `name`. Static type Unit. See
// `docs/specs/2026-05-15-mut-local.md`.
// `docs/specs/0029-mut-local.md`.
{ "t": "assign",
"name": "<id>",
"value": Term }
@@ -1063,7 +1063,7 @@ before continuing — the iteration's gate is full-workspace-green.
## Self-review checklist
- [ ] **Spec coverage:** every section of `docs/specs/2026-05-15-mut-local.md`
- [ ] **Spec coverage:** every section of `docs/specs/0029-mut-local.md`
§"Iteration mut.1 — Schema + surface" has a corresponding task here.
Cross-check: AST extension (Task 1), Form A surface (Task 4),
canonical-form invariants (Task 1 empty-vars pin + Task 5 drift
@@ -1,6 +1,6 @@
# mut.2 — typecheck — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-15-mut-local.md`
> **Parent spec:** `docs/specs/0029-mut-local.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -123,7 +123,7 @@ immediately before the `Internal` variant at line 638, insert:
/// whose declared `ty` is not one of the four supported scalar
/// primitives (Int, Float, Bool, Unit). The temporary
/// restriction is named explicitly in spec
/// `docs/specs/2026-05-15-mut-local.md` §"Out of scope".
/// `docs/specs/0029-mut-local.md` §"Out of scope".
UnsupportedMutVarType {
name: String,
ty: String,
@@ -667,7 +667,7 @@ clean.
//! the expected diagnostic codes (or zero diagnostics for the
//! positive nested-shadow case).
//!
//! Spec: docs/specs/2026-05-15-mut-local.md §"Testing strategy /
//! Spec: docs/specs/0029-mut-local.md §"Testing strategy /
//! Typecheck negative tests".
use std::path::PathBuf;
@@ -1,6 +1,6 @@
# mut.3 — codegen + e2e — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-15-mut-local.md`
> **Parent spec:** `docs/specs/0029-mut-local.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -642,7 +642,7 @@ Insert (with appropriate context):
path lift the type restriction (heap-RC-managed Str + ADTs), add
escaping references (`ref a` + `!Mut` effect), and introduce
composable transducers (`Stateful a b` + `pipe`). Spec:
`docs/specs/2026-05-15-mut-local.md`.
`docs/specs/0029-mut-local.md`.
```
- [ ] **Step 3: Verify schema-drift tests still pass**
@@ -1,6 +1,6 @@
# mut.4-tidy — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-15-mut-local.md` (covered by
> **Parent spec:** `docs/specs/0029-mut-local.md` (covered by
> audit-mut-local findings; no new spec).
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
@@ -20,7 +20,7 @@ eliminate the per-Var-resolution overhead for programs with no mut
blocks.
**Architecture:** Architect's two `[high]` drift items are downstream
of one spec gap: `docs/specs/2026-05-15-mut-local.md` does not
of one spec gap: `docs/specs/0029-mut-local.md` does not
enumerate "lambda body referencing an enclosing mut-var" as a
diagnostic. The fix has three sites — typecheck adds the diagnostic
in `Term::Lam`'s synth arm, codegen replaces its blame-comment path
@@ -68,7 +68,7 @@ new negative fixture and one driver-test extension.
jsonc block) — remove the trailing paragraph describing the
mut.1-stub dispatch state; replace with a paragraph describing the
current end-to-end mut.3 state.
- Modify: `docs/specs/2026-05-15-mut-local.md` (§"Out of scope" or
- Modify: `docs/specs/0029-mut-local.md` (§"Out of scope" or
equivalent) — add a bullet naming "Lambda capture of a mut-var"
as explicitly rejected, with the diagnostic name.
- Modify: `crates/ailang-check/tests/mut_typecheck_pin.rs` — add
@@ -111,7 +111,7 @@ In the `CheckError` enum body, immediately after
/// Iter mut.4-tidy: `Term::Lam` reached typecheck inside a
/// `Term::Mut` scope, and the lambda's body references a mut-var
/// declared in that enclosing scope. Spec
/// `docs/specs/2026-05-15-mut-local.md` §"Out of scope": mut-vars
/// `docs/specs/0029-mut-local.md` §"Out of scope": mut-vars
/// cannot escape — they are alloca-resident and lexically scoped.
/// Capturing one into a closure would require either lifting it
/// to the heap (deferred milestone) or rejecting the capture.
@@ -509,7 +509,7 @@ yielding the canonical Unit SSA. Mut-vars must be of one of the
stack-resident scalar types {Int, Float, Bool, Unit}; capturing a
mut-var into a lambda is rejected at typecheck via
`CheckError::MutVarCapturedByLambda`. See
`docs/specs/2026-05-15-mut-local.md`.
`docs/specs/0029-mut-local.md`.
```
- [ ] **Step 2: Verify schema-drift tests still pass**
@@ -522,7 +522,7 @@ Expected: PASS.
## Task 7 — Spec amendment
**Files:**
- Modify: `docs/specs/2026-05-15-mut-local.md` (§"Out of scope" or §"Acceptance criteria")
- Modify: `docs/specs/0029-mut-local.md` (§"Out of scope" or §"Acceptance criteria")
- [ ] **Step 1: Add bullet to §"Out of scope"**
@@ -1,6 +1,6 @@
# it.1 — loop/recur additive — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-15-iteration-discipline.md`
> **Parent spec:** `docs/specs/0031-iteration-discipline.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# it.2 — guardedness checker + Diverge effect — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-15-iteration-discipline.md`
> **Parent spec:** `docs/specs/0031-iteration-discipline.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# it.3 — retire tail-app/tail-do + corpus migration — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-15-iteration-discipline.md`
> **Parent spec:** `docs/specs/0031-iteration-discipline.md`
> (scope-corrected at 2018178 + it.3-recon-corrected at 10a0595)
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
@@ -428,7 +428,7 @@ keep the heading, replace the body with "Superseded by the
iteration-discipline milestone (2026-05-15): explicit tail calls
were retired in favour of structural recursion (total by
construction under Decision 10) + named `loop`/`recur`. See
`docs/specs/2026-05-15-iteration-discipline.md`." EBNF block
`docs/specs/0031-iteration-discipline.md`." EBNF block
`:552565`: remove `tail-app-term`/`tail-do-term` productions.
§"Data model" `:23572359` (`"app"` tail jsonc + comment),
`:23732375` (`"do"`), `:24522467` (the it.1/it.2 transitional
@@ -1,6 +1,6 @@
# Iteration-discipline revert — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-16-iteration-discipline-revert.md`
> **Parent spec:** `docs/specs/0032-iteration-discipline-revert.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -340,7 +340,7 @@ Replace the current Decision 3 body (the it.2 paragraph "As of iter it.2 … unb
Locate the clause-3 sentence at DESIGN.md ~105-110: *"The canonical worked example is the iteration story: a bare `while` over mutable state passes 1 and 2 yet fails 3 (it reinstates iterated-mutable-state reasoning); structural recursion over an acyclic ADT and a named loop/recur point pass all three (the bug class is closed by construction, not by advice)."*
Replace with (hypothetical-illustration form — the `loop`/`recur` machinery no longer exists, so it must not read as shipped):
> The criterion's discriminator is whether the wrong code fails to typecheck, not whether a guideline advises against it. Worked example: a bare `while` over mutable state would pass clauses 1 and 2 yet fail clause 3 (it reinstates iterated-mutable-state reasoning the pure core exists to remove); a hypothetical "all repetition is either structurally-decreasing recursion over an acyclic ADT or an explicit named loop" iteration story would, *if it could be built without a documented-unenforced precondition*, pass all three — and the fact that the 2026-05 attempt could not (it forced a silent-divergence precondition; see `docs/specs/2026-05-16-iteration-discipline-revert.md`) is itself the clause-3 mechanism working as intended.
> The criterion's discriminator is whether the wrong code fails to typecheck, not whether a guideline advises against it. Worked example: a bare `while` over mutable state would pass clauses 1 and 2 yet fail clause 3 (it reinstates iterated-mutable-state reasoning the pure core exists to remove); a hypothetical "all repetition is either structurally-decreasing recursion over an acyclic ADT or an explicit named loop" iteration story would, *if it could be built without a documented-unenforced precondition*, pass all three — and the fact that the 2026-05 attempt could not (it forced a silent-divergence precondition; see `docs/specs/0032-iteration-discipline-revert.md`) is itself the clause-3 mechanism working as intended.
- [ ] **Step 3: De-claim the brainstorm SKILL.md reference in lockstep**
@@ -348,7 +348,7 @@ In `skills/brainstorm/SKILL.md` ~107, change "(with the canonical worked example
- [ ] **Step 4: Add the F1/F4 documentation note**
In `docs/DESIGN.md`, in the §"Local mutable state" vicinity (after the bullet ending `Spec: docs/specs/2026-05-15-mut-local.md.` ~line 2918, before "Pipeline regression smoke tests:"), insert verbatim:
In `docs/DESIGN.md`, in the §"Local mutable state" vicinity (after the bullet ending `Spec: docs/specs/0029-mut-local.md.` ~line 2918, before "Pipeline regression smoke tests:"), insert verbatim:
> **Accumulator-over-iteration shape (documented idiom, not an enforced rule).** `mut`/`var`/`assign` removes friction from *straight-line* and *cascade-of-if* accumulators, but does **not** by itself express the "one running total updated once per loop iteration" shape: a `var` cannot be captured into a lambda (the seal) and there is no loop construct in the language. Until a future iteration-totality milestone lands (gated behind `Nat`/refinement types — see the deferred roadmap entry), the canonical pattern for the per-iteration accumulator is a tail-recursive helper that threads the running total as an explicit parameter; `examples/mut_counter.ail` is the reference. This is a documented authoring idiom, not a typecheck-enforced constraint — wrong code here does not fail to compile, it is merely less ergonomic, which is exactly why this is documentation and not a language rule.
@@ -388,7 +388,7 @@ Expected: PASS.
**Files:**
- Modify: `docs/roadmap.md` (remove the Iteration-discipline `[~]` entry + blocking-fork sub-section, contiguous ~43-178; add one deferred entry; KEEP F3 ~375-382 + Stateful-islands untouched)
- Modify: `docs/specs/2026-05-15-iteration-discipline.md` (add superseded header — file is already clean; the A1 discard was done Boss-side pre-plan, so this is the ONLY edit to this file)
- Modify: `docs/specs/0031-iteration-discipline.md` (add superseded header — file is already clean; the A1 discard was done Boss-side pre-plan, so this is the ONLY edit to this file)
- Create: `docs/journals/2026-05-16-iter-revert.md` (the iter journal — written by the implement skill at iter close)
- Modify: `docs/journals/INDEX.md` (append the new journal line)
@@ -409,7 +409,7 @@ Delete the contiguous `- [~] **[milestone]** Iteration discipline …` entry and
SMT). Not abandoned; correctly sequenced after the type machinery.
- depends on: a future `Nat`/refinement-types milestone (no spec
yet).
- context: `docs/specs/2026-05-16-iteration-discipline-revert.md`
- context: `docs/specs/0032-iteration-discipline-revert.md`
(why the 2026-05 attempt was reverted) and
`docs/journals/2026-05-15-iter-it.3.md` (the branching-builder
counter-example that surfaced the gap).
@@ -422,11 +422,11 @@ Expected: the F3 todo and the Stateful-islands milestone entry are still present
- [ ] **Step 3: Add the superseded header to the old spec**
At the very top of `docs/specs/2026-05-15-iteration-discipline.md` (before `# Iteration discipline — Design Spec`), insert verbatim:
At the very top of `docs/specs/0031-iteration-discipline.md` (before `# Iteration discipline — Design Spec`), insert verbatim:
```markdown
> **SUPERSEDED 2026-05-16 by
> `docs/specs/2026-05-16-iteration-discipline-revert.md`.** This
> `docs/specs/0032-iteration-discipline-revert.md`.** This
> milestone was reverted in full (it.1 + it.2 backed out forward;
> it.3 never ran). It is retained as a historical record of the
> attempt and the design-thesis gap it surfaced; it is **not** the
@@ -437,7 +437,7 @@ At the very top of `docs/specs/2026-05-15-iteration-discipline.md` (before `# It
- [ ] **Step 4: Confirm working tree of the old spec is otherwise clean**
Run: `git diff --stat 1ff7e81 -- docs/specs/2026-05-15-iteration-discipline.md`
Run: `git diff --stat 1ff7e81 -- docs/specs/0031-iteration-discipline.md`
Expected: shows ONLY the spec's committed history relative to `1ff7e81` plus the new header line as a working-tree change — i.e. there is no residual A1 amendment (it was discarded Boss-side pre-plan). If unexpected uncommitted body changes appear, STOP and report.
---
@@ -1,6 +1,6 @@
# loop-recur.1 — Additive AST-Node Foundation — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-17-loop-recur.md`
> **Parent spec:** `docs/specs/0034-loop-recur.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -211,7 +211,7 @@ line 542), before the enum's closing `}` (line 543), add:
/// in this iter); codegen (loop-header + per-binder phi +
/// back-edge) in iter 3 (`lower_term` stubs with
/// `CodegenError::Internal`). No totality claim — an infinite
/// loop is legal. See `docs/specs/2026-05-17-loop-recur.md`.
/// loop is legal. See `docs/specs/0034-loop-recur.md`.
Loop {
binders: Vec<LoopBinder>,
body: Box<Term>,
@@ -501,7 +501,7 @@ paragraph (ends line 326), add:
both enforced at typecheck (`recur-arity-mismatch`,
`recur-not-in-tail-position`). `loop`/`recur` make no termination
claim: a `loop` with no non-`recur` exit runs forever. See
`docs/specs/2026-05-17-loop-recur.md`.
`docs/specs/0034-loop-recur.md`.
```
- [ ] **Step 7: Run the parser test + surface build**
@@ -1471,7 +1471,7 @@ is 2422), before the closing ```` ``` ```` fence (line 2423), add:
// non-`recur` branch. Strictly additive (no `skip_serializing_if`;
// pre-existing fixtures hash bit-identically — none carry the tag).
// No totality claim — an infinite loop is legal. See
// `docs/specs/2026-05-17-loop-recur.md`.
// `docs/specs/0034-loop-recur.md`.
{ "t": "loop",
"binders": [ { "name": "<id>", "type": Type, "init": Term }, ... ],
"body": Term }
@@ -1689,12 +1689,12 @@ Boss-call-1: `verify_tail_positions`' tail-app role is unchanged).
## Cross-references
- Parent spec: `docs/specs/2026-05-17-loop-recur.md`
- Parent spec: `docs/specs/0034-loop-recur.md`
(Components 1/2/3/6 = this iter; Component 4 = iter 2;
Component 5 = iter 3).
- mut.1 precedent for the additive-node-across-no-wildcard-workspace
pattern + the `Internal`-stub-at-the-two-dispatch-points shape:
`docs/specs/2026-05-15-mut-local.md` §"Iteration mut.1".
`docs/specs/0029-mut-local.md` §"Iteration mut.1".
- Boss-call-1 (`verify_tail_positions` byte-unchanged reading) and
Boss-call-2 (codegen in iter-1 as stubs) are recorded in the
plan header above and must be mirrored into the per-iter journal
@@ -1,6 +1,6 @@
# loop-recur.2 — Typecheck Semantics (Component 4) — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-17-loop-recur.md`
> **Parent spec:** `docs/specs/0034-loop-recur.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1016,13 +1016,13 @@ spec's frozen-tail-app-role acceptance criterion).
## Cross-references
- Parent spec `docs/specs/2026-05-17-loop-recur.md`
- Parent spec `docs/specs/0034-loop-recur.md`
(Component 4 = this iter; Component 5 codegen + the positive
RUN-to-a-value / deep-`n` E2E = iter 3).
- iter-1 (`a179ec3`) shipped the additive nodes + the `synth` /
`lower_term` `Internal` stubs this iter's `synth` arm replaces
(codegen stub stays).
- mut.2 (`docs/specs/2026-05-15-mut-local.md`) is the structural
- mut.2 (`docs/specs/0029-mut-local.md`) is the structural
precedent: `mut_scope_stack` threading discipline, the
variant/`code()`/`ctx()`/bracket-free-Display pattern, the
`.ail.json` negative-fixture + `carve_out_inventory` +
@@ -1,6 +1,6 @@
# loop-recur.3 — Codegen (Component 5) + run-to-value E2E — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-17-loop-recur.md`
> **Parent spec:** `docs/specs/0034-loop-recur.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -600,13 +600,13 @@ now covering runnable loop/recur programs).
## Cross-references
- Parent spec `docs/specs/2026-05-17-loop-recur.md` (Component 5 +
- Parent spec `docs/specs/0034-loop-recur.md` (Component 5 +
Positive E2E = this iter; this is the milestone's TERMINAL
iteration — after it ships the milestone CLOSES and the Boss
runs `audit`, then `fieldtest` since loop/recur is user-visible
Form-A surface; that pipeline is the Boss's post-iter call, NOT
part of this plan).
- mut.3 (`docs/specs/2026-05-15-mut-local.md`) is the codegen
- mut.3 (`docs/specs/0029-mut-local.md`) is the codegen
precedent: `pending_entry_allocas` entry-block hoist,
`mut_var_allocas` save/restore, the lambda-boundary
save/reset/restore triple. loop-recur.3 reuses the *mechanism*;
@@ -1,6 +1,6 @@
# prose-loop-binders.1 — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-18-prose-loop-binders.md`
> **Parent spec:** `docs/specs/0036-prose-loop-binders.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -257,7 +257,7 @@ nothing else:
```
(Order may differ. The plan file
`docs/plans/prose-loop-binders.1.md` is already committed by the
`docs/plans/0079-prose-loop-binders.1.md` is already committed by the
Boss before this run, so it does NOT appear here — its absence is
expected, not an anomaly. `docs/journals/` + stats files added by
the implement skill are also expected and fine.) Crucially: NO other
@@ -1,6 +1,6 @@
# Remove `mut` / `var` / `assign` — Implementation Plan (iteration 1, terminal)
> **Parent spec:** `docs/specs/2026-05-18-remove-mut-var-assign.md`
> **Parent spec:** `docs/specs/0037-remove-mut-var-assign.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# docs-honesty-lint.1 — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-18-docs-honesty-lint.md`
> **Parent spec:** `docs/specs/0039-docs-honesty-lint.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -787,7 +787,7 @@ Append immediately after that entry's last line:
Relocated here from DESIGN.md §"prose roundtrip" + PROSE_ROUNDTRIP.md
by the docs-honesty-lint milestone (forward intent does not live in
the canonical docs).
- context: `docs/specs/2026-05-18-docs-honesty-lint.md`
- context: `docs/specs/0039-docs-honesty-lint.md`
```
- [ ] **Step 3: Re-run the full pin — all four tests GREEN**
@@ -1,6 +1,6 @@
# Embedding ABI — M1.1 — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-18-embedding-abi-m1.md`
> **Parent spec:** `docs/specs/0040-embedding-abi-m1.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# form_a.md scalar-parameter mode carve-out — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-18-fieldtest-embedding-abi-m1.md`
> **Parent spec:** `docs/specs/0041-fieldtest-embedding-abi-m1.md`
> (findings **[friction]** "The published authoring rule steers an LLM
> away from the only spelling that works for scalar export params" +
> **[spec_gap]#1** "form_a.md mandates a mode on every fn param;
@@ -1,6 +1,6 @@
# emit-ir --emit=staticlib — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-18-fieldtest-embedding-abi-m1.md`
> **Parent spec:** `docs/specs/0041-fieldtest-embedding-abi-m1.md`
> (finding **[spec_gap]#2** "No public path emits the staticlib IR,
> though DESIGN.md Decision 5 makes IR readability a first-class LLM
> affordance"). Orchestrator resolution recorded in `docs/roadmap.md`
@@ -1,6 +1,6 @@
# Embedding ABI — M2.1: per-thread runtime context + concurrency safety — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-18-embedding-abi-m2.md`
> **Parent spec:** `docs/specs/0042-embedding-abi-m2.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# Embedding ABI — M3.1 — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-18-embedding-abi-m3.md`
> **Parent spec:** `docs/specs/0043-embedding-abi-m3.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# Embedding ABI — M3.tidy — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-18-embedding-abi-m3.md`
> **Parent spec:** `docs/specs/0043-embedding-abi-m3.md`
> (the milestone whose §"Embedding ABI" surface this reconciles);
> scoping source-of-truth: `docs/journals/2026-05-18-audit-embedding-abi-m3.md`.
>
@@ -1,6 +1,6 @@
# embedding-abi-m5.1 — lean `ail-embed` core + build.rs + hermetic smoke — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-19-embedding-abi-m5.md`
> **Parent spec:** `docs/specs/0044-embedding-abi-m5.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -188,7 +188,7 @@ members = [
]
# `ail-embed/` is intentionally NOT a member: it depends on the
# external `../libs/data-server` and is the sole data-server↔AILang
# meeting point (Invariant 1, docs/specs/2026-05-19-embedding-abi-m5.md).
# meeting point (Invariant 1, docs/specs/0044-embedding-abi-m5.md).
# Adding it here would couple the compiler workspace to a sibling dir.
```
@@ -1,6 +1,6 @@
# embedding-abi-m5.2 — data-server adapter + symbol-fan swarm + leak-proof — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-19-embedding-abi-m5.md`
> **Parent spec:** `docs/specs/0044-embedding-abi-m5.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# embedding-abi-m5.3 — time-shard boundary-invisibility proof + friction harvest — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-19-embedding-abi-m5.md`
> **Parent spec:** `docs/specs/0044-embedding-abi-m5.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -1,6 +1,6 @@
# DESIGN.md → `design/` role-split — Implementation Plan (iter 1, the whole milestone)
> **Parent spec:** `docs/specs/2026-05-19-design-md-rolesplit.md`
> **Parent spec:** `docs/specs/0045-design-md-rolesplit.md`
> (incl. the authoritative **Appendix — Boss-adjudicated relocation
> map**; grounding-check PASS ×2).
>
@@ -15,7 +15,7 @@ build-atomic shape.
**Architecture:** The spec Appendix table is the per-`##`/`###`
relocation map (line ranges → destination); this plan executes it.
Build-atomicity is achieved *by task ordering*: `design/contracts/data-model.md`
Build-atomicity is achieved *by task ordering*: `design/contracts/0002-data-model.md`
is created (Task 2) and `design_schema_drift.rs`'s `include_str!`
retargeted to it (Task 5) **before** `docs/DESIGN.md` is deleted
(Task 9), so the workspace compiles at every task boundary. The
@@ -49,7 +49,7 @@ no content edits except (a) heading level, (b) `honesty-rule.md` is
//! docs_honesty_pin.rs. Fails RED the instant the design/ split
//! re-conflates contract + rationale + narrative, an INDEX row
//! dangles, a contract loses its ratifying test, or docs/DESIGN.md
//! is resurrected. Spec: docs/specs/2026-05-19-design-md-rolesplit.md.
//! is resurrected. Spec: docs/specs/0045-design-md-rolesplit.md.
use std::fs;
use std::path::{Path, PathBuf};
@@ -275,7 +275,7 @@ this file). Files and their Appendix-sourced ranges:
Each file starts `# <Title>` and ends with a line
`Ratified by: <the INDEX ratifying-test path for this contract>.`
- [ ] **Step 4: Write the rewritten `design/contracts/honesty-rule.md`**
- [ ] **Step 4: Write the rewritten `design/contracts/0007-honesty-rule.md`**
Do NOT raw-move DESIGN.md:5682. Rewrite so the rule names the new
home. The two `docs_honesty_pin.rs:70,72` anchors MUST appear as
@@ -421,7 +421,7 @@ Line 22, exact before → after:
```rust
- const DESIGN_MD: &str = include_str!("../../../docs/DESIGN.md");
+ const DATA_MODEL: &str = include_str!("../../../design/contracts/data-model.md");
+ const DATA_MODEL: &str = include_str!("../../../design/contracts/0002-data-model.md");
```
Delete `fn data_model_section()` (lines 2837) and
@@ -430,7 +430,7 @@ anchor tests (`design_md_anchors_every_term_variant` :43,
`…pattern…` :185, `…type…` :214, `…literal…` :248, `…def_kind`
:277, `…parammode…` :348, `…nested_struct_keys` :373) replace every
`data_model_section()` call with the const `DATA_MODEL`. Update the
module rustdoc (:1,3,11) "DESIGN.md §Data model" → "design/contracts/data-model.md".
module rustdoc (:1,3,11) "DESIGN.md §Data model" → "design/contracts/0002-data-model.md".
- [ ] **Step 2: Retarget `docs_honesty_pin.rs` per-sentence home**
@@ -440,19 +440,19 @@ file where that test's pinned strings now live (per spec Appendix):
- `design_md_has_no_wunschdenken` (:30) and
`design_md_has_no_doc_archaeology` (:51): absent-pins span
Boehm/float/typeclasses/effects/Form-B — read the concatenation
of `design/models/rc-uniqueness.md`, `design/contracts/float-semantics.md`,
`design/contracts/typeclasses.md`, `design/models/effects.md`,
`design/models/authoring-surface.md` (absent-pins must be absent
of `design/models/0004-rc-uniqueness.md`, `design/contracts/0005-float-semantics.md`,
`design/contracts/0013-typeclasses.md`, `design/models/0002-effects.md`,
`design/models/0001-authoring-surface.md` (absent-pins must be absent
from all → join the reads).
- `design_md_present_tense_anchors_present` (:68): split per anchor
to its home file; **:70** `"the honesty rule it holds itself to"`
and **:72** `"whether the document asserts something exists,
works, or changed that does not"` → read `design/contracts/honesty-rule.md`;
the Form-B placeholder anchor (:90 area) → `design/models/authoring-surface.md`;
works, or changed that does not"` → read `design/contracts/0007-honesty-rule.md`;
the Form-B placeholder anchor (:90 area) → `design/models/0001-authoring-surface.md`;
the remaining present-anchors → their Appendix home file.
- `form_a_scalar_param_carveout_present_and_old_rule_absent`
(:104137): the `FORM_A_SPEC` read is unchanged; the
`read("docs/DESIGN.md")` at :112 → `design/contracts/embedding-abi.md`
`read("docs/DESIGN.md")` at :112 → `design/contracts/0003-embedding-abi.md`
(the `:135` pin `Export parameters are written **bare**…` lives
in `## Embedding ABI`, Appendix → embedding-abi.md).
- `prose_roundtrip_md_has_no_wunschdenken` (:94101): reads
@@ -464,13 +464,13 @@ file where that test's pinned strings now live (per spec Appendix):
```rust
- let d = read("docs/DESIGN.md");
+ let d = norm(&[read("design/models/effects.md"),
+ read("design/contracts/scope-boundaries.md")].join("\n"));
+ let d = norm(&[read("design/models/0002-effects.md"),
+ read("design/contracts/0010-scope-boundaries.md")].join("\n"));
```
(Decision 3 effect prose → `models/effects.md`; the
(Decision 3 effect prose → `models/0002-effects.md`; the
`"the built-in IO and Diverge ops"` absent-pin's home
`## What is not (yet) supported``contracts/scope-boundaries.md`.
`## What is not (yet) supported``contracts/0010-scope-boundaries.md`.
Adjust the existing `norm()` usage in the test so the join is
normalised once; keep every pinned string assertion unchanged.)
@@ -480,7 +480,7 @@ Run: `cargo test -p ailang-core --test design_schema_drift --test docs_honesty_p
Expected: PASS for all three (they now read `design/` files which
exist from Tasks 23; `docs/DESIGN.md` still on disk but no longer
read by these tests). `cargo build --workspace` still green
(`include_str!` now points at the existing `design/contracts/data-model.md`).
(`include_str!` now points at the existing `design/contracts/0002-data-model.md`).
---
@@ -497,13 +497,13 @@ read by these tests). `cargo build --workspace` still green
```rust
- orderability per IEEE-754); see DESIGN.md §\"Float semantics\".",
+ orderability per IEEE-754); see design/contracts/float-semantics.md.",
+ orderability per IEEE-754); see design/contracts/0005-float-semantics.md.",
```
- [ ] **Step 2: Retarget the Show-branch diagnostic (contiguity-safe)**
`crates/ailang-check/src/lib.rs` Show branch. The path
`design/contracts/typeclasses.md` MUST contain no interior literal
`design/contracts/0013-typeclasses.md` MUST contain no interior literal
whitespace and must not be split by a `\`-continuation in a way
that injects a space (Rust `\`-continuation strips the newline +
leading indent, so keep the full path token on one physical source
@@ -512,11 +512,11 @@ line). Exact:
```rust
- the prelude; see DESIGN.md §\"Prelude (built-in) \
- classes\". User types declare their own \
+ the prelude; see design/contracts/typeclasses.md. \
+ the prelude; see design/contracts/0013-typeclasses.md. \
+ User types declare their own \
```
(Runtime string becomes `…the prelude; see design/contracts/typeclasses.md. User types declare their own …` — the path is one contiguous run; the E2E `contains("design/contracts/typeclasses.md")` holds.)
(Runtime string becomes `…the prelude; see design/contracts/0013-typeclasses.md. User types declare their own …` — the path is one contiguous run; the E2E `contains("design/contracts/0013-typeclasses.md")` holds.)
- [ ] **Step 3: Retarget the two E2E assertions (lockstep)**
@@ -525,7 +525,7 @@ line). Exact:
```rust
- no_inst.message.contains("Float semantics") || no_inst.message.contains("DESIGN"),
- "expected NoInstance message to cross-reference DESIGN.md §Float semantics, got: {:?}",
+ no_inst.message.contains("design/contracts/float-semantics.md"),
+ no_inst.message.contains("design/contracts/0005-float-semantics.md"),
+ "expected NoInstance message to cross-reference the float-semantics contract, got: {:?}",
```
@@ -534,8 +534,8 @@ line). Exact:
```rust
- no_inst.message.contains("Prelude (built-in) classes"),
- "expected DESIGN.md §Prelude (built-in) classes cross-reference, got message: {:?}",
+ no_inst.message.contains("design/contracts/typeclasses.md"),
+ "expected design/contracts/typeclasses.md cross-reference, got message: {:?}",
+ no_inst.message.contains("design/contracts/0013-typeclasses.md"),
+ "expected design/contracts/0013-typeclasses.md cross-reference, got message: {:?}",
```
Also update the module-rustdoc / comment lines in both E2E files
@@ -632,7 +632,7 @@ exit-2 / Sweep-5 references): replace "DESIGN.md" with
Per spec §4: `grounding-check` (`:34`) and architect read
`design/contracts/`; `fieldtester` (`:41`, no-edit limit `:255`
preserved) reads `design/INDEX.md` + `design/models/`; `bencher`
(`:38`) reads `design/models/rc-uniqueness.md` (Decision-9/Boehm
(`:38`) reads `design/models/0004-rc-uniqueness.md` (Decision-9/Boehm
narrative); `debugger` (`:29`), `tester` (`:26`), `implementer`
(`:30`), `implement-orchestrator` (`:35`), `spec-reviewer` (`:34`),
`quality-reviewer` (`:32`), `plan-recon` (`:34,72,147`),
@@ -647,7 +647,7 @@ Replace every live `docs/DESIGN.md` reference in
`skills/README.md` with `design/INDEX.md` (or the specific
`design/contracts/<x>.md` where the prose names a section, e.g.
`boss/SKILL.md:284` "Canonical feature-acceptance criterion" →
`design/contracts/feature-acceptance.md`). `CLAUDE.md`: `:45`
`design/contracts/0004-feature-acceptance.md`). `CLAUDE.md`: `:45`
code-layout table row, the `## Roles of docs/DESIGN.md …` heading
and its paragraph (:199212) → rewrite to describe the `design/`
ledger (DESIGN = current-state mirror discipline preserved, just
@@ -657,29 +657,29 @@ re-homed); `:78,178` inline refs → `design/INDEX.md`.
Replace `DESIGN.md §"X"` → the Appendix destination
(`design/contracts/<x>.md` or `design/models/<x>.md`) in: `ail-embed/src/lib.rs:4,35,91`
(drop the DESIGN.md line-number cites — `→ design/contracts/frozen-value-layout.md`);
(drop the DESIGN.md line-number cites — `→ design/contracts/0006-frozen-value-layout.md`);
`crates/ailang-check/src/lib.rs:449,861,882,2647,6336`;
`crates/ailang-check/tests/duplicate_ctor_pin.rs:4` (→ env-construction
source-link note); `crates/ailang-codegen/src/drop.rs:88,114`,
`lib.rs:178,685`, `match_lower.rs:107`;
`crates/ailang-codegen/tests/embed_record_layout_pin.rs:1`,
`embed_staticlib_lowering.rs:47`; `crates/ailang-core/src/ast.rs:3`
(→ `design/contracts/data-model.md`), `:211`;
(→ `design/contracts/0002-data-model.md`), `:211`;
`crates/ailang-surface/src/lib.rs:7`, `parse.rs:78,81`,
`print.rs:128`; `crates/ailang-surface/tests/round_trip.rs:10,72`
(→ `design/contracts/roundtrip-invariant.md`);
(→ `design/contracts/0009-roundtrip-invariant.md`);
`crates/ail/src/main.rs:1393` (→ qualified-xref source-link),
`:1572`; `crates/ail/tests/codegen_import_map_fallback_pin.rs:2`,
`polyfn_dot_qualified_branch_pin.rs:2` (→
`design/contracts/typeclasses.md`), `e2e.rs:2843` (→
`design/contracts/str-abi.md`), `eq_ord_e2e.rs:89,110` (→ mangling
`design/contracts/0013-typeclasses.md`), `e2e.rs:2843` (→
`design/contracts/0011-str-abi.md`), `eq_ord_e2e.rs:89,110` (→ mangling
source-link), `embed/record_roundtrip.c:2`, `embed/tick_roundtrip.c:6`
(→ `design/contracts/frozen-value-layout.md`);
(→ `design/contracts/0006-frozen-value-layout.md`);
`examples/fieldtest/floats_3_safe_division.ail:19`,
`floats_4_float_to_str_reach.ail:6` (→
`design/contracts/float-semantics.md`); `runtime/rc.c:41` (→
`design/contracts/frozen-value-layout.md`), `runtime/str.c:172,198`
(→ `design/contracts/str-abi.md`);
`design/contracts/0005-float-semantics.md`); `runtime/rc.c:41` (→
`design/contracts/0006-frozen-value-layout.md`), `runtime/str.c:172,198`
(→ `design/contracts/0011-str-abi.md`);
`crates/ailang-core/specs/form_a.md:89`.
**OQ7 — delete, not retarget:** `crates/ailang-codegen/src/lib.rs:103`
@@ -714,7 +714,7 @@ Run: `cargo build --workspace 2>&1 | tail -3`
Expected: `Finished …` with **0 errors**. This proves
build-atomicity: the only compile-time consumer
(`design_schema_drift.rs` `include_str!`) was retargeted in Task 5
to the now-existing `design/contracts/data-model.md`, so deleting
to the now-existing `design/contracts/0002-data-model.md`, so deleting
`docs/DESIGN.md` does not break the build.
- [ ] **Step 3: Whole-suite GREEN incl. the design_index_pin spine**
@@ -767,13 +767,13 @@ Expected: `exit=0` (all five sweeps clean against the migrated
deletion in the working tree; the Boss commits the iter). ✓
6. **Pin/replacement contiguity:** Task 2 Step 4 keeps the two
`docs_honesty_pin.rs:70,72` phrases each on one physical line;
Task 6 Step 2 keeps `design/contracts/typeclasses.md` a
Task 6 Step 2 keeps `design/contracts/0013-typeclasses.md` a
whitespace-free contiguous token across the `\`-continuation
(the recurring grep/line-wrap family — scrubbed). ✓
7. **Compile-gate vs deferred-caller:** the only compile-time
coupling is `design_schema_drift.rs` `include_str!`
`docs/DESIGN.md` deletion. Task 5 retargets the `include_str!`
to the already-created `design/contracts/data-model.md` (Task 2)
to the already-created `design/contracts/0002-data-model.md` (Task 2)
**before** Task 9 deletes the file. No task's build/test gate
depends on a step a later task performs: Tasks 18 keep
`docs/DESIGN.md` on disk, so every intermediate `cargo build` is
@@ -1,6 +1,6 @@
# design-md-rolesplit.tidy — Implementation Plan (audit drift fix)
> **Parent spec:** `docs/specs/2026-05-19-design-md-rolesplit.md`
> **Parent spec:** `docs/specs/0045-design-md-rolesplit.md`
> **Scope authority:** `docs/journals/2026-05-19-audit-design-md-rolesplit.md`
> "Resolution" (committed 2ba5e16) — the architect `[medium]`+`[low]`
> drift fix, 5 orchestrator-decided points.
@@ -201,10 +201,10 @@ Expected: those 3 still `ok` (only clause-3 RED). `cargo build -p ailang-core --
---
## Task 2: strip history prose from `design/contracts/typeclasses.md`
## Task 2: strip history prose from `design/contracts/0013-typeclasses.md`
**Files:**
- Modify: `design/contracts/typeclasses.md` (:77-78, :182-186, :197-200, :279-289, :291-300, :302-317 — recon's complete scan)
- Modify: `design/contracts/0013-typeclasses.md` (:77-78, :182-186, :197-200, :279-289, :291-300, :302-317 — recon's complete scan)
- Modify: `docs/journals/2026-05-19-design-decision-records.md` (append at EOF, after :431)
- [ ] **Step 1: Append the migrated typeclasses history to the decision-record journal**
@@ -252,15 +252,15 @@ history clause:
Run: `cargo test -p ailang-core --test docs_honesty_pin 2>&1 | grep -E 'test result:'`
Expected: PASS (the `io/print_str…` pinned run intact). Run
`grep -n 'io/print_str` is the only built-in direct-output effect-op' design/contracts/typeclasses.md`
`grep -n 'io/print_str` is the only built-in direct-output effect-op' design/contracts/0013-typeclasses.md`
Expected: exactly one contiguous match (pin survived).
---
## Task 3: strip history prose from `design/contracts/str-abi.md`
## Task 3: strip history prose from `design/contracts/0011-str-abi.md`
**Files:**
- Modify: `design/contracts/str-abi.md` (:14, :16, :18, :20, :22-23, :74, :38-43, :45-47)
- Modify: `design/contracts/0011-str-abi.md` (:14, :16, :18, :20, :22-23, :74, :38-43, :45-47)
- Modify: `docs/journals/2026-05-19-design-decision-records.md` (append under the tidy section)
- [ ] **Step 1: Append str-abi history to the journal**
@@ -294,16 +294,16 @@ overloading would invoke literal-defaulting which axis-7 excluded.
- [ ] **Step 3: Verify str-abi pin intact**
Run: `grep -n 'type-installed; codegen is reserved and not yet shipped' design/contracts/str-abi.md`
Run: `grep -n 'type-installed; codegen is reserved and not yet shipped' design/contracts/0011-str-abi.md`
Expected: exactly one contiguous match. Run
`cargo test -p ailang-core --test docs_honesty_pin 2>&1 | grep 'test result:'` → PASS.
---
## Task 4: strip history prose from `design/contracts/scope-boundaries.md`
## Task 4: strip history prose from `design/contracts/0010-scope-boundaries.md`
**Files:**
- Modify: `design/contracts/scope-boundaries.md` (:5-6, :14-17, :36-38)
- Modify: `design/contracts/0010-scope-boundaries.md` (:5-6, :14-17, :36-38)
- Modify: `docs/journals/2026-05-19-design-decision-records.md` (append under the tidy section)
- [ ] **Step 1: Append scope-boundaries history to the journal**
@@ -326,30 +326,30 @@ rpe.1 (the polymorphic `print` is the canonical non-Str output path).
- [ ] **Step 3: Over-strip guard — the Diverge pin must be untouched**
Run: `grep -n 'Diverge` is a reserved effect name with no op and no codegen' design/contracts/scope-boundaries.md`
Run: `grep -n 'Diverge` is a reserved effect name with no op and no codegen' design/contracts/0010-scope-boundaries.md`
Expected: exactly one match at the original location (`:9`,
unedited — it is NOT in any edit span; this guards against
collateral deletion). `cargo test -p ailang-core --test effect_doc_honesty_pin 2>&1 | grep 'test result:'` → PASS.
---
## Task 5: fix the stale cross-ref in `design/contracts/float-semantics.md`
## Task 5: fix the stale cross-ref in `design/contracts/0005-float-semantics.md`
**Files:**
- Modify: `design/contracts/float-semantics.md:100`
- Modify: `design/contracts/0005-float-semantics.md:100`
- [ ] **Step 1: Repoint the stale "below" direction**
`:99-100` verbatim `Both allocate a fresh heap-Str slab at the call
site (see "Str ABI" below for the dual realisation) and carry
`ret_mode: Own``. Replace `(see "Str ABI" below for the dual
realisation)` → `(see design/contracts/str-abi.md for the dual
realisation)`. (`design/contracts/str-abi.md` exists — confirmed
realisation)` → `(see design/contracts/0011-str-abi.md for the dual
realisation)`. (`design/contracts/0011-str-abi.md` exists — confirmed
recon; INDEX row `design/INDEX.md:93`.)
- [ ] **Step 2: Verify float-semantics pin intact + no stale "below"**
Run: `grep -n '"Str ABI" below' design/contracts/float-semantics.md || echo "CLEAN: stale below gone"`
Run: `grep -n '"Str ABI" below' design/contracts/0005-float-semantics.md || echo "CLEAN: stale below gone"`
Expected: `CLEAN: stale below gone`. Run
`cargo test -p ail --test eq_float_noinstance 2>&1 | grep 'test result:'` → PASS.
@@ -367,8 +367,8 @@ Expected: `CLEAN: stale below gone`. Run
> milestone exists to remove. Strip + journal-note for completeness.
**Files:**
- Modify: `design/contracts/roundtrip-invariant.md:73`
- Modify: `design/contracts/data-model.md:149,161`
- Modify: `design/contracts/0009-roundtrip-invariant.md:73`
- Modify: `design/contracts/0002-data-model.md:149,161`
- Modify: `docs/journals/2026-05-19-design-decision-records.md` (append under the tidy section)
- [ ] **Step 1: Append the provenance to the journal**
@@ -493,7 +493,7 @@ Expected: `CLEAN` (no live-ref regression from the tidy edits).
points covered, scope corrected on evidence. ✓
2. **Placeholder scan:** no TBD/TODO/"similar to". Every strip names
the exact recon line + verbatim before→after text. ✓
3. **Type/path consistency:** `design/contracts/str-abi.md`,
3. **Type/path consistency:** `design/contracts/0011-str-abi.md`,
`docs/journals/2026-05-19-design-decision-records.md`,
`contracts_carry_no_decision_record_prose` used identically
across tasks; the journal append section header
@@ -1,6 +1,6 @@
# design-ledger-formal-links.1 — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-19-design-ledger-formal-links.md` (HEAD `42ff44a`; grounding-check PASS ×3 across two corpus-grounded amendments — clause-6 + cross-ref definition, then clause-5 fence-skip + closed convert-set enumeration)
> **Parent spec:** `docs/specs/0046-design-ledger-formal-links.md` (HEAD `42ff44a`; grounding-check PASS ×3 across two corpus-grounded amendments — clause-6 + cross-ref definition, then clause-5 fence-skip + closed convert-set enumeration)
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement` to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -16,16 +16,16 @@
- Modify: `crates/ailang-core/tests/design_index_pin.rs:1-5` — extend `//!` header to name clause-5.
- Modify: `crates/ailang-core/tests/design_index_pin.rs:253-` — append clause-5 `design_body_links_are_durable_and_resolve` (with `strip_fences`, `targets`, `is_durable`, RED-first synthetic vectors, tree walk).
- Modify: `design/contracts/float-semantics.md:69` — convert §"Prelude (built-in) classes" → `[Prelude (built-in) classes](typeclasses.md)`.
- Modify: `design/contracts/float-semantics.md:100` — convert bare-path `design/contracts/str-abi.md``[Str ABI](str-abi.md)`.
- Modify: `design/contracts/embedding-abi.md:45` — convert "Frozen value layout" below → `[Frozen value layout](frozen-value-layout.md)`; drop stale "below".
- Modify: `design/contracts/memory-model.md:44` — convert §"Data model" → `[Data model](data-model.md)`.
- Modify: `design/contracts/memory-model.md:105-106` — convert §"Method dispatch" below → `[Method dispatch](typeclasses.md)`; drop stale "below" (target is in typeclasses.md, not in this file).
- Modify: `design/contracts/scope-boundaries.md:48-49` — convert "Str ABI" → `[Str ABI](str-abi.md)`.
- Modify: `design/contracts/scope-boundaries.md:88` — convert mixed-referent: `ailang-core::desugar` → source link, "Pipeline" → `../models/pipeline.md`; drop stale "above".
- Modify: `design/models/pipeline.md:60-61` — disposition-(b): drop the `(see docs/PROSE_ROUNDTRIP.md)` continuation line; preserve CLI prose.
- Modify: `design/models/authoring-surface.md:180-181` — disposition-(b): drop the `see docs/PROSE_ROUNDTRIP.md for the six-step cycle and` clause; preserve the surrounding `ail merge-prose` sentence.
- Modify: `design/contracts/honesty-rule.md:14` — append pin-safe positive-half paragraph after line 14, before blank line 15.
- Modify: `design/contracts/0005-float-semantics.md:69` — convert §"Prelude (built-in) classes" → `[Prelude (built-in) classes](typeclasses.md)`.
- Modify: `design/contracts/0005-float-semantics.md:100` — convert bare-path `design/contracts/0011-str-abi.md``[Str ABI](str-abi.md)`.
- Modify: `design/contracts/0003-embedding-abi.md:45` — convert "Frozen value layout" below → `[Frozen value layout](frozen-value-layout.md)`; drop stale "below".
- Modify: `design/contracts/0008-memory-model.md:44` — convert §"Data model" → `[Data model](data-model.md)`.
- Modify: `design/contracts/0008-memory-model.md:105-106` — convert §"Method dispatch" below → `[Method dispatch](typeclasses.md)`; drop stale "below" (target is in typeclasses.md, not in this file).
- Modify: `design/contracts/0010-scope-boundaries.md:48-49` — convert "Str ABI" → `[Str ABI](str-abi.md)`.
- Modify: `design/contracts/0010-scope-boundaries.md:88` — convert mixed-referent: `ailang-core::desugar` → source link, "Pipeline" → `../models/0003-pipeline.md`; drop stale "above".
- Modify: `design/models/0003-pipeline.md:60-61` — disposition-(b): drop the `(see docs/PROSE_ROUNDTRIP.md)` continuation line; preserve CLI prose.
- Modify: `design/models/0001-authoring-surface.md:180-181` — disposition-(b): drop the `see docs/PROSE_ROUNDTRIP.md for the six-step cycle and` clause; preserve the surrounding `ail merge-prose` sentence.
- Modify: `design/contracts/0007-honesty-rule.md:14` — append pin-safe positive-half paragraph after line 14, before blank line 15.
- Untouched (assert): `design/INDEX.md`; clauses 14 of `design_index_pin.rs`; `docs/journals/2026-05-19-design-decision-records.md`; `data-model.md` lines 38/66/79/206/226 (in-fence schema annotations — out of scope); `embedding-abi.md:48` (`docs_honesty_pin.rs:172`-pinned phrase — sits between the :45 conversion and the :51 stay-prose, must be byte-identical); `embedding-abi.md:51` (no-title-no-(see)-form — out of scope); every intra-file "above/below".
---
@@ -193,7 +193,7 @@ Replace lines 15:
//! docs_honesty_pin.rs. Fails RED the instant the design/ split
//! re-conflates contract + rationale + narrative, an INDEX row
//! dangles, a contract loses its ratifying test, or docs/DESIGN.md
//! is resurrected. Spec: docs/specs/2026-05-19-design-md-rolesplit.md.
//! is resurrected. Spec: docs/specs/0045-design-md-rolesplit.md.
```
with:
@@ -205,8 +205,8 @@ with:
//! dangles, a contract loses its ratifying test, docs/DESIGN.md is
//! resurrected, or a design/ body cross-link fails to resolve into
//! the durable tier (clause-5; spec
//! docs/specs/2026-05-19-design-ledger-formal-links.md). Spec for
//! the split: docs/specs/2026-05-19-design-md-rolesplit.md.
//! docs/specs/0046-design-ledger-formal-links.md). Spec for
//! the split: docs/specs/0045-design-md-rolesplit.md.
```
- [ ] **Step 6: Run the whole suite to confirm nothing else regressed.**
@@ -220,10 +220,10 @@ Expected: **5 passed; 0 failed; 0 ignored**. The four pre-existing clauses (`des
### Task 2: Convert the seven Acceptance-3 prose refs to file-relative Markdown links
**Files:**
- Modify: `design/contracts/float-semantics.md:69, 100`
- Modify: `design/contracts/embedding-abi.md:45`
- Modify: `design/contracts/memory-model.md:44, 105-106`
- Modify: `design/contracts/scope-boundaries.md:48, 88`
- Modify: `design/contracts/0005-float-semantics.md:69, 100`
- Modify: `design/contracts/0003-embedding-abi.md:45`
- Modify: `design/contracts/0008-memory-model.md:44, 105-106`
- Modify: `design/contracts/0010-scope-boundaries.md:48, 88`
Verbatim before→after for each. Iter-provenance suffixes do not appear on any of these seven (they were all on the in-fence data-model refs, which are out of scope). Each edit is a single-line or two-adjacent-line text replacement; no surrounding line is perturbed.
@@ -243,12 +243,12 @@ internally — see [Prelude (built-in) classes](typeclasses.md) for the Show shi
(`float-semantics.md` and `typeclasses.md` are siblings in `design/contracts/` ⇒ file-relative target is `typeclasses.md`. The label retains the original section title verbatim; Markdown handles balanced parens in labels.)
- [ ] **Step 2: `float-semantics.md:100` — bare path `design/contracts/str-abi.md``[Str ABI](str-abi.md)`.**
- [ ] **Step 2: `float-semantics.md:100` — bare path `design/contracts/0011-str-abi.md``[Str ABI](str-abi.md)`.**
Replace verbatim (line 100; line 101 unchanged):
```
a fresh heap-Str slab at the call site (see design/contracts/str-abi.md
a fresh heap-Str slab at the call site (see design/contracts/0011-str-abi.md
```
with:
@@ -330,24 +330,24 @@ Replace verbatim line 88:
with:
```
typecheck/codegen — see [desugar](../../crates/ailang-core/src/desugar.rs) and [Pipeline](../models/pipeline.md).
typecheck/codegen — see [desugar](../../crates/ailang-core/src/desugar.rs) and [Pipeline](../models/0003-pipeline.md).
```
(`scope-boundaries.md` is in `design/contracts/`; `../../` reaches the repo root; `../models/pipeline.md` reaches `design/models/pipeline.md`. Both targets verified existing pre-plan. "above" dropped: stale-direction (Pipeline lives in a different file, not above in this one).)
(`scope-boundaries.md` is in `design/contracts/`; `../../` reaches the repo root; `../models/0003-pipeline.md` reaches `design/models/0003-pipeline.md`. Both targets verified existing pre-plan. "above" dropped: stale-direction (Pipeline lives in a different file, not above in this one).)
- [ ] **Step 8: Run clause-5 to confirm all seven new links resolve into the durable tier — still GREEN.**
Run: `cargo test -p ailang-core --test design_index_pin design_body_links_are_durable_and_resolve`
Expected: **PASS**. Each of the seven introduced `](path)` resolves from its containing file's directory to a real `design/`-or-source file (`typeclasses.md`, `str-abi.md`, `frozen-value-layout.md`, `data-model.md`, `typeclasses.md`, `str-abi.md`, `../../crates/ailang-core/src/desugar.rs` + `../models/pipeline.md`). All targets are in the durable tier (`design/` or `crates/`). No `#fragment`. No in-fence link.
Expected: **PASS**. Each of the seven introduced `](path)` resolves from its containing file's directory to a real `design/`-or-source file (`typeclasses.md`, `str-abi.md`, `frozen-value-layout.md`, `data-model.md`, `typeclasses.md`, `str-abi.md`, `../../crates/ailang-core/src/desugar.rs` + `../models/0003-pipeline.md`). All targets are in the durable tier (`design/` or `crates/`). No `#fragment`. No in-fence link.
---
### Task 3: Disposition-(b) on the two PROSE_ROUNDTRIP homeless refs
**Files:**
- Modify: `design/models/pipeline.md:60-61` (in-fence CLI block; pointer removed regardless — the in-fence carve-out preserves *schema documentation* annotations, not cross-tier pointers).
- Modify: `design/models/authoring-surface.md:178-181`.
- Modify: `design/models/0003-pipeline.md:60-61` (in-fence CLI block; pointer removed regardless — the in-fence carve-out preserves *schema documentation* annotations, not cross-tier pointers).
- Modify: `design/models/0001-authoring-surface.md:178-181`.
- [ ] **Step 1: `pipeline.md:60-61` — drop the `(see docs/PROSE_ROUNDTRIP.md)` continuation line.**
@@ -399,7 +399,7 @@ Expected: **PASS** (Task 3 only *removes* prose; introduces no link).
### Task 4: honesty-rule.md positive-half sentence (pin-safe)
**Files:**
- Modify: `design/contracts/honesty-rule.md:14` — append a new paragraph after line 14, before blank line 15.
- Modify: `design/contracts/0007-honesty-rule.md:14` — append a new paragraph after line 14, before blank line 15.
- [ ] **Step 1: Insert the positive-half paragraph between line 14 and line 15.**
@@ -493,7 +493,7 @@ Expected: **8** (the 7 Task-2 conversions including the source-link, plus the Pi
Run:
```
grep -nE 'see §"Class names"|see §"Type::Con name scoping"|see §"Embedding ABI"' design/contracts/data-model.md
grep -nE 'see §"Class names"|see §"Type::Con name scoping"|see §"Embedding ABI"' design/contracts/0002-data-model.md
```
Expected: **5 lines** (the lines 38, 66, 79, 206, 226) — confirming the in-fence schema annotations were untouched (out of scope per §Scope; clause-5 skips fences regardless).
@@ -515,4 +515,4 @@ Run:
git diff HEAD -- crates/ailang-core/tests/design_index_pin.rs | grep -cE '^-[^-]'
```
Expected: **`1`** — exactly one removed line (the original `//! is resurrected. Spec: docs/specs/2026-05-19-design-md-rolesplit.md.` being replaced by the extended four-line `//!` block). Any value > 1 means content was removed from clauses 14 — STOP and inspect.
Expected: **`1`** — exactly one removed line (the original `//! is resurrected. Spec: docs/specs/0045-design-md-rolesplit.md.` being replaced by the extended four-line `//!` block). Any value > 1 means content was removed from clauses 14 — STOP and inspect.
@@ -1,6 +1,6 @@
# Bench harness recalibration — Implementation Plan (iteration 1, terminal)
> **Parent spec:** `docs/specs/2026-05-20-bench-harness-recalibration.md`
> **Parent spec:** `docs/specs/0047-bench-harness-recalibration.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -65,7 +65,7 @@ are for readability only; the JSON value must NOT contain literal
newlines, escape them as needed or keep it one logical sentence):
```
Baseline for bench/check.py regression detection. The language-invariant thresholds (rc/bump <= 1.3x throughput, p99/median <= 5x latency) are NOT the regression-check tolerances; the per-metric tolerances below are tuned to absorb run-to-run noise on a quiet developer machine. To update after an intentional change, re-run bench/run.sh and replace the values, recording the reason in the commit body that ships the baseline bump. The latency arms gate only on median / p99 / p99_over_median — max_us and p99_9_us were removed on the 2026-05-20 recapture (Gitea #15 / #16) because tail-of-distribution latency metrics are dominated by OS-level jitter (THP defrag, scheduler preemption, IRQ load), not allocator behaviour, and produced 3+ consecutive false-positive REGRESSION rows on byte-identical no-op milestones. See docs/specs/2026-05-20-bench-harness-recalibration.md.
Baseline for bench/check.py regression detection. The language-invariant thresholds (rc/bump <= 1.3x throughput, p99/median <= 5x latency) are NOT the regression-check tolerances; the per-metric tolerances below are tuned to absorb run-to-run noise on a quiet developer machine. To update after an intentional change, re-run bench/run.sh and replace the values, recording the reason in the commit body that ships the baseline bump. The latency arms gate only on median / p99 / p99_over_median — max_us and p99_9_us were removed on the 2026-05-20 recapture (Gitea #15 / #16) because tail-of-distribution latency metrics are dominated by OS-level jitter (THP defrag, scheduler preemption, IRQ load), not allocator behaviour, and produced 3+ consecutive false-positive REGRESSION rows on byte-identical no-op milestones. See docs/specs/0047-bench-harness-recalibration.md.
```
- [ ] **Step 2: Delete the 6 latency entries**
@@ -123,7 +123,7 @@ If `max_us` or `p99_9_us` is in the list, Step 2 was incomplete.
Run:
```bash
jq -r '.note' bench/baseline.json | grep -c 'docs/specs/2026-05-20-bench-harness-recalibration.md'
jq -r '.note' bench/baseline.json | grep -c 'docs/specs/0047-bench-harness-recalibration.md'
```
Expected stdout: `1`. Zero hits means the rewrite from Step 1 was
@@ -176,7 +176,7 @@ Expected stdout:
Also confirm note + entry deletions still hold:
```bash
jq -r '.note' bench/baseline.json | grep -c 'docs/specs/2026-05-20-bench-harness-recalibration.md'
jq -r '.note' bench/baseline.json | grep -c 'docs/specs/0047-bench-harness-recalibration.md'
jq '[.latency | to_entries[] | .value | keys[]] | unique' bench/baseline.json
```
@@ -2,8 +2,8 @@
> **No parent spec.** Gitea issue #12 carries the resolved design
> fork verbatim; two prior fieldtest specs
> (`docs/specs/2026-05-15-fieldtest-mut-local.md` F3,
> `docs/specs/2026-05-18-fieldtest-loop-recur.md` spec_gap) are the
> (`docs/specs/0030-fieldtest-mut-local.md` F3,
> `docs/specs/0035-fieldtest-loop-recur.md` spec_gap) are the
> LLM-natural-shape evidence. User accepted `(app f)` + Ctor-style
> serde convention on 2026-05-20.
>
@@ -21,11 +21,11 @@ serde-attribute edit on `Term::App.args` to mirror `Term::Ctor.args`
(read-tolerant when `args` is absent in canonical JSON).
**Doc-honesty side-fix:** the existing comment on `Term::Ctor` in
`design/contracts/data-model.md:130-131` claims "`args` omitted when
`design/contracts/0002-data-model.md:130-131` claims "`args` omitted when
empty", which is *factually false* for the current code — `Ctor.args`
has `#[serde(default)]` (read-tolerant) but NO `skip_serializing_if`,
so writes always emit `"args":[]`. Fix the comment to describe actual
behaviour. This is `design/contracts/honesty-rule.md` enforcement
behaviour. This is `design/contracts/0007-honesty-rule.md` enforcement
folded into the same iter (the discovery happened while researching
this iter's serde change, and a stale comment in the same jsonc
block we're modifying must not be left behind).
@@ -36,7 +36,7 @@ change). No typechecker, codegen, or runtime changes — every layer
below the parser already handles empty `args` correctly today.
**Tech Stack:** `ailang-surface` (parser), `ailang-core` (AST serde),
`design/contracts/data-model.md` (schema doc), `crates/ail` (E2E
`design/contracts/0002-data-model.md` (schema doc), `crates/ail` (E2E
test).
**Files this plan creates or modifies:**
@@ -54,10 +54,10 @@ test).
`Term::App.args` with `#[serde(default)]`, mirroring
`Term::Ctor.args` at line 472-477. `skip_serializing_if` is NOT
added (mirror Ctor's *actual* attrs, not the doc claim).
- Modify: `design/contracts/data-model.md:112` — add an inline comment
- Modify: `design/contracts/0002-data-model.md:112` — add an inline comment
to the `app` jsonc shape that `args` MAY be empty (e.g. nullary
call `(app f)`).
- Modify: `design/contracts/data-model.md:130-131` — rewrite the
- Modify: `design/contracts/0002-data-model.md:130-131` — rewrite the
misleading "args omitted when empty" comment on the `ctor` jsonc
shape so it describes the actual write/read behaviour: write
always emits `"args":[]`; read tolerates absent `args`.
@@ -113,8 +113,8 @@ string; that confirms the RED hits the targeted symptom.
//! invoked as `(app greet)`.
//!
//! Two independent fieldtest specs flagged the same gap:
//! `docs/specs/2026-05-15-fieldtest-mut-local.md` F3 and
//! `docs/specs/2026-05-18-fieldtest-loop-recur.md` spec_gap. The
//! `docs/specs/0030-fieldtest-mut-local.md` F3 and
//! `docs/specs/0035-fieldtest-loop-recur.md` spec_gap. The
//! Form-A surface refusing nullary calls had no schema backing —
//! `Term::App.args` is `[Term...]` (zero-or-more), so the parser
//! guard was an unbacked rule.
@@ -309,9 +309,9 @@ string; that confirms the RED hits the targeted symptom.
## Task 4: Doc-honesty fix — `data-model.md` `ctor` and `app` comments
**Files:**
- Modify: `design/contracts/data-model.md:110-131`
- Modify: `design/contracts/0002-data-model.md:110-131`
This task is `design/contracts/honesty-rule.md` enforcement — the
This task is `design/contracts/0007-honesty-rule.md` enforcement — the
prose-authoritative contract must describe present-state behaviour,
not aspirational behaviour. The current `Ctor` comment is
aspirational (the omit-when-empty rule is not implemented), and the
@@ -320,7 +320,7 @@ calls are legal.
- [ ] **Step 4.1: Add an empty-args note to the `app` shape**
`design/contracts/data-model.md:110-112` currently reads:
`design/contracts/0002-data-model.md:110-112` currently reads:
```jsonc
// fn application; tail flag triggers musttail under codegen.
@@ -342,7 +342,7 @@ calls are legal.
- [ ] **Step 4.2: Rewrite the misleading `ctor` comment**
`design/contracts/data-model.md:130-131` currently reads:
`design/contracts/0002-data-model.md:130-131` currently reads:
```jsonc
// Ctor application; `args` omitted when empty.
@@ -1,6 +1,6 @@
# Boehm Retirement (iter .1) — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-20-boehm-retirement.md`
> **Parent spec:** `docs/specs/0048-boehm-retirement.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -52,11 +52,11 @@ shell + Python in `bench/`; C runtime in `runtime/`; Markdown in
- `bench/run.sh:3-11,65,149-167,170-205` — drop gc-arm + columns + latency-bench gc-fixture
- `bench/check.py:75-97` — drop gc-keyed throughput fields + drop `"implicit @ gc"` arm mapping
- `bench/baseline.json` — drop gc-keyed entries (via `bench/check.py --update-baseline` after a clean `bench/run.sh`)
- `design/models/rc-uniqueness.md:3-32,71-79,132-156,170-183` — excise + reframe
- `design/models/pipeline.md:14-28` — pipeline diagram + prose
- `design/contracts/scope-boundaries.md:67,114-127` — rewrite Boehm block + `@GC_malloc` reference
- `design/contracts/memory-model.md:232` — drop `"pre-Boehm era"`
- `design/contracts/embedding-abi.md:42-44` — drop gc clause from staticlib-guard prose
- `design/models/0004-rc-uniqueness.md:3-32,71-79,132-156,170-183` — excise + reframe
- `design/models/0003-pipeline.md:14-28` — pipeline diagram + prose
- `design/contracts/0010-scope-boundaries.md:67,114-127` — rewrite Boehm block + `@GC_malloc` reference
- `design/contracts/0008-memory-model.md:232` — drop `"pre-Boehm era"`
- `design/contracts/0003-embedding-abi.md:42-44` — drop gc clause from staticlib-guard prose
- `skills/audit/agents/ailang-bencher.md` — multi-site Boehm rewrite (recon enumerated ≈18 sites)
- `skills/implement/agents/ailang-implementer.md:95,185` — drop Decision-10/Boehm references
- `examples/gc_stress.ail`**DELETE entire file** (47 lines)
@@ -685,22 +685,22 @@ Expected: `exit: 0`. The just-regenerated baseline matches a fresh run (the same
## Task 6: Design ledger updates
**Goal:** Bring the design ledger into post-retirement present-tense honesty. After this task: `design/models/rc-uniqueness.md` and `design/models/pipeline.md` describe RC + bump as the only allocators; `design/contracts/scope-boundaries.md` and `design/contracts/memory-model.md` carry no Boehm prose; `design/contracts/embedding-abi.md:42-44` reframes the staticlib-guard justification around bump.
**Goal:** Bring the design ledger into post-retirement present-tense honesty. After this task: `design/models/0004-rc-uniqueness.md` and `design/models/0003-pipeline.md` describe RC + bump as the only allocators; `design/contracts/0010-scope-boundaries.md` and `design/contracts/0008-memory-model.md` carry no Boehm prose; `design/contracts/0003-embedding-abi.md:42-44` reframes the staticlib-guard justification around bump.
**Files:**
- Modify: `design/models/rc-uniqueness.md`
- Modify: `design/models/pipeline.md`
- Modify: `design/contracts/scope-boundaries.md`
- Modify: `design/contracts/memory-model.md`
- Modify: `design/contracts/embedding-abi.md`
- Modify: `design/models/0004-rc-uniqueness.md`
- Modify: `design/models/0003-pipeline.md`
- Modify: `design/contracts/0010-scope-boundaries.md`
- Modify: `design/contracts/0008-memory-model.md`
- Modify: `design/contracts/0003-embedding-abi.md`
- [ ] **Step 1: `design/models/rc-uniqueness.md` — excise Boehm sections**
- [ ] **Step 1: `design/models/0004-rc-uniqueness.md` — excise Boehm sections**
Delete `:3-32` (the entire `## Dual allocator — RC canonical, Boehm parity oracle` section, from the heading down to the last sentence "the rest of this section documents the Boehm half, retained as the oracle.").
Delete `:34-69` (the `**Choice: Boehm-Demers-Weiser conservative GC.**` block and its full `Rationale:` + `Trade-offs accepted:` bullet lists, ending with "Users without it get a link-time error from clang, not a silent failure.").
- [ ] **Step 2: `design/models/rc-uniqueness.md` — generalise Per-fn arena section**
- [ ] **Step 2: `design/models/0004-rc-uniqueness.md` — generalise Per-fn arena section**
Edit `:71-79` (the `## Per-fn arena via stack \`alloca\`` section) to generalise the Boehm-specific language:
@@ -711,7 +711,7 @@ Edit `:71-79` (the `## Per-fn arena via stack \`alloca\`` section) to generalise
Edit `:115-127` (the `**Codegen integration.**` block):
- `:124-125`: `\`alloca i8, i64 <size>, align 8\`; on a miss it writes \`call ptr @GC_malloc(i64 <size>)\`.` → `\`alloca i8, i64 <size>, align 8\`; on a miss it writes \`call ptr @ailang_rc_alloc(i64 <size>)\` (or the bump-mode equivalent).`
- [ ] **Step 3: `design/models/rc-uniqueness.md` — memory-model section reframe**
- [ ] **Step 3: `design/models/0004-rc-uniqueness.md` — memory-model section reframe**
Edit `:132-156` (the `## Memory model — RC + Uniqueness …` section). Rewrite the opening paragraph at `:134-144` to drop the Boehm-bench framing:
@@ -735,11 +735,11 @@ to:
> **Choice.** AILang's canonical memory model is reference counting with static uniqueness inference and explicit LLM-author annotations on fn signatures, in the lineage of Lean 4 / Roc / Koka. The RC pipeline tracks the bump-allocator raw-alloc floor: a bench-health regression gate requires RC overhead ≤ 1.3× bump on the linear/tree corpus, with a wider ±15% band on the closure-chain corpus (representational cost of the closure-pair layout). See `bench/run.sh` for the active check.
- [ ] **Step 4: `design/models/rc-uniqueness.md` — closure-chain wider band**
- [ ] **Step 4: `design/models/0004-rc-uniqueness.md` — closure-chain wider band**
Edit `:170-183` to drop Boehm-retirement framing. The phrase `a Boehm-retirement follow-up` at `:173` becomes `a future closure-pair slab/pool optimisation`. The phrase `excluded from the Boehm-retirement gate until a slab/pool answer ships` at `:179-180` becomes `excluded from the linear/tree 1.3× regression gate; the closure-chain corpus has its own ±15% band until a slab/pool optimisation ships`.
- [ ] **Step 5: `design/models/pipeline.md` — pipeline diagram + prose**
- [ ] **Step 5: `design/models/0003-pipeline.md` — pipeline diagram + prose**
Edit `:14-17` (pipeline diagram) from:
@@ -759,13 +759,13 @@ to:
Edit `:19-28` (the accompanying prose). Replace:
> Two allocator backends share the same MIR. `--alloc=rc` is the canonical backend committed to in the [memory model](../contracts/memory-model.md) and the CLI default. The typechecker enforces `(own)` / `(borrow)` modes, codegen emits `ailang_rc_inc` / `_dec` calls at the points dictated by linearity, and `Term::Clone` / `Term::ReuseAs` materialise into actual rc-bumps and in-place rewrites respectively. `--alloc=gc` selects the transitional Boehm backend (see [RC + uniqueness](rc-uniqueness.md)); `--alloc=rc` is the canonical backend and the CLI default.
> Two allocator backends share the same MIR. `--alloc=rc` is the canonical backend committed to in the [memory model](../contracts/0008-memory-model.md) and the CLI default. The typechecker enforces `(own)` / `(borrow)` modes, codegen emits `ailang_rc_inc` / `_dec` calls at the points dictated by linearity, and `Term::Clone` / `Term::ReuseAs` materialise into actual rc-bumps and in-place rewrites respectively. `--alloc=gc` selects the transitional Boehm backend (see [RC + uniqueness](rc-uniqueness.md)); `--alloc=rc` is the canonical backend and the CLI default.
with:
> Two allocator backends share the same MIR. `--alloc=rc` is the canonical backend committed to in the [memory model](../contracts/memory-model.md) and the CLI default; the typechecker enforces `(own)` / `(borrow)` modes, codegen emits `ailang_rc_inc` / `_dec` calls at the points dictated by linearity, and `Term::Clone` / `Term::ReuseAs` materialise into actual rc-bumps and in-place rewrites respectively. `--alloc=bump` selects the raw-alloc bench-floor (`runtime/bump.c`, no free, leak-only) and is used by `bench/run.sh` to measure RC overhead against the structurally cheapest allocator — it is not a production target.
> Two allocator backends share the same MIR. `--alloc=rc` is the canonical backend committed to in the [memory model](../contracts/0008-memory-model.md) and the CLI default; the typechecker enforces `(own)` / `(borrow)` modes, codegen emits `ailang_rc_inc` / `_dec` calls at the points dictated by linearity, and `Term::Clone` / `Term::ReuseAs` materialise into actual rc-bumps and in-place rewrites respectively. `--alloc=bump` selects the raw-alloc bench-floor (`runtime/bump.c`, no free, leak-only) and is used by `bench/run.sh` to measure RC overhead against the structurally cheapest allocator — it is not a production target.
- [ ] **Step 6: `design/contracts/scope-boundaries.md` — rewrite Boehm block**
- [ ] **Step 6: `design/contracts/0010-scope-boundaries.md` — rewrite Boehm block**
Edit `:67` (the `==` polymorphic codegen list). The current `@printf` / `@GC_malloc` parenthetical should become `@printf` / `@ailang_rc_alloc` (or just `@printf` — the canonical declared-extern set in the LLVM IR header; the implementer reads the header at codegen-lib emit-time and writes whichever extern is actually paired with `@printf` in the current header).
@@ -773,7 +773,7 @@ Edit `:114-127` (the `**Memory management via Boehm conservative GC**` bullet).
```markdown
- **Memory management via reference counting + uniqueness inference**
(see [RC + uniqueness](../models/rc-uniqueness.md)), with
(see [RC + uniqueness](../models/0004-rc-uniqueness.md)), with
**per-fn arena via stack `alloca` for non-escaping allocations**
layered on top. Every ADT box, lambda env, and closure pair
allocates either via `@ailang_rc_alloc` (escaping; RC-managed
@@ -781,14 +781,14 @@ Edit `:114-127` (the `**Memory management via Boehm conservative GC**` bullet).
`alloca` (non-escaping; freed at fn return). The decision is
made by an escape-analysis pre-pass over the fn body — see the
"Per-fn arena via stack `alloca`" subsection of
[RC + uniqueness](../models/rc-uniqueness.md). The per-fn-arena
[RC + uniqueness](../models/0004-rc-uniqueness.md). The per-fn-arena
path is exercised end-to-end by
`examples/escape_local_demo.ail.json`.
```
The `examples/gc_stress.ail.json` reference is dropped entirely (file does not exist; the comment was always doc-archaeology pointing at a non-existent file). The `examples/std_list_stress.ail.json` reference is dropped similarly — its purpose ("Boehm-only soak tests") no longer exists.
- [ ] **Step 7: `design/contracts/memory-model.md` — drop "pre-Boehm era"**
- [ ] **Step 7: `design/contracts/0008-memory-model.md` — drop "pre-Boehm era"**
Edit `:230-232` from:
@@ -798,7 +798,7 @@ to (post-retirement, the "until then" branch is closed since RC inc/dec instrume
> Codegen for `Term::Ctor` / `Term::Lam` env / closure pair under `--alloc=rc` calls `ailang_rc_alloc(SIZE)`; inc/dec instrumentation is emitted per the uniqueness inference. `--alloc=bump` selects the bench-floor allocator, which leaks by design (no inc/dec, no free); it is bench-only and never a production target.
- [ ] **Step 8: `design/contracts/embedding-abi.md` — staticlib-guard prose**
- [ ] **Step 8: `design/contracts/0003-embedding-abi.md` — staticlib-guard prose**
Edit `:42-44` from:
@@ -838,7 +838,7 @@ Edit `crates/ailang-core/tests/docs_honesty_pin.rs:116-117`. Delete the two line
```rust
assert!(pipeline.contains("`--alloc=gc` selects the transitional Boehm backend"),
"models/pipeline.md must describe Boehm present-tense, not as 'on the path to retirement'");
"models/0003-pipeline.md must describe Boehm present-tense, not as 'on the path to retirement'");
```
- [ ] **Step 2: Add four absence-pins to `design_md_has_no_wunschdenken`**
@@ -858,7 +858,7 @@ Edit `crates/ailang-core/tests/docs_honesty_pin.rs:54-73` (the `design_md_has_no
- [ ] **Step 3: Update the file-level doc-comment**
Edit `crates/ailang-core/tests/docs_honesty_pin.rs:28-38` (the `design_corpus()` preamble doc-comment block). Replace the phrase `the Boehm/Decision-9 narrative (\`models/rc-uniqueness.md\`)` with `the RC + bump memory-model narrative (\`models/rc-uniqueness.md\`)` — the comment lists what the corpus scans, and the description should match post-retirement reality.
Edit `crates/ailang-core/tests/docs_honesty_pin.rs:28-38` (the `design_corpus()` preamble doc-comment block). Replace the phrase `the Boehm/Decision-9 narrative (\`models/0004-rc-uniqueness.md\`)` with `the RC + bump memory-model narrative (\`models/0004-rc-uniqueness.md\`)` — the comment lists what the corpus scans, and the description should match post-retirement reality.
- [ ] **Step 4: Drop `"pre-Boehm"` from the protected-exception list**
@@ -1010,7 +1010,7 @@ Expected: stderr contains `unknown --alloc value` and `\`gc\``; `exit: 2` (or an
- [ ] **Step 5: Honesty rule + design-doc present-tense**
Read `design/models/rc-uniqueness.md` and `design/models/pipeline.md` end-to-end:
Read `design/models/0004-rc-uniqueness.md` and `design/models/0003-pipeline.md` end-to-end:
- No `Boehm` / `libgc` / `GC_malloc` / `--alloc=gc` / `parity oracle` / `transitional` (in the allocator sense) appears.
- Present-tense describes RC (canonical) + bump (bench-floor) only.
- The 1.3× ceiling is framed as a bench-health regression gate, not a retirement target.
@@ -1,6 +1,6 @@
# operator-routing-eq-ord.1 — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-20-operator-routing-eq-ord.md`
> **Parent spec:** `docs/specs/0049-operator-routing-eq-ord.md`
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
> to run this plan. Steps use `- [ ]` checkboxes for tracking.
@@ -59,11 +59,11 @@
- Modify: `crates/ail/tests/snapshots/max3.ll` — regenerate via `UPDATE_SNAPSHOTS=1` (max3.ail uses `>` directly)
- Modify: `crates/ailang-prose/src/lib.rs:546-563` — delete the 6 comparator arms from `binop_info` (dead code after operator-name removal)
- Modify: `crates/ailang-prose/src/lib.rs:1952, 2020-2062` — delete the 3 in-source `mod tests` that pinned comparator-infix rendering
- Modify: `design/contracts/float-semantics.md:10-31, :98-99` — transfer comparison guarantees from `==` / `<` / `!=` to `float_eq` / `float_lt` / `float_ne` (arithmetic guarantees on `+` / `-` / `*` / `/` unchanged); `==` / `<` / `!=` mentions removed from the present-tense surface description
- Modify: `design/contracts/prelude-classes.md:5-13` — instance list extends with `Eq Unit`; new paragraph on the six `float_*` fns; Float-no-Eq/Ord clause gains `→ use float_eq` cross-reference
- Modify: `design/contracts/str-abi.md:40-42` — rewrite "`==`, `<`, … REMAIN primitive operators" clause to describe the class-method dispatch path
- Modify: `design/contracts/scope-boundaries.md:42-96` — operator-name mentions and `Pattern::Lit`-desugar-to-`==` clauses rewrite to the class-dispatch present
- Modify: `design/models/authoring-surface.md:58` — drop `==` / `<=` from the operator-example list; the example becomes arithmetic-only or names class methods explicitly
- Modify: `design/contracts/0005-float-semantics.md:10-31, :98-99` — transfer comparison guarantees from `==` / `<` / `!=` to `float_eq` / `float_lt` / `float_ne` (arithmetic guarantees on `+` / `-` / `*` / `/` unchanged); `==` / `<` / `!=` mentions removed from the present-tense surface description
- Modify: `design/contracts/0017-prelude-classes.md:5-13` — instance list extends with `Eq Unit`; new paragraph on the six `float_*` fns; Float-no-Eq/Ord clause gains `→ use float_eq` cross-reference
- Modify: `design/contracts/0011-str-abi.md:40-42` — rewrite "`==`, `<`, … REMAIN primitive operators" clause to describe the class-method dispatch path
- Modify: `design/contracts/0010-scope-boundaries.md:42-96` — operator-name mentions and `Pattern::Lit`-desugar-to-`==` clauses rewrite to the class-dispatch present
- Modify: `design/models/0001-authoring-surface.md:58` — drop `==` / `<=` from the operator-example list; the example becomes arithmetic-only or names class methods explicitly
---
@@ -861,13 +861,13 @@ The doc-comment at lines ~1095-1099 currently describes the function as emitting
/// Builds the equality-test AST node for a literal pattern. Lowers
/// `(pat-lit <lit>)` to `(if (eq sv <lit>) <body> <fall_k>)`. The
/// emitted `eq` resolves via prelude.Eq's class-method dispatch
/// (per design/contracts/method-dispatch.md) — Int/Bool/Str/Unit
/// (per design/contracts/0016-method-dispatch.md) — Int/Bool/Str/Unit
/// patterns all route through the corresponding primitive
/// instance.
///
/// Float-Literal patterns are hard-rejected at typecheck
/// (`CheckError::FloatPatternNotAllowed`, per
/// design/contracts/float-semantics.md) before this fn is reached,
/// design/contracts/0005-float-semantics.md) before this fn is reached,
/// so the `eq`-dispatch never encounters Float.
fn build_eq(scrutinee: Term, lit: &Literal) -> Term {
```
@@ -1029,7 +1029,7 @@ In `crates/ailang-check/src/lib.rs:856-880`, the existing addendum reads (around
if (class == "prelude.Eq" || class == "prelude.Ord") && at_type == "Float" {
d.message = format!(
"{} — Float has no Eq/Ord instance by design (partial \
orderability per IEEE-754); see design/contracts/float-semantics.md.",
orderability per IEEE-754); see design/contracts/0005-float-semantics.md.",
d.message
);
} else if class == "prelude.Show" {
@@ -1043,7 +1043,7 @@ Extend the wording to mention `float_eq` and `float_lt`:
"{} — Float has no Eq/Ord instance by design (partial \
orderability per IEEE-754); use float_eq / float_lt \
(and siblings) for explicit IEEE-aware comparison. \
See design/contracts/float-semantics.md.",
See design/contracts/0005-float-semantics.md.",
d.message
);
} else if class == "prelude.Show" {
@@ -1061,13 +1061,13 @@ In `crates/ail/tests/eq_float_noinstance.rs:32-44`, the existing test asserts th
```rust
// Existing (around line 38-44):
assert!(
stderr.contains("Float") && stderr.contains("design/contracts/float-semantics.md"),
stderr.contains("Float") && stderr.contains("design/contracts/0005-float-semantics.md"),
"expected Float-aware addendum, got: {stderr}"
);
// Replace with:
assert!(
stderr.contains("Float") && stderr.contains("design/contracts/float-semantics.md") && stderr.contains("float_eq"),
stderr.contains("Float") && stderr.contains("design/contracts/0005-float-semantics.md") && stderr.contains("float_eq"),
"expected Float-aware addendum with float_eq hint, got: {stderr}"
);
```
@@ -1148,15 +1148,15 @@ Expected: `0 failed`.
## Task 11: Contract updates — 5 design files
**Files:**
- Modify: `design/contracts/float-semantics.md:10-31, :98-99`
- Modify: `design/contracts/prelude-classes.md:5-13`
- Modify: `design/contracts/str-abi.md:40-42`
- Modify: `design/contracts/scope-boundaries.md:42-96` (operator-name mentions + Pattern::Lit-to-`==` clause)
- Modify: `design/models/authoring-surface.md:58`
- Modify: `design/contracts/0005-float-semantics.md:10-31, :98-99`
- Modify: `design/contracts/0017-prelude-classes.md:5-13`
- Modify: `design/contracts/0011-str-abi.md:40-42`
- Modify: `design/contracts/0010-scope-boundaries.md:42-96` (operator-name mentions + Pattern::Lit-to-`==` clause)
- Modify: `design/models/0001-authoring-surface.md:58`
- [ ] **Step 1: Update `float-semantics.md`**
In `design/contracts/float-semantics.md:10-14`, the bullet currently reads:
In `design/contracts/0005-float-semantics.md:10-14`, the bullet currently reads:
```markdown
- Every individual builtin (`+`/`-`/`*`/`/`/`neg`/`<`/`==`/...) lowers
@@ -1199,7 +1199,7 @@ Line 98-99 (NaN-rendering caveat) — strip the `==`/`<` mentions; reword the cr
- [ ] **Step 2: Update `prelude-classes.md`**
In `design/contracts/prelude-classes.md:5-13`, the current text describes Eq/Ord with primitive instances for Int/Bool/Str. Update:
In `design/contracts/0017-prelude-classes.md:5-13`, the current text describes Eq/Ord with primitive instances for Int/Bool/Str. Update:
- Extend the instance list with Eq Unit.
- Add a paragraph after the existing Eq/Ord/Show description naming the six `float_*` fns as the Float-comparison surface (each `Float -> Float -> Bool` without a class constraint; lowered to a single `fcmp` via codegen intercept; replaces the deleted polymorphic `==`/`<`/etc. operators on Float).
@@ -1207,11 +1207,11 @@ In `design/contracts/prelude-classes.md:5-13`, the current text describes Eq/Ord
- [ ] **Step 3: Update `str-abi.md:40-42`**
In `design/contracts/str-abi.md:40-42`, the current clause reads (paraphrase from recon): "`==`, `<`, `<=`, `>`, `>=` REMAIN primitive operators". Rewrite to describe the class-method dispatch path: equality on Str dispatches via `prelude.Eq.eq` (Str instance, lowered to `@ail_str_eq` via try_emit_primitive_instance_body::eq__Str); ordering on Str dispatches via `prelude.Ord.compare` (Str instance, lowered to `@ail_str_compare`).
In `design/contracts/0011-str-abi.md:40-42`, the current clause reads (paraphrase from recon): "`==`, `<`, `<=`, `>`, `>=` REMAIN primitive operators". Rewrite to describe the class-method dispatch path: equality on Str dispatches via `prelude.Eq.eq` (Str instance, lowered to `@ail_str_eq` via try_emit_primitive_instance_body::eq__Str); ordering on Str dispatches via `prelude.Ord.compare` (Str instance, lowered to `@ail_str_compare`).
- [ ] **Step 4: Update `scope-boundaries.md:42-96`**
Read `design/contracts/scope-boundaries.md:42-96` in full. Per recon, multiple clauses describe the dying surface:
Read `design/contracts/0010-scope-boundaries.md:42-96` in full. Per recon, multiple clauses describe the dying surface:
- "`==` is polymorphic"
- "`!=` for Float uses `fcmp UNE`"
- "`Pattern::Lit` to `Term::If` on `==`"
@@ -1225,7 +1225,7 @@ For each:
- [ ] **Step 5: Update `authoring-surface.md:58`**
In `design/models/authoring-surface.md:58`, the current example lists `==`, `<=` among operators. Drop `==` and `<=` from the example; the operator list becomes arithmetic-only (`+`, `-`, `*`, `/`, `%`). Add a follow-up sentence: "Comparison and equality are class methods (`eq` / `compare`), not operators — see [Prelude classes](../contracts/prelude-classes.md)."
In `design/models/0001-authoring-surface.md:58`, the current example lists `==`, `<=` among operators. Drop `==` and `<=` from the example; the operator list becomes arithmetic-only (`+`, `-`, `*`, `/`, `%`). Add a follow-up sentence: "Comparison and equality are class methods (`eq` / `compare`), not operators — see [Prelude classes](../contracts/0017-prelude-classes.md)."
- [ ] **Step 6: Verify honesty-rule pin still passes**
@@ -1,6 +1,6 @@
# schema-camelcase-fix — Implementation Plan
> **Parent spec:** `docs/specs/2026-05-21-schema-camelcase-fix.md`
> **Parent spec:** `docs/specs/0051-schema-camelcase-fix.md`
> (commit `55ce6d0`, amended after plan-recon)
>
> **For agentic workers:** REQUIRED SUB-SKILL: use `skills/implement`
@@ -18,7 +18,7 @@ touched: (1) `#[serde(rename)]` strings on `Term::Lam` in
`crates/ailang-core/src/ast.rs`; (2) one in-source test JSON-literal
in `crates/ailang-core/src/workspace.rs`; (3) two `.ail.json` fixtures
+ one canonical-schema contract document
(`design/contracts/data-model.md`); (4) three rustdoc strings that
(`design/contracts/0002-data-model.md`); (4) three rustdoc strings that
describe present-state schema vocabulary. The Form-A surface
(`crates/ailang-surface/`) is structurally untouched — Form-A uses
`(params (typed ...)) (ret ...)`, not the renamed tags. No hash-pin
@@ -49,7 +49,7 @@ helper.
`//!` rustdoc mentions `lam`'s `paramTypes` carry.
- Modify: `crates/ailang-check/src/lib.rs:1707``///` rustdoc on
the InstanceMethod routing helper.
- Modify: `design/contracts/data-model.md:142-147` — fenced JSON
- Modify: `design/contracts/0002-data-model.md:142-147` — fenced JSON
block describing the `Term::Lam` schema.
- Modify: `examples/test_loop_binder_captured_by_lambda.ail.json`
— two key renames, one per line (currently lines 32-33; verify
@@ -58,8 +58,8 @@ helper.
— two key renames, one per line (currently lines 25-26).
**Forbidden touches** (per spec acceptance criterion 7):
- `docs/plans/2026-05-10-23.3-*.md`, `docs/plans/2026-05-09-22b3-monomorphisation.md`,
`docs/plans/2026-05-09-22c-user-class-e2e.md`, `docs/plans/24.2.md`
- `docs/plans/2026-05-10-23.3-*.md`, `docs/plans/0003-22b3-monomorphisation.md`,
`docs/plans/0005-22c-user-class-e2e.md`, `docs/plans/0056-24.2.md`
- `experiments/2026-05-12-cross-model-authoring/master/spec.md`
- `experiments/2026-05-12-cross-model-authoring/rendered/*.md`
- `experiments/2026-05-12-cross-model-authoring/runs/**`
@@ -189,7 +189,7 @@ proceeding.
- Modify: `crates/ailang-core/src/workspace.rs:1925-1926`
- Modify: `examples/test_loop_binder_captured_by_lambda.ail.json`
- Modify: `experiments/2026-05-12-cross-model-authoring/master/examples/fn_with_lambda.ail.json`
- Modify: `design/contracts/data-model.md:142-147`
- Modify: `design/contracts/0002-data-model.md:142-147`
These files MUST move together. Changing only `ast.rs` makes any
JSON literal containing the old tags undeserialisable: serde
@@ -273,7 +273,7 @@ Expected: 2 hits on consecutive lines (currently 25-26; verify).
Same rename as Step 4.
- [ ] **Step 6: Edit `design/contracts/data-model.md:142-147`**
- [ ] **Step 6: Edit `design/contracts/0002-data-model.md:142-147`**
The fenced JSON block currently reads (lines 142-147):
@@ -336,7 +336,7 @@ with a `serde_json::from_value` error mentioning the missing field.
These are pure prose edits — no compile or test consequence. They
exist solely to keep the rustdoc honest after the rename. Per the
Honesty Rule (`design/contracts/honesty-rule.md`), production
Honesty Rule (`design/contracts/0007-honesty-rule.md`), production
rustdoc describes present-state vocabulary, not history.
- [ ] **Step 1: Edit `crates/ailang-core/src/ast.rs:8`**

Some files were not shown because too many files have changed in this diff Show More