WORDWARD INDONESIAN VOCABULARY V1
Prepared 2026-10-25. Staged data only; no language registration or gameplay tests.

ORIGINAL SOURCE
Project: hunspell-id / Kamus Indonesia
https://github.com/shuLhan/hunspell-id
https://kilabit.info/project/hunspell-id
Mirror: https://github.com/LibreOffice/dictionaries
Pinned mirror commit: 67032ee957631908098a72edf48dc81cac27e369
Directory: id/
Download base:
https://raw.githubusercontent.com/LibreOffice/dictionaries/67032ee957631908098a72edf48dc81cac27e369/id/

Original bytes retained without edits:
id_ID.dic        453700 bytes  775ff17a52801f3d2ee80120952fb44cc9bac6c3cf61740de775e439851a5803
id_ID.aff         15274 bytes  c625d5b237a489c452cf1f9c666600103e8093667dff89e7030a24217995dc79
README-dict.adoc   4065 bytes  7c18fabf4169a4b7f0f7effac5309c26294d8cb354d9ed5cbc8ea2868abcf942
LICENSE-dict       7652 bytes  97628afebc60f026f5c2b25d7491c46a5c4ee61f693e7cfa07fbd2c03605979b

COPYING-GPL-3.txt is the unmodified GNU GPL v3 incorporated by LGPL v3:
https://www.gnu.org/licenses/gpl-3.0.txt
35149 bytes; SHA256 3972dc9744f6499f0f9b2dbf76696f2ae7ad8af9b23dde66d6af86c9dfb36986

LICENSE AND ATTRIBUTION
Copyright (C) 2004-2022 hunspell-id Authors. The supplied README preserves
contributor names and the history of Benitius Brevoort's Kamus Indonesia.
The current affix SPDX header states LGPL-3.0-only. README prose offers LGPL
version 3 or later with an OpenSSL exemption, while its footer says version 3
only. This derived word data is offered under version 3, which all those current
notices permit. The original historical GPL comments are preserved, not erased
or described as a new project license. LICENSE-dict contains LGPL v3; the full
GPL v3 text it incorporates is also supplied. No thesaurus or hyphenation files
were imported. See ../word-list-id-license.txt for the public bundled notice.

REPRODUCTION (OFFLINE)
From the root containing assets/, scripts/ and src/:
  python scripts/build-indonesian-words.py
  python assets/indonesian-source/verify-expansion.py
  python assets/indonesian-source/verify-supplement.py

The first command uses only Python's standard library and checks exact source
hashes before writing output. Do not run Python with -O: validation assertions
must be active. The second command requires existing spylls 0.1.7 and wordfreq
3.1.1 QA installs. In the current workspace these are .qa/german/python and
.qa/simulation-python; it finds them in an ancestor project. It does not install
dependencies or write into live language assets outside its own staged root.

TRANSFORMATION
Decode the dictionary and affix file as their declared ISO8859-1. Parse long
two-character flags, trailing comments, 86 prefix groups / 259 prefix rules and
75 suffix groups / 117 suffix rules. All 161 groups allow cross-products.
Respect NEEDAFFIX A2 on roots and CIRCUMFIX A1 on paired prefixes and suffixes.
Follow inner suffix continuation classes to one outer suffix and to permitted
prefixes. The prefix continuations in this pin contain only the circumfix mark;
the suffix graph has no path to a third suffix. Both facts are asserted.
Only nonshrinking rules occur; assert this before pruning roots over 7 letters.
Plain roots are not emitted when marked NEEDAFFIX. A circumfix half is not
emitted without its matching half. Empty-addition suffix Bb is meaningful.

Include only whole lower-case ASCII source words and their licensed affixed
forms, 3-7 letters. Do not join spaces, punctuation or hyphenated reduplication.
Do not turn uppercase proper-name roots or acronyms into lowercase words.
NFC plus ASCII a-z -> A-Z is the puzzle normalization; unsupported foreign
letters remain unsupported. In particular, sharp S, dotless i and long s are
not expanded into ordinary ASCII. Keep one canonical puzzle identity per word.
accepted-forms-id.tsv records every emitted spelling, its source root, and an
affix rule/line derivation or explicit supplemental reference IDs. An explicit source headword is preferred where a
word also has a derived path. The browser guessing asset is ../words-id.txt.

