# iter ctt.3 — `KindMismatch` retire (pure deletion across 3 files)

**Date:** 2026-05-12
**Started from:** 0e556f085c14993441b7d25dcdc69077b77c83b0
**Status:** DONE
**Tasks completed:** 2 of 2

## Summary

`WorkspaceLoadError::KindMismatch`, its dispatch site in
`validate_classdefs`, its `walk_kind_mismatch` helper, its Display
arm in `crates/ail/src/main.rs:workspace_error_to_diagnostic`, and
the "dead-but-defensive" doc-comment on the canonical-form-rejection
test are all retired. Two adjacent textual-consistency edits ride
along: the `validate_classdefs` doc-comment narrows from "Three
diagnostics fire from here" to "Two" with a successor sentence
naming the new path, and the `crates/ailang-check/src/lib.rs:1428`
22b.1-era archaeology comment drops the `KindMismatch` token from
its enumeration of class-schema diagnostics and gains a one-line
ctt.3 retirement marker. The existing test
`class_param_in_applied_position_fires_canonical_form_rejection`
stays green unchanged — it asserts `BareCrossModuleTypeRef` on the
malformed fixture, which is the canonical-form-validator successor
the plan named. `cargo build --workspace` clean, no orphan match
arms, no dead-code warnings. `cargo test --workspace` green
(~600 tests across 16 binary-test suites, zero failures).

## Per-task notes

- iter ctt.3.1: atomic deletion pass — 6 Edits across 3 files. workspace.rs ×4 (variant delete; `validate_classdefs` doc + dispatch-loop delete; `walk_kind_mismatch` helper delete; "dead-but-defensive" doc delete). main.rs ×1 (`W::KindMismatch` arm in `workspace_error_to_diagnostic`). lib.rs ×1 (22b.1 archaeology comment). Build green at Step 7.
- iter ctt.3.2: workspace-wide test gate — grep substantively clean in `crates/` (one residual `KindMismatch` token at lib.rs:1431 is the ctt.3 retirement marker introduced by Step 6 itself, not a live consumer); canonical-form-rejection test PASS; full `cargo test --workspace` PASS.

## Concerns

- Plan-internal contradiction surfaced during Task 2 Step 1: the
  plan's Step 6 `new_string` deliberately introduces a new
  `KindMismatch` token in the ctt.3 retirement marker
  (`// ctt.3: KindMismatch retired — ...`), but Task 2 Step 1's
  verification text says "Expected: zero hits in `crates/`". The
  parent spec at `docs/specs/2026-05-12-ct-tidy.md:384` is more
  permissive ("`grep KindMismatch` returns the three deletion sites
  only" — accepting the diff itself as the only mention, but
  silent on a successor archaeology marker). Substantive intent
  (retire the diagnostic) is met: variant, helper, dispatch, and
  Display arm are all gone. Treated as `compliant` with this
  concern recorded; Boss may choose to either tighten the
  spec/plan rule for future tidies or accept the retirement-marker
  pattern (which is already common in the codebase — cf. ctt.1
  successor-rationale comments in workspace.rs).
- Mid-deletion repair on workspace.rs:773 — the dispatch-loop
  deletion in Step 2 orphaned the `mod_name` binding that
  destructured `for (mod_name, m) in modules`. Plan Step 7's
  acceptance criterion is "no dead-code warnings" — left as
  `for (mod_name, m)` the build would warn `unused variable:
  mod_name`. Minimal cleanup applied: rewrote to
  `for m in modules.values()`. Same body, same `m: &Module` type
  via `.values()` instead of tuple-destructure. Not in the plan's
  verbatim edit list but a foreseeable side-effect of the
  deletion and entirely mechanical.

## Known debt

- None new. The "future tidy may retire" promise in the deleted
  doc-comment is now this iter; no successor obligation.

## Files touched

- `crates/ailang-core/src/workspace.rs` (variant delete + doc adjust + dispatch-loop delete + helper delete + test-doc delete + `mod_name` binding cleanup)
- `crates/ail/src/main.rs` (Display arm delete)
- `crates/ailang-check/src/lib.rs` (archaeology comment edit)

## Stats

bench/orchestrator-stats/2026-05-12-iter-ctt.3.json
