A writer agent and a judge it can't sway
Each song starts as a one-line premise: an AI or IT ideal against the messy reality. One writer agent reads a shared brief, the two earlier songs, my blog posts, and a Suno style guide, brainstorms about 25 gags, keeps the best dozen, and writes the song. Then it spawns a new judge agent every round. The judge scores the song against a rubric, quotes the weak lines, and says APPROVED or REVISE. A fresh judge each round means no one grades their own homework twice. Approval takes 8.5 or better with no rubric item below 7, in five rounds at most.
Round 1 caught rap lines running 17 to 19 syllables and flat last words. By round 4 it passed at 8.6. Then I read it in the songbook app and left 15 line notes, and the writer applied them one by one.
# Suno sings roughly one line per two bars seconds = lines × 480 / BPM × k # k = 1.0 sung, 0.8 patter, 0.5 for rap lines $ count.py songs/24-the-steep-part.md 110 BPM lines=54 rap=32 words=436 est=2:45 OK (target ≤ 3:10)
I want songs under 3:30. An early song ran about 650 words and came back 4:07, so every draft now has to print OK before a judge sees it.
Then I read it, edit it, and hear it early
- Read it in the songbookA small Bun app shows every song. I tap a line and mark it Love it, Cut or Change, with a note, and give the song a status: Keeper, Needs work or Drop.
- Sketch it in SunoBefore many edits, I load a rough draft into Suno just to hear the style. Does the genre land, does the hook stick, can you hear the joke? If not, I change the style or drop the song while it's still cheap.
- The writer applies my notesClaude reads my notes file, revises the lyrics line by line, marks each note resolved and replies under it. The open page refreshes by itself.
- Repeat until it's a keeperRead, sketch, edit again. Only a keeper gets a final take, timings and a video.
// feedback/24-the-steep-part.json: what the songbook app saves when I tap a line { "status": "rework", // keeper | rework | drop "pin": "working", "note": "Push verse 2 harder", "lines": [{ "line": "So I made my loop look busy. Boss said \"clever\"", "kind": "cut", // love | cut | change "note": "too slow", "resolved": false, // the writer sets true once it's fixed… "reply": "" // …and answers here, under my note }] }
# a rough draft goes to Suno before the polishing rounds $ bun suno 24-the-steep-part --fill # fill the form, I click Create and listen # does the genre land? does the hook stick? is the joke audible at this tempo? # if not, change the Style or the premise now, while it's still cheap
Hearing it first is the cheapest test. A clever lyric in the wrong genre is still a dud.
# research/writer-process.md, step 4: the writer spawns this judge every round "You are the judge for a comedic Suno song. Read research/brief.md (the 'Judge rubric' section is your job), skim research/suno-guide.md sections 1-3, and read the song at <song path>. Run count.py <song path>. Score each rubric item 1-10, then give a verdict: APPROVED or REVISE, with up to 6 prioritized, concrete fixes that quote weak lines. Be tough; earlier rounds' reviews are at <prior review paths>, so check whether those fixes landed. Write your review to reviews/<slug>.r<round>.md, and end with 'VERDICT: APPROVED (score X)' or 'VERDICT: REVISE (score X)'. Do not edit the song." # songs/24-the-steep-part.md, the Judge log the writer keeps - Round 1: REVISE (7.1) — V2 rap lines ran 17-19 syllables, weak last words… - Round 4: APPROVED (score 8.6/10) — Listen-for on Suno: if V2 rushes, drop the (Approved?) ad-lib first; check "Q3" and "S-O-C two" pronunciation
The writer may push back on a fix that would hurt a joke, but it has to say why in the log.
I burst into the standup: "Guys, the singularity's here!"
Somebody said, "Great. File a ticket. We'll talk next year."