Skip to content
Back to the Lyric Scoring Standard

Register-aware craft

SA#32 · Lyric Scoring Standard extension · Build 3382

Quality is not universal; register defines craft. Different emotional registers require different anti-inflation rules. A 12-metric rubric calibrated against the failure mode of overclaiming in ballads (Gravity Rule, Burden of Proof, Antagonist Ceiling) is the right rubric for grief and melancholy. It is the wrong rubric for joy, swagger, rage, and playfulness — those registers don't earn through narrative proof; they earn through embodiment, repetition, kinetic presence, and rhythmic surprise.

Why this page exists

An operator submitted SIX consecutive prompts asking for “upbeat, joyful, energetic, main character energy” and received six meditative-introspective songs back. The system delivered Phoebe Bridgers when Lizzo was asked for. Quantified gap: ~2.8 active verbs per verse vs the 5+ requested; ~65 BPM vs 120+; ~4/10 valence vs 8+/10; zero joy markers per chorus across all six.

That failure became SA#32 ratification and the 10-build response below. The system is published here BEFORE the operator says it works — the discipline is honest about what shipped and what still depends on operator-paced corpus work.

The 10 canonical registers

The brief extractor parses the user's prompt for register markers and tags one of these as brief.toneRegister. When present, every downstream surface reads it.

RegisterStatusGravity RuleBurden of Proof
joy
shipped
50 → 55embody, don't justify
swagger
shipped
50 → 60concrete-anchor proof
rage
shipped
unchangedtarget + present-tense verb
playfulness
shipped
50 → 40rhythmic surprise + concrete absurdity
grief
home register
50 (default)show, don't tell
melancholy
home register
50 (default)show, don't tell
lust
awaiting
TBDTBD
awe
awaiting
TBDTBD
tenderness
awaiting
TBDTBD
defiance
awaiting
TBDTBD

Per-register details: the four shipped registers (joy / swagger / rage / playfulness) carry per-register modifier blocks in src/lib/claude/register-anti-inflation.ts + the negative-anchor catalog at data/lyric-anchors-negative-by-register.json. The four “awaiting” registers (lust / awe / tenderness / defiance) hold open per SA#11 — anchors enter via operator-surfaced real-world success or failure cases, not speculation.

The 10-build J-phase response

From WAR ROOM to live infrastructure in 11 builds across one focused session. The shipped column is honest about what activates the runtime versus what awaits operator-paced curation.

B3372

Strategic anchor

WAR ROOM doc + SA#32 ratification + brand constant

B3373

J0 step 1 — schema

ToneRegister field on Brief; 10-register vocabulary in extractor with 10 prompt-side mapping examples; 35 tests

B3374

J0 step 2 — forge prompt fragment

Per-register block in renderBriefBlock; load-bearing JOY block carries operator failure quotes as forbidden patterns; 52 tests

B3375

J0 step 3 — negative anchors

data/lyric-anchors-negative-by-register.json — 11 anchors across joy / swagger / rage / playfulness

B3376

J0 step 4 — AVD audit primitive

Active Verb Density scorer with per-register thresholds; reproduces operator failure verdict; 34 tests

B3377

J0 step 5 — dashboard surface

FidelityPanel "Tone register" chip + AVD verdict (green = met, orange = below)

B3378

J1 step 6 — Crucible voice appendix

Per-voice systemPrompt addendum teaching each of the 8 Crucible voices the register-specific craft rules

B3379

J2 step 7 — anti-inflation modifiers

Per-register Gravity / Burden of Proof / Antagonist Ceiling overrides shipped as pure-function data + eval skill markdown

B3380

J3 step 8 — gauntlet awareness

buildGauntletSystemPrompt(severity, register?); per-register refinement-target block prevents gauntlet from polishing register-correct texture out

B3381

J3.5 step LOAD-BEARING

Brief extractor reads pre-SuperPrompt rawPrompt instead of post-SuperPrompt seed.prompt. This is the build that ACTIVATES B3373-B3380 — they were dormant for 6 consecutive operator failures before this fix.

B3382

J4 step 9 — corpus scaffolding

data/lyric-anchors-positive-by-register.json — empty curation registry; per-register criteria documented; awaits operator-paced exemplars per SA#11

B3382

J5 step 10 — public surface

This page: /scoring/standard/register-awareness — declares the discipline + the open gaps

Open gaps (honest)

  • No N=large measurement. The operator's 6-failure log is the only empirical evidence. An A/B (50 prompts × 5 registers, blind-judged for register match) is the load-bearing measurement that doesn't yet exist. Until it does, claims of fix-quality are inference, not measurement.
  • Empty positive-anchor pool. The B3382 corpus scaffold ships with zero curated joy / swagger / rage / playfulness exemplars. Per SA#11 + SA#30, anchors enter via real-world success cases — when the system produces a register-correct joy lyric, that lyric is the seed. The forge currently relies on the per-register prescriptive prompt block (B3374) + the negative anchors (B3375), without positive exemplars.
  • 50-voice room still skewed. The forge's war-room voice panel is weighted toward Cohen / Mitchell / Van Zandt / Bridgers archetypes. Lizzo / Bruno Mars / Kesha / Max Martin archetypes are underrepresented. Per-voice rebalancing is a separate strategic build (not in the J-phase scope).
  • Gauntlet caller plumbing. B3380 made the gauntlet capable of register-aware refinement. The downstream caller (gauntlet route + auto-gauntlet inside the forge pipeline) needs to read brief.toneRegister from the persisted song row and pass it through. Currently the gauntlet awareness is dormant until the caller wiring lands.

How to read a register-declared song

On any song forged after B3381, the dashboard's Fidelity panel carries a “Tone register” chip. When the chip is present, the brief extractor tagged a non-default register. The companion AVD chip ships in two colors:

Canonical sources: SA#32 in src/lib/sacred-accidents/data.ts · WAR ROOM doc in docs/WAR-ROOM-MAIN-CHARACTER-ENERGY-2026-05-27.md · all 11 J-phase builds visible in the commit log on torgin-dev/songforge-ai.

More from the standard