WORDWARD TURKISH VOCABULARY — DECK VERSION 1
2026-10-25

SOURCES AND LICENSES
TDD hunspell-tr v1.1.1, released 2023-12-30, is distributed under MPL 2.0.
Contributors: Ali Safaya, Arda Göktoğan, Deniz Yuret, Emirhan Kurtuluş, Taner Sezer.
Fixed upstream release commit:
https://github.com/tdd-ai/hunspell-tr/tree/7302eca5f3652fe7ae3d3ec06c44697c97342b4e
The included unmodified affix/dictionary/notice/license files were obtained from:
https://github.com/LibreOffice/dictionaries/tree/67032ee957631908098a72edf48dc81cac27e369/tr_TR
Direct downloads of upstream tr_TR.aff, tr_TR.dic and LICENSE were compared
byte-for-byte with the mirror; see upstream-mirror-verification.json.
The upstream README explains that its inputs include text corpora and dictionaries.
It is a spell-checking resource, not a curated everyday puzzle-answer deck.

The second independent resource is Zemberek's formal morphology and tagged
lexicon, distributed under Apache 2.0. Copyright 2018 Ahmet A. Akın and
Mehmet D. Akın; Python port Copyright 2020 Loodos.
Saved unmodified lexical source, fixed commit:
https://github.com/loodos/zemberek-python/blob/6ed4d5b4a4c353252be56d6b7e9a78578068983c/zemberek/resources/lexicon.csv
Saved as ZEMBEREK-lexicon.tsv because the source is tab-separated despite .csv.
SHA256 c41e9b6cbd37869b3c69e265976ce97770f588ff559681de56d5c2bddd9f692e.
Its only difference from the packaged lexicon is LF versus CRLF line endings;
normalizing the package's CRLF bytes to LF was checked to give the exact file.
Both original notices and the full Apache 2.0 text are retained here.

Optional independent checker: zemberek-python==0.2.3, published wheel
zemberek_python-0.2.3-py3-none-any.whl, SHA256
65c2cf482c2401ddf832be3ba6a4c202df36d1af2e1c5a31a77564e4f3b18785.
https://pypi.org/project/zemberek-python/0.2.3/
Dependencies used: numpy==1.26.4, antlr4-python3-runtime==4.8,
setuptools==80.10.2; Python 3.12. The package's aggregate .py manifest hash is
asserted by verify-morphology.py. Its deprecated pkg_resources warning is known;
it is confined to optional QA and is not a gameplay or normal-build dependency.
No Java runtime, network download or Python package is required by the normal build.

The generated word-data files preserve MPL-2.0 and Apache-2.0 attribution for
their respective sources. These terms do not change unrelated game-code licensing.
No definitions or another game's answer list were copied. The public notice is
assets/word-list-tr-license.txt. Source bytes and generator are saved alongside it.

WHY A SECOND WORD FILTER IS NECESSARY
TDD stores 75,909 compressed prefixes and 59,266 numeric suffix groups. Each
group has exactly one append rule, no stripping, cross-product N, and condition
dot. There are no empty suffix rules, continuation classes or prefix rules.
Its .dic roots are not reliable standalone words. For example, abac is a storage
fragment; Hunspell itself accepts it as a root, while abacı is a real word.
Many proper names are lowercased, so original-case filtering cannot solve that.

The builder expands the exact pinned schema and rejects unknown features,
flags, counts or hashes. It filters whole native-alphabet strings of 3–7 cells.
It never joins apostrophes, hyphens or multiword expressions. Expansion yields
235,727 candidates. Spylls independently accepts every candidate, proving the
compression expansion, but that alone does not prove word quality.

The second filter uses Zemberek's formal RuleBasedAnalyzer directly, without
unidentified-token guessing, informal morphotactics or ignore-diacritics mode.
A form must have a known, non-runtime, non-proper, non-abbreviation analysis with
the exact normalized surface and lowercase ordinary lemma. Name homonyms are
retained when an ordinary analysis exists: anne, deniz, ışık and kitap survive.
abac, ankara, mehmet and ahmet are explicit rejection controls. Formal analysis
does not mean a word is familiar, modern or suitable as an answer.

