The list leaked abbreviations two ways: an OpenCorpora noun tagged Abbr without Fixd (the declinable acronym ОГВЗ) slipped past the Abbr+Fixd seed filter, and the РАН «(сокр.)» words (вуз, нэп, колхоз, гост, …) were kept on purpose by the old policy. Drop every abbreviation instead. A final pass in ru_stage2.py removes a word when the orthographic note marks it «(сокр.)» (is_abbrev_note) or when every OpenCorpora noun reading carries Abbr (oc_abbr_only — also the declinable огвз/заз the seed filter missed). Homographs with a plain-noun reading survive (ваза «ВАЗ», рис). Lexicalised words are rescued via manual_confirm.txt (колхоз, совхоз, рация, спецназ, эсминец, дзот, дот, прораб, токамак, тэн, … and под — a real noun OC knows only as ПОД); the bound prefix гос is vetoed in manual_reject.txt. 108 words removed from ru_scrabble / ru_erudit; en_sowpods unchanged. tools/README documents the policy and that libmorph is required for a faithful rebuild.
scrabble-dictionary
Versioned dictionary artifacts for the Scrabble game backend: the word-list sources and the build pipeline that produces the dictionary DAWGs, published as a release artifact (the DAWGs are data, not a Go module).
The build uses the published
scrabble-solver dictdawg/wordlist
packages (pinned in go.mod) over github.com/iliadenisov/{dafsa,alphabet} (v1.1.0), so the
on-disk format and letter indexing match the running backend exactly — there is no index
drift, because the backend pins the same dafsa/alphabet. The DAWGs this repo builds are
byte-identical to the solver's committed test fixtures.
Artifact
make dawg builds three DAWGs into dawg/:
| file | variant | source |
|---|---|---|
en_sowpods.dawg |
English (SOWPODS) | sources/scrabble_en/sowpods.txt |
ru_scrabble.dawg |
Russian Scrabble | sources/scrabble_ru/scrabble.txt |
ru_erudit.dawg |
Эрудит | sources/erudit_ru/erudit.txt (Ё→Е folded scrabble.txt, via tools/fold_yo.py) |
The CI (.gitea/workflows/build.yaml) rebuilds them on every push/PR as a validation gate
(inlined go run, no make/python needed on the runner). Release artifacts are published per
version (see Release below): the three DAWGs packaged flat into scrabble-dawg-<tag>.tar.gz
and attached to the Gitea release for the vX.Y.Z tag. The backend deploy unpacks that tarball
into BACKEND_DICT_DIR; one semver label versions the whole set (additive — a new version is
a new release, never breaking a running backend).
Sources / provenance
- English:
sources/scrabble_en/sowpods.txt, vendored fromkamilmielnik/scrabble-dictionaries. - Russian:
sources/scrabble_ru/scrabble.txt, derived from the Russian academic orthographic dictionary by the tooling undertools/(seetools/README.md);sources/erudit_ru/erudit.txtis its Ё→Е folded form (tools/fold_yo.py). Only the prepared word lists are vendored; the heavy upstream source (the orfo PDF/text) is not.
Build
make dawg # -> dawg/{en_sowpods,ru_scrabble,ru_erudit}.dawg
Requires Go (module deps fetched with GOPRIVATE=gitea.iliadenisov.ru/*, exported by the
Makefile). No python is needed for the build — the Ё→Е fold is committed as erudit.txt;
regenerate it with python3 tools/fold_yo.py sources/scrabble_ru/scrabble.txt > sources/erudit_ru/erudit.txt.
Release
CI builds and validates the DAWGs but does not upload them (the release upload needs a write token, kept out of CI for now — a future enhancement). To publish a version, tag it and attach the artifact to its Gitea release:
make dawg
tar czf scrabble-dawg-vX.Y.Z.tar.gz -C dawg en_sowpods.dawg ru_scrabble.dawg ru_erudit.dawg
# create the Gitea release for tag vX.Y.Z and upload scrabble-dawg-vX.Y.Z.tar.gz as an asset
The backend consumes it at
https://gitea.iliadenisov.ru/developer/scrabble-dictionary/releases/download/vX.Y.Z/scrabble-dawg-vX.Y.Z.tar.gz.