Agent skill

Personalization Subagent Pattern

by growthenginenowoslawski in growthenginenowoslawski/coldoutboundskills

Reusable approval-loop pattern for fanning out lead personalization across parallel Claude Code Task sub-agents.

MITAuto-check passedAgent Workflows

Install Personalization Subagent Pattern

skills CLI
$ npx skills add growthenginenowoslawski/coldoutboundskills --skill personalization-subagent-pattern -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install growthenginenowoslawski/coldoutboundskills personalization-subagent-pattern --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/growthenginenowoslawski/coldoutboundskills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/personalization-subagent-pattern .claude/skills/personalization-subagent-pattern && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
personalization-subagent-pattern
GitHub stars
753
Token cost
~2.8k tokens
SKILL.md length
1,098 words
Files
2 (incl. references)
Skills in repo
49
Repo updated
First seen
Licence
MIT

At a glance

Reusable approval-loop pattern for fanning out lead personalization across parallel Claude Code Task sub-agents.

  • Works in 8 steps: Prepare the lead batch → Define the output schema → Split into variants (A/B/C) → …
  • Any skill needs per-lead custom variables (situation lines
  • SKILL.md covers Always Task tool — never an…, The approval loop (before full…, When to use and Don't use this for, plus 8 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md

What it does

Personalization Subagent Pattern is an agent skill from growthenginenowoslawski/coldoutboundskills. Reusable approval-loop pattern for fanning out lead personalization across parallel Claude Code Task sub-agents. Shows the user 1 sample personalization, collects feedback, runs 10 more, approves, runs 10 more — stops when 2 consecutive rounds have zero edits, then scales to the full list. ALWAYS uses Claude Code Task tool sub-agents — never an external Anthropic/OpenAI API key. Use when any skill needs per-lead custom variables (situation lines, value lines, CTAs).

Its SKILL.md is about 2.8k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including reference files (for example `references/prompt-template.md`).

It sits in Agent Workflows, covering Subagents and LLM API integration. It works with OpenAI. The repository describes itself as: Open-source Claude Code skills for cold email and outbound sales. Grade campaigns, export Prospeo searches, scrape Google Maps — all from Claude Code. The licence is MIT.

When your agent uses it

  • Any skill needs per-lead custom variables (situation lines
  • Tasks that involve Subagents
  • Tasks that involve LLM API integration

Example prompts

  • “/personalization-subagent-pattern”

Workflow steps

8 steps, taken from the step headings in SKILL.md.

  1. Prepare the lead batch
  2. Define the output schema
  3. Split into variants (A/B/C)
  4. Batch size
  5. The sub-agent prompt template
  6. Fan-out code pattern
  7. Error handling
  8. Merge and upload

What it can do on your machine

Read from SKILL.md and the folder at commit 25c5d85. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    No scripts in the folder and no shell commands in SKILL.md (its code samples are json and yaml).

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Personalization Subagent Pattern loads about 2.8k tokens when it runs, and up to ~3.4k if it reads all its reference files. Until then it costs about 126 tokens; SKILL.md has 1,098 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~126
When it runs · the whole SKILL.md, loaded when a task matches
~2.8k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~3.4k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from growthenginenowoslawski/coldoutboundskills at commit 25c5d85, republished under its MIT licence (© growthenginenowoslawski). 1,098 words, ~2,765 tokens.

Download SKILL.mdSave it as .claude/skills/personalization-subagent-pattern/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
personalization-subagent-pattern
description
Reusable approval-loop pattern for fanning out lead personalization across parallel Claude Code Task sub-agents. Shows the user 1 sample personalization, collects feedback, runs 10 more, approves, runs 10 more — stops when 2 consecutive rounds have zero edits, then scales to the full list. ALWAYS uses Claude Code Task tool sub-agents — never an external Anthropic/OpenAI API key. Use when any skill needs per-lead custom variables (situation lines, value lines, CTAs).

Personalization Sub-Agent Pattern

Cold email personalization at scale requires per-lead generation. Claude Code's Task tool lets you fan out to many sub-agents in parallel, each personalizing a slice of the lead list. This skill defines the reusable approval-loop pattern.

Always Task tool — never an API key

This skill runs entirely inside Claude Code via the Task tool. No Anthropic SDK calls, no OpenAI calls. This is intentional:

  • No extra API spend. Uses your Claude Code plan.
  • No key management. Works out of the box.
  • Parallel by design. Claude Code spawns multiple Task sub-agents in one message, letting 100 leads finish in the time it takes to personalize 10.

At very large scale (1,000+ leads), the tuned prompt can optionally be shipped to the Anthropic API for throughput. But TUNING and normal campaign runs (under 500 leads) always go through the Task tool.

The approval loop (before full fan-out)

Don't personalize 500 leads and then discover the prompt is wrong. Loop first, then scale.

Round 0 — Sample on 1 lead
  1. Pick one lead from the batch with a rich company_description.
  2. Show the user: "Here's the company description I'm working with. Based on this, what would you say to personalize?"
  3. Display what YOU (Claude) would generate for situation_line, value_line, cta_soft.
  4. Ask: "Does this feel right? Edit it, and I'll re-tune."
Round 1-N — Batch of 10 with approval
  1. Spawn one Task sub-agent with the current prompt + 10 leads.
  2. Display all 10 results in a table:
    Lead                  | situation_line                          | value_line                    | cta_soft
    jane@acme.com         | You're building the only APM for Ruby.  | Our Ruby customers find ...   | Worth 10 min?
    john@otherco.com      | ...                                     | ...                           | ...
  3. Ask: "Any edits? Point at the row number and say what's wrong."
  4. If the user has edits, update the prompt (or add rules like "never use the word X") and re-run a new batch.
  5. If the user has zero edits for 2 consecutive rounds, the prompt is locked. Scale to the full list.
Scale — Full fan-out

Once locked:

  • Split remaining leads into batches of 10-20.
  • Launch 3-10 parallel Task sub-agents (one per variant × batch).
  • Merge results by lead_id.

When to use

  • Any campaign where per-lead custom variables are needed (beyond just {first_name})
  • When you have 50+ leads and want personalization without manual writing
  • When /auto-research-public or similar orchestration skills need parallel personalization

Don't use this for

  • Small batches (<10 leads) — just personalize inline in the main conversation (no fan-out needed)
  • Static copy (same email to every lead) — personalization wastes tokens

When to use

  • Any campaign where per-lead custom variables are needed (beyond just {first_name})
  • When you have 50+ leads and want personalization without manual writing
  • When /auto-research-public or similar orchestration skills need parallel personalization

Don't use this for

  • Small batches (<20 leads) — just personalize inline in the main conversation
  • Static copy (same email to every lead) — personalization wastes tokens

The pattern

1. Prepare the lead batch

Before fanning out, your lead batch should be a JSON array where each lead has:

json
{
  "lead_id": "<stable identifier>",
  "first_name": "<str>",
  "last_name": "<str>",
  "email": "<str>",
  "company_name": "<str>",
  "company_domain": "<str>",
  "company_description": "<1-3 sentences about what the company does>",
  "title": "<str>",
  "linkedin_url": "<optional>",
  "enrichment_data": { ... any extra signals ... }
}

The richer the company_description, the better the personalization. If you only have company names, the output will be generic.

2. Define the output schema

Decide up front what fields each sub-agent must return. Example:

json
{
  "lead_id": "<same id>",
  "situation_line": "<1 sentence — what you noticed about their company>",
  "value_line": "<1 sentence — connecting their situation to your offer>",
  "cta_soft": "<1 sentence — soft ask, e.g. 'worth a 15 min chat?'>"
}

Fewer fields = less that can go wrong. Default to 3 fields maximum per variant.

3. Split into variants (A/B/C)

If testing 3 copy variants, run 3 parallel sub-agents per company (or per batch). Each gets a different angle prompt:

  • Variant A: Lead with a pain observation. "Noticed X on your site..."
  • Variant B: Lead with a compliment + transition. "Your approach to Y is unique..."
  • Variant C: Lead with a question. "How are you thinking about Z?"

This gives you 3x the data from one list — you can A/B/C test which angle resonates.

4. Batch size
  • Small batches are the right default: 10-20 leads per sub-agent.
  • Bigger batches = fewer agents = cheaper but worse quality (agent loses context)
  • Smaller batches = more agents = higher quality but more context usage in parent

For 100 leads:

  • 10 sub-agents × 10 leads = good quality
  • 5 sub-agents × 20 leads = faster
  • 2 sub-agents × 50 leads = quality drops

For 1000 leads:

  • Consider running in rounds of 100 (to avoid hitting context limits in parent)
  • Each round launches 10 sub-agents of 10 leads each
Show full SKILL.md (439 more words)Show less
5. The sub-agent prompt template

Every personalization sub-agent gets a prompt of this shape:

You are personalizing cold email fields for N leads.

CONTEXT:
- We sell: <one sentence from client-profile.yaml>
- Our ICP: <one sentence>
- Our offer: <the CTA we're asking them to respond to>
- Tone: <casual | formal | peer-to-peer>

FIELDS TO GENERATE (per lead):
- situation_line: <definition + 1 good example + 1 bad example>
- value_line: <definition + 1 good example + 1 bad example>
- cta_soft: <definition + 1 good example + 1 bad example>

RULES:
1. Never fabricate facts. If the company description is thin, say something generic but not false.
2. Never use em dashes (—). Use periods or commas.
3. Never use the word "leverage", "synergy", "ecosystem".
4. Maximum length: <N words per field>.
5. If a lead is missing company_description, return "<fields cannot be generated — skip>"

LEADS:
<JSON array>

RETURN:
A JSON array with the same lead_ids and the personalization fields. Save to /tmp/personalization-<batch-id>.json and print "DONE" when complete.
6. Fan-out code pattern

Pseudocode for the orchestrator (runs in the main Claude Code conversation):

leads = load leads from JSON
batches = chunk leads into groups of 10-20

for each batch:
  for each variant in [A, B, C]:
    Task(
      description: "Personalize batch <i> variant <v>",
      subagent_type: "general-purpose",
      prompt: <template above with variant-specific angle>
    )

# All tasks run in parallel (multiple tool calls in one message)

Wait for all tasks to finish, then read /tmp/personalization-*.json and merge.

Or, launching all in a single message with multiple Task calls:

# Launch 3 parallel sub-agents for one batch (variants A, B, C)
Task(description: "batch-1-variant-A", ...)
Task(description: "batch-1-variant-B", ...)
Task(description: "batch-1-variant-C", ...)
7. Error handling

Sub-agents can:

  • Return malformed JSON
  • Skip leads (if data is too thin)
  • Refuse to generate (if content feels risky)

The orchestrator should:

  1. Validate every returned JSON matches the output schema
  2. For missing lead_ids: retry once with a "strict mode" prompt that emphasizes no-skip
  3. For leads that genuinely can't be personalized (missing description): mark as personalization_status: "skipped" and use static copy instead

Never ship personalization fields that contain the string "cannot be generated" or similar — filter these out before upload.

8. Merge and upload

After all sub-agents complete:

  1. Read /tmp/personalization-*.json files
  2. Merge by lead_id
  3. Each lead now has:
    json
    {
      ...original lead fields,
      "variant_a": { "situation_line": "...", "value_line": "...", "cta_soft": "..." },
      "variant_b": { ... },
      "variant_c": { ... }
    }
  4. When uploading to Smartlead/Instantly, map each field to a custom variable. Convention:
    • Smartlead: use {{situation_line_a}}, {{value_line_a}}, etc.
    • If running 3 A/B/C campaigns, upload variant_a fields to campaign A, variant_b to B, etc.

Approval loop stop rule

The loop exits automatically when:

  • The user gives zero corrections for 2 consecutive rounds of 10 leads, OR
  • The user explicitly says "lock it, scale up"

On stop:

  1. Save the final tuned prompt to ~/cold-email-ai-skills/profiles/<business-slug>/personalization-prompt.txt
  2. Save a client-profile.yaml metadata entry:
    yaml
    personalization_prompt:
      path: profiles/<slug>/personalization-prompt.txt
      variant_count: 3
      tuned_at: YYYY-MM-DD
      rounds_to_convergence: 3
  3. Launch the parallel fan-out on the remaining leads.

If the user gives edits on round N+1 after 2 approved rounds, that's fine — the counter resets, and the loop continues.

Quality checks

Before uploading, manually spot-check 5 random leads per variant. Common issues:

  • Repetition across leads (sub-agent wrote the same line 10 times) → retry that batch with diversity instruction
  • Factually wrong claims (company does X when they actually do Y) → strengthen "never fabricate" rule in prompt
  • Unnatural phrasing (AI-speak like "I was intrigued by..." every time) → add forbidden-phrases list
  • Hedging / vagueness ("Your company might be doing X...") → add rule "assert, don't hedge"

References

  • references/prompt-template.md — copy-pasteable prompt template
  • references/example-output.json — what a well-personalized batch looks like
  • references/failure-modes.md — common sub-agent failures and how to detect them

What to do next

This is a pattern doc, not a standalone skill. It's invoked by /auto-research-public and /campaign-copywriting when they need per-lead personalization at scale.

If you're reading this directly, you're probably designing a new campaign-orchestration flow — return to whichever skill sent you here.

  • /auto-research-public — the primary consumer of this pattern
  • /icp-onboarding — produces the client-profile.yaml the prompt pulls from
  • /cold-email-starter-kit references 03-campaign-copywriting.md for copy principles the prompt enforces

© growthenginenowoslawski, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1 other file (references) in skills/personalization-subagent-pattern of growthenginenowoslawski/coldoutboundskills.

  • SKILL.md
  • references/prompt-template.md

Open the folder on GitHubat commit 25c5d85

Compare with similar skills

Personalization Subagent Pattern next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Personalization Subagent Pattern compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Personalization Subagent Pattern this skillgrowthenginenowoslawski/coldoutboundskills753—~2.8kAutomated safety check: PassMIT
Claudish UsageMadAppGang/claudish1k—~9kAutomated safety check: PassNone
Prime Agentwcygan/dotfiles194—~1.8kAutomated safety check: PassNone
Atomic Chat MCP Tool for NanoClawnanocoai/nanoclaw31k—~2.6kAutomated safety check: NotesMIT
Efficient DispatchNecmttn/ax115—~1.9kAutomated safety check: PassAGPL-3.0
Openclaw SpawnerLeoYeAI/openclaw-master-skills2.2k—~4.5kAutomated safety check: PassMIT

Similar skills

  • Claudish Usage

    MadAppGang/claudish

    CRITICAL - Guide for using Claudish CLI ONLY through sub-agents to run Claude Code with any AI model (OpenRouter, Gemini, OpenAI, local models).

    1k GitHub stars~9k tokensUpdated 4 days ago
    Agent WorkflowsAuto-check passed
  • Prime Agent

    wcygan/dotfiles

    A skill your agent uses when learning, configuring, or troubleshooting Prime Agent (PrimeIntellect-ai/prime-agent), including installation, providers, custom OpenAI-compatible models, local…

    194 GitHub stars~1.8k tokensUpdated today
    Agent WorkflowsAuto-check passed
  • Adds an MCP server to NanoClaw so its container agent can list and prompt local models served by the Atomic Chat desktop app.

    31k GitHub stars~2.6k tokensUpdated today
    Agent WorkflowsAuto-check: notes
  • Model-routing orchestration for any expensive frontier model (Fable, Opus, GPT-5.x) - the main model keeps judgment and Q&A review, mechanical subagent dispatches carry an explicit cheaper model…

    115 GitHub stars~1.9k tokensUpdated 4 days ago
    Agent WorkflowsAuto-check passed
  • Openclaw Spawner

    LeoYeAI/openclaw-master-skills

    Enables an Openclaw agent to spawn sub-agents (child Openclaw instances) when a task is too large, complex, or parallel to handle alone.

    2.2k GitHub stars~4.5k tokensUpdated 2 mo ago
    Agent WorkflowsAuto-check passed
  • Auto Review Loop LLM

    AI4Scientist/nano-scientist

    Autonomous research review loop using any OpenAI-compatible LLM API.

    128 GitHub starsUsed in 3 repos~1.8k tokens
    Agent WorkflowsAuto-check: warnings

More from growthenginenowoslawski/coldoutboundskills

All 49 skills in this repo
  • Email Deliverability Audit

    growthenginenowoslawski/coldoutboundskills

    Diagnostic audit for a running cold email program. An agent skill from growthenginenowoslawski/coldoutboundskills.

    753 GitHub stars~3.4k tokensUpdated 5 days ago
    Auto-check passed
  • Icp Onboarding

    growthenginenowoslawski/coldoutboundskills

    Conversational intake for cold email campaigns. An agent skill from growthenginenowoslawski/coldoutboundskills.

    753 GitHub stars~1.9k tokensUpdated 5 days ago
    Auto-check passed
  • List Builder

    growthenginenowoslawski/coldoutboundskills

    META skill — build the largest possible qualified lead list for any request, end to end.

    753 GitHub stars~4.7k tokensUpdated 5 days ago
    Auto-check: notes
  • Auto Research Public

    growthenginenowoslawski/coldoutboundskills

    Autonomous cold email campaign launcher. An agent skill from growthenginenowoslawski/coldoutboundskills.

    753 GitHub stars~2.9k tokensUpdated 5 days ago
    Auto-check passed
  • Blitz List Builder

    growthenginenowoslawski/coldoutboundskills

    Use the Blitz API to find decision-makers at specific companies when you already have a list of company domains.

    753 GitHub stars~2k tokensUpdated 5 days ago
    Auto-check passed
  • Deliverability Test Public

    growthenginenowoslawski/coldoutboundskills

    Compare reply rates, bounce rates, and positive reply rates broken down by inbox type (SMTP / Gmail / Outlook) for a Smartlead account.

    753 GitHub stars~1k tokensUpdated 5 days ago
    Auto-check passed

Works with

Questions about Personalization Subagent Pattern

What does Personalization Subagent Pattern do?

Reusable approval-loop pattern for fanning out lead personalization across parallel Claude Code Task sub-agents. Personalization Subagent Pattern is an agent skill from growthenginenowoslawski/coldoutboundskills. Reusable approval-loop pattern for fanning out lead personalization across parallel Claude Code Task sub-agents.

When should I use Personalization Subagent Pattern?

Personalization Subagent Pattern fits situations like: any skill needs per-lead custom variables (situation lines; tasks that involve Subagents; tasks that involve LLM API integration.

How do I install Personalization Subagent Pattern in Claude Code?

Run `npx skills add growthenginenowoslawski/coldoutboundskills --skill personalization-subagent-pattern -a claude-code`. Or copy the skill folder (skills/personalization-subagent-pattern in growthenginenowoslawski/coldoutboundskills) into .claude/skills/personalization-subagent-pattern in your project. Claude Code loads it when a task matches its description.

How do I install Personalization Subagent Pattern in Codex?

Run `npx skills add growthenginenowoslawski/coldoutboundskills --skill personalization-subagent-pattern -a codex`. Or copy the skill folder (skills/personalization-subagent-pattern in growthenginenowoslawski/coldoutboundskills) into .agents/skills/personalization-subagent-pattern in your project. Codex loads it when a task matches its description.

Can I use Personalization Subagent Pattern in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add growthenginenowoslawski/coldoutboundskills --skill personalization-subagent-pattern -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/personalization-subagent-pattern, .gemini/skills/personalization-subagent-pattern, .github/skills/personalization-subagent-pattern and .opencode/skills/personalization-subagent-pattern in your project.

What does Personalization Subagent Pattern need to run?

SKILL.md names no scripts, command-line tools or credentials: Personalization Subagent Pattern is instructions for the agent only.

Does Personalization Subagent Pattern access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Personalization Subagent Pattern safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Personalization Subagent Pattern use?

Personalization Subagent Pattern is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Personalization Subagent Pattern use?

About 2.8k tokens (SKILL.md is roughly 11k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 604 tokens, read only when the agent opens those files.

What are the alternatives to Personalization Subagent Pattern?

Skills that share tags, products or a category with Personalization Subagent Pattern: Claudish Usage (MadAppGang/claudish, 1k stars), Prime Agent (wcygan/dotfiles, 194 stars), Atomic Chat MCP Tool for NanoClaw (nanocoai/nanoclaw, 31k stars) and Efficient Dispatch (Necmttn/ax, 115 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Personalization Subagent Pattern?

growthenginenowoslawski (a GitHub user) maintains it in growthenginenowoslawski/coldoutboundskills, which has 753 GitHub stars. The repository holds 49 skills in this directory. The repository was last updated on October 5, 2026.

Source: growthenginenowoslawski/coldoutboundskills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.