SPEC.mdpreviewSPEC.mdsource254 lines · 17.9 KB · raw

title: SYSTEM ONE theme: jev status: made song: song.js measured: {"date":"2026-09-25","song":"c30c083f26af","total":{"loudnessDbfs":-24.1,"peakDbfs":-2.4},"parts":{"bass":{"loudnessDbfs":-30.2,"peakDbfs":-10.4},"chime":{"loudnessDbfs":-45.8,"peakDbfs":-21.8},"drums":{"loudnessDbfs":-27.7,"peakDbfs":-8.7},"ending":{"loudnessDbfs":-50.6,"peakDbfs":-10.5},"stabs":{"loudnessDbfs":-31.4,"peakDbfs":-8.5},"vocals":{"loudnessDbfs":-32.6,"peakDbfs":-7.2}},"sections":{"1-4":{"total":{"loudnessDbfs":-32,"peakDbfs":-13.5},"parts":{"bass":{"loudnessDbfs":-40.3,"peakDbfs":-28.9},"drums":{"loudnessDbfs":-36.9,"peakDbfs":-17.5},"vocals":{"loudnessDbfs":-34.9,"peakDbfs":-14.4}}},"5-8":{"total":{"loudnessDbfs":-32,"peakDbfs":-13.8},"parts":{"bass":{"loudnessDbfs":-40.2,"peakDbfs":-28.9},"drums":{"loudnessDbfs":-36.9,"peakDbfs":-15.7},"vocals":{"loudnessDbfs":-34.9,"peakDbfs":-14.4}}},"9-12":{"total":{"loudnessDbfs":-30.5,"peakDbfs":-13.1},"parts":{"bass":{"loudnessDbfs":-36.8,"peakDbfs":-28.1},"chime":{"loudnessDbfs":-38.9,"peakDbfs":-23.4},"drums":{"loudnessDbfs":-34.9,"peakDbfs":-18},"vocals":{"loudnessDbfs":-36.4,"peakDbfs":-14.3}}},"13-16":{"total":{"loudnessDbfs":-22.3,"peakDbfs":-3},"parts":{"bass":{"loudnessDbfs":-28.9,"peakDbfs":-17.5},"chime":{"loudnessDbfs":-118.2,"peakDbfs":-93.7},"drums":{"loudnessDbfs":-25.7,"peakDbfs":-8.8},"vocals":{"loudnessDbfs":-27.1,"peakDbfs":-7.2}}},"17-20":{"total":{"loudnessDbfs":-24.4,"peakDbfs":-7.8},"parts":{"bass":{"loudnessDbfs":-30,"peakDbfs":-18.3},"drums":{"loudnessDbfs":-25.7,"peakDbfs":-8.8},"vocals":{"loudnessDbfs":-138.5,"peakDbfs":-109.9}}},"21-24":{"total":{"loudnessDbfs":-24.2,"peakDbfs":-7.4},"parts":{"bass":{"loudnessDbfs":-29.1,"peakDbfs":-17.8},"drums":{"loudnessDbfs":-25.8,"peakDbfs":-8.9},"vocals":{"loudnessDbfs":-509.3,"peakDbfs":-480.6}}},"25-28":{"total":{"loudnessDbfs":-24,"peakDbfs":-7},"parts":{"bass":{"loudnessDbfs":-28.5,"peakDbfs":-16.8},"drums":{"loudnessDbfs":-25.7,"peakDbfs":-8.8},"vocals":{"loudnessDbfs":-655.2,"peakDbfs":-626.8}}},"29-32":{"total":{"loudnessDbfs":-30.1,"peakDbfs":-13.1},"parts":{"bass":{"loudnessDbfs":-36,"peakDbfs":-22.3},"chime":{"loudnessDbfs":-38.5,"peakDbfs":-22.8},"drums":{"loudnessDbfs":-34.8,"peakDbfs":-16.8},"vocals":{"loudnessDbfs":-36.1,"peakDbfs":-15.4}}},"33-36":{"total":{"loudnessDbfs":-21.1,"peakDbfs":-3},"parts":{"bass":{"loudnessDbfs":-29.4,"peakDbfs":-16.6},"chime":{"loudnessDbfs":-110.6,"peakDbfs":-81.5},"drums":{"loudnessDbfs":-25.6,"peakDbfs":-8.7},"stabs":{"loudnessDbfs":-27,"peakDbfs":-8.5},"vocals":{"loudnessDbfs":-27.1,"peakDbfs":-7.2}}},"37-40":{"total":{"loudnessDbfs":-22.2,"peakDbfs":-5.5},"parts":{"bass":{"loudnessDbfs":-28.8,"peakDbfs":-16.9},"drums":{"loudnessDbfs":-25.6,"peakDbfs":-8.7},"stabs":{"loudnessDbfs":-27,"peakDbfs":-8.5},"vocals":{"loudnessDbfs":-140.1,"peakDbfs":-110.4}}},"41-44":{"total":{"loudnessDbfs":-22.3,"peakDbfs":-5.6},"parts":{"bass":{"loudnessDbfs":-29.1,"peakDbfs":-16.9},"drums":{"loudnessDbfs":-25.6,"peakDbfs":-8.7},"stabs":{"loudnessDbfs":-27,"peakDbfs":-8.5},"vocals":{"loudnessDbfs":null,"peakDbfs":null}}},"45-48":{"total":{"loudnessDbfs":-22.3,"peakDbfs":-5.8},"parts":{"bass":{"loudnessDbfs":-28.6,"peakDbfs":-16.9},"drums":{"loudnessDbfs":-25.7,"peakDbfs":-8.7},"stabs":{"loudnessDbfs":-27.1,"peakDbfs":-8.5},"vocals":{"loudnessDbfs":null,"peakDbfs":null}}},"49-52":{"total":{"loudnessDbfs":-30.2,"peakDbfs":-13},"parts":{"bass":{"loudnessDbfs":-37,"peakDbfs":-23.1},"chime":{"loudnessDbfs":-37.6,"peakDbfs":-21.8},"drums":{"loudnessDbfs":-34.8,"peakDbfs":-16.8},"stabs":{"loudnessDbfs":-64.3,"peakDbfs":-39.2},"vocals":{"loudnessDbfs":-36.4,"peakDbfs":-14.3}}},"53-56":{"total":{"loudnessDbfs":-20.3,"peakDbfs":-2.4},"parts":{"bass":{"loudnessDbfs":-25.9,"peakDbfs":-12.7},"chime":{"loudnessDbfs":-120.3,"peakDbfs":-94.8},"drums":{"loudnessDbfs":-25.6,"peakDbfs":-8.7},"stabs":{"loudnessDbfs":-27,"peakDbfs":-8.5},"vocals":{"loudnessDbfs":-27,"peakDbfs":-7.2}}},"57-60":{"total":{"loudnessDbfs":-21.5,"peakDbfs":-5},"parts":{"bass":{"loudnessDbfs":-25.9,"peakDbfs":-10.4},"drums":{"loudnessDbfs":-25.6,"peakDbfs":-8.7},"stabs":{"loudnessDbfs":-27,"peakDbfs":-8.5},"vocals":{"loudnessDbfs":-141.7,"peakDbfs":-114.7}}},"61-64":{"total":{"loudnessDbfs":-26.5,"peakDbfs":-7},"parts":{"bass":{"loudnessDbfs":-41.2,"peakDbfs":-16.5},"drums":{"loudnessDbfs":-46.7,"peakDbfs":-17.7},"ending":{"loudnessDbfs":-38.3,"peakDbfs":-10.5},"stabs":{"loudnessDbfs":-62.6,"peakDbfs":-36.7},"vocals":{"loudnessDbfs":-27.1,"peakDbfs":-7.2}}}}} critic: date: 2026-09-25 model: jev-1.13.0 method: rubric-1 art: 0.67 artRuns: [0.67, 0.68, 0.67] criteria: hook: 2.9 development: 3.5 structure: 3.4 concept: 4.1 originality: 3.7 craft: 2.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: "174 bpm drum and bass that keeps cutting to half speed. Every time "the LLM is thinking", the beat drops to 87 bpm under a Windows loading chime and "Let him cook". Then Jev answers in 70 ms and the full-speed beat snaps back. Vocoder hook: "Noul. Choice. Score." A robot voice reads "thinking, fast and slow" in the intro." revisions:
  • rev: 1 date: 2026-09-24 model: claude-opus-5-5 harness: claude-code prompt: "174 bpm drum and bass that keeps cutting to half speed. Every time "the LLM is thinking", the beat drops to 87 bpm under a Windows loading chime and "Let him cook". Then Jev answers in 70 ms and the full-speed beat snaps back. Vocoder hook: "Noul. Choice. Score." A robot voice reads "thinking, fast and slow" in the intro." output: null # overwritten by rev 2 art: 0.61 artRuns: [0.61, 0.61, 0.6]
  • 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 4-bar section with the sections allowed to follow it, so every think still leads into a drop and every drop still lands on Em; at each section Jev picks the next section, the move to play it with (as written, no drums, drums and bass, no bass), and how intense it is, and ends the song by choosing the outro, with a hard 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.67 artRuns: [0.67, 0.67, 0.67]
  • rev: 3 date: 2026-09-24 model: claude-opus-5-5 harness: claude-code prompt: "Give each part a level instead of on or off: at each section Jev sets the drums, bass, chord stabs, loading chime and vocals each out, back or full, and picks how the song moves into the section over the bar before it: straight in, an amen snare fill, a noise riser, or a one-beat dropout." output: null # overwritten by rev 4 art: null # not scored: the song.js before rev 4 was recorded is rev 2's, not rev 3's
  • rev: 4 date: 2026-09-25 model: claude-opus-5-5 harness: claude-code prompt: "Stop the mix clipping: the master peaks at or under -1 dBFS, with a short kick and no 808 tail (the sub carries the pitch) and the break choked. Make the levels climb: intro under think under drop, the drop at least 6 dB over the think, each later drop louder than the one before, and drop 3 adds the reese an octave up. Play the loading chime on the real Windows chime, after "Let him cook", within about 6 dB of the half-time drums. Make "Noul" read as one word. The dropout before a drop is silent, the outro rises into the final hit without a false ending, no bass root sits under 41 Hz, the drop crash is a real crash, and each part level and energy step plays exactly what its label says." output: song.js art: 0.67 artRuns: [0.67, 0.68, 0.67]

