From 0e6079d335b5ee6c7f9c2641161abafa30262aca Mon Sep 17 00:00:00 2001 From: Brummel Date: Mon, 11 May 2026 10:27:19 +0200 Subject: [PATCH] audit: canonical-type-names milestone close (clean) + ratify post-23.3.3 compile baseline --- bench/baseline_compile.json | 50 ++++++++++++++-------------- docs/JOURNAL.md | 66 +++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+), 25 deletions(-) diff --git a/bench/baseline_compile.json b/bench/baseline_compile.json index 4a8ca6d..5c4204f 100644 --- a/bench/baseline_compile.json +++ b/bench/baseline_compile.json @@ -1,105 +1,105 @@ { "version": 1, - "captured": "2026-05-09", + "captured": "2026-05-11", "captured_via": "bench/compile_check.py", "note": "Compile-time bench. `check_ms` is `ail check FILE`; `build_O0_ms` is `ail build --opt=-O0 FILE`. Wall-clock includes subprocess spawn (~5-10 ms on Linux) and, for build, the clang link step. Tolerances are tuned for noise on a quiet developer machine, not as the language correctness bar.", "check_ms": { "hello": { - "baseline_ms": 0.79, + "baseline_ms": 1.0, "tolerance_pct": 25 }, "list_map_poly": { - "baseline_ms": 0.99, + "baseline_ms": 1.24, "tolerance_pct": 25 }, "local_rec_capture": { - "baseline_ms": 0.84, + "baseline_ms": 1.09, "tolerance_pct": 25 }, "borrow_own_demo": { - "baseline_ms": 0.95, + "baseline_ms": 1.09, "tolerance_pct": 25 }, "nested_pat": { - "baseline_ms": 1.77, + "baseline_ms": 2.23, "tolerance_pct": 25 }, "bench_list_sum": { - "baseline_ms": 0.99, + "baseline_ms": 1.19, "tolerance_pct": 25 }, "bench_tree_walk": { - "baseline_ms": 1.08, + "baseline_ms": 1.24, "tolerance_pct": 25 }, "bench_closure_chain": { - "baseline_ms": 0.86, + "baseline_ms": 1.27, "tolerance_pct": 25 }, "bench_hof_pipeline": { - "baseline_ms": 0.99, + "baseline_ms": 1.35, "tolerance_pct": 25 }, "bench_compute_intsum": { - "baseline_ms": 0.86, + "baseline_ms": 1.14, "tolerance_pct": 25 }, "bench_compute_collatz": { - "baseline_ms": 0.94, + "baseline_ms": 1.17, "tolerance_pct": 25 }, "bench_list_sum_explicit": { - "baseline_ms": 0.92, + "baseline_ms": 1.28, "tolerance_pct": 25 } }, "build_O0_ms": { "hello": { - "baseline_ms": 63.52, + "baseline_ms": 84.24, "tolerance_pct": 20 }, "list_map_poly": { - "baseline_ms": 66.12, + "baseline_ms": 87.47, "tolerance_pct": 20 }, "local_rec_capture": { - "baseline_ms": 65.18, + "baseline_ms": 85.03, "tolerance_pct": 20 }, "borrow_own_demo": { - "baseline_ms": 65.56, + "baseline_ms": 86.69, "tolerance_pct": 20 }, "nested_pat": { - "baseline_ms": 68.26, + "baseline_ms": 88.91, "tolerance_pct": 20 }, "bench_list_sum": { - "baseline_ms": 66.07, + "baseline_ms": 86.57, "tolerance_pct": 20 }, "bench_tree_walk": { - "baseline_ms": 67.16, + "baseline_ms": 86.43, "tolerance_pct": 20 }, "bench_closure_chain": { - "baseline_ms": 64.59, + "baseline_ms": 85.72, "tolerance_pct": 20 }, "bench_hof_pipeline": { - "baseline_ms": 65.53, + "baseline_ms": 86.85, "tolerance_pct": 20 }, "bench_compute_intsum": { - "baseline_ms": 63.1, + "baseline_ms": 85.48, "tolerance_pct": 20 }, "bench_compute_collatz": { - "baseline_ms": 64.92, + "baseline_ms": 87.06, "tolerance_pct": 20 }, "bench_list_sum_explicit": { - "baseline_ms": 64.76, + "baseline_ms": 84.19, "tolerance_pct": 20 } } diff --git a/docs/JOURNAL.md b/docs/JOURNAL.md index 3fae89c..d728553 100644 --- a/docs/JOURNAL.md +++ b/docs/JOURNAL.md @@ -14506,3 +14506,69 @@ Workspace at iter-ct.4 close: full `cargo build --workspace` and `cargo test --workspace` green (457 tests, 0 failed — net +6 over ct.3's 451: 2 pin tests in hash.rs, 2 prose trim unit tests, 1 prose snapshot, 1 E2E test). + +## 2026-05-11 — Audit close: canonical-type-names milestone + +Audit pipeline ran clean per skill protocol. + +**Architect drift review:** zero items. DESIGN.md's Decision 2 +amendment matches what the code enforces; the four obsolete +mechanisms in the ct.1 catalogue are all gone or correctly +narrowed; `qualify_local_types` is applied uniformly at all three +cross-module fn-lookup sites; the five remaining "bit-identical" +paragraphs in DESIGN.md refer to features orthogonal to the +canonical-form migration and remain factually correct. JOURNAL +test-count claim (457 at iter close) verified against +`cargo test --workspace`. Spec acceptance criteria 1-8 empirically +satisfied. + +**Bench-regression check:** `bench/check.py` and `bench/cross_lang.py` +green at exit 0 (0 / 88 metrics regressed). `bench/compile_check.py` +initially reported 23 / 24 regressed (compile-time +27-44% +across every fixture). Bencher dispatched to localise; the +result refuted the initial hypothesis (validator-causes-regression) +with N=15 median measurements: validator's measured CPU +contribution is 0.01-0.07 ms per `ail check`, within noise. + +Localised to **iter 23.3.3** (`12d9130` — `Ord extends Eq` + 3 +Ord instances added to `examples/prelude.ail.json`). The prelude +grew from 18 to 223 lines between `3742583` and `12d9130`. The +cost is paid on every `load_workspace`: parse, canonicalise, +typecheck the prelude module, register its 6 instances. The +bench fixtures are tiny (hello = 4 defs); the prelude is now +larger than every user fixture in the corpus and dominates load +time. ct.1.* contributes a residual +0.05-0.15 ms on top — not +material against the ~+20 ms build floor. + +**Resolution:** ratify. The prelude growth is a deliberate +post-iter-23.3 design state (Eq + Ord classes with three primitive +instances each are the canonical typeclass surface; the prelude +is auto-loaded for every workspace per iter 23.1.2). Constant ++17 ms per `ail build` invocation is the documented price of +the canonical typeclass prelude. Baseline rebased via +`bench/compile_check.py --update-baseline`; post-rebaseline run +is 24 / 24 stable. + +Lesson logged: when a milestone closes and a bench script reports +broad regressions, the canonical move is to localise BEFORE +ratifying. Without the bisect, ratifying would have written +"canonical-type-names caused +30% compile time" into the +JOURNAL — a false attribution that would mislead future +archaeology. + +**Rustdoc:** 20 pre-existing-pattern warnings (18 carried from +earlier, +2 introduced by ct.1.5a's `type_def_module` doc-link +and ct.3.2's `apply_per_module_types_overlay` rename). The +existing P2 roadmap entry "Rustdoc warning sweep" covers them; +not promoted to a tidy iteration on this audit. + +**Audit verdict:** carry-on. Canonical-type-names milestone is +closed. Skill pipeline next step: `fieldtest`. + +Follow-up not from this audit but worth flagging as a P3 idea: +optimising the prelude load path. A `OnceCell`-cached parsed +prelude (or a content-addressed disk cache) would recover most +of the ~17 ms per-invocation cost. Quantified by the bencher +above as worth doing only if the prelude-loading cost is judged +structurally permanent. Add to roadmap as P3 if the next +fieldtest surfaces it as friction.