The filter keeps 177,971 original forms and rejects 57,756 candidates:
53,045 have no analysis and 4,711 have no permitted ordinary analysis.
Of 44,790 length-eligible stored roots, 17,608 fail this filter.
The explicit approved and rejected manifests and independent verification report
are saved. The normal stdlib builder re-expands the original source and verifies
the approved manifest is a subset with the exact independently recorded hashes.

BOUNDED SUPPLEMENT
Auditing the independent small_tr corpus identified 226 outside forms with
formal analyses. Many are joined phrases, colloquial spellings or bad entries
such as birşey/herşey, so the whole set is not treated as a valid supplement.
Twenty-one explicitly selected modern words/inflections are added separately in
reviewed-additions-tr.txt: blog, zombi, vegan, siber, hibrit and related ordinary
forms, along with laptop, toksik, tork and mod inflections. Each is attested by
the saved Zemberek lexical/morphological source and separately rechecked by its
formal analyzer; exact lemma IDs are in morphology-verification.json. These are
Apache-2.0 contributions, not fictional TDD attestations. They are not claimed
to have passed the TDD checker, whose omissions motivated this small supplement.

MATCHING, SPELLING AND COLLISIONS
The board uses 29 native Turkish letters:
A B C Ç D E F G Ğ H I İ J K L M N O Ö P R S Ş T U Ü V Y Z.
NFC is applied first. An explicit native-lowercase-to-uppercase table handles
i→İ and ı→I. Unsupported characters survive normalization and are rejected;
generic Unicode uppercasing must not turn ß, ſ or ﬀ into legal board letters.
Only the optional circumflex convention folds Â→A, Î→İ and Û→U. Native I/İ,
C/Ç, G/Ğ, O/Ö, S/Ş and U/Ü remain distinct. This is a puzzle convention, not a
claim that circumflexes are unnecessary in Turkish spelling.

Examples: ışık→IŞIK, iş→İŞ, sık→SIK, sik→SİK, kâğıt→KAĞIT,
millî→MİLLİ. Decomposed I plus dot and decomposed circumflex sequences are tested.
HÜKÛMET becomes HÜKUMET; the frequent spelling HÜKÜMET has a different native
vowel and is not silently treated as the same identity. I/İ frequency matching
must use the same policy as gameplay; default casefold/uppercase is unsuitable.

Correct selected display spellings are retained in the answer deck. TDD often
omits circumflexes, while the older Zemberek lexicon overuses historical ones
such as ilân, silâh and klâvye. Selection therefore prefers modern plain source
spellings unless the explicit reviewed display map retains a current accent
(KÂĞIT, HÂLÂ, HİKÂYE, RÜZGÂR, RESMÎ, etc.). This is an editorial pass, not a
completed native-speaker orthographic review.

Primary orthographic references consulted:
https://tdk.gov.tr/icerik/yazim-kurallari/ses-harf-ve-alfabe/
https://tdk.gov.tr/icerik/yazim-kurallari/duzeltme-isareti/
https://tdk.gov.tr/wp-content/uploads/2022/03/Hamza-Z%C3%BClfikar-_-YAZIDA-VE-S%C3%96YLEY%C4%B0%C5%9ETE-KARARSIZ-_-6.pdf
https://www.unicode.org/Public/UCD/latest/ucd/SpecialCasing.txt

177,992 original accepted forms plus source-attested display variants produce
177,991 canonical guesses. There are 670 additional spellings collapsed across
669 collision groups; canonical-collisions.json records every group. This
includes the one accented TDD doublet kâbusu/kabusu and lexical display variants.
HÂL/HAL, HÂLÂ/HALA, KAR/KÂR and MİLLİ/MİLLÎ share their respective identities.
MILLI with dotless I remains different: native I/İ are never collapsed.
Each selected answer identity occurs exactly once.

ANSWER SELECTION
The explicit authoritative file answers-tr.txt has 2,878 answers:
282 / 532 / 978 / 637 / 449 across lengths 3 / 4 / 5 / 6 / 7.
The assistant read the candidate lists, removed the recorded name-dominated,
archaic, abbreviation, noisy and unsuitable prompts, and added source-checked
everyday objects, food, animals and simple verbs. The deck deliberately includes
common function words and natural inflections as well as nouns and adjectives.
It does not adapt to a player's health, skill, history or current run.