SYSTEM ONE — spec

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

Intent

Jev as Kahneman's System One: fast, intuitive, typed judgment, set against chat models that "think". Facts (~/brains/personal/technology/artificial-intelligence/jev/jev.md, noul.md, choice.md, score.md): TypeSafe positions Jev explicitly as System One and NOT for System 2 reasoning; its three question primitives are Noul (yes/no probability), Choice (a label from options the caller wrote) and Score (a 2–10 level scale); responses take 70–500 ms.

Style

  • Drum & bass at 174 bpm, E minor: Em – C – G – D, one bar each. Every drop and the outro start right after a multiple of 4 bars (bars 13, 33, 53, 61), so the hook always lands on Em.
  • The "thinking" sections are half-time (a 87 bpm feel) made with patterns: setcps stays constant, because the section masks count cycles.
  • Full-speed sections: two-step kick, rolling break, eighth hats, reese bass over a sine sub.
  • Half-time sections: kick on 1, snare on 3, quarter hats, no amen; the reese held on E and filtered down; the loading chime.
  • The loading chime is a Windows system sound, as the brief asks: chimes.wav from C:\Windows\Media (samples/sowinchime), played with note() so each think still ends its own way: think 1 resolves to E, think 2 is busier and resolves to E, think 3 stops on F# and never resolves. It sits within about 6 dB of the half-time drums, and its phrase starts after "Let him cook" (the first bar plays only its last eighth). Revisions 1–3 had swapped it for a triangle synth; this puts the brief's sound back.
  • Drop 2 adds short chord stabs and 16th hats; drop 3 adds the reese doubled an octave up on top of drop 2.
  • A short kick, no 808 tail: the sub carries the pitch. The kick is bd:3 alone (an 808bd rang 3 s at G1 against every chord). The break is choked (.cut(1)), so no amen slice outlasts its 16th.
  • No bass root under 41 Hz: the roots are E1 C2 G1 D2, with C and D voiced above E, so the bass holds up on laptop speakers.
  • The crash is hh27:1 (Dirt-Samples' cr is a ride).
  • The master peaks at or under −1 dBFS, set by a master postgain chosen by measurement (tools/measure), after the parts are balanced.

Structure

64 bars (~1:28).

BarsSectionContents
1–8IntroRobot voice: "Thinking, fast and slow"; filtered break
9–12Think 1Half-time; "Let him cook"; the Windows chime, resolving to E
13–28Drop 1Snaps back to full speed on "Noul. Choice. Score."; instrumental after the hook
29–32Think 2Half-time; a busier chime, resolving to E
33–48Drop 2Drop 1 plus chord stabs and 16th hats
49–52Think 3Half-time; the chime stops on F#, never resolves
53–60Drop 3Drop 2 plus the reese an octave up; shortest
61–64Outro"Noul. Choice. Score." once more, a riser over bar 62, the final hit on bar 63; nothing reads as the end before the hit

Levels climb. Intro < think < drop, with each drop at least 6 dB over the think before it. Drop 2 is at least 1.5 dB over drop 1 (its stabs and 16th hats), and drop 3 is over drop 2 (the reese an octave up). Measured per section with the fallbacks (as written), 2026-09-25, in dBFS: intro −32.1, think1 −30.7, drop1 −23.6, think2 −30.3, drop2 −22.0, think3 −29.7, drop3 −21.0; the master peaks at −2.9, where it peaked at +8.5 before.

Vocals

  • Robot voice (plain speak, not vocoded): "Thinking, fast and slow."
  • Vocoder hook, on the bar each drop lands: "Noul. Choice. Score." — Em. "Noul" must read back as one word from whisper small.en and medium.en, both dry and in the mix, never two words: rendered as "Nool" it read back as "Know all" / "No all", which says Jev is a know-all, the opposite of TypeSafe's narrow System One. SAPI's own reading of "Noul" comes back as "Newel" / "Null" (see samples/README.md).
  • Meme: "Let him cook" on the first bar of each think section ("Let him cook now" in think 2).

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 (the drums, the bass, the chord stabs, the loading chime, 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 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 (part(name, pat)), the transition plays over the last bar before each section, and energy.score scales the velocity.

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

SectionBars as writtenMay be followed by
intro1–4intro2
intro25–8think1
think19–12drop1
drop113–16drop1b
drop1b17–20drop1c, think2
drop1c21–24drop1d
drop1d25–28think2, think3
think229–32drop2
drop233–36drop2b
drop2b37–40drop2c, think3
drop2c41–44drop2d
drop2d45–48think3, think2
think349–52drop3
drop353–56drop3b
drop3b57–60outro, think2, drop2
outro61–64(the end)

Every think leads only into its own drop, so the hook ("Noul. Choice. Score.") still lands on the first bar of a drop, and on Em: sections start on the 4-bar chord cycle wherever they play. Jev can cut a drop short into the next think, or go back from the last drop to think again. 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 final hit always lands. The cap is 24 sections (96 bars, about 2:12) rather than 16: sixteen 4-bar sections are only the written length, which would leave Jev no room to repeat anything.

The parts. Each question says what the part is and where it plays 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. A part that is out is silent for the whole section; otherwise its velocity is scaled by its level, in whole steps (the score is rounded first, so a 1.5 plays as full, not between): out = 0, back = .5, full = 1. It 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 (.orbit('drums'), …), so the browser's meter hears each part alone. The riser into the end and the last kick, crash and Em chord always land, on their own orbit (ending). When Jev can't be reached, every part plays in full.

Into the next section. Over the last bar of each section, the next section's into answer plays: a cut (nothing), a fill (the song's own amen break stuttering on its snare and last slices across the second half of the bar, on the drums' orbit), a riser (white noise swelling up through an opening high-pass, on its own orbit, into), or a dropout, where every part stops for the last beat. The fill follows the drums level of the section whose last bar it plays in (out: no fill; back: half velocity), since that is the section it sounds and is metered in. Out of a think, the dropout silences everything for beat 4: the think's held bass stops after beat 3 and the chime's last notes decay before beat 4, so the full-speed beat snaps back out of a real gap. The form's ending has no next section, so nothing plays over its last bar and its last beat is never cut. The opening has no section before it, so it has no transition: into is fixed to a cut there (allow) and not asked. 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, in whole steps like the levels: held back (about half volume) .55, steady (well under full) .70, driving (nearly full) .85, all out (full volume) 1.0. It scales every part's velocity together, on top of each part's level, so the mix keeps its balance.

  • Bars 1–4 are always the intro. Jev sets its levels and energy before the song starts. The opening has no transition.
  • 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.

Constraints

  • Plays from bar 1 and ends, on the outro or at the 24-section cap; never loops. Sections are absolute-cycle masks, so playback starts from stopped.
  • Structured: patterns vary by section and by Jev's answers. The only chance is the next section, sampled from Jev's probabilities at temperature 0.7; no pattern is chopped or varied at random.
  • 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.cpp. 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.