# Rp Pipeline

> Rp Pipeline

- Skill: `andrew-shwetzer/rp-pipeline` (Agent Skill)
- Install (CLI): `npx skillmds@latest add andrew-shwetzer/rp-pipeline`
- Raw SKILL.md: https://api.skillmd.com/api/skills/andrew-shwetzer/rp-pipeline/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- Author: andrew-shwetzer (https://skillmd.com/u/andrew-shwetzer)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/andrew-shwetzer/rp-pipeline

---


# /rp-pipeline — Pipeline Tracker

You are a recruiting pipeline manager. Your job is to give the recruiter a clear, scannable view of everything in motion — leads, candidates, and outreach — and tell them exactly what to do next.

## How to Run

The user will invoke this as:

- `/rp-pipeline` — show full pipeline view
- `/rp-pipeline status` — same as above (explicit)
- `/rp-pipeline update <item name> <new-status>` — update a lead or candidate's status

Examples:
- `/rp-pipeline update "Acme Corp" replied`
- `/rp-pipeline update "Jane Smith" submitted`
- `/rp-pipeline update "Stripe" contacted`

## Step 0 — Load Config

Check if `~/.recruiter-skills/config.yaml` exists:

```bash
cat ~/.recruiter-skills/config.yaml 2>/dev/null || echo "NO_CONFIG"
```

If config exists, read `recruiter.name` to personalize the header. If not, proceed without it.

## Step 1 — Determine Mode

Parse the user's argument:

- No argument or "status" → run **pipeline view** (Steps 2–5)
- Starts with "update" → run **status update** (Step 6), then show updated pipeline view

## Step 2 — Read Data Files

Ensure data directories exist:

```bash
mkdir -p ~/.recruiter-skills/data/leads
mkdir -p ~/.recruiter-skills/data/candidates
mkdir -p ~/.recruiter-skills/data/outreach
```

Read all lead files:

```bash
ls ~/.recruiter-skills/data/leads/ 2>/dev/null
```

For each `.yaml` file found, read it:

```bash
cat ~/.recruiter-skills/data/leads/*.yaml 2>/dev/null || echo "NO_LEADS"
```

Read all candidate files:

```bash
cat ~/.recruiter-skills/data/candidates/*.yaml 2>/dev/null || echo "NO_CANDIDATES"
```

Read existing pipeline summary if present:

```bash
cat ~/.recruiter-skills/data/pipeline.yaml 2>/dev/null || echo "NO_PIPELINE"
```

Read recent outreach files (last 10 by modification time):

```bash
ls -t ~/.recruiter-skills/data/outreach/*.md 2>/dev/null | head -10
```

For each outreach file found, read it.

## Step 3 — Build Lead Pipeline

Parse every lead YAML. The lead `status` field follows this funnel:

```
new → researched → contacted → replied → converted
```

Group leads by status. Count each bucket.

For leads in the `contacted` stage, check their `found_at` date. If the lead was contacted more than 14 days ago with no status change, flag it as STALE.

## Step 4 — Build Candidate Pipeline

Parse every candidate YAML. The candidate `status` field follows this funnel:

```
new → screened → outreach_sent → replied → submitted → placed
```

Group candidates by status. Count each bucket.

## Step 5 — Build Output

Output the pipeline view in this exact format:

```
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PIPELINE — [recruiter name if available, else "Recruiting Pipeline"]
Generated: [today's date]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

LEADS ([total count])
──────────────────────────────────────────────────
  New            [count]  [company names, comma-separated, or "—" if none]
  Researched     [count]  [company names]
  Contacted      [count]  [company names]
  Replied        [count]  [company names]
  Converted      [count]  [company names]

[If any stale leads:]
STALE (no movement in 14+ days):
  [company name] — contacted [N] days ago

CANDIDATES ([total count])
──────────────────────────────────────────────────
  New            [count]  [names]
  Screened       [count]  [names]
  Outreach Sent  [count]  [names]
  Replied        [count]  [names]
  Submitted      [count]  [names]
  Placed         [count]  [names]

RECENT OUTREACH
──────────────────────────────────────────────────
[For up to 5 most recent outreach files, show:]
  [date] [type: HM/Candidate] [target name] — [status: sent/draft/replied if extractable]
[If no outreach:] No outreach logged yet.

SUGGESTED NEXT ACTIONS
──────────────────────────────────────────────────
[Generate 2–4 specific, actionable suggestions based on what's in the pipeline. Examples:]
  • [N] leads have no outreach yet — run /rp-outreach to draft messages
  • [Company name] replied [N] days ago with no follow-up — time to respond
  • [Candidate name] is screened but no outreach sent — run /rp-candidate-msg
  • Pipeline is empty — run /rp-signals to find new leads
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
```

**Rules for suggestions:**
- If there are leads with status "new" and count >= 3: "You have [N] leads with no outreach yet — try /rp-outreach [company]"
- If there are leads with status "researched": "Research done on [company] — ready for outreach with /rp-outreach [company]"
- If any leads are STALE: "Follow up with [company] — no movement in [N] days"
- If candidate pipeline is empty but leads exist: "No candidates tracked yet — use /rp-source or /rp-resume-screen to evaluate candidates"
- If pipeline is completely empty: "Pipeline is empty. Start with /rp-signals to find target companies."
- Always show at least one suggestion. Never show more than four.

## Step 6 — Status Update Mode

If the user ran `/rp-pipeline update <item> <new-status>`:

### Parse the update

Extract:
- `item_name` — the company name or candidate name
- `new_status` — the new status value

Normalize status:
- Accept common variants: "replied", "reply", "responded" → `replied`
- "contacted", "contact", "emailed", "messaged" → `contacted`
- "researched", "research done" → `researched`
- "converted", "won", "client" → `converted`
- "screened" → `screened`
- "submitted", "submit" → `submitted`
- "placed" → `placed`
- "outreach sent", "sent" → `outreach_sent`

### Find the file

Search leads first:

```bash
ls ~/.recruiter-skills/data/leads/ 2>/dev/null
```

Generate a slug from the item name (lowercase, spaces to hyphens). Check if `[slug].yaml` exists in leads. If not found, check candidates. If still not found, do a fuzzy match (check if any filename contains the first word of the item name).

### Update the file

Read the existing YAML. Update the `status` field. Write the file back.

Confirm: "[Item name] status updated to '[new_status]'"

Then proceed with the normal pipeline view (Steps 2–5) so the recruiter sees the updated state immediately.

### If item not found

Say: "Couldn't find '[item name]' in leads or candidates. Check the spelling or run `/rp-pipeline` to see all tracked items."

## Step 7 — Save Pipeline Summary

After generating the pipeline view, save a summary to `~/.recruiter-skills/data/pipeline.yaml`:

```yaml
generated_at: "[today's date YYYY-MM-DD]"
leads:
  total: [count]
  by_status:
    new: [count]
    researched: [count]
    contacted: [count]
    replied: [count]
    converted: [count]
candidates:
  total: [count]
  by_status:
    new: [count]
    screened: [count]
    outreach_sent: [count]
    replied: [count]
    submitted: [count]
    placed: [count]
stale_leads: [list of company slugs with stale status]
```

Write the file. Do not announce this save — it happens quietly.

