SPEC.mdpreviewSPEC.mdsource308 lines · 21.0 KB · raw

title: BORROW CHECKER BLUES theme: jev status: made song: song.js measured: {"date":"2026-09-26","song":"c754533d1086","total":{"loudnessDbfs":-21.8,"peakDbfs":-2.1},"parts":{"bass":{"loudnessDbfs":-29.3,"peakDbfs":-14},"drums":{"loudnessDbfs":-24.2,"peakDbfs":-3.3},"other":{"loudnessDbfs":-39.3,"peakDbfs":-5.5},"stabs":{"loudnessDbfs":-33.3,"peakDbfs":-12},"vocals":{"loudnessDbfs":-30.2,"peakDbfs":-5.8}},"sections":{"1-4":{"total":{"loudnessDbfs":-29.1,"peakDbfs":-14},"parts":{"bass":{"loudnessDbfs":-29.1,"peakDbfs":-14}}},"5-8":{"total":{"loudnessDbfs":-22.3,"peakDbfs":-6.9},"parts":{"bass":{"loudnessDbfs":-29.2,"peakDbfs":-14.4},"drums":{"loudnessDbfs":-23.7,"peakDbfs":-9.1}}},"9-12":{"total":{"loudnessDbfs":-20.9,"peakDbfs":-3.2},"parts":{"bass":{"loudnessDbfs":-29.2,"peakDbfs":-14.1},"drums":{"loudnessDbfs":-23.5,"peakDbfs":-5},"stabs":{"loudnessDbfs":-32.2,"peakDbfs":-13.5},"vocals":{"loudnessDbfs":-26.6,"peakDbfs":-6.5}}},"13-16":{"total":{"loudnessDbfs":-20.6,"peakDbfs":-2.9},"parts":{"bass":{"loudnessDbfs":-29.3,"peakDbfs":-14.4},"drums":{"loudnessDbfs":-23.5,"peakDbfs":-5},"stabs":{"loudnessDbfs":-32.3,"peakDbfs":-14.7},"vocals":{"loudnessDbfs":-27.1,"peakDbfs":-6.1}}},"17-20":{"total":{"loudnessDbfs":-20.5,"peakDbfs":-2.4},"parts":{"bass":{"loudnessDbfs":-29.1,"peakDbfs":-14},"drums":{"loudnessDbfs":-23.5,"peakDbfs":-5},"stabs":{"loudnessDbfs":-32.2,"peakDbfs":-13.5},"vocals":{"loudnessDbfs":-25.6,"peakDbfs":-5.9}}},"21-24":{"total":{"loudnessDbfs":-21.2,"peakDbfs":-2.2},"parts":{"bass":{"loudnessDbfs":-29.2,"peakDbfs":-14.4},"drums":{"loudnessDbfs":-23.4,"peakDbfs":-3.6},"stabs":{"loudnessDbfs":-32.5,"peakDbfs":-14},"vocals":{"loudnessDbfs":-30.8,"peakDbfs":-5.9}}},"25-28":{"total":{"loudnessDbfs":-22.1,"peakDbfs":-4.6},"parts":{"bass":{"loudnessDbfs":-29.1,"peakDbfs":-14.1},"drums":{"loudnessDbfs":-23.4,"peakDbfs":-5},"stabs":{"loudnessDbfs":-32.3,"peakDbfs":-12.8}}},"29-32":{"total":{"loudnessDbfs":-21.7,"peakDbfs":-3.5},"parts":{"bass":{"loudnessDbfs":-29.2,"peakDbfs":-14.4},"drums":{"loudnessDbfs":-23.4,"peakDbfs":-5},"stabs":{"loudnessDbfs":-32.4,"peakDbfs":-13.4},"vocals":{"loudnessDbfs":null,"peakDbfs":null}}},"33-36":{"total":{"loudnessDbfs":-21.3,"peakDbfs":-3.8},"parts":{"bass":{"loudnessDbfs":-29.2,"peakDbfs":-14},"drums":{"loudnessDbfs":-23.5,"peakDbfs":-5},"stabs":{"loudnessDbfs":-32.5,"peakDbfs":-13.5},"vocals":{"loudnessDbfs":-28.1,"peakDbfs":-6.3}}},"37-40":{"total":{"loudnessDbfs":-20.2,"peakDbfs":-2.1},"parts":{"bass":{"loudnessDbfs":-29.2,"peakDbfs":-14.4},"drums":{"loudnessDbfs":-23.5,"peakDbfs":-5},"stabs":{"loudnessDbfs":-32.4,"peakDbfs":-14.7},"vocals":{"loudnessDbfs":-25.4,"peakDbfs":-6.4}}},"41-44":{"total":{"loudnessDbfs":-20.5,"peakDbfs":-2.4},"parts":{"bass":{"loudnessDbfs":-29.1,"peakDbfs":-14},"drums":{"loudnessDbfs":-23.5,"peakDbfs":-5},"stabs":{"loudnessDbfs":-32.2,"peakDbfs":-13.5},"vocals":{"loudnessDbfs":-25.6,"peakDbfs":-5.8}}},"45-48":{"total":{"loudnessDbfs":-21.2,"peakDbfs":-2.2},"parts":{"bass":{"loudnessDbfs":-29.2,"peakDbfs":-14.4},"drums":{"loudnessDbfs":-23.3,"peakDbfs":-3.3},"stabs":{"loudnessDbfs":-32.3,"peakDbfs":-12.6},"vocals":{"loudnessDbfs":-30.7,"peakDbfs":-5.9}}},"49-52":{"total":{"loudnessDbfs":-22.1,"peakDbfs":-4.7},"parts":{"bass":{"loudnessDbfs":-29.2,"peakDbfs":-14},"drums":{"loudnessDbfs":-23.5,"peakDbfs":-5.1},"stabs":{"loudnessDbfs":-32.2,"peakDbfs":-12.6}}},"53-56":{"total":{"loudnessDbfs":-21.7,"peakDbfs":-3.7},"parts":{"bass":{"loudnessDbfs":-29.2,"peakDbfs":-14.4},"drums":{"loudnessDbfs":-23.4,"peakDbfs":-5},"stabs":{"loudnessDbfs":-32.3,"peakDbfs":-12}}},"57-60":{"total":{"loudnessDbfs":-22.1,"peakDbfs":-4.5},"parts":{"bass":{"loudnessDbfs":-29.1,"peakDbfs":-14},"drums":{"loudnessDbfs":-23.4,"peakDbfs":-5},"stabs":{"loudnessDbfs":-32.2,"peakDbfs":-12.7}}},"61-64":{"total":{"loudnessDbfs":-25,"peakDbfs":-5},"parts":{"bass":{"loudnessDbfs":-29.2,"peakDbfs":-14.4},"drums":{"loudnessDbfs":-72.1,"peakDbfs":-42.4},"other":{"loudnessDbfs":-27.1,"peakDbfs":-5.5},"stabs":{"loudnessDbfs":-56.7,"peakDbfs":-23.6}}}}} critic: date: 2026-09-26 model: jev-1.13.0 method: rubric-1 art: 0.66 artRuns: [0.66, 0.66, 0.66] criteria: hook: 3.1 development: 3.2 structure: 3.2 concept: 3.9 originality: 3.6 craft: 2.9 ideas:

  • date: 2026-09-24 model: claude-opus-5-5 harness: claude-code prompt: "Give me some song ideas as prompts, in the same Jev theme: perhaps with actual memes in the vocals, or a vocoder sound." brief: "Daft Punk–style French house at 124 bpm. A vocoder robot sings real Rust compiler errors as the lyrics: "cannot borrow as mutable", "lifetime may not live long enough". Every time it finally compiles, drop "It's free real estate". Filtered disco chords and a four-on-the-floor kick. Vocals in the verses and chorus only." revisions:
  • rev: 1 date: 2026-09-24 model: claude-opus-5-5 harness: claude-code prompt: "Daft Punk–style French house at 124 bpm. A vocoder robot sings real Rust compiler errors as the lyrics: "cannot borrow as mutable", "lifetime may not live long enough". Every time it finally compiles, drop "It's free real estate". Filtered disco chords and a four-on-the-floor kick. Vocals in the verses and chorus only." output: null # overwritten by rev 2 art: 0.57 artRuns: [0.57, 0.57, 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. Cut it into named 4-bar sections, each with the sections allowed to follow it; at every section Jev picks the next section, the move to play it with (as written, no drums, bass and drums, no vocals) and how intense it is, and ends the song by choosing the outro, with a cap of 24 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.62, 0.63]
  • rev: 3 date: 2026-09-24 model: claude-opus-5-5 harness: claude-code prompt: "Instead of one move per section, let Jev set each part (robot bass, drums, disco stabs, vocals) out, back or full for the section, each on its own orbit, and pick how the song moves into the section over the last bar before it: a cut, a kick-and-clap fill, a riser of disco stabs on the bar's chord, or a one-beat dropout. The outro's last beat always plays. Without Jev every part plays full and each section comes in on a cut." output: null # overwritten by rev 4 art: 0.62 artRuns: [0.62, 0.62, 0.62]
  • rev: 4 date: 2026-09-25 model: claude-opus-5-5 harness: claude-code prompt: "Make the hook, the payoff and the mix land. Sing the hook as "Lint. Before you spend." so it is not heard as "link", with no clap on its second beat. Before each Wow the robot sings cargo's "Finished dev profile", so the Wow answers the build succeeding. The first verse line is rustc's own label, "cannot borrow as mutable", and the last is E0499, "cannot borrow as mutable more than once at a time". The disco stabs carry the harmony within about 6 dB of the bass and open bar by bar through each groove; the bass takes each chord's own seventh, the major seventh on Dmaj7, and its sub sits an octave higher; the grooves open on a real crash. Within a phrase Jev moves on with a cut or a fill; risers and dropouts only between phrases, never over a Wow, and a transition follows the part levels of the section it plays in. Energy scales the parts and transitions but never the ending, and nothing clips." output: null # overwritten by rev 5 art: 0.66 artRuns: [0.66, 0.66, 0.66]
  • rev: 5 date: 2026-09-26 model: claude-opus-5-5 harness: claude-code prompt: "Keep Jev from looping a groove: each groove may go round once more at most, cut short, so the first section of each groove plays at most twice and its last section once, and no run of grooves passes 36 bars. Every detour still plays. The opening has no section before it, so its move in is a cut and Jev's levels for it play." output: song.js art: 0.66 artRuns: [0.66, 0.66, 0.66]

