dfdc65f21f
Cycle-close audit for spec 0064 (the #57 hardening of the linearity analysis, the #55-cutover precondition; four iterations47964ab,cc5991e,be259f9,2769e50). Architect drift review (39b674c..HEAD): both CLAUDE.md lockstep pairs confirmed untouched (INTERCEPTS↔intrinsic markers; Pattern::Lit typecheck↔pre_desugar_validation) — the cycle is genuinely diagnostic-only. It found two drift items, both in the iter-3 contract edit, both fixed here (fix path, folded into the audit close since they are doc-only): 1. [medium] design/contracts/0008-memory-model.md — the iter-3 rewrite placed a "Covers let-aliases…" statement under the "What this widening does NOT do" heading (incoherent) and named only the linearity-check mechanism, silently dropping the codegen dimension the original carve-out actually referred to ("Iter A / pre-tail-call shallow-dec arm" = the drop gates). Verified the real current state: let-aliases are propagated on BOTH axes — the linearity diagnostic (Checker.aliases + resolve_alias, this cycle) AND the codegen drop gates (MTerm::Let's current_param_modes mode inheritance, ailang-codegen/src/lib.rs:1811, pre-existing). The bullet is moved out of the "does NOT do" list into a positive paragraph naming both mechanisms. 2. [low] design/INDEX.md memory-model row — the ratifying-test cell listed only uniqueness.rs while the contract trailer now also names linearity.rs. Cell updated to "uniqueness.rs + linearity.rs". Regression gate (both green, exit 0): - bench/check.py: 34 metrics; 0 regressed, 1 improved beyond tolerance (latency.implicit_at_rc.median_us -5.27%), 33 stable. The "improved" is measurement noise, NOT a real metric move — this cycle is diagnostic-only and touches no codegen/runtime, so it cannot have improved runtime latency. Baseline deliberately NOT updated (no ratify: nothing in the code moved the metric). - bench/compile_check.py: 24 metrics; 0 regressed, 24 stable. Outcome: cycle 0064 tidy (drift-clean). All four #57 hardening classes (value-typed let-binders, local fn-param modes, let-alias propagation, partition_eithers double-consume) shipped and ratified. The #55-cutover precondition is met. Drift-clean is not a milestone close: #55 (the irreversible ParamMode::Implicit deletion) is the next, separate step. refs #57