a21596b3e4
Eighteen agents: three design directions judged on whether a COO on a phone actually learns what an environment is, on craft, and on landing without a rewrite; one spec; a foundation of measured tokens; six build lanes; three browser verifiers; a final gate pass. The materials are Prime Intellect's, measured from their site: near-black grounds, one green, sharp radii, mono small-caps labels, Geist and Geist Mono self-hosted because production CSP is font-src 'self'. Two of their own greys fail contrast on their own ground (#737373 is 4.02:1, #6E6E6E is 3.73:1 on #0F0F0F), so --muted is lifted and the CSS comment carries the number — or someone will 'correct' it back. Every text-on-ground pair in both themes is tabulated in src/index.css with its measured ratio. The two rules that resolved every conflict: data is mono, sentences are sans; the language wins on materials, the lesson wins on legibility. Light mode is a finished paper theme, not an inversion. What did not change: the derived-tabs contract, the honesty markers, the isolation lint, every gate. 419 contract checks, entry chunk at 74% of budget, zero horizontal overflow on any route at 390/1024/1440 in either theme. Also flips Alert Triage to status 'live' — the pipeline built it but never promoted it, so it was badged SPEC on its own playable page and the home page counted one environment. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019mt6sHQHEnEYrJZvoMCJSB
140 lines
5.5 KiB
TypeScript
140 lines
5.5 KiB
TypeScript
/**
|
||
* Every external claim this site makes, with the link that backs it, plus the
|
||
* handful of numbers about our own word list.
|
||
*
|
||
* Home and Honesty both quote these. They are here, once, so the two pages
|
||
* cannot drift into citing the same fact two different ways — which is the
|
||
* usual way an honest site becomes a dishonest one.
|
||
*
|
||
* The word-list counts are literals rather than imports on purpose: the answer
|
||
* list is 4,603 strings sitting outside the Vite root, and pulling it in to
|
||
* render one number would put the whole dictionary in the entry chunk. They are
|
||
* reproducible with the command in `wordListRebuild` and are checked by CI.
|
||
*/
|
||
|
||
export interface Citation {
|
||
/** What the source proves, in one line. */
|
||
claim: string;
|
||
label: string;
|
||
href: string;
|
||
}
|
||
|
||
/**
|
||
* The credential. Wordle is not our choice of demo — it is Prime Intellect's
|
||
* own hello-world, in three separate places in their stack.
|
||
*/
|
||
export const helloWorldCitations: readonly Citation[] = [
|
||
{
|
||
claim: 'One of the five basic end-to-end examples in prime-rl, their RL trainer.',
|
||
label: 'prime-rl / examples / basic / wordle',
|
||
href: 'https://github.com/PrimeIntellect-ai/prime-rl/tree/main/examples/basic/wordle',
|
||
},
|
||
{
|
||
claim: 'A shipped environment in verifiers, the library the whole ecosystem builds on.',
|
||
label: 'verifiers / environments / wordle',
|
||
href: 'https://github.com/PrimeIntellect-ai/verifiers/tree/main/environments/wordle',
|
||
},
|
||
{
|
||
claim: 'The environment used in the official lab-cookbook prompt-optimisation tutorial.',
|
||
label: 'lab-cookbook / guides / prompt optimization',
|
||
href: 'https://github.com/PrimeIntellect-ai/lab-cookbook/tree/main/guides/04-prompt-optimization',
|
||
},
|
||
];
|
||
|
||
/**
|
||
* The one measured, citable training result on this site. It is theirs, not
|
||
* ours, and it is a WIN RATE.
|
||
*
|
||
* Their README also publishes average-reward figures for the same runs. We do
|
||
* not quote those anywhere and neither should you: the reward function has
|
||
* changed across versions of the environment, the two numbers were produced
|
||
* under different versions, and nobody re-measured them. A win rate survives a
|
||
* reward change. An average reward does not.
|
||
*/
|
||
export const trainingResult = {
|
||
model: 'Qwen3-1.7B',
|
||
before: '0%',
|
||
after: '~60%',
|
||
metric: 'win rate',
|
||
method: 'SFT warm-up, then multi-turn RL with group-relative advantages (GRPO)',
|
||
/** From the same README: 20 held-out words, 3 rollouts each. */
|
||
evalDescription: '20 held-out words the model never trained on, played 3 times each',
|
||
/**
|
||
* Rendered wherever the number is, in these words. Home and Honesty both
|
||
* print it, and a caveat that appears on one page and not the other is the
|
||
* kind of thing a careful reader notices first.
|
||
*/
|
||
caveat:
|
||
'We quote the win rate only. The reward numbers in that write-up span versions of the environment and were never re-measured together.',
|
||
source: {
|
||
label: 'prime-rl / examples / basic / wordle',
|
||
href: 'https://github.com/PrimeIntellect-ai/prime-rl/tree/main/examples/basic/wordle',
|
||
},
|
||
checkpoints: [
|
||
{
|
||
label: 'PrimeIntellect/Qwen3-1.7B-Wordle-SFT',
|
||
href: 'https://huggingface.co/PrimeIntellect/Qwen3-1.7B-Wordle-SFT',
|
||
},
|
||
{
|
||
label: 'PrimeIntellect/Qwen3-1.7B-Wordle-RL',
|
||
href: 'https://huggingface.co/PrimeIntellect/Qwen3-1.7B-Wordle-RL',
|
||
},
|
||
],
|
||
} as const;
|
||
|
||
/**
|
||
* Our word list, by the numbers. Answers are the intersection of Wordnik's
|
||
* headwords and SCOWL's common-American tier, minus a short hand-written
|
||
* blocklist; guesses are all of Wordnik's five-letter words.
|
||
*/
|
||
/**
|
||
* Same greedy max-entropy solver, run over both answer pools, 250 sampled
|
||
* targets each. Measured on amd-server, 2026-08-28. This is the only honest way
|
||
* to compare the two lists: the published 3.4212 optimum for the original list
|
||
* comes from an exhaustive search, and setting our greedy number against it
|
||
* would be comparing two different algorithms and calling it a property of the
|
||
* words.
|
||
*/
|
||
export const poolComparison = {
|
||
original: { size: '2,315', opener: 'RAISE', mean: '3.552', worst: '5' },
|
||
ours: { size: '4,603', opener: 'TARES', mean: '3.700', worst: '6' },
|
||
sampled: '250',
|
||
} as const;
|
||
|
||
export const wordList = {
|
||
answers: 4603,
|
||
guesses: 11846,
|
||
/** Share of answers ending in a plain plural S. */
|
||
endsInS: '32.9%',
|
||
/** Share of answers ending in -ED. */
|
||
endsInEd: '6.1%',
|
||
/** Both together. */
|
||
endsInSorEd: '39.0%',
|
||
/** The original game's hand-curated answer list, for comparison. */
|
||
originalAnswers: 2315,
|
||
rebuild: 'uv run python envs/wordle_five/words/build_words.py',
|
||
sources: [
|
||
{ label: 'Wordnik word list (2021-07-29)', href: 'https://github.com/wordnik/wordlist' },
|
||
{ label: 'SCOWL / wamerican (2020.12.07)', href: 'http://wordlist.aspell.net/' },
|
||
],
|
||
} as const;
|
||
|
||
/**
|
||
* The famous 3.42. It belongs to the original game's 2,315-word answer list and
|
||
* to Alex Selby's exact solver, and it is quoted on this site only to say that
|
||
* it is not ours.
|
||
*/
|
||
export const optimalPlay = {
|
||
average: '3.42 guesses',
|
||
label: 'Selby’s exact optimal solution for the original 2,315-word list',
|
||
href: 'https://sonorouschocolate.com/notes/index.php/The_best_strategies_for_Wordle',
|
||
} as const;
|
||
|
||
/** Commands anyone can run against a clone of this repository. */
|
||
export const reproduce = {
|
||
clone: 'git clone https://git.karti.ai/PIG/PIG-Demo',
|
||
install: 'cd PIG-Demo && uv sync --all-packages',
|
||
evaluate: 'uv run vf-eval wordle-five -n 8',
|
||
conformance: 'pnpm conformance',
|
||
} as const;
|