# Is AILang harder for a frontier model than a familiar language?

Evidence corpus for the "Is AILang harder for a frontier model…" section of
`../format-findings.md`. The question: does AILang cost Claude *more* than a
language it knows from training (Rust)? Method: pass@1 over 6 samples of the
same task in AILang (two-example few-shot) vs Rust, single-shot, fresh clueless
agents, no tools, oracled afterward (`ail check`/`run` resp. `rustc` + stdout).

## task1-eval — ADT + match + recursion (all in the few-shot)

Evaluate `(A + B) * C` over a small `Expr` ADT. **AILang 6/6 = Rust 6/6**, no
gap — and all six AILang answers were byte-identical. When every construct is in
the few-shot, AILang is not harder for Claude. `ail/m.ail` runs to `20`.

## task2-countgt — count elements `> N` (needs a comparison, OUTSIDE the few-shot)

- `ail-noscan/m.ail` — the single-shot answer. The *logic is correct* (recurse,
  test, accumulate); it fails only on a guessed name: `> ` is not an AILang
  identifier. Representative of **0/6** in this condition. The Rust cell
  (`rust.rs`, idiomatic `filter().count()`) is **6/6**. So the single-shot gap
  is a *vocabulary* gap, not a reasoning gap — and the single-shot setup is
  unfair: in Rust Claude has its training plus the obvious ability to scan a
  crate, which AILang was denied.

- `ail-scan-loop/m.ail` — the **fair test**: same task, but Claude is given the
  prelude as a scanned library and then iterates on raw compiler output (how it
  actually works on an unfamiliar crate). It converges in two feedback rounds:
  `gt`+`(pat-ctor True)` → `(case true …)` → finally `match (compare h N) … GT`.
  Runs to `3`. The idiomatic path matches on the `Ordering` ADT that `compare`
  returns — never on a `Bool`.

## The finding

*No scan + terse errors* → Claude diverges. *Scan + diagnostic errors* → Claude
converges. Same model; the difference is the discovery affordances. The
"language is harder" gap dissolves under the workflow Claude really uses.

Two genuine AILang defects the thread exposed (filed as Gitea issues):

1. `ail builtins` lists no comparison operator — they live in the prelude, which
   `builtins` doesn't surface. The discovery tool is an incomplete API scan.
2. `match` on `Bool` passes `ail check` but is rejected by codegen
   (`match on non-ADT scrutinee (i1); MVP supports only ADTs`); with no `if`,
   branching on a Bool is a dead end. A check/codegen inconsistency.