Optional discovery aid: wordfreq 3.1.1 small_tr, 63,345 entries, SHA256
10980704ee3ac5b52f226579251905412a04ead57092a12182dd0b8be6a765df.
https://pypi.org/project/wordfreq/3.1.1/
wordfreq by Robyn Speer; its frequency data are CC-BY-SA-4.0. The candidate pass
uses Zipf >=4.1 for ordinary lexical headwords and >=4.9 for other inflections,
followed by explicit exclusions/additions and display decisions. Frequency
values are not included in playable vocabulary. Corpus frequency is not proof
of familiarity or modern spelling. The simulation prior stays separate from
the authoritative answer list and must explicitly use small_tr, not large_tr.

REPRODUCIBLE BUILD AND VERIFICATION
python scripts/build-turkish-words.py
The normal build uses only the standard library, saved sources and frozen
editorial/manifests. It is independent of current working directory and remains
valid after the staged assets/scripts/src paths are copied into the workspace.
The build asserts source hashes, source structure, answer source membership,
native lengths/alphabet, canonical uniqueness and pool sufficiency.

Twelve deliberate fault controls follow successful unmodified baselines:
unattested answer; duplicate circumflex identity; too-short answer; unsupported
answer letter; punctuation joining; empty deck; unknown affix directive;
cross-product mutation; stripping mutation; unknown numeric suffix; default
Unicode-uppercase mutation; corrupted source bytes. They prove sensitivity to
those cases, not perfect language coverage or perfect gameplay.

Optional full audits:
  assets/turkish-source/verify-expansion.py
  assets/turkish-source/verify-morphology.py
  assets/turkish-source/audit-coverage.py
  assets/turkish-source/review-selection.py --write
The first uses Spylls 0.1.7 and wordfreq 3.1.1 from existing ancestor-workspace QA
folders. All 235,727 expanded candidates pass; 5,167 independent native 3–7
corpus tokens outside the expansion yield no additional TDD-approved forms.
The second uses the pinned optional Python checker runtime and saved lexical
source; the core approval manifest is stable across repeated full checks.
The coverage audit records corpus omissions and three-letter answer neighbors;
neither metric is a human difficulty estimate or an exhaustive Turkish lexicon.

The optional runtime is stored under staging/.qa/python for this investigation.
Do not copy it into live source or ship it with the game. Its installation can
be reproduced with the exact dependency versions above; no optional runtime is
needed to rebuild accepted data from the saved verified manifest.

REMAINING LIMITS
Native-speaker review remains pending. Technical checks do not replace it.
Formal analyzers and corpus-derived dictionaries contain rare/archaic words and
noise, and their intersection can omit valid modern words. The explicit answer
deck is narrower but still needs native familiarity, spelling and playtesting.
Three-letter answer ambiguity is material: 282 answers, mean 6.38 one-letter
neighbors, maximum 18 in this pool. This structural measurement is not a reason
to alter combat or claim a human skill level without the parent simulation and
playtest work. Rare conjugations, circumflex distinctions and source omissions
remain review topics. Browser/gameplay/simulation checks are the parent task's
integration responsibility and are not claimed by this asset-only task.

SUBSEQUENT LIVE INTEGRATION (2026-10-25)
The local integration now passes 219 tests with no skips and eleven targeted
runtime fault controls. All five generated outputs rebuild byte-for-byte. The
120-run/600-word diagnostic checks 30,468 actions and 1,400 exact restores with
no capped or stalled runs; independent auditing passes. All 264 prior-language
run records and 600 Indonesian word trials remain exactly unchanged. Small_tr
provides 20,499 matched frequency entries under explicit native case conversion.
PİŞMEK has no prior entry; absence from this corpus is not unfamiliarity proof.

The browser export audits 178 accepted actions and four rejections, covering
all 49 enemy/move pairs, five bosses, shops, items, reels and 375-gold banking.
Native I/İ input and clues, decomposition, circumflexes, caret editing, six
viewport sizes, phone scrolling, reload and independent language saves pass.
A separate eleven-guess trial reaches and restores zero health. Evidence and
preserved runnable sources are under .qa/language-expansion/ in the workspace.
These synthetic checks are separate from pending native-speaker, physical-device
and human predictive-validation review. No balance change was inferred from
these uncalibrated player models.
