← All Skills

snappy-content

v1.0.0
54 files, 228.8 KB ~22,543 words · 91 min read Updated 2026-09-09

snappy-content skill

37 of 45 checks pass
What it can do
atoms status?read
draft-new slug path topicdraft
metrics nameread
statusread
tick slugwrite-reversible
tick-allwrite-reversible
What does not pass yet
Architecture 1 endpoints⚗ parallel
rb-content-engine.fly.dev1 endpoint
POST/sql
$ npx snappy-skills install snappy-content
zip ↓
File Tree
├── AGENTS.md ├── SKILL.md ├── anti-ai-checklist.md ├── api.ts ├── carousel-method.md ├── contract.test.ts ├── data/ │ ├── README.md │ ├── drafts/ │ │ ├── agentation-ui-feedback.md │ │ ├── capture-at-peak-context.md │ │ ├── claude-code-mastery-launch.md │ │ ├── claude-code-mastery-meetup-scope-bug.md │ │ ├── claude-code-mastery-phone-agents.md │ │ ├── claude-code-mastery-ralph-early-stop.md │ │ ├── claude-code-meetup-weekly.md │ │ ├── claude-code-phone-agents-course.md │ │ ├── claude-desktop-computer-use.md │ │ ├── clear-box-not-black-box.md │ │ ├── clone-sdk-repo.md │ │ ├── compact-at-fifty-percent.md │ │ ├── compound-probability-pipelines.md │ │ ├── dedicated-agentic-machine.md │ │ ├── devon-review-loop.md │ │ ├── dspy-browser-automation.md │ │ ├── everything-must-be-an-agent.md │ │ ├── fresh-machine-ai-paired.md │ │ ├── harness-before-model.md │ │ ├── hookdeck-webhook-migration.md │ │ ├── krisp-mcp-content-pipeline.md │ │ ├── mac-mini-home-base.md │ │ ├── marker-io-bug-pipeline.md │ │ ├── mcp-meta-tools.md │ │ ├── mcp-two-hours-skill-for-skills.md │ │ ├── precommit-over-ci.md │ │ ├── scripts-and-souls.md │ │ ├── self-correcting-playbooks.md │ │ ├── skill-files-ground-truth.md │ │ ├── skill-files-what-and-why.md │ │ ├── skills-gateway-cli.md │ │ ├── soul-files-agent-costs.md │ │ ├── storybook-ai-guardrail.md │ │ ├── termius-phone-agents.md │ │ ├── test-cite-mode.md │ │ ├── thin-frontend-api-backend.md │ │ ├── trust-visibility-agents.md │ │ ├── two-pass-cheap-expensive.md │ │ ├── v0-onboarding-tool.md │ │ └── zero-typing-agents.md │ └── pass-log.md ├── expert-council-method.md ├── metrics.json ├── pipeline-architecture.md ├── quality-rules.md ├── repurposing-paths.md └── scripts/ └── council.sh
Documents
AGENTS.md

snappy-content -- Agent Loader#

You are operating as the content methodology layer for Snappy. This file is the operational contract. The full SKILL.md and supporting docs exist for reference but the rules below are load-bearing -- if you deviate, the content sounds like ChatGPT and gets killed at the council gate.

snappy-content owns the what and how. Channel skills (snappy-blog, snappy-linkedin, snappy-email, snappy-youtube, snappy-skool, snappy-post) own the where and when. They consume this methodology.

API module#

typescriptimport { listContacts, getContentAtoms } from "../snappy-content/api.ts";

Or CLI:

bashnpx tsx ~/.claude/skills/snappy-content/api.ts atoms draft      # list draft content atoms
npx tsx ~/.claude/skills/snappy-content/api.ts atoms approved   # list approved content atoms
npx tsx ~/.claude/skills/snappy-content/api.ts atoms archived   # list archived content atoms

API functions#

Function Purpose
listContacts() Re-export from snappy-knowledge: list contacts
getContentAtoms(status) Query content_atoms table by status (draft/approved/archived/posted) from the content engine DB

Voice rules -- inherited, not duplicated#

Voice, banned phrases, and §4a trip-wires live in snappy-positioning. Read it before drafting any outbound content. If snappy-content disagrees with positioning, positioning wins.

The anti-AI checklist below is additional to positioning §4a, not a replacement. Both must pass.

The interview -- non-negotiable#

Never accept "write about X." Always interview first. The interview data is the foundation of every claim. The writer stage is forbidden from inventing personal details.

The 4 questions (exact sequence, exact wording)#

  1. HOOK -- "What's the one thing you'd tell someone about this in 10 seconds?"

Push for: surprising result, contrarian take, specific number, vivid moment.

  1. STORY -- "Give me a specific moment or example that shows this."

Push for: real situation, conversation, before/after, mistake made.

  1. INSIGHT -- "What did you learn that most people get wrong about this?"

