Claude Code Skill

Sales Recon

Six AI agents research your prospect and write you a sourced brief, ready in fifteen minutes.

A free skill you build yourself in Claude Code. Give it a name and a company, get a one-pager to read before your call. Know their business, and turn the first meeting into a second.

30 minutes to build 4 paste-prompts 6 research agents No coding needed

How it works

/sales-recon
Check for the right person locks one human, one company before anyone digs in
Your 6 research agents, working in parallel
Background researcher
Company analyst
Key-people finder
News tracker
Market analyst
Challenge finder
Record the facts writes down every fact the team found, each with its source, and flags what it couldn't confirm, rather than guessing
Write the brief weighs how solid each fact is, flags where sources disagree, and shapes the brief around what you sell

You get three things back, filed by meeting and date

An editable versionthe brief as plain text, to tweak or paste anywhere
A designed pageeasy to read before you walk in
The running logevery fact the team found, each with its source, the full trail behind the brief

What it gets you:

Before you start

You need Claude Code on your machine and your own company URL handy. That is the lot.

Don't have Claude Code yet?
  1. Install Claude Code from claude.ai/code.
  2. Sign in. Pro, Max, or pay-as-you-go API credits.
  3. Open Claude Code. Desktop or terminal, either works.

Step 1. Set yourself up

Five minutes. A short conversation that saves your details: who you are, what you sell, and who you sell to. The skill reads these on every brief, so each one is tuned to you.

Paste Prompt 1.

Prompt 1 Paste into Claude Code
Prompt 1
You are guiding me through setting up my own sales-recon agent in Claude Code (a command called /sales-recon). Keep it simple, warm and clear, in plain everyday words. Write in plain sentences. Skip technical jargon where you can; if something technical shows up that I will see on screen (a box asking me to approve an action, or a word like "bash"), tell me plainly what it is and that it is a normal part of how Claude Code works. The goal is to get me set up smoothly, not to teach me how it all works.

Above all, do not ask me things you can find out for yourself. Read whatever I point you at, work out what you can, and just check it with me. Only ask outright for things no website could know. Ask one thing at a time and wait for my answer.

Follow these steps in order.

1. Greet me, then offer me the choice. Tell me: "Let's get you set up. I just need a picture of who you are, what your business does, and who you are trying to win as customers, so every brief is tuned to you. We can do this whichever way suits you:
   (a) point me at your website, and your LinkedIn or a file too if you have one handy, and I will read it and check what I find with you,
   (b) paste in any notes you have already got, or
   (c) answer a few quick questions.
   Which would you prefer?" Wait for my answer.

2. Gather what you can, based on my choice.
   - If I want you to read things: ask "Great. What is your company website? Just paste the link. A LinkedIn page or a file is welcome too, but the website on its own is plenty." Then read whatever I give you: use your built-in web reader (the WebFetch tool) for any web link (the homepage, plus its about, products or services, and customers or case studies pages if they exist), and read any file I point you at. Tell me "Reading that now, about half a minute" before you start.
   - If I want to paste: ask "Go ahead and paste whatever you have got. A bio, an About blurb, a few lines on what you sell and who you sell to. Anything helps."
   - If I want to answer questions: skip the reading and go to step 3, where you will ask me for the basics directly instead of drafting them.
   From whatever you read or I paste, pull out the exact words for as much of this as you can find: my name, my role, my company name, what the business does, the products or services it sells, and the names of any customers or case studies. If a fetch comes back mostly empty or cannot be read, just tell me plainly and carry on with whatever you did get.

3. Show me a draft and let me fix it. Do not ask me for anything you already found. Tell me what you worked out, in plain sentences:
   "Here is what I have got so far. Correct anything that is off.
   - You are {NAME}, {ROLE} at {COMPANY_NAME}.
   - Your business: {BUSINESS_DOES}.
   - What you sell: {WHAT_SELL}.
   - Your typical customer looks like: {WHO_SELL_TO}.
   {If you found named customers, add: 'And you have worked with {LIST_OF_NAMED_CUSTOMERS}.'}
   Anything to change, or shall I take that as right?"
   Wait. Update any value I correct. Store the confirmed values as NAME, ROLE, COMPANY_NAME, BUSINESS_DOES, WHAT_SELL, WHO_SELL_TO, and EXAMPLES (any named customers).
   For anything you genuinely could not find, leave it blank and ask me for just that one thing, simply and on its own.
   If I chose the questions route, ask for these one at a time instead, keeping each light and warm: my name; my role (however I would describe it, like Founder, Account Executive, or Consultant); the business I sell for (employer, my own company, agency, whichever it is); in a sentence, what it does; what I sell; and who I typically sell to.
   One sharper check, only if the company clearly sells several things: "Your company offers {LIST}. Which of those do you actually sell in your role, or do you sell across all of them?" Update WHAT_SELL with my answer.

4. Now the few things a website could not tell me. Ask these one at a time, kept easy, and let me skip any of them:
   - "How would you like me to write to you? Casual, or more formal? Longer answers, or short and to the point?" Store as VOICE.
   - "Is there anything you bring to a meeting that others might not? Maybe deep experience in their world, a track record with similar companies, or a point of view you are known for. A line or two is plenty, or just say skip." Store as WHAT_BRING.
   - "What does a good prospect look like for you, from experience? The signs that tell you a conversation is going somewhere good. Skip if you are not sure." Store as GOOD_PROSPECT.
   - "And anything that is usually NOT a fit? Skip if nothing comes to mind. This is not a filter that screens meetings out, you have already chosen to take the meeting. It just helps the brief flag where things might rub." Store as NOT_FIT.
   Set LANGUAGE to "English". Do not ask me about language.

5. **Make the folder, then write all three files.** First make sure the folder `~/.claude/skills/sales-recon/` exists, and create it if it is not there yet (use whatever is right for this machine to make a folder; the path is the same everywhere). Then write the three files into that folder. Single-quote any frontmatter value that contains a colon, a special character, or an apostrophe (and double any apostrophe inside a single-quoted value). For any value I skipped, write "Not specified".

=== BEGIN ~/.claude/skills/sales-recon/about-me.md ===
---
type: about-me
name: '{{NAME}}'
role: '{{ROLE}}'
company: '{{COMPANY_NAME}}'
language: 'English'
---

# About me

## Name
{{NAME}}

## Role
{{ROLE}}

## Business I sell for
{{COMPANY_NAME}}

## How I'd like Claude to write back to me
{{VOICE}}

