For Anyone signing an AI budget
Word Five
Guess a hidden five-letter word in six tries, from letter-by-letter feedback.
How would we know it was actually working?
Their hello-world, not ours
Prime Intellect ship this exact game as a starter environment in three of their public repositories. We did not pick a game. We picked theirs.
- Outcome
- failed
- Total reward
- 0.025
- Shipped weights
- Steps
- 8
- Model calls in this run
- Seed
- 0
- The same seed reproduces this board
Recorded runbrain-qwen38-dspark28 Aug 2026
This is the smallest complete reinforcement-learning environment we could find that needs no domain knowledge at all. It has everything the ones that matter to your business have: a task, a fixed set of legal moves, a grader that cannot be argued with, and a score that moves when the model gets better. Learn the machine here, and every demo after this is the same machine with a different grader.
What an environment actually is
Four parts: a task, the moves that are legal, a grader that computes rather than opines, and a number that moves.
1The task
What is the agent asked to do?
Find a hidden five-letter word in six guesses.
2Legal actions
What is it allowed to do?
One five-letter word per turn, from a fixed 11,846-word list. Anything else is refused and costs a turn.
3The grader
Who decides whether it was good?
Compares the guess to the answer letter by letter and returns green, yellow or grey. It computes; it does not judge.
4The score that moves
What number does that produce?
Half for winning, a third for winning quickly, a fifth for never spending a turn on a word that could not have won.
This reward: Win fast, minus wasted guesses
Every demo on this site is that same machine. The task changes, the legal actions change, and the grader changes — but the grader is always code you can read, and the score is always a number you can watch move. That is what makes an environment different from an eval: an environment is an eval you can take the gradient of.
You and the model get the same word
Same hidden word, same six guesses, same rules. Play it, then watch what the model did with it.
Your attempt
What the model did
Same hidden answer, same rules, same budget — replayed at the speed it actually happened.
Step 1 of 8
Recorded runbrain-qwen38-dspark28 Aug 2026
Reasoning
Watch it think
This is not a video. It is a recorded attempt replayed at the speed it actually happened, and you can step through it one guess at a time.
You decide what good means
Move one slider and the winner changes. That is not a trick — it is the product.
| Component | Score | Weight | Value |
|---|---|---|---|
| Found the wordObjectiveDid it win, within six guesses.solved | 0.000 | 0.50 | 0.000 |
| Did it in few guessesObjectiveTurns used, as a ratio against the best player we ship, on the same hidden word. A ratio rather than a count, so a hard draw is not punished as a bad game.economy | 0.000 | 0.30 | 0.000 |
| Never wasted a turnCounterweightThe share of attempts spent on a word that could still have been the answer. This one pulls against the other two on purpose.consistency | 0.125 | 0.20 | 0.025 |
| Total reward | 0.025 | ||
Never wasted a turn is the counterweight: without a term pulling the other way, the cheapest way to maximise the objective is a behaviour you would never ship, and the model will find it.
Diagnostics — reported, never summed
- Guesses used
- 6.000
- Replies refused
- 2.000
- Contradicted itself
- 5.000
- Reference took
- 4.000
Verified in your browser — re-ran every move through the TypeScript engine and rescored.
Recomputed 0.025 · recorded 0.025 · Δ 0.0000000
Change what good means
Did it win, within six guesses.
Turns used, as a ratio against the best player we ship, on the same hidden word. A ratio rather than a count, so a hard draw is not punished as a bad game.
The share of attempts spent on a word that could still have been the answer. This one pulls against the other two on purpose.
The percentage is the share of the reward each term carries once the weights are normalised. Raising one lowers the others — that is the trade a reward designer actually makes.
Ranking under this reward
- 1Best-known playrank unchanged1.000
- 2Never wastes a guessrank unchanged1.000
- 3Never wastes a guessrank unchanged1.000
- 4Never wastes a guessrank unchanged1.000
- 5Never wastes a guessrank unchanged1.000
- 6Never wastes a guessrank unchanged1.000
- 7Never wastes a guessrank unchanged1.000
- 8Allowed to thinkrank unchanged0.960
Same model, same seeds, sampled with thinking enabled. No training, no fine-tuning.
- 9Best-known playrank unchanged0.950
- 10Best-known playrank unchanged0.950
- 11Best-known playrank unchanged0.950
- 12Never wastes a guessrank unchanged0.940
- 13Best-known playrank unchanged0.933
- 14Best-known playrank unchanged0.933
- 15Best-known playrank unchanged0.933
- 16Never wastes a guessrank unchanged0.925
- 17Allowed to thinkrank unchanged0.920
Same model, same seeds, sampled with thinking enabled. No training, no fine-tuning.
- 18Allowed to thinkrank unchanged0.920
Same model, same seeds, sampled with thinking enabled. No training, no fine-tuning.
- 19Best-known playrank unchanged0.900
- 20Allowed to thinkrank unchanged0.845
Same model, same seeds, sampled with thinking enabled. No training, no fine-tuning.
- 21Allowed to thinkrank unchanged0.080
Same model, same seeds, sampled with thinking enabled. No training, no fine-tuning.
- 22Allowed to thinkrank unchanged0.067
Same model, same seeds, sampled with thinking enabled. No training, no fine-tuning.
- 23Allowed to thinkrank unchanged0.050
Same model, same seeds, sampled with thinking enabled. No training, no fine-tuning.
- 24Allowed to thinkrank unchanged0.050
Same model, same seeds, sampled with thinking enabled. No training, no fine-tuning.
- 25Out of the boxrank unchanged0.033
- 26Out of the boxrank unchanged0.029
- 27Out of the boxrank unchanged0.029
- 28Out of the boxrank unchanged0.025
- 29Out of the boxrank unchanged0.025
- 30Out of the boxrank unchanged0.018
- 31Out of the boxrank unchanged0.018
- 32Out of the boxrank unchanged0.018
Leading under this reward: Best-known play, 1.000.
We re-scored the same recorded attempts under your reward. Training on it would change the behaviour, not just the ranking.
The number that moves
Out of the box, this model solved none of eight. Letting it think first is the cheapest intervention there is, and you can measure exactly what it bought.
Total reward — Out of the box
0.025
Show these points as a table
| Out of the box | 0.025 |
|---|---|
| Out of the box | 0.033 |
| Out of the box | 0.018 |
| Out of the box | 0.018 |
| Out of the box | 0.018 |
| Out of the box | 0.025 |
| Out of the box | 0.029 |
| Out of the box | 0.029 |
| Allowed to think | 0.920 |
| Allowed to think | 0.845 |
| Allowed to think | 0.067 |
| Allowed to think | 0.050 |
| Allowed to think | 0.080 |
| Allowed to think | 0.960 |
| Allowed to think | 0.050 |
| Allowed to think | 0.920 |
| Best-known play | 0.900 |
| Best-known play | 0.933 |
| Best-known play | 0.950 |
| Best-known play | 0.933 |
| Best-known play | 1.000 |
| Best-known play | 0.950 |
| Best-known play | 0.950 |
| Best-known play | 0.933 |
| Never wastes a guess | 0.940 |
| Never wastes a guess | 1.000 |
| Never wastes a guess | 1.000 |
| Never wastes a guess | 1.000 |
| Never wastes a guess | 1.000 |
| Never wastes a guess | 1.000 |
| Never wastes a guess | 1.000 |
| Never wastes a guess | 0.925 |
Every point is a recorded run scored by the same grader. Nothing here is a projection.
Which agent would you rather have running this?
Same puzzle, same seed (0).
Agent A
8 stepsAgent B
5 stepsThe whole environment, in one screen
The grader is thirty lines of Python. Here it is, and here is the command that runs it.
Provenance
- Environment package
- wordle_five
- Taskset
- wordle-five
- verifiers version
- 0.3.2.dev12
- Model
- brain-qwen38-dspark
- Captured
- 28 Aug 2026
- Seed
- 0
Run it yourself
uv run python envs/probe.pyenvs/wordle_five/wordle_five/reward.py
"""The reward. This file is quoted verbatim on the demo page, so it is writtento be read by someone who does not write Python. Three components, weights summing to 1.0. Two of them pull toward winning. Thethird pulls against them on purpose. # region: pig-demo/reward""" from __future__ import annotations from dataclasses import dataclass from .engine import GREEN, WORD_LENGTH, score_guess SOLVED_WEIGHT = 0.50ECONOMY_WEIGHT = 0.30CONSISTENCY_WEIGHT = 0.20 @dataclassclass Episode: """Everything the reward needs from one played game.""" answer: str guesses: list[str] patterns: list[str] rejected: int reference_depth: int max_guesses: int = 6 def solved(ep: Episode) -> float: """Did it win? The objective, and half the reward.""" return 1.0 if ep.patterns and ep.patterns[-1] == GREEN * WORD_LENGTH else 0.0 def economy(ep: Episode) -> float: """How few turns it took, against how few the reference player needed. Always a ratio against a reference on the SAME hidden word, never an absolute count — otherwise the reward would mostly measure whether the word happened to be easy, and a model would be punished for a hard draw. """ if not solved(ep): return 0.0 return min(1.0, ep.reference_depth / max(1, len(ep.guesses))) def consistency(ep: Episode) -> float: """The share of guesses that were still possible answers when they were made. This is the counterweight, and it is genuinely in tension with the other two. A player maximising information will deliberately guess words that CANNOT win, because a word that splits the remaining candidates evenly teaches it more than a word that might happen to be right. That is good play, and it costs consistency. The reference solver scores below 1.0 here. So the three components describe a real trade: win, win fast, and do not spend turns on moves that could not have won. You cannot max all three, and which one you weight is a decision about what you actually want — which is the entire argument this demo exists to make. Scored over every turn SPENT, not every guess accepted — see below. Without that, a policy which never produces a parseable word scores a vacuous 1.0 here (no guesses, therefore no contradictions) and collects 0.2 for doing nothing at all. """ spent = len(ep.guesses) + ep.rejected if spent == 0: return 0.0 viable = 0 for i, guess in enumerate(ep.guesses): # A guess is viable iff it is consistent with every earlier piece of # feedback — that is, it was still a possible answer at the moment it # was played. if all(score_guess(ep.guesses[k], guess) == ep.patterns[k] for k in range(i)): viable += 1 # The denominator is every turn SPENT, including replies the game refused. # Counting only legal guesses would hand a free 1.0 to a policy that plays # one word and then jams the parser five times: one guess, no # contradictions, perfect score. Measuring against turns spent asks the # question that actually matters — of the attempts you made, how many were # a move that could have won? return viable / spent def score(ep: Episode) -> dict[str, float]: """The weighted components, unweighted. The caller applies the weights.""" return { "solved": solved(ep), "economy": economy(ep), "consistency": consistency(ep), } def total(ep: Episode) -> float: parts = score(ep) return ( parts["solved"] * SOLVED_WEIGHT + parts["economy"] * ECONOMY_WEIGHT + parts["consistency"] * CONSISTENCY_WEIGHT ) # endregion: pig-demo/reward def metrics(ep: Episode) -> dict[str, float]: """Diagnostics. Weight zero — reported, never summed into the reward.""" return { "guesses_used": float(len(ep.guesses)),What this does not teach
A word game is missing four things your business has. Each one is why the next demo exists.
What this demo does not teach
Nobody is pushing back. There is no counterparty adapting to what the agent does, which is most of what makes fraud and abuse hard.
No demo answers this one yet. It is a real gap, not a rhetorical one.
There is no rule the agent could break. No privacy boundary, no regulator, no policy it must satisfy while it optimises.
No demo answers this one yet. It is a real gap, not a rhetorical one.
Every guess is objectively scorable. Real decisions have partial credit and honest disagreement about what a good answer even was.
No demo answers this one yet. It is a real gap, not a rhetorical one.
The score arrives the moment the game ends. A claim, a bid or a dispatch is graded weeks later, by reality.
No demo answers this one yet. It is a real gap, not a rhetorical one.