Human Contribution Log
How SongForgeAI computes and verifies the “X% human-authored” claim on every song. A per-line provenance ledger, deterministic computation, and the legal context that makes the number matter.
Why this exists
The U.S. Copyright Office's 2025 guidance held the line: copyright protection requires human authorship. Purely AI-generated outputs do not qualify. Mixed AI-human work CAN qualify — but only the human-authored portions, and only when the human contribution is documented and identifiable. The same posture is emerging in EU + UK rulings and in the major PROs' emerging policies.
The Human Contribution Log is the documentation layer for that requirement. Every line of every song carries a stable provenance value recording WHO touched it and WHEN. The aggregate %human number on the seal is computed deterministically from those values — not estimated, not asserted by the model, not handed to the user as a vibe.
This methodology document is the reference an external lawyer, PRO, or A&R representative can read to understand exactly what the seal claims, how it's computed, and where the underlying ledger lives.
The four provenance values
Every content line in every song carries one of these four values at any given moment. Section headers ([VERSE 1]) and performance directives ([WHISPER]) are not tracked — only the lyric content lines. The provenance can change over time as the line is mutated, but the value at any moment reflects WHO last touched the line.
ai-originalAIAI wrote it. Human never touched it.
The forge produced this exact line and the user has not interacted with it since. The starting state of every line on every freshly-forged song.
Example"Six-twenty in a parking lot" — emitted by the war room, kept by the user as-is.
ai-revisedAIThe gauntlet rewrote it. Still no human input.
The line started as ai-original, then the automated gauntlet pass (or another AI mutation step) replaced it with a different line. The ledger preserves the previousText for the chain-of-title, but provenance is still AI — there was no human intervention.
ExampleOriginal: "I held my breath under" → Gauntlet: "I held the dive line tight" — no user click, just the wound-targeted rewriter.
human-lockedcounts as humanHuman read AI line, explicitly approved it.
The user read the AI-emitted line and clicked "lock" (or accepted a rewrite option without typing). The text may be unchanged, but the act of reading + selecting + endorsing constitutes a human authorship decision. Counts as human under the seal.
ExampleUser clicks the line, reads three rewrite options, picks one — the chosen line is locked at the moment of selection.
human-editedcounts as humanHuman typed it.
The user replaced the AI line with their own text — either via the inline rewrite popover or by manually editing the lyrics textarea. Most direct form of human authorship.
Example"My hands look just like daddy's" — written by the songwriter, not the model.
The critical asymmetry: ai-revised does NOT count
When the gauntlet pass rewrites a line, the new line's provenance is ai-revised, not human. This is intentional — it's what keeps the %human number honest.
Without this asymmetry, a song could pass through the gauntlet three times and end up at “100% human” despite zero user intervention. The asymmetry guarantees that the number can only go UP through actual human action: locking a line, editing a line, or accepting a chosen rewrite from the inline popover. Automated AI-to-AI mutations are forever marked as such.
How the percentage is computed
The aggregate %human is a simple ratio over the song's content lines:
humanContributionFraction(ledger) =
count(entries where provenance ∈ {'human-locked', 'human-edited'})
÷
count(entries)
humanContributionPct(ledger) = round(fraction × 100)Section markers and performance directives are excluded from the denominator (they're not lyric content). Lines are counted equally regardless of length — a short hook line counts as one ledger entry, the same as a long verse line. No weighting, no adjustments.
How the ledger updates over time
When the user mutates the lyrics, the ledger reconciles via a deterministic line-by-line diff:
- Unchanged lines preserve their existing provenance. A line that was
human-editedstayshuman-editedacross subsequent forge operations until the line text itself changes. - Changed or new lines are assigned the provenance the mutating action declares —
human-editedfrom the textarea save path,human-lockedfrom the line-rewrite acceptance path,ai-revisedfrom a gauntlet pass. - The previousText breadcrumb captures what the line was before the change. The seal can surface “originally AI wrote X, human changed to Y” without bloating the canonical entry.
- humanTouchedAt is pinned on first human contact and survives subsequent automated mutations. A line that was human-edited at 5:00 PM and then ai-revised at 6:00 PM still records 5:00 PM as the first human-touch timestamp — even though the current provenance is now AI.
- Duplicate lines (e.g. two identical chorus lines) are tracked as independent ledger entries — never collapsed. Each instance carries its own provenance.
The schema (machine-readable)
The canonical TypeScript definition lives in src/lib/contribution-ledger.ts (CC BY 4.0). External adopters implementing against this methodology should match this shape so ledgers are portable across systems:
type LineProvenance =
| 'ai-original' // forge produced; never touched
| 'ai-revised' // forge produced; gauntlet/refine modified
| 'human-locked' // forge produced; human approved (locked-in)
| 'human-edited'; // human typed the line
interface LedgerEntry {
text: string; // current line text
provenance: LineProvenance;
humanTouchedAt?: string; // ISO; pinned on first human contact
previousText?: string; // breadcrumb of last change
}
interface ContributionLedger {
version: 1;
entries: LedgerEntry[]; // one per content line
initiatedAt: string; // ISO; stable across updates
updatedAt: string; // ISO; bumps on every reconciliation
}How third parties can verify
The ledger is stored as a JSONB column on the song row in Supabase. The owner of the song can export it as a signed Authorship Receipt via the “Receipt” download in the dashboard (one click, JSON download). Public-song receipts are also available to any visitor — same endpoint, no auth required for songs marked public.
The receipt is a single self-contained JSON document carrying:
- The full ledger (every line, provenance, humanTouchedAt, previousText breadcrumbs).
- Aggregates recomputed server-side (humanContributionPct, countByProvenance) so the receipt's headline numbers don't depend on the verifier running the math.
- A SHA-256 contentHash of the canonical-JSON of the receipt body — recomputable by any verifier who canonicalizes-then-hashes.
- An ed25519 signature over
{ receiptVersion, songId, generatedAt, contentHash }— verifiable against the public key served at /.well-known/songforgeai-pubkey . The signature converts the receipt from “trust us” to “verify mathematically.” - Cite-back to this methodology page + the canonical schema URL.
Endpoint: GET /api/songs/[id]/authorship-receipt — returns application/json with Content-Disposition: attachment. The methodology — how the number is computed from a ledger — is what's public on this page, citeable and reproducible against any compliant ledger.
The chip's three states
The ContributionChip component renders in three distinct states. Each state is a deliberate choice about what to communicate and when:
“Authorship not yet tracked”
Rendered when the song has no ledger at all — typically because it was forged before Build 1496 (when the schema shipped) and hasn't been touched since. We do NOT render 0% in this case because the AI:human split is genuinely unknown, not zero-human.
“AI-original”
Rendered when the song has a ledger but every line is still ai-original or ai-revised. Honest badge; the user has not intervened.
“X% human-authored” (color-graded)
Rendered when at least one line is human-edited or human-locked. Color tier: emerald ≥ 40%, amber 20-39%, sky 1-19%.
License
This methodology is published under CC BY 4.0 — the same license as the parent Lyric Scoring Standard. Adopt it freely, implement against the schema, cite the spec. Attribution required:
Human Contribution Log v1 SongForgeAI (2026) https://songforgeai.com/scoring/standard/human-contribution-log Licensed under CC BY 4.0