|
| 1 | +<!-- SPDX-License-Identifier: PMPL-1.0-or-later --> |
| 2 | +<!-- SPDX-FileCopyrightText: 2026 hyperpolymath --> |
| 3 | + |
| 4 | +# Session handoff — #135 stdlib AOT (note for the next Claude) |
| 5 | + |
| 6 | +**Date:** 2026-05-17 → 2026-05-18. **Read `docs/history/STDLIB-AOT-TRIAGE.md` |
| 7 | +first** — it is the authoritative live punch list. |
| 8 | + |
| 9 | +## What this work was |
| 10 | + |
| 11 | +Epic **#128 / #135**: make every `stdlib/*.affine` compile through |
| 12 | +`resolve → typecheck → codegen` (Deno-ESM). This was the estate's |
| 13 | +ReScript-port bottleneck. |
| 14 | + |
| 15 | +## What landed (merged to `main`, ~20 PRs, #149–#169) |
| 16 | + |
| 17 | +Front: #131 (`>>` keystone), #134 (unwrap soundness), #132 (ADR-011 |
| 18 | +namespace), #133 (single-ownership dedup). |
| 19 | + |
| 20 | +#135 slices merged: **1** `fn(x)=>e` lambdas · **2** slice index |
| 21 | +`e[a:b]` · **3** bare `effect E;` + ADR-008 `-> T / E` · **4** `total` |
| 22 | +keyword-rename + `Iterator::collect` Vec→`[]` · **5** trait default |
| 23 | +bodies · **6/6b** `try`/`ref`/`as` keyword-as-ident renames · **7** |
| 24 | +let-polymorphism (generic fns were silently monomorphic — high-leverage |
| 25 | +typecheck fix) · **8** module visibility/imports · **11** resolver |
| 26 | +two-pass (forward refs + mutual recursion). Slice **10** (effects |
| 27 | +generic-extern kinds) landed via a parallel session. |
| 28 | + |
| 29 | +Result: **~11/19 stdlib files compile end-to-end** (prelude, string, |
| 30 | +effects, Core + 7 module files). The two hardest *enabling* fixes |
| 31 | +(sl.7 let-poly, sl.11 resolver two-pass) are done — nothing is blocked |
| 32 | +on the resolver or the typecheck wall any more. |
| 33 | + |
| 34 | +## What remains (see triage doc for precise per-file root causes) |
| 35 | + |
| 36 | +- **slice 9** — `option` `&mut Option<T>` ref params (`take`/ |
| 37 | + `get_or_insert`); affine/borrow lowering, ownership-soundness-critical. |
| 38 | +- **slice 12** — deeper typecheck on `result`/`collections`/`testing`/ |
| 39 | + `traits` (now past resolution). |
| 40 | +- **io / math** — cross-module `split` (in `string.affine`) / `trunc`; |
| 41 | + see open PRs below. |
| 42 | + |
| 43 | +## ⚠️ Concurrency note (important) |
| 44 | + |
| 45 | +This repo was worked by **two Claude sessions in parallel** in the same |
| 46 | +clone, under the shared `hyperpolymath` git identity. Open PRs **#167** |
| 47 | +(slice 10 `Ref<T>` kind) and **#170** (`trunc` builtin) belong to the |
| 48 | +*other* session — do not assume they are yours. Before resuming: |
| 49 | +re-verify `origin/main`, base any branch on it (never on a stray |
| 50 | +checked-out branch), and coordinate on `io`/`math`/resolver/`string` |
| 51 | +which the other session was actively editing. Mechanics + hazards are |
| 52 | +in memory `affinescript-spine-rederived`, `split-merge-failure-mode`, |
| 53 | +`stray-branch-base-misdetection`, `git-checkout-discards-uncommitted-edits`. |
| 54 | + |
| 55 | +## Build |
| 56 | + |
| 57 | +Canonical clone is `/home/hyperpolymath/dev/affinescript` (has the |
| 58 | +`_opam` local switch; the `repos/affinescript` clone has no toolchain). |
| 59 | +Prefix every command: |
| 60 | + |
| 61 | +``` |
| 62 | +export PATH="/usr/bin:$PATH" |
| 63 | +eval $(opam env --switch=/home/hyperpolymath/dev/affinescript --set-switch) |
| 64 | +dune build && dune test # full suite was green at 233 tests |
| 65 | +``` |
| 66 | + |
| 67 | +Discipline that paid off this session: isolate genuine root causes with |
| 68 | +minimal repros before changing the compiler; commit a green change |
| 69 | +*before* any conflict-check/file-swap; for grammar edits, diff menhir |
| 70 | +conflict counts before/after; one scoped slice per PR; rigorous triage |
| 71 | +over a damaging partial pass. |
0 commit comments