a56f097f28
The Python is the source of truth; src/demos/wordle/engine.ts will be a port of it, and CI gates the two against a SHA-256 over all 21.2M (guess, answer) pattern pairs rather than a hand-picked vector file — a vector file only ever catches the cases somebody thought of. The reward is three weighted components, and the third one is the reason this demo is worth building. `solved` and `economy` pull toward winning. `consistency` pulls against them, because a player maximising information deliberately guesses words that cannot win — a word that splits the remaining candidates evenly teaches more than a word that might happen to be right. That is good play, and it costs consistency. The probe ladder proves the tension is real rather than asserted: inaction 0.0000 crude 0.0111 plausible 0.1224 candidate_only 0.8925 exhaustive 0.9031 oracle 0.9458 The two good policies are 0.05 apart and neither dominates — the entropy oracle takes 1.00 economy and 0.73 consistency, the candidate-only player takes 0.75 and 1.00. Which one wins is a decision about what you want, which is the whole argument the site exists to make. probe.py fails CI if either starts dominating. Two traps found by building it. `consistency` is scored over turns SPENT, not guesses accepted: counting only legal guesses hands a free 1.0 to a policy that plays one word and then jams the parser five times — one guess, no contradictions, perfect score. And `economy`'s denominator is the depth the SHIPPED solver reaches, not a depth-optimal search: entropy-greedy is not depth-optimal, so grading it against an exact optimum would make the oracle rung fail its own assertion on some seeds. The word lists are built from Wordnik (MIT) intersected with SCOWL, never from the original game's 2,315 answers. 4,603 answers makes this materially harder than the original, so the published SALET/3.4212 results are cited as belonging to that list and our own reference player's TARES/3.72 is measured here. verifiers is an optional extra. The engine, reward, solver and probe all run — and gate — without an RL stack resolvable. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019mt6sHQHEnEYrJZvoMCJSB
57 lines
2.4 KiB
Markdown
57 lines
2.4 KiB
Markdown
# Where these words came from
|
|
|
|
Both lists are built by `build_words.py` from the two source files committed
|
|
beside it. Nothing here is copied from the original game.
|
|
|
|
## Guesses — `guesses.json`, 11,846 words
|
|
|
|
From [`wordnik/wordlist`](https://github.com/wordnik/wordlist), snapshot
|
|
`wordlist-20210729.txt`, **MIT licensed**, filtered to five-letter lowercase
|
|
ASCII. Wordnik publishes this list for word-game developers, which is exactly
|
|
what it is being used for.
|
|
|
|
## Answers — `answers.json`, 4,603 words
|
|
|
|
The **intersection** of the guess list with SCOWL's common-American tier
|
|
(`wamerican` 2020.12.07, as shipped in `/usr/share/dict/american-english`),
|
|
minus a short hand-curated block list.
|
|
|
|
The intersection is the point. A word is a possible answer if it is a real
|
|
headword (Wordnik) *and* common enough that a non-specialist has plausibly met
|
|
it (SCOWL). That rule is stated, reproducible, and ours — as opposed to copying
|
|
somebody else's editorial selection of which words are fair.
|
|
|
|
SCOWL is distributed under a permissive licence requiring attribution, which
|
|
`NOTICE` carries.
|
|
|
|
## What we deliberately did not use
|
|
|
|
**The original game's 2,315-word answer list.** It is the product of a
|
|
deliberate human curation pass, which is the strongest selection-originality
|
|
argument of any list in this space and has never been litigated. We do not need
|
|
it, so we do not ship it.
|
|
|
|
We verified separately that the Wordnik list *contains* all 2,315 of those
|
|
words — that is a statement about Wordnik's coverage, not a reason to
|
|
redistribute the selection.
|
|
|
|
Consequences worth stating plainly, since they affect every number on the site:
|
|
|
|
- Our answer pool is **4,603**, roughly twice the original's. This game is
|
|
**harder** than the original, and our measured solver averages are not
|
|
comparable to published figures for it.
|
|
- The famous results — SALET as the optimal opener, a 3.4212-guess mean, a
|
|
proven worst case of five — are proven **for the original list**. They are
|
|
cited on the site as exactly that, never as our own ceiling. Our own
|
|
reference player opens **TARES** and averages **3.72**, and that number is
|
|
computed by `solver.optimal_depth_report()` rather than quoted.
|
|
|
|
## Rebuilding
|
|
|
|
```bash
|
|
uv run python envs/wordle_five/words/build_words.py
|
|
```
|
|
|
|
Deterministic and offline. The output must be byte-identical; if it is not,
|
|
`CONFORMANCE.txt` changes too and the TypeScript port has to be re-verified.
|