SPEC.mdpreviewSPEC.mdsource219 lines · 12.0 KB · raw
1---
2title: ALL GREEN
3theme: jev
4status: made
5song: song.js
6critic:
7  date: 2026-09-26
8  model: jev-1.13.0
9  method: rubric-1
10  art: 0.68
11  artRuns: [0.68, 0.68, 0.68]
12  criteria:
13    hook: 3.1
14    development: 3.4
15    structure: 3.2
16    concept: 4.3
17    originality: 4
18    craft: 2.3
19ideas:
20  - date: 2026-09-26
21    model: claude-opus-5-5
22    harness: claude-code
23    approved: "lfg"
24    brief: "JevLM cheats at Wordle. Jev only picks among options and never writes; Krug's JevLM-Open turns picking into writing, one next-fragment choice at a time, asking every bank of up to 255 options and then the finalists, with a frequency penalty against repeats. Each guess is one such choice: the state is the board so far, and the options are only the answer words still consistent with every clue, so the cheat is in the option list. The scan is audible: before each guess a glassy FM arpeggio plays one note per bank asked, shortening as the clues narrow the list. Tiles are rhythm in 5/4, one per beat: green a kick and a chord tone that locks in, yellow an off-beat snare, grey a dry muted tick. The harmony resolves as greens accumulate, from an unresolved sus chord to the tonic on an all-green row. An all-green row is followed by JevLM's end marker, \"End the response now\", and the song ends on it; six misses end on a grey row and the word revealed. Bright chiptune synth-pop, about 120 bpm, in 5/4."
25revisions:
26  - rev: 1
27    date: 2026-09-26
28    model: claude-opus-5-5
29    harness: claude-code
30    prompt: "JevLM cheats at Wordle. Jev only picks among options and never writes; Krug's JevLM-Open turns picking into writing, one next-fragment choice at a time, asking every bank of up to 255 options and then the finalists, with a frequency penalty against repeats. Each guess is one such choice: the state is the board so far, and the options are only the answer words still consistent with every clue, so the cheat is in the option list. The scan is audible: before each guess a glassy FM arpeggio plays one note per bank asked, shortening as the clues narrow the list. Tiles are rhythm in 5/4, one per beat: green a kick and a chord tone that locks in, yellow an off-beat snare, grey a dry muted tick. The harmony resolves as greens accumulate, from an unresolved sus chord to the tonic on an all-green row. An all-green row is followed by JevLM's end marker, \"End the response now\", and the song ends on it; six misses end on a grey row and the word revealed. Bright chiptune synth-pop, about 120 bpm, in 5/4."
31    output: song.js
32    art: 0.68
33    artRuns: [0.68, 0.68, 0.68]
34---
35
36# ALL GREEN — spec
37
38`song.js` is generated from this spec. Change the spec first, then the song.
39
40## Intent
41
42Jev (TypeSafe's `jev-1.13.0`) is not a language model: it answers choice,
43score and noul questions over options the caller writes, and never
44generates a token. Krug's **JevLM-Open** (https://github.com/Krug2/JevLM-Open,
45read at 84272bd; brain page `technology/artificial-intelligence/jev/ecosystem/jevlm.md`)
46makes it write anyway: each decoding step is one choice, `next_fragment`,
47with the state `{user_prompt, response_prefix}`, JevLM's instructions
48("Choose the NEXT text fragment to append…"), literal fragments as options
49and an end marker, "End the assistant response now; append no text." Its
504,000-unit vocabulary is over TypeSafe's 255-option limit, so every step
51asks each bank of at most 255 (`vocabulary.py`, `banks()`), then the
52finalists: each bank's pick plus the end marker (`multipass.py`).
53
54This song does that to Wordle, and cheats: **the options for each guess are
55only the answer words that still fit every row of tiles.** Jev picks, the
56code decides what may be picked. Credit: Krug2/JevLM-Open.
57
58## The word list
59
60Wordle's 2,309 answer words, from the npm package `wordles` by Stuart P.
61Bentley, https://github.com/stuartpb/wordles, `wordles.json` at commit
626072f5b3 (retrieved 2026-09-26). Its `package.json` licence is "PUBLIC
63DOMAIN" and its README says lists of common English words "are commonly
64considered public domain"; that is the packager's dedication (the list was
65taken from The New York Times' game code). The song stores it sorted and
66front-coded (a digit for the letters shared with the word before, then the
67rest), 7.9 KB, decoded when the song is evaluated.
68
69## How a guess is made (JevLM, faithfully)
70
71- **One guess is one decoding step**: a choice with JevLM's instructions,
72  adapted in one sentence (an option is a whole five-letter guess, where
73  JevLM's are JSON-quoted fragments). The state is JevLM's:
74  `user_prompt` (play Wordle, what the tiles mean) and `response_prefix`,
75  the board so far, a row per guess as Wordle shares it
76  (`CRANE ⬛🟨⬛⬛🟩`).
77- **The cheat**: the candidates are the words that would have given every
78  row its tiles (Wordle's rule for repeated letters included), less the
79  words already guessed.
80- **Banks**: the candidates are split as JevLM splits its vocabulary, into
81  as few banks as hold them at 254 words plus the end marker each, sizes
82  differing by one at most. Guess 1 has all 2,309, so **ten banks** of 230
83  or 231; a couple of clues usually leave one bank; after an all-green row
84  there are **none**. Every bank is one question in one request (the relay
85  takes 64 KB; JevLM packs four a request against its own 48 KB guard), and
86  a bank with no candidates is not asked.
87- **Finalists**: a second request, asked once the banks have answered, whose
88  options are each bank that chose a word and the end marker, as JevLM's
89  finalist pass. Its options are the banks by number, and the words they
90  chose are in its state (`decidedThisSection`), because a question's
91  options are written once per song.
92- **No repeats**: JevLM's frequency penalty (0.7) only discourages a
93  repeat. Here none is possible: a wrong guess never fits its own row, and
94  the answer is gone once it is guessed, so the penalty has nothing to do.
95- **Greedy**, as JevLM: Jev's top pick, never sampled.
96- **The end marker** is the finalist option "End the assistant response
97  now; append no text." After an all-green row no word is left, so the end
98  marker is the only finalist, played without asking. After six guesses the
99  form's cap leaves only it too. Jev may also choose it earlier, as it may
100  in JevLM, and the song ends there.
101
102## Today's word
103
104The answer must be the same for everyone at a listening party and in a
105replayed performance, so it is a decision: at the opening, before the song
106starts, Jev sets the puzzle, picking from every ninth answer (255 words,
107the choice limit) with the instruction "You set today's Wordle. Pick the
108secret word: a common five-letter word, fair to guess in six tries." The
109pick is drawn from Jev's probabilities at temperature 2 (`sample`), so
110games differ. It is recorded like every answer, so a replay and a party's
111guests play the same word. The solver never hears it: the question is
112`forget`-ten from the history Jev is sent, is not in the finalists'
113`after`, and its options are ids (`s000`…`s254`), so the booth does not
114spell it. When Jev cannot be reached the word is the first of them,
115"abbot".
116
117## One word a row
118
119A section plays on what it began with: the song reads every decision as it
120stood on the section's first cycle (`first()` in `song.js`), and the board
121for later guesses is rebuilt from those, so the tiles, the harmony, the
122next guess's candidates, a replay and a party's guests always agree.
123
124## Style
125
126- Bright chiptune synth-pop in **5/4 at 120 bpm**, key of C. **One cycle
127  is one bar of five beats** (`setcps(120/60/5)`, 2.5 s a bar), so a
128  five-letter word is one bar: a letter a beat, a tile a beat. Every
129  pattern is written in eighths, ten to the bar, felt 3+2: kick on 1, the
130  and of 2, and 4; snare on 3 and 5.
131- Pulse-wave chord stabs, a triangle bass in eighths, 8-bit hats
132  (`sid:7`), a kick and snare doubled with the SID snare, no sustained pad.
133- **The scan**: a glassy FM arpeggio (sine, FM index 2.5, harmonicity
134  3.5), an eighth note per bank asked, climbing C D F G A: ten notes fill
135  guess 1's bar, one note is a late guess, none after an all-green row.
136  The next bar plays the finalists, a note each, falling from the top.
137- **The tiles**, a beat each: green is a kick and its tone of the tonic
138  chord (C E G C E, by position); yellow an off-beat snare and the tone
139  beside its place (D F A D F), a note in the wrong place; grey a dry
140  `click:1` tick.
141- **Harmony waits on the greens**: the home chord is Csus4 until three
142  greens, Csus2 until five, C major on an all-green row; the cadence is
143  Gsus4, then G7sus4, then G7 into the end. The third, E, is only ever
144  heard in a green tile or on the win. Since every candidate keeps the
145  greens already found, greens never go down.
146
147## Structure
148
149Sections of 8 bars (20 s). Up to 8 sections: 64 bars, 2:40.
150
151| Section | Bars | What plays |
152|---|---|---|
153| intro | 1–2 | "Five letters. Six tries.", the full ten-note scan, hats |
154| | 3–8 | groove and stabs; bar 5: "J. E. V. doesn't write. J. E. V. picks." |
155| guess | 1 | the scan: a note per bank asked |
156| | 2 | the finalists; "Choose the next fragment." on guesses 1, 3 and 5 |
157| | 3 | the guess spelled, a letter a beat (Fadd9) |
158| | 4 | the tiles, alone over the bass |
159| | 5–6 | the row as a riff (green its tone twice, yellow sliding in, grey rests) over Am7, Fadd9 |
160| | 7 | the tiles flip: a blip a beat, high green, mid yellow, low grey |
161| | 8 | turnaround and snare roll, on the dominant |
162| end (won) | 1 | "End the response now." on a C hit and crash |
163| | 2–8 | the chorus: C F Am G, the all-green riff, "J. E. V. doesn't write. J. E. V. picks.", "Under a tenth of a cent, a game.", a last C |
164| end (not won) | 1 | "End the response now." on Csus4 |
165| | 2 | a grey row: five ticks |
166| | 3–4 | the word revealed: spelled, then its row lit green over A minor |
167| | 5–8 | Am F Dm G, "Under a tenth of a cent, a game.", a last Am |
168
169## Jev in the booth
170
171Two jev()s, asked every 8 bars:
172
173- **`bankJev`**: `bank1`…`bank10`, each a choice over every answer word and
174  the end marker, narrowed per request (`allow`) to its bank of the
175  candidates and the end marker, and `secret`, asked only at the opening.
176  Requests come one per section, in order, so the song counts them to know
177  which section each is for (`planSegment`); before each, it writes the
178  board into the state's `response_prefix`.
179- **`nextJev`**: `next`, the finalists, asked after the banks
180  (`after: { bank1, … }`), narrowed to the banks that chose a word and the
181  end marker. It is the form.
182
183**The form** (`walk`, max 8):
184
185| Section | Written at | May be followed by |
186|---|---|---|
187| `intro` | bars 1–8 | any slot, `end` |
188| `b1`…`b10` | bars 9–16 | any slot, `end` |
189| `end` | bars 17–24 | (the end) |
190
191A slot is a guess, named for the bank whose word it plays. As written a
192slot is followed by `end`, so a finalist question left with only the end
193marker ends the song; the cap of 8 sections is the intro, six tries and
194the end. The slots all return to each other: that loop is the game, and
195the cap (six tries) bounds it.
196
197**Without Jev** it plays as written: the intro, one guess (bank 1's first
198word, "aback", the as-written decoder) against "abbot", and the end. A
199finalist answer that arrives after its section began keeps the section it
200began with, which after guess 1 is the end: a game Jev cannot keep up with
201ends.
202
203**Cost and rate.** Guess 1's banks are one request of about 44 KB, about
20411,000 tokens at TypeSafe's $0.042 a million input tokens (JevLM's
205`config.py`), about $0.0005; the finalists and later guesses are a few KB
206each. A game is under a tenth of a cent. Two calls a section, 20 s a
207section: 6 calls a minute.
208
209## Constraints
210
211- Plays from bar 1 and ends on the end marker; never loops.
212- Vocals only where the structure table puts them. Every line is SAPI
213  (Microsoft David) through the vocoder on C–G, and read back by whisper
214  `small.en` and `medium.en` (`samples/README.md`); the letters read back
215  correctly laid out as the song spells them.
216- Samples load from `samples('jev-samples/strudel.json')`; drums from
217  `github:tidalcycles/dirt-samples`. New sounds are prefixed `ag`.
218- The master `postgain` keeps the peak at or under −1 dBFS, set by
219  measurement (`tools/measure`); not yet measured.