Run the Personalized Outreach team and produce an outreach kit — one panel per
prospect, ready to edit and send. You orchestrate the agents; they do the work.
The job this replaces is the one nobody has time for: researching one prospect properly
takes longer than writing to them, so most outreach ships generic. This run does the
reading — up to four people at once, sourced — and hands back drafts that could only have
been written by someone who did it.
What it replaces: researching prospects one at a time before writing to them, and
writing the message generically when the research doesn't happen.
Time saved: about 1 hour by hand, estimated and not yet timed. The timed
baseline (E6-26) replaces this figure when it lands.
This tool never sends anything. It researches and drafts. Every message in the kit is
a draft waiting for the builder to read it, change it, and send it from their own account.
There is no send step, no sequence, and no CRM write — say so plainly if asked, and see
§ Honesty rules.
First — anchor to the project
The kit, its working folder, and the voice.md / objectives.md the run reads all live
in the builder's project. Two generations exist: the project ships inside the workspace
image (usually the folder my-workspace); projects made before 2026-08 were cloned and
carry whatever name the builder chose. Assume neither — identify it by its signature.
In an SSH/cloud container the chat may start in the project itself or in the home
folder with the project one level down — both are normal. Identify it by signature, not
name: run ls; see CLAUDE.md and design/ side by side? You're in the project. If not,
find it: ls */CLAUDE.md, then ls ~/*/CLAUDE.md, else
find ~ -maxdepth 3 -path '*/design/dashboard.html'. cd in, capture the absolute
path with pwd, and use that full path throughout. Can't find it? Ask the builder which
folder their project is in.
Before the questions — read what the builder already has
Check, without asking: objectives.md and voice.md at the project root, whether
writing-samples/ holds anything, and the latest doc under my-work/messaging-doc/ if
one exists. These sharpen the run — they are never required for it.
- If they're real, use them to pre-fill the intake below (propose, confirm, don't
re-ask cold).
voice.md matters more here than on any other use case, because this run writes
something the builder puts their name on. If it's a placeholder or absent, say so once,
plainly, and keep moving: "Your voice.md is still the placeholder template, so these
drafts will be neutral rather than yours — you'll be rewriting them more than you'd
like. Happy to run anyway; /bluerock:onboard fixes it for every future run." Never
make setup homework the price of the first kit.
- If the builder has their own positioning, a one-pager, or a pitch doc, they can name
or paste it at any step — it feeds the same slot as what they're selling.
Intake — one question per step, short, then confirm
Ask these one at a time. Keep each ask to a line or two; don't stack questions or explain
the whole flow up front.
Skip what they already gave you. If the opening request named the people or the
company, don't re-ask — say what you're taking as given (Prospects: Dana Okafor, Priya Raman · Company: Acme) so a wrong reading gets corrected early, then pick up at the first
step that's actually missing. A returning builder never re-answers a question they already
answered; a prior run's inputs.md pre-fills the same way (propose, confirm, don't re-ask
cold).
Which prompt shape for which step: use the question picker (AskUserQuestion) only
where the answer is genuinely a choice between a few options — steps 2a and 3. Everywhere
else the answer is free text in the builder's own words, and a four-option picker is the
wrong shape for it: ask in the message and let them type. Where the picker isn't available
in this client, ask in the message.
- Who you're writing to. "Who are we reaching? Names plus their company — a LinkedIn
URL is better if you have one, because it removes the guessing on common names. Cap is
4 per run." Four is deliberate: the reading is the expensive part, and a run that
researches twelve people shallowly is the generic outreach this replaces.
- What you're selling. "What are you offering them? A couple of real sentences in
your own words beat a polished paragraph." (Pre-fill from the messaging doc or
objectives.md when they exist and confirm instead.) The angle is built only from
here — never fabricate an offer.
- 2a — if they have nothing written down, offer the route rather than leaving them
stuck: "Want me to pull it out with three questions?" (options: yes, ask me the
three · I'll write it myself · skip it — the panels will say the angle was built
without it). If they take the three, ask one at a time:
- What problem do you solve, in the words a customer uses for it?
- Who has that problem worst, and how would I recognize them?
- What happens to them if they do nothing?
Then read their answers back as a short offer description and let them correct it
before moving on.
- The channel. Ask it as a picker, because the draft's whole shape depends on it and
there are four real answers: email · LinkedIn message · LinkedIn connection note ·
call opener. One channel per run — a message written for an inbox is not a message
written for a connection request, and a kit that hedges across both is a kit the
builder rewrites.
- Anything shaping this. "Anything else I should know? A warm intro or a mutual
contact, an event you both attended, a past conversation, a claim you're not allowed to
make, a phrase to avoid, a competitor already in there. Optional — say 'nothing' if
there isn't anything." A warm intro is the highest-value thing in this box and most
builders won't think to mention it, so name it first in the ask.
- Confirm before we run. Play back the prospects, what they're selling, the channel,
and the notes as a short bullet list, then: "Good to go, or anything to edit?" Carry
all four inputs forward verbatim from here — what they sell and their notes are the
builder's own words, and paraphrasing either is how a draft ends up claiming something
they never said.
The moment the builder approves, set the expectation for the wait in one message of
its own, then go quiet until the report: the scans run concurrently and take several
minutes, so say so plainly — this is a good moment to grab a coffee or switch tasks, and
the kit will be ready when they check back. No further chatter between this and the
report.
Set up the run
- Make the working folder:
my-work/outreach-prep/<YYYY-MM-DD>-<slug>/, where the
slug names the account or the lead prospect. Dated on purpose — runs accumulate and are
never overwritten; the history is what stops a second kit reusing an opener the builder
already sent. my-work/ is builder-owned and never overwritten.
- Check for a previous run: list
my-work/outreach-prep/. If a prior dated folder
holds an outreach-kit.md, note its path and date — the writer will report what changed
and will not repeat an opener already used on the same person.
- Write
inputs.md into the working folder: the confirmed intake (prospects, what
they're selling, the channel, notes) and which project files were real enough to read.
This is the record of what shaped the kit, and the seed the next run pre-fills from.
Run the agents
Dispatch these as ordinary subagents. Do not use agent-teams tooling; this runs
identically in every client.
- Dispatch one
prospect-scanner per prospect — all in a single message so they run
concurrently. Each gets: its one prospect (name, LinkedIn URL if given, their
company), what the builder sells (so it can spend its fetches where the relevance is),
and the working folder's absolute path in the dispatch prompt itself (a subagent
starts wherever the session started; the path you pass is the handoff). Each writes a
sourced scan-<prospect-slug>.md, bounded to 6 to 8 fetches, public professional
footprint only. Wait for all of them.
- If the builder's notes mention a specific person — a warm intro, a past
conversation, something they heard — pass it to that prospect's scanner as
context the builder supplied. A warm intro is a fact from the builder and stands as
one; anything they merely heard comes back sourced or comes back
[not found].
Never laundered into the scan as established.
- Dispatch
outreach-writer with the working folder path and, when step 7 found one,
the previous outreach-kit.md path. It reads inputs.md, every scan, voice.md, and
a specimen from writing-samples/ — no web tools, no new research — and writes
outreach-kit.md: one panel per prospect; on a multi-prospect run the Who to write
first synthesis; and what changed since the previous kit. What the builder sells and
their notes reach it through inputs.md verbatim — that file carries their words,
never a paraphrase.
Publish the artifact — you, not the agents
- When
outreach-writer finishes, read outreach-kit.md and publish it as a Claude
Artifact yourself, in this conversation, following the design contract below. The
agents write markdown only; the finished, shareable view is yours to render. If
artifact publishing isn't available in my environment, don't block — the markdown is
saved; say so and give the path.
The artifact — design contract (follow it exactly)
The artifact is a tool the builder operates while they send, not a report they scroll
(product decision, 2026-08-31). One prospect on screen at a time, reachable in one click;
sections scannable by color before they are read. This contract is
skills/competitive-intel/SKILL.md § the artifact with this use case's lanes substituted —
same palette values, same type system, same structure rules. Copy it; don't re-derive it.
Read-only is absolute, and it bites hardest here. No CTAs, no dead controls, nothing
that pretends to fetch, save, or send. Specifically: no copy-to-clipboard button on the
drafts, and no send control of any kind. The draft is selectable text in a bordered
block — that is enough, and a send-shaped button on a kit whose whole promise is "nothing
is sent" is the worst possible control to ship. Interactivity is navigation, never chrome.
A single self-contained HTML page. CSP rules: exactly one external request, the Google
Fonts stylesheet below. All CSS in one <style> block, all JS inline (one small tab
script), no CDN scripts, no remote images. Print-friendly: under @media print the tab
strip hides, .panel[hidden] { display: block } renders every prospect in sequence, with
a page break between prospects — a printed kit is a call-prep sheet.
Fonts — one Google Fonts link, every face with a real fallback: DM Sans (display +
body; fallback system-ui, -apple-system, sans-serif), Source Serif 4 (the read block,
the angle, the drafts, the first question; fallback Georgia, serif), JetBrains Mono
(labels, meta, dates, chips; fallback ui-monospace, Menlo, monospace).
Theme — ship both, token-structured. Bare :root carries the complete light palette;
@media (prefers-color-scheme: dark) guarded as :root:not([data-theme="light"])
redefines only the tokens; :root[data-theme="dark"] duplicates them. Every component
rule uses var() — no literal color outside the three token blocks. body background is
var(--paper).
Tokens (light / dark) — the Builders palette, with the lane families named for this
use case's four lanes:
| Token |
Light |
Dark |
| paper / card / card-2 |
#F5F1EA / #FFFFFF / #FAF7F1 |
#14171E / #1C212B / #222835 |
| line / line-2 |
#E7E0D6 / #D6CDBE |
#2E3542 / #3D4658 |
| ink / ink-2 / ink-3 / ink-4 |
#1B2130 / #3D4658 / #6B7486 / #8B93A3 |
#EDEEF2 / #C3C9D4 / #97A0B0 / #7B8494 |
| accent (BlueRock blue — structural, and the angle lane) + soft + line |
#1559C4 / #E8EFFB / #B9CDEF |
#6E9BE8 / #1D2A45 / #34528C |
| fact (the sourced lane) + soft + line |
#206E5B / #E7F2EE / #BFDCD3 |
#55B092 / #1B2E29 / #2F5A4B |
| draft (the drafts lane) + soft + line |
#94660F / #F7EFDD / #E5D3AC |
#D3A24C / #322A19 / #66542B |
| gap (the what we couldn't find lane) + soft + line |
#B4432E / #F9ECE8 / #E8C7BE |
#E0715A / #372220 / #6B392F |
| neutral + soft + line |
#5A6272 / #EEEDE9 / #D9D3C8 |
#9AA3B2 / #262C37 / #414A5A |
| chip text (on lane-colored chips) |
#FFFFFF |
#14171E |
Structure (max width 1000px):
- Sticky masthead — uppercase display title (
<account or campaign> · Outreach kit
shape), mono meta line (<date> · SELLING: <offer in four words> · CHANNEL: <channel> · <first run or run N> · <N> source domains), then the tab strip: one role="tab"
button per prospect, aria-selected on the active one, 3px accent underline; panels are
<section role="tabpanel"> toggled via the hidden attribute by the inline script
(first panel visible on load, others carry hidden in markup).
- Legend row naming the four lanes with color dots: sourced, dated · the angle (yours,
aimed) · drafts — not sent · what we couldn't find. Four lanes carry three kinds of
statement: the gap lane is the sourced lane's honest other half (what the record does
not say), which is why it gets its own color rather than hiding inside the first. The
legend is where the separation becomes visible before a word is read, so it is not
optional.
- "Since your last kit" strip — only when a previous run existed: an accent-soft
callout, dated, listing the writer's "Since" items (or its "no material change" line),
and any opener it deliberately avoided reusing. Omit the block entirely on a first run.
- On a multi-prospect run, one synthesis view reachable from the tab strip alongside
the prospects: Who to write first — the writer's table (prospect × why-now ×
strength × angle) inside a bordered
overflow-x: auto container, the strength column
rendered as a lane-colored chip (strong fact, fair neutral, cold — fit only gap),
and the two-line order read beneath it carrying its [my read] tag.
- One panel per prospect, sections in this order:
- Name (display, 28–40px, weight 800) + mono scope subline carried from the scan:
<role> · <company> · footprint: <substantial|moderate|thin>.
- Who they are — bordered block with a dark bar header (
background: var(--ink),
color: var(--paper)), labeled grid rows (128px + 1fr; mono uppercase labels, serif
values): what they own, tenure, the company. Then a highlighted THE READ row on
accent-soft: the one sentence that frames this approach.
- Why now — fact-colored chip + note
Sourced. Dated.; numbered item-cards (mono
number, fact-colored 4px left stripe) each carrying the signal as the bold lead, its
date as a mono chip, and its source chip scan-<slug>.md · <section>. Carry every
[their claim] / [unverified] / [my read] marker as a small gap-colored mono tag —
never silently drop one. When the writer found no dated signal, render its honest
line as a single full-width fact-lane card, not an empty section and not a hidden one.
- The angle — accent chip + note
Yours, aimed. Not a finding about them.; the
angle sentence in serif italic behind an accent-colored 3px left rule, with the
one line beneath naming what it rests on. [my read] markers stay visible.
- The draft — draft-colored chip reading
DRAFT · <channel> · not sent; the message
in a card on --draft-soft with a 3px draft-colored left border, body face at a
comfortable measure, white-space: pre-wrap so the writer's line breaks survive. Where
the channel has a subject line, it sits above the body as a mono uppercase SUBJECT
label row. Beneath the card, the why this opener line in small mono with its source
chip. Selectable text only — no copy button, per the read-only rule above.
- Follow-up beats — draft-colored chip + note
Also drafts. You decide if they go.;
WHEN/WHAT rows (mono uppercase WHEN label carrying the trigger, the line in ink, the
pre-written text in the draft card treatment where the writer supplied one).
- The gap — gap-colored chip + note
What we couldn't find.; one card, hairline-
separated list, then the first question in serif italic inside a gap-soft callout
with a 3px gap left border. Required — never omitted. On a thin prospect this
section renders full-width and directly under Who they are, because it is the most
useful thing on the panel; it reads as the finding it is, never as an apology.
- Panel sources — mono chips of the domains that prospect's scan actually used.
- Footer — the three-lane separation note (sourced lines carry a scan citation; the
angle is yours to say, never dressed up as a finding; drafts are drafts), the line
Drafts only — nothing here has been sent, and this tool cannot send, the line
Public professional information only, and Built with BlueRock · Personalized Outreach · prospect-scanner + outreach-writer.
The scan test: someone opening this between two calls has about eight seconds — the
lane colors, the name, the why-now dates, and the draft block must carry the panel before
a single sentence is read.
Finish
- The outreach kit artifact is the payoff. The
outreach-kit.md is the source of
record the builder keeps and can push to their repo, and inputs.md beside it is what
the next run pre-fills from.
- Report: the folder path, the one line that matters (the sharpest sourced why-now,
or — when a prospect came back thin — the first question that gap became), and the
artifact (or the fallback note). Say once that the drafts are drafts and nothing has
been sent. Don't reprint the kit.
- Offer the depth, after the run — never before it. One beat, two doors, then stop:
"Want to see how this worked? Two agents ran it — a scanner that read each person's
public record and a writer that aimed your offer and drafted in your voice. The
anatomy-of-an-agent and give-your-agent-memory sessions explain the pattern — say
'teach me how this works'. And if these drafts didn't sound like you, that's
voice.md: run /bluerock:onboard and the next kit writes the way you write."
Honesty rules this skill carries
- The tool never sends anything, ever. No send, no sequence, no scheduling, no CRM
write. If a builder asks for it, say plainly that this run stops at drafts by design and
that sending stays theirs — don't improvise a workaround with another tool.
- Three lanes, never blurred. Facts about a person trace to a scan and carry sources;
the angle is the builder's own claim, aimed but labeled theirs; drafts are labeled
drafts. The writer enforces it; the artifact preserves it.
- A thin prospect gets a short honest panel, not a padded one, and the gap becomes the
first discovery question. This is the designed outcome, not a degraded one — a builder
who opens with a genuine question does better than one who opens with a press release
they mistook for insight.
- Public professional footprint only. No contact details found, guessed, or inferred;
nothing behind a login; nothing personal. The scanner carries the hard version of this
rule and it is not negotiable at this layer either.
- Would this survive the prospect reading it? Panels get forwarded and drafts get
screenshotted. Nothing in a kit should embarrass the builder if it happens.
- Refresh, don't rot. A why-now goes stale in weeks, not quarters — a funding round is
news for about a month. Every run is dated; when the previous run in
my-work/outreach-prep/ is more than a month old, say so in the report rather than
treating the diff as a refresh.
- The time-saved line above ships only with a timed figure and its provenance.
Who depends on this skill's wording
Not part of a run. Read this before rewording anything a builder sees.
agents/outreach-writer.md owns the panel section names (Who they are, Why now, The
angle, The draft, Follow-up beats, The gap) and the synthesis name on multi-prospect
runs (Who to write first); this skill's artifact contract renders all of them by name
and order. Reword them in either file and the artifact loses sections silently. The
draft's two-part shape (the message, then the why this opener line with its source)
is likewise shared between the writer's panel spec and the artifact's draft rendering.
agents/prospect-scanner.md owns the scan section names; the writer reads scans by
section, and the artifact's subline carries the scan's Footprint: rating verbatim
(substantial / moderate / thin) — the three words are matched, not paraphrased.
The scan filename shape scan-<prospect-slug>.md is matched by the writer's Glob.
- The four channel shapes (email, LinkedIn message, LinkedIn connection note, call
opener) are named identically in this skill's intake step 3 and the writer's § Channel
shapes; the artifact prints the chosen one in the masthead meta and the draft chip.
Adding or renaming a channel is a change in three places.
skills/onboard/SKILL.md owns voice.md and writing-samples/, which the writer
reads and this skill's close names as the fix for drafts that don't sound like the
builder. Renaming either strands both.
curriculum/manifest.json carries this skill's one_liner, artifact,
time_saved, and team — the menu and the site read them; keep them in step with the
opening lines here.
- README.md § Personalized Outreach quotes the intake shape and the panel sections.
- The working folder shape
my-work/outreach-prep/<YYYY-MM-DD>-<slug>/ is what makes run
history findable, and the history is what stops a rerun reusing a sent opener;
/bluerock:wrap-up logs runs against the agent-team label Personalized Outreach
with members prospect-scanner + outreach-writer (the Account Research roll-up shape).
- The flow doc mirrors this skill (content repo, private:
09-product/use-case-flows/personalized-outreach-flow.md) — any change to the intake,
dispatch, artifact, or close updates it in the same pass.
1---2name: outreach-prep3description: Personalized Outreach — point an agent team at the people you want to reach and get an outreach kit: one panel per prospect with who they are and why now (sourced), the angle, a draft in your voice, and follow-up beats. Use when I say "research these prospects", "prep me for outreach to <name>", "who is <name> at <company>", "write a cold email to <name>", "draft outreach for these four", "personalize this outreach", or name people I want to write to. Runs prospect-scanner (once per prospect, up to 4, concurrently) → outreach-writer, and writes to my-work/outreach-prep/. Nothing is ever sent — the kit is yours to edit and send yourself.4---56Run the Personalized Outreach team and produce an **outreach kit** — one panel per7prospect, ready to edit and send. You orchestrate the agents; they do the work.89The job this replaces is the one nobody has time for: researching one prospect properly10takes longer than writing to them, so most outreach ships generic. This run does the11reading — up to four people at once, sourced — and hands back drafts that could only have12been written by someone who did it.1314**What it replaces:** researching prospects one at a time before writing to them, and15writing the message generically when the research doesn't happen.16**Time saved:** about 1 hour by hand, estimated and not yet timed. The timed17baseline (E6-26) replaces this figure when it lands.1819**This tool never sends anything.** It researches and drafts. Every message in the kit is20a draft waiting for the builder to read it, change it, and send it from their own account.21There is no send step, no sequence, and no CRM write — say so plainly if asked, and see22§ Honesty rules.2324## First — anchor to the project2526The kit, its working folder, and the `voice.md` / `objectives.md` the run reads all live27in the builder's project. Two generations exist: the project ships inside the workspace28image (usually the folder `my-workspace`); projects made before 2026-08 were cloned and29carry whatever name the builder chose. **Assume neither — identify it by its signature.**30In an SSH/cloud container the chat may start in the project itself or in the **home31folder** with the project one level down — both are normal. Identify it by signature, not32name: run `ls`; see `CLAUDE.md` and `design/` side by side? You're in the project. If not,33find it: `ls */CLAUDE.md`, then `ls ~/*/CLAUDE.md`, else34`find ~ -maxdepth 3 -path '*/design/dashboard.html'`. `cd` in, capture the **absolute35path** with `pwd`, and use that full path throughout. Can't find it? Ask the builder which36folder their project is in.3738## Before the questions — read what the builder already has3940Check, without asking: `objectives.md` and `voice.md` at the project root, whether41`writing-samples/` holds anything, and the latest doc under `my-work/messaging-doc/` if42one exists. These sharpen the run — they are never required for it.4344- **If they're real**, use them to pre-fill the intake below (propose, confirm, don't45 re-ask cold).46- **`voice.md` matters more here than on any other use case**, because this run writes47 something the builder puts their name on. If it's a placeholder or absent, say so once,48 plainly, and keep moving: *"Your `voice.md` is still the placeholder template, so these49 drafts will be neutral rather than yours — you'll be rewriting them more than you'd50 like. Happy to run anyway; `/bluerock:onboard` fixes it for every future run."* Never51 make setup homework the price of the first kit.52- **If the builder has their own positioning, a one-pager, or a pitch doc**, they can name53 or paste it at any step — it feeds the same slot as what they're selling.5455## Intake — one question per step, short, then confirm5657Ask these one at a time. Keep each ask to a line or two; don't stack questions or explain58the whole flow up front.5960**Skip what they already gave you.** If the opening request named the people or the61company, don't re-ask — say what you're taking as given (`Prospects: Dana Okafor, Priya62Raman · Company: Acme`) so a wrong reading gets corrected early, then pick up at the first63step that's actually missing. A returning builder never re-answers a question they already64answered; a prior run's `inputs.md` pre-fills the same way (propose, confirm, don't re-ask65cold).6667**Which prompt shape for which step:** use the question picker (`AskUserQuestion`) only68where the answer is genuinely a choice between a few options — steps 2a and 3. Everywhere69else the answer is free text in the builder's own words, and a four-option picker is the70wrong shape for it: ask in the message and let them type. Where the picker isn't available71in this client, ask in the message.72731. **Who you're writing to.** "Who are we reaching? Names plus their company — a LinkedIn74 URL is better if you have one, because it removes the guessing on common names. Cap is75 4 per run." Four is deliberate: the reading is the expensive part, and a run that76 researches twelve people shallowly is the generic outreach this replaces.772. **What you're selling.** "What are you offering them? A couple of real sentences in78 your own words beat a polished paragraph." (Pre-fill from the messaging doc or79 `objectives.md` when they exist and confirm instead.) The angle is built **only** from80 here — never fabricate an offer.81 - **2a — if they have nothing written down**, offer the route rather than leaving them82 stuck: *"Want me to pull it out with three questions?"* (options: yes, ask me the83 three · I'll write it myself · skip it — the panels will say the angle was built84 without it). If they take the three, ask **one at a time**:85 1. What problem do you solve, in the words a customer uses for it?86 2. Who has that problem worst, and how would I recognize them?87 3. What happens to them if they do nothing?88 Then read their answers back as a short offer description and let them correct it89 before moving on.903. **The channel.** Ask it as a picker, because the draft's whole shape depends on it and91 there are four real answers: email · LinkedIn message · LinkedIn connection note ·92 call opener. One channel per run — a message written for an inbox is not a message93 written for a connection request, and a kit that hedges across both is a kit the94 builder rewrites.954. **Anything shaping this.** "Anything else I should know? A warm intro or a mutual96 contact, an event you both attended, a past conversation, a claim you're not allowed to97 make, a phrase to avoid, a competitor already in there. Optional — say 'nothing' if98 there isn't anything." A warm intro is the highest-value thing in this box and most99 builders won't think to mention it, so name it first in the ask.1005. **Confirm before we run.** Play back the prospects, what they're selling, the channel,101 and the notes as a short bullet list, then: "Good to go, or anything to edit?" **Carry102 all four inputs forward verbatim from here** — what they sell and their notes are the103 builder's own words, and paraphrasing either is how a draft ends up claiming something104 they never said.105106**The moment the builder approves**, set the expectation for the wait in one message of107its own, then go quiet until the report: the scans run concurrently and take several108minutes, so say so plainly — this is a good moment to grab a coffee or switch tasks, and109the kit will be ready when they check back. No further chatter between this and the110report.111112## Set up the run1131146. **Make the working folder:** `my-work/outreach-prep/<YYYY-MM-DD>-<slug>/`, where the115 slug names the account or the lead prospect. Dated on purpose — runs accumulate and are116 never overwritten; the history is what stops a second kit reusing an opener the builder117 already sent. `my-work/` is builder-owned and never overwritten.1187. **Check for a previous run:** list `my-work/outreach-prep/`. If a prior dated folder119 holds an `outreach-kit.md`, note its path and date — the writer will report what changed120 and will not repeat an opener already used on the same person.1218. **Write `inputs.md`** into the working folder: the confirmed intake (prospects, what122 they're selling, the channel, notes) and which project files were real enough to read.123 This is the record of what shaped the kit, and the seed the next run pre-fills from.124125## Run the agents126127Dispatch these as ordinary subagents. Do not use agent-teams tooling; this runs128identically in every client.1291309. **Dispatch one `prospect-scanner` per prospect — all in a single message so they run131 concurrently.** Each gets: its one prospect (name, LinkedIn URL if given, their132 company), what the builder sells (so it can spend its fetches where the relevance is),133 and the working folder's **absolute path** in the dispatch prompt itself (a subagent134 starts wherever the session started; the path you pass is the handoff). Each writes a135 sourced `scan-<prospect-slug>.md`, bounded to 6 to 8 fetches, public professional136 footprint only. Wait for all of them.137 - **If the builder's notes mention a specific person** — a warm intro, a past138 conversation, something they heard — pass it to *that* prospect's scanner as139 context the builder supplied. A warm intro is a fact from the builder and stands as140 one; anything they merely heard comes back sourced or comes back `[not found]`.141 Never laundered into the scan as established.14210. **Dispatch `outreach-writer`** with the working folder path and, when step 7 found one,143 the previous `outreach-kit.md` path. It reads `inputs.md`, every scan, `voice.md`, and144 a specimen from `writing-samples/` — **no web tools, no new research** — and writes145 `outreach-kit.md`: one panel per prospect; on a multi-prospect run the **Who to write146 first** synthesis; and what changed since the previous kit. What the builder sells and147 their notes reach it through `inputs.md` **verbatim** — that file carries their words,148 never a paraphrase.149150## Publish the artifact — you, not the agents15115211. When `outreach-writer` finishes, read `outreach-kit.md` and **publish it as a Claude153 Artifact** yourself, in this conversation, following the design contract below. The154 agents write markdown only; the finished, shareable view is yours to render. If155 artifact publishing isn't available in my environment, don't block — the markdown is156 saved; say so and give the path.157158### The artifact — design contract (follow it exactly)159160**The artifact is a tool the builder operates while they send, not a report they scroll**161(product decision, 2026-08-31). One prospect on screen at a time, reachable in one click;162sections scannable by color before they are read. This contract is163`skills/competitive-intel/SKILL.md` § the artifact with this use case's lanes substituted —164**same palette values, same type system, same structure rules.** Copy it; don't re-derive it.165166**Read-only is absolute, and it bites hardest here.** No CTAs, no dead controls, nothing167that pretends to fetch, save, or send. **Specifically: no copy-to-clipboard button on the168drafts, and no send control of any kind.** The draft is selectable text in a bordered169block — that is enough, and a send-shaped button on a kit whose whole promise is "nothing170is sent" is the worst possible control to ship. Interactivity is navigation, never chrome.171172A single self-contained HTML page. **CSP rules: exactly one external request, the Google173Fonts stylesheet below. All CSS in one `<style>` block, all JS inline (one small tab174script), no CDN scripts, no remote images.** Print-friendly: under `@media print` the tab175strip hides, `.panel[hidden] { display: block }` renders every prospect in sequence, with176a page break between prospects — a printed kit is a call-prep sheet.177178**Fonts** — one Google Fonts link, every face with a real fallback: `DM Sans` (display +179body; fallback `system-ui, -apple-system, sans-serif`), `Source Serif 4` (the read block,180the angle, the drafts, the first question; fallback `Georgia, serif`), `JetBrains Mono`181(labels, meta, dates, chips; fallback `ui-monospace, Menlo, monospace`).182183**Theme — ship both, token-structured.** Bare `:root` carries the complete light palette;184`@media (prefers-color-scheme: dark)` guarded as `:root:not([data-theme="light"])`185redefines only the tokens; `:root[data-theme="dark"]` duplicates them. Every component186rule uses `var()` — no literal color outside the three token blocks. `body` background is187`var(--paper)`.188189**Tokens** (light / dark) — the Builders palette, with the lane families named for this190use case's four lanes:191192| Token | Light | Dark |193|---|---|---|194| paper / card / card-2 | `#F5F1EA` / `#FFFFFF` / `#FAF7F1` | `#14171E` / `#1C212B` / `#222835` |195| line / line-2 | `#E7E0D6` / `#D6CDBE` | `#2E3542` / `#3D4658` |196| ink / ink-2 / ink-3 / ink-4 | `#1B2130` / `#3D4658` / `#6B7486` / `#8B93A3` | `#EDEEF2` / `#C3C9D4` / `#97A0B0` / `#7B8494` |197| accent (BlueRock blue — structural, and the **angle** lane) + soft + line | `#1559C4` / `#E8EFFB` / `#B9CDEF` | `#6E9BE8` / `#1D2A45` / `#34528C` |198| fact (the **sourced** lane) + soft + line | `#206E5B` / `#E7F2EE` / `#BFDCD3` | `#55B092` / `#1B2E29` / `#2F5A4B` |199| draft (the **drafts** lane) + soft + line | `#94660F` / `#F7EFDD` / `#E5D3AC` | `#D3A24C` / `#322A19` / `#66542B` |200| gap (the **what we couldn't find** lane) + soft + line | `#B4432E` / `#F9ECE8` / `#E8C7BE` | `#E0715A` / `#372220` / `#6B392F` |201| neutral + soft + line | `#5A6272` / `#EEEDE9` / `#D9D3C8` | `#9AA3B2` / `#262C37` / `#414A5A` |202| chip text (on lane-colored chips) | `#FFFFFF` | `#14171E` |203204**Structure** (max width 1000px):2052061. **Sticky masthead** — uppercase display title (`<account or campaign> · Outreach kit`207 shape), mono meta line (`<date> · SELLING: <offer in four words> · CHANNEL: <channel> ·208 <first run or run N> · <N> source domains`), then the **tab strip**: one `role="tab"`209 button per prospect, `aria-selected` on the active one, 3px accent underline; panels are210 `<section role="tabpanel">` toggled via the `hidden` attribute by the inline script211 (first panel visible on load, others carry `hidden` in markup).2122. **Legend row** naming the four lanes with color dots: sourced, dated · the angle (yours,213 aimed) · drafts — not sent · what we couldn't find. **Four lanes carry three kinds of214 statement:** the gap lane is the sourced lane's honest other half (what the record does215 not say), which is why it gets its own color rather than hiding inside the first. The216 legend is where the separation becomes visible before a word is read, so it is not217 optional.2183. **"Since your last kit" strip** — only when a previous run existed: an accent-soft219 callout, dated, listing the writer's "Since" items (or its "no material change" line),220 and any opener it deliberately avoided reusing. Omit the block entirely on a first run.2214. **On a multi-prospect run, one synthesis view** reachable from the tab strip alongside222 the prospects: **Who to write first** — the writer's table (prospect × why-now ×223 strength × angle) inside a bordered `overflow-x: auto` container, the strength column224 rendered as a lane-colored chip (`strong` fact, `fair` neutral, `cold — fit only` gap),225 and the two-line order read beneath it carrying its `[my read]` tag.2265. **One panel per prospect**, sections in this order:227 - **Name** (display, 28–40px, weight 800) + mono scope subline carried from the scan:228 `<role> · <company> · footprint: <substantial|moderate|thin>`.229 - **Who they are** — bordered block with a dark bar header (`background: var(--ink)`,230 `color: var(--paper)`), labeled grid rows (`128px + 1fr`; mono uppercase labels, serif231 values): what they own, tenure, the company. Then a highlighted **THE READ** row on232 accent-soft: the one sentence that frames this approach.233 - **Why now** — fact-colored chip + note `Sourced. Dated.`; numbered item-cards (mono234 number, fact-colored 4px left stripe) each carrying the signal as the bold lead, its235 **date** as a mono chip, and its source chip `scan-<slug>.md · <section>`. Carry every236 `[their claim]` / `[unverified]` / `[my read]` marker as a small gap-colored mono tag —237 never silently drop one. **When the writer found no dated signal**, render its honest238 line as a single full-width fact-lane card, not an empty section and not a hidden one.239 - **The angle** — accent chip + note `Yours, aimed. Not a finding about them.`; the240 angle sentence in serif italic behind an accent-colored 3px left rule, with the241 one line beneath naming what it rests on. `[my read]` markers stay visible.242 - **The draft** — draft-colored chip reading `DRAFT · <channel> · not sent`; the message243 in a card on `--draft-soft` with a 3px draft-colored left border, body face at a244 comfortable measure, `white-space: pre-wrap` so the writer's line breaks survive. Where245 the channel has a subject line, it sits above the body as a mono uppercase `SUBJECT`246 label row. Beneath the card, the **why this opener** line in small mono with its source247 chip. Selectable text only — no copy button, per the read-only rule above.248 - **Follow-up beats** — draft-colored chip + note `Also drafts. You decide if they go.`;249 WHEN/WHAT rows (mono uppercase `WHEN` label carrying the trigger, the line in ink, the250 pre-written text in the draft card treatment where the writer supplied one).251 - **The gap** — gap-colored chip + note `What we couldn't find.`; one card, hairline-252 separated list, then the **first question** in serif italic inside a gap-soft callout253 with a 3px gap left border. **Required — never omitted.** On a thin prospect this254 section renders full-width and directly under Who they are, because it is the most255 useful thing on the panel; it reads as the finding it is, never as an apology.256 - **Panel sources** — mono chips of the domains that prospect's scan actually used.2576. **Footer** — the three-lane separation note (sourced lines carry a scan citation; the258 angle is yours to say, never dressed up as a finding; drafts are drafts), the line259 **`Drafts only — nothing here has been sent, and this tool cannot send`**, the line260 **`Public professional information only`**, and `Built with BlueRock · Personalized261 Outreach · prospect-scanner + outreach-writer`.262263**The scan test:** someone opening this between two calls has about eight seconds — the264lane colors, the name, the why-now dates, and the draft block must carry the panel before265a single sentence is read.266267## Finish26826912. The **outreach kit artifact** is the payoff. The `outreach-kit.md` is the source of270 record the builder keeps and can push to their repo, and `inputs.md` beside it is what271 the next run pre-fills from.27213. **Report:** the folder path, the one line that matters (the sharpest sourced why-now,273 or — when a prospect came back thin — the first question that gap became), and the274 artifact (or the fallback note). Say once that the drafts are drafts and nothing has275 been sent. Don't reprint the kit.27614. **Offer the depth, after the run — never before it.** One beat, two doors, then stop:277 *"Want to see how this worked? Two agents ran it — a scanner that read each person's278 public record and a writer that aimed your offer and drafted in your voice. The279 anatomy-of-an-agent and give-your-agent-memory sessions explain the pattern — say280 'teach me how this works'. And if these drafts didn't sound like you, that's281 `voice.md`: run `/bluerock:onboard` and the next kit writes the way you write."*282283## Honesty rules this skill carries284285- **The tool never sends anything, ever.** No send, no sequence, no scheduling, no CRM286 write. If a builder asks for it, say plainly that this run stops at drafts by design and287 that sending stays theirs — don't improvise a workaround with another tool.288- **Three lanes, never blurred.** Facts about a person trace to a scan and carry sources;289 the angle is the builder's own claim, aimed but labeled theirs; drafts are labeled290 drafts. The writer enforces it; the artifact preserves it.291- **A thin prospect gets a short honest panel**, not a padded one, and the gap becomes the292 first discovery question. This is the designed outcome, not a degraded one — a builder293 who opens with a genuine question does better than one who opens with a press release294 they mistook for insight.295- **Public professional footprint only.** No contact details found, guessed, or inferred;296 nothing behind a login; nothing personal. The scanner carries the hard version of this297 rule and it is not negotiable at this layer either.298- **Would this survive the prospect reading it?** Panels get forwarded and drafts get299 screenshotted. Nothing in a kit should embarrass the builder if it happens.300- **Refresh, don't rot.** A why-now goes stale in weeks, not quarters — a funding round is301 news for about a month. Every run is dated; when the previous run in302 `my-work/outreach-prep/` is more than a month old, say so in the report rather than303 treating the diff as a refresh.304- **The time-saved line above ships only with a timed figure and its provenance.**305306## Who depends on this skill's wording307308Not part of a run. Read this before rewording anything a builder sees.309310- **`agents/outreach-writer.md` owns the panel section names** (Who they are, Why now, The311 angle, The draft, Follow-up beats, The gap) **and the synthesis name on multi-prospect312 runs (Who to write first)**; this skill's artifact contract renders all of them by name313 and order. Reword them in either file and the artifact loses sections silently. The314 draft's two-part shape (the message, then the **why this opener** line with its source)315 is likewise shared between the writer's panel spec and the artifact's draft rendering.316- **`agents/prospect-scanner.md` owns the scan section names**; the writer reads scans by317 section, and the artifact's subline carries the scan's `Footprint:` rating verbatim318 (`substantial` / `moderate` / `thin`) — the three words are matched, not paraphrased.319 The scan filename shape `scan-<prospect-slug>.md` is matched by the writer's Glob.320- **The four channel shapes** (email, LinkedIn message, LinkedIn connection note, call321 opener) are named identically in this skill's intake step 3 and the writer's § Channel322 shapes; the artifact prints the chosen one in the masthead meta and the draft chip.323 Adding or renaming a channel is a change in three places.324- **`skills/onboard/SKILL.md` owns `voice.md` and `writing-samples/`**, which the writer325 reads and this skill's close names as the fix for drafts that don't sound like the326 builder. Renaming either strands both.327- **`curriculum/manifest.json`** carries this skill's `one_liner`, `artifact`,328 `time_saved`, and `team` — the menu and the site read them; keep them in step with the329 opening lines here.330- **README.md § Personalized Outreach** quotes the intake shape and the panel sections.331- The working folder shape `my-work/outreach-prep/<YYYY-MM-DD>-<slug>/` is what makes run332 history findable, and the history is what stops a rerun reusing a sent opener;333 `/bluerock:wrap-up` logs runs against the agent-team label **Personalized Outreach**334 with members `prospect-scanner` + `outreach-writer` (the Account Research roll-up shape).335- **The flow doc mirrors this skill** (content repo, private:336 `09-product/use-case-flows/personalized-outreach-flow.md`) — any change to the intake,337 dispatch, artifact, or close updates it in the same pass.