Skip to content

Commit b7a68b7

Browse files
review: the referee DOES hold a word-final ⟨c⟩ — my reason was wrong, the conclusion was not
I wrote that af.wiktionary-af.tsv contains no word-final ⟨c⟩, and that its C→sɪə entry reaches output through the initialism path. Both false. The entry IS a word-final ⟨c⟩, eval.ts feeds af through phonemizeWord directly, and the initialism normalizer only fires on runs of two or more letters — so that entry traverses this exact branch, going s→k with this change. The conclusion survives: it misses both ways against sɪə, which is why the folded backbone is unmoved at 1658/2220. But the stated reason would have told the next reader that nothing exercises the branch, which is the opposite of true. My original grep was case-sensitive and lowercase-only; I then saw the C entry in later output and explained it away with an assumption I never checked. Filed the underlying gap as #761: a bare single letter is read as a sound rather than spelled as its name (B→p too), because the initialism normalizer needs ≥2 letters. Also moved the new test into the g2p describe block, where it belongs. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012Lc3WnUgogC7okV7n53vjr
1 parent 5b9ec3d commit b7a68b7

2 files changed

Lines changed: 18 additions & 13 deletions

File tree

src/languages/afrikaans/afrikaans.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,9 @@ function phonemizeMorpheme(word: string): string {
8787
// ⟨c⟩ with nothing after it fell into the soft branch. franc→frans, arc→ars. #756 preserved
8888
// that verbatim (a data move must not change output) and #757 decided it: the rule's own
8989
// statement is "before a front vowel", and word-final has no following vowel at all, so the
90-
// accident inverted the rule rather than extending it. The af referee has no word-final ⟨c⟩,
91-
// so this rests on the rule being self-consistent, not on a measurement.
90+
// accident inverted the rule rather than extending it.
91+
// ⚠ NOT REFEREE-DECIDED: the corpus's only word-final ⟨c⟩ is the letter name C→sɪə, which this
92+
// branch does reach and misses BOTH ways, so the score is unmoved either way (#761).
9293
out += C_SOFT.has(w[i + 1] ?? "") ? "s" : "k";
9394
i += 1;
9495
continue;

test/afrikaans.test.ts

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,21 @@ describe("Afrikaans canonical IPA — greedy g2p + open/closed vowel length (Sta
4646
test("text: words + clause punctuation (stress deferred)", () => {
4747
expect(createAfrikaans().text("Die man loop huis toe.")).toBe("di man luəp ɦœys tu .");
4848
});
49+
// ⚠ WORD-FINAL ⟨c⟩ IS [k] — issue #757. The rule is "soft [s] BEFORE a front vowel", and word-finally
50+
// there is no following vowel, so the soft branch cannot apply. It used to, because the test was
51+
// `"eiyêéè".includes(w[i + 1] ?? "")` and `includes("")` is TRUE: franc→frans, arc→ars.
52+
// ⚠ THE REFEREE CANNOT ADJUDICATE THIS, though not for the reason first written here. af.wiktionary-af
53+
// .tsv DOES hold one word-final ⟨c⟩ — the letter name `C → sɪə` — and eval.ts feeds af through
54+
// phonemizeWord directly, so that entry does reach this branch. It simply misses BOTH ways (s, then k,
55+
// against sɪə), which is why the folded backbone is unmoved at 1658/2220. Single letters are not
56+
// spelled out by the g2p at all — `B → p` likewise — see issue #761.
57+
test("a word-final ⟨c⟩ is [k], not the soft [s]", () => {
58+
expect(phonemizeWord("franc")).toBe("frank");
59+
expect(phonemizeWord("arc")).toBe("ark");
60+
expect(phonemizeWord("bloc")).toBe("blɔk");
61+
expect(phonemizeWord("cent")).toBe("sɛnt"); // …and ⟨c⟩ BEFORE a front vowel is still soft
62+
});
63+
4964
});
5065

5166
// TEXT NORMALIZATION (src/languages/afrikaans/normalize.ts) — the pre-tokenizer pass. The
@@ -194,16 +209,5 @@ describe("Afrikaans text normalization", () => {
194209
expect(MANIFEST.morphology.prefixUnstressed.length).toBeGreaterThan(0); // and the scan found something
195210
});
196211

197-
// ⚠ WORD-FINAL ⟨c⟩ IS [k] — issue #757. The rule is "soft [s] BEFORE a front vowel", and word-finally
198-
// there is no following vowel, so the soft branch cannot apply. It used to, because the test was
199-
// `"eiyêéè".includes(w[i + 1] ?? "")` and `includes("")` is TRUE: franc→frans, arc→ars.
200-
// ⚠ NOT REFEREE-CONFIRMED — af.wiktionary-af.tsv contains no word-final ⟨c⟩ at all (its only ⟨c⟩
201-
// entries are surnames and the letter name C→sɪə). These pin the rule being self-consistent.
202-
test("a word-final ⟨c⟩ is [k], not the soft [s]", () => {
203-
expect(phonemizeWord("franc")).toBe("frank");
204-
expect(phonemizeWord("arc")).toBe("ark");
205-
expect(phonemizeWord("bloc")).toBe("blɔk");
206-
expect(phonemizeWord("cent")).toBe("sɛnt"); // …and ⟨c⟩ BEFORE a front vowel is still soft
207-
});
208212

209213
});

0 commit comments

Comments
 (0)