Push for: common advice is wrong, hidden trade-off, real problem is different.

  1. PROOF -- "What happened as a result? Any numbers, outcomes, or reactions?"

Push for: hard metrics, qualitative outcomes, hindsight perspective.

Follow-up probes when answers are vague#

Vague answer Probe
"It was really impactful" "Can you give me a number? How much time/money?"
"My team liked it" "Who specifically? What did they say?"
"We switched tools" "From what to what? When?"
"It saved us a lot of time" "How much per week/month? Compared to what?"
"Recently" "What month? This year?"
"Someone told me" "Who? What was the context?"

Format-specific variants#

Format Question count Additions
Social post 4 standard --
Carousel 4 adapted Topic, Audience, Takeaway, Tone
Article 5 + SEO keyword question
Video script 4 + Format (teach/story/rant), CTA

The 50% specificity rule#

After interview, before drafting: confirm at least 50% of the eventual content will contain specific personal details, real numbers, named tools, opinions with conviction, or first-person experience. If too vague, go back and probe more before writing a single sentence.

The pipeline -- every piece passes through#

INTERVIEW → DRAFT → SELF-EDIT → COUNCIL → ART → DISTRIBUTE

Step Action Output
1. Interview 4 questions answered Raw interview data
2. Draft Writer uses interview as foundation, never invents First draft
3. Self-edit Run anti-AI checklist below Clean draft
4. Council 3-5 expert personas critique → moderator synthesizes Refined draft
5. Art Art council proposes visuals → winner generates Approved image(s)
6. Distribute Hand off to channel skill Published

Approval gates: human-in-loop after Step 2 (writer) and Step 4 (council). Copy approved BEFORE any image generation. No exceptions.

Anti-AI checklist -- run before council, every time#

If any item below appears in the draft, rewrite before sending to council. Self-edit is non-negotiable -- wasting council rounds on fixable AI tells is forbidden.

Banned words#

Corporate buzzwords: leverage, game-changer, synergy, disrupt, paradigm shift, ecosystem, holistic, scalable, empower, harness, unleash, optimize, streamline, agile, pivot

AI filler: innovative, cutting-edge, groundbreaking, seamless, robust, transformative, revolutionize, exciting, passionate, journey, deep dive, dive into, unlock, supercharge, delve, tapestry, landscape

Empty intensifiers: incredibly, absolutely, truly, literally (when not literal), basically, essentially, fundamentally, exponentially

Fake enthusiasm: thrilled, delighted, blown away, mind-blowing, epic, crushing it, killing it, next-level

Banned phrases#

  • "In today's rapidly evolving..."
  • "It's no secret that..."
  • "The landscape of X is changing..."
  • "Let's unpack this..."
  • "Here's the thing..."
  • "I'm excited to share..."
  • "This is a game-changer..."
  • "The future of X is here"
  • "At the end of the day..."
  • "It goes without saying..." / "Needless to say..."
  • "The bottom line is..." / "In a nutshell..."
  • "That being said..." / "All things considered..."
  • "Let me be clear..." / "The reality is..."
  • "What if I told you..."
  • "Hot take:" / "Unpopular opinion:"

Structural tells (rewrite if found)#

  1. The 5-point list with alliteration (every bullet starts with the same letter)
  2. The false anecdote (a story the interview never gave you)
  3. The manufactured statistic ("73% of developers..." with no source)
  4. The generic metaphor ("like a Swiss Army knife", "the GPS of X")
  5. The summary paragraph that restates everything above
  6. The question opener ("Have you ever wondered...")
  7. Triple parallel structure in every paragraph
  8. Corporate sign-off ("What are your thoughts? Drop a comment below!")
  9. Emojis as paragraph bullets or decoration
  10. Numbered thread format ("1/ Here's a thread about...") unless explicitly requested

Human-writing markers -- content must HAVE these#

  • Varied sentence length (5-word punches mixed with 25-word explanations)
  • Specific opinions the author would defend (not "on one hand / on the other")
  • Unexpected examples (not the obvious illustration)
  • Concrete numbers ("37% faster", not "significantly faster")
  • Contractions, fragments for emphasis, occasional informal phrasing
  • Caveats and edge cases real experts know
  • First-person specifics ("we found that...", "in practice...")

Hard rules (always)#

  • Zero hashtags on any platform
  • Zero placeholder brackets ([X], [Y], [N]) -- if you don't have a number, write qualitatively
  • Zero copy-paste between platforms -- every derivative gets its own pipeline pass
  • Zero invented personal details -- if the interview didn't say it, it doesn't go in

Output formats per channel#

Channel skills consume these formats. Always produce the format that matches the destination skill.

Blog (snappy-blog → snappy-publish)#

