← Vault Index
Source: frameworks/kit-case-study/05-case-study-output-skill.md

05 — OUTPUT SKILL: Case Study Kit

Scope

Produces: Three files per Mode 1 run — V1 named HTML (approval-required), V2 anonymized HTML (publishable on day one), and a markdown delivery doc that contains both versions inline plus an email to the practice owner. Audience for the output: The practice owner whose website will host the case studies. Their prospects are the ultimate readers. Filenames:

[client-first-last]-case-studies-v1-approval-required.html
[client-first-last]-case-studies-v2-anonymized.html
[client-first-last]-case-study-delivery.md

where [client-first-last] is the practice owner. Lifecycle: One-shot per extraction. New cases trigger new runs, not edits to existing files.


Required Inputs (restated for standalone use)

Before producing anything, confirm all of the following are set. If any are missing, halt and request — do not improvise.

#InputSource
1Practice owner identification (name + business name)Client card or extraction
2Profession type — cpa / ea / cfp / ria / insurance / attorney / generalExtraction or asked of Kathryn
3Extraction output (filled case-study-extraction-template.html) OR raw transcriptUpstream — practice owner provides
4Brand colors (primary, secondary, accent)Practice owner's design system / website. AOS defaults if explicitly chosen as fallback.
5Brand fonts (heading, body)Practice owner's design system. AOS defaults if explicitly chosen as fallback.
6CTA destination URLExtraction or asked of Kathryn — never invented
7Number of storiesSet by extraction — kit does not invent additional or collapse existing
8Convertri hosting flag — true / falseAsked of Kathryn if not specified — never assumed
9Team member name (optional)Extraction — only if practice owner wants a team member FAQ card

Content Rules (numbered, enforceable)

  1. Case studies are third-person narrative. Tell the featured client's story in the practice owner's voice. Never put words in the featured client's mouth.
  2. Zero fabricated quotes. No invented quotes. No paraphrased "feelings as quotes." If the extraction has a real verbatim quote worth using, place it in the delivery email's introduction — not inside a case study card.
  3. Every dollar figure, percentage, and timeline is sourced to the extraction. Verbatim. If a number isn't in the extraction, it doesn't appear in the output.
  4. Forward-looking figures use "projected" or "estimated." Never "will save," "guaranteed," "you'll see."
  5. Active voice always. "We restructured the business," not "the business was restructured."
  6. Specific verbs, not vague ones. Replace "streamlined" with the actual action. Replace "optimized" with the actual change. Replace "transformed" with what specifically changed.
  7. Zero forbidden words. See 02-case-study-terminology.md Forbidden Terms — leverage, synergy, unlock, empower, journey, coaching, mindset, crush it, game-changer.
  8. Zero hedging language. Strip "might," "could," "would likely," "may." State what happened.
  9. V1 is named, V2 is anonymized. They are not the same document with different cosmetic edits — V2 is rebuilt against the Anonymization Table, every transformable element transformed.
  10. The anonymization test is the gate, not a guideline. Could the featured client identify themselves in V2? If yes, anonymize further before delivering.
  11. V1 must include the HTML approval-required comment block at the top of with the full checklist (replace [CLIENT NAME], get written permission, confirm numbers, have client review).
  12. Disclaimer matches profession exactly. Per 02-case-study-terminology.md Disclaimer Templates. V1 omits the "anonymized" phrase; V2 includes it.
  13. Brand source is the practice owner's design system, not AOS defaults. AOS defaults are fallback only and require an explicit choice — never silently applied.
  14. When Convertri = true, all Convertri rules apply (no CSS variables, no mailto, no separate scripts, explicit text-align, gold scrollbar with AOS defaults). When Convertri = false, those constraints relax.
  15. Delivery email does not pitch. Connects to practice owner's language, mentions V1/V2, opens the door to an Advisory OS conversation. No pricing, no standalone build offer.

Conditional Logic

Disclaimer Selection

IF profession_type IN [cpa, ea]:
    USE cpa_disclaimer
ELSE IF profession_type IN [cfp, ria]:
    USE financial_disclaimer
ELSE IF profession_type = insurance:
    USE insurance_disclaimer
ELSE IF profession_type = attorney:
    USE attorney_disclaimer
ELSE:
    USE general_disclaimer

For V1: same template as V2 but with the "have been anonymized to protect client confidentiality" phrase removed.

Convertri Compliance

IF convertri_hosting = true:
    APPLY all Convertri rules (see 02-terminology Convertri Rules):
      - Hardcode all hex colors (no var(--))
      - No mailto: links — only the configured CTA URL
      - No separate <script> blocks — inline JS only
      - Explicit text-align on every content element
      - Gold scrollbar (only when using AOS defaults)
