SPEC.mdpreviewSPEC.mdsource258 lines · 16.4 KB · raw
1---
2title: OPTION ORDER
3theme: jev
4status: made
5song: song.js
6measured: {"date":"2026-09-25","song":"1df71fa76155","total":{"loudnessDbfs":-21.1,"peakDbfs":-1.1},"parts":{"bass":{"loudnessDbfs":-30.4,"peakDbfs":-17.1},"breaks":{"loudnessDbfs":-35.6,"peakDbfs":-13.8},"drums":{"loudnessDbfs":-22.4,"peakDbfs":-1.5},"other":{"loudnessDbfs":-45.2,"peakDbfs":-5},"stabs":{"loudnessDbfs":-34.8,"peakDbfs":-13.8},"vocals":{"loudnessDbfs":-33.3,"peakDbfs":-9}},"sections":{"1-8":{"total":{"loudnessDbfs":-22.4,"peakDbfs":-7.3},"parts":{"bass":{"loudnessDbfs":-37.2,"peakDbfs":-26.5},"drums":{"loudnessDbfs":-22.5,"peakDbfs":-7}}},"9-16":{"total":{"loudnessDbfs":-19.9,"peakDbfs":-1.5},"parts":{"bass":{"loudnessDbfs":-28.7,"peakDbfs":-17.1},"drums":{"loudnessDbfs":-21.5,"peakDbfs":-1.5},"stabs":{"loudnessDbfs":-32.2,"peakDbfs":-14},"vocals":{"loudnessDbfs":-28.9,"peakDbfs":-9.5}}},"17-24":{"total":{"loudnessDbfs":-20.1,"peakDbfs":-1.3},"parts":{"bass":{"loudnessDbfs":-28.8,"peakDbfs":-17.1},"breaks":{"loudnessDbfs":-32.7,"peakDbfs":-14.7},"drums":{"loudnessDbfs":-21.4,"peakDbfs":-1.5},"stabs":{"loudnessDbfs":-32.2,"peakDbfs":-14},"vocals":{"loudnessDbfs":-114,"peakDbfs":-84.7}}},"25-32":{"total":{"loudnessDbfs":-20,"peakDbfs":-1.2},"parts":{"bass":{"loudnessDbfs":-28.7,"peakDbfs":-17.1},"breaks":{"loudnessDbfs":-31.9,"peakDbfs":-13.8},"drums":{"loudnessDbfs":-21.3,"peakDbfs":-1.5},"stabs":{"loudnessDbfs":-32.2,"peakDbfs":-14},"vocals":{"loudnessDbfs":null,"peakDbfs":null}}},"33-40":{"total":{"loudnessDbfs":-20.1,"peakDbfs":-1.1},"parts":{"bass":{"loudnessDbfs":-28.9,"peakDbfs":-17.1},"breaks":{"loudnessDbfs":-32.6,"peakDbfs":-14.7},"drums":{"loudnessDbfs":-21.4,"peakDbfs":-1.5},"stabs":{"loudnessDbfs":-77.9,"peakDbfs":-47.4},"vocals":{"loudnessDbfs":-31.1,"peakDbfs":-9.3}}},"41-48":{"total":{"loudnessDbfs":-22.9,"peakDbfs":-1.3},"parts":{"bass":{"loudnessDbfs":-31.6,"peakDbfs":-17.2},"breaks":{"loudnessDbfs":-37.8,"peakDbfs":-14.7},"drums":{"loudnessDbfs":-24.4,"peakDbfs":-1.5},"stabs":{"loudnessDbfs":-35.2,"peakDbfs":-13.8},"vocals":{"loudnessDbfs":-34,"peakDbfs":-9}}},"49-56":{"total":{"loudnessDbfs":-20.2,"peakDbfs":-1.3},"parts":{"bass":{"loudnessDbfs":-28.7,"peakDbfs":-17.1},"breaks":{"loudnessDbfs":-34.8,"peakDbfs":-14.8},"drums":{"loudnessDbfs":-21.4,"peakDbfs":-1.5},"stabs":{"loudnessDbfs":-32.3,"peakDbfs":-13.8},"vocals":{"loudnessDbfs":null,"peakDbfs":null}}},"57-64":{"total":{"loudnessDbfs":-25.2,"peakDbfs":-1.4},"parts":{"bass":{"loudnessDbfs":-51.9,"peakDbfs":-18.7},"breaks":{"loudnessDbfs":-50.6,"peakDbfs":-14.7},"drums":{"loudnessDbfs":-28.4,"peakDbfs":-1.5},"other":{"loudnessDbfs":-36,"peakDbfs":-5},"stabs":{"loudnessDbfs":-77.7,"peakDbfs":-46.6},"vocals":{"loudnessDbfs":-28.8,"peakDbfs":-9.5}}}}}
7critic:
8  date: 2026-09-25
9  model: jev-1.13.0
10  method: rubric-1
11  art: 0.62
12  artRuns: [0.62, 0.62, 0.62]
13  criteria:
14    hook: 2.8
15    development: 3.5
16    structure: 3.3
17    concept: 3.9
18    originality: 3.5
19    craft: 1.6
20ideas:
21  - date: 2026-09-24
22    model: claude-opus-5-5
23    harness: claude-code
24    prompt: "Research Jev's real use cases; jab at people using Jev where deterministic code would do better, such as game bots."
25    brief: "Glitch-hop about Jev's answers flipping when you reorder the options. The chorus plays forwards, then reversed, and the vocoder's answer changes: \"fair / unfair\", \"approve / fix now\". The meme hook is \"Wait, it's all shuffled?\" / \"Always has been\". The bridge counts \"thirty-two out of two hundred\" over a stuttering break."
26revisions:
27  - rev: 1
28    date: 2026-09-24
29    model: claude-opus-5-5
30    harness: claude-code
31    prompt: "Glitch-hop about Jev's answers flipping when you reorder the options. The chorus plays forwards, then reversed, and the vocoder's answer changes: \"fair / unfair\", \"approve / fix now\". The meme hook is \"Wait, it's all shuffled?\" / \"Always has been\". The bridge counts \"thirty-two out of two hundred\" over a stuttering break."
32    output: null  # overwritten by rev 2
33    art: 0.58
34    artRuns: [0.58, 0.58, 0.57]
35  - rev: 2
36    date: 2026-09-24
37    model: claude-opus-5-5
38    harness: claude-code
39    prompt: "Let Jev arrange the song as it plays. Split it into named parts and name each 8-bar section with the sections allowed to follow it; at each section Jev picks the next section, the move to play it with (as written, no drums, break and bass, no bass), and how intense it is, and ends the song by choosing the outro, with a hard cap of 16 sections. Tell Jev the tempo, key, chords, lyrics and everything played so far. Without Jev it plays as written."
40    output: null  # overwritten by rev 3
41    art: 0.63
42    artRuns: [0.63, 0.64, 0.63]
43  - rev: 3
44    date: 2026-09-25
45    model: claude-opus-5-5
46    harness: claude-code
47    prompt: "Make the chorus about option order, in the pitch's own words: each question asked with its options one way and answered (\"Fair or unfair?\" / \"Fair\"), then asked with them swapped and answered the other way, sung forwards; end the song on the chorus with its answers swapped. The chorus and hook lines always play. Keep the mix at or under -1 dBFS with a master level; raise the roots an octave so the chords carry on small speakers; swing the whole kit together; make the stabs clearly audible; let the wobble move in every bar; use a real crash; cut each amen slice with the next; make the drops develop (drop 1b on the break's second half with a written stutter, drop 2 with an octave-up bass on the offbeats and the stabs wide open, the bridge opening the bass filter); duck the break under the bridge count; draw transitions from Jev's probabilities and keep them off the chorus's last line; make part and energy levels play what their labels say."
48    output: song.js
49    art: 0.62
50    artRuns: [0.62, 0.62, 0.62]
51---
52
53# OPTION ORDER — spec
54
55`song.js` is generated from this spec. Change the spec first, then the song.
56
57## Intent
58
59Jev's answers depend on how the question is written. Facts:
60- `jev-mcp-blakestone-x` (`~/brains/personal/technology/artificial-intelligence/jev/ecosystem/jev-mcp-blakestone-x.md`):
61  reversing the display order of choice criteria flipped 32 of 200
62  classifications; richer label descriptions raised agreement from 81.0% to
63  84.5% at 2.8× the token cost. This is the song's source: its flips come
64  from order alone.
65- `jevkit` (`ecosystem/jevkit.md`): on identical input, changing only the
66  options' descriptions inverted a verdict — bare labels picked "analogy"
67  (p = 0.75), written-out descriptions picked "popular opinion" (p = 0.76).
68  Its offline linter exists to catch this before spending. That flip came
69  from rewording, not reordering, so the song does not sing it.
70
71## Style
72
73- Glitch-hop, 100 bpm, D minor: Dm – Bb – F – C, two bars each: an 8-bar
74  loop, carried by the bass and short stabs. The roots sit at D2 Bb1 F2 C2
75  (58–87 Hz), so the progression survives laptop and phone speakers.
76- Swung, heavy half-time drums: the whole kit swings together (16ths,
77  `swingBy(1/3, 8)`: kick, snare, hats, fill and stabs alike).
78- The stabs are clearly audible, about 10 dB under the drums.
79- Wobble bass: the wobble rate per bar (4 4 8 4 2 4 8 16 wobbles) is heard
80  as written, in every bar.
81- The amen break: each slice is cut by the next.
82- Stutter edits are written out (fixed ply/cut patterns), not random.
83- "Reversed" means the options read in reverse order: the chorus asks a
84  question with its options one way and Jev answers, then asks it with the
85  options swapped and Jev answers the other way. Nothing is tape-reversed
86  but drop 2's break.
87
88## Structure
89
9064 bars (~2:34).
91
92| Bars | Section | Contents |
93|---|---|---|
94| 1–8 | Intro | Drums and wobble, filtered |
95| 9–16 | Chorus | Vocoder: each question, then Jev's answer; the options swapped, the other answer |
96| 17–24 | Drop 1 | Instrumental: the break's slices 0–15; the crash on bar 17 |
97| 25–32 | Drop 1b | Instrumental: the break's slices 16–31, with a written ply stutter on beat 4 of every 2nd bar |
98| 33–40 | Bridge | "Thirty-two out of two hundred" over a stuttering break; the bass filter opens over the 8 bars |
99| 41–44 | Hook | "Wait, it's all shuffled?" / "Always has been" |
100| 45–56 | Drop 2 | Instrumental, the break reversed every other bar; the bass doubled an octave up on the offbeats, the stabs fully open; the crash on bar 45 |
101| 57–64 | Outro | The chorus once more, forwards, with its answers swapped; ends on the flip and a last hit |
102
103## Vocals
104
105- Vocoder chorus, in the pitch's own pairs. Each chord gets two bars: the
106  question on its first bar, Jev's answer on its second. One chord asks
107  with the options one way, the next asks with them swapped, and the
108  answer follows the order:
109  1. Dm: "Fair or unfair?" / "Fair"
110  2. Bb: "Unfair or fair?" / "Unfair"
111  3. F: "Approve or fix now?" / "Approve"
112  4. C: "Fix now or approve?" / "Fix now"
113- Outro: the same questions on the same chords, forwards, with the answers
114  swapped ("Unfair", "Fair", "Fix now", "Approve"), so the song ends on an
115  audible flip. Each answer is rendered on the chord it lands on.
116- Bridge: "Thirty-two out of two hundred" on Dm (bar 33), then a
117  written-out stutter of it ("thir- thir- thir- thirty-two out of two
118  hundred") on F (bar 37), a second render of the line. The break drops
119  back while the count speaks (bars 33 and 37).
120- Hook: the "Wait, it's all Ohio? / Always has been" astronaut meme.
121  "Wait, it's all shuffled?" is the plain `speak` voice (no clip of the
122  original line says "shuffled"); "Always has been" is the real spoken
123  line, cut from a YouTube upload of the meme.
124
125The source is blakestone-x's order flips: 32 of 200 verdicts changed when
126only the options' order did. The pairs above are illustrative — words the
127pitch named, claiming no measurement — and the measured rate is the
128bridge's count. Rev 2 had swapped the pairs for jevkit's "analogy / popular
129opinion" flip because it happened, but that flip came from rewording the
130options, not reordering them (jevkit README, fetched 2026-09-25), so it
131cannot illustrate this title, and the pitch's pairs are back. Rev 2 also
132sang each line tape-reversed on its chord's second bar; reversed speech
133transcribes as gibberish and carries nothing, so the reversal is now the
134options' order.
135
136## Jev in the booth
137
138Jev arranges the song as it plays, as two jevs declared at the top in
139TypeSafe's own shape (`jev({ state, questions })`, `website/src/jev/`),
140both given the song as state (subject, tempo, key, chords, lyrics):
141
142- **`formJev`** asks one choice: which **section** plays next.
143- **`djJev`** asks, once that is decided, how much of each part plays
144  this section (drums, the amen break, the wobble bass, the chord stabs,
145  the bridge vocals: each **out**, **back** or **full**, a score), how the
146  song moves **into** it (a choice), and a score for the section's
147  **energy**. Questions in one request cannot see each other's answers, so
148  it is a second request, told the section just chosen (`after: { section }`).
149
150Both are asked every 8 bars (`.every(8, …)`), and the answers are
151composed in ordinary Strudel at the bottom: `walk` holds the form's rules,
152each part plays at its level (`part(name, pat)`), the transition plays
153over the last bar before each section, and `energy.score` scales the
154velocity.
155
156**The form.** Sections are 8-bar windows of the song as written, so `hook`
157holds the 4-bar hook and the first 4 bars of drop 2. A section may be
158followed only by these:
159
160| Section | Bars as written | May be followed by |
161|---|---|---|
162| `intro` | 1–8 | chorus |
163| `chorus` | 9–16 | drop1 |
164| `drop1` | 17–24 | drop1b |
165| `drop1b` | 25–32 | bridge, chorus |
166| `bridge` | 33–40 | hook |
167| `hook` | 41–48 | drop2 |
168| `drop2` | 49–56 | outro, chorus, drop1, bridge |
169| `outro` | 57–64 | (the end) |
170
171These rules are code (`walk`), not Jev: each request offers Jev only the
172sections allowed next. The written order is always allowed, and it is what
173plays when Jev can't be reached. The song ends when Jev picks the outro,
174whose last hit always lands; at 16 sections the outro is forced. A section
175plays its own bars, so a repeated chorus is the chorus.
176
177**The parts.** Each question says what the part is and the sections it
178plays in as written, so Jev can drop parts to build tension or make space,
179pull them back to let others speak, and bring them in full for the payoff:
180
181| Part | Plays in |
182|---|---|
183| drums | every section: filtered in the intro, only hats under the meme in the hook's first half, thinning to a last hit in the outro |
184| breaks | drop1, drop1b, bridge, hook (its second half), drop2 |
185| bass | every section but the outro (in the hook, its second half only) |
186| stabs | chorus, drop1, drop1b, hook (its second half), drop2 |
187| vocals | bridge only: the count and its stutter |
188
189Jev's score is rounded to its label, and the label sets both whether the
190part plays and how loud: **out** below 0.5 (silent for the section),
191**back** from 0.5 to 1.5 (velocity .5), **full** from 1.5 (velocity 1, as
192written). One helper derives both from the score. A part keeps its own
193masks, so it still plays only where the table above puts it. Each part
194plays on its own orbit, named for its question (`.orbit('drums')`, …), so
195the browser's meter hears each part alone. When Jev can't be reached,
196every part plays in full.
197
198**The joke always plays.** The chorus lines (in the chorus and the outro)
199and the hook's two lines are not a part Jev levels: they play at a fixed
200level on the vocals orbit, outside the energy scaling, wherever their
201section plays. Jev keeps the bridge count and its stutter. (The moves the
202pitch gave Jev never included muting the vocals.)
203
204**Into the next section.** Over the last bar of each section, the next
205section's `into` answer plays: a **cut** (nothing), a **fill** (a
206snare-and-clap roll doubling up to thirty-seconds, rising in level, swung
207with the kit, on the drums' orbit), a **riser** (white noise swelling up
208through an opening high-pass), or a **dropout**, where every part stops
209for the last beat. The transition is drawn from Jev's probabilities
210(`sample`, temperature 1), not always its top pick. Out of the chorus, a
211fill or riser plays only on the last two beats, so it never covers the
212chorus's last line. The form's ending has no next section, so nothing
213plays over its last bar and its last beat is never cut. When Jev can't be
214reached, it cuts.
215
216**A little chance.** The section is sampled from Jev's
217probabilities at temperature 0.7 (`sample`), so two plays of the song can
218take different paths; the strip shows Jev's top pick beside the one
219sampled. A close call between
220sections is where sampling matters most, so there is no confidence
221threshold: an unsure Jev still picks, and the written order plays only
222when Jev can't be reached.
223
224**Energy** is a four-step ladder, and each rung is a velocity that scales
225every leveled part together, on top of each part's level, so the mix keeps
226its balance: **held back** .55, **steady** .7, **driving** .85, **all out**
2271 (as written). The fixed vocal lines and the last hit are outside it: the
228last kick and crash always land in full.
229
230- Bars 1–8 always play as written.
231- Each request carries the song's state (subject, tempo, key, chords,
232  lyrics), every answer so far, how loud each finished section measured in
233  the browser, where the song is in the form and the sections left before
234  the cap, and the listener's 🔥/😴 reactions.
235- This relaxes the constraints below that the song plays once in a fixed
236  order and never varies by chance: the arrangement varies with Jev's
237  choices, which are judgments, with a little sampled chance in the form
238  and the transitions.
239
240## Constraints
241
242- Plays once from bar 1 and ends; never loops. Sections are absolute-cycle
243  masks, so playback starts from stopped.
244- Structured: patterns vary by section, never by chance. (Random chopping
245  read as noise on the first song.)
246- No sustained background pad; harmony comes from rhythmic parts.
247- Vocals only where the structure table puts them; drops are instrumental.
248- The mix peaks at or under −1 dBFS as measured; a master level
249  (`postgain`) on the final stack sets it.
250- The crash is a crash: `hh27:1` (Dirt-Samples' `cr` is a ride), its gain
251  matched to the ride it replaced (about +15 dB).
252- Meme clips are the real audio (myinstants, or YouTube via yt-dlp), cut at
253  word timings measured with whisper.cpp. Vocoder lines are made with
254  `speak` + `vocode` on the chord they land on, and checked by transcribing
255  the result with whisper (`small.en` and `medium.en`). Everything lands in
256  `samples/<sound>/` with a provenance row in `samples/README.md`.
257- Samples load from `samples('jev-samples/strudel.json')`; drums from
258  `github:tidalcycles/dirt-samples`.