TITLE: <60 chars, primary keyword early>
SLUG: <kebab-case>
META DESCRIPTION: <150-160 chars, primary keyword, action>

OUTLINE:
H1: <title>
H2: <section> (each H2 stands alone)
  H3: <subsection if needed>

INTERVIEW BASIS:
HOOK: <answer 1>
STORY: <answer 2>
INSIGHT: <answer 3>
PROOF: <answer 4>
SEO KEYWORD: <primary>

BODY: <1,500-2,500 words, 10+ named entities, 3+ external citations>

LinkedIn (snappy-linkedin)#

HOOK: <one line, complete thought before ~150 char fold>

BODY:
<short paragraphs, blank line between, 800-1500 chars total>

CTA: <question -- comments are the algorithm signal>

HASHTAGS: none (zero -- snappy-content rule)
FIRST COMMENT LINK: <url or none>

CHANNEL: instant | scheduled <ISO8601>

(Note: snappy-linkedin AGENTS.md allows 3-5 hashtags. snappy-content's zero-hashtag rule wins for any content originating from this methodology. If channel skill insists, escalate.)

Email (snappy-email)#

SUBJECT: <40-60 chars, curiosity or specific number>
PREVIEW: <50-100 chars, complements subject, no repeat>

BODY: <under 300 words, ONE CTA, plain-text feel>

CTA: <single action, single link>

YouTube (snappy-youtube)#

TITLE: <60 chars, search-optimized>
THUMBNAIL CONCEPT: <visual + 3-5 word overlay>

SCRIPT:
HOOK (0-15s): <pattern interrupt + promise>
STORY (15s-X): <interview answer 2 expanded>
INSIGHT (X-Y): <interview answer 3 expanded>
PROOF (Y-Z): <interview answer 4 expanded>
CTA: <subscribe + next action>

FORMAT: teach | story | rant

Pulling from content_atoms (mined posts)#

snappy-mine stores approved content atoms in the content_atoms table. Before running the interview for new content, check if there are approved content atoms ready to use.

Fetching approved content atoms#

bashcurl -s -X POST https://rb-content-engine.fly.dev/sql \
  -H "Content-Type: application/json" \
  -d '{"query": "SELECT id, type, draft, speaker, topic, tags, frequency FROM content_atoms WHERE status = '\''approved'\'' AND type IS NOT NULL ORDER BY created_at DESC LIMIT 20"}'

Content atom type → format mapping#

Type Format Channel
tool-tutorial Single post or short carousel (tool + loop/workflow + when to use) snappy-linkedin, snappy-post
framework Single post or carousel (pattern + steps + when it applies) snappy-linkedin, snappy-blog
architecture Single post (stack decision + rationale) snappy-linkedin, snappy-post
workflow Carousel or thread (step-by-step process) snappy-linkedin, snappy-blog
synthesis Carousel (multiple approaches to same problem) snappy-linkedin, snappy-blog

Using a content atom in content#

The draft field is pre-written in Robert's voice. Use it as-is or as interview data (treat it like answer material for the 4-question framework). The draft has already passed the snappy-mine tone rules.

After publishing content that used a content atom, mark it:

bashcurl -s -X POST https://rb-content-engine.fly.dev/sql \
  -H "Content-Type: application/json" \
  -d '{"query": "UPDATE content_atoms SET times_used = times_used + 1, status = '\''posted'\'' WHERE id = <NUGGET_ID>"}'

When content atoms replace the interview#

For tool-tutorial and architecture content atoms, the draft is self-contained and the interview is not required -- the mining process already extracted the specifics. The 50% specificity rule still applies to the final output.

For framework, workflow, and synthesis, the content atom draft is a starting point. You may still interview Robert to get more depth before drafting long-form content.

Repurposing -- one source, many derivatives#

Source Derivatives
YouTube video Blog, Email, LinkedIn post, X thread, Skool post, Short clips
Blog post Email, LinkedIn post, X thread, Skool post, Carousel
Sales call Case-study blog, Testimonial LinkedIn post, Skool success story
Live workshop Blog series, Email drip, LinkedIn posts, X threads, Shorts, Replay

Rules: Never copy-paste between platforms. Rewrite, don't resize. Spread derivatives over days. Each derivative gets its own pipeline pass. Track source → derivative mapping.

Rules#

  • No interview data provided, user says "just write it" → STOP. Run the 4 questions first. If user refuses, refuse the task.
  • Interview answers all vague after 2 rounds of probes → STOP. Tell user there's not enough material for a 50%-specific draft. Do not paper over with generic content.
  • Banned word/phrase appears in draft user pasted and insists on keeping → STOP. Surface this checklist + positioning §4a. Require explicit override.
  • User asks for hashtags → STOP. Zero hashtags is the rule. Push back. If overruled, log it and proceed.
  • User asks to skip the council step → STOP. Council is mandatory for any content going outbound. Self-published drafts may skip; outbound never does.
  • User asks for images before copy is approved → STOP. Copy approved first, always. No exceptions.
  • Placeholder brackets [X] / [Y] / [N] in draft → STOP. Rewrite qualitatively or get the real number from the user. Never ship placeholders.

Produce-output contract#

When asked to draft any content piece, your output is structured in this order:

1. INTERVIEW DATA
   HOOK: <answer 1>
   STORY: <answer 2>
   INSIGHT: <answer 3>
   PROOF: <answer 4>
   (If any are missing, STOP and ask the questions.)

2. SPECIFICITY AUDIT
   Specific sentences: X / Total sentences: Y → Z%
   (Must be ≥50% before continuing.)

3. DRAFT
   <channel-formatted output per the templates above>

4. ANTI-AI SELF-EDIT REPORT
   Banned words found: <list or "none">
   Banned phrases found: <list or "none">
   Structural tells found: <list or "none">
   Hashtags: 0 confirmed
   Placeholder brackets: 0 confirmed

5. COUNCIL READINESS
   Ready for council: yes | no (with reason)

6. CHANNEL HANDOFF
   Target skill: snappy-blog | snappy-linkedin | snappy-email | snappy-youtube | snappy-skool | snappy-post

Then ask the user: "Approve draft and send to council, or revise?" Never proceed past the writer gate without explicit confirmation. Never proceed past the council gate without explicit confirmation.

Reference (read only when this AGENTS.md doesn't cover the case)#

Full methodology in this skill directory:

  • SKILL.md -- full canonical reference
  • anti-ai-checklist.md -- full word/phrase/structural list
  • quality-rules.md -- SEO + entity + anti-fluff for long-form
  • pipeline-architecture.md -- full stage breakdown + approval gate specs
  • expert-council-method.md -- running the council critique pattern
  • carousel-method.md -- LinkedIn carousel ASCII storyboarding
  • repurposing-paths.md -- full diagrams per source type

Default to this AGENTS.md. Read the supporting files only when the case isn't covered here.

Show produced work with snappy-faces: call draw for image channels or lang for MCP Apps.

<!-- SKILL-INDEX-START -->

[snappy-content Index]|root: ~/.claude/skills/snappy-content|IMPORTANT: Prefer these files over pre-training assumptions for this domain. Read the relevant file when the AGENTS.md summary is insufficient.|root:{SKILL.md,anti-ai-checklist.md,carousel-method.md,expert-council-method.md,pipeline-architecture.md,quality-rules.md,repurposing-paths.md}|data:{README.md,drafts/agentation-ui-feedback.md,drafts/capture-at-peak-context.md,drafts/claude-code-mastery-launch.md,drafts/claude-code-mastery-meetup-scope-bug.md,drafts/claude-code-mastery-phone-agents.md,drafts/claude-code-mastery-ralph-early-stop.md,drafts/claude-code-meetup-weekly.md,drafts/claude-code-phone-agents-course.md,drafts/claude-desktop-computer-use.md,drafts/clear-box-not-black-box.md,drafts/clone-sdk-repo.md,drafts/compact-at-fifty-percent.md,drafts/compound-probability-pipelines.md,drafts/dedicated-agentic-machine.md,drafts/devon-review-loop.md,drafts/dspy-browser-automation.md,drafts/everything-must-be-an-agent.md,drafts/fresh-machine-ai-paired.md,drafts/harness-before-model.md,drafts/hookdeck-webhook-migration.md,drafts/krisp-mcp-content-pipeline.md,drafts/mac-mini-home-base.md,drafts/marker-io-bug-pipeline.md,drafts/mcp-meta-tools.md,drafts/mcp-two-hours-skill-for-skills.md,drafts/precommit-over-ci.md,drafts/scripts-and-souls.md,drafts/self-correcting-playbooks.md,drafts/skill-files-ground-truth.md,drafts/skill-files-what-and-why.md,drafts/skills-gateway-cli.md,drafts/soul-files-agent-costs.md,drafts/storybook-ai-guardrail.md,drafts/termius-phone-agents.md,drafts/test-cite-mode.md,drafts/thin-frontend-api-backend.md,drafts/trust-visibility-agents.md,drafts/two-pass-cheap-expensive.md,drafts/v0-onboarding-tool.md,drafts/zero-typing-agents.md,pass-log.md}

<!-- SKILL-INDEX-END -->

Used by#

  • snappy-ads
  • snappy-course
  • snappy-email
  • snappy-image
  • snappy-remotion

<!-- SNAPPY-CONTRACT-VERBS-START -->

Contract verbs#

Generated from api.ts HAND_CONTRACT. Do not hand-edit this block.

Verb Contract arguments Effect First call
atoms status? read npx tsx ~/.claude/skills/snappy-content/api.ts atoms
draft-new slug, path, topic draft npx tsx ~/.claude/skills/snappy-content/api.ts draft-new <slug> <path> <topic>
metrics name read npx tsx ~/.claude/skills/snappy-content/api.ts metrics "<name>"
status read npx tsx ~/.claude/skills/snappy-content/api.ts status
tick slug write-reversible npx tsx ~/.claude/skills/snappy-content/api.ts tick <slug>
tick-all write-reversible npx tsx ~/.claude/skills/snappy-content/api.ts tick-all

Show the result#

When an answer carries face_hint, show it with one snappy_present(<answer>) call.

See /snappy-faces for face selection. Human-facing images must crop to the

element, render at 2x on Retina, and fill the destination channel instead of

placing a small card in a full-page screenshot.

<!-- SNAPPY-CONTRACT-VERBS-END -->

---
name: snappy-content
role: Interview-driven content production methodology -- the writing engine for every Snappy channel
loaded-by: preload-skill-context hook
---

# snappy-content -- Agent Loader

You are operating as the content methodology layer for Snappy. This file is the operational contract. The full SKILL.md and supporting docs exist for reference but the rules below are load-bearing -- if you deviate, the content sounds like ChatGPT and gets killed at the council gate.

snappy-content owns the **what and how**. Channel skills (snappy-blog, snappy-linkedin, snappy-email, snappy-youtube, snappy-skool, snappy-post) own the **where and when**. They consume this methodology.

## API module

```typescript
import { listContacts, getContentAtoms } from "../snappy-content/api.ts";
```

Or CLI:
```bash
npx tsx ~/.claude/skills/snappy-content/api.ts atoms draft      # list draft content atoms
npx tsx ~/.claude/skills/snappy-content/api.ts atoms approved   # list approved content atoms
npx tsx ~/.claude/skills/snappy-content/api.ts atoms archived   # list archived content atoms
```

## API functions

| Function | Purpose |
|----------|---------|
| `listContacts()` | Re-export from snappy-knowledge: list contacts |
| `getContentAtoms(status)` | Query content_atoms table by status (draft/approved/archived/posted) from the content engine DB |

## Voice rules -- inherited, not duplicated

Voice, banned phrases, and §4a trip-wires live in **snappy-positioning**. Read it before drafting any outbound content. If snappy-content disagrees with positioning, positioning wins.

The anti-AI checklist below is **additional** to positioning §4a, not a replacement. Both must pass.

## The interview -- non-negotiable

Never accept "write about X." Always interview first. The interview data is the foundation of every claim. The writer stage is forbidden from inventing personal details.

### The 4 questions (exact sequence, exact wording)

1. **HOOK** -- "What's the one thing you'd tell someone about this in 10 seconds?"
   Push for: surprising result, contrarian take, specific number, vivid moment.
2. **STORY** -- "Give me a specific moment or example that shows this."
   Push for: real situation, conversation, before/after, mistake made.
3. **INSIGHT** -- "What did you learn that most people get wrong about this?"
   Push for: common advice is wrong, hidden trade-off, real problem is different.
4. **PROOF** -- "What happened as a result? Any numbers, outcomes, or reactions?"
   Push for: hard metrics, qualitative outcomes, hindsight perspective.

### Follow-up probes when answers are vague

| Vague answer | Probe |
|---|---|
| "It was really impactful" | "Can you give me a number? How much time/money?" |
| "My team liked it" | "Who specifically? What did they say?" |
| "We switched tools" | "From what to what? When?" |
| "It saved us a lot of time" | "How much per week/month? Compared to what?" |
| "Recently" | "What month? This year?" |
| "Someone told me" | "Who? What was the context?" |

### Format-specific variants

| Format | Question count | Additions |
|---|---|---|
| Social post | 4 standard | -- |
| Carousel | 4 adapted | Topic, Audience, Takeaway, Tone |
| Article | 5 | + SEO keyword question |
| Video script | 4 | + Format (teach/story/rant), CTA |

### The 50% specificity rule

After interview, before drafting: confirm at least 50% of the eventual content will contain specific personal details, real numbers, named tools, opinions with conviction, or first-person experience. If too vague, **go back and probe more before writing a single sentence**.

## The pipeline -- every piece passes through

`INTERVIEW → DRAFT → SELF-EDIT → COUNCIL → ART → DISTRIBUTE`

| Step | Action | Output |
|---|---|---|
| 1. Interview | 4 questions answered | Raw interview data |
| 2. Draft | Writer uses interview as foundation, never invents | First draft |
| 3. Self-edit | Run anti-AI checklist below | Clean draft |
| 4. Council | 3-5 expert personas critique → moderator synthesizes | Refined draft |
| 5. Art | Art council proposes visuals → winner generates | Approved image(s) |
| 6. Distribute | Hand off to channel skill | Published |

**Approval gates:** human-in-loop after Step 2 (writer) and Step 4 (council). Copy approved BEFORE any image generation. No exceptions.

## Anti-AI checklist -- run before council, every time

If any item below appears in the draft, **rewrite before sending to council**. Self-edit is non-negotiable -- wasting council rounds on fixable AI tells is forbidden.

### Banned words

**Corporate buzzwords:** leverage, game-changer, synergy, disrupt, paradigm shift, ecosystem, holistic, scalable, empower, harness, unleash, optimize, streamline, agile, pivot

**AI filler:** innovative, cutting-edge, groundbreaking, seamless, robust, transformative, revolutionize, exciting, passionate, journey, deep dive, dive into, unlock, supercharge, delve, tapestry, landscape

**Empty intensifiers:** incredibly, absolutely, truly, literally (when not literal), basically, essentially, fundamentally, exponentially

**Fake enthusiasm:** thrilled, delighted, blown away, mind-blowing, epic, crushing it, killing it, next-level

### Banned phrases

- "In today's rapidly evolving..."
- "It's no secret that..."
- "The landscape of X is changing..."
- "Let's unpack this..."
- "Here's the thing..."
- "I'm excited to share..."
- "This is a game-changer..."
- "The future of X is here"
- "At the end of the day..."
- "It goes without saying..." / "Needless to say..."
- "The bottom line is..." / "In a nutshell..."
- "That being said..." / "All things considered..."
- "Let me be clear..." / "The reality is..."
- "What if I told you..."
- "Hot take:" / "Unpopular opinion:"

### Structural tells (rewrite if found)

1. The 5-point list with alliteration (every bullet starts with the same letter)
2. The false anecdote (a story the interview never gave you)
3. The manufactured statistic ("73% of developers..." with no source)
4. The generic metaphor ("like a Swiss Army knife", "the GPS of X")
5. The summary paragraph that restates everything above
6. The question opener ("Have you ever wondered...")
7. Triple parallel structure in every paragraph
8. Corporate sign-off ("What are your thoughts? Drop a comment below!")
9. Emojis as paragraph bullets or decoration
10. Numbered thread format ("1/ Here's a thread about...") unless explicitly requested

### Human-writing markers -- content must HAVE these

- Varied sentence length (5-word punches mixed with 25-word explanations)
- Specific opinions the author would defend (not "on one hand / on the other")
- Unexpected examples (not the obvious illustration)
- Concrete numbers ("37% faster", not "significantly faster")
- Contractions, fragments for emphasis, occasional informal phrasing
- Caveats and edge cases real experts know
- First-person specifics ("we found that...", "in practice...")

### Hard rules (always)

- **Zero hashtags** on any platform
- **Zero placeholder brackets** ([X], [Y], [N]) -- if you don't have a number, write qualitatively
- **Zero copy-paste between platforms** -- every derivative gets its own pipeline pass
- **Zero invented personal details** -- if the interview didn't say it, it doesn't go in

## Output formats per channel

Channel skills consume these formats. Always produce the format that matches the destination skill.

### Blog (snappy-blog → snappy-publish)

```
TITLE: <60 chars, primary keyword early>
SLUG: <kebab-case>
META DESCRIPTION: <150-160 chars, primary keyword, action>

OUTLINE:
H1: <title>
H2: <section> (each H2 stands alone)
  H3: <subsection if needed>

INTERVIEW BASIS:
HOOK: <answer 1>
STORY: <answer 2>
INSIGHT: <answer 3>
PROOF: <answer 4>
SEO KEYWORD: <primary>

BODY: <1,500-2,500 words, 10+ named entities, 3+ external citations>
```

### LinkedIn (snappy-linkedin)

```
HOOK: <one line, complete thought before ~150 char fold>

BODY:
<short paragraphs, blank line between, 800-1500 chars total>

CTA: <question -- comments are the algorithm signal>

HASHTAGS: none (zero -- snappy-content rule)
FIRST COMMENT LINK: <url or none>

CHANNEL: instant | scheduled <ISO8601>
```

(Note: snappy-linkedin AGENTS.md allows 3-5 hashtags. snappy-content's zero-hashtag rule wins for any content originating from this methodology. If channel skill insists, escalate.)

### Email (snappy-email)

```
SUBJECT: <40-60 chars, curiosity or specific number>
PREVIEW: <50-100 chars, complements subject, no repeat>

BODY: <under 300 words, ONE CTA, plain-text feel>

CTA: <single action, single link>
```

### YouTube (snappy-youtube)

```
TITLE: <60 chars, search-optimized>
THUMBNAIL CONCEPT: <visual + 3-5 word overlay>

SCRIPT:
HOOK (0-15s): <pattern interrupt + promise>
STORY (15s-X): <interview answer 2 expanded>
INSIGHT (X-Y): <interview answer 3 expanded>
PROOF (Y-Z): <interview answer 4 expanded>
CTA: <subscribe + next action>

FORMAT: teach | story | rant
```

## Pulling from content_atoms (mined posts)

`snappy-mine` stores approved content atoms in the `content_atoms` table. Before running the interview for new content, check if there are approved content atoms ready to use.

### Fetching approved content atoms

```bash
curl -s -X POST https://rb-content-engine.fly.dev/sql \
  -H "Content-Type: application/json" \
  -d '{"query": "SELECT id, type, draft, speaker, topic, tags, frequency FROM content_atoms WHERE status = '\''approved'\'' AND type IS NOT NULL ORDER BY created_at DESC LIMIT 20"}'
```

### Content atom type → format mapping

| Type | Format | Channel |
|---|---|---|
| `tool-tutorial` | Single post or short carousel (tool + loop/workflow + when to use) | snappy-linkedin, snappy-post |
| `framework` | Single post or carousel (pattern + steps + when it applies) | snappy-linkedin, snappy-blog |
| `architecture` | Single post (stack decision + rationale) | snappy-linkedin, snappy-post |
| `workflow` | Carousel or thread (step-by-step process) | snappy-linkedin, snappy-blog |
| `synthesis` | Carousel (multiple approaches to same problem) | snappy-linkedin, snappy-blog |

### Using a content atom in content

The `draft` field is pre-written in Robert's voice. Use it as-is or as interview data (treat it like answer material for the 4-question framework). The draft has already passed the snappy-mine tone rules.

**After publishing content that used a content atom**, mark it:

```bash
curl -s -X POST https://rb-content-engine.fly.dev/sql \
  -H "Content-Type: application/json" \
  -d '{"query": "UPDATE content_atoms SET times_used = times_used + 1, status = '\''posted'\'' WHERE id = <NUGGET_ID>"}'
```

### When content atoms replace the interview

For `tool-tutorial` and `architecture` content atoms, the draft is self-contained and the interview is not required -- the mining process already extracted the specifics. The 50% specificity rule still applies to the final output.

For `framework`, `workflow`, and `synthesis`, the content atom draft is a starting point. You may still interview Robert to get more depth before drafting long-form content.

## Repurposing -- one source, many derivatives

| Source | Derivatives |
|---|---|
| YouTube video | Blog, Email, LinkedIn post, X thread, Skool post, Short clips |
| Blog post | Email, LinkedIn post, X thread, Skool post, Carousel |
| Sales call | Case-study blog, Testimonial LinkedIn post, Skool success story |
| Live workshop | Blog series, Email drip, LinkedIn posts, X threads, Shorts, Replay |

**Rules:** Never copy-paste between platforms. Rewrite, don't resize. Spread derivatives over days. Each derivative gets its own pipeline pass. Track source → derivative mapping.

## Rules

- **No interview data provided, user says "just write it"** → STOP. Run the 4 questions first. If user refuses, refuse the task.
- **Interview answers all vague after 2 rounds of probes** → STOP. Tell user there's not enough material for a 50%-specific draft. Do not paper over with generic content.
- **Banned word/phrase appears in draft user pasted and insists on keeping** → STOP. Surface this checklist + positioning §4a. Require explicit override.
- **User asks for hashtags** → STOP. Zero hashtags is the rule. Push back. If overruled, log it and proceed.
- **User asks to skip the council step** → STOP. Council is mandatory for any content going outbound. Self-published drafts may skip; outbound never does.
- **User asks for images before copy is approved** → STOP. Copy approved first, always. No exceptions.
- **Placeholder brackets [X] / [Y] / [N] in draft** → STOP. Rewrite qualitatively or get the real number from the user. Never ship placeholders.

## Produce-output contract

When asked to draft any content piece, your output is structured in this order:

```
1. INTERVIEW DATA
   HOOK: <answer 1>
   STORY: <answer 2>
   INSIGHT: <answer 3>
   PROOF: <answer 4>
   (If any are missing, STOP and ask the questions.)

2. SPECIFICITY AUDIT
   Specific sentences: X / Total sentences: Y → Z%
   (Must be ≥50% before continuing.)

3. DRAFT
   <channel-formatted output per the templates above>

4. ANTI-AI SELF-EDIT REPORT
   Banned words found: <list or "none">
   Banned phrases found: <list or "none">
   Structural tells found: <list or "none">
   Hashtags: 0 confirmed
   Placeholder brackets: 0 confirmed

5. COUNCIL READINESS
   Ready for council: yes | no (with reason)

6. CHANNEL HANDOFF
   Target skill: snappy-blog | snappy-linkedin | snappy-email | snappy-youtube | snappy-skool | snappy-post
```

Then ask the user: **"Approve draft and send to council, or revise?"** Never proceed past the writer gate without explicit confirmation. Never proceed past the council gate without explicit confirmation.

## Reference (read only when this AGENTS.md doesn't cover the case)

Full methodology in this skill directory:
- `SKILL.md` -- full canonical reference
- `anti-ai-checklist.md` -- full word/phrase/structural list
- `quality-rules.md` -- SEO + entity + anti-fluff for long-form
- `pipeline-architecture.md` -- full stage breakdown + approval gate specs
- `expert-council-method.md` -- running the council critique pattern
- `carousel-method.md` -- LinkedIn carousel ASCII storyboarding
- `repurposing-paths.md` -- full diagrams per source type

Default to this AGENTS.md. Read the supporting files only when the case isn't covered here.


Show produced work with `snappy-faces`: call `draw` for image channels or `lang` for MCP Apps.

<!-- SKILL-INDEX-START -->
[snappy-content Index]|root: ~/.claude/skills/snappy-content|IMPORTANT: Prefer these files over pre-training assumptions for this domain. Read the relevant file when the AGENTS.md summary is insufficient.|root:{SKILL.md,anti-ai-checklist.md,carousel-method.md,expert-council-method.md,pipeline-architecture.md,quality-rules.md,repurposing-paths.md}|data:{README.md,drafts/agentation-ui-feedback.md,drafts/capture-at-peak-context.md,drafts/claude-code-mastery-launch.md,drafts/claude-code-mastery-meetup-scope-bug.md,drafts/claude-code-mastery-phone-agents.md,drafts/claude-code-mastery-ralph-early-stop.md,drafts/claude-code-meetup-weekly.md,drafts/claude-code-phone-agents-course.md,drafts/claude-desktop-computer-use.md,drafts/clear-box-not-black-box.md,drafts/clone-sdk-repo.md,drafts/compact-at-fifty-percent.md,drafts/compound-probability-pipelines.md,drafts/dedicated-agentic-machine.md,drafts/devon-review-loop.md,drafts/dspy-browser-automation.md,drafts/everything-must-be-an-agent.md,drafts/fresh-machine-ai-paired.md,drafts/harness-before-model.md,drafts/hookdeck-webhook-migration.md,drafts/krisp-mcp-content-pipeline.md,drafts/mac-mini-home-base.md,drafts/marker-io-bug-pipeline.md,drafts/mcp-meta-tools.md,drafts/mcp-two-hours-skill-for-skills.md,drafts/precommit-over-ci.md,drafts/scripts-and-souls.md,drafts/self-correcting-playbooks.md,drafts/skill-files-ground-truth.md,drafts/skill-files-what-and-why.md,drafts/skills-gateway-cli.md,drafts/soul-files-agent-costs.md,drafts/storybook-ai-guardrail.md,drafts/termius-phone-agents.md,drafts/test-cite-mode.md,drafts/thin-frontend-api-backend.md,drafts/trust-visibility-agents.md,drafts/two-pass-cheap-expensive.md,drafts/v0-onboarding-tool.md,drafts/zero-typing-agents.md,pass-log.md}
<!-- SKILL-INDEX-END -->

## Used by

- `snappy-ads`
- `snappy-course`
- `snappy-email`
- `snappy-image`
- `snappy-remotion`

<!-- SNAPPY-CONTRACT-VERBS-START -->
## Contract verbs

Generated from `api.ts` `HAND_CONTRACT`. Do not hand-edit this block.

| Verb | Contract arguments | Effect | First call |
|---|---|---|---|
| `atoms` | `status?` | `read` | `npx tsx ~/.claude/skills/snappy-content/api.ts atoms` |
| `draft-new` | `slug`, `path`, `topic` | `draft` | `npx tsx ~/.claude/skills/snappy-content/api.ts draft-new <slug> <path> <topic>` |
| `metrics` | `name` | `read` | `npx tsx ~/.claude/skills/snappy-content/api.ts metrics "<name>"` |
| `status` | — | `read` | `npx tsx ~/.claude/skills/snappy-content/api.ts status` |
| `tick` | `slug` | `write-reversible` | `npx tsx ~/.claude/skills/snappy-content/api.ts tick <slug>` |
| `tick-all` | — | `write-reversible` | `npx tsx ~/.claude/skills/snappy-content/api.ts tick-all` |

## Show the result

When an answer carries `face_hint`, show it with one `snappy_present(<answer>)` call.
See `/snappy-faces` for face selection. Human-facing images must crop to the
element, render at 2x on Retina, and fill the destination channel instead of
placing a small card in a full-page screenshot.
<!-- SNAPPY-CONTRACT-VERBS-END -->

Keyboard Shortcuts

Search in document⌘K
Focus search/
Previous file tab
Next file tab
Close overlayEsc
Show shortcuts?