ELSE:
    CSS variables permitted
    Mailto permitted (though typically still avoid in favor of CTA URL)
    Separate <script> blocks permitted

Brand Source

IF practice_owner_design_system_extracted:
    USE practice_owner_brand_colors AND practice_owner_brand_fonts
ELSE IF kathryn_explicitly_chooses_aos_default:
    USE aos_default_colors (charcoal/cream/gold) AND aos_default_fonts (Cormorant Garamond + Inter)
ELSE:
    HALT — surface the gap, ask for brand source

Team Member FAQ

IF team_member_name IN extraction:
    INCLUDE "Can [TEAM MEMBER] be involved?" FAQ card
    (Note: FAQ cards are an optional element — only when extraction calls for them)
ELSE:
    OMIT

V1 vs V2 Content (per story)

ElementV1V2
Title[CLIENT NAME] — [Story Title][Story Title] only
IndustrySpecific (per extraction)Archetype (per Anonymization Table)
Strategy tagsSpecific names (per extraction)Generic names (per Anonymization Table)
LocationsIncludedRemoved
Family/business namesIncludedRemoved
Future plansSpecificGeneric forward-looking
DisclaimerProfession template without anonymization phraseProfession template with anonymization phrase
Approval blockPresent (HTML comment at top of )Not present

Production Workflow

Step 1 — Intake Confirmation

Before reading the extraction, confirm with Kathryn:

"Here's what I understood:

Does this match your intent, or am I missing something?"

Wait for confirmation. Do not proceed on silence.

Step 2 — Pre-Build Gate (Gate 1 from 04-case-study-quality.md)

Run all eight binary checks. If any fails, halt.

Step 3 — Read Extraction Thoroughly

For each story in the extraction, extract:

Step 4 — Read Reference Files

Step 5 — Generate V1 HTML

Use the Full Template (below). For each story:

  1. Title with [CLIENT NAME] — placeholder
  2. Industry tag with the specific industry from the extraction
  3. Savings Badge with the headline number
  4. Situation: open with the featured client's emotional starting position
  5. What We Did: active voice, specific strategy names, Strategy Tags
  6. Results Grid: 2–3 Result Items with sourced numbers
  7. What's Next: specific forward-looking plans

Wrap in the HTML approval comment block at the top of . Apply profession disclaimer without the anonymization phrase.

Apply Convertri rules if convertri_hosting = true.

Step 6 — Generate V2 HTML

