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:
+3
-3
@@ -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
-1
@@ -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
-1
@@ -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.
|
||||
+5
-5
@@ -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:**
|
||||
+5
-5
@@ -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"
|
||||
```
|
||||
|
||||
+3
-3
@@ -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
-1
@@ -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
-1
@@ -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
-1
@@ -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
-1
@@ -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.
|
||||
>
|
||||
+9
-9
@@ -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.
|
||||
|
||||
+2
-2
@@ -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
|
||||
+2
-2
@@ -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
|
||||
+4
-4
@@ -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
-1
@@ -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
-1
@@ -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.
|
||||
+2
-2
@@ -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
-1
@@ -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.
|
||||
+2
-2
@@ -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
-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.
|
||||
+2
-2
@@ -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
-1
@@ -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 1–11)
|
||||
- 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
|
||||
`:552–565`: remove `tail-app-term`/`tail-do-term` productions.
|
||||
§"Data model" `:2357–2359` (`"app"` tail jsonc + comment),
|
||||
`:2373–2375` (`"do"`), `:2452–2467` (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
-1
@@ -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:56–82. 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 28–37) 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`
|
||||
(:104–137): 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` (:94–101): 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 2–3; `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 (:199–212) → 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 1–8 keep
|
||||
`docs/DESIGN.md` on disk, so every intermediate `cargo build` is
|
||||
+18
-18
@@ -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
|
||||
+28
-28
@@ -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 1–4 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 1–5:
|
||||
//! 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 1–4 — 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 1–4 — STOP and inspect.
|
||||
+4
-4
@@ -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.
|
||||
+22
-22
@@ -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**
|
||||
|
||||
+8
-8
@@ -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
Reference in New Issue
Block a user