SOURCE DEFECTS PRESERVED, NOT SILENTLY REPAIRED
The source has undeclared flags including Q0 on 21 rows and several probable
case/letter typos. build-verification.json enumerates every affected entry and
all flag counts. An undeclared flag has no effect, as in the independent
spellchecker; guessed replacement rules were not invented. Capitalized names,
phrases, hyphenated forms and one visibly misencoded non-ASCII entry are excluded
by the explicit source-spelling policy. A focused gap audit found seven useful
ordinary forms missing from that spelling source. reviewed-additions-id.tsv
adds them individually as guesses with official dictionary or exact usage
evidence in supplement-references.json: akhiri, hubungi, lupakan, sarapan,
seputar, dugaan and colloquial nonton. Trio was checked and already works in
the original source. No general affix rule was invented
and no upstream file was altered. These Wordward additions are offered under
LGPL v3; cited websites retain their own rights. No definitions, full entries,
book text or source website content are redistributed. The seven spellings
and review summaries are explicitly authored selections, not a bulk KBBI list.
See source-gap-audit.md for evidence, coverage limits and excluded candidates.
This is not a claim to contain every modern Indonesian word or that every
obscure source form is suitable for a puzzle answer.

ANSWER SELECTION
answers-id.tsv is the authoritative explicit selection, containing original
spellings, editorial English glosses, categories and review notes. It is never
generated from a frequency threshold, first-N cut or answer-count target.
selection-review.json adds the actual source root/rule proof for every answer.
There are 1,197 answers: 94 of length 3; 272 of length 4; 337 of length 5;
268 of length 6; 226 of length 7. The broad accepted dictionary has 30,619 words:
697 / 2,788 / 7,999 / 8,512 / 10,623 respectively (30,612 source forms plus
seven individually reviewed additions). Those are measured outcomes,
not quotas. See answer-selection-notes.md for editorial choices and limitations.

VALIDATION AND SCOPE
Every one of the 30,612 expanded original source spellings was checked by spylls 0.1.7,
a separate reverse-analysis Hunspell implementation: zero rejected forms.
All 9,355 lower-case ASCII 3-7 letter entries in wordfreq small_id outside our
expansion were independently checked: zero accepted forms missing. This tests
faithfulness to the source on that corpus and targeted controls, not ordinary
language completeness. All seven separately supplemented spellings are rejected
by that source and Spylls; primary language references support them instead.
verify-supplement.py reports this expected disagreement separately, checks all
nine requested ordinary-form probes, verifies exact serialized source/supplement
membership, and demonstrates failure when the supplement or any one addition
is removed. It also rejects missing/unrelated evidence and invalid spellings.

The instrument's positive/negative controls and deliberately faulty builders
are recorded in expansion-verification.json. Ignoring CIRCUMFIX introduced
2,545 independently rejected forms. Ignoring NEEDAFFIX introduced eight.
Ignoring the second suffix lost two valid forms; ignoring prefix continuations
lost 117, including berlari and bertemu. Source corruption, changed affix schema,
broken long flags, duplicate/unattested answers, empty decks, Unicode expansion,
and joined punctuation are all rejected by targeted controls.

Small_id is independent familiarity evidence, never native review. Its 31,188
entries include mixed genres, names and borrowed text; large_id is unavailable.
All selected answers occur in small_id; minimum observed Zipf is 3.31. This does
not calibrate player skill or establish cultural familiarity. See the separate
QA source attribution and honest caveats in expansion-verification.json.

Native-speaker vocabulary review, Indonesian UI/input validation and gameplay
simulation are not part of this staged asset task and remain unverified here.

LIVE INTEGRATION VALIDATION (2026-10-25)
The subsequent local integration completed UI/input and deterministic gameplay
checks, separate from the staged asset checks above. Evidence is retained in
.qa/language-expansion/: 211 automated tests passed with no skips; seven injected
runtime faults were detected after positive controls. The Indonesian simulation
completed 120 runs across 15 dates, two personas and four skill profiles, plus
600 isolated word trials: 29,558 actions, 1,360 exact restores and no caps or
stalls. Independent report auditing passed. All 144 baseline runs for the six
previous languages retained exactly the same gameplay records.

The recorded browser route replayed 179 accepted actions and four rejected
inputs, covering all 49 enemy/move combinations, five bosses, nine item uses,
five rolls and banking 375. Separate checks exercised death, reload, language
switch isolation and six phone/tablet/desktop viewport sizes. Evidence includes
id-browser-recording.json, id-browser-audit/, id-browser-checks.json,
id-death-checks.json and id-language-switch.json. These are synthetic checks,
not native-speaker playtests or evidence of calibrated human skill prediction.
Native-speaker review and real-device input review remain pending. Known source
coverage gaps remain documented; no difficulty or damage tuning was inferred
from the simulation alone.

PRIMARY REFERENCES
Hunspell affix/continuation/CIRCUMFIX/NEEDAFFIX semantics:
https://github.com/hunspell/hunspell/blob/master/man/hunspell.5
Official EYD alphabet (26 letters):
https://ejaan.kemendikdasmen.go.id/eyd/penggunaan-huruf/huruf-abjad/
Independent Spylls implementation:
https://github.com/zverok/spylls
Independent wordfreq corpus:
https://github.com/rspeer/wordfreq
