INTERACTIVE NARRATIVE — SKILL FILE
For Building Thought Leadership Pages with Embedded Interactives
WHAT THIS SKILL BUILDS
A long-form, scrollable thought leadership page that weaves prose and interactive visualizations into a single argument. The interactives are not decorations — they are evidence. Each one makes a claim experiential rather than stated.
This is NOT a micro-tool. Micro-tools are machines (input → processing → output). An interactive narrative is an argument that uses interactives to prove its claims. Remove the prose and the interactives don't make sense. Remove the interactives and the prose loses its experiential proof.
Golden example: The Proof Gap (proof-gap-evergreen.html)
WHEN TO USE THIS
Use this skill when:
- The piece makes an argument (not just delivers information)
- At least 2-3 claims in the argument would land harder as experiences than as statements
- The topic deserves 1,500-3,000 words of prose
- The piece is an evergreen campaign anchor (not a one-time post)
Do NOT use this for:
- Micro-tools (use calculator, diagnostic, or revelation skills)
- Static articles (no interactives needed — use markdown or a simpler HTML template)
- Case study pages (different structure, different purpose)
- Landing pages (different purpose, shorter, conversion-focused)
ARCHITECTURE
Page Structure: Section-Based Scrolling
Interactive narratives scroll continuously. They do NOT use screen-switching like micro-tools.
The page is a sequence of sections, each with a background color, a container width, and a content type. Sections alternate backgrounds to create visual rhythm.
HERO (dark) — full viewport, centered
SECTION (cream) — prose
SECTION (dark) — prose + interactive
SECTION (off-white) — prose
SECTION (dark) — prose + interactive
SECTION (cream) — prose
SECTION (dark) — interactive
SECTION (dark, continued) — self-assessment cards
SECTION (off-white) — closing prose
CTA (dark) — closing quote + button
FOOTER (dark)
The alternation is not random. Follow these rules:
- Cream (
#f5f4f0): Primary reading sections. Use for the main argument prose. - Dark (
#1a1a1a → #2a2a2a gradient): Emphasis sections. Use when an interactive is present OR when the argument reaches a climactic claim. - Off-white (
#faf9f7): Breathing room. Use between two heavy sections to give the eye a rest. Lighter prose, transitional content. - Never place two cream sections adjacent. Never place more than two dark sections adjacent (unless the second is a continuation like cards following an interactive).
Container Widths
Two container widths, used intentionally:
.container { max-width: 700px; } /* Prose — comfortable reading width */
.container-wide { max-width: 900px; } /* Interactives, tables, card grids — needs more room */
Rule: Prose always uses .container. Interactives, tables, and card grids always use .container-wide. A section can contain BOTH — prose in .container followed by an interactive in .container-wide followed by more prose in .container.
Navigation
Fixed top nav with anchor links to major sections:
<nav>
<a href="https://advisoryos.ai" class="logo">
<img src="[Advisory OS icon URL]" alt="Advisory OS">
<span class="logo-text">Advisory OS</span>
</a>
<div class="nav-links">
<a href="#cost">The Cost</a>
<a href="#comparison">The Comparison</a>
<a href="#constraint">The Constraint</a>
</div>
</nav>
- 2-4 anchor links maximum
- Labels should be short (2-3 words) and match section eyebrows
- Links hide on mobile (nav-links display: none at 768px)
- Nav has
backdrop-filter: blur(10px)and semi-transparent background
SECTION ANATOMY
Every section follows the same internal structure:
<section class="[cream|dark|off-white]" id="[anchor-id]">
<div class="container">
<p class="section-eyebrow">The Pattern</p>
<h2>Section Headline</h2>
<p class="lead">Opening sentence that sets up the section.</p>
<p>Body paragraphs...</p>
</div>
<!-- If interactive present, switch to wide container -->
<div class="container-wide">
<div class="viz-container" id="[viz-id]"></div>
</div>
<!-- Return to narrow container for interpretation -->
<div class="container">
<p>Prose interpreting what the interactive just showed...</p>
</div>
</section>
Section Elements
Eyebrow: Always present. ALL-CAPS, tiny, gold, letterspaced. Names the argumentative move (e.g., "The Pattern", "The First Cost", "The Real Constraint", "The Shift").
Headline (h2): Cormorant Garamond, large. States the section's claim in plain language. Uses to prevent orphan words.
Lead paragraph: First paragraph after headline. Slightly larger, stone/muted color. Sets up the section. Class .lead.
Body paragraphs: Standard size, comfortable line-height (1.85). Slate color on light backgrounds, cream-85% on dark backgrounds.
Big quote: Centered, Cormorant Garamond italic, large. Used between sections or within sections for emphasis. One key line pulled from the argument. Gold for the pivotal word.
<p class="big-quote">"The prospect who reads your case study
before the call is a <em>different person</em> than the one
who doesn't."</p>
Definition box: Gold left-border, subtle background. Used for the "question worth asking" or a key reframe.
<div class="definition-box">
<p><strong>The question worth asking:</strong> ...</p>
<p>Interpretation of that question...</p>
</div>
THE HERO
The hero is its own section — dark background, vertically centered, occupying most of the viewport.
<section class="hero">
<div class="hero-inner">
<div class="hero-eyebrow">An Interactive Explainer</div>
<h1>The <em>Proof</em> Gap</h1>
<p class="hero-sub">Your best client outcomes are invisible to
every future prospect. Here's what that costs you — and what
to do about it.</p>
</div>
</section>
Hero rules:
min-height: 85vh— near-full viewport- Eyebrow: gold, small caps, with decorative lines (
::beforeand::afterpseudo-elements creating horizontal lines flanking the text) - h1: Enormous (
clamp(2.75rem, 6vw, 4.5rem)). One key word in gold italic via - Subtitle: Cormorant Garamond, stone color, generous line-height, max-width 650px
- The subtitle should hook with a specific scenario, not a generic statement
INTERACTIVE PATTERNS
Each interactive lives inside a .viz-container div and is rendered by React via CDN.
React Setup
React is loaded via CDN in the :
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/18.2.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.2.0/umd/react-dom.production.min.js"></script>
All components use React.createElement syntax (no JSX, no build step):
var e = React.createElement;
var useState = React.useState;
var useEffect = React.useEffect;
var useRef = React.useRef;
// Color constants
var GOLD = "#b79d64";
var GOLD_LIGHT = "#c4aa74";
var CHARCOAL = "#1a1a1a";
var DEEP_CHARCOAL = "#2a2a2a";
var CREAM = "#f5f4f0";
var STONE = "#8a8680";
var SLATE = "#4a5a6a";
Components are mounted at the bottom of the page:
var el = document.getElementById('viz-id');
if (el) { ReactDOM.render(e(ComponentName), el); }
Pattern 1: The Accumulator
Persuasive job: Makes invisible accumulation feel real. Use when the argument is "this small thing compounds into something large."
How it works:
- A grid of empty circles/dots
- Play button triggers auto-fill animation (one dot at a time, ~200ms interval)
- Each dot fills with gold and a number
- Stats appear below showing the compounding total
- Closing insight text appears when animation completes
Key implementation details:
useStatefor count and running stateuseReffor the timeruseEffectdrives the animation loop withsetTimeout- Play button text changes: "See a Full Year" → "Running..." → "Play Again"
- Reset button appears after first play
- Stats use Cormorant Garamond for numbers, tiny uppercase labels
Data needed:
- Unit being accumulated (e.g., "prospect calls")
- Per-unit cost (e.g., "25 minutes per call")
- Total units to show (e.g., 24 calls/year)
- 2-3 stat calculations (e.g., total minutes, total hours, dollar cost)
- Closing insight sentence
Structure:
[Header — what the dots represent]
[Dot grid — fills on play]
[Play / Reset buttons]
[Stats row — appears when count > 0]
[Closing insight — appears when complete]
Pattern 2: The Toggle Comparison
Persuasive job: Makes asymmetry obvious. Use when the argument is "these two things look the same but they aren't."
How it works:
- Two side-by-side columns
- Toggle switch at top with two labeled scenarios
- Content in both columns changes when toggled
- In one scenario, columns are identical (proving the "looks the same" claim)
- In the other, one column gains highlighted differentiators
- Outcome sentence below changes with toggle
Key implementation details:
useStatefor active scenario- Two styled buttons acting as toggle (inline-flex, border between them)
- Active button gets highlighted background
- "Tap to compare" hint text below toggle
- Proof items render in gold italic
- Each column has a "Decides on" footer showing what the prospect uses to choose
- Winner column gets gold border
Data needed:
- 2 scenario labels (e.g., "Neither Has Proof" / "One Has Proof")
- For each scenario: two columns with item lists
- Items that are proof get special gold styling
- Verdict per column (e.g., "Price" vs "Trust")
- Outcome sentence per scenario
Structure:
[Toggle buttons + hint]
[Two columns side by side]
[Column items]
[Verdict footer]
[Outcome sentence]
Pattern 3: The Sequencer
Persuasive job: Walks through parallel transformations. Use when the argument is "the same situation changes at multiple touchpoints."
How it works:
- Tab bar across the top with 4 moments (numbered 01-04)
- Play button auto-advances through all tabs (~3500ms per tab)
- Each tab shows a before/after panel (two columns)
- Below the panels: a one-line shift summary in gold italic
- Tabs are also manually clickable (clicking stops auto-play)
Key implementation details:
useStatefor active tab index and running stateuseReffor timeruseEffectdrives auto-advance withsetTimeout- Active tab gets gold bottom border and gold text
- Past tabs get cream text, future tabs get stone
- Detail panel uses
keyprop to triggerfadeInUpanimation on change - Before panel: stone text, "Without Proof" label
- After panel: cream text, "With Proof" label in gold
- Shift summary: gold italic, subtle gold background
Data needed:
- 3-5 moments (4 is ideal), each with:
- Label (e.g., "The Discovery", "The Call")
- Before text (what happens without the thing)
- After text (what happens with it)
- Shift summary (one-line transformation statement)
Structure:
[Play button]
[Tab bar — 4 tabs with numbers and labels]
[Detail panel]
[Before column | After column]
[Shift summary bar]
Pattern 4: Flip Cards (HTML/CSS only — no React)
Persuasive job: Reveals hidden perspectives. Use when the argument is "what you think they see isn't what they actually think."
How it works:
- Grid of cards (3 columns on desktop, 2 on mobile)
- Front: what the person shows (e.g., "Credentials")
- Back: what the audience actually thinks (e.g., "So does the other one.")
- Click/tap toggles the flip
- Special "proof" cards flip to gold-highlighted backs
Key implementation details:
- Pure CSS 3D transform (
perspective,rotateY,backface-visibility) .flippedclass toggles viaonclick="this.classList.toggle('flipped')"- Front: charcoal background, stone label, cream title
- Back: deep charcoal, gold label, cream title
- Back with
.is-proof: gold-tinted background, gold border, gold title - "Tap to flip" hint on front of each card
Data needed:
- 5-8 cards, each with:
- Front label + title
- Back label + title
- Boolean: is this a "proof" card (gets gold treatment)
Structure:
<div class="flipper-grid">
<div class="flipper-card" onclick="this.classList.toggle('flipped')">
<div class="flipper-inner">
<div class="flipper-front">...</div>
<div class="flipper-back [is-proof]">...</div>
</div>
</div>
</div>
Pattern 5: Self-Assessment Cards (HTML/CSS only — no React)
Persuasive job: Makes the reader apply the argument to their own situation. Use near the end of the piece after the argument is complete.
How it works:
- Grid of 3 cards (1 column on mobile)
- Each card has a large faded number, a question title, and explanatory text
- Cards have hover lift effect
- Questions should be specific enough that the reader can answer immediately
Data needed:
- 3 questions, each with:
- Question (stated as something they can self-assess right now)
- Context text (2-3 sentences expanding the question, with one
for emphasis)
Structure:
<div class="cards-grid">
<div class="card">
<div class="card-number">1</div>
<div class="card-title">Question text</div>
<div class="card-text">Context with <em>emphasis</em>.</div>
</div>
</div>
Pattern 6: Comparison Table (HTML only)
Persuasive job: Creates a visual punchline. Use when the argument has a list where one item is categorically different from the rest.
How it works:
- Simple two-column table
- Most rows are neutral
- Final row is gold (text color + font-weight)
- The contrast between neutral rows and the gold punchline row carries the point
Data needed:
- 2 column headers
- 4-6 rows of neutral content
- 1 punchline row (gold)
THE PROSE-INTERACTIVE-PROSE PATTERN
This is the core rhythm that makes interactive narratives work. Every interactive is sandwiched:
- Setup prose — Makes a claim the reader might accept intellectually but hasn't felt. "Think about the last five prospect conversations you had..."
- Interactive — Makes them feel it. The accumulator fills up. The toggle reveals asymmetry. The sequencer shows transformation.
- Interpretation prose — Tells them what they just experienced and connects it to the next claim. "An advisor with documented client outcomes reduces that phase significantly..."
Never drop an interactive without setup and interpretation. An interactive without setup is a toy. An interactive without interpretation is an abandoned argument.
THE ARGUMENTATIVE ARC
The Proof Gap follows this progression. Different topics will vary, but the structural beats are consistent:
Beat 1: The Pattern (cream)
Open with a specific scenario. Not a statistic. Not a claim. A recognizable situation. "A consultant I worked with had helped a mid-market services company..."
The reader should think: "I've seen that."
Beat 2: The Cost(s) (dark + interactives)
Name what the pattern costs. Be specific. Use interactives to make the cost visceral. The Proof Gap names TWO costs (trust tax + competitor comparison), each with its own section and interactive.
The reader should think: "That's happening to me."
Beat 3: The Constraint (cream)
Name the real reason this hasn't been solved. NOT "you should do X." Instead: "Here's why X hasn't happened yet." This section reframes the problem. The Proof Gap reframes from "you need more marketing" to "your proof doesn't exist in a findable form."
The reader should think: "That's actually the problem."
Beat 4: The Shift (dark + interactive)
Show what changes when the constraint is removed. Use a sequencer or similar to show the transformation at multiple touchpoints. Keep it concrete — specific conversations that change, not abstract benefits.
The reader should think: "I want that."
Beat 5: Self-Assessment (dark, continued)
Three questions that make the reader locate themselves in the argument. These should be answerable immediately without data — gut-check questions.
The reader should think: "I know my answer, and it's not good."
Beat 6: The Starting Point (off-white or cream)
Remove the objection. "You already have the material." This is NOT the CTA. It's the permission to believe the shift is possible. Short section — 2-3 paragraphs.
The reader should think: "I could actually do this."
Beat 7: CTA (dark)
One closing quote (big-quote style). One headline. One sub-line. One button. One subtext line with logistics.
<section class="cta-section">
<div class="container" style="margin-bottom: 3rem;">
<p class="big-quote">"Your best client outcomes should be working
for you <em>permanently</em> — not evaporating after delivery."</p>
</div>
<div class="container">
<h2>Ready to Close the Proof Gap?</h2>
<p class="cta-sub">One line connecting the argument to the action.</p>
<a href="[calendly-or-tool-link]" class="cta-button">Button Text</a>
<p class="cta-subtext">60 minutes · Find the constraint · No obligation</p>
</div>
</section>
NARRATIVE TRACKABILITY
Interactive narratives use multiple examples, characters, and scenarios across sections. When characters share similar roles (two women, both doing financial close work) or examples are structurally similar (two firms with recurring work problems), the reader loses track of who is who and which story they're in. This problem compounds across sections — the reader from Section 1 carries assumptions into Section 2, and similar details create false continuity.
Rules
One primary character per section. Each section's example should involve one person in one situation. A section can reference a general pattern ("most firms") but the story should follow one person. Don't blend a "your team" generalization with a specific character's story in the same section.
Re-establish at every section boundary. When a new section introduces a new character, establish them with enough distinguishing detail that the reader can't confuse them with a previous character. Don't rely on gender or pronouns alone — give them a specific role, industry, firm type, or deliverable that makes them distinct.
- Weak: "She closes the books every month." (Who? The same woman from the previous section?)
- Strong: "A tax firm founder in Austin closes the books every month." (New person, clearly.)
Differentiate similar roles. If two examples across the article involve people in similar positions (managing partner, firm founder, practice owner), give them at least TWO distinguishing details: different industry + different deliverable, or different firm size + different problem. One distinguishing detail is not enough — readers skim, and they'll miss a single differentiator.
Anchor pronouns within two sentences. After introducing a character, the first pronoun reference must appear within two sentences. If the character was introduced three paragraphs ago and a pronoun appears, the reader has to scroll back. Either re-establish or restructure.
Bad: "A managing partner hired a senior accountant specifically to own the month-end close. Six weeks of shadowing. Detailed handoff conversations. She was confident." — four sentences between the managing partner and "she." Reader has to work.
Good: "A managing partner hired a senior accountant to own the month-end close. The partner spent six weeks on shadowing and detailed handoff conversations. She was confident the process had been transferred." — "the partner" re-anchors before "she" lands.
Bridge between examples. When transitioning from one example to another within the same section or across sections, the bridge must do three things:
- Close the previous example explicitly.
- Signal the shift — make it unmistakable that a new scenario is starting.
- Open the new example with distinguishing context.
A subhead alone ("A Different Firm.") is the minimum viable bridge. A subhead plus a distinguishing lead sentence is better. A bare paragraph that introduces a new "she" or "he" without signaling the shift is a failure.
Numbers must trace. If Section 1 calculates $6,400 and Section 2 calculates $36,000, the difference must be clear (different firm size, different billing rate, different hours). If the numbers shift without explanation, the reader assumes it's an error — and stops trusting the math in the rest of the piece. When a bridge paragraph references costs from multiple examples ("$6,400 here, $36,000 there"), both numbers must be traceable to established calculations.
The thread test. After writing each section, pause and ask: if a reader arrived at this paragraph with no memory of the previous section, would they know who is being described and what scenario they're in? If the answer is no, the character needs re-establishing or the transition needs strengthening.
WRITING STYLE
Tone
- Second person ("you", "your") — the reader is the subject
- Specific, not abstract — "$120K in additional revenue", not "significant results"
- Present tense for patterns — "Every new prospect starts at zero"
- Confident but not aggressive — states what happens, doesn't lecture
- Uses
—for em-dashes,to prevent orphan words at line ends - Uses
’and“/”for proper typography
Paragraph rhythm
- Short paragraphs (2-4 sentences typical)
- Occasional single-sentence paragraphs for emphasis
- Lead paragraphs are slightly longer (set the scene)
- Never more than 3 paragraphs before a visual element breaks up the text
Emphasis
used sparingly — 1-2 per section maximumfor key reframe words, especially in quotes- Gold italic in quotes for the pivotal word/phrase
- Never bold AND italic together
Specific language patterns from the golden example
- "That's the [concept name]." — naming the pattern after describing it
- "Here's what [X] actually [does/looks like]:" — transition to interactive
- Questions directed at the reader: "How many started with you explaining..."
- Concrete quantities over abstractions: "the first twenty to thirty minutes"
CSS REFERENCE
Background Modes
Interactive narratives use BOTH light and dark backgrounds (unlike micro-tools which are dark-only).
/* Light sections */
section.cream { background: #f5f4f0; color: #1a1a1a; }
section.off-white { background: #faf9f7; color: #1a1a1a; }
/* Dark sections */
section.dark {
background: linear-gradient(135deg, #1a1a1a 0%, #2a2a2a 100%);
color: #f5f4f0;
}
Text color by background:
- Cream/off-white sections: body text
#4a5a6a(slate), headings#1a1a1a - Dark sections: body text
rgba(245, 244, 240, 0.85), headings#f5f4f0 - Eyebrows: always
#b79d64(gold)
Typography
h1, h2, h3, h4 { font-family: 'Cormorant Garamond', serif; font-weight: 400; }
body { font-family: 'Inter', -apple-system, sans-serif; font-weight: 400; font-size: 1rem; }
strong { font-weight: 500; } /* Not 600 or 700 — subtle emphasis */
/* Section headings */
section h2 { font-size: clamp(2rem, 4vw, 2.75rem); line-height: 1.15; letter-spacing: -0.01em; }
section h3 { font-size: 1.5rem; font-weight: 500; }
/* Body text */
section p { font-size: 1rem; line-height: 1.85; margin-bottom: 1.5rem; }
.lead { font-size: 1.15rem; }
/* Micro-labels (eyebrows, stat labels, etc.) */
.section-eyebrow {
font-size: 0.65rem;
font-weight: 500;
letter-spacing: 0.2em;
text-transform: uppercase;
color: #b79d64;
}
Google Fonts Import
<link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,400;0,500;0,600;1,400;1,500&family=Inter:wght@300;400;500;600&display=swap" rel="stylesheet">
Nav CSS
nav {
position: fixed;
top: 0;
width: 100%;
background: rgba(26, 26, 26, 0.95);
backdrop-filter: blur(10px);
border-bottom: 3px solid #b79d64;
padding: 20px 5%;
display: flex;
justify-content: space-between;
align-items: center;
z-index: 100;
}
Viz Container
.viz-container {
background: var(--charcoal);
border: 1px solid rgba(245, 244, 240, 0.1);
margin: 48px 0;
min-height: 380px;
}
/* When inside a dark section */
section.dark .viz-container {
background: rgba(245, 244, 240, 0.03);
}
Responsive Breakpoints
/* Tablet: 968px */
@media (max-width: 968px) {
section { padding: 60px 5%; }
.hero { padding: 120px 5% 80px; }
}
/* Mobile: 768px */
@media (max-width: 768px) {
nav { padding: 16px 5%; }
.logo-text { font-size: 1.4rem; }
.logo img { height: 32px; }
.nav-links { display: none; }
.hero { padding: 100px 5% 60px; min-height: auto; }
.cards-grid { grid-template-columns: 1fr; }
.flipper-grid { grid-template-columns: 1fr 1fr; }
section { padding: 60px 5%; }
}
Animation
@keyframes fadeInUp {
from { opacity: 0; transform: translateY(16px); }
to { opacity: 1; transform: translateY(0); }
}
Used on detail panels in the sequencer (applied via style: { animation: "fadeInUp 0.4s ease-out" }).
Gold Scrollbar
::-webkit-scrollbar { width: 10px; }
::-webkit-scrollbar-track { background: #1a1a1a; }
::-webkit-scrollbar-thumb { background: #b79d64; border-radius: 5px; }
::-webkit-scrollbar-thumb:hover { background: #c4aa74; }
html { scrollbar-width: thin; scrollbar-color: #b79d64 #1a1a1a; }
FOOTER
Standard Advisory OS footer. Identical across all pages:
<footer>
<div class="footer-links">
<a href="https://advisoryos.ai/contact">Contact</a>
<a href="https://www.linkedin.com/in/itskathrynbrown/" target="_blank">LinkedIn</a>
<a href="https://substack.com/@kathrynhbrown" target="_blank">Substack</a>
<a href="https://creatingyourplan.com" target="_blank">Creating Your Plan</a>
</div>
<p class="footer-legal">© 2026 Creating Your Plan. All rights reserved. |
<a href="https://creatingyourplan.com/privacy-policy">Privacy Policy</a> |
<a href="https://creatingyourplan.com/terms-of-service">Terms of Service</a> |
<a href="https://creatingyourplan.com/disclaimer">Disclaimer</a></p>
</footer>
CTA STRATEGY
The CTA connects the argument to an action. It does NOT sell cold.
Pattern:
- Closing big-quote (the argument's most quotable line)
- Headline framed as readiness question: "Ready to [verb] the [concept]?"
- Sub-line connecting the argument to what the action delivers
- Button with specific action text (not "Learn More")
- Subtext with logistics: duration + what they get + no-obligation note
The CTA can point to:
- A booking link (Calendly) for a diagnostic or consultation
- A micro-tool that goes deeper on one aspect of the argument
- A companion article that breaks down the methodology
INTERACTIVE-TO-ARGUMENT MATCHING
This is the design decision layer. When planning which interactives to include, match the argumentative move to the pattern:
| Argumentative Move | Interactive Pattern | Why |
|---|---|---|
| "This small thing compounds" | Accumulator | Watching it build feels different than reading a total |
| "These look the same but aren't" | Toggle Comparison | Side-by-side makes asymmetry instant |
| "Everything changes at once" | Sequencer | Multiple transformation points in one experience |
| "They see something different than you think" | Flip Cards | The reveal creates surprise |
| "One of these is different" | Comparison Table | The gold row is a visual punchline |
| "Ask yourself this" | Self-Assessment Cards | Forces self-application |
Guideline: 2-4 interactives per piece. One is too few (feels like an article with a widget). Five+ is exhausting. The Proof Gap uses 3 React interactives + flip cards + self-assessment cards + comparison table = 6 total, but 3 of those are lightweight HTML-only elements.
BUILD SEQUENCE
- Argument first. Write the complete argumentative arc as prose BEFORE designing any interactives. Every claim, every transition, every reframe. No code.
- Mark interactive opportunities. Read through the prose and flag every claim that would land harder as an experience. Not every claim qualifies — only the ones where "feeling it" is materially different from "reading it."
- Match patterns. For each flagged claim, select the interactive pattern that serves that specific persuasive move (use the matching table above).
- Design the data. For each interactive, fill out the data structure required by that pattern (documented in each pattern section above).
- Build. HTML structure first (all sections, all containers), then CSS (copy from this skill), then static interactives (flip cards, tables, cards), then React interactives.
- QC: The sandwich test. For every interactive, verify: Is there setup prose before it? Is there interpretation prose after it? If either is missing, the interactive is orphaned.
- QC: The removal test. For every interactive, ask: If I removed this, would the argument lose something the prose alone can't replace? If not, the interactive is decorative — cut it or replace it with one that earns its place.
QC CHECKLIST
Structure
- [ ] Hero has eyebrow, h1 with gold
, subtitle with specific scenario - [ ] Sections alternate backgrounds (no two cream adjacent)
- [ ] Every section has an eyebrow
- [ ] Prose uses
.container(700px), interactives use.container-wide(900px) - [ ] Nav has 2-4 anchor links matching section eyebrows
Interactives
- [ ] Every interactive has setup prose before it
- [ ] Every interactive has interpretation prose after it
- [ ] Each interactive serves a specific persuasive job (not decorative)
- [ ] React components use
createElementsyntax (no JSX) - [ ] Play/toggle buttons use Advisory OS styling (gold text, subtle borders)
- [ ] All interactives work on mobile (grid columns collapse)
Writing
- [ ] Opens with a specific scenario, not a generic claim
- [ ] Uses second person throughout
- [ ] Specific numbers where possible ($120K, 25 minutes, etc.)
- [ ] Proper typography:
—,’,“/”, - [ ] No orphan words at end of headlines (use
) - [ ] 3 self-assessment questions near the end
- [ ] Closing section removes the "I can't do this" objection
Narrative Trackability
- [ ] One primary character per section?
- [ ] Characters re-established at every section boundary? (No bare pronoun introductions)
- [ ] Similar roles differentiated by at least two details? (Industry + deliverable, firm size + problem)
- [ ] Every pronoun anchored within two sentences of character establishment?
- [ ] Bridges between examples close previous, signal shift, open new with distinguishing context?
- [ ] Numbers consistent across sections? (Or differences explicitly explained)
- [ ] Thread test passed? (Reader knows who and what at every paragraph without scrolling back)
CTA
- [ ] Closing big-quote present
- [ ] CTA headline framed as readiness question
- [ ] Button text is specific action (not "Learn More")
- [ ] Subtext includes logistics (duration, what they get)
Brand
- [ ] Gold scrollbar present
- [ ] Cormorant Garamond for headings, Inter for body
- [ ] Advisory OS nav with logo
- [ ] Standard footer with all links
- [ ] OG meta tags in
WHAT THIS SKILL DOES NOT COVER
- Argument development: How to develop the thesis and arc from raw observations. That requires the Topic Brief Template (separate document).
- Seed extraction: How to identify narrative-worthy patterns from client work or content reactions. That requires the Seed Capture process (separate document).
- Interactive pattern library expansion: As new golden examples are built, new interactive patterns will be added to this skill. The current six patterns come from a single golden example.
- Campaign integration: How this piece connects to micro-tools, distribution, and the broader campaign. That's in the Campaign Map.
Skill file reverse-engineered from: The Proof Gap (proof-gap-evergreen.html) Created: February 12, 2026