Phone inventory, segmenter and weksa lower --phones (the Weksa->AquaSynth phones line) #16
Loading…
Reference in a new issue
No description provided.
Delete branch "weksa-lowering/phones-line"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
The phones line for AquaSynth: ruled IPA to an ordered
{ipa, stress}list, one JSON object per cited entity.data/phonology/fixtures/nibu-en-US.phones.json; a test compares the library and the CLI output to it byte for byte.data/phonology/en-US.phones.tsv(class and tense/lax per phone, so /i/ and /ɪ/ are two phones). Read bycrates/weksa/src/phones.rsthroughinclude_str!.ˈ/ˌput primary/secondary stress on the next vowel (the nucleus), every other phone isnone.LowerError::UnknownPhone {entity, at, text}for a symbol the inventory lacks (or a language with no inventory),LowerError::DanglingStress {entity, at}for a mark with no vowel to land on.--phonesconflicts with--ipa.Tests:
crates/weksa/tests/lower.rs(tense /i/ passes; rejected lax /ɪ/ is a different phone and is not what the seed emits; stress placement; multi-character phones; unknown phone and dangling stress refusals; parser refusals) andtests/cli.rs. Full suite green.Mutation check: cargo-mutants is not installed in this run and the stopgap runner is not executable from a Self run (Permission denied), so I ran 21 hand-made mutants (stress marks swapped, shortest match, stress on any phone, wrong dangling offset, missing trailing check, lax parsed as tense, data edits for i/ɪ/u/tʃ, language tag, flag inversions, ...) against
lowerandclitests: all 21 caught, none missed. Probes are not committed. A real cargo-mutants pass is still owed.Decision to rule on: the inventory is a tab-separated file embedded in the binary, not a CultCache store, to avoid a new store and CLI for one table. It should move to a typed store if phone inventories grow past en-US.
Tense/lax and its source. /i/ is tense and /ɪ/ is lax in
data/phonology/en-US.phones.tsv(thetensenesscolumn; the file's#comment header now cites the ruling). The ruling it rests on is Nibu's of 2026-11-07, sourceweksa-body:follow_up:chat-s3981-3983(#minds): tense vowel, two syllables, stress on the first. It choseˈnibuand rejectedˈnɪbu, recorded in the entity entry'srejectedlist. The inventory is what makes the two forms two different phones; the tests pin both.🤖 Generated with Claude Code
weksa lower --phones5508000d21data/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>Main merged into the branch (
0ca9b5e; both LowerError sets and both test groups kept).cargo test --locked --workspaceall ok on0ca9b5e, run by me and by an independent Soul pass: all promises hold, 11 hand mutants on phones.rs (10 killed, 1 equivalent). Lows go to a follow-up (empty IPA unpinned, multi-entity unpinned, ASCII g vs IPA ɡ refused, affricate/sequence ambiguity). Not run: cargo-mutants (not installed). Merging.