SPEC.mdpreviewSPEC.mdsource258 lines · 16.4 KB · raw

title: OPTION ORDER theme: jev status: made song: song.js measured: {"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}}}}} critic: date: 2026-09-25 model: jev-1.13.0 method: rubric-1 art: 0.62 artRuns: [0.62, 0.62, 0.62] criteria: hook: 2.8 development: 3.5 structure: 3.3 concept: 3.9 originality: 3.5 craft: 1.6 ideas:

  • date: 2026-09-24 model: claude-opus-5-5 harness: claude-code prompt: "Research Jev's real use cases; jab at people using Jev where deterministic code would do better, such as game bots." 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." revisions:
  • rev: 1 date: 2026-09-24 model: claude-opus-5-5 harness: claude-code 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." output: null # overwritten by rev 2 art: 0.58 artRuns: [0.58, 0.58, 0.57]
  • rev: 2 date: 2026-09-24 model: claude-opus-5-5 harness: claude-code 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." output: null # overwritten by rev 3 art: 0.63 artRuns: [0.63, 0.64, 0.63]
  • rev: 3 date: 2026-09-25 model: claude-opus-5-5 harness: claude-code 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." output: song.js art: 0.62 artRuns: [0.62, 0.62, 0.62]

OPTION ORDER — spec

song.js is generated from this spec. Change the spec first, then the song.

Intent

Jev's answers depend on how the question is written. Facts:

  • jev-mcp-blakestone-x (~/brains/personal/technology/artificial-intelligence/jev/ecosystem/jev-mcp-blakestone-x.md): reversing the display order of choice criteria flipped 32 of 200 classifications; richer label descriptions raised agreement from 81.0% to 84.5% at 2.8× the token cost. This is the song's source: its flips come from order alone.
  • jevkit (ecosystem/jevkit.md): on identical input, changing only the options' descriptions inverted a verdict — bare labels picked "analogy" (p = 0.75), written-out descriptions picked "popular opinion" (p = 0.76). Its offline linter exists to catch this before spending. That flip came from rewording, not reordering, so the song does not sing it.

Style

  • Glitch-hop, 100 bpm, D minor: Dm – Bb – F – C, two bars each: an 8-bar loop, carried by the bass and short stabs. The roots sit at D2 Bb1 F2 C2 (58–87 Hz), so the progression survives laptop and phone speakers.
  • Swung, heavy half-time drums: the whole kit swings together (16ths, swingBy(1/3, 8): kick, snare, hats, fill and stabs alike).
  • The stabs are clearly audible, about 10 dB under the drums.
  • Wobble bass: the wobble rate per bar (4 4 8 4 2 4 8 16 wobbles) is heard as written, in every bar.
  • The amen break: each slice is cut by the next.
  • Stutter edits are written out (fixed ply/cut patterns), not random.
  • "Reversed" means the options read in reverse order: the chorus asks a question with its options one way and Jev answers, then asks it with the options swapped and Jev answers the other way. Nothing is tape-reversed but drop 2's break.

Structure

64 bars (~2:34).

BarsSectionContents
1–8IntroDrums and wobble, filtered
9–16ChorusVocoder: each question, then Jev's answer; the options swapped, the other answer
17–24Drop 1Instrumental: the break's slices 0–15; the crash on bar 17
25–32Drop 1bInstrumental: the break's slices 16–31, with a written ply stutter on beat 4 of every 2nd bar
33–40Bridge"Thirty-two out of two hundred" over a stuttering break; the bass filter opens over the 8 bars
41–44Hook"Wait, it's all shuffled?" / "Always has been"
45–56Drop 2Instrumental, the break reversed every other bar; the bass doubled an octave up on the offbeats, the stabs fully open; the crash on bar 45
57–64OutroThe chorus once more, forwards, with its answers swapped; ends on the flip and a last hit

Vocals

  • Vocoder chorus, in the pitch's own pairs. Each chord gets two bars: the question on its first bar, Jev's answer on its second. One chord asks with the options one way, the next asks with them swapped, and the answer follows the order:
    1. Dm: "Fair or unfair?" / "Fair"
    2. Bb: "Unfair or fair?" / "Unfair"
    3. F: "Approve or fix now?" / "Approve"
    4. C: "Fix now or approve?" / "Fix now"
  • Outro: the same questions on the same chords, forwards, with the answers swapped ("Unfair", "Fair", "Fix now", "Approve"), so the song ends on an audible flip. Each answer is rendered on the chord it lands on.
  • Bridge: "Thirty-two out of two hundred" on Dm (bar 33), then a written-out stutter of it ("thir- thir- thir- thirty-two out of two hundred") on F (bar 37), a second render of the line. The break drops back while the count speaks (bars 33 and 37).
  • Hook: the "Wait, it's all Ohio? / Always has been" astronaut meme. "Wait, it's all shuffled?" is the plain speak voice (no clip of the original line says "shuffled"); "Always has been" is the real spoken line, cut from a YouTube upload of the meme.

The source is blakestone-x's order flips: 32 of 200 verdicts changed when only the options' order did. The pairs above are illustrative — words the pitch named, claiming no measurement — and the measured rate is the bridge's count. Rev 2 had swapped the pairs for jevkit's "analogy / popular opinion" flip because it happened, but that flip came from rewording the options, not reordering them (jevkit README, fetched 2026-09-25), so it cannot illustrate this title, and the pitch's pairs are back. Rev 2 also sang each line tape-reversed on its chord's second bar; reversed speech transcribes as gibberish and carries nothing, so the reversal is now the options' order.

Jev in the booth

Jev arranges the song as it plays, as two jevs declared at the top in TypeSafe's own shape (jev({ state, questions }), website/src/jev/), both given the song as state (subject, tempo, key, chords, lyrics):

  • formJev asks one choice: which section plays next.
  • djJev asks, once that is decided, how much of each part plays this section (drums, the amen break, the wobble bass, the chord stabs, the bridge vocals: each out, back or full, a score), how the song moves into it (a choice), and a score for the section's energy. Questions in one request cannot see each other's answers, so it is a second request, told the section just chosen (after: { section }).

Both are asked every 8 bars (.every(8, …)), and the answers are composed in ordinary Strudel at the bottom: walk holds the form's rules, each part plays at its level (part(name, pat)), the transition plays over the last bar before each section, and energy.score scales the velocity.

The form. Sections are 8-bar windows of the song as written, so hook holds the 4-bar hook and the first 4 bars of drop 2. A section may be followed only by these:

SectionBars as writtenMay be followed by
intro1–8chorus
chorus9–16drop1
drop117–24drop1b
drop1b25–32bridge, chorus
bridge33–40hook
hook41–48drop2
drop249–56outro, chorus, drop1, bridge
outro57–64(the end)

These rules are code (walk), not Jev: each request offers Jev only the sections allowed next. The written order is always allowed, and it is what plays when Jev can't be reached. The song ends when Jev picks the outro, whose last hit always lands; at 16 sections the outro is forced. A section plays its own bars, so a repeated chorus is the chorus.

The parts. Each question says what the part is and the sections it plays in as written, so Jev can drop parts to build tension or make space, pull them back to let others speak, and bring them in full for the payoff:

PartPlays in
drumsevery section: filtered in the intro, only hats under the meme in the hook's first half, thinning to a last hit in the outro
breaksdrop1, drop1b, bridge, hook (its second half), drop2
bassevery section but the outro (in the hook, its second half only)
stabschorus, drop1, drop1b, hook (its second half), drop2
vocalsbridge only: the count and its stutter

Jev's score is rounded to its label, and the label sets both whether the part plays and how loud: out below 0.5 (silent for the section), back from 0.5 to 1.5 (velocity .5), full from 1.5 (velocity 1, as written). One helper derives both from the score. A part keeps its own masks, so it still plays only where the table above puts it. Each part plays on its own orbit, named for its question (.orbit('drums'), …), so the browser's meter hears each part alone. When Jev can't be reached, every part plays in full.

The joke always plays. The chorus lines (in the chorus and the outro) and the hook's two lines are not a part Jev levels: they play at a fixed level on the vocals orbit, outside the energy scaling, wherever their section plays. Jev keeps the bridge count and its stutter. (The moves the pitch gave Jev never included muting the vocals.)

Into the next section. Over the last bar of each section, the next section's into answer plays: a cut (nothing), a fill (a snare-and-clap roll doubling up to thirty-seconds, rising in level, swung with the kit, on the drums' orbit), a riser (white noise swelling up through an opening high-pass), or a dropout, where every part stops for the last beat. The transition is drawn from Jev's probabilities (sample, temperature 1), not always its top pick. Out of the chorus, a fill or riser plays only on the last two beats, so it never covers the chorus's last line. The form's ending has no next section, so nothing plays over its last bar and its last beat is never cut. When Jev can't be reached, it cuts.