BORROW CHECKER BLUES — spec

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

Intent

Deterministic tools in front of Jev. The Jev tie-in is jevkit (~/brains/personal/technology/artificial-intelligence/jev/ecosystem/jevkit.md): a Rust CLI whose jev lint checks a question set offline against 13 rules before any API spend — about 0.5 ms locally against a 273 ms API call — because on identical input, rewording the options inverted Jev's verdict. The compiler says no before the model is ever asked.

Two changes from the brief:

  • Genre and tempo: robot-funk at 110 bpm, E dorian, split from TOO CHEAP TO METER's 124 bpm A minor French house, instead of French house at 124.
  • Payoff meme: Owen Wilson's "Wow" instead of "It's free real estate", which TOO CHEAP TO METER uses.

Style

  • Robot-funk, 110 bpm, E dorian: Em7 – A7 – Dmaj7 – Bm7, two bars per chord, so each vocoded line sits on one chord.
  • Slap-style synth bass line carrying the song; talk-box feel from the vocoder; four-on-the-floor kick, clap on 2 and 4, open hats.
  • The riff takes each chord's own 7th: the minor 7th on Em7, A7 and Bm7 (D, G, A), the major 7th on Dmaj7 (C♯), so the bass never plays a C natural under the chord's C♯ or the lines sung on it.
  • The sub doubles the chord's root at E2, A2, D2 and B1 (82, 110, 73 and 62 Hz): never under 60 Hz, where a laptop speaker plays nothing and the bass-only intro and outro would thin out.
  • Filtered disco chord stabs (short, not a pad). They carry the only harmony, so they sit within about 6 dB of the bass, not under the drums.

