From nrev-workflows
Use when the user wants personalised written content produced per entity — "write me an email", "draft outreach", "generate talking points", "create a sequence", "write LinkedIn comments", multi-channel campaigns, or A/B variants. Covers the maker-checker pattern, template sourcing, cohort-to-template mapping, structured output schemas, and model selection.
How this skill is triggered — by the user, by Claude, or both
Slash command
/nrev-workflows:content-generationThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Content generation produces personalised written content that is ready to send or publish — brand-consistent, factually grounded, tonality-adherent, and verified by a second AI pass. It answers: **what do I say to this entity, in what format, at what step?**
Content generation produces personalised written content that is ready to send or publish — brand-consistent, factually grounded, tonality-adherent, and verified by a second AI pass. It answers: what do I say to this entity, in what format, at what step?
| Aspect | Research | Content Generation | GTM Automations |
|---|---|---|---|
| Question | What do I know? | What do I say? | How do I send it? |
| Output | Events, scores | Text per entity | Sent messages, CRM records |
| AI task | Extraction, classification | Creative synthesis | Routing, state management |
| Model class | Mini to core-fast | High-quality (gpt-5+) | Mini to core-fast |
Content generation is never the starting operation. It always requires upstream enrichment — generating against a bare list (name + company) produces generic content. Decompose compound prompts:
| User says | Operations in order |
|---|---|
| "Write personalised emails to senior finance people at pharma companies" | List Building → possibly Research → Content Generation |
| "Draft outreach for my qualified leads" | (Entities exist) → Content Generation |
| "Research these prospects and write talking points" | Research → Content Generation |
| "Create a drip campaign for my prospect queue" | Content Generation → GTM Automations (queue drip) |
If entity data is thin, add Research upstream first. Ask the user for their tonality guide, ICP, product, and case-study context when the prompt needs it and it wasn't supplied.
[Template Source — Google Sheets or inline]
↓
[Template Preparation — group/compress into AI-consumable format]
↓
[Context Assembly — Merge templates with enriched entity data on the cohort key]
↓
[Optional: Pre-Generation Checks — API lookups, flag-setting]
↓
[Content Generator — Ask AI, high-quality model, structured output]
↓
[Quality Gate — Filter: sequence is_not_empty]
↓
[Content Verifier — Ask AI, maker-checker pass]
↓
[Final Quality Gate — Filter: verified_sequence is_not_empty]
| Content type | Variant | Key configuration |
|---|---|---|
| Multi-step email sequence | Personalised Email Sequences | Array-based structured output, 3-5 steps generated in ONE call for cross-step consistency, escalation structure (later emails reference earlier without repeating) |
| Single cold email, multiple angles | Cold Emails (Angle-Based) | Named angle instructions (e.g. Competitor Threat, Dormant Goldmine); first sentence must contain a specific data point; 40-70 word cap; no em-dashes/semicolons/colons; PATH A/B conditional logic when an angle depends on variable data |
| Company-targeted messaging | Account-Based Messaging | Company-level enrichment (news, tech, hiring); company-level cohort key; shorter sequences (1-2 steps) |
| Email + LinkedIn + Slack | Multi-Channel Campaigns | One AI call, channel-specific output fields (email_subject, email_body, linkedin_message, linkedin_connection_note); per-channel tone and character limits checked by verifier |
| LinkedIn comments | LinkedIn Comments | Multi-task prompt: person relevance (Y/N vs ICP) → post relevance (hard reject: job listings, engagement bait, new-role announcements) → score 0-100 on 4 criteria → draft only if score >= 40; grade 5-6 reading level; 20-30 words; comment_score must be 8+ to accept; banned opener list ("Love this", "Great post", "Spot on"); batch rules: ≤1 in 3 ends with a question, ≤1 in 5 references the product, never echo the poster's words |
| Talking points / research briefs | Talking Points | Free text or light JSON, gpt-5.2; verifier may be skipped for internal-facing content |
| A/B variants | A/B Content Variants | Parallel fields (subject_variant_a/b, body_variant_a/b); downstream routing selects via an assignment column |
| Non-English | Locale/Language Variants | {{sequence_language}} variable; locale-specific URL mapping (en_US vs de_DE links); verifier checks language_locale_correct, signup_text_url_verified |
| External (Sheets) when | Inline when |
|---|---|
| Multiple cohort variants (personas, languages, campaigns) | Single template, single variant |
| Non-technical stakeholders iterate on copy | Experimental, templates changing rapidly |
| Templates need A/B testing or versioning | Template is short (single message) |
| Complexity makes inline unwieldy | User supplies the full tonality guide/voice pillars/checklist directly |
Inline is fully valid and often the right default — a proper inline template includes role definition, voice pillars with examples, banned word/phrase lists, subject line categories with approved examples, CTA guidelines, per-step purposes, and a quality checklist. Sheet structure: one row per cohort with all steps as a JSON column; if the sheet is one-row-per-step, group-compress (Path B) before the merge.
The merge joins entity rows to template rows on a cohort key: persona label from nomination ("Finance Leader" → template A), qualification score band ("High Fit" → aggressive CTA), campaign/source tag, or any matching column. The merge is an inner join — entities without a matching template variant are silently excluded; monitor row counts at the merge output and pre-filter null cohort keys.
| Stage | Model | Why |
|---|---|---|
| Angle-based cold emails, LinkedIn comments with batch rules, nuanced persona voice | gpt-5.2 | Complex content, anti-AI tone rules |
| Multi-step sequences with tonality guide + checklist | gpt-5.1 / gpt-5 | Detailed guideline adherence |
| Verifier pass | gpt-5 or one tier below the generator | Needs the same nuance; never mini |
| Pre-generation flag checks | Mini or no AI | State lookup, not generation |
| Cohort classification (upstream) | gpt-4.1-mini | Lightweight categorisation |
Never use mini models for any content-facing generation step — tonality drift and guideline misses outweigh savings. See the node-settings skill for the exact Ask AI model values and per-row costs.
Always use structured output. Principles:
"sequence": [{stage, subject, body, ...}], not numbered flat keys; arrays survive step-count changes.sequence_steps_requested / sequence_steps_returned catch truncated output.no_em_dash_used, no_salutation_verified, case_study_verified, past_event_verification. Forces the AI to prove compliance.baseline_criteria_met, tonality_adherence_notes, email_size, formality_score, events_referred (track cross-step repetition), grammar_verified (multi-language).Verifier output adds audit fields: what_was_missed, what_changes_you_made, tonality_parameter_evaluation (per-parameter score). Force what_changes_you_made on every run and instruct "you ALWAYS have to return the updated sequence content; if no changes needed, return as-is."
When external system state affects generation, compute flags upstream and reference them as {{variables}} with conditional prompt rules. Implement as a Magic Node making the API call (Custom Code only as a last resort):
| Check | Flag | Conditional rule |
|---|---|---|
| Lead in outreach tool? | is_present: yes/no | If no, omit tool-specific URLs from first email |
| Existing CRM record? | is_crm_contact: yes/no | If yes, reference the relationship |
| Last interaction date | days_since_last_touch: N | If > 90, re-engagement tone |
| Active LinkedIn? | has_linkedin: yes/no | If no, use company-level template |
{{column_name}} placeholders (never hardcode row data)## Task 1, ## Task 2) for complex promptsAdvanced patterns:
<<wf_var.uuid>> (via manage_variables) for shared content identical across rows (tonality guides, case study libraries).Anti-patterns: vague single-block prompts; scoring criteria without examples; no banned-word list; hardcoded values instead of {{placeholders}}.
Two AI passes are not optional for production outreach. The generator most often misses: tonality drift in later steps, hallucinated case studies/URLs, word-count violations, locale URL substitution, em-dash rules. Skip the verifier only for internal-facing content, experimental workflows, or very high volume (10,000+) low-stakes content (or verify a random sample).
Reference materials (case studies, product URLs, customer names) belong in the prompt as explicit data, never assumed: store in Google Sheets → import with Get Values in Range → compress to one JSON column (Group Data or a Magic Node) → inject as {{reference_materials}} → instruct "Only reference case studies shared here. Do not hallucinate." → verifier requires case_study_verified.
formality_score field; reinforce examples in the verifier.no_em_dash_used field.events_referred per step + "Don't mention the same event twice."past_event_verification field; pass event dates as variables.email_size field + "Count them. Do not exceed X words."what_changes_you_made; audit what_was_missed; tighten rubric with examples.Configure the Ask AI generator/verifier with update_node_settings (structured output setup and model values: see node-settings skill). Test the generator with run_node on 2-3 rows and read the drafts plus self-evaluation fields via get_node_output before scaling. Wire delivery downstream per the gtm-automations skill: sequences → outreach tool; LinkedIn messages → drip queue; CRM fields → system writes; or write to a sheet with the verifier audit trail for human review.
Content generation ends when verified content exists per entity row. List assembly is List Building; signal gathering is Research; fit determination is Qualification; selecting who gets content is Nomination; sending/logging/writing is GTM Automations. It may be triggered by an event-driven listener and feeds the send action as its payload.
npx claudepluginhub nurturev/nrev-mcp --plugin nrev-workflowsGuides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.