← Vault Index
Source: frameworks/kit-aos-interactive-narrative/05-aos-article-output-skill.md

Thought Leadership Article — Output Skill

What this produces: A fully styled, single-file HTML thought leadership article with embedded interactives. Advisory OS branded, client-facing, published at its own URL.

Output filename: {{topic-slug}}.html (lowercase, hyphens — e.g., proof-gap.html, politeness-premium.html)

Reference files:


Build Process

Step 0: Read the Source Material

Before proposing anything, read the source material completely. Understand:

Do not summarize the source material. Find the insight inside it.

Step 1: Run the Intake

Walk through all seven intake decisions from 01-article-context.md. For each decision:

Present the intake as a conversational sequence, not a form. Group related decisions when natural (e.g., brand + conversion goal can go together).

After all seven decisions are confirmed, produce the Concept Lock — a single summary block with every decision captured.

CONCEPT LOCK: [Campaign Name]
Brand: [Advisory OS / Creating Your Plan]
Conversion: [Product purchase $X / Diagnostic booking / Subscribe]
Core insight: [1-2 sentences]
Named mechanism: [Name] — [definition]
Title: [Locked title]
Interactives ([count]):
  1. [Name] ([Function]) — [what it does]
  2. [Name] ([Function]) — [what it does]
  3. [Name] ([Function]) — [what it does]
Arc: [Section flow with labels]
Reframe: [Light / Medium / Heavy]
CTA: [Exact CTA text]

Step 2: Build the First Pass

Build the complete HTML article from the Concept Lock. Follow this order:

  1. Head + CSS — Start from the CSS template below. Extend as needed for this article's interactives — the template covers structural elements; custom interactive styles will be added. Update the comment header with the topic name. CSS variables (:root {}) are acceptable in single-file articles.
  2. Navigation — Copy as-is. Update nav link labels to match this article's sections.
  3. Hero — Title, eyebrow, subtitle. One gold word in the title.
  4. Section-by-section — Follow the arc from the Concept Lock. For each section: eyebrow label → headline → prose → interactive (if this section has one) → interpretation prose.
  5. CTA — Match the conversion goal. See CTA patterns below.
  6. Footer — Copy as-is.
  7. React scripts — If using React interactives, add the script block after the footer.

Step 3: Verify You Actually Did the Work

The quality standards live in 04-article-quality.md. This step is not about what good looks like — it's about confirming you ran the process instead of skipping it.

Before presenting the first pass, answer every question below. If the answer to any question is "no," go back and do it. Do not deliver the article until every answer is "yes."

Did you run 04-article-quality.md?

Did you run copy-qc.md?

Did you run linkedin-sentence-editor.md?

Did you test the interactives?

The accountability question:

If the answer to that last question is "they'd find things I missed," you haven't finished the QC. Go back.

Step 4: Flag Known Weaknesses

After the first pass clears Step 3 — meaning all QC checks actually ran and all violations are fixed — flag editorial weaknesses. These are judgment calls about what could be stronger, not violations you found and shipped anyway.

Examples:

Do not pretend the first pass is finished. Setting up the revision cycle is part of the job. But do not use this step to smuggle QC failures past the gate. If copy-qc.md found P1 violations, fix them before delivering — don't list them here as "known weaknesses."

Step 5: Revision Cycles

Receive editorial feedback. Rebuild what's called out. For each revision:

Expect 2–3 cycles before shipping.


CTA Patterns

Product Purchase CTA

