Failure gallery
Words this implementation gets wrong, with the failure mode. The gallery recomputes every entry against the shipped dictionary on load, so an entry that has quietly started passing shows up as such instead of hiding.
- beruanggenuine ambiguityreturns beruangshould be beruangvalid readings beruang, ruang, uang
Two roots are equally valid: the root beruang, or ber- + uang. The algorithm stops at the first dictionary lookup and never sees the alternative. The error is not the answer, it is the silence.
- mengupasgenuine ambiguityreturns upasshould be kupasvalid readings kupas, upas
Aturan 17 has two readings, meng- + upas and meng- + kupas, and both are in the dictionary. The first wins because it comes first, not because it is more correct.
- berapaover-stemmingreturns apashould be berapa
berapa is a root, but it is missing from the shipped dictionary. The berV rule then strips ber- and finds apa, which happens to be there. A dictionary gap wearing the costume of a rule success.
- menyanyiunder-stemmingreturns menyanyishould be nyanyi
The correct analysis is me- + nyanyi, but aturan 18 reads meny- as an s that assimilated and produces sanyi. The root nyanyi is in the dictionary and still is not reached: the rule set cannot express that reading.
- bertemuwrong analysisreturns bertemushould be temu
Inflectional removal is greedy: -mu goes first as a possessive, leaving berte, and the algorithm never returns to try without it. Adding a backtrack here would fix the answer — and would be a rule we invented.
- terpercayaunder-stemmingreturns terpercayashould be percaya
No ter- rule fires: aturan 8 excludes P = er and aturan 7 requires a vowel after er, so the word comes back untouched. See data/rules/GAPS.md.