data/phonology/en-US.phones.tsv lists the phones (tense/lax a column); the
segmenter splits ruled IPA into {ipa, stress} by longest inventory match and
refuses a symbol it does not list (LowerError::UnknownPhone) or a stress mark
with no vowel (DanglingStress). No durations, pitch or acoustics.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
The expected `weksa lower --phones` output for the proof packet, committed
before the code that must produce it.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
LanguageForms gains an optional Pronunciation: bare stress-marked IPA, ruled_by,
date, source and a rejected list. The store checks its shape and freezes a
ruling once set. pronounce() and `weksa lower --ipa` print the stored IPA of each
cited entity and refuse with NoPronunciation / NoEntityReferent; rejected
variants are never read. Nibu is the first entry: ˈnibu, rejected ˈnɪbu.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
No textual conflict except data/interlingua/inventory.cc (binary): regenerated as
the branch's rev 1 (61 entries) plus `weksa inventory proof` (rev 2, 7 entries).
Semantic breaks fixed: proof_packet() carries an empty Stance; `weksa lower`
re-admits the stored packet (idempotent) because validate no longer returns the
view; tests/lower.rs builds views through PacketStore::admit; seed_reseeded
expects seed plus proof revision. AGENTS.md records the CARGO_HOME requirement
and the proof packet key.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>