<section class="cta-section" id="cta">
    <div class="container" style="margin-bottom: 3rem;">
        <p class="big-quote" style="border: none; padding: 0; color: #f5f4f0;">&ldquo;{{Final anchor phrase with <em>gold emphasis</em>.}}&rdquo;</p>
    </div>
    <div class="container">
        <h2>{{Product Name — e.g., "Get the HQP Scoring System"}}</h2>
        <p class="cta-sub">{{One sentence: what the product does and why they need it now.}}</p>
        <a href="#" class="cta-button">{{Get the Toolkit &middot; $27}}</a>
        <p class="cta-subtext">{{Instant access &middot; What's included &middot; How long it takes}}</p>
    </div>
</section>

Diagnostic Booking CTA

<section class="cta-section" id="cta">
    <div class="container" style="margin-bottom: 3rem;">
        <p class="big-quote" style="border: none; padding: 0; color: #f5f4f0;">&ldquo;{{Final anchor phrase with <em>gold emphasis</em>.}}&rdquo;</p>
    </div>
    <div class="container">
        <h2>Book a Systems Diagnostic</h2>
        <p class="cta-sub">{{What the diagnostic finds and what they leave with — one sentence.}}</p>
        <a href="https://calendly.com/kathryn-brown/systems-diagnostic" class="cta-button">Book a Diagnostic</a>
        <p class="cta-subtext">60 minutes &middot; Find the constraint &middot; No&nbsp;obligation</p>
    </div>
</section>

Subscribe CTA

<section class="cta-section" id="cta">
    <div class="container">
        <h2>{{Promise of next piece — e.g., "Get the Next One"}}</h2>
        <p class="cta-sub">{{What they'll get and why it matters.}}</p>
        <a href="#" class="cta-button">Subscribe</a>
    </div>
</section>

CTA Versioning

When an article will ship with different CTAs at different lifecycle stages, build separate HTML files:

The article body is identical across versions. Only the CTA section changes. Name files with version numbers so the relationship is clear.


Section HTML Patterns

Navigation (Fixed — Same Every Article)

<nav>
    <a href="https://advisoryos.ai" class="logo">
        <img src="https://convertri.imgix.net/01a6df52-3d55-11ea-99fe-0697e5ca793e%2Ff71505a0b7be19fb31c9096f349bec5d235fcc3b%2FIcon-Gold.png?auto=compress,format&w=400" alt="Advisory OS">
        <span class="logo-text">Advisory OS</span>
    </a>
    <div class="nav-links">
        <a href="#{{section-id}}">{{Section Name}}</a>
        <a href="#{{section-id}}">{{Section Name}}</a>
        <a href="#{{section-id}}">{{Section Name}}</a>
    </div>
</nav>

Hero (Always Dark)

<section class="hero">
    <div class="hero-inner">
        <div class="hero-eyebrow">An Interactive Explainer</div>
        <h1>{{Title with <em>gold word</em> and &nbsp;}}</h1>
        <p class="hero-sub">{{Subtitle — one specific number or scene. One clean thought.}}</p>
    </div>
</section>

Prose Section (Cream, Off-White, or Dark)

<section class="{{cream|off-white|dark}}" id="{{section-id}}">
    <div class="container">
        <p class="section-eyebrow">{{Eyebrow Label}}</p>
        <h2>{{Section Headline — Statement, Not Question}}</h2>
        <p class="lead">{{Opening paragraph.}}</p>
        <p>{{Body paragraphs. 2-4 sentences each. Last sentence hits hardest.}}</p>
    </div>
</section>

Section with Interactive

<section class="{{cream|off-white|dark}}">
    <div class="container">
        <p class="section-eyebrow">{{Eyebrow Label}}</p>
        <h2>{{Section Headline}}</h2>
        <p>{{Setup prose — what to look for and why it matters.}}</p>
    </div>

    <div class="container-wide">
        <div class="viz-container" id="{{viz-id}}" style="height: auto; min-height: 380px;"></div>
    </div>

    <div class="container">
        <p>{{Interpretation prose — what they just experienced and what it means.}}</p>
    </div>
</section>

Definition Box

<div class="definition-box">
    <p><strong>{{Mechanism Name}}:</strong> {{Definition — tight enough to quote. Names something felt but never articulated.}}</p>
</div>

Big Quote (Breathing Element)

<p class="big-quote" style="border: none; padding: 32px 0;">&ldquo;{{Quote with <em>gold emphasis</em> on key&nbsp;word.}}&rdquo;</p>

Bridge Quote Between Continuous Dark Sections

Use background: #1e1e1e (flat color) on both adjacent dark sections to prevent a visible seam where two gradients meet. Do not use box-shadow, margin-top: -1px, or wrapper div hacks.

<section class="dark" style="padding-bottom: 0; background: #1e1e1e;">
    <div class="container">
        <p class="big-quote" style="border: none; padding: 32px 0;">&ldquo;{{Bridge quote.}}&rdquo;</p>
    </div>
</section>

<section class="dark" style="padding-top: 48px; background: #1e1e1e;">
    <!-- Next section content -->
</section>

Comparison Table

<div class="container-wide" style="max-width: 700px;">
    <table class="comparison-table" style="margin: 48px auto;">
        <thead>
            <tr>
                <th style="border-color: rgba(26,26,26,0.1); color: #8a8680;">{{Column 1}}</th>
                <th style="border-color: rgba(26,26,26,0.1); color: #8a8680;">{{Column 2}}</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td style="border-color: rgba(26,26,26,0.1); color: #4a5a6a;">{{Row}}</td>
                <td style="border-color: rgba(26,26,26,0.1); color: #4a5a6a;">{{Row}}</td>
            </tr>
            <!-- Final row in gold -->
            <tr>
                <td style="border-color: rgba(26,26,26,0.1); color: #6b5d3e; font-weight: 500;">{{Answer}}</td>
                <td style="border-color: rgba(26,26,26,0.1); color: #6b5d3e; font-weight: 500;">{{Answer}}</td>
            </tr>
        </tbody>
    </table>
</div>

Self-Assessment Cards

<div class="container-wide">
    <div class="cards-grid">
        <div class="card">
            <div class="card-number">1</div>
            <div class="card-title">{{Question that mirrors the reader}}</div>
            <div class="card-text">{{Description of this recognizable state.}}</div>
        </div>
        <div class="card">
            <div class="card-number">2</div>
            <div class="card-title">{{Question}}</div>
            <div class="card-text">{{Description.}}</div>
        </div>
        <div class="card">
            <div class="card-number">3</div>
            <div class="card-title">{{Question}}</div>
            <div class="card-text">{{Description.}}</div>
        </div>
    </div>
</div>

Footer (Fixed — Same Every Article)

<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">&copy; 2026 Creating Your Plan. All rights reserved. | <a href="https://creatingyourplan.com/privacy-policy" target="_blank">Privacy Policy</a> | <a href="https://creatingyourplan.com/terms-of-service" target="_blank">Terms of Service</a> | <a href="https://creatingyourplan.com/disclaimer" target="_blank">Disclaimer</a></p>
</footer>

Full CSS Template

Copy this entire style block into the . Update only the comment header with the topic name.

/* =============================================
   ADVISORY OS - {{TOPIC NAME UPPERCASE}}
   Thought Leadership Interactive Narrative
   
   HEX CODES (exact):
   - Gold:          #b79d64
   - Gold Light:    #c4aa74
   - Gold Dark:     #a08a58
   - Gold on Cream: #6b5d3e
   - Charcoal:      #1a1a1a
   - Deep Charcoal: #2a2a2a
   - Cream:         #f5f4f0
   - Off-White:     #faf9f7
   - Stone:         #8a8680
   - Slate:         #4a5a6a
   ============================================= */

:root {
    --gold: #b79d64; --gold-light: #c4aa74; --gold-dark: #a08a58;
    --gold-on-cream: #6b5d3e; --charcoal: #1a1a1a; --deep-charcoal: #2a2a2a;
    --cream: #f5f4f0; --off-white: #faf9f7; --stone: #8a8680; --slate: #4a5a6a;
}

* { margin: 0; padding: 0; box-sizing: border-box; }
html { scroll-behavior: smooth; }

::-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; }

body {
    font-family: 'Inter', -apple-system, sans-serif;
    background: #f5f4f0;
    color: #1a1a1a;
    line-height: 1.6;
    overflow-x: hidden;
}

h1, h2, h3, h4 { font-family: 'Cormorant Garamond', serif; font-weight: 400; }
strong { font-weight: 500; }

/* === NAVIGATION === */
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;
}

.logo {
    display: flex;
    align-items: center;
    gap: 1rem;
    text-decoration: none;
}

.logo img { height: 40px; width: auto; }

.logo-text {
    font-family: 'Cormorant Garamond', serif;
    font-size: 1.75rem;
    font-weight: 500;
    color: #f5f4f0;
    letter-spacing: 0.02em;
}

.nav-links { display: flex; gap: 2rem; }

.nav-links a {
    font-size: 0.7rem;
    font-weight: 500;
    letter-spacing: 0.15em;
    text-transform: uppercase;
    color: #8a8680;
    text-decoration: none;
    transition: color 0.3s ease;
}

.nav-links a:hover { color: #b79d64; }

/* === HERO === */
.hero {
    min-height: 85vh;
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    text-align: center;
    padding: 140px 5% 100px;
    background: linear-gradient(135deg, #1a1a1a 0%, #2a2a2a 100%);
    color: #f5f4f0;
}

.hero-inner { max-width: 800px; margin: 0 auto; }

.hero-eyebrow {
    font-family: 'Inter', sans-serif;
    font-size: 0.7rem;
    font-weight: 500;
    letter-spacing: 0.2em;
    text-transform: uppercase;
    color: #b79d64;
    margin-bottom: 1.5rem;
    display: inline-flex;
    align-items: center;
    gap: 1rem;
}

.hero-eyebrow::before,
.hero-eyebrow::after {
    content: '';
    width: 40px;
    height: 1px;
    background: #b79d64;
}

.hero h1 {
    font-size: clamp(2.75rem, 6vw, 4.5rem);
    color: #f5f4f0;
    line-height: 1.1;
    margin-bottom: 1.5rem;
    letter-spacing: -0.02em;
}

.hero h1 em { font-style: italic; color: #b79d64; }

.hero-sub {
    font-family: 'Cormorant Garamond', serif;
    font-size: clamp(1.15rem, 2.5vw, 1.5rem);
    color: #8a8680;
    line-height: 1.7;
    max-width: 650px;
    margin: 0 auto;
}

/* === SECTIONS === */
section { padding: 100px 5%; scroll-margin-top: 80px; }
section.dark { background: linear-gradient(135deg, #1a1a1a 0%, #2a2a2a 100%); color: #f5f4f0; }
section.cream { background: #f5f4f0; color: #1a1a1a; }
section.off-white { background: #faf9f7; color: #1a1a1a; }

.container { max-width: 700px; margin: 0 auto; }
.container-wide { max-width: 900px; margin: 0 auto; }

.section-eyebrow {
    font-family: 'Inter', sans-serif;
    font-size: 0.65rem;
    font-weight: 500;
    letter-spacing: 0.2em;
    text-transform: uppercase;
    color: #6b5d3e;
    margin-bottom: 1rem;
}

section.dark .section-eyebrow { color: #b79d64; }

section h2 {
    font-size: clamp(2rem, 4vw, 2.75rem);
    line-height: 1.15;
    margin-bottom: 1.5rem;
    letter-spacing: -0.01em;
}

section.dark h2 { color: #f5f4f0; }
section.cream h2, section.off-white h2 { color: #1a1a1a; }

section h3 {
    font-size: 1.5rem;
    font-weight: 500;
    margin-top: 2.5rem;
    margin-bottom: 1.25rem;
}

section.dark h3 { color: #f5f4f0; }

section p {
    font-size: 1rem;
    font-weight: 400;
    line-height: 1.85;
    margin-bottom: 1.5rem;
}

section.cream p, section.off-white p { color: #4a5a6a; }
section.dark p { color: rgba(245,244,240,0.85); }

.lead { font-size: 1.15rem; color: #8a8680; }
section.dark .lead { color: rgba(245,244,240,0.7); }

/* === BIG QUOTE === */
.big-quote {
    font-family: 'Cormorant Garamond', serif;
    font-size: clamp(1.5rem, 3.5vw, 2.25rem);
    font-style: italic;
    line-height: 1.4;
    text-align: center;
    padding: 3rem 5%;
    max-width: 700px;
    margin: 0 auto;
    border-top: 1px solid rgba(26,26,26,0.1);
    border-bottom: 1px solid rgba(26,26,26,0.1);
}

section.dark .big-quote { border-color: rgba(245,244,240,0.1); }
.big-quote em { font-style: normal; color: #6b5d3e; }
section.dark .big-quote em { color: #c4aa74; }

/* === DEFINITION BOX === */
.definition-box {
    background: rgba(183,157,100,0.08);
    border-left: 3px solid #b79d64;
    padding: 1.75rem 2rem;
    margin: 2.5rem 0;
}

section.dark .definition-box {
    background: rgba(245,244,240,0.04);
}

.definition-box p { margin-bottom: 12px; }
.definition-box p:last-child { margin-bottom: 0; }

/* === VIZ CONTAINER === */
.viz-container {
    background: #1a1a1a;
    border: 1px solid rgba(245,244,240,0.1);
    margin: 48px 0;
    min-height: 380px;
    overflow: hidden;
}

section.dark .viz-container {
    background: rgba(245,244,240,0.03);
}

/* === COMPARISON TABLE === */
.comparison-table {
    width: 100%;
    margin: 48px 0;
    border-collapse: collapse;
}

.comparison-table th,
.comparison-table td {
    padding: 20px 24px;
    text-align: left;
    border-bottom: 1px solid rgba(245,244,240,0.1);
}

.comparison-table th {
    font-size: 11px;
    letter-spacing: 0.15em;
    text-transform: uppercase;
    color: rgba(245,244,240,0.5);
    font-weight: 500;
}

/* === CARDS GRID === */
.cards-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 24px;
    margin: 48px 0;
}

.card {
    background: rgba(245,244,240,0.03);
    border: 1px solid rgba(245,244,240,0.1);
    padding: 32px;
    transition: all 0.3s ease;
}

.card:hover {
    transform: translateY(-4px);
    box-shadow: 0 20px 40px -15px rgba(0,0,0,0.2);
}

.card-number {
    font-family: 'Cormorant Garamond', serif;
    font-size: 3rem;
    font-weight: 300;
    color: #b79d64;
    opacity: 0.4;
    margin-bottom: 16px;
}

.card-title {
    font-family: 'Cormorant Garamond', serif;
    font-size: 1.35rem;
    font-weight: 500;
    margin-bottom: 12px;
    color: #f5f4f0;
}

.card-text {
    font-size: 15px;
    color: #8a8680;
    line-height: 1.7;
}

/* === CTA SECTION === */
.cta-section {
    background: linear-gradient(135deg, #1a1a1a 0%, #2a2a2a 100%);
    color: #f5f4f0;
    text-align: center;
    padding: 100px 5%;
}

.cta-section h2 {
    color: #f5f4f0;
    margin-bottom: 1.5rem;
}

.cta-sub {
    font-family: 'Cormorant Garamond', serif;
    font-size: 1.25rem;
    color: rgba(245,244,240,0.7);
    max-width: 550px;
    margin: 0 auto 2.5rem;
    line-height: 1.7;
}

.cta-button {
    display: inline-block;
    padding: 18px 48px;
    background: #b79d64;
    color: #1a1a1a;
    font-family: 'Inter', sans-serif;
    font-size: 0.8rem;
    font-weight: 600;
    letter-spacing: 0.15em;
    text-transform: uppercase;
    text-decoration: none;
    transition: all 0.3s ease;
}

.cta-button:hover {
    background: #c4aa74;
    transform: translateY(-2px);
}

.cta-subtext {
    font-size: 0.8rem;
    color: #8a8680;
    margin-top: 1.25rem;
}

/* === FOOTER === */
footer {
    padding: 48px 5%;
    background: #1a1a1a;
    border-top: 3px solid #b79d64;
    text-align: center;
}

.footer-links {
    display: flex;
    justify-content: center;
    gap: 2rem;
    margin-bottom: 1.5rem;
    flex-wrap: wrap;
}

.footer-links a {
    font-size: 0.75rem;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    color: #8a8680;
    text-decoration: none;
    transition: color 0.3s;
}

.footer-links a:hover { color: #b79d64; }

.footer-legal {
    font-size: 0.7rem;
    color: rgba(138,134,128,0.6);
    line-height: 1.8;
}

.footer-legal a {
    color: rgba(138,134,128,0.6);
    text-decoration: none;
}

/* === RESPONSIVE === */
@media (max-width: 768px) {
    .nav-links { display: none; }
    .cards-grid { grid-template-columns: 1fr; }
    .hero { padding: 120px 5% 80px; }
    section { padding: 80px 5%; }
}

Head Template

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{Article Title}} | Advisory OS</title>
    <meta name="description" content="{{One-sentence description for search and social.}}">
    <meta property="og:title" content="{{Article Title}} | Advisory OS">
    <meta property="og:description" content="{{Short description.}}">
    <meta property="og:type" content="website">
    <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=Cormorant+Garamond:ital,wght@0,400;0,500;0,600;1,400;1,500&family=Inter:wght@300;400;500;600&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet">
    <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>
    <style>
        {{FULL CSS FROM TEMPLATE ABOVE}}
    </style>
</head>

React Interactive Template

<script>
    var e = React.createElement;
    var useState = React.useState;
    var useEffect = React.useEffect;
    var useRef = React.useRef;

    var GOLD = "#b79d64";
    var GOLD_LIGHT = "#c4aa74";
    var CHARCOAL = "#1a1a1a";
    var DEEP_CHARCOAL = "#2a2a2a";
    var CREAM = "#f5f4f0";
    var STONE = "#8a8680";
    var SLATE = "#4a5a6a";

    // Component 1
    function {{ComponentName}}() {
        // Build using React.createElement, not JSX
        // Use useState for state, not class components
        // All styles inline as objects
    }

    // Mount
    ReactDOM.render(e({{ComponentName}}), document.getElementById('{{viz-id}}'));
</script>

Common First-Pass Mistakes to Avoid

MistakeWhat to Do Instead
Reorganizing source material into sections without original thinkingFind the insight inside the material. Name something no one else is naming.
Named mechanism pulled from source material's existing languageSynthesize: find the operational principle, identify the cost pattern, name the cost. "The Politeness Premium" doesn't appear in the HQP Playbook — it was synthesized from "score behaviors not words."
Three interactives that all say the same thing in different UIsEach interactive must do different cognitive work AND create a different emotional response.
Interactives with obvious answersBuild ambiguity in. The simulator prospect should be genuinely hard to score. The decoder reveals should contradict expectations. Comfort is the enemy of persuasion.
Embedding a calculator inside the articleCalculators are standalone micro-tools. Article interactives visualize, decode, simulate, or mirror.
Definition box that describes a problem everyone knowsDefinition box must name a mechanism — give language to something felt but never articulated. Test: would a reader use this phrase in conversation with a colleague?
Constraint section that explains instead of creating pressureUse time compression. Walk the reader through their own knowledge decaying in accelerating beats. Start at "tomorrow morning," end at "back where you started."
Bridge quote that teaches instead of validatingBridge quotes name what the reader is already feeling. "They showed you who they were" mirrors the recognition the Pattern section created.
Self-assessment cards as three independent questionsCards follow an arc: mirror → confrontation → possibility. Each builds on the previous.
Paragraphs that make three points at onceEach paragraph does one thing. Break it up. Last sentence hits hardest.
One-pass delivery with no flagged weaknessesAlways flag what needs work. The first pass is the start, not the finish.
CTA that doesn't match the conversion goalProduct purchase, diagnostic booking, and subscribe each have completely different CTA architecture. Also consider whether the article needs CTA versioning.
Delivering without running copy-qc.mdExtract the prose from the HTML. Check every line against every pattern. Fix P1 and P2 violations before delivering. This is not optional — it's the most common skip and it produces the most visible failures.
Delivering without running linkedin-sentence-editor.mdCheck R1 (end strong), R3 (economy), R7 (two-comma), R8 (adverbs) on every sentence. Tighten before delivering.
"Flagging" QC violations as known weaknesses instead of fixing themIf copy-qc.md found twinning, fix the twinning. If the interactive logic has unreachable branches, fix the logic. Step 4 is for editorial judgment calls, not for shipping violations with a disclaimer.
Assuming interactive logic works because the code looks rightExtract the scoring function. Run it through Node with all input combinations. Check for unreachable branches, vague defaults, and edge cases. Visual inspection is not testing.