Same source, transformed via the Anonymization Table:

  1. Title without the [CLIENT NAME] — prefix
  2. Industry tag = archetype mapping (real estate agent → high-performing sales professional)
  3. Savings Badge unchanged (numbers don't anonymize)
  4. Situation: same beats, identifying details removed
  5. What We Did: generic strategy tags (S-Corporation Conversion → Entity Restructuring)
  6. Results Grid: numbers unchanged
  7. What's Next: generic forward-looking language (no signature plans)

No HTML approval comment block. Apply profession disclaimer with the anonymization phrase.

Apply Convertri rules if convertri_hosting = true.

Run the anonymization test (Gate 3 from 04-case-study-quality.md) on V2 before continuing. If it fails, re-anonymize.

Step 7 — Generate Delivery Markdown

Structure (per 03c-case-study-golden-example-delivery.md):

  1. Email body to the practice owner — connects to their language, mentions V1/V2, opens the door, no pitch
  2. "A Note on Case Studies vs. Testimonials" section
  3. VERSION 2: ANONYMIZED (Ready to Use) — full inline content of V2 in markdown form, plus V2 disclaimer
  4. VERSION 1: FULL DETAIL (Requires Client Permission) — full inline content of V1 in markdown form, with [CLIENT NAME] placeholders intact, plus the "Before Publishing Version 1" approval checklist, plus V1 disclaimer (without anonymization phrase)

Step 8 — Run Copy-QC

Run business-aos/reference/brand/copy-qc.md (the 11 AI-pattern checks) on every prose paragraph in V1, V2, and the delivery email body. Fix all P1 and P2 violations.

Step 9 — Run Gate 4 Weighted Scorecard

Score each artifact and the kit as a set against 04-case-study-quality.md Gate 4. Target ≥ 90.

Step 10 — Deliver

Save the three files to the production directory (Kathryn's session output folder, or wherever the run was launched from). Present to Kathryn:


Component Templates

Card Header

<div class="case-study-header">
    <div>
        <h2 class="case-study-title">{{TITLE}}</h2>
        <p class="case-study-industry">{{INDUSTRY}}</p>
    </div>
    <div class="savings-badge">
        <div class="savings-amount">{{HEADLINE_NUMBER}}</div>
        <div class="savings-label">{{HEADLINE_LABEL}}</div>
    </div>
</div>

Body Section (one of four — Situation / What We Did / Results / What's Next)

<div class="case-section">
    <span class="case-section-label">{{SECTION_LABEL}}</span>
    <h3>{{SUBHEAD}}</h3>
    <p>{{NARRATIVE_PARAGRAPH}}</p>
    <!-- Optional: second paragraph with margin-top: 12px -->
    <!-- Optional: strategies-list (What We Did only) -->
    <!-- Optional: results-grid (Results only) -->
</div>

Strategies List (inside What We Did)

<div class="strategies-list">
    <span class="strategy-tag">{{STRATEGY_1}}</span>
    <span class="strategy-tag">{{STRATEGY_2}}</span>
    <span class="strategy-tag">{{STRATEGY_3}}</span>
    <!-- 1-N tags -->
</div>

Results Grid (inside Results)

<div class="results-grid">
    <div class="result-item">
        <div class="result-number">{{NUMBER_1}}</div>
        <div class="result-description">{{DESCRIPTION_1}}</div>
    </div>
    <div class="result-item">
        <div class="result-number">{{NUMBER_2}}</div>
        <div class="result-description">{{DESCRIPTION_2}}</div>
    </div>
    <!-- 2-3 items -->
</div>

Approval Block (V1 only, top of )

<!-- ═══════════════════════════════════════════════════════════════════════════
 VERSION 1: CLIENT APPROVAL REQUIRED

 This version contains detailed client information. Before publishing:
 ☐ Replace [CLIENT NAME] placeholders with actual names (if approved)
 ☐ Get written permission from each client to use their story
 ☐ Confirm all numbers are accurate
 ☐ Have client review final copy before publishing

 If client declines to be named, use Version 2 (Fully Anonymized) instead.
 ═══════════════════════════════════════════════════════════════════════════ -->

Full Template (HTML — both V1 and V2 share this skeleton)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Client Success Stories | {{PRACTICE_OWNER_BUSINESS}}</title>
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family={{HEADING_FONT}}&family={{BODY_FONT}}&display=swap" rel="stylesheet">

    <style>
        /* ── COLORS (apply Convertri rule: hardcoded hex when convertri = true; CSS vars OK otherwise) */
        {{COLOR_DEFINITIONS}}

        /* ── RESETS */
        * { margin: 0; padding: 0; box-sizing: border-box; }
        html { scroll-behavior: smooth; }
        body {
            font-family: '{{BODY_FONT}}', sans-serif;
            background: {{BG_COLOR}};
            color: {{TEXT_COLOR}};
            line-height: 1.7;
            font-size: 16px;
        }

        /* ── HEADER, INTRO, CASE STUDIES, RESULTS GRID, STRATEGIES, CTA, DISCLAIMER, RESPONSIVE
             — see 03a / 03b for full canonical CSS */
    </style>
</head>
<body>

    {{V1_APPROVAL_BLOCK_OR_BLANK}}

    <header class="header">
        <span class="header-label">Client Success Stories</span>
        <h1>Real Results. Real Savings.</h1>
        <p class="header-subtitle">{{HEADER_SUBTITLE}}</p>
    </header>

    <section class="intro">
        <p>{{INTRO_PARAGRAPH}}</p>
    </section>

    <section class="case-studies">
        {{CASE_STUDY_CARDS}}  <!-- Repeat one <article class="case-study"> per story -->
    </section>

    <section class="cta-section">
        <h2>{{CTA_QUESTION}}</h2>
        <p>{{CTA_INVITATION}}</p>
        <a href="{{CTA_URL}}" class="cta-button">{{CTA_BUTTON_TEXT}}</a>
    </section>

    <footer class="disclaimer">
        <p><strong>Disclaimer:</strong> {{DISCLAIMER_TEXT}}</p>
    </footer>
</body>
</html>

For the canonical CSS, refer to 03a-case-study-golden-example-v1-named.html or 03b-case-study-golden-example-v2-anonymized.html — they contain the full Foncannon styling that this template skeleton omits for brevity.


Delivery Checklist

Before presenting the three files to Kathryn:


Testing Discipline — Don't Interrupt the Run

On the first run of this kit (or after any Mode 2 update), run the full production without mid-process correction. Compare the three outputs to the 03a / 03b / 03c goldens. Document every gap between what the kit produced and what the goldens show. Fix the kit files (this file, plus 02 / 04 as needed) so the gap closes on the next run. Do not fix the output by hand — that teaches the kit nothing.


Change Log

2026-04-27: Initial build via kit-builder Mode 1. Workflow derived from case-study-agent.md (Proof Engine project) plus the V1/V2 Foncannon goldens. Production order (V1 → V2 → delivery MD) follows the Proof Engine spec. Gate ordering (binary pre-build → binary Convertri → binary anonymization test → weighted scorecard) is new — chosen to enforce non-negotiable compliance before the weighted score is permitted to override anything.