---
description: STAR Story Extractor — Josh's unfair advantage. Mines OpenCode session DB, project-logs, account memory, meeting transcripts, prior work artefacts to extract Situation/Task/Action/Result/Reflection stories for behavioral interview prep. Multi-source delegated extraction. Builds the star-bank.json that feeds resume-tailor and cover-letter skills.
---

# personal-star-extractor

The single highest-leverage thing in Josh's setup nobody else has — 18+ months of dense, well-documented work that can be mined for behavioral interview stories. Most candidates write STAR stories from memory; Josh writes them from data.

## Trigger phrases

- "Extract STAR stories"
- "Mine my work for behavioral examples"
- "Build the STAR bank"
- "Find a story for [competency]"
- `/star-extract [optional: theme]`

## Inputs (multiple sources)

- `~/.local/share/opencode/opencode.db` — session history with timestamps and outcomes
- Personal project-log.md files in `~/Documents/OpenCode Working Folder/*/project-log.md`
- Personal git history across personal repos (`gh repo list joshvogel`)
- Any prior work-related artefacts Josh has chosen to import to `~/.career/source/`
- Personal LinkedIn endorsements, recommendations (manually exported to `~/.career/source/linkedin-export/`)

**IMPORTANT — privacy:** This skill DOES NOT pull from Cloudflare-internal sources on the personal laptop. Anything CF-specific that Josh wants in his STAR bank must be manually exported (with PII/customer scrubbing) into `~/.career/source/` first. The skill operates only on `~/.career/source/`, personal git, and local session DB.

## Output

`~/.career/star-bank.json` — array of structured stories. Schema:

```json
{
  "id": "STAR-001",
  "title": "Short evocative title",
  "competencies": ["leadership", "ambiguity-tolerance", "technical-depth"],
  "situation": "...",
  "task": "...",
  "action": "...",
  "result": "...",
  "reflection": "...",
  "metrics": ["...", "..."],
  "scope": ["team-of-N", "duration-Xmo", "blast-radius-Y"],
  "audience_fit": ["CSM", "SA", "EM"],
  "sensitivity": "public | scrubbed | internal-only",
  "source_evidence": ["session-id:abc123", "git-sha:def456", "log:project-log.md:L42"],
  "last_used": "YYYY-MM-DD or null",
  "used_in_applications": ["JOB-NNNNN"]
}
```

## Process

### Mode 1 — Bulk initial build

When run with no theme, performs the multi-source extraction:

**Step 1 — Delegate per-source to parallel sub-agents (Tier 2 Haiku).**

Fire 4 parallel `general` sub-agents:

1. **Session DB miner.** Queries `~/.local/share/opencode/opencode.db` for sessions with substantive output (>50 turns or files created). Returns: session_id, title, date, headline accomplishment, files produced.
2. **Project-log miner.** Reads each `~/Documents/OpenCode Working Folder/*/project-log.md`. Returns: dated entries, decisions made, problems solved, outcomes documented.
3. **Git history miner.** `gh api` calls for personal repos. Returns: high-impact PRs (defined as: >100 LoC, merged, with non-trivial review feedback), with PR descriptions.
4. **Manual source miner.** Walks `~/.career/source/` for any user-provided artefacts (LinkedIn export, prior bullet-point exports, etc).

Each sub-agent returns ≤500 tokens of structured headlines.

**Step 2 — Synthesize stories (Tier 4 main, Opus).**

Read all 4 sub-agent outputs. Group related headlines into candidate stories. For each candidate, draft the STAR+R structure. The "Reflection" piece (what did I learn / what would I do differently) is what separates STAR from STAR+R, and it's what senior interviews probe for.

Discipline:

- Each story should have ≥1 quantified metric in the Result.
- Each story should be tagged with 2-4 competencies.
- Don't fabricate — if a metric isn't in the source data, don't invent one. Mark `"metrics_estimated": true` with a confidence note.
- Same source data CAN seed multiple stories with different framing (e.g., one same project produces a "leadership" story AND a "technical-depth" story — the action emphasis differs).

**Step 3 — Persist.**

Write/merge to `~/.career/star-bank.json`. Preserve `used_in_applications` history if updating existing entries.

### Mode 2 — Targeted extraction

Run with a theme: "Extract STAR stories for ambiguity tolerance" / "Find stories for technical leadership" / "Mine for stories where I changed someone's mind."

Process is the same but Step 2 filters to the theme and produces 2-5 best-fit stories instead of comprehensive bulk.

## Output to Josh

```markdown
**STAR bank built/updated**

**Total stories:** [N] (was [M], delta +[N-M])

**By competency:**
- Leadership: [count]
- Technical depth: [count]
- Ambiguity tolerance: [count]
- Cross-functional collaboration: [count]
- Customer empathy: [count]
- ...

**By sensitivity:**
- Public (safe for any audience): [count]
- Scrubbed (PII removed, otherwise OK): [count]
- Internal-only (do not share publicly): [count]

**Top 5 strongest stories** (by metric strength + competency coverage):
1. STAR-XXX: [title] — fits [competencies]
2. ...

**Newly discovered stories** (from this run):
- STAR-XXX: [title] — [why it surfaced]

**Open questions for Josh:**
- [Anything where source data was thin and you should manually augment]

**Path:** `~/.career/star-bank.json`
```

## Maintenance

This skill runs periodically (suggest weekly during active hunt). Each run:

- Adds new stories from new source data
- Updates `last_used` and `used_in_applications` for stories that got used
- Surfaces "story drought" warnings (e.g., "you have 0 stories tagged 'public-speaking' — consider adding one manually")

## Privacy rule

Stories tagged `internal-only` are NEVER included in any prompt sent to a cloud model when generating future-employer-content. They serve only as Josh's internal reference. The `personal-resume-tailor` and `personal-cover-letter` skills filter `sensitivity != "internal-only"` before reading.