A little chance. The section is sampled from Jev's probabilities at temperature 0.7 (sample), so two plays of the song can take different paths; the strip shows Jev's top pick beside the one sampled. A close call between sections is where sampling matters most, so there is no confidence threshold: an unsure Jev still picks, and the written order plays only when Jev can't be reached.

Energy is a four-step ladder, and each rung is a velocity that scales every leveled part together, on top of each part's level, so the mix keeps its balance: held back .55, steady .7, driving .85, all out 1 (as written). The fixed vocal lines and the last hit are outside it: the last kick and crash always land in full.

  • Bars 1–8 always play as written.
  • Each request carries the song's state (subject, tempo, key, chords, lyrics), every answer so far, how loud each finished section measured in the browser, where the song is in the form and the sections left before the cap, and the listener's 🔥/😴 reactions.
  • This relaxes the constraints below that the song plays once in a fixed order and never varies by chance: the arrangement varies with Jev's choices, which are judgments, with a little sampled chance in the form and the transitions.

Constraints

  • Plays once from bar 1 and ends; never loops. Sections are absolute-cycle masks, so playback starts from stopped.
  • Structured: patterns vary by section, never by chance. (Random chopping read as noise on the first song.)
  • No sustained background pad; harmony comes from rhythmic parts.
  • Vocals only where the structure table puts them; drops are instrumental.
  • The mix peaks at or under −1 dBFS as measured; a master level (postgain) on the final stack sets it.
  • The crash is a crash: hh27:1 (Dirt-Samples' cr is a ride), its gain matched to the ride it replaced (about +15 dB).
  • Meme clips are the real audio (myinstants, or YouTube via yt-dlp), cut at word timings measured with whisper.cpp. Vocoder lines are made with speak + vocode on the chord they land on, and checked by transcribing the result with whisper (small.en and medium.en). Everything lands in samples/<sound>/ with a provenance row in samples/README.md.
  • Samples load from samples('jev-samples/strudel.json'); drums from github:tidalcycles/dirt-samples.