Skip to content

Release 7.50.0a1 - #768

Open
github-actions[bot] wants to merge 184 commits into
masterfrom
release-7.50.0a1
Open

Release 7.50.0a1#768
github-actions[bot] wants to merge 184 commits into
masterfrom
release-7.50.0a1

Conversation

@github-actions

@github-actions github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown

Human review requested!

JarbasAl and others added 30 commits July 16, 2026 23:20
* Update kab.json

Add post-sonorant occlusivization blocking rules for /k/ and /ɡ/

* kab: rework k/ɡ spirantization, fix Bedar et al. citation

kab: rework k/ɡ spirantization, fix Bedar et al. citation

- Remove KAB_SPIRANT_K_ALT and the [ʃ] allophone of /k/: the k→ʃ
  value is Riffian-only in Kossmann & Stroomer (1997) p.469 and never
  occurs in Kabyle (native-speaker verified).
- Replace the 7 sonorant-specific blocking rules (K/G_AFTER_R/L/N/M)
  with generalized KAB_BLOCK_SPIRANT_K_AFTER_CONSONANT and
  KAB_BLOCK_SPIRANT_G_AFTER_CONSONANT: /k/→[ç] and /ɡ/→[ʝ] only
  post-vocalically and word-initially; stops after any consonant.
  Exception kept: /ɡ/ stays [ʝ] after /m/ (/mʝ/→[mʝ], Bedar, Quellec
  & Tifrit 2022). Contexts cover all singleton + geminate consonants.

* kab: drop t-before-i block, restore anta example, add 6 sources

kab: drop t-before-i block, restore anta example, add 6 sources

- Remove KAB_BLOCK_SPIRANT_T_BEFORE_I: speaker re-verification
  (2026-07-17) confirms word-initial /t/ is always [θ] before /i/
  (tifinaɣ, tilufa, tilelli, tikwal) — the 2026-07-16 table stands.
  24 → 23 allophone rules.
- Restore anta as the T_AFTER_N example with corrected gloss: native
  Kabyle 'which one (f.)' (feminine of anwa), not the Arabic pronoun —
  only the old gloss was wrong.
- Sources 6 → 12: add Chaker 1996 (INALCO notation), Mammeri 1976,
  Souag 2019, Wang 2020 (McGill Working Papers — corrects a
  miscitation), the 2026-07 native-speaker verification record, and
  the 2026-07-17 corpus audit. Notes now list the pending speaker
  checks (intervocalic -ti-; askar/sk schwa question).

Engine-verified on orthography2ipa 7.30.0a3 (fork): all outputs match
predictions.

* kab: realize /ɣ/ as uvular [ʁ] by default

kab: realize /ɣ/ as uvular [ʁ] by default

Source check (Kabyle consonant chart: ɣ in the uvular column as [ʁ];
IPA [ʁ] article's word-final Kabyle example bbeɣ → [bːəʁ]; no
word-final devoicing documented for Kabyle): add
KAB_GH_UVULAR_REALIZATION and its geminate counterpart so /ɣ/ surfaces
as [ʁ] in all positions. Underlying phoneme and rule contexts
unchanged; broad [ɣ] retained as documented variant. 23 → 25 rules.

* Improving kabyle

* Improving kabyle specs

* Improved kabyle specs

