iter env-unify: journal entry, milestone close

This commit is contained in:
2026-05-10 02:30:34 +02:00
parent d7e333fdf7
commit e414144d48
+67
View File
@@ -12050,3 +12050,70 @@ post-22 Prelude / operator-routing / primitive-name-set
consolidation. It is not gating any user-facing feature, but it is
where the next "mysterious mono failure" will come from if not
addressed.
## 2026-05-10 — Iteration env-construction unify
Single-iteration milestone retiring the structural drift between
`check_in_workspace` and `mono::build_workspace_env`. Three
consecutive bug fixes (`5c5180f` env.types/ctor_index, `13b36cc`
env.globals, `a9c685d` env.imports) had been patches at three
different fields of the same drift class. The unify replaces both
construction paths with a single source-of-truth helper
`build_check_env(ws) -> Env` covering the workspace-flat fields
(builtins, module_globals + class_methods, module_types,
module_imports, class_superclasses, workspace_registry, plus
workspace-flat types/ctor_index for the mono pass). Per-call
overlay (`current_module`, `globals`, `imports`, `rigid_vars`, plus
per-module `types`/`ctor_index` for `Pattern::Ctor`'s local-first
resolution) stays at the call sites where it semantically belongs.
After this iteration, when `synth` learns to read a new
workspace-flat `Env` field, exactly one construction site needs
the seeding edit. A new `crates/ailang-check/tests/env_construction_pin.rs`
integration test serves as the tripwire: any future divergence
between the helper and a frozen reproduction of the inline seeding
fails the test before the bug ships.
Design corrections during execution (recorded for the audit
artifact):
- The pin test originally asserted `env.globals.is_empty()` on the
helper output, treating `globals` as pure overlay. `builtins::install`
populates BOTH `globals` (with operator entries `+`, `-`, `==`,
`not`, `__unreachable__`) AND `effect_ops` from one call, so
`globals` is partially workspace-flat (operators) and partially
overlay (per-module fns). Pin test fixed to key-set equality.
- The original spec listed `types` and `ctor_index` as workspace-flat
fields. That was true for `mono::build_workspace_env` (since
`5c5180f`) but NOT for the pre-refactor `check_in_workspace`,
which seeded them per-module — `Pattern::Ctor`'s
local-first / imports-fallback logic depends on the per-module
shape to surface the qualified `module.Type` name on cross-module
pattern matches. Resolution: `build_check_env` keeps the
workspace-flat seed (mono needs it), and `check_in_workspace`'s
per-module overlay clears and rebuilds these two fields per-module
with the original in-band fail-fast `DuplicateType` /
`DuplicateCtor` diagnostics.
Tasks (commit subjects):
- `test: red for env-construction drift-shape pin` (Task 1)
- `test: clean red signal for env-construction pin (inline module_types)` (Task 1 fixup)
- `test: fix env-pin globals assertion (builtins seed operators workspace-flat)` (mid-Task-2 correction)
- `iter env-unify.1: extract build_check_env, mono uses it` (Task 2)
- `iter env-unify.1: rustdoc fixup (re-anchor check_in_workspace doc, drop transient task tag)` (Task 2 fixup)
- `iter env-unify.2: check_in_workspace consumes build_check_env` (Task 3)
- `iter env-unify.2: drop redundant overlay comments` (Task 3 fixup)
Spec: `docs/specs/2026-05-10-env-construction-unify.md`. Plan:
`docs/plans/2026-05-10-env-construction-unify.md`. Tests: pin test
green; the three RED tests (`typeclass_22c`, `mono_recursive_fn`,
`mono_xmod_qualified_ref`) remain green; `cargo test --workspace`
green at 345 tests; bench gates 0/0/0 (`bench/check.py` 0 regressed +
4 improved beyond tolerance, `bench/compile_check.py` 0 regressed,
`bench/cross_lang.py` 0 regressed).
Known debt: none introduced. Out-of-scope items from the spec
(pipeline-topology changes, per-module overlay refactor,
primitive-name-set consolidation, new env fields) remain queued
for separate milestones.