Reversal of the language decision from 6d94fa5. Texts that get
committed to the repo permanently should follow the same English-
only rule as everything else; the Notify push stays 1:1 with the
WhatsNew entry, so both are English now.
The "only file intentionally not in English" carve-out in CLAUDE.md
is removed.
Done-state notifications now produce two synchronised outputs sharing
one text: an entry appended to docs/WhatsNew.md and the same string
sent via notify.sh. The text is written in German for the user-as-
reader who did not watch the session — no technical internals, no
iteration codes, lead with the change-in-the-project.
WhatsNew.md is the only file in the repo intentionally not in English;
the exception is documented in CLAUDE.md (Roles of docs/...) so a
future reader does not "correct" it back. Bounce-back notifications
stay Notify-only.
Three classes of fix from the LLVM-IR audit:
1. != on Float: fcmp une, NOT fcmp one. one is 'ordered and not
equal' (false for nan!=nan, breaks IEEE / user-fixed constraint).
une is 'unordered or not equal' (true for nan!=nan, matches IEEE
and Rust f64::ne).
2. crates/ailang-codegen/src/synth.rs touches the Float primitive at
five sites the original spec missed: llvm_type, builtin_ail_type,
builtin_effect_op_ret, type_descriptor (descriptor 'Fl' to avoid
collision with ADT-name F-prefix), builtin_binop (becomes a
transitional artefact, replaced by type-dispatched helper).
3. Float literals lower as LLVM hex-float syntax (double 0x4014...);
nan/inf/neg_inf as direct SSA double constants at use site (NOT
via the __unreachable__ analogue, which is a terminator
instruction not a value); container slot layout precision
(monomorphisation vs bitcast).
Mainstream-aligns the Float surface: + - * / < <= > >= become
forall-quantified with codegen-dispatch on Int|Float (parallel to
today's == path), instead of the original draft's wort-style
fadd/flt/etc. Adds nan/inf/neg_inf as builtin constants and
is_nan : (Float) -> Bool. % stays Int-only (no fmod yet).
Iteration plan now flags iter 3 and iter 4 as widening passes
that must hold the no-Int-regression line.