Structure

64 bars (~2:20).

BarsSectionContents
1–8IntroBass line alone; four-on-the-floor kick from bar 5
9–16Verse 1Compiler errors 1–4; claps, hats, filtered stabs
17–20Chorus"Lint. Before you spend." on bars 17 and 19, with no clap on their second beat so the "t" of "Lint" is heard; on 20 the build succeeds: "Finished dev profile", then "Wow" on the and of beat 3
21–32GrooveInstrumental; open hats; crash on 21; the stab filter opens bar by bar, 1000 → 1800 Hz
33–40Verse 2Compiler errors 5–8
41–44ChorusAs before, the claps out of 41 and 43
45–60GrooveInstrumental; crash on 45; the stab filter opens bar by bar, 2000 → 6000 Hz
61–64OutroBass line alone; "Finished dev profile" on 62, the final "Wow" on 63

Each part as written, per section (what Jev's "full: as written" means):

SectionPlays as written
Intro, bars 1–4bass
Intro, bars 5–8bass, drums (kick only)
Verses, chorusesbass, drums, stabs, vocals
Groovesbass, drums, stabs
Outrobass; its "Finished dev profile" and "Wow" are the ending, not the vocals part

Verse 2 starts on bar 33 so each vocoded line lands on the first bar of its chord (the harmony cycles every 8 bars); so the first groove is 12 bars and the second 16.

Vocals

  • Vocoder, one line per 2 bars — real rustc error texts, as rustc 1.98.1 prints them (each checked by compiling a small program that triggers it):
    1. "Cannot borrow as mutable" — Em7 (E0596's span label, under "cannot borrow v as mutable, as it is not declared as mutable"; the brief's own wording)
    2. "Lifetime may not live long enough" — A7
    3. "x does not live long enough" — Dmaj7 (E0597)
    4. "Use of moved value" — Bm7 (E0382)
    5. "Mismatched types" — Em7 (E0308)
    6. "Which is behind a shared reference" — A7 (E0507: "cannot move out of *s which is behind a shared reference")
    7. "Expected Foo, found Bar" — Dmaj7 (E0308's label for a struct/enum mismatch)
    8. "Cannot borrow as mutable more than once at a time" — Bm7 (E0499: "cannot borrow x as mutable more than once at a time")
  • Chorus (vocoder): "Lint. Before you spend." — rendered on Em7 and on A7, the two chords the chorus lines land on. The full stop keeps "Lint" apart from "before"; run together it is heard as "Link".
  • The build succeeding (vocoder, the same robot as the errors): "Finished dev profile", cargo's own line when a build compiles (Finished `dev` profile [unoptimized + debuginfo] target(s), cargo 1.98), right before each "Wow" — rendered on A7 for the choruses' bars 20 and 44, and on Dmaj7 for the outro's bar 62. It lasts 1.4 s, more than half a bar, so in the chorus the "Wow" comes on the and of beat 3.
  • Meme: Owen Wilson "Wow", the answer to the build succeeding.
  • Every vocoder line has to transcribe correctly with both whisper small.en and medium.en before it ships; samples/README.md records what each model read back.

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, among the song's sixteen 4-bar sections (the chorus and the outro are 4 bars, so 4 is the length that divides every section).
  • djJev asks, once that is decided, a level per part (robot bass, drums, disco stabs, vocals: out, back or full in this section), 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 4 bars (.every(4, …)), and the answers are composed in ordinary Strudel at the bottom: walk holds the form's rules, each part plays at its level, the transition plays over the last bar before the section, and energy.score scales the velocity.

The form. A section may be followed only by these:

SectionBars as writtenMay be followed byPlays at most
intro11–4intro2
intro25–8verse1a
verse1a9–12verse1b
verse1b13–16chorus1
chorus117–20groove1a, verse2a
groove1a21–24groove1btwice
groove1b25–28groove1c, verse2a
groove1c29–32verse2a, groove1aonce
verse2a33–36verse2b
verse2b37–40chorus2
chorus241–44groove2a
groove2a45–48groove2btwice
groove2b49–52groove2c, outro
groove2c53–56groove2d, groove2aonce
groove2d57–60outro, groove1a, chorus2, verse1a
outro61–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 "Wow" always plays; at 24 sections (96 bars, about 3½ minutes) the outro is forced. A section plays its own bars, so each vocoded line still lands on its chord.

A detour (groove1b → verse2a, groove1c → groove1a, groove2c → groove2a, groove2d → groove1a, chorus2 or verse1a) can leave an 8-bar progression halfway, so the next section repeats the half it left: two bars of Dmaj7 and Bm7 again, or of Em7 and A7. In a funk vamp over four chords that is accepted, and it keeps the detours musical.

Loops end. Uncapped, the ways back let Jev loop a groove until the cap: a review heard the first groove go round for 44 bars, and the form allowed 56. So each groove's first section plays at most twice and its last section once in a performance (times in walk, which counts every play, since a loop is a cycle of different sections and none of them repeats back to back): a groove goes round once more at most, and the repeat is cut short (groove1a → b → c → a → b, then on). The longest run of grooves any path can now take is 36 bars, groove 2 and then its detour into groove 1 once round, where it was 56. Every detour can still play, and the written order is never capped. A section that has played its most is not offered, nor is one that could only reach the outro through one.

The parts. Each question says what the part is and where it plays as written, and Jev sets each one out (silent for the section), back (under the rest of the mix) or full (as written): the bass alone before the beat returns, the stabs pulled back under a verse, an instrumental chorus. The level is a Score, so it is Jev's probability-weighted answer: under 0.5 the part is silent, and above it the part plays at its nearest step: back at half velocity, full as written. A part that plays keeps its own masks, so vocals still appear only where the structure table puts them. Each part plays on its own orbit named for its question (bass, drums, stabs, vocals), so the browser's meter hears each one alone. Each section's description in the section choice names the parts it plays as written (the table under Structure), and the outro's lyrics say its "Wow" is the ending: the outro's "Finished dev profile" and "Wow" are not a part and always play. When Jev can't be reached, every part plays full.

Into the next section. Jev also picks how the song moves into the section it is deciding, and it plays over the last bar of the section before it: cut (straight in), fill (a kick and clap fill, getting denser into the downbeat), riser (the disco stabs repeating in sixteenths on the chord of the bar, their filter sweeping open) or dropout (every part stops for the last beat, a gap before the section hits). The outro has no section after it, so its last beat always plays. When Jev can't be reached, it is a cut. The rules are code, not Jev:

  • Within a phrase (intro1 → intro2, a verse's a → b, a groove's a → b → c → d, and a groove back to its own start) the move is a cut or a fill; a riser or a dropout is offered only where one phrase gives way to another (allow on the into choice). The opening has no section before it, so nothing plays into it: its move is a cut, unasked, and Jev's levels for the opening play.
  • No transition plays over a chorus's "Wow" bar (bars 20 and 44 as written), wherever the chorus falls in Jev's arrangement.
  • A riser's filter ends where the next section's stabs begin (their stabLpf on its first bar), and its level never goes over the stabs'.
  • A transition follows the part level of the section it plays in: the fill is the drums part, the riser the stabs part, so a part Jev set out takes its transition with it.

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, from held back to all out. It scales every part's velocity and the transitions together (0.55 to 1), so the mix keeps its balance. The ending is not scaled: the outro's "Finished dev profile" and last "Wow" play at their written level.

  • Bars 1–4 always play as written.
  • Each request tells Jev the song's subject, tempo, key, chords and lyrics (its state), what every section holds (the section choice's options), where the song is in the form and the sections left before the cap, everything played so far, how loud each finished section measured in the browser, and the 🔥/😴 reactions from the listener's tab.
  • This relaxes the constraint below that the song plays once in a fixed order: the arrangement varies with Jev's choices, which are judgments, with a little sampled chance in the form.

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.
  • 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. The crash is hh27:1 (Dirt-Samples' cr holds only ride cymbals), its gain matched to the ride it replaced.
  • The mix peaks at or under -1 dBFS, a decibel of headroom: superdough has no master limiter, so the levels keep it there (kick .5, clap .42) and a master level of .7 on the whole song (postgain) keeps the measured peak under -1 dBFS (.8 read -0.8 once the meter counted every sample). No compressor on the drums: superdough's is a Web Audio compressor per hit, whose automatic makeup gain raised the drums' peak by 2.1 dB and loudness by 2.8 dB when measured (2026-09-25).