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.
| Register | Status | Gravity Rule | Burden of Proof |
|---|---|---|---|
joy | shipped | 50 → 55 | embody, don't justify |
swagger | shipped | 50 → 60 | concrete-anchor proof |
rage | shipped | unchanged | target + present-tense verb |
playfulness | shipped | 50 → 40 | rhythmic surprise + concrete absurdity |
grief | home register | 50 (default) | show, don't tell |
melancholy | home register | 50 (default) | show, don't tell |
lust | awaiting | TBD | TBD |
awe | awaiting | TBD | TBD |
tenderness | awaiting | TBD | TBD |
defiance | awaiting | TBD | TBD |
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.
B3372Strategic anchor
WAR ROOM doc + SA#32 ratification + brand constant
B3373J0 step 1 — schema
ToneRegister field on Brief; 10-register vocabulary in extractor with 10 prompt-side mapping examples; 35 tests
B3374J0 step 2 — forge prompt fragment
Per-register block in renderBriefBlock; load-bearing JOY block carries operator failure quotes as forbidden patterns; 52 tests
B3375J0 step 3 — negative anchors
data/lyric-anchors-negative-by-register.json — 11 anchors across joy / swagger / rage / playfulness
B3376J0 step 4 — AVD audit primitive
Active Verb Density scorer with per-register thresholds; reproduces operator failure verdict; 34 tests
B3377J0 step 5 — dashboard surface
FidelityPanel "Tone register" chip + AVD verdict (green = met, orange = below)
B3378J1 step 6 — Crucible voice appendix
Per-voice systemPrompt addendum teaching each of the 8 Crucible voices the register-specific craft rules
B3379J2 step 7 — anti-inflation modifiers
Per-register Gravity / Burden of Proof / Antagonist Ceiling overrides shipped as pure-function data + eval skill markdown
B3380J3 step 8 — gauntlet awareness
buildGauntletSystemPrompt(severity, register?); per-register refinement-target block prevents gauntlet from polishing register-correct texture out
B3381J3.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.
B3382J4 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
B3382J5 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:
- Green AVD met — the song delivered ≥ the per-verse active-verb floor (joy=4, swagger=5, rage=4, others=3). Register obedience confirmed.
- Orange AVD below — the song shipped under the floor. The delivered lyric likely drifted toward a different register than declared. Read it with that gap in mind.
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.
The standard
12-metric rubric · CC BY 4.0 · machine-readable JSON
Whitepaper
Formal methodology, anti-inflation rules, calibration corpus
Inter-rater agreement
Pre-registered methodology · 30-rater human cohort · ICC
Reproducibility seal
ed25519 signature spec · pubkey JSON · verifier
Changelog
Full version history + accepted RFCs
Version diff
Compare any two rubric versions side by side
Model card
Reference-implementation model disclosure
Prior art
Conservatory rubrics + MIR research + industry frameworks the open standard extends
Sleeper ledger
Day-1 vs Day-2 cold-temperament drift aggregates. Auto-publishes at 200 sleeper-tested songs.
Hit Calibration
Curated corpus of historically-significant songs scored by the rubric — proves it grades craft, not chart success.