# /pb-ideate

> Generate 9 ranked YouTube video ideas for Faris's personal brand (faris-bio)


# /pb-ideate — Personal Brand Idea Generator

## Triggers

- `/pb-ideate` — generates ideas from the last 30 days of `agency-os` commits
- `/pb-ideate --since "14 days ago"` — narrower window
- `/pb-ideate --pillar 1,4` — bias output toward specific pillars (after picks)

## What this skill does

1. Pulls meaningful commits from `c:/Users/faris/agency-os` git log (filters merges, fixups, doc-only)
2. Scores commits by lines changed + presence in `.claude/skills/`, `.claude/agents/`, `*/scripts/*.mjs`, etc.
3. Clusters commits by domain (meta, google_ads, ai_video, agents, bridge, etc.)
4. Reads `faris-bio/brand/pillars.md`, `positioning.md`, `voice.md` for context
5. Generates **9 ranked video ideas** in the structured format below
6. **Asks the user which ideas to keep** (driver's-seat checkpoint)
7. Appends only the user's picks to the `Faris Bio — Content Pipeline` Google Sheet with Status = Inbox
8. Logs the full set (picked + discarded) to `faris-bio/research/notes/ideate-runs/<timestamp>.md`

## What this skill does NOT do

- Does not auto-promote ideas past Inbox
- Does not write thumbnails, scripts, or briefs (those are separate skills)
- Does not run on a cron — manual invocation only
- Does not post to Slack on its own (the user can ACME Agencyw the sheet directly)

## Procedure

### Step 1 — Verify pipeline is initialized

Check that `faris-bio/config.json` exists and contains `sheet_id`. If not, run:

```bash
node faris-bio/scripts/setup_pipeline.mjs
```

This creates the Drive folder, sheet, tab, headers, and dropdowns. Idempotent — safe to re-run.

### Step 2 — Pull commits + brand context

```bash
node faris-bio/scripts/ideate_prepare.mjs --since "30 days ago"
```

The script prints a structured JSON block containing:
- `window` — the time window used
- `clusters` — commits grouped by domain, with score, files, line counts
- `pillars_md`, `positioning_md`, `voice_md` — full brand context

### Step 3 — Generate 9 ranked ideas

Using the JSON output + brand docs, generate **exactly 9 ideas** following Chase's ideation pattern (from `faris-bio/research/notes/<id>.md`):

#### <id>

For each of the 9 ideas, present:

```
## Idea N — <working title>

- **angle:** <one-line, what makes this video different from the obvious version>
- **desire:** <one-line, the desire/pain this hits in the viewer>
- **pillar:** 1-5 (from brand/pillars.md)
- **format:** long-form / short / linkedin / carousel / live-build
- **channel:** YT / Shorts / LI / IG (one or more)
- **source commits:** <short hashes>
- **effort:** low / med / high
- **competitive gap:** <one-line, what other AI-marketing YouTubers are not doing here>
- **why now:** <one-line, why this angle is fresh given Faris's actual recent work>
```

After all 9, add a **ranking section** that orders them by your judgment of strategic value — weighting:
- **Moat content** (pillars 1, 4 from `pillars.md`) heavier than traffic content
- Ideas that pull from multiple commits (proves the depth) heavier than single-commit ideas
- Ideas that have a clear "before agency-os / after agency-os" narrative

End with: *"Which of these 9 should go to the Inbox in the Content Pipeline? Reply with the numbers, e.g. '1, 3, 7' — or 'all' / 'none'."*

### Step 4 — Wait for the user to pick

Do NOT auto-write to the sheet. The user is in the driver's seat.

### Step 5 — Commit the picks

For each picked idea, build a JSON object:

```json
{
  "id": "2026-04-<short-slug>",
  "title": "<working title>",
  "angle": "<from output>",
  "pillar": "<1-5>",
  "format": "<from output>",
  "channel": "<YT/Shorts/LI/IG, comma-separated if multi>",
  "source": "git:<hash1>,git:<hash2>",
  "desire": "<from output>",
  "effort": "<low/med/high>",
  "notes": "<optional — anything the user said when picking>"
}
```

ID format: `YYYY-MM-<short-slug>` (year-month + 3-5 word kebab slug).

Write the array to a temp JSON file, then:

```bash
node faris-bio/scripts/ideate_commit.mjs <temp.json>
```

The script appends the picks to the sheet with Status = Inbox and prints the sheet URL.

### Step 6 — Save the run log

Write all 9 ideas (picked + discarded) to:

```
faris-bio/research/notes/ideate-runs/<YYYY-MM-DD-HHmm>.md
```

Format: same as the <id> above + a "Picks" section listing which ones the user kept. This is the audit trail — useful when ACME Agencywing what we discarded later.

## Reusable infrastructure

- `faris-bio/scripts/lib/git_log.mjs` — `pullCommits()`, `clusterCommits()`
- `faris-bio/scripts/lib/pipeline_sheet.mjs` — `ensurePipelineSheet()`, `appendIdeas()`, `listIdeas()`
- `ACME Agency/scripts/lib/google_sheets.mjs` — underlying Sheets API (auth + helpers)
- `ACME Agency/scripts/lib/google_slides.mjs` — `getAccessToken()` for OAuth

## Voice rules (apply to the generated ideas)

From `faris-bio/brand/voice.md`:
- No em-dashes
- No "let's dive in", "unlock", "next-level", "in this video", "without further ado"
- Hooks open with a number, claim, or contrarian take
- Lean on real client stories from Paradox / PKV / IA Outreach / ACME Agency — that's the moat

## Strategic frame (from research notes)

> Faris's fountainhead is `agency-os` itself. He is the source. Every idea should pull from a real artifact he shipped — not an abstract "here's how AI could help an agency" angle.

If a generated idea doesn't trace back to a specific commit, drop it.