Systems Lab

Agent skill

psp-onboarding

First-run interactive setup for the PSP skill pack.

activeSelf-containedDeclared tools790 words

Filed under Onboarding, retention and expansion.

From cmj-hub/claude-psp · 5 skills · 2 · pushed 2026-09-09

What it does when it runs

First-run interactive setup for the PSP skill pack. Walks the operator through brand-config.json (ICP precision, exclusion criteria, signal sources) and SOUL.md (buyer vocabulary, stories, the 11am-Tuesday moment) in ~15 minutes. Refuses to let the operator skip — generic PSP output is worse than no PSP. Loaded automatically by the main psp skill when brand-config.json or SOUL.md is missing.

Read from the skill and the 0 files bundled beside it. A skill’s own description is written to be selected by an agent, so it describes the job and not the dependencies.

Keys and connectors you must supply
None found.
Hosts it reaches
No third-party host appears in the skill or its bundled files.
Tool permissions it declares
  • Read
  • Write
  • -
  • Grep
Actions present in the files
network

Ask about psp-onboarding

Opens your assistant with this page's verified links already in the prompt.

Is this safe to install?ClaudeChatGPT
Adapt it to my stackClaudeChatGPT
What else do I need for it to workClaudeChatGPT
Rather ask a human? Talk to Cheetah
git clone --depth 1 --filter=blob:none --sparse https://github.com/cmj-hub/claude-psp.git /tmp/claude-psp
git -C /tmp/claude-psp sparse-checkout set "skills/psp-onboarding"
mkdir -p ~/.claude/skills/psp-onboarding
cp -R "/tmp/claude-psp/skills/psp-onboarding/." ~/.claude/skills/psp-onboarding/

Picked up without a restart. A project skill of the same name is shadowed by your personal one. For one repository only, swap ~/.claude/skills for .claude/skills. Claude Code docs ↗

Or take the whole library

This repo ships a .claude-plugin manifest, so Claude Code can install all 5 skills at once. Plugin skills are invoked as /<plugin>:<skill>, so they never collide with your own.

/plugin marketplace add cmj-hub/claude-psp
/plugin

The folder is the same in every client that implements the format — 46 of them — so if yours is not above, only the destination changes.

Reproduced in full from cmj-hub/claude-psp/blob/970cb1702ffdf35663b81946f64f46aa30507cf5/skills/psp-onboarding/SKILL.md, which is licensed MIT (skill frontmatter). 790 words, 13 headings.

PSP Onboarding — first-run setup

Walks the operator through ~15 minutes of setup that makes every downstream PSP 10x more useful than generic framework prose.

Activation

Loaded automatically by the psp orchestrator when brand-config.json or SOUL.md is missing from the project root.

Also user-invocable: "Set up PSP brand config", "PSP onboarding", "Configure PSP".

Why this exists

A generic PSP that says "Series-B SaaS feels pipeline pressure" is worse than no PSP — it produces outreach that everyone else is also producing. The 5-component PSP framework only generates real differentiation when paired with:

  • Your ICP precision (segment, exclusion, motion)
  • Your buyer's actual vocabulary (sourced from real writing, not invented)
  • Your stories (signal-to-pain mappings you've seen succeed or fail before)
  • Your won't-chase boundaries

Workflow

Step 0 — Detect prior state

Check for existing brand-config.json + SOUL.md. If both exist, ask: "Refresh, or skip?" If one exists, fill the gap.

Step 1 — ICP precision

First, ICP. Be specific — "B2B SaaS" is too broad.

Tell me in one batch:
1. The 1-sentence segment (stage / size / motion / region)
2. The size range ($M ARR)
3. The motion (PLG / sales-led / hybrid)
4. The 3-5 exclusion criteria (who you don't sell to)

If your ICP is fuzzy, that's a finding — outreach against a fuzzy ICP
will be fuzzy. We can use placeholders for now and flag them for refresh
after 100 sends.

Save to brand-config.icp.

Step 2 — Primary PSP draft

Now your primary PSP. Five components:

1. SIGNAL — what's a public, recent, verifiable thing your buyer does
   that implies the pain? (job post, funding round, leadership change,
   product launch, pricing change)
2. PAIN — what's the felt operational reality at 11am Tuesday when
   that signal is present? In their language, not yours.
3. TIMING TRIGGER — which 90-day window makes the pain acute now:
   new-exec / budget-cycle / obvious-failure?
4. FELT-PAIN ROLE — who at the buyer feels it most? (Often a layer
   below the buying authority.)
5. VOCABULARY — 4-8 phrases the buyer uses in private about this. If
   you don't know yet, that's step 3.

Save to brand-config.psp_drafts.primary.

Step 3 — Vocabulary mining

If you don't have 4-8 buyer phrases yet, let's mine them.

Point me at any of these sources for the buyer segment:
- 3-5 of their public LinkedIn posts
- 1-2 podcast appearances
- 2-3 of their hiring job posts (job posts reveal pain language verbatim)
- 1-2 conference talks / panel appearances
- Their public AMA responses

I'll extract candidate phrases — you confirm which ones land.

If WebFetch is available, the skill can pull + extract directly. If not, instruct the operator to paste content and run extraction.

Step 4 — Signal sources (operations)

Where will you hunt these signals? (Mark all that apply.)

1. LinkedIn job search (daily — manual or via Phantombuster)
2. Crunchbase / news APIs (weekly)
3. RSS feeds for specific publications
4. Podcast feeds for relevant shows
5. Manual research only

How often refresh:
- PSP refresh cadence (default: 90 days)
- Vocabulary refresh (default: 30 days)
- Signal freshness window (default: 14 days — older signals drop)

Save to brand-config.signal_sources + brand-config.research_cadence.

Step 5 — Stories (SOUL.md)

Tell me 3-5 stories that anchor your PSP — times you saw a signal-to-pain
mapping work or fail.

Each story: 1-2 sentences, anonymized but specific. These become
calibration points for the construct skill.

Also:
- Your won't-chase boundaries (topics / segments you refuse)
- The 11am-Tuesday operational moment of your buyer (paint it specific)

Save to SOUL.md.

Step 6 — Write the files

Write brand-config.json + SOUL.md at the project root. Show preview:

✓ brand-config.json — ICP + 1 PSP draft + signal sources + cadence
✓ SOUL.md — 3 stories + vocabulary + 11am-Tuesday moment

Try a quick test:
> Construct a PSP for <segment>

The output will now use:
- Your ICP precision (not generic "B2B SaaS")
- Your vocabulary (not category jargon)
- Your stories as calibration

Next step: install `cmj-hub/claude-evp` to lock the EVP that speaks
to this PSP. Then `cmj-hub/claude-cold-email` to ship outreach.

Step 7 — Refresh cadence

PSPs decay. Re-run onboarding when:
- ICP shifts (new segment / segment cull)
- Buyer vocabulary evolves
- Quarterly minimum (90 days)

Re-run: `/psp onboarding refresh`

References

  • ../../brand-config.example.json — full template
  • ../../SOUL.md — voice template
  • ../../AGENTS.md — behavior rules
  • Sister skills:
    • psp-kickoff — adaptive router that uses these files
    • psp-construct — uses brand + SOUL for actual PSP build
    • psp-signal-hunt — runs against your signal sources

Other skills for the same job

Different authors, same problem. Matched on the words in the skill name, across every library in the catalogue except this one.

Need help setting it up?

This page tells you what psp-onboarding does and what it needs. Cheetah builds the agent setup it runs inside: data, CRM, sequencing and the guardrails.

Book a call →

The directory stays free. There is nothing gated behind this.