* Improved kabyle specs - json format
…greement boards (#636)

The scoreboard now carries 553 rows across every gold set the engine
ships, up from 467: the languages added since the last regeneration are
scored, cmudict and the Arabic diacritized set included. The espeak
board gains en-US and splits the single pt row into the five Portuguese
lects.
…d a stale regression baseline (#637)

* fix(kab): validate against the schema, and re-pin the gold to the sourced rules

The Kabyle spec carried a 'type' key on seven sources[] entries. The
schema's SourceModel is strict and has no such field, so every spec
validation failed; the provenance claim now opens each source's notes,
which the model does define.

The spec's rules are better sourced than the expectations they broke:
/ʝ/ occlusivizes after r, l, n but not after m (bedar_quellec_tifrit_2022
on Chemini Kabyle), so argaz keeps its stop; the /k/ -> [ʃ] rule was
Kossmann & Stroomer's RIFFIAN illustration and its removal makes amek
agree with its own cited note ([ç]); and /ɣ/ is the uvular [ʁ] in every
position. The tests now assert the sourced behaviour on both sides of
the blocking context, the twenty gold rows are re-pinned, and the notes
that still described the old realizations are corrected.

The velar_fricative tag accepts either realization of the one phoneme,
and kab-004 drops a spirantization tag its transcription no longer earns
(fourteen other rows carry the feature).

* fix(ci): install the Portuguese syllabifier in the test environment

The gold sets and benchmark baselines pin engine output produced with
the silabificador plugin loaded, but the plugin lived only in the
'portuguese' extra while build-tests, coverage and the benchmark gate
all install '.[test]'. Without it the syllabifier falls back and stress
lands elsewhere, so twenty Portuguese gold rows across fourteen lects
failed in CI while passing locally for anyone who had the plugin
installed.

* fix(ci): refresh the benchmark regression baseline

The sample baseline had not been refreshed since #361, so it covered 206
of the 551 rows the engine now scores and measured dev's whole
accumulated drift rather than a PR's own effect. Every PR since — #614
among them — met a red gate and merged through it, which is what a
baseline this old makes inevitable.

Rescored at the same uniform limit: 56 rows improve beyond epsilon
(ms/ipadict 0.5509 -> 0.0751, kab/vox_communis 0.3711 -> 0.2242,
eu/wikipron 0.0640 -> 0.0227) and 8 worsen. The 8 are listed in the PR
so they stay visible rather than folding silently into a new baseline;
ca-x-balear/4catac and pt-PT-x-porto/ep_dialects are the two worth a
look, both expert-human golds moved by the Iberian vocalism work.
Expose the prosodic-clitic test as module-level orthography2ipa.stress
functions so the engine and any downstream assembler place word stress
from one shared definition of stress.cliticless_words. G2P._is_cliticless
delegates to them; behaviour is unchanged.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
A bare region tag whose specs are all sub-regional had no exact match, so
nearest-language fallback picked whichever private-use sibling sorted
first: ar-SA resolved to ar-SA-x-dawasir. A dialect named in a private-use
subtag was invisible to tag distance, so ar-x-najdi fell through to ar.

Add a curated region-default table (ar-SA -> ar-SA-x-najd) alongside the
bare-primary defaults, and private-use dialect aliases (ar-x-najdi ->
ar-SA-x-najd, ar-x-hejazi -> ar-SA-x-hejaz). The Saudi default is an
explicit editorial convention — Najdi is the capital region's variety and
the most widely spoken (Ingham 1994) — not a claim in the spec data that
Saudi Arabic is Najdi. Unmatched Arabic tags still fall back to the ar
(MSA) leaf.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
The grapheme→IPA front-end runs once per utterance before synthesis, so
per-sentence latency is what matters. Profiling the transcribe path showed
two pure redundancies over immutable spec data:

- transcribe_word ran the pronunciation beam, then rebuilt a nearly
  identical rules-only lattice via ipa_lattice purely to read the
  confidence score.
- syllabification (the silabificador plugin) was recomputed several times
  per word — stress detection and the lattice each asked for it — and again
  for every repeat of a function word.

Memoize both per engine, keyed only on the word and this engine's fixed
stress spec. Neither consults the runtime-mutable lexicon, so a fresh
engine gets fresh caches and results are byte-identical. Real speech
repeats function words heavily, so the hit rate is high.

Steady-state per-utterance latency drops ~2-2.6x across en-GB, pt-PT,
es-ES and ar (pt-PT p99 7.2ms -> 3.4ms). Output — IPA and confidence,
greedy and beam — is byte-identical across an 8-language differential, and
the full suite passes unchanged. benchmarks/latency.py is the repro.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…#654)

* feat: add gaa, ada, gen, aja language specs

Ga, Dangme/Adangme, Gen (Mina) and Aja — Ghana/Togo Kwa and Gbe
languages. Research-tier grapheme/allophone inventories cited to
Wikipedia and published phonological descriptions (Kropp Dakubu 1999,
Apronti 1967); gen/aja pull their allophone stratum from the closely
related Ewe (`ee`) spec via allophones_base.

* feat: add tw, fat Akan-variety language specs

Twi and Fante as individual-language codes inheriting the shared
Akan (`ak`) grapheme table via graphemes_base/allophones_base; fat
overrides Fante's distinguishing affricate contrast (ts/dz/z) and
labial-palatalised digraphs (tw/dw/hw). Pins the two individual
codes in registry.py's alias table (same fix already applied to
bxr/diq) since langcodes' macro=True standardisation otherwise
collapses them into the ak macrolanguage. Refreshes the Glottolog
level snapshot for the five new glottolog_code values and adds
cited family-level test cases for all six new specs.
…ulde specs (#655)

* feat: add Serer (srr) language spec

Northern Atlantic (Senegambian) branch of Atlantic-Congo. Cited to
Wikipedia and McLaughlin (2000); quality: research.

* feat: add Soninke (snk) language spec

Soninke-Bozo branch of Mande. Cited to Wikipedia and Creissels (2016);
quality: research.

* feat: add Susu (sus) language spec

Susu-Yalunka branch of Central Mande. Cited to Wikipedia and Houis
(1963); quality: research.

* feat: add Mende (men) language spec

Southwestern Mande. Cited to Wikipedia and Innes (1969); quality:
research.

* feat: add Temne (tem) language spec

Mel branch of Atlantic-Congo. Cited to Wikipedia and Wilson (1961);
quality: research.

* feat: add Pular (fuf) and Nigerian Fulfulde (fuv) language specs

Both wired as parent_dialect children of ff via graphemes_base/parent,
since neither source consulted documents a Fula-variety-specific
grapheme or allophone divergence. Cited to Wikipedia and Arnott
(1970); quality: research.

* test: add cited-rule tests for the new Atlantic and Mande specs

One test per key cited claim (srr vowel length + implosives, snk vowel
length + affricate, sus/men labiovelars, men affricate vs. sus glide,
tem dental/alveolar contrast, fuf/fuv ff inheritance) on real words.

* fix(data): correct citation-validation findings for sus and tem specs

- sus.json: Wikipedia's Susu phoneme table (fetched) explicitly states
  nasal vowels are spelled as vowel+n digraphs (in/un/en/on/ɛn/ɔn/an);
  the previous notes claimed this was unconfirmed and omitted the
  graphemes. Add the seven nasal-vowel graphemes/allophones and fix the
  notes to cite the confirmed spelling convention.
- tem.json: add Kanu & Tucker (2010) JIPA "Illustrations of the IPA"
  as the primary fetched source, confirming the 9-vowel inventory and
  the dental/alveolar ⟨th⟩=/t̪/ vs ⟨t⟩=/t/ contrast, and clarifying that
  /tʃ/, /ʃ/, /w/ are dialectal variants rather than independently
  spelled phonemes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
The README and several docs quoted a fixed 676 languages / 749 spec
files figure. Running available_codes() against the current data now
gives 820 languages and 909 entries including classification-only
clade nodes, and that count changes as specs are added.

Rather than hardcode a new snapshot that will drift the same way,
each mention now points at the one-line command a reader can run to
get the live count: available_codes() and
available_codes(include_clades=True).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* feat: add Sasak, Rejang, Pijin language specs

Research-grounded Latin-orthography specs for Sasak (sas, Lombok),
Rejang (rej, Sumatra) and Pijin (pis, Solomon Islands), each cited
against Wikipedia and published grammars/phonology sources.

* feat: add Avestan spec and Sogdian/Khotanese/Parthian stubs

Avestan (ae) is scored in the standard Hoffmann scholarly
transliteration of the native Avestan script, following the akk.json/
pal.json precedent for ancient languages with non-Latin scripts.

Sogdian (sog), Khotanese (kho) and Parthian (xpr) are added as honest
stubs with full metadata and empty graphemes: each survives in
multiple divergent script/transliteration traditions with no single
citable letter-to-IPA table, so no inventory is asserted.

* fix(data): validate sas/rej/pis/ae specs against fetched primary sources

- sas.json: add Archangeli/Tanashur/Yip (2020) JIPA Illustration of the
  Meno-Mene dialect as primary source; model word-final <q> = /ʔ/ as a
  positional_graphemes rule (directly attested in the JIPA word list);
  clarify the 6-vowel (JIPA fieldwork) vs 8-vowel (Wikipedia, other
  dialects) vowel-count discrepancy in notes.
- rej.json: add fetched Omniglot citation; model word-final <k> = [ʔ]
  as a positional_graphemes rule ("K is pronounced [ʔ] at the end of
  words" - Omniglot); leave <q> unmodelled since no IPA value is
  confidently sourced for it.
- pis.json: remove unsupported <y> = /j/ grapheme (Wikipedia's Pijin
  alphabet excludes y; search evidence points to <i> being used
  instead, e.g. "iu" for "you"); fix notes claim that both voiceless
  and voiced English th merge with /t/ - fetched Wikipedia source shows
  voiceless th merges with /s/ (maos "mouth"), only voiced th merges
  with /t/ (brata "brother"); add sh/z merger details.
- ae.json: add Skjaervo (2007) "Old Iranian" chapter (fetched directly,
  PDF) as the actually-verified primary source after the Encyclopaedia
  Iranica articles by the same author returned HTTP 403 on every fetch
  attempt; cross-checked the full Hoffmann transliteration letter set
  against Skjaervo's own alphabet/vowel/consonant tables - no mapping
  corrections were needed, all graphemes confirmed.

All four specs pass the full test suite (1208 passed, 2 pre-existing
xfails unrelated to these files) and the derivable-key/positional-key
audits from SKILLS.md.
…drift (#670)

The CUNY-CL/wikipron Welsh scrape changed upstream (897 -> 894 entries),
shifting the sampled gold set and its PER (0.2175 -> 0.2297) with no code
or spec change in this repo — verified by bisecting dev back past all of
today's data merges and the #645 caching merge, which all score
identically. Rebuild the single (cy, wikipron) row with the same
build_scoreboard code path (bootstrap CI included), following the stale
baseline precedent of #637.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
JarbasAl and others added 30 commits August 3, 2026 14:17
…#751)

Awadhi (awa), Dargwa (dar), Dzongkha (dz), Gilaki (glk), Kwanyama (kj),
Northern Luri (lrc), Mazanderani (mzn), Southern Kurdish (sdh), Tswana (tn)
and Uyghur (ug) move from empty-graphemes REGISTRY STUB to cited
grapheme/allophone maps at skeleton or research tier. Uyghur and Dzongkha
register their WikiPron gold (uig_arab_broad.tsv, dzo_tibt_broad.tsv) in
scripts/benchmark.py and record PER in benchmarks/results.json /
docs/scoreboard.md.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Citation-verifies 9 skeleton-tier specs that already had a registered
gold row (per docs/quality_tiers.md's research-tier criteria) but were
missing a stress block/exemption and a real (non-placeholder) source:
crk, rw, cic, lut, klj, gml, dum, wlm, mga.

- crk (Plains Cree): added Wolfart 1996 (Sketch of Cree, Handbook of
  North American Indians vol. 17) and a documented stress rule
  (default_position=-3, antepenultimate for 3+ syllable words); Wolfart
  also documents a disyllabic exception (final stress) the schema
  cannot express in one rule, so it is left as a documented gap rather
  than silently wrong. Grapheme table checked, no discrepancy found.
- rw (Kinyarwanda): added Kimenyi 1980 (A Relational Grammar of
  Kinyarwanda) and a cited stress EXEMPTION -- Kinyarwanda is a Bantu
  tone language, not a stress language; word-level prominence is
  predictable but tone itself (already noted as unmarked in the
  orthography) is out of the `stress` schema's scope. Grapheme table
  checked, no discrepancy found.
- cic (Chickasaw): added Munro & Willmond 1994 (Chickasaw: An
  Analytical Dictionary) and a weight-sensitive `stress` block
  (quantity_sensitive=true, default_position=-2 approximating the
  rightmost-heavy-syllable rule, which the schema cannot express
  exactly). Required whitelisting `cic` in
  tests/test_stress_weight.py::test_the_arabic_specs_opt_in alongside
  the existing idb precedent, with the same citation-backed
  justification. Grapheme table checked, no discrepancy found.
- lut (Lushootseed): added Bates, Hess & Hilbert 1994 (Lushootseed
  Dictionary) and a stress rule (default_position=1, approximating
  "leftmost full/non-schwa vowel" for the Northern dialect this spec
  models; the schwa-skipping nuance is not expressible and is
  documented). Grapheme table checked, no discrepancy found.
- klj (Khalaj): added Doerfer 1988 (Grammatik des Chaladsch) and the
  Encyclopaedia Iranica Khalaj article, plus the standard pan-Turkic
  final-stress rule already used for this project's other Turkic
  specs. Grapheme table checked, no discrepancy found.
- gml (Middle Low German) / dum (Middle Dutch): added Lasch 1914
  (Mittelniederdeutsche Grammatik) / Van Loey 1976 (Middelnederlandse
  Spraakkunst II) and the shared West Germanic root-initial stress
  rule. While citing dum, found and fixed a discrepancy: `w` was
  mapped to [ʋ] (the MODERN Dutch labiodental value); Van Loey
  describes the medieval `w` as bilabial [w], with the labiodental
  shift a later development. Fixed to [w]; dum's wikipron PER improved
  0.3054 -> 0.2822 as a result, re-run and recorded in
  benchmarks/results.json and docs/scoreboard.md.
- wlm (Middle Welsh): added Evans 1964 (A Grammar of Middle Welsh) and
  the fixed-penultimate Brittonic stress rule. Grapheme table checked,
  no discrepancy found.
- mga (Middle Irish): added Thurneysen 1946 (A Grammar of Old Irish,
  already used for `sga` in wave 1) and the fixed word-initial Goidelic
  stress rule. Grapheme table checked, no discrepancy found.

Skipped this round: `ale` (Aleut) already carries a real Bergsland
1997 citation and meets every other research criterion, but its own
notes document that the registered NorthEuraLex gold does not match
the Bergsland practical orthography (different vowel-quality pattern,
combining-acute vs. circumflex, hyphenated citation forms) -- a prior
investigation already decided not to chase that mismatched gold, and
this wave respects that decision rather than re-litigating it.
Remaining 39 candidates in the fresh audit pool (skeleton + non-empty
graphemes + registered gold) were left for a future wave given this
round's scope.

All 9 promoted skeleton -> research; docs/scoreboard.md's quality-tier
column hand-updated for these rows (not regenerated, per wave-1
precedent), plus dum's PER/CI/exact_match re-run and updated by
directly invoking scripts/benchmark.py's per-language evaluation path
(not --scoreboard/--ci-sample).

Authorship: Claude Sonnet, orchestrated by Fable, per repo AGENTS.md.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Adds mutates_neighbor/mutates_neighbor_side to AllophoneRule: a marker
grapheme (e.g. a Goidelic slender vowel letter) can now delete its own
slot while atomically palatalizing (or otherwise mutating) an adjacent
slot -- a capability the existing phoneme->surface allophone_rules
vocabulary could not express (surface only rewrites the rule's OWN
matched phoneme). Generic and language-agnostic: no language names in
allophony.py; applies to any marker-grapheme phenomenon (Goidelic
slender/broad marking, Slavic/Cyrillic soft-sign palatalization, similar
Uralic conventions).

Threaded through types.py (validation), schema.py (pydantic model),
json_loader.py (loading), data/SCHEMA.md and docs/allophony.md ("Marker
graphemes" section, worked example, honest benchmark delta).

Applied to gv (Manx) for the two vestigial slender-marking environments
Broderick 1984-86 / Thomson 1992 describe: word-final -in/-en
(GV_SLENDER_FINAL_N) and onset consonant+vowel (GV_SLENDER_ONSET_CONSONANT),
fixing the two examples issue #743 cited directly: giare -> [ɡʲɛːr],
dowin -> [daunʲ]. Measured gv WikiPron PER: 0.3650 -> 0.3630 (n=690).

Adversarial synthetic-spec mechanism tests (test_allophone_mutates_neighbor.py)
plus real-language pin tests (test_manx_slender_marking.py). Full suite
green (196313 passed, 5 skipped, 136 xfailed): zero behaviour change for
every spec that does not declare mutates_neighbor.

Authorship note: implemented by Claude Sonnet under Fable orchestration.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Manx (gv): GV_SLENDER_FINAL_N marker rule now surfaces "ə" instead of
deleting the vowel outright -- WikiPron gold shows the dominant realisation
of word-final -in/-ein/-ain as an epenthetic schwa before the palatalised n
(Mannin [manənʲ], aalin [ɛːlinʲ], aynin [unənʲ], etc; Broderick 1984-86;
Thomson 1992). A documented minority (dowin [daunʲ], ain [ain]) keeps no
schwa and is left undecoded per the honesty rule. gv PER 0.3630 -> 0.3623.

Wave 2, ranked by descending PER among research-tier rows (excluding
languages fixed in prior waves):

- ee (Ewe): orthographic <w> spells the velar approximant /ɰ/, not /w| --
  100% of WikiPron tokens containing <w> confirm this (Ansre 1961; Duthie
  1996). PER 0.4824 -> 0.4687.
- pjt (Pitjantjatjara): the three-vowel system a/i/u (long aa/ii/uu)
  surfaces as the lowered/centralised allophones [ɐ]/[ɪ]/[ʊ]
  ([ɐː]/[ɪː]/[ʊː]), not cardinal [a]/[i]/[u], per the WikiPron gold and
  Wati-subgroup phonology (Goddard 1985). PER 0.4846 -> 0.0027.

Convention-mismatch / structural findings documented, not chased (honesty
rule): dz (Tibetan-script stacking/silent-prefix system needs a new
engine capability, not a rule tweak); nrf (Jerriais word-final vowel/
consonant elision system, non-trivial, gold itself inconsistent on some
forms); guw (Gbe tone is not written in the source orthography at all --
unrecoverable from spelling); mga (Middle Irish single/double intervocalic
consonant lenition system -- same scale of change as a new engine
capability); mh (spec targets the "old" Marshallese orthography -- n/ ll dl
m. with dot-below/tilde diacritics -- while WikiPron gold uses the "new"
orthography's macron/cedilla diacritics (n-, l,, o,) -- a genuine
orthography-variant mismatch, not a bug); ki, zu (dominant error is
unwritten tone/downstep in the standard orthography, an inherent gap not a
spec defect).

Full suite green (196513 passed, 5 skipped, 136 xfailed).

Authorship: Claude Sonnet under Fable orchestration.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Citation-verifies 6 more skeleton-tier specs from the fresh 37-candidate
pool (skeleton + non-empty graphemes + registered gold, per
docs/quality_tiers.md's research-tier criteria): kru, bbl, kwk, srs,
kld, bdq. Each already had a real Wikipedia orthography source; the gap
was a primary reference grammar/dictionary and a cited stress
block/exemption.

- kru (Kurukh): added Winfield 1928 (A Grammar of the Kurux Language).
  Grapheme table (Devanagari retroflex/aspirate/nasal series, nuqta
  letters) checked: no discrepancy found. Descriptive phonological work
  reports Kurukh word accent as weak and variable across syllables
  rather than a fixed positional rule, so no `stress` block is added
  (documented exemption) rather than encoding a guess.
- bbl (Bats/Tsova-Tush): added Holisky & Gagua 1994 (Tsova-Tush
  (Batsbi), in Smeets ed., Indigenous Languages of the Caucasus vol.
  4). Grapheme table (Georgian ejective series, added letters) checked:
  no discrepancy found. Added a cited stress rule (default_position=1)
  approximating the documented initial-syllable tendency;
  morphologically-conditioned shifts are a documented gap.
- kwk (Kwak'wala): added Boas 1947 (Kwakiutl Grammar, Transactions of
  the American Philosophical Society 37(3)). Grapheme table
  (labialized/lateral/affricate series) checked: no discrepancy found.
  Stress is quantity-sensitive and, in current analyses, phrasal rather
  than a fixed word position (Boas 1947; Elfner 2024), which this
  project's positional `stress` schema cannot express without a
  syllable-weight primitive, so no `stress` block is added (documented
  exemption).
- srs (Sarsi/Tsuut'ina): added Cook 1984 (A Sarcee Grammar). Grapheme
  table (lateral/ejective/affricate series) checked: no discrepancy
  found. Tsuut'ina is a tone language (Cook 1984; reported as a
  three-way H/M/L system in later work), not a stress language, and
  tone is not consistently marked in the mapped orthography, so no
  `stress` block is added (documented exemption).
- kld (Gamilaraay): added Austin 1993 (A Reference Grammar of
  Gamilaraay, Northern New South Wales). Grapheme table (stop series,
  retroflex r, digraph values) checked: no discrepancy found. Added a
  cited stress rule (default_position=1): word-initial primary stress,
  the typologically regular Pama-Nyungan pattern.
- bdq (Bahnar): added Banker & Banker 1979 (Bahnar Dictionary,
  Bahnar-Vietnamese-English, SIL). Grapheme table (Vietnamese-style
  digraphs, implosives, vowel letters) checked: no discrepancy found.
  Added a cited stress rule (default_position=-1): Bahnaric
  sesquisyllabic words carry stress on the word-final main syllable;
  non-native disyllabic loans are a documented gap.

None of the six required a grapheme-table fix, so no PER numbers
changed; only each spec's `quality_tier` was hand-updated in
benchmarks/results.json and docs/scoreboard.md (not regenerated via
--scoreboard/--ci-sample), per wave-2 precedent. No CI-sample epsilon
concerns are expected since no PER value moved.

31 candidates remain in the fresh audit pool (skeleton + non-empty
graphemes + registered gold, missing a real source or stress
block/exemption) after this wave's 6 promotions, left for a future
wave. `tn` and `ale` were left untouched: `tn`'s only registered gold
row is a 0-entry stub-tier placeholder (no usable PER to certify a
promotion against), and `ale` carries a prior deliberate skeleton
decision (documented gold mismatch) that this wave respects rather
than re-litigating.

Authorship: Claude Sonnet, orchestrated by Fable, per repo AGENTS.md.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Gold-hunting wave 1: audited all 41 WOLD (World Loanword Database)
languages against the o2i spec registry. Gawwada, Iraqw, Seychelles
Creole and Tarifiyt Berber each have a non-empty grapheme table and no
existing gold anywhere in the registry; all four smoke-checked at
~100% non-empty engine coverage on a 150-row sample. Rows recorded in
benchmarks/results.json and docs/scoreboard.md, with the full audit
(what was already covered, what has no spec, what is stub-empty)
documented in docs/benchmarks.md.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* data: orthography wave 6 -- 10 registry stubs upgraded with cited orthographies

Cantonese (yue, Jyutping), Saraiki (skr, Shahmukhi) promoted to research tier
and wired to WikiPron gold (yue_latn_standard_broad, skr_arab_broad). Southern
Min (nan, POJ), Hakka (hak, Phåk-fa-sṳ), Wu (wuu, Wugniu), Eastern Min
(cdo, Bàng-uâ-cê), Gan (gan, Gan Wikipedia romanisation), Northern
Hindko (hno, Shahmukhi), Rohingya (rhg, RLC Latin alphabet) and Chittagonian
(ctg, Bengali script with cited divergent values) promoted to skeleton tier
with cited grapheme maps and documented tone/stress exemptions.

Co-Authored-By: Claude Sonnet 5 (Fable orchestration) <noreply@anthropic.com>

* fix: drop Sinitic base-spec romanization graphemes and the loanword yue gold

The five Han-script base specs (yue/nan/hak/wuu/cdo) must stay grapheme-
empty per the zh-Hani principle: a Han character encodes no sound, and
their romanizations already live in the dedicated -Latn-* script-variant
specs (which these divergent duplicate tables contradicted). gan's 'Gan
Wikipedia romanisation' is a wiki convention, not a citable standard.
The yue wikipron file was previously audited and rejected as English
loanword entries (PER 0.71 confirms); registration and rows removed.
Wave 6 keeps its four legitimate native-script languages: skr Saraiki
(Shahmukhi, wikipron research), hno Hindko, rhg Rohingya, ctg
Chittagonian.

---------

Co-authored-by: Claude Sonnet 5 (Fable orchestration) <noreply@anthropic.com>
Wires udm, ady, av, lbe, dar, lez, lv, smn, vep into
_NORTHEURALEX_LANGS: each had zero gold anywhere and a non-empty
grapheme table. Language-ID mappings were verified against NEL's own
cldf/languages.csv (not a naive ISO 639-3 lookup) -- av -> ava and
lv -> lav needed an explicit code translation, and dar was checked
against its glottocode (darg1241, "North-Central Dargwa") to confirm
it is the same Akusha-based literary standard the o2i dar spec
targets. All 9 passed a 100-sample smoke gate (100% non-empty output,
real per-language orthography in Value) before full-dataset scoring.

dar is promoted skeleton -> research: it already had sources and a
documented stress exemption, and now has a registered gold row
(1056 entries, PER 0.0833) to complete the tier's criteria. The other
8 languages were already labeled research pending exactly this gold
registration.

benchmarks/results.json and docs/scoreboard.md are hand-updated with
the new rows (full-dataset PER, no --scoreboard/--ci-sample rerun).

Authorship: Claude Sonnet, orchestrated by Fable (Anthropic).

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
…ve-speaker spot-checked (#767)

Registers Salesteq/arabic-dialects-gold20 (public HF dataset) at the
llm-generated provenance tier: semi-synthetic, authored by the same
Claude lineage that wrote o2i's Arabic dialect specs (near-circular —
the dataset carries an ipa_o2i draft column), spot-checked by a native
Arabic speaker, registered on explicit maintainer instruction because
for most of these 33 dialects no other gold exists. PERs 0.002-0.05 =
self-agreement, documented as such; no quality-tier promotion may rest
on these rows. Runtime fetch only, nothing vendored.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants