48e7774d01
Architect drift review clean (zero drift/debt, diff-verified: single Term::Loop write_term hunk, no non-render site / Term::Recur / doc / lockstep touched). Bench: compile_check 0/24 + cross_lang 0/25 exit 0; check.py's latency-tail firings proven single-sample jitter by an identical confirmatory re-run (p99.9 +37%→+10% ok, max +114%→+22% ok); the sole persistent firing is the pre-tracked P2 *.bump_s environmental staleness, causally impossible to attribute to a projection-only ailang-prose change. All items carry-on — no fix, no baseline ratify. Fieldtest not applicable (no authoring-surface change). Roadmap P0 flipped to closed; WhatsNew user-facing entry appended (user present → notification suppressed per policy).
92 lines
4.9 KiB
Markdown
92 lines
4.9 KiB
Markdown
# audit prose-loop-binders — Milestone-prose-loop-binders tidy (clean)
|
||
|
||
**Date:** 2026-05-18
|
||
**Milestone:** prose-loop-binders (single-iteration)
|
||
**Commit range:** `6cbd0fe..c9355d7` (prev close = loop/recur at `6cbd0fe`)
|
||
**Status:** CLOSED — clean, carry-on (no fix, no ratify)
|
||
|
||
## Step 1 — Architect drift review
|
||
|
||
`ailang-architect` over `6cbd0fe..HEAD`: **clean**, zero drift, zero
|
||
debt. Verified against the diff (not journal trust):
|
||
|
||
- Single hunk in `crates/ailang-prose/src/lib.rs` (the `Term::Loop`
|
||
arm of `write_term`, lines 936–953). The two non-render
|
||
`Term::Loop` sites (`count_free_var`, `subst_var_with_term`) and
|
||
all `Term::Recur` arms are absent from the diff — untouched.
|
||
- DESIGN.md and PROSE_ROUNDTRIP.md make **no** claim about how
|
||
prose renders `loop` (grep: no match), so the spec's "no doc
|
||
edit needed" is correct, not a skipped obligation. `DESIGN.md:714`
|
||
`loop(n-1)` is an ordinary recursive-call illustration in
|
||
Decision 8, unrelated to the `Term::Loop` construct — not stale.
|
||
- Diff touches only the four named code/fixture files plus expected
|
||
docs (spec/plan/journal/INDEX/roadmap/stats). No carve-out /
|
||
hash-pin / round-trip lockstep bypassed (prose is off the
|
||
Form-A↔JSON round-trip path by construction).
|
||
- The `architect_sweeps.sh` Sweep-1 DESIGN.md hits all pre-date
|
||
`6cbd0fe` and are outside this milestone's diff (zero DESIGN.md
|
||
lines changed) — flagged for the record, not attributable here.
|
||
|
||
Architect recommendation: carry on as planned.
|
||
|
||
## Step 2 — Bench-regression check
|
||
|
||
- `bench/compile_check.py` → **exit 0**, 24 metrics, 0 regressed.
|
||
- `bench/cross_lang.py` → **exit 0**, 25 metrics, 0 regressed.
|
||
Notably its independent `bench_list_sum.ail_bump_s` reads +1.50%
|
||
(±15% tol) → **ok** — corroborates that check.py's bump_s firing
|
||
is baseline-staleness, not a real bump regression.
|
||
- `bench/check.py` → exit 1. First run: 3 regressed
|
||
(`bench_list_sum.bump_s` +13.17%; `latency.implicit_at_rc.p99_9_us`
|
||
+37.30%; `latency.implicit_at_rc.max_us` +114.14%), 4 improved,
|
||
56 stable. Confirmatory identical re-run (no code change):
|
||
`p99_9_us` +10.22% → **ok**, `max_us` +22.17% → **ok** (median
|
||
and p99 within tol on both runs) — the two latency-tail firings
|
||
were single-sample 5-run RC-mode jitter, proven by re-run.
|
||
`bench_list_sum.bump_s` persisted at +11.79% (consistent with
|
||
the +13.17% first run): summary `63 metrics; 1 regressed`.
|
||
|
||
## Step 3 — Classification
|
||
|
||
| Item | Class | Rationale |
|
||
|------|-------|-----------|
|
||
| Architect drift | carry-on | clean — nothing actionable |
|
||
| `throughput.bench_list_sum.bump_s` +~12% | carry-on | The already-tracked P2 roadmap todo "`*.bump_s` throughput baseline is stale vs current hardware" — byte-oracle-proven environmental (not codegen) at the 2026-05-16 iteration-discipline-revert audit. Causally impossible to attribute to a projection-only `ailang-prose` change (prose is not in the bench runtime path; architect verified the diff is one render-arm + test fixtures). |
|
||
| `latency.implicit_at_rc` p99.9 / max | carry-on | Single-sample 5-run RC-mode tail jitter; vanished on identical re-run with median/p99 always within tolerance. Not a regression; the queued P3 "latency methodology rework" (histogram-based) exists precisely to de-noise this metric family. |
|
||
|
||
## Step 4 — Resolution
|
||
|
||
**Carry-on** on every item. No fix iteration, no baseline ratify.
|
||
|
||
Explicitly **not ratified**: the `*.bump_s` baseline is NOT bumped
|
||
here. The P2 roadmap todo scopes a holistic recapture+recalibration
|
||
of the entire `*.bump_s` set on current hardware from a known-clean
|
||
commit as a dedicated bench-harness iteration; opportunistically
|
||
bumping one metric's baseline inside an unrelated projection-only
|
||
milestone is exactly the "bump the baseline, the regression is
|
||
expected" rationalisation the audit Iron Law forbids, and would
|
||
fragment the recapture the P2 todo owns. The pointer stands; the
|
||
todo is unchanged.
|
||
|
||
## Fieldtest applicability
|
||
|
||
**Not applicable / not dispatched.** `fieldtest` is Boss-dispatched
|
||
for a milestone that touched the *authoring* surface — the
|
||
fieldtester writes `.ail` Form-A programs and runs them through the
|
||
public `ail` CLI. This milestone changed only the Form-B *reading*
|
||
projection (`ail prose` output); the Form-A authoring surface, the
|
||
typechecker, codegen, and runtime are byte-unchanged. A fieldtester
|
||
authoring `.ail` programs would not exercise the prose-render change
|
||
at all — there is no friction/bug/spec-gap axis for it to probe.
|
||
The two committed whole-file byte-equality `.prose.txt` snapshots +
|
||
the live-CLI `ail prose | diff` acceptance checks (iter journal) are
|
||
the end-to-end gate for a projection-only milestone.
|
||
|
||
## Milestone close
|
||
|
||
The **prose-loop-binders** milestone is **CLOSED, clean**. Architect
|
||
drift clear; bench carry-on (sole persistent firing is the tracked
|
||
P2 `*.bump_s` environmental staleness, latency-tail proven sampling
|
||
noise by re-run). Roadmap P0 entry flipped to closed; no follow-up
|
||
iteration spawned.
|