Consolidate the scattered build inputs (dictionaries/english/, dictprep/russian/)
into one sources/ tree keyed by the variant labels (scrabble_en/scrabble_ru/
erudit_ru), and move the Russian prep pipeline to tools/. The dawg outputs and
their filenames are unchanged — rebuilt byte-identical (en_sowpods/ru_scrabble/
ru_erudit) — so the release artifact and the backend are unaffected.
ru_stage2.py OUT_DIR and the ruwords flag defaults are repointed to
sources/scrabble_ru/; Makefile / CI / cmd/builddict default / README updated;
pipeline intermediates git-ignored. Verified: make dawg byte-identical to the
committed baseline, py_compile + go vet of the moved tools. The full Russian
regeneration pipeline (pymorphy3/libmorph/orfo PDF) was not run here.
- build.yaml dropped the release step whose ${{ github.* }} contexts failed the Gitea
workflow compile (the run produced 0 jobs); it now inlines go run (no make dependency)
and reads the committed dictprep/russian/erudit.txt (no python dependency).
- erudit.txt is scrabble.txt with Ё→Е folded (dictprep/fold_yo.py); it reproduces the
canonical ru_erudit.dawg byte-for-byte. Release artifacts are published manually for now
(see README).
- builddict drives the de-internalized scrabble-solver dictdawg/wordlist builders
(pinned v1.0.0) to produce the three DAWGs (en_sowpods, ru_scrabble, ru_erudit),
byte-identical to the solver's committed fixtures (same dafsa/alphabet v1.1.0 -> no
index drift with the running backend).
- Sources: english/sowpods.txt vendored from kamilmielnik/scrabble-dictionaries;
russian/scrabble.txt + the dictprep tooling moved out of scrabble-solver.
- CI builds the DAWGs on push/PR and, on a vX.Y.Z tag, packages them flat into
scrabble-dawg-<tag>.tar.gz and attaches it to the Gitea release.