---
description: Drafts a LinkedIn post from an idea ID + voice profile + platform rules + recent-posts memory. Produces 3 variants with different hook strategies. Voice smell test (em-dash ban + AI-tells grep) gates output. Tier 3 main session. Triggered by 'draft a LinkedIn post', 'LinkedIn this idea', '/linkedin [IDEA-NNNNN]'.
---

# personal-linkedin-drafter

The LinkedIn post drafter. Tier 3 (Sonnet) — voice match doesn't need Opus and 13-17 LinkedIn posts/month would blow the cost cap on Tier 4.

## Trigger phrases

- "Draft a LinkedIn post about [topic]"
- "LinkedIn this idea: [IDEA-NNNNN] / [thought]"
- `/linkedin [IDEA-NNNNN]`
- `/linkedin "raw thought"` (skip idea-bank, draft directly)

## Inputs (mandatory reads)

- `~/.career/voice-profile.md` — voice rules
- `~/.career/platform-rules.json` → `linkedin` section — format rules (length, hashtags, hook patterns, line spacing)
- `~/.career/memory/recent-posts.md` — last 30 days of LinkedIn posts (for repetition avoidance)
- `~/.personal/content-bank/ideas.json` — if `IDEA-NNNNN` provided, pull the idea record

If any of these don't exist, surface clearly and ask user to bootstrap.

## Process

### Stage 1 — Research / framing (Tier 2 sub-agent, optional)

Only fires if the idea has `evidence_links` or the user said "go research this first." Otherwise skip — most LinkedIn posts are voice + thought, not research-heavy.

If fired: `research` sub-agent reads linked sources, returns ≤300 tokens of "what's the actual claim, what's the evidence, what 2-3 specific angles."

### Stage 2 — 3 variants (Tier 3 main)

Produce 3 distinct variants with different hook strategies. The platform-rules.json defines BANNED hooks; pick from the surviving set:

**Variant A — Specific moment hook**
Open with a real moment. "Yesterday I watched a customer..."

**Variant B — Sharp claim hook**
Open with a counter-intuitive or specific claim. "Most CSMs are managing the wrong metric."

**Variant C — Direct question that ISN'T bait**
Open with a real question you've been asking yourself. NOT "What's your secret to..." — that's banned. Real curiosity: "Why do platforms ship great UX but bad onboarding?"

Each variant follows LinkedIn structure (per platform-rules):

- 90-char hook (the see-more cutoff is ~120 chars, but 90 leaves room for line break)
- Single-thought-per-line for the body (LinkedIn's text format renders this well)
- 120-220 words total (sweet spot per research)
- 0-2 niche hashtags MAX, never generic (#business, #leadership, etc. banned)
- Optional CTA at end — but only if it's specific ("anyone seen this in their book?" not "what do you think?")

### Stage 3 — Voice smell test (mandatory)

For each variant, run:

1. **Em-dash count** — must be 0 (literal grep U+2014)
2. **AI-cliché grep** — leverage / synergy / passionate / ecosystem / holistic / robust / journey / navigate / delve / unpack / tapestry / landscape — must be 0
3. **Banned phrase grep** — "It's not just X — it's Y", "let's dive in", "in conclusion", "I'd love to hear", "what are your thoughts" (when generic), "thoughts?" — must be 0
4. **First-sentence test** — would this open 100 other posts? If yes, kill the variant
5. **Hook length** — first sentence ≤ 90 chars
6. **Word count** — within 120-220
7. **Hashtag count** — 0-2

Any variant failing → regenerate that variant, don't surface failed drafts.

### Stage 4 — Output

```markdown
**LinkedIn drafts** for IDEA-NNNNN — "[short title]"

**Voice profile:** v[N]
**Platform rules:** v[N]
**Recent posts checked:** ✓ ([N] from last 30d, no overlap)

---

### Variant A — [hook strategy name]
**Words:** [N] / 220
**Hook chars:** [N] / 90
**Hashtags:** [N]
**Voice smell test:** ✅ all green

```text
[paste the post]
```

---

### Variant B — ...

---

### Variant C — ...

**My pick:** Variant [X] because [1 sentence rationale]
**Your call:** which one?

**Once you pick, I'll mark IDEA-NNNNN as `status: drafted` linked to POST-NNNNN.**

```

### Stage 5 — On user pick

When user says "go with B" or "post variant A":

1. Update `ideas.json`: set `status: drafted`, link to new `POST-NNNNN`
2. Add tracker item via `personal-tracker`:
   ```json
   {
     "id": "POST-NNNNN",
     "type": "linkedin-post",
     "platform": "linkedin",
     "linked_idea": "IDEA-NNNNN",
     "draft_path": "~/.personal/content-bank/drafts/POST-NNNNN.md",
     "status": "draft",
     "created": "YYYY-MM-DD",
     "next_action": "schedule",
     "next_action_due": "YYYY-MM-DD"
   }
   ```

1. Save the chosen variant to `~/.personal/content-bank/drafts/POST-NNNNN.md` with frontmatter
2. Suggest: "Run `/post-now POST-NNNNN` to open LinkedIn composer with this loaded, OR copy via `pbcopy < ~/.personal/content-bank/drafts/POST-NNNNN.md`"

## Pre-publish gate (mandatory)

LinkedIn posts aimed at recruiter visibility ARE future-employer-content per the AGENTS.md carve-out. The voice + signal bar is high.

For EACH of the 3 variants this skill produces, before delivery, invoke the `evaluator` sub-agent via the Task tool:

- **subagent_type:** `evaluator`
- **prompt:** include the variant body, the source idea, the voice profile, the recent-posts memory block (to check for repetition), and the platform rules. Ask for the 4-axis rubric AND additionally:
  - Does the post respect the LinkedIn length norm (≤ 1300 chars for body, ≤ 200 chars for hook)?
  - Does the post avoid topic repetition with anything in `~/.career/memory/recent-posts.md` (last 30 days)?
  - Is the hook in Josh's voice or generic LinkedIn-bait?

Handle the evaluator's response per-variant:

| Result | Action |
| --- | --- |
| All checks pass | Include the variant in the output to Josh. |
| Failures | Either revise the variant once and re-invoke, OR drop the variant entirely (better to ship 2 strong variants than 3 mediocre ones). |

If all 3 variants fail evaluation, surface to Josh with the evaluator feedback and ask whether to re-draft or revisit the source idea.

## What this skill does NOT do

- Does NOT auto-post. Drafts only.
- Does NOT cross-post. LinkedIn-only voice and format.
- Does NOT use Tier 4 Opus. Voice match doesn't need it; the cap matters.
- Does NOT generate hashtags beyond what the platform rules permit (0-2 niche only).
- Does NOT include emojis unless the user explicitly asks.

## When to escalate

If the user says "this needs to be really polished" or "this is a high-stakes post" → escalate to `personal-content-editor` for a polish pass after the user picks a variant. Don't escalate proactively.

## Cost

Per draft cycle: ~$0.04 (Tier 3 main, 3 variants of ~200 words each + smell test).
