Iteration plan derived from `docs/specs/2026-05-21-schema-camelcase-fix.md`
(commit 55ce6d0, amended). Single-iteration milestone, four tasks:
- **Task 1 (RED)**: add `lam_serialises_with_kebab_keys` pin to
`design_schema_drift.rs` + extend `anchor_in_jsonc_block` walk
to require the new tag spellings inside `data-model.md`'s `lam`
fenced block. Verifies pin fires RED on current state.
- **Task 2 (GREEN atomic schema swap)**: 10-step coupled
migration of `ast.rs:492,494` + `workspace.rs:1925-1926` +
`examples/test_loop_binder_captured_by_lambda.ail.json` +
`experiments/.../master/examples/fn_with_lambda.ail.json` +
`design/contracts/data-model.md:142-147`. All five files MUST
move together — changing only `ast.rs` makes the JSON literals
undeserialisable (no `#[serde(default)]` on `param_tys`/`ret_ty`,
so the renamed-away key is a hard error).
- **Task 3 (GREEN-2 rustdoc honesty)**: three pure-prose edits in
`ast.rs:8`, `parse.rs:81`, `check/lib.rs:1707`. Decoupled from
the schema swap — no compile or test consequence.
- **Task 4 (Verify)**: exhaustive negative grep, full workspace
test suite, round-trip invariance, forbidden-files check.
Plan pre-recon by `ailang-plan-recon` (DONE_WITH_CONCERNS) caught
the data-model.md + rustdoc layer the brainstorm initially missed
— spec was amended in commit 55ce6d0 + re-grounding-check PASS
(9 claims ratified, 2 of them via exhaustive negative grep as
"no-test-pins-this" Boss-overrideable shape).
Self-review: 8/8 (spec coverage, no placeholders, name consistency,
step granularity 2-5 min, no commit steps, pin/replacement
contiguity, compile-gate threading complete within Task 2,
verification filters all resolve to named real tests).