Home / Product / Atlas and Studio

The Recognition - Studio Structure Spec (A/B against Origin Soul Song)

Updated Jun 26, 2026 · Affirmology_TheRecognition_StudioSpec_v1.md

Summary. Spec for Claude Code. Goal: build "The Recognition," a pure, maximum-recognition-density identity audio that can be A/B tested head-to-head against the current Origin Soul Song. Do NOT replace Origin. The A/B decides whether The Recognition replaces Origin, fo

The Recognition - Studio Structure Spec (A/B against Origin Soul Song)

Spec for Claude Code. Goal: build "The Recognition," a pure, maximum-recognition-density identity audio that can be A/B tested head-to-head against the current Origin Soul Song. Do NOT replace Origin. The A/B decides whether The Recognition replaces Origin, folds its principles back into Origin, or stays a separate audio.

1. What it is and the hypothesis

The Recognition is the Origin Soul Song's core job (identity recognition) distilled and intensified. Same foundational shape and length as Origin, but with the Tier 1 recognition stack cranked to maximum and the aspirational/becoming content dialed down. The hypothesis to test: a purer, higher-recognition-density audio beats the current Origin on the first-run "this gets me" reaction.

Tier 1 recognition stack (from Affirmology_IdentityResearch_v1.md), maximized here: - Self-relevance personalization: every line is specific to THIS chart, no generic affirmation. - Chart-derived prediction-error reduction: open by naming their actual life pattern, not a greeting. - First-person present-tense "I am." - Recognition over instruction: "I am the one who…", "I remember…", never "you should become." - Listener-language mirroring: weave the person's own words/metaphors where available. - Mechanism over label and chart-specific metaphor: name the felt human experience, never jargon, never gate/channel numbers.

What is dialed DOWN versus Origin: forward/becoming/aspirational language and any open-loop "next step." The Recognition stays almost entirely in present-tense "this is who I am" recognition. That single variable (recognition density vs becoming) is what the A/B isolates.

2. Implementation - reuse the Origin pipeline, isolate one variable

Background (verified in the engine): the Origin Soul Song uses an EMPTY directive, which makes the generator use the hardened SCRIPT_SYSTEM_PROMPT_ORIGIN formula (identity-first "I am [name]" by sentence 2-3, shadow-to-gift body, HD gate/channel numbers translated to felt qualities, the hand-on-heart breath + embodied-gratitude beat, open-loop close, ~3 to 4 min, Charlotte voice, Heavenly Circuit bed, QC). A structure with a NON-empty directive instead goes through the flex prompt, a different path. For a clean single-variable A/B, The Recognition should reuse the Origin formula, not the flex path.

Recommended approach (clean A/B, additive, Origin path byte-unchanged):

  1. In the engine, add a sibling prompt SCRIPT_SYSTEM_PROMPT_ORIGIN_RECOGNITION that is SCRIPT_SYSTEM_PROMPT_ORIGIN with two changes only: (a) recognition density turned to maximum (more chart-accurate "I am the one who…" recognition lines, explicit instruction to mirror the listener's own language when provided, every claim chart-specific); (b) the becoming/aspirational/open-loop beats reduced to a single quiet closing line so the audio stays in present-tense recognition. Keep everything else identical to Origin (length ~3.5 min, the hand-on-heart breath beat, HD numbers out, no em dashes, first person, QC).
  2. Select it by structure id: in the script generator's prompt-selection logic, when the structure id is the_recognition, use SCRIPT_SYSTEM_PROMPT_ORIGIN_RECOGNITION; the empty-directive Origin path and the flex path are both untouched. This is the only engine wiring.
  3. Add the the_recognition Structure (data) below.

Faster alternative (if you want zero engine change first): give the_recognition a directive that restates the Origin beats and maximizes recognition, so it runs through the flex path. This is quicker but the flex-vs-Origin-formula path difference is a confound in the A/B, so prefer the recommended approach for a real test. If you do the fast version first, note it in the result so we read the A/B with that caveat.

The Structure to add (api/structures.py, Foundational category, near origin_soul_song)

    Structure(
        id="the_recognition",
        category="Foundational",
        name="The Recognition",
        description="A pure, maximum-recognition identity audio: who you are, named so precisely it cannot be dismissed. A/B variant of the Origin Soul Song.",
        target_minutes=3.5,
        directive="",  # empty: uses the engine's Origin-Recognition formula, selected by id (see spec section 2)
        overview=(
            "WHAT IT DOES: Distills the Origin Soul Song to its core job, recognition, and turns it "
            "up. Every line is specific to this person's chart and, where we have them, their own "
            "words, named as present-tense 'this is who I am' rather than who they are becoming. "
            "SCOPE: Pure identity recognition, the 'this gets me' hit, for the demo and first run. "
            "WHY IT IS USEFUL: It is the A/B test variant of the Origin Soul Song. If it wins on the "
            "first-run reaction, it either becomes the new Origin or its principles fold into Origin."
        ),
        metrics=AudioMetrics(
            format="audio", identity=10, transformation=3, energy="warm", pacing="measured",
            emotional_tone="empowering", tools=("heart-coherence breath",),
            stage="identify", time_of_day="anytime", theme="identity", duration_min=3.5,
            voice="soul-song-female", bed="heavenly-circuit", repetition_role="daily-driver",
            tier_visibility="free",
        ),
    ),

Note: identity=10 (matching Origin) and transformation=3 (lower than Origin's 4, because becoming is dialed down) make the difference legible in the metrics.

3. Running the A/B

The studio already has A/B variant grouping (variant_group / variant_label columns and endpoints, per project state). Use it:

  1. For the same person (start with jeff), render BOTH origin_soul_song and the_recognition.
  2. Tag them into one variant group (e.g. group "origin_vs_recognition", labels "origin" and "recognition").
  3. Listen to both back to back in the Listening Room and rate which lands the stronger "this gets me" reaction. Repeat across a few real charts (Sol, Colin, a beta tester) before concluding.

4. Verification (required)

  1. python -m pytest tests/test_starter_palette.py -q. Note: The Recognition is in the Foundational category, which IS a consumer-palette category, so it WILL appear in /api/structures. The palette tests use subset checks for the SEED list and assert the 4 palette category ids, so an added Foundational structure should not break them, but if a count assertion trips, update the assertion to include the_recognition, do not remove it. Also confirm the test test_natal_sacred_killed_one_canonical_origin_soul_song still passes (exactly one structure named "Origin Soul Song"; The Recognition has a different name, so this should hold).
  2. python -c "from api import structures as S; s=S.get_structure('the_recognition'); print(s.name, s.target_minutes, s.metrics.identity, s.metrics.transformation, repr(s.directive))" should print The Recognition 3.5 10 3 ''.
  3. If you added the engine prompt: render the_recognition for jeff and read script.md aloud. Check: opens by naming his actual pattern (not a greeting), "I am [name]" lands in the first ~3 sentences, every line is chart-specific recognition, almost no becoming/aspirational language, a single quiet closing line, HD gate/channel NUMBERS are absent, no em dashes, first person throughout, ~3.5 min of content. Compare side by side with an origin_soul_song render for the same person.

5. Do-not-touch / rules