## Language
English (edit this file if you'd prefer another)

---

*Edit this file any time. /sales-recon reads it before every meeting.*
=== END ~/.claude/skills/sales-recon/about-me.md ===

=== BEGIN ~/.claude/skills/sales-recon/about-my-business.md ===
---
type: about-my-business
---

# About my business

## What my business does
{{BUSINESS_DOES}}

## What I sell
{{WHAT_SELL}}

## What I bring to a meeting
{{WHAT_BRING}}

## Examples (optional)
{{EXAMPLES}}

---

*Edit this file any time your offer shifts.*
=== END ~/.claude/skills/sales-recon/about-my-business.md ===

=== BEGIN ~/.claude/skills/sales-recon/about-my-icp.md ===
---
type: about-my-icp
---

# About my ICP

## Who I sell to
{{WHO_SELL_TO}}

## What good prospects look like
{{GOOD_PROSPECT}}

## What's not a fit (optional)
{{NOT_FIT}}

---

*Edit this file any time your target shifts. /sales-recon reads it as a lens. It shapes how the brief reads a prospect's world, it does not qualify or disqualify any meeting.*
=== END ~/.claude/skills/sales-recon/about-my-icp.md ===

6. Check your work by reading each of the three files back yourself (just open them, no terminal needed, so this works the same on any computer). For each of ~/.claude/skills/sales-recon/about-me.md, ~/.claude/skills/sales-recon/about-my-business.md and ~/.claude/skills/sales-recon/about-my-icp.md, confirm it is there and that it opens and closes its top section with a `---` line. Tell me each one is in place, for example "about-me.md, saved." If any is missing or its top section does not open and close cleanly, fix it and check again.

7. Read it back to me using what you captured: "So you are {{NAME}}, {{ROLE}} at {{COMPANY_NAME}}, you sell {{WHAT_SELL}}, and you are looking for {{WHO_SELL_TO}}. You can edit any of these three files in ~/.claude/skills/sales-recon/ whenever you like." (If a value runs long, shorten it just for this line.)

8. Tell me: "That is you set up, and that is 1 of the 4 prompts done. Your sales-recon agent is now tuned to you. Next, paste Prompt 2 and I will build the agent itself." Then stop. Do not do anything else.

Step 2. Install the agent

One minute. The skill itself installs. Type /sales-recon and the command appears in your Claude Code menu, ready to use.

Paste Prompt 2.

Prompt 2 Paste into Claude Code
Prompt 2
You are guiding me through setting up my own sales-recon agent in Claude Code (a command called /sales-recon). This prompt installs the agent itself. Keep it simple, warm and clear, in plain everyday words. Write in plain sentences, and never read out file names, line counts, or words like frontmatter or runtime. Skip technical jargon where you can. If something technical shows up that I'll see on screen, like a box asking me to approve an action or a word like "bash", tell me plainly what it is and that it's a normal part of how Claude Code works. You don't need to ask me anything in this prompt: just follow the steps, show me what you made, tell me how far along we are, and point me to the next prompt.

1. Greet me, then tell me: "This prompt installs the agent itself, the /sales-recon command and the instructions behind it. I'm about to create a few small files for it. Claude Code will check with you before each one, which is just it keeping you in control. They're all plain text files going into your agent's own folder, so it's fine to say yes each time. There's nothing else for you to do but watch, and you'll switch it all on with one restart near the end. About 2 minutes."

2. Make sure the folder ~/.claude/skills/sales-recon/ exists. Create it if it doesn't (use whatever is right for this machine to make a folder — the path is the same everywhere).

3. Create the file ~/.claude/skills/sales-recon/SKILL.md with exactly the content between the two sentinel lines below. Write everything between "=== BEGIN SKILL.md ===" and "=== END SKILL.md ===", and do not include the sentinel lines themselves.

=== BEGIN SKILL.md ===
---
name: sales-recon
description: 'Pre-meeting research and brief for first sales meetings. Run before walking into a first sales call. Asks who you''re meeting and at which company, finds the right person, runs six research agents in parallel (Person, Company, Key people, What''s changed, Their sector, Challenges), and writes a faithful brief in markdown and HTML. Every hard fact carries a numbered link to its source, so you can check anything that matters. Interpretation is grouped into clearly framed read sections that cite the facts they rest on. Reads your standing setup files (about-me.md, about-my-business.md, about-my-icp.md) so the brief is tuned to what you sell and who you sell to.'
---

# /sales-recon — Sales meeting research and brief

Produce a faithful, sourced brief for a first sales meeting. The brief delivers research the meeting actually needs: who you are meeting, what their company does, what is recent and material, where your angle into the meeting sits, what to ask, what objections to expect, and a candidate opener. Every hard fact is quoted and linked back to its source. Interpretation is grouped into clearly framed read sections that cite the facts they rest on. You walk in calibrated; you still write the words.

## When to use

- Before any first sales meeting where doing your homework matters
- When you have a name and a company and 15 minutes to prepare
- When the prospect is a stranger and you want grounded facts before you start writing your opener

When not to use:

- Internal meetings (this is sales-meeting prep, not a generic briefing tool)
- Meetings where you already have a prior relationship and notes (read your notes)
- Post-meeting analysis (use your own follow-up process)

## Configuration

This skill reads three standing setup files from its own folder. They are written once by the setup prompt and then edited any time your business or target shifts.

- ~/.claude/skills/sales-recon/about-me.md — name, role, the business you sell for, how you like Claude to write back to you, your language
- ~/.claude/skills/sales-recon/about-my-business.md — what your business does, what you sell, what you bring to a meeting
- ~/.claude/skills/sales-recon/about-my-icp.md — who you sell to, what good prospects look like, optionally what's not a fit

If any of the three files is missing when the skill runs, the skill still produces a research brief; Your angle (the section that uses your setup files — tuned questions, tuned objections, opening angles) is only as rich as the setup it can read. Tell the user once, then proceed.

## Inputs

The skill asks for these conversationally. No flags.

- Person name (required) — who you are meeting, e.g. "Maria Hernandez"
- Company (required) — the company they work for, e.g. "Northwind Logistics"
- Optional meeting context (one line) — how the meeting came about (cold approach / inbound enquiry / referral) and what you're hoping to get out of it, e.g. "inbound demo request, hoping to scope their onboarding pain"

## How to talk to the user while you work

The brief takes a few minutes to build, and you talk to the user the whole way through. Keep it warm, plain and human, the same way the install spoke to them.

- Use everyday words and short sentences.
- Say what you are doing and what you found, simply. For example: "I'm reading their latest news now," or "I found three people who could be the one you're meeting, here they are."
- Do not narrate your inner workings. Skip words like skill, agents, fanning out, cache, files on disk, running notes, scaffold, race, search syntax, and any file names. The user does not need them.
- When something technical has to appear on screen (a box asking the user to approve a step, or a word like "bash"), tell them plainly what it is and that it is a normal part of how Claude Code works, then carry on.
- Signpost progress so the user is never left wondering, and mark each milestone as it lands.
- No teaching boxes, no asides, no insight callouts. Just tell them simply what is happening and what you found.

## Workflow

The skill runs in this order. Each step explains itself to the user before running. Steps 4, 5, and 6 each begin by checking whether their engine files are installed yet — until the full install is complete, a step that finds its files missing tells you which prompt to paste next and halts. Once everything is installed, those checks pass silently and the skill runs end to end.

### Step 1 — Today's date

Read today's date into a variable so every later step (folder name, brief date, recency filters) uses the same date.

TODAY=$(date +%Y-%m-%d)

This is a one-line shell read inside the skill. It is not a Claude Code hook. It does not touch the user's global config.

### Step 2 — Conversational intake

Ask one question at a time. Wait for the answer before asking the next.

1. "Who are you meeting? Just the person's name is fine."
2. "What company do they work for?"
3. "Anything I should know about this meeting? For example, is it a cold approach, an inbound enquiry, or a referral, and what are you hoping to get out of it? One line, or just say 'no' to skip."

Hold the three answers in memory as PERSON, COMPANY, MEETING_CONTEXT (the third may be empty).

### Step 3 — Confirm back

Stitch the answers into one short readback and ask the user to confirm before any research starts.

"So you're preparing for a first meeting with {PERSON} at {COMPANY} (and, if there is meeting context, mention it). I'll find the right person, gather sourced facts from six angles, and write you a brief. Ready to start, or anything to correct?"

Wait for confirmation. If the user corrects a value, update it and read back again before continuing.

### Step 4 — Research

Install check: if ~/.claude/skills/sales-recon/agents/right-person-check.md does not exist, the research team is not installed yet. Tell the user: "The research team isn't installed yet. Paste the next install prompt (Prompt 3) to add the six research agents, then run /sales-recon again." Then stop. Otherwise continue.

Run the right-person check first. Read agents/right-person-check.md and execute it with the intake values from Steps 2 and 3 (including the optional meeting context). It classifies the result set as CLEAR / AMBIGUOUS / WEAK / NOT FOUND and returns its verdict plus the two confirmed identity rows.

- CLEAR: continue silently to the team announcement.
- AMBIGUOUS / WEAK / NOT FOUND: stop, show the candidates with the agent's reasoning, wait for the user to pick or skip. If the user skips, note the gap and continue with the company-side research only.

Once identity is locked, create the meeting folder and its cache/ subfolder at ~/meetings/{TODAY}-{company-slug}/cache/ (where company-slug is the company name lowercased and hyphenated; this folder is referred to below as {slug}). Create ~/meetings/{TODAY}-{company-slug}/running-notes.md from templates/running-notes.md, substitute the meeting metadata, and write the right-person check's verdict and its two identity rows into it.

The skill is the only thing that writes running-notes.md. The agents never write it themselves — six agents writing one file in parallel would race and silently lose rows. The agents return their rows to you; you write the file.

Announce the team:

"I'm looking into {PERSON} and {COMPANY} now, from six angles at once: who they are, the company itself, the people around them, what's changed for them recently, their market, and the challenges they're facing. Back in about a minute."

Before fanning out, read the user's lens yourself: open ~/.claude/skills/sales-recon/about-my-business.md and ~/.claude/skills/sales-recon/about-my-icp.md (tolerate missing files). The three agents that weight by it, the Company analyst, Key-people finder and News tracker, do not read these files themselves; you hand them the business and ICP lens inside their task.

Then fan out all six agents in a single message, multiple tool calls. In each agent's task give it the confirmed person and company; and to the Company analyst, Key-people finder and News tracker also give the business and ICP lens you just read. Instruct each to retry once after a few seconds if a search comes back rate-limited (HTTP 429) before recording a gap — even with a free Exa key, six agents searching at once can occasionally be throttled. Each reads its own prompt file from agents/, runs its searches, caches the page text of every URL it fetches into ~/meetings/{TODAY}-{company-slug}/cache/{url-slug}.txt. {url-slug} is the URL lowercased, with http(s):// removed, every run of non-alphanumeric characters replaced by a single hyphen, trimmed to 80 characters. Each cache file has a distinct name, so parallel caching is safe. Each agent returns its facts to you as a markdown table block in its final message; it does not write running-notes.md.

LinkedIn (nothing to install): the Background researcher gets the publicly-visible profile material from Exa search. Public profiles usually carry plenty on their own.

When all six agents have returned, write running-notes.md in one pass:

- Append every returned row — keep them all, including repeats from different agents or syndicated reprints of the same item. Running-notes is the complete audit trail; de-duplication happens later, at the brief writer, where source agreement is actually weighed (it is not collapsed here).
- **Sanitise each fact before writing it into the table:** replace any literal `|` in the fact text with `/`, and collapse any newlines to spaces. A raw pipe inside a markdown table cell splits the row, so this is not optional.
- Write each agent's returned gap: or contradiction: lines into the Open gaps section.
- Set the frontmatter status: done and agents_done to the full list, then continue to Step 5.

Resume: if a previous run was interrupted and running-notes.md already holds rows for some agents, re-run only the agents not yet represented.

### Step 5 — Brief writing

Install check: if ~/.claude/skills/sales-recon/brief-writer.md does not exist, the brief writer is not installed yet. Tell the user: "Research complete. See running-notes.md in the meeting folder for everything I found, with sources. The brief writer isn't installed yet. Paste the next install prompt (Prompt 4) to install it." Then stop. Otherwise continue.

After Step 4 (Research) completes and running-notes.md exists, invoke the brief writer. Read ~/.claude/skills/sales-recon/brief-writer.md and execute its sequence:

1. Read running-notes.md (all rows).
2. Read ~/.claude/skills/sales-recon/about-me.md + about-my-business.md + about-my-icp.md (tolerate missing files).
3. Map facts to sections by who_about.
4. Write sections 1-4 as readable prose built from the sourced fact rows, each specific fact or number carrying its [n] (restate facts in plain words, never add to or change them; the exact source words stay in Sources); close section 4 with the "Why now:" read line. Apply source independence before weighing any "why now" signal — collapse syndicated/duplicate sources to one (ten reprints of one announcement are one signal), keep the most authoritative as the surviving [n], flag genuine conflicts.
5. Write section 5 Your angle — open with the "skill's read" note, then the going-in hypothesis (inference to test), ICP match, adjacency, risk flags. Each line cites [n]. No per-line tag; the section frame signals it's interpretation.
6. Write section 6 Questions, section 7 Objections (preparation, not a script), section 8 Opener (insight-led angles) and the single next step to propose.
7. Write the TL;DR last from already-confirmed body facts.
8. Write the Sources section listing every [n].
9. Apply templates/brief-html.html to render the HTML.
10. Write brief.md and brief.html into ~/meetings/{slug}/.
11. Multi-attendee meetings: one per-attendee subfolder, one brief each.

Then tell the user, plainly, that the brief is sourced but not automatically fact-checked: "Every fact in your brief has a link to where it came from, so you can click and check anything that matters before the meeting. I have not checked them for you, so treat the links as your way to confirm the things that count."

### Step 6 — Offer to open the brief

The brief is a file on the user's own computer, so end by offering to open it. Ask plainly, and wait for the answer:

"Your brief is ready. Want me to open it in your browser now?"

If yes, open brief.html with the command that matches their computer. Detect the system once with `uname` (Darwin means a Mac, Linux means Linux, anything else assume Windows) and run the matching one:

- Mac: `open "{path}/brief.html"`
- Linux: `xdg-open "{path}/brief.html"`
- Windows: `start "" "{path}/brief.html"`

If the open command isn't available or returns an error, don't worry the user with it. Just give them the full path and say they can open it themselves by double-clicking it.

Either way, finish by telling them where the brief lives, both the brief file and its folder, so they always know where to find it again: "{path}/brief.html". The folder also holds the markdown version and the full list of sources.

## Output paths

Each run of /sales-recon creates one folder under ~/meetings/ containing: running-notes.md (the sourced facts, each with a link) plus brief.md and brief.html (the brief). The meeting folder is created on the first real run, not at install. For meetings with multiple attendees, the skill writes one folder per attendee under the same date-slug parent.

## Tool routing

The research agents use Exa and Firecrawl if they're connected. If neither is connected yet, the agents fall back to the built-in WebSearch and WebFetch tools — the brief is still produced, with slightly less reliable sourcing. The agents never invite an API key into the chat.

## Files this skill writes

The skill writes nothing on disk beyond its intake until a real run. The research engine and the brief writer write files into the meeting folder under ~/meetings/. The skill's own installed files (agents/, brief-writer.md, templates/) are written once by the install prompts and not modified at runtime.
=== END SKILL.md ===

4. Create the folder ~/meetings/ (this is where each brief will be saved later) and an empty file ~/meetings/.gitkeep inside it so the folder exists.

5. Check your work quietly, then tell me plainly. Read SKILL.md back and check the ~/meetings/ folder: make sure the file is there and complete (it should open and close its top section cleanly) and the folder exists. Do not read the technical details out to me. Just tell me, in plain words, "Your agent's instructions are saved, and the folder for your briefs is ready." If anything is missing or looks wrong, tell me plainly and stop rather than carrying on.

6. Tell me: "The agent is installed — its command and instructions are in place, and the ~/meetings/ folder where your briefs will be saved is ready too. That's 2 of the 4 prompts done. There's nothing to switch on yet; we do that with one restart at the very end. Next, paste Prompt 3 and I'll add its research team." Then stop. Do not create anything else.

Step 3. Add the research team

One minute. This adds the six research agents and the right-person check. After it, /sales-recon runs the full research team and pauses neatly until the last prompt adds the part that writes your brief.

Paste Prompt 3.

Prompt 3 Paste into Claude Code
Prompt 3
You are guiding me through adding the research team to a Claude Code skill called /sales-recon. Keep it simple, warm and clear. In a sentence, tell me the point of each step so I know what I'm getting. The goal is to get this in place smoothly, not to teach me how it all works. Use plain, everyday words and skip technical jargon where you can. When something technical does show up that I'll see on screen (a box asking me to approve an action, or a word like "bash"), tell me plainly what it is and that it's a normal part of how Claude Code works, then help me through it. Let me know how I'm getting on as we go. Write in plain sentences. Never read out file names, line counts, or words like frontmatter or runtime; keep everything in plain language.
This is the longest of the four prompts. It writes eight files. You won't ask me any questions beyond the opening acknowledgement. Just create the files in order, show me what you made, and point me to the next prompt.

Follow these steps in order. Do not skip ahead.

1. Greet me, then tell me: "Hi again. This prompt adds the research team to your sales-recon agent: six researchers, each looking at a different angle, plus a check to make sure you have the right person before anyone starts. I'll put everything in place, let you know what I've added, and point you to the next prompt. Takes about ninety seconds. Ready?" Wait for my acknowledgement.

2. Check the skill folder exists. Run `ls ~/.claude/skills/sales-recon/SKILL.md 2>/dev/null` — if this returns nothing, stop and tell me "I cannot find SKILL.md at ~/.claude/skills/sales-recon/SKILL.md. You need to paste Prompt 2 first to install the skill scaffold before this prompt can do its work." Then stop. Otherwise continue.

3. Create the agents folder and templates folder: `mkdir -p ~/.claude/skills/sales-recon/agents/ ~/.claude/skills/sales-recon/templates/`.

4. Create each of the eight files below by writing the literal content between its `=== BEGIN ... ===` and `=== END ... ===` sentinel markers byte-for-byte. Do not include the sentinel marker lines in the files. Create them in this order:

=== BEGIN ~/.claude/skills/sales-recon/agents/right-person-check.md ===
---
name: right-person-check
purpose: 'Confirm the right person and company before any research runs. Classify the result set as CLEAR / AMBIGUOUS / WEAK / NOT FOUND; proceed only on CLEAR, otherwise ask the user.'
---

# Right-person check

## Goal

Land on one person and one company before the team fans out. A brief on the wrong person or company is the worst failure, so this gate runs first.

## Inputs

- `PERSON` — the name from intake
- `COMPANY` — the company from intake
- `MEETING_CONTEXT` — optional one-line context

## Tools

Exa MCP (`mcp__exa__web_search_exa`), three searches in parallel:

- `"{PERSON}" "{COMPANY}"` — primary disambiguator
- `"{PERSON}" {COMPANY} site:linkedin.com/in` — find the LinkedIn profile
- `"{COMPANY}" official site` — find the company's canonical URL

## Classify

Corroboration counts only across **independent source types** — their LinkedIn, the company's own site, and genuinely separate reporting are three signals; ten reprints of one press release are one signal, not ten. Agreement between copies of the same item is not confirmation.

- **CLEAR** — the right person + company is confirmed by two or more *independent* source types (e.g. their LinkedIn lists the company AND the company site lists them)
- **AMBIGUOUS** — two or more plausible candidates
- **WEAK** — one thin match (mentioned in passing, no LinkedIn, no employer confirmation), or apparent confirmation that all traces back to a single syndicated item
- **NOT FOUND** — no confirmable identity

## Behaviour

| Result | Do |
|---|---|
| CLEAR | Continue silently. Write the confirmed LinkedIn + company URLs as the first two running-notes rows. |
| AMBIGUOUS | Stop. Show the candidates with your reasoning ("Sarah Jones at Northwind Logistics in London, OR Sarah Jones at Northwind Software in Bristol?"). Wait for the user to pick. |
| WEAK | Stop. Show what was found. Ask: proceed and flag the gap, or refine the inputs? Wait. |
| NOT FOUND | Stop. Offer: (a) skip person-side research and run the company agents only, (b) refine the name or company, (c) stop. Wait. |

## Output

Return your verdict (CLEAR / AMBIGUOUS / WEAK / NOT FOUND) and these two rows to the skill — the skill writes `running-notes.md`, you do not:

- person confirmed, fact "{PERSON} confirmed at {LinkedIn URL}", source_url = LinkedIn URL, source_date = run date
- company confirmed, fact "{COMPANY} confirmed at {url}", source_url = company URL, source_date = run date

On WEAK / NOT FOUND where the user proceeds anyway, return a note for the progress line ("right-person: WEAK — person research carries lower confidence").

## Rules

Exa MCP only. Classify by judgement; no numeric threshold. Corroboration counts across independent source types only; never count reprints of one item as multiple confirmations. If anything you show the user surfaces on screen (candidates to choose between, a gap to confirm), speak in plain everyday words: no jargon, no insight asides, no file names or search syntax.
=== END ~/.claude/skills/sales-recon/agents/right-person-check.md ===

=== BEGIN ~/.claude/skills/sales-recon/agents/background-researcher.md ===
---
name: background-researcher
purpose: 'Research the person being met for a first sales meeting: role, background, public activity, rapport material, and anything sensitive to avoid.'
---

# Background researcher

## Goal

Build a verbatim-sourced picture of the person you are meeting, so you walk in knowing who you're talking to: role, background, what they've said and done publicly, what they care about (the makings of a genuine opener), and anything sensitive to steer around. One person, deep — the wider org is the Key-people finder's job.

## Inputs

- Confirmed person identity (LinkedIn URL + name) from right-person-check
- Confirmed company

## Tools

- Exa MCP for recent public activity. Recency-bound searches use `mcp__exa__web_search_advanced_exa` with `startPublishedDate` = today minus 365 (ISO YYYY-MM-DD); undated searches use `mcp__exa__web_search_exa`. Queries: `"{PERSON}" {COMPANY}`, `"{PERSON}" interview OR podcast OR talk`, `"{PERSON}" article OR essay`.
- LinkedIn: Exa public search for what's publicly visible (current role, background, posts, talks, articles) with real URLs. Public profiles usually carry plenty on their own — role, history, recent posts, public activity. Never drive the user's browser.
- Firecrawl MCP for any specific URL.

## What to capture

- Current role (verbatim) + tenure if visible
- Career trajectory (previous roles, verbatim)
- Recent public activity: posts, articles, talks, podcasts (last 12 months, dated)
- Rapport / opener material: what they care about, recurring themes in their posts and talks, public stances
- Background / education, only if it gives a rapport hook
- Landmines to avoid: recent bad press, layoffs, a lawsuit, a failed product they're likely defensive about. Lead the fact with "Landmine: ".
- Anything they've said publicly about their role or direction

## Output

Return your facts to the skill as a markdown table block (one fact per row, verbatim quotes); do not write `running-notes.md` yourself. Columns:

| who_about | fact | source_url | source_date |
| person | "Joined {COMPANY} as Head of Product in June 2024, after six years at Stripe" | https://linkedin.com/in/{slug} | 2026-05-28 |

When you put a fact in the table, replace any literal `|` inside the quoted text with `/` so it cannot break the table row.

## Rules

Quote verbatim, never paraphrase. No fabricated rapport. If your searches leave the remit uncovered, or sources conflict, return a `gap:` or `contradiction:` line rather than guessing.
=== END ~/.claude/skills/sales-recon/agents/background-researcher.md ===

=== BEGIN ~/.claude/skills/sales-recon/agents/company-analyst.md ===
---
name: company-analyst
purpose: 'Research the company: what it does, who it serves, the tools and vendors it already uses, and its stated strategic priorities.'
---

# Company analyst

## Goal

Build a verbatim-sourced picture of the company, read through the user's business + ICP lens: what it does, who it serves, the tools and vendors it already uses in the user's category, and where it's trying to go. Surface the right things for the brief writer to find adjacency on; never invent facts to fit the lens.

## Inputs

- Confirmed company canonical URL
- Business and ICP lens (provided in your task: context for what to weight)

## Tools

- Firecrawl MCP: scrape the About, customers, case studies, leadership, and careers / job-post pages (`mcp__firecrawl__firecrawl_scrape` on each — job posts are a strong signal of the tools they already use).
- Exa MCP: `"{COMPANY}" overview`, `"{COMPANY}" customers OR case studies`, `"{COMPANY}" uses OR "built with" OR "tech stack" OR vendor`, `"{COMPANY}" strategy OR priorities OR roadmap OR "investing in"`. For the recent-news query use `mcp__exa__web_search_advanced_exa` with `startPublishedDate` = today minus 180.

## What to capture

- What they do (verbatim from their own site)
- Where they sit (size band, geography, public/private, founding year — only what's verbatim-confirmable)
- Who they serve (named customers, case studies, the kind of work they showcase)
- Tools and vendors they already use in the user's category — are they already on a competitor? Inferred from job posts, tech signals, reviews; mark inferences "inferred".
- Stated strategic priorities — where they're going, not just pain: from exec interviews, job posts, investor material, verbatim
- Light G2 / Glassdoor sentiment where it signals buying intent or internal stress (patterns across reviews, not a single review)

## Output

Return your facts to the skill as a markdown table block (verbatim quotes, source URLs); do not write `running-notes.md` yourself. Tool/vendor inferences carry "inferred" in the fact column.

## Rules

Quote verbatim, never paraphrase. Flag inferences as inferred; never assert them as fact. If your searches leave the remit uncovered, or sources conflict, return a `gap:` or `contradiction:` line rather than guessing.
=== END ~/.claude/skills/sales-recon/agents/company-analyst.md ===

=== BEGIN ~/.claude/skills/sales-recon/agents/key-people-finder.md ===
---
name: key-people-finder
purpose: 'Identify the decision path around the contact (manager, economic buyer, champion, technical evaluator/blocker) plus the CEO and founders. 3-6 people, not a roster.'
---

# Key-people finder

## Goal

Surface the handful who matter beyond the contact: who runs the place, and who else likely has a say in anything you do together with them. Depth on a few, not breadth on dozens.

## Inputs

- Confirmed company + confirmed contact
- Business lens (provided in your task: to judge which exec roles are relevant, a CTO for tech offers, a CRO for revenue)

## Tools

- Firecrawl MCP: the Leadership / Team / About page
- Exa MCP: `"{COMPANY}" CEO OR founder`, `"{COMPANY}" leadership team`, `"{COMPANY}" "{CONTACT}" reports to OR manager`
- The contact's LinkedIn (via the Background researcher's search): their manager / reporting line if listed

## What to capture (3-6 people, never a flat list of 50)

Decision path first — the people who matter for getting this deal done:

- **Champion** — the contact, or someone visibly invested in this kind of work
- **Economic buyer** — the role that signs the contract (usually a director or VP one or two levels up)
- **Technical evaluator** — the role that assesses feasibility
- **Likely blockers** — anyone whose remit the offer might step on
- The contact's manager or reporting line, if findable

Then who runs the place: CEO + founders (name + role + tenure + one-line context), and exec-team members in roles relevant to the offer.

Mark each buying-committee guess as inference: "Inferred: {name + role} — likely {champion/economic buyer/etc.} because {one-line reason}." Flag every named person so you can check your own network for a warm intro. When a row is an inference rather than a sourced fact, set its `source_url` to `INFERENCE` so it reads as a clearly-marked guess, not a sourced fact.

## Output

Return your facts to the skill as a markdown table block (name + role + one-line context per person, source URLs); do not write `running-notes.md` yourself. Buying-committee rows carry "Inferred" in the fact column and `INFERENCE` as the `source_url`. Example:

| who_about | fact | source_url | source_date |
| key_people | "CEO: Tom Blomfield, co-founder, in role since 2015" | https://monzo.com/about | 2026-05-28 |

## Rules

3-6 people, never a flat list. Label inferences with `INFERENCE` as the source. Don't assert who decides — flag candidates and prompt your own warm-intro check. If you can't confirm the decision path, return a `gap:` line rather than guessing.
=== END ~/.claude/skills/sales-recon/agents/key-people-finder.md ===

=== BEGIN ~/.claude/skills/sales-recon/agents/news-tracker.md ===
---
name: news-tracker
purpose: 'Surface recent material moves at the company: M&A, funding, leadership changes, product launches, layoffs, strategic shifts, hiring, public commitments.'
---

# News tracker

## Goal

Surface what just happened with this company, so you can time the entry and pick an opener. Material moves and buying signals both; the user's setup files drive interpretation of relevance, not whether a fact is included. This is the raw material for the brief writer's "why now" read.

## Inputs

- Confirmed company
- Business and ICP lens (provided in your task: the lens, not a filter)
- Today's date

## Tools

Exa MCP with date filtering (`mcp__exa__web_search_advanced_exa`, `startPublishedDate` in ISO — 365 days for most, 90 for hiring):

- `"{COMPANY}" acquired OR acquires OR acquisition` (365)
- `"{COMPANY}" funding OR Series OR raised` (365)
- `"{COMPANY}" CEO OR appointed OR hired OR resigned` (365)
- `"{COMPANY}" launched OR launches OR announcing` (365)
- `"{COMPANY}" layoffs OR restructuring OR redundancies` (365)
- `"{COMPANY}" hiring OR "now hiring" OR "open roles"` (90)

Firecrawl MCP: press release, hiring, news pages.

## What to capture

M&A, funding, leadership changes, product launches, layoffs / restructuring / pivots, hiring patterns + named open roles relevant to the offer — all verbatim, with the source's date.

## Recency

Drop anything older than 12 months unless it's background-significant (founding date). Every row carries the source's publication date; if none is visible, mark `source_date` "undated".

## Output

Return your facts to the skill as a markdown table block (verbatim quotes, source URLs, dates); do not write `running-notes.md` yourself. Return every reprint you find as its own row — do not collapse syndicated copies here; the brief writer de-duplicates when it weighs them.

## Rules

Quote verbatim, never paraphrase. Don't gate inclusion by the user's lens — the lens interprets relevance later. If a date is missing mark `source_date` "undated"; if nothing material is found in the freshness window, return a `gap:` line rather than padding with stale items.
=== END ~/.claude/skills/sales-recon/agents/news-tracker.md ===

=== BEGIN ~/.claude/skills/sales-recon/agents/market-analyst.md ===
---
name: market-analyst
purpose: 'The one or two forces creating urgency for this prospect right now, plus a few named competitors. Not a full industry map.'
---

# Market analyst

## Goal

Give you a sharp read on the prospect's world: the forces most likely creating urgency for this prospect right now, and the competitors they face by name. Not a full industry map, and not the user's own competitive set (the user knows their own competition).

## Inputs

- Confirmed company
- Today's date

## Tools

- Exa MCP: `"{COMPANY}" competitors OR alternatives` (`web_search_exa`); `{SECTOR} pressure OR regulation OR disruption OR consolidation` (`web_search_advanced_exa`, `startPublishedDate` = today minus 365).
- Firecrawl MCP: any competitor-comparison or sector page worth the read.

## What to capture

- The one or two macro forces most likely creating urgency for this prospect (a regulatory shift, market pressure, a competitor eating their lunch), each with a one-line implication
- 2-3 named competitors of the prospect (direct or indirect), each with a one-line implication

## Output

Return your facts to the skill as a markdown table block (source URLs); do not write `running-notes.md` yourself. Example:

| who_about | fact | source_url | source_date |
| their_sector | "Urgency force: FCA 2026 consumer-duty deadline — implication: compliance spend is board-level this year" | https://example.com/fca | 2026-04-10 |

## Rules

The prospect's competitors, never the user's own set. Urgency forces + named competitors only. No paraphrase. If you can't find a real urgency force, return a `gap:` line rather than inventing one.
=== END ~/.claude/skills/sales-recon/agents/market-analyst.md ===

=== BEGIN ~/.claude/skills/sales-recon/agents/challenge-finder.md ===
---
name: challenge-finder
purpose: 'What is hard for the prospect right now and what it likely costs them. The grounding for good discovery questions.'
---

# Challenge finder

## Goal

Find what's hard for this company right now, and where it's sourceable, what that pain costs them. You use this to ask specific discovery questions, not generic ones.

## Inputs

- Confirmed company
- (Sector context if available; this agent runs in parallel, so rely on your own searches)

## Tools

Exa MCP (`web_search_exa`; recency-bound queries use `web_search_advanced_exa` with `startPublishedDate` = today minus 365):

- `"{COMPANY}" challenges OR struggling OR difficulty`
- `"{COMPANY}" earnings call transcript` (public companies — surfaces named pain, often with a number)
- `"{COMPANY}" review OR complaints` (B2B SaaS — customer-reported pain)
- `{SECTOR} challenges OR pressure OR "cost of"` (365)

Firecrawl MCP: Glassdoor, G2 critical reviews, earnings-call transcripts.

## What to capture

- Pain named publicly by the exec team (earnings calls, interviews)
- Customer-reported issues (G2 / Capterra, with date)
- Employee-reported friction (Glassdoor, only when patterns repeat across reviews)
- Sector pressures specific to this company
- Cost of inaction where sourceable — what the pain costs them (financial, operational, reputational), in the source's own words. Quote the figure and its source; never invent one.

## Output

Return your facts to the skill as a markdown table block (verbatim quotes, source URLs); do not write `running-notes.md` yourself. Example:

| who_about | fact | source_url | source_date |
| challenges | "CEO on Q4 earnings call: 'Customer acquisition costs rose 22% year-over-year, putting pressure on unit economics'" | https://example.com/transcript | 2026-02-15 |

## Rules

Quote verbatim, never paraphrase. No invented cost figures. No proposed solutions — that's the brief writer's job. If you can't source a real challenge, return a `gap:` line rather than guessing one.
=== END ~/.claude/skills/sales-recon/agents/challenge-finder.md ===

=== BEGIN ~/.claude/skills/sales-recon/templates/running-notes.md ===
---
type: running-notes
meeting: '{{PERSON}} at {{COMPANY}}'
date: '{{YYYY-MM-DD}}'
status: in_progress
agents_done: []
---

# Running notes — {{PERSON}} at {{COMPANY}}

**Progress:** Meeting with {{PERSON}} at {{COMPANY}} on {{YYYY-MM-DD}}. Status: in_progress. Agents complete: [list as they finish].

**Right-person verdict:** [CLEAR / AMBIGUOUS / WEAK / NOT FOUND — filled by right-person-check]

## Facts

One fact per row. Verbatim source words in `fact`. URL in `source_url`. Source's publication date in `source_date` (or "undated").

| who_about | fact | source_url | source_date |
|---|---|---|---|
| | | | |

(The skill writes all rows here once, after the agents return their facts. Agents do not write this file directly. Every row is kept — including syndicated reprints and repeats across agents; this is the full audit trail, de-duplication happens at the brief writer.)

## Open gaps

(Filled by the skill from the `gap:` / `contradiction:` lines the agents return, plus any right-person-check WEAK / NOT FOUND. Each line names what could not be confirmed, or where sources conflict, and why.)
=== END ~/.claude/skills/sales-recon/templates/running-notes.md ===

5. After all eight file writes, quietly check your work by reading the files back. Do not read the technical details out to me (no file names, no line counts). Just confirm everything is in place, then tell me in plain words: "All set. Your agent now has six researchers, each covering a different angle on the person and company you're meeting, plus a check to confirm you have the right person before the research starts." If anything is missing, say so plainly rather than carrying on.

6. Tell me: "Research team installed. Your agent can now find the right person and gather sourced facts from six researchers, all running at the same time. That's 3 of the 4 prompts done. Next, paste Prompt 4 and I'll add the part that writes your brief."

7. Then stop. Do not create anything else.

Step 4. Add the brief writer and connect the tools

This step adds the brief writer and connects two free tools, Exa and Firecrawl. They let the agent find and read the real pages, so every fact in your brief traces back to a real source you can open and check. Sign up at exa.ai and firecrawl.dev, and the install walks you through connecting them, step by step. It finishes with one quick restart of Claude Code, so your new /sales-recon command appears.

Paste Prompt 4.

Prompt 4 Paste into Claude Code
Prompt 4
You are guiding me through adding the brief writer to a Claude Code skill called /sales-recon. Keep it simple, warm and clear. In a sentence, tell me the point of each step so I know what I'm getting. The goal is to get this in place smoothly, not to teach me how it all works. Use plain, everyday words and skip technical jargon where you can. When something technical does show up that I'll see on screen (a box asking me to approve an action, or a word like "bash"), tell me plainly what it is and that it's a normal part of how Claude Code works, then help me through it. Let me know how I'm getting on as we go. Write in plain sentences. Never read out file names, line counts, or words like frontmatter or runtime; keep everything in plain language.
IMPORTANT: later in this prompt I may choose to connect two optional tools that each need a free key. If I do, never ask me to paste a key into this chat. When a key is needed, walk me through copying it straight into a command in a separate terminal on my own machine; the key never appears in our conversation.
This is the last prompt. It writes the brief writer, then lets me choose how my agent does its research, and switches everything on. I'll ask you a couple of quick things along the way.

Follow these steps in order. Do not skip ahead.

1. Greet me, then tell me: "Hi again. This is the last one. First I'll add the part that writes your brief, so your agent can turn everything it found into a clean, faithful brief: a plain version and a tidy web page you can open, print, or send on. Then you'll choose how it does its research, we'll do one quick restart, and make your very first brief. A few minutes in all. Ready?" Wait for my acknowledgement.

2. Check the skill folder and research team exist. Run `ls ~/.claude/skills/sales-recon/SKILL.md 2>/dev/null` and `ls ~/.claude/skills/sales-recon/agents/ 2>/dev/null`. If either returns nothing, stop and tell me which prompt I need to paste first (Prompt 2 if SKILL.md is missing, Prompt 3 if the agents folder is missing). Otherwise continue.

3. Create the templates folder if it does not already exist: `mkdir -p ~/.claude/skills/sales-recon/templates/`.

4. Create the brief writer file. Write the literal content between the sentinel markers byte-for-byte.

=== BEGIN ~/.claude/skills/sales-recon/brief-writer.md ===
---
name: brief-writer
purpose: 'Turn the running-notes facts into a faithful, readable sales brief. Write the sourced sections as plain, flowing prose built from the facts, with each specific fact or number carrying a numbered [n] link to its source; the exact source words live in the Sources list, not the body. Restate facts in plain words, but never add to or change what they say. Interpretation is grouped into clearly-framed read sections, each line citing the facts it leans on. Produce Your angle from the user setup files, opening with a going-in hypothesis and closing with a single next step.'
---

# Brief writer

## Goal

Build a meeting-prep brief from `running-notes.md` that you can trust and actually want to read. Write it the way a sharp colleague would brief you: plain, flowing prose, not a list of raw quotes. Every specific fact or number carries a numbered `[n]` link back to where it came from, so you can check anything that matters; the exact source words live in the Sources list at the end, not in the body. Restate facts in plain words, but never add to them or change what they say. Interpretation is grouped into clearly-framed "the skill's read" sections, each line citing the facts it leans on. The TL;DR is written last. Your angle reads the prospect's world through what you sell.

## Inputs

- `running-notes.md` — the source of every hard fact (read all rows).
- `~/.claude/skills/sales-recon/about-me.md`, `about-my-business.md`, `about-my-icp.md` — the lens for Your angle (tolerate missing files; Your angle is thinner without them).

## What the brief writer does NOT do

- Re-fetch, search, or call an LLM to "improve" or add to a fact.
- Add to or change what a fact says. Restating a fact in plain words is wanted; sharpening a number, hardening a hedge, or stretching a claim beyond what the source supports is not. When in doubt, stay close to the source and let the exact words in Sources carry the proof.
- Invent. Every body line is either a sourced fact carrying its `[n]`, or an interpretation that cites the facts it rests on.
- Pre-cook the pitch. No drafted opening lines, no strategic exec summaries, no multi-phase next-steps roadmaps. One next step to propose is fine; a phased plan is not.

## How facts and interpretation are shown

- **Sourced sections (sections 1-4):** readable prose built from the facts, with `[n]` after each specific fact or number it rests on. The citation is the signal it's sourced; the exact words live in Sources. Use a verbatim quote in the body only when the exact wording matters — something the person actually said, or a phrase that loses meaning if reworded.
- **Derived sections (section 5 Your angle, section 6 Questions, section 7 Objections, section 8 Opener and next step):** the skill's read of those facts. section 5 opens with the one-line note *"The skill's read of the facts above, not new facts."* Each line cites the `[n]`(s) it leans on. No per-line tag — the section frame carries the signal. Every citation is a numeric `[n]` that resolves to a Sources entry; the three setup files are the implicit lens for these sections and are never themselves written as a citation (no `[about-my-business]`-style tags).
- The going-in hypothesis (top of section 5) carries an explicit `(inference to test)`, because it's the boldest call.

## Source independence (before weighing agreement)

This applies wherever you treat a fact as well-supported — the section 4 *why now* read and the section 5 going-in hypothesis. Before agreement counts as confidence, in this order:

1. **De-duplicate first.** Collapse syndicated and duplicate sources to one: ten reprints of one press release are one source, not ten confirmations, and the same fact returned by two agents is one fact. Agreement between copies of the same item is not confirmation.
2. **Then weigh reliability.** Keep the most authoritative or original source as the surviving `[n]` — the company's own announcement or a primary outlet over an aggregator or reprint.
3. **Then resolve conflicts.** If genuinely independent sources disagree, prefer the more reliable and more recent, and note it; if it can't be resolved, flag it in the brief as `[sources disagree: ...]` rather than picking silently. Treat any `contradiction:` line in running-notes Open gaps as a signal to do this.

Running-notes keeps every row (the full audit trail); this collapsing happens only in how you read and weigh them, never by editing the file.

## Sequence

### 1. Read running notes

Open `running-notes.md`. Read the progress line, the right-person verdict, the fact rows, the Open gaps. Use all rows.

### 2. Read the setup files

Read the three `~/.claude/skills/sales-recon/about-*.md` files. They drive Your angle. If they're missing, Your angle is thinner and the body still ships.

### 3. Group facts

Map each row to a body section by `who_about`:

| who_about | Section |
|---|---|
| person | section 1 Who you're meeting (rapport rows also ground the section 8 opener) |
| company | section 2 Their company |
| key_people | section 3 Key people (the decision path) |
| whats_changed, their_sector | section 4 What's recent and material (and why now) |
| challenges | section 6 Questions (grounds the questions); any cost-of-inaction row also feeds the section 5 going-in hypothesis |

Order facts within a section by source date (newest first for time-bound, chronological for biographical).

### 4. Write sections 1-4

Write each section as short, flowing prose — a tight paragraph or two, or a few full-sentence points — the way a colleague would brief you out loud. Build it from the facts, and put each `[n]` right after the specific fact or number it supports (the TL;DR already reads this way — write the whole brief like that). Assign citation numbers fresh: start at `[1]` and number in order of first appearance in the body, never carrying over the row order or any numbering from running-notes. Once the final set of facts is chosen, the numbers must run contiguously `[1]…[N]` with no gaps — a dropped source is not a skipped number, so renumber the survivors to keep the sequence unbroken. State facts in plain words; keep a verbatim quote only where the exact words matter. Keep approximations as approximations ("around 200 employees"). Lead with who or what the section is about, and stay scannable — no padding.

Close section 4 with a labelled read line: **Why now:** the one or two recent signals that make this the moment `[n]`, and what they imply. This is the only interpretation in sections 1-4. Apply Source independence first — a signal carried by ten reprints of one announcement is one signal, not ten.

### 5. Write section 5 Your angle

Open with the note: *"The skill's read of the facts above — interpretation, not new facts."* Then four parts, each line citing the `[n]`(s) it rests on:

**Going-in hypothesis** *(inference to test):*
- likely problem — the prospect's most likely problem, given sections 1-4 `[n]`
- likely cost — what it plausibly costs them, drawing on any cost-of-inaction fact `[n]`
- what good looks like — the outcome a fix would deliver

Phrase every line as a bet ("likely…", "probably…"), never as an assertion.

**ICP match:** 1-2 lines on where they fit the user's ICP `[n]`, 1-2 on where they don't `[n]`.

**Where your offer touches their world:** 2-4 bullets, each naming a specific signal from sections 1-4 and the touch-point with the user's offer `[n]`.

**What might make this hard:** 0-2 bullets, only if `about-my-icp.md`'s "not a fit" overlaps something in sections 1-4. Often empty.

If a line can't cite a fact, don't write it.

### 6. Write section 6 Questions to ask

5-10 grounded discovery questions, each tracing to a fact:

> "Given they've publicly committed to expanding into EU markets `[7]`, how is that programme going so far?"

Specific probes, not generic discovery.

### 7. Write section 7 Objections to anticipate

3-5 objections the prospect may raise, grounded in their situation (role, public stance, recent moves, sector pressures), each with a one-line note on why it's likely `[n]`. These are preparation for the rep, not a script to raise — don't introduce an objection the prospect didn't have. The rep drafts their own response.

### 8. Write section 8 Opener and next step

2-3 opening angles that lead with insight (your read on the prospect's world), not a question, grounded in section 1 rapport rows or a section 4 fact `[n]`. Entry points, not drafted lines — you pick one and write your own.

Close with one line: a single logical next step you could propose at the end of the meeting, tied to the angle.

### 9. Write the TL;DR last

3-4 lines: 1-2 headline facts with `[n]`, plus one line summarising the going-in hypothesis. No fact that doesn't appear elsewhere in the body with `[n]`.

### 10. Sources

List every `[n]` in numerical order, contiguous from `[1]` with no gaps: URL, the exact words the fact came from, source date.

### 11. Render HTML

Open `templates/brief-html.html` and fill its slots. The template carries all the CSS and the hero, sources and footer shells; you emit the structured content using the template's own classes. Self-contained — opens offline in any browser.

**Simple slots:** `{{PERSON}}`, `{{COMPANY}}`, `{{RUN_DATE}}`, `{{N_SOURCES}}`.

**`{{TLDR_HTML}}`** — the TL;DR as one inline run of prose, each fact carrying `<sup><a href="#s3">[3]</a></sup>`, key phrases in `<strong>`. No block tags.

**`{{BODY_HTML}}`** — sections 1-8, each as:

```
<section class="section">
  <div class="inner">
    <div class="sec-head">
      <div class="sec-title"><span class="sec-num">01 /</span><h2 class="sec-name">Who you're meeting</h2></div>
      <div class="sec-meta meta">The person · rapport + landmines</div>
    </div>
    <!-- section content (see per-section pattern below) -->
  </div>
</section>
```

The band colour alternates automatically (CSS `nth-of-type`) — never set it yourself. Every `[n]` in the body is `<sup><a href="#sN">[n]</a></sup>` linking to its source row. Per-section content patterns:

- **§1, §2, §4** — prose in `<p class="lead">` (first paragraph) then `<p>`. Close §4 with a `<div class="card"><div class="block-head"><span class="label">Why now</span></div><p>…</p></div>`.
- **§3 Key people** — one `<div class="card">` of `<div class="people-row"><div class="nm"><strong>Name</strong> — role <sup>…</sup></div><div class="role">Champion?</div></div>` rows; decision-path label in `.role`.
- **§5 Your angle** — `<p class="derived-note">The skill's read of the facts above — interpretation, not new facts.</p>` then one `<div class="card">` per block (Going-in hypothesis, ICP match, Where your offer touches their world, What might make this hard). Each card: `<div class="block-head"><span class="label">Going-in hypothesis</span><span class="tag-inf">inference to test</span></div>` then `<ul class="clean">`. Use `<span class="kv">Likely problem</span> — …` for labelled lines.
- **§6 Questions** — `<ol class="qs">` of `<li>`.
- **§7 Objections** — `<ul class="clean">` of `<li><span class="kv">"the objection"</span> — why likely <sup>…</sup></li>`.
- **§8 Opener and next step** — `<div class="card">` Opening angles (`<ul class="clean">`) then `<div class="card">` Next step (`<p>`).

**`{{SOURCES_HTML}}`** — one `<li id="sN">` per source so body citations resolve. The URL is a real clickable link: put the full `https://` URL in `href`, the readable short form as the link text, and open in a new tab so the brief stays put:

```
<li id="s1"><span class="src-n">[1]</span><span class="src-body"><a class="url" href="https://example.com/page" target="_blank" rel="noopener">example.com/page</a><span class="quote">"exact source words"</span><span class="date">captured 2026-01-01</span></span></li>
```

### 12. Write output files

Assemble `brief.md` using `templates/brief-md.md` as the section skeleton (its 8 section headings plus Sources and the TL;DR slot), filling each section with the content built in steps 4-10. Then write:

- `~/meetings/{slug}/brief.md`
- `~/meetings/{slug}/brief.html`

Multi-attendee meetings: one per-attendee subfolder, one brief each.

## Output verification

- Every `[n]` in the body has a Sources entry, and every Sources entry is used at least once
- Citation numbers are contiguous from `[1]` to `[N]` with no gaps — renumber the survivors after any source is dropped, never leave a hole like 29 → 33
- No non-numeric citations: every bracketed citation is a numeric `[n]`; the setup files are the lens, never a citation tag
- TL;DR facts all appear with `[n]` elsewhere
- The going-in hypothesis reads as inference ("likely…"), not assertion
- Every line in sections 5-8, plus the section 4 why-now line, cites at least one `[n]`
- Every specific fact, name, number or date in sections 1-4 carries an `[n]`; light connective wording between facts is fine, but no *claim* sits unsourced (the single why-now line is the one piece of interpretation)
- No "well-supported" or corroboration claim rests on reprints of one item — syndicated/duplicate sources were collapsed to one `[n]` before agreement was weighed; genuine conflicts are flagged, not silently resolved

## Rules

Write from `running-notes.md` and the three setup files only. Never re-fetch, never call an LLM to improve a fact. The HTML render is self-contained.
=== END ~/.claude/skills/sales-recon/brief-writer.md ===

5. Create the markdown brief template:

=== BEGIN ~/.claude/skills/sales-recon/templates/brief-md.md ===
---
type: sales-recon
meeting: '{{PERSON}} at {{COMPANY}}'
date: '{{YYYY-MM-DD}}'
---

# Sales brief — {{PERSON}} at {{COMPANY}}

**Meeting date:** {{MEETING_DATE}}  ·  **Generated:** {{RUN_DATE}}  ·  **Sources:** every fact below carries a link you can click to check it

## TL;DR

{{1-2 headline facts with [n], plus one line summarising the going-in hypothesis. 3-4 lines.}}

## 1. Who you're meeting

{{Readable prose built from the person facts, each fact carrying its [n]. Include rapport material and any landmines (flagged).}}

## 2. Their company

{{Readable prose built from the company facts, each fact carrying its [n]. Tech-stack/vendor inferences flagged "inferred".}}

## 3. Key people (the decision path)

{{Decision path first (manager / economic buyer / champion / technical evaluator/blocker, labelled, inference marked), then CEO + founders. Name + role + one-line context, each with [n]. Names flagged for your warm-intro check.}}

## 4. What's recent and material (and why now)

{{Readable prose built from the recent-news and market facts, each fact carrying its [n] and source date.}}

**Why now:** {{the one or two signals that make this the moment}} [n] — {{what they imply}}

## 5. Your angle into this meeting

*The skill's read of the facts above — interpretation, not new facts.*

**Going-in hypothesis** *(inference to test)*

- likely problem — {{...}} [n]
- likely cost — {{...}} [n]
- what good looks like — {{...}}

**ICP match**

- {{where they fit / where they don't}} [n]

**Where your offer touches their world**

- {{specific signal → touch-point with your offer}} [n]

**What might make this hard** *(often empty)*

- {{risk flag, OR omit the subsection}} [n]

## 6. Questions to ask

1. {{Question grounded in a sections 1-4 fact}} [n]
2. ...

## 7. Objections to anticipate

*(These may come up — preparation, not a script to raise.)*

- {{Objection}} — {{why likely}} [n]
- ...

## 8. Opener and next step

**Opening angles** *(lead with insight, not a question — you write the line)*

- {{Angle grounded in section 1 rapport or a section 4 fact}} [n]
- ...

**Next step to propose**

- {{a single logical next step, tied to the angle}}

## Sources

[1] {{URL}} — {{verbatim source words the fact came from}} *(source date: {{YYYY-MM-DD}})*
[2] ...

---

*Generated by /sales-recon. Full audit trail in `running-notes.md`.*
=== END ~/.claude/skills/sales-recon/templates/brief-md.md ===

6. Create the HTML brief template (self-contained, no remote dependencies):

=== BEGIN ~/.claude/skills/sales-recon/templates/brief-html.html ===
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Sales brief — {{PERSON}} at {{COMPANY}}</title>
<style>
  :root{
    --ink:#16150F; --ink-2:#535353; --ink-3:#8A8780;
    --paper:#FDFCF9; --stone:#F7F5F1; --oat:#ECEAE5; --surface:#FFFFFF;
    --hero:#131313; --bronze:#8B7355; --border:#E1DED7; --rule:#1a1a1a;
    --accent:#8B7355;
    --radius:14px;
    --shadow:0 2px 10px rgba(19,19,19,0.06);
    --sans:-apple-system,BlinkMacSystemFont,"Helvetica Neue","Segoe UI",Arial,sans-serif;
    --mono:ui-monospace,"SF Mono","JetBrains Mono",Menlo,Consolas,monospace;
    --wrap:940px;
  }
  *{box-sizing:border-box;}
  html{-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;}
  body{margin:0;font-family:var(--sans);color:var(--ink);background:var(--paper);line-height:1.5;font-size:16px;}
  .inner{max-width:var(--wrap);margin:0 auto;padding:38px 40px;}
  .meta{font-family:var(--mono);font-size:12px;letter-spacing:0.1em;text-transform:uppercase;color:var(--ink-3);}
  .label{font-family:var(--mono);font-size:12.5px;letter-spacing:0.13em;text-transform:uppercase;color:var(--ink-2);display:inline-flex;align-items:center;gap:9px;}
  .label::before{content:"";width:7px;height:7px;border-radius:50%;background:var(--bronze);flex:none;}
  .pill{font-family:var(--mono);font-size:11px;letter-spacing:0.1em;text-transform:uppercase;background:var(--ink);color:#fff;padding:4px 9px;border-radius:6px;}
  .hero{background:var(--hero);color:#fff;}
  .hero .inner{padding-top:40px;padding-bottom:38px;}
  .hero-top{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:34px;}
  .hero-date{font-family:var(--mono);font-size:12.5px;letter-spacing:0.14em;color:#8d8a84;text-transform:uppercase;}
  .hero-headline{font-size:62px;line-height:0.98;font-weight:800;letter-spacing:-0.03em;margin:0;color:#fff;}
  .hero-headline .sub{display:block;font-size:25px;font-weight:600;letter-spacing:-0.01em;color:#c9c6c0;margin-top:14px;}
  .hero-kick{margin-top:22px;font-family:var(--mono);font-size:13px;letter-spacing:0.12em;text-transform:uppercase;color:#8d8a84;}
  .hero-card{background:#FDFCF9;border-radius:14px;padding:22px 30px 24px;width:100%;border-left:6px solid var(--accent);box-shadow:0 14px 38px rgba(0,0,0,0.40);margin-top:28px;}
  .hero-card .hc-label{font-family:var(--mono);font-size:11px;letter-spacing:0.18em;text-transform:uppercase;color:var(--bronze);margin-bottom:11px;display:flex;align-items:center;gap:9px;}
  .hero-card .hc-label::before{content:"";width:7px;height:7px;border-radius:50%;background:var(--accent);}
  .hero-card .hc-body{font-size:17px;line-height:1.5;color:var(--ink-2);max-width:840px;}
  .hero-card .hc-body strong{color:var(--ink);font-weight:700;}
  .section{width:100%;}
  main > .section:nth-of-type(odd){background:var(--stone);}
  main > .section:nth-of-type(even){background:var(--oat);}
  .sources-section{background:var(--paper);}
  .sec-head{display:flex;justify-content:space-between;align-items:baseline;gap:24px;border-bottom:1.5px solid var(--rule);padding-bottom:12px;margin-bottom:22px;}
  .sec-title{display:flex;align-items:baseline;gap:18px;margin:0;}
  .sec-num{font-family:var(--mono);font-size:18px;font-weight:600;color:var(--bronze);letter-spacing:0.02em;}
  .sec-name{font-size:30px;font-weight:800;letter-spacing:-0.02em;color:var(--ink);margin:0;}
  .sec-meta{text-align:right;flex:none;}
  .block{margin-bottom:18px;}
  .block:last-child{margin-bottom:0;}
  .block-head{display:flex;justify-content:space-between;align-items:baseline;gap:16px;margin-bottom:9px;}
  p{margin:0 0 10px;color:var(--ink-2);}
  p:last-child{margin-bottom:0;}
  .lead{color:var(--ink);font-size:18px;}
  sup a{font-family:var(--mono);text-decoration:none;color:var(--bronze);font-size:10.5px;font-weight:600;padding:0 1px;vertical-align:super;}
  sup a:hover{color:var(--ink);}
  .card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);padding:18px 24px;margin-bottom:12px;}
  .card:last-child{margin-bottom:0;}
  ul.clean{list-style:none;margin:0;padding:0;}
  ul.clean li{position:relative;padding-left:20px;margin-bottom:7px;color:var(--ink-2);}
  ul.clean li::before{content:"";position:absolute;left:0;top:11px;width:6px;height:6px;border-radius:50%;background:var(--bronze);}
  ul.clean li:last-child{margin-bottom:0;}
  ol.qs{margin:0;padding-left:22px;}
  ol.qs li{margin-bottom:9px;color:var(--ink-2);}
  .tag-inf{font-family:var(--mono);font-size:10.5px;letter-spacing:0.08em;text-transform:uppercase;color:var(--bronze);border:1px solid var(--border);border-radius:5px;padding:2px 7px;margin-left:8px;white-space:nowrap;}
  .derived-note{font-style:italic;color:var(--ink-3);font-size:14.5px;margin:-2px 0 15px;}
  .kv{color:var(--ink);font-weight:600;}
  .people-row{display:flex;justify-content:space-between;gap:16px;padding:8px 0;border-bottom:1px solid var(--border);}
  .people-row:last-child{border-bottom:none;}
  .people-row .role{font-family:var(--mono);font-size:11.5px;letter-spacing:0.08em;text-transform:uppercase;color:var(--ink-3);text-align:right;flex:none;align-self:center;}
  .people-row .nm strong{font-weight:700;}
  .sources-list{list-style:none;margin:0;padding:0;}
  .sources-list li{display:flex;gap:14px;padding:9px 0;border-bottom:1px solid var(--border);font-size:14px;}
  .sources-list li:last-child{border-bottom:none;}
  .src-n{font-family:var(--mono);font-weight:600;color:var(--bronze);flex:none;min-width:30px;}
  .src-body{color:var(--ink-2);}
  .src-body .url{color:var(--ink);font-weight:500;word-break:break-word;text-decoration:none;border-bottom:1px solid var(--bronze);}
  .src-body .url:hover{color:var(--bronze);}
  .src-body .quote{color:var(--ink-3);font-style:italic;display:block;margin-top:3px;}
  .src-body .date{font-family:var(--mono);font-size:11px;letter-spacing:0.05em;color:var(--ink-3);}
  .foot{background:var(--hero);color:#8d8a84;}
  .foot .inner{padding:30px 40px;display:flex;justify-content:space-between;align-items:center;gap:20px;flex-wrap:wrap;}
  .foot .fm{font-family:var(--mono);font-size:11.5px;letter-spacing:0.12em;text-transform:uppercase;}
  @media (max-width:680px){
    .inner{padding:30px 22px;}
    .hero-headline{font-size:42px;}
    .sec-name{font-size:24px;}
    .sec-head{flex-direction:column;align-items:flex-start;}
    .sec-meta{text-align:left;}
  }
</style>
</head>
<body>

<header class="hero">
  <div class="inner">
    <div class="hero-top">
      <span class="hero-date">Sales brief</span>
      <span class="hero-date">{{RUN_DATE}}</span>
    </div>
    <div>
      <h1 class="hero-headline">{{PERSON}}.<span class="sub">{{COMPANY}}</span></h1>
      <div class="hero-kick">Sales brief</div>
    </div>
    <aside class="hero-card">
      <div class="hc-label">TL;DR</div>
      <div class="hc-body">{{TLDR_HTML}}</div>
    </aside>
  </div>
</header>

<main>
{{BODY_HTML}}
</main>

<section class="section sources-section">
  <div class="inner">
    <div class="sec-head">
      <div class="sec-title"><span class="sec-num">—</span><h2 class="sec-name">Sources</h2></div>
      <div class="sec-meta"><span class="pill">{{N_SOURCES}} sources</span></div>
    </div>
    <ol class="sources-list">
{{SOURCES_HTML}}
    </ol>
  </div>
</section>

<footer class="foot">
  <div class="inner">
    <span class="fm">Sales brief · generated by your research agent</span>
    <span class="fm">Full audit trail in running-notes.md</span>
  </div>
</footer>

</body>
</html>
=== END ~/.claude/skills/sales-recon/templates/brief-html.html ===

7. Quietly check your work by reading the files back. Do not read the technical details out to me (no file names, no line counts). Just confirm everything is in place, then tell me in plain words: "All set. Your agent can now take everything it found and write it up as a brief. You will get a plain version and a web-page version you can open in your browser, print, or send on." If anything is missing, say so plainly rather than carrying on.

8. Tell me: "That's your brief writer in. Your agent can now turn what it found into a clean, faithful brief: a plain version and a tidy web page you can open in your browser, print, or send to someone." Then continue to step 9.

9. Offer me the research choice, and there's no wrong answer. Tell me: "One choice before your first brief. Your agent can research in two ways. The simplest is Claude's built-in web search: it works well, and it needs nothing more from you. The other way is to connect two free tools, Exa and Firecrawl, which let it find and read more sources, so the facts in your brief come out sharper and more reliable. Connecting them takes about five minutes and a couple of quick sign-ups. You can also start with the built-in search today and add the tools any time later." Then ask: "Would you like to start with the built-in search, or connect the two tools now?" Wait for my answer.

   - If I choose the built-in search: skip straight to step 14 (the restart). Do not mention terminals, keys, or sign-ups.
   - If I choose to connect the tools: continue to step 10.

10. See what I already have, so we don't redo anything. Tell me: "Some people already have these set up, so let me check before we do any sign-ups." Run `claude mcp list` yourself and look for exa and firecrawl.
    - If both are already connected: tell me plainly they are both already in place, and skip to step 14 (the restart).
    - If one or both are missing: tell me which I still need. For any tool that is already connected, skip its sign-up and connect step below. Then continue to step 11.

11. Find out how I'm running Claude Code, and explain the terminal step. Ask me: "Quick question: are you using Claude Code inside a code editor like VS Code, or in a plain terminal window? If it's a panel inside an editor, that's VS Code. If it's filling a plain window on its own, that's the terminal." Wait for my answer.

    Then explain warmly: "A couple of the next steps need you to run a one-line command. Claude Code is using this window for our chat, so you'll run that command in a SEPARATE terminal, then come back and tell me you're done. Nothing here is lost while you do that."

    Then tell me how to open that separate terminal:
    - If I said VS Code: "Press Ctrl and the backtick key ` (top-left, just under Escape), or on a Mac press Cmd and backtick. Or use the menu: Terminal then New Terminal. A small panel opens at the bottom. That is where the commands go."
    - If I said terminal: "Open a SECOND terminal so this one keeps running Claude Code. On a Mac press Cmd+T for a new tab. On Windows, open another PowerShell window. Run the commands there, then switch back here."

    Tell me to keep that terminal open. Then continue to step 12.

12. Connect Exa, the tool that finds the right people and news. (Skip this whole step if Exa was already connected at step 10.)

    If I don't already have an Exa key, tell me: "Sign up for a free account at https://exa.ai. Open the page and click the sign-up button to create your account (it may say 'Sign up', 'Get API key', or 'Dashboard'). When you sign up, Exa shows a quick 'Create your setup prompt' screen. Complete it, since finishing it usually unlocks some free credits: choose 'Claude', then 'MCP', then 'I don't know yet', and click 'Generate'. You'll land on a 'You're all set!' screen. Just below the big button, under 'Your API Key', click the eye icon to reveal your key, then the copy icon to copy it. (If it isn't there, it's always at https://dashboard.exa.ai/api-keys.) Keep your key to yourself, you won't paste it here." If I already have an Exa key, just tell me to have it ready.

    Then give me the command. Tell me: "Here's the one line that connects Exa. Paste it into the separate terminal, replace YOUR_EXA_KEY with your key (leave everything else exactly as it is), and press enter. Tell me 'done' when you've run it, just the word done, not your key."

    ```
    claude mcp add -s user --transport http exa "https://mcp.exa.ai/mcp?tools=web_search_exa,web_search_advanced_exa,web_fetch_exa&exaApiKey=YOUR_EXA_KEY"
    ```

    Then offer the optional helper: "If editing that line right in the terminal feels fiddly, just say 'use a file' and I'll drop it in a text file on your Desktop instead, so you can paste your key in cleanly and then copy the whole line." Only if I ask for the file, create `~/Desktop/connect-exa.txt` containing exactly that single command line and nothing else, then tell me: "I've put connect-exa.txt on your Desktop. Open it (double-clicking opens it in a plain text editor), type or paste your key straight over YOUR_EXA_KEY, leave everything else as it is, and save. Then copy the whole line into the terminal and press enter. Tell me 'done' when it's run, just the word done, not your key."

    Wait for me to confirm. Then run `claude mcp list` yourself, look for exa, and tell me plainly whether it connected. If it didn't, ask me whether the command showed a message and what it said.

13. Connect Firecrawl, the tool that reads web pages cleanly. (Skip this whole step if Firecrawl was already connected at step 10.)

    If I don't already have a Firecrawl key, tell me: "Sign up free at https://www.firecrawl.dev/. The moment you sign up you land on your dashboard, and your key is on the right under 'API Key'. Click the eye icon to reveal it, then the copy icon to copy it. You want the key that starts with 'fc-'. Keep it to yourself, you won't paste it here." If I already have a Firecrawl key, just tell me to have it ready.

    Then give me the command. Tell me: "Here's the line that connects Firecrawl. Paste it into the same terminal, replace YOUR_KEY_HERE with your key, and press enter. Tell me 'done' when you've run it."

    ```
    claude mcp add -s user --transport http firecrawl "https://mcp.firecrawl.dev/YOUR_KEY_HERE/v2/mcp"
    ```

    Then offer the same optional helper: "Same as before, if editing the line is fiddly, say 'use a file' and I'll put connect-firecrawl.txt on your Desktop for you." Only if I ask for the file, create `~/Desktop/connect-firecrawl.txt` containing exactly that single command line and nothing else, then walk me through it the same way: open it, paste the key over YOUR_KEY_HERE, save, copy the whole line into the terminal, press enter.

    Wait. Then run `claude mcp list` yourself, look for firecrawl, and tell me plainly whether it connected.

14. The restart, so everything switches on together. Use the version that fits what we did:
    - If we connected tools: "Both tools are connected, and that's everything built. One last thing and you're ready: close Claude Code and open it again, so it picks up your two new tools and your new /sales-recon agent together."
    - If we stayed on the built-in search: "That's everything built. One last thing and you're ready: close Claude Code and open it again, so it switches on your new /sales-recon agent."

    Then give me the step for my setup. If you don't yet know how I run Claude Code (because we skipped the tool steps), ask me first: "Are you in VS Code, or a plain terminal?" Then:
    - If VS Code: "Open the Command Palette (Cmd+Shift+P on a Mac, Ctrl+Shift+P on Windows), type 'Reload Window', and press Enter. Or just close and reopen VS Code."
    - If terminal: "Close Claude Code (type /exit), then start it again by typing `claude`."

15. Tell me: "You're all set up. To make your first brief: type /sales-recon, then give it the name of someone you're about to meet and their company. It'll research them and write you a short, sourced brief in a couple of minutes. From now on that's all it takes: /sales-recon, a name, and a company." If we stayed on the built-in search, add: "And if you ever want sharper sources, you can connect Exa and Firecrawl later, just ask me to help you add your research tools." Then say "Enjoy." and stop. Do not create anything else.
Don't want to set up Exa and Firecrawl?

Both are optional, the two free tools that sharpen the research, but you can skip them. Without them, the agent uses Claude Code's own web search instead, so your briefs still work. The research reaches fewer sources and is a little less reliable on some sites. You can add the two tools whenever you like.

Step 5. Run it and meet your first brief

Once Claude Code has restarted, your /sales-recon command is ready. Run it and give it a real prospect. The agent does the research and writes you a full brief, saved under the meeting and its date, ready to open before the call. In less than 15 minutes, start to finish.

A real example, run on Tom Blomfield, Group Partner at Y Combinator.
The top of a finished sales brief: the headline, a TL;DR summary with every fact numbered to a source, and the start of the structured sections.
See the full example

One page, read top to bottom in the five minutes before your call. Here is what is in it:

Every fact links to a real source you can click and check. If it can't find a solid source, it leaves it out rather than guess.

Make it yours

This is a Claude Code skill made of plain files, so you can change almost any of it by asking Claude Code in plain words. A few ideas.

Easy, just ask
When you want to go further

More from us

You just built Sales Recon. If that was useful, Mission Control is our free build-it-yourself command centre for running your whole day in Claude Code.

Every project, its status and its next step, in one view in Obsidian.
The Mission Control dashboard open in Obsidian: a table of five projects showing status, priority, next action and target date.
See Mission Control