# iter form-a.tidy — close 3 of 4 documentary drift items from audit-form-a + fix 5 contradictory "seven carve-outs" sites

**Date:** 2026-05-13
**Started from:** 5e94204c218c410d44fbb8e658b677a7294744b0
**Status:** DONE
**Tasks completed:** 6 of 6

## Summary

Pure documentary tidy iteration. Three new sections landed in
`crates/ailang-core/specs/form_a.md` (Class declarations, Instance
declarations, Constraints on polymorphic fns), each anchored to a
real corpus fixture (`test_22c_user_class_e2e.ail`,
`mq3_class_eq_vs_fn_eq_classmod.ail`, `show_user_adt.ail`,
`cmp_max_smoke.ail`) and each fixture was `ail check`-verified to
produce the expected symbol counts before close. Six sites in
`docs/specs/2026-05-13-form-a-default-authoring.md` had "seven
carve-outs" tightened to "eight carve-outs" to match the §C4(b)
amendment. The empty `#[cfg(test)] mod tests {}` placeholder plus
its 6-line relocation comment was deleted from
`crates/ailang-core/src/hash.rs` (tests live in
`crates/ailang-core/tests/hash_pin.rs` since form-a.1 T5). The
`round_trip.rs` module-level and inner docstrings were rewritten
to use the post-T10 four-property framing (parse-determinism /
idempotency-under-print / CLI-pipeline-idempotency /
carve-out-anchor) instead of the retired Direction-1/Direction-2
language, with cross-references to the sibling enforcement points
in `crates/ail/tests/roundtrip_cli.rs` and
`crates/ailang-core/tests/carve_out_inventory.rs`.

No production-code behaviour changed. Workspace test count holds
at 559 passed at every per-task gate.

## Per-task notes

- iter form-a.tidy.1: `form_a.md` Class declarations section landed; §Definitions
  intro updated `Three kinds` → `Five kinds`; example anchored to
  `examples/test_22c_user_class_e2e.ail` (`ok (24 symbols across 2 modules)`).
- iter form-a.tidy.2: `form_a.md` Instance declarations section landed; two
  examples (same-module abbreviated from `mq3_class_eq_vs_fn_eq_classmod.ail`,
  cross-module from `show_user_adt.ail`); `bare-cross-module-class-ref`
  diagnostic anchor named inline.
- iter form-a.tidy.3: `form_a.md` Constraints on polymorphic fns: extended
  the four-shapes EBNF `(forall ...)` line with optional `(constraints ...)`
  clause, added explanatory paragraph (with `no-instance` diagnostic anchor),
  added fifth example to the Examples block anchored to `cmp_max_smoke.ail`.
- iter form-a.tidy.4: `docs/specs/2026-05-13-form-a-default-authoring.md`
  six "seven" → "eight" edits across the preamble + §C1 + §C2 + §C3 + §"Data flow"
  (two sites). Post-edit grep returned 4 surviving "seven" mentions at lines
  233, 238, 463, 469 — all correctly §C4(a)-scoped or arithmetic/future-state
  (see Concerns below for one carrier-vs-plan transcription drift).
- iter form-a.tidy.5: `hash.rs` empty `mod tests {}` placeholder + 6-line
  relocation comment block deleted (9 lines including the preceding blank).
  `hash_pin.rs` integration tests still 10/10 passing.
- iter form-a.tidy.6: `round_trip.rs` module-level `//!` and inner `///`
  rewritten to four-property framing with sibling-crate breadcrumbs.
  `grep -n 'Direction [12]'` now zero hits.

## Concerns

- T4 carrier-vs-plan transcription drift on the Step 6 sanity-grep expected
  output. The plan's Step 6 expected-output block listed four lines (233,
  238, 463, 469) but the carrier compressed this to "exactly the three
  surviving lines named in T4 Step 6 (lines 238, 463, 469)". The actual
  post-edit grep returns four lines matching the plan listing; line 233
  is §C4(a)-scope ("(seven files; the canonical") and is correctly retained.
  No edit was missed. The carrier's three-line restatement was wrong;
  the plan's four-line listing was right. Recording so a future auditor
  re-reading the carrier doesn't second-guess the result.

## Known debt

- (none)

## Files touched

- `crates/ailang-core/specs/form_a.md` (+105/-)
- `crates/ailang-core/src/hash.rs` (-9)
- `crates/ailang-surface/tests/round_trip.rs` (+19/-12)
- `docs/specs/2026-05-13-form-a-default-authoring.md` (six 1-line edits)

## Phase 3 (E2E coverage)

Deliberately skipped per carrier: pure-documentary iter, no
behaviour change to cover. Verification gate was the per-task
`cargo test --workspace` smoke (559 green at every task close)
plus the per-task `ail check` runs on the four corpus fixtures
cited in the new form_a.md sections, all producing the expected
symbol counts (`test_22c_user_class_e2e.ail` ok 24/2,
`mq3_class_eq_vs_fn_eq_classmod.ail` ok 22/2,
`show_user_adt.ail` ok 23/2, `cmp_max_smoke.ail` ok 22/2).

## Decision recorded — Drift item B2 (plan-file "seven carve-outs" orphans)

Per plan §"Decision recorded" and the recon report: `docs/plans/2026-05-13-iter-form-a.1.md`
contains zero defective `seven` mentions; its four hits are all internally
scoped to §C4(a) (which IS seven), arithmetic, or future-state. The
audit-form-a journal's "two sites" claim against the plan file did not
match its contents at HEAD. No plan-file edit included in this iter.

## Stats

bench/orchestrator-stats/2026-05-13-iter-form-a.tidy.json
