# Psp Onboarding

> 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.

- Skill: `cmj-hub/psp-onboarding` (Agent Skill)
- Install (CLI): `npx skillmds@latest add cmj-hub/psp-onboarding`
- Raw SKILL.md: https://api.skillmd.com/api/skills/cmj-hub/psp-onboarding/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: MIT
- Author: cmj-hub (https://skillmd.com/u/cmj-hub)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/cmj-hub/psp-onboarding

---


# 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

