Commit Graph

20 Commits

Author SHA1 Message Date
Brummel a1692a4859 iter 23.4: mono-pass unification — class methods + polymorphic free fns in one fixpoint
Restructure ailang-check/src/mono.rs::monomorphise_workspace into a
single specialiser over every Type::Forall-quantified Def::Fn, covering
both class-method residuals AND polymorphic free-fn call sites in one
fixpoint pass. Remove the codegen-time specialiser (lower_polymorphic_call,
module_polymorphic_fns, mono_queue, mono_emitted, emit_specialised_fn,
plus the now-dead helpers apply_subst_to_term, descriptor_for_subst,
type_descriptor) entirely. Codegen sees only monomorphic Def::Fns after
this iter — no polymorphic call sites, no codegen-time queue.

Architecture changes:
- MonoTarget: struct → enum with ClassMethod / FreeFn variants; dedup
  keys are guaranteed-disjoint via 'class'/'free' first component.
- collect_mono_targets: new FreeFnCall channel through synth (cleaner
  than the plan's separate-walker proposal — one less data flow,
  substitution tracking comes 'for free' via fresh metavars +
  post-synth subst.apply). Plan Step 4.4 (polymorphic_free_fns env
  field) consequently obsolete.
- synthesise_mono_fn_for_free_fn: new free-fn entry point; substitutes
  rigid vars in BOTH the type AND the body (body substitution required
  because free-fn bodies carry inner Lams whose param_tys reference
  outer Forall vars — adapted from plan's 'body unchanged' sketch).
- mono_symbol_n: N-ary extension of mono_symbol; bit-stable for the
  single-type-var case (hash-stability pin Task 1 fires zero times
  through all eight refactor tasks).
- rewrite_class_method_calls → rewrite_mono_calls; interleaved-slot
  collector preserves the positional-cursor invariant across both
  channels.
- workspace_has_typeclasses → workspace_has_specialisable_targets
  (principled correctness; old predicate happened to already be true
  for every user workspace because the prelude is auto-injected).

Codegen cleanup:
- Two call sites of lower_polymorphic_call deleted (codegen/src/lib.rs
  lines ~1939-1945, ~1965-1973).
- lower_polymorphic_call body, module_polymorphic_fns field +
  population + Emitter wiring, mono_queue / mono_emitted, drain loop,
  emit_specialised_fn — all removed.
- is_static_callee collapsed to module_user_fns-only.
- subst.rs apply_subst_to_term + descriptor_for_subst removed; synth.rs
  type_descriptor removed (all dead post-removal).
- ail emit-ir command pipeline gains lift_letrecs + monomorphise_workspace
  pre-passes (pre-iter-23.4 the codegen-time poly path was masking
  this dependency — emit-ir is now consistent with build).
- Net codegen reduction: -285 lines lib.rs, -93 lines subst.rs.

Tests:
- mono_hash_stability.rs (new): regression pin for six primitive Eq/Ord
  mono-symbol body hashes; stayed bit-stable through all eight refactor
  tasks.
- mono_unification.rs (new): six tests covering variant-key disjointness,
  free-fn target emission, free-fn synthesis with rigid substitution,
  rewrite walker on free fns, identity for poly-free-fn-only workspaces,
  end-to-end cmp_max_smoke runtime correctness.
- typeclass_22b3.rs: three test sites updated to MonoTarget::ClassMethod
  enum form.
- 73 e2e + 18 typeclass + 81 codegen tests all green workspace-wide.

DESIGN.md §'Monomorphisation (post-typecheck, pre-codegen)' amended:
two-arm fixpoint described, disjoint-keyed dedup, cursor-aligned
walker, removed codegen-time path.

Bench check (all exit 0, 112 metrics stable): bench/check.py +
compile_check.py + cross_lang.py.

Plan parent: docs/plans/2026-05-11-iter-23.4.md (fab1685).
Spec parent: docs/specs/2026-05-11-23-eq-ord-prelude.md (841d65d).
Per-iter journal documents two adapted deviations from the plan
(synth-channel vs separate walker; body substitution; emit-ir fix);
no spec defects.
2026-05-11 23:59:45 +02:00
Brummel 51da9fab53 iter disc.1: boss-only commits + main-as-quarantine (no branches in implement)
Two project-wide rules are now explicit across every skill:

1. Only the Boss commits. No skill agent (implementer,
   brainstormer, planner, debugger, fieldtester, docwriter,
   architect, bencher) runs `git commit`. Agents write their
   artefacts to the working tree as unstaged changes; the Boss
   inspects, decides commit shape, and commits.
2. main HEAD is sacrosanct. No actor runs `git reset` or
   `git revert` on main. Bad work stays in the working tree
   where it is still discardable via `git checkout -- <paths>`.

Implement loses the `iter/<iter_id>` branch mechanic entirely;
Phase 0 of the orchestrator-agent now does a clean-tree check
and refuses to start on a dirty tree. Per-task agent commits
are removed everywhere; reviewers operate against
`git diff HEAD` instead of `pre_task_sha..head_sha`.

Motivation: 2026-05-11 iter 23.4 stranded prep2/prep3 commits on
an iter-branch that never integrated to main, then a corrected
spec falsely claimed those commits had shipped. Branch-per-iter
+ manual-Boss-merge + iter-stacking made the strand structurally
possible. See docs/journals/2026-05-11-iter-disc.1.md for the
full per-task notes and motivation.
2026-05-11 22:44:43 +02:00
Brummel f7ca26c5b4 iter 23.4-prep: INDEX entry 2026-05-11 22:02:19 +02:00
Brummel ab4463ff19 iter 23.4-prep: per-iter journal 2026-05-11 22:01:52 +02:00
Brummel 408fef9239 journal: gc.1 — append cadence-flow notes 3+4 from first real grounding-check run
Note 3: agent output format leaked internal-thinking preamble before
the structured report block — Iron Law should forbid preamble.
Note 4: Boss-requested behaviour change for impending-BLOCK paths —
on miss, agent attempts to write missing GREEN test (test code only,
never src/) before falling to BLOCK; requires tool + Iron Law update.
Both notes are for the future skillsystem-postmortem entry; out of
gc.1 scope.
2026-05-11 21:32:38 +02:00
Brummel 6b55171ba8 iter gc.1: journal — append cadence-flow notes for skillsystem postmortem 2026-05-11 19:50:32 +02:00
Brummel 954d15c709 iter gc.1: append INDEX entry 2026-05-11 19:49:55 +02:00
Brummel 4a9673259c iter gc.1: per-iter journal 2026-05-11 19:48:31 +02:00
Brummel 17b1d9957e iter cadence.5-fix: journal — commit-range + fix-count consistency 2026-05-11 14:13:39 +02:00
Brummel bd36751634 iter cadence.5: per-iter journal + INDEX 2026-05-11 14:10:48 +02:00
Brummel 5c3bd9ab24 or.2: orchestrator-agent design correction — no nested subagent dispatch
Claude Code categorically forbids subagents from spawning other
subagents (code.claude.com/docs/en/sub-agents and the Agent SDK
subagents page). The `or.1` architecture (and `pr.1` that ran on
top of it) presumed a named-exception for `ailang-implement-
orchestrator` to dispatch implementer / spec-reviewer / quality-
reviewer / tester per task. That exception never existed at the
platform level; the `Agent` tool was silently dropped from the
orchestrator-agent's tool set at dispatch time.

Architecture revised, doc-only:

- Per-task phases (implementer → spec-compliance check → quality
  check) now run as sequential role-switches in the orchestrator-
  agent's own context, not as nested subagents.
- The four role-files (implementer / spec-reviewer / quality-
  reviewer / tester) become phase reference files the
  orchestrator-agent consults at role-switch boundaries.
- Boss-context offload preserved; fresh-per-phase context given
  up (the property that drove or.1's nested-dispatch design is
  not buildable in Claude Code).

Files touched:
- skills/implement/agents/ailang-implement-orchestrator.md
  (frontmatter, Iron Law, Phase 2/3 rewrite, rationalisations,
  red flags)
- skills/implement/SKILL.md (frontmatter, Iron Law, sub-status
  vocabulary note, cross-references)
- skills/README.md (Conventions: no more named exception; agent
  roster: role-files recast as phase references)
- docs/journals/INDEX.md (or.2 entry appended)
- docs/journals/2026-05-11-iter-or.2.md (new — full rationale)
- docs/roadmap.md (P1 tool-wiring item removed; resolved as
  categorically-not-fixable)
- docs/WhatsNew.md (user-facing correction entry appended)

No code changes; no bench impact; CLAUDE.md untouched (no stale
references to fix there).
2026-05-11 13:01:38 +02:00
Brummel 908a15c3ce journal: pr.1 audit close (clean) — 0 bench regressions, architect clean 2026-05-11 12:42:37 +02:00
Brummel a33d76c67b iter pr.1: INDEX entry for plan-recon subagent 2026-05-11 12:40:03 +02:00
Brummel 5c17ef2efc iter pr.1: Boss-side known-debt addendum (iron law + agent-tool-wiring) 2026-05-11 12:40:03 +02:00
Brummel 11fcd0a20e iter pr.1: per-iter journal 2026-05-11 12:36:05 +02:00
Brummel 94d8016da1 fieldtest close: canonical-type-names — route findings + roadmap update
Per-iter journal entry for the fieldtest run plus INDEX pointer.
Roadmap absorbs four actionable findings as P2/P3 todos (split the
merged BadCrossModuleTypeRef diagnostic, workspace subdir search,
`ail check` on `.ailx` extension, `.ailx` counterpart for the
canonical happy-path JSON exhibit). The two carry-on items
(`(import prelude)` doc-gap, the working ones) stay as notes in the
fieldtest spec only. P0 Floats milestone removed — closed
2026-05-10 and no longer load-bearing context.

No bug findings, so no debug dispatch. canonical-type-names is fully
shipped.
2026-05-11 12:17:21 +02:00
Brummel 207970098f journal: or.1 audit close (clean after tidy) — 0 bench regressions, 4-file drift sweep 2026-05-11 12:03:28 +02:00
Brummel e46bc540eb iter or.1: INDEX entry for orchestrator-refactor 2026-05-11 11:57:15 +02:00
Brummel 8a05340b0b iter or.1: per-iter journal 2026-05-11 11:56:56 +02:00
Brummel 6268d08f40 iter or.1.1: migrate JOURNAL.md to journal-archive.md + docs/journals/ 2026-05-11 11:14:08 +02:00