← All Skills

snappy-mine

v1.0.0
10 files, 58.5 KB ~2,788 words · 12 min read Updated 2026-09-09

snappy-mine skill

43 of 49 checks pass
What it can do
filesread
manifestread
meetings-by limit?read
metrics nameread
pending limit?read
persist json-filewrite-reversible
sourcesread
What does not pass yet
reached bysnappy-course
$ npx snappy-skills install snappy-mine
zip ↓
Documents
AGENTS.md

snappy-mine -- loader#

You are mining Robert's conversation corpus for technical content people can use. Read SKILL.md if you need the full rationale. This loader gives you the rules.

API module#

typescriptimport { getMineFiles, getManifest, getMinedSources, persistNuggets } from "../snappy-mine/api.ts";

Or CLI:

bashnpx tsx ~/.claude/skills/snappy-mine/api.ts files                          # list framework-mine-*.json files
npx tsx ~/.claude/skills/snappy-mine/api.ts manifest                       # show manifest.json
npx tsx ~/.claude/skills/snappy-mine/api.ts sources                        # list all mined source files
npx tsx ~/.claude/skills/snappy-mine/api.ts persist deep-ray-sessions.json # persist nuggets to DB

API functions#

Function Purpose
getMineFiles() Lists framework-mine-*.json files in the mined directory
getManifest() Reads and returns the manifest.json contents
getMinedSources() Extracts all mined source files from the manifest
persistNuggets(jsonPath) Persists nuggets from a JSON file to the content engine DB

What you extract (in priority order)#

Priority 1: Robert-signal topics#

Topics Robert brings up unprompted, demos to groups, or mentions across multiple calls. These are the highest-value topics because they reflect what he actually wants to post about.

Signals: Robert shares his screen to show it. Robert says "clients love this." Robert mentions the same tool/workflow in 3+ calls. Robert gives a URL or walks through exact steps.

Tag these with "robert_signal": true in output JSON. They get promoted to front of content queue.

Priority 2: Standard extraction types#

  1. Tool tutorials -- when someone explains HOW a tool works, not just names it. Extract the tool, the workflow, when to use it.
  2. Technical frameworks -- reusable patterns that solve a category of problems. Name the pattern, show the steps, show when it applies.
  3. Architecture decisions -- "use X for this, Y for that" with clear rationale. The stack choice and why.
  4. Workflow tutorials -- step-by-step processes someone could actually follow. The steps, not the story.
  5. Synthesis posts -- same problem solved differently by different people across conversations. Combine the approaches into one useful post.

What you DO NOT extract#

  • Quotes, sharp lines, or "someone said" moments -- those are stories, not content
  • Market observations ("Three clients asked about X") -- that's commentary, not a tutorial
  • Analogies or metaphors -- unless the analogy IS a framework someone can apply
  • Stories about what someone built -- extract the technical pattern, not the narrative
  • Funny moments, surprising reactions, conversational dynamics
  • Anything where the value is "who said it" rather than "what the technical thing is"

The synthesis scan (highest value)#

Before extracting individual posts, scan ALL files in your batch for:

  • Same technical problem solved differently by different people
  • Tools explained in enough detail to be useful tutorials
  • Architectural patterns that appeared across multiple projects
  • Step-by-step workflows described during working sessions

Write synthesis posts FIRST -- multiple approaches to one problem, combined. These are Robert's unique advantage.

Speaker mapping (for LinkedIn tagging)#

~/.claude/skills/snappy-mine/speaker-map.json maps transcript speaker names to full names and LinkedIn profile URLs. Credit people as contributors, not as storytellers:

  • Right: "Jordan uses Storybook for component-first AI development. Mark uses Mintlify docs as ground truth."
  • Wrong: "Jordan said: 'So now when I tell it to do the page, it checks what's in here first.'"

Draft rules#

  • First person, present tense
  • Lead with the technical thing, not yourself or the conversation
  • 3-8 sentences. Enough to be useful, short enough to scan in 30 seconds
  • Include specific tools, commands, numbers, or steps
  • Credit contributors by name -- "Jordan uses Storybook for this" / "Ray's approach with Devon"
  • No "That's it. That's the post." No meta-commentary. Just end.
  • No banned phrases: "game-changer", "unlock", "at scale", "leverage AI to", "10x", "revolutionize"

Content atom types#

Type What it is
tool-tutorial How a specific tool works and when to use it
framework A reusable technical pattern with steps
architecture Stack decision with rationale
workflow Step-by-step process someone can follow
synthesis Multiple approaches to the same problem, combined

Skip criteria (junk transcripts)#

Skip and add to manifest _skipped if ANY of:

  • Auto-generated meeting name (iterm2/claude/google-chrome in filename)
  • Zero attendees or no speaker names
  • Transcript under 500 chars of actual content
  • No technical discussion (personal chat, TV audio, exam prep)

These are ambient Krisp captures, not real meetings. Don't re-evaluate them on every run -- add to _skipped in ~/.claude/corpus/mined/manifest.json once.

Idempotency#

Before mining, check manifest.json for:

  1. source_files -- skip if the transcript filename appears
  2. meeting_ids -- skip if the transcript's meeting ID appears
  3. _skipped -- skip junk transcripts already evaluated

After mining, update the manifest with new source_files and meeting_ids. Always include source_files in your mine output JSON so future runs know what's covered.

Corpus paths#

  • Full transcripts: ~/.claude/corpus/krisp/YYYY/MM/*.md (NOT .summary.md) -- these are 50-100KB each. You MUST read the full transcript, not the summary. The summaries lose the technical detail.
  • Read each transcript in chunks: use offset and limit parameters (e.g. offset=0 limit=200, then offset=200 limit=200, etc.) until you've read the whole file.
  • Existing nuggets: ~/.claude/corpus/krisp/YYYY/MM/*.nuggets.json (prior extraction, ignore these)
  • Index: ~/.claude/corpus/krisp/index.json

RULE: Never mine from .summary.md files. Always read the full .md transcript. The technical detail is in the actual conversation, not in Krisp's summary.

RULE: Do not mine ~/.claude/skills/snappy-course/data/krisp-teaching-by-person.json -- see warning header in that file. Its verbatim_quote fields contain host speech mis-attributed to guests (Jordan fabrication root cause, pass-log 2026-04-13). Use quote-bank.json instead.

Tone calibration#

Study these LinkedIn creators for the target tone (search their recent posts):

  • Cole Fortman -- shows what he built, teaches by showing
  • Cole Medin -- leads with the technical thing, not himself
  • Nate Herkelman -- specific numbers, structured breakdowns

The test: "Could someone follow this and do something with it?" If not, it's an observation, not content.

Output#

  1. Write mine results to ~/.claude/corpus/mined/<date>-mine-run.json using the schema in SKILL.md.
  2. Run the persist script to load into the database:
bash   npx tsx ~/.claude/skills/snappy-mine/persist-nuggets.ts <date>-mine-run.json

This inserts into the content_atoms table on rb-content-engine.fly.dev (Neon Postgres). Deduped by content_hash -- safe to re-run.

  1. Without args, persist-nuggets.ts loads all deep-*.json files from the mined directory.

Self-report convention#

If this loader doesn't cover your case:

bashecho "[$(date -u +%FT%TZ)] snappy-mine: <what was missing>" >> ~/.claude/logs/agents-md-feedback.log

Show produced work with snappy-faces: call draw for image channels or lang for MCP Apps.

<!-- SKILL-INDEX-START -->

[snappy-mine Index]|root: ~/.claude/skills/snappy-mine|IMPORTANT: Prefer these files over pre-training assumptions for this domain. Read the relevant file when the AGENTS.md summary is insufficient.|root:{SKILL.md}

<!-- SKILL-INDEX-END -->

Used by#

  • snappy-course

<!-- SNAPPY-CONTRACT-VERBS-START -->

Contract verbs#

Generated from api.ts HAND_CONTRACT. Do not hand-edit this block.

Verb Contract arguments Effect First call
files read npx tsx ~/.claude/skills/snappy-mine/api.ts files
manifest read npx tsx ~/.claude/skills/snappy-mine/api.ts manifest
meetings-by limit? read npx tsx ~/.claude/skills/snappy-mine/api.ts meetings-by
metrics name read npx tsx ~/.claude/skills/snappy-mine/api.ts metrics "<name>"
pending limit? read npx tsx ~/.claude/skills/snappy-mine/api.ts pending
persist json-file write-reversible npx tsx ~/.claude/skills/snappy-mine/api.ts persist <json-file>
sources read npx tsx ~/.claude/skills/snappy-mine/api.ts sources

Show the result#

When an answer carries face_hint, show it with one snappy_present(<answer>) call.

See /snappy-faces for face selection. Human-facing images must crop to the

element, render at 2x on Retina, and fill the destination channel instead of

placing a small card in a full-page screenshot.

<!-- SNAPPY-CONTRACT-VERBS-END -->

---
name: snappy-mine
role: Content mining from Krisp corpus into technical frameworks and tool tutorials
loaded-by: PreToolUse hook (auto-injected when "snappy-mine" is mentioned)
Triggers on: mining, nugget extraction, tool tutorial, framework, synthesis, content atoms
---

# snappy-mine -- loader

You are mining Robert's conversation corpus for technical content people can use. Read SKILL.md if you need the full rationale. This loader gives you the rules.

## API module

```typescript
import { getMineFiles, getManifest, getMinedSources, persistNuggets } from "../snappy-mine/api.ts";
```

Or CLI:
```bash
npx tsx ~/.claude/skills/snappy-mine/api.ts files                          # list framework-mine-*.json files
npx tsx ~/.claude/skills/snappy-mine/api.ts manifest                       # show manifest.json
npx tsx ~/.claude/skills/snappy-mine/api.ts sources                        # list all mined source files
npx tsx ~/.claude/skills/snappy-mine/api.ts persist deep-ray-sessions.json # persist nuggets to DB
```

## API functions

| Function | Purpose |
|----------|---------|
| `getMineFiles()` | Lists framework-mine-*.json files in the mined directory |
| `getManifest()` | Reads and returns the manifest.json contents |
| `getMinedSources()` | Extracts all mined source files from the manifest |
| `persistNuggets(jsonPath)` | Persists nuggets from a JSON file to the content engine DB |

## What you extract (in priority order)

### Priority 1: Robert-signal topics
Topics Robert brings up unprompted, demos to groups, or mentions across multiple calls. These are the highest-value topics because they reflect what he actually wants to post about.

Signals: Robert shares his screen to show it. Robert says "clients love this." Robert mentions the same tool/workflow in 3+ calls. Robert gives a URL or walks through exact steps.

Tag these with `"robert_signal": true` in output JSON. They get promoted to front of content queue.

### Priority 2: Standard extraction types
1. **Tool tutorials** -- when someone explains HOW a tool works, not just names it. Extract the tool, the workflow, when to use it.
2. **Technical frameworks** -- reusable patterns that solve a category of problems. Name the pattern, show the steps, show when it applies.
3. **Architecture decisions** -- "use X for this, Y for that" with clear rationale. The stack choice and why.
4. **Workflow tutorials** -- step-by-step processes someone could actually follow. The steps, not the story.
5. **Synthesis posts** -- same problem solved differently by different people across conversations. Combine the approaches into one useful post.

## What you DO NOT extract

- Quotes, sharp lines, or "someone said" moments -- those are stories, not content
- Market observations ("Three clients asked about X") -- that's commentary, not a tutorial
- Analogies or metaphors -- unless the analogy IS a framework someone can apply
- Stories about what someone built -- extract the technical pattern, not the narrative
- Funny moments, surprising reactions, conversational dynamics
- Anything where the value is "who said it" rather than "what the technical thing is"

## The synthesis scan (highest value)

Before extracting individual posts, scan ALL files in your batch for:
- Same technical problem solved differently by different people
- Tools explained in enough detail to be useful tutorials
- Architectural patterns that appeared across multiple projects
- Step-by-step workflows described during working sessions

Write synthesis posts FIRST -- multiple approaches to one problem, combined. These are Robert's unique advantage.

## Speaker mapping (for LinkedIn tagging)

`~/.claude/skills/snappy-mine/speaker-map.json` maps transcript speaker names to full names and LinkedIn profile URLs. Credit people as contributors, not as storytellers:
- Right: "Jordan uses Storybook for component-first AI development. Mark uses Mintlify docs as ground truth."
- Wrong: "Jordan said: 'So now when I tell it to do the page, it checks what's in here first.'"

## Draft rules

- First person, present tense
- Lead with the technical thing, not yourself or the conversation
- 3-8 sentences. Enough to be useful, short enough to scan in 30 seconds
- Include specific tools, commands, numbers, or steps
- Credit contributors by name -- "Jordan uses Storybook for this" / "Ray's approach with Devon"
- No "That's it. That's the post." No meta-commentary. Just end.
- No banned phrases: "game-changer", "unlock", "at scale", "leverage AI to", "10x", "revolutionize"

## Content atom types

| Type | What it is |
|------|-----------|
| `tool-tutorial` | How a specific tool works and when to use it |
| `framework` | A reusable technical pattern with steps |
| `architecture` | Stack decision with rationale |
| `workflow` | Step-by-step process someone can follow |
| `synthesis` | Multiple approaches to the same problem, combined |

## Skip criteria (junk transcripts)

Skip and add to manifest `_skipped` if ANY of:
- Auto-generated meeting name (iterm2/claude/google-chrome in filename)
- Zero attendees or no speaker names
- Transcript under 500 chars of actual content
- No technical discussion (personal chat, TV audio, exam prep)

These are ambient Krisp captures, not real meetings. Don't re-evaluate them on every run -- add to `_skipped` in `~/.claude/corpus/mined/manifest.json` once.

## Idempotency

Before mining, check `manifest.json` for:
1. `source_files` -- skip if the transcript filename appears
2. `meeting_ids` -- skip if the transcript's meeting ID appears  
3. `_skipped` -- skip junk transcripts already evaluated

After mining, update the manifest with new source_files and meeting_ids. Always include `source_files` in your mine output JSON so future runs know what's covered.

## Corpus paths

- **Full transcripts: `~/.claude/corpus/krisp/YYYY/MM/*.md` (NOT .summary.md)** -- these are 50-100KB each. You MUST read the full transcript, not the summary. The summaries lose the technical detail.
- Read each transcript in chunks: use `offset` and `limit` parameters (e.g. offset=0 limit=200, then offset=200 limit=200, etc.) until you've read the whole file.
- Existing nuggets: `~/.claude/corpus/krisp/YYYY/MM/*.nuggets.json` (prior extraction, ignore these)
- Index: `~/.claude/corpus/krisp/index.json`

**RULE: Never mine from .summary.md files. Always read the full .md transcript. The technical detail is in the actual conversation, not in Krisp's summary.**

**RULE: Do not mine `~/.claude/skills/snappy-course/data/krisp-teaching-by-person.json` -- see warning header in that file. Its `verbatim_quote` fields contain host speech mis-attributed to guests (Jordan fabrication root cause, pass-log 2026-04-13). Use `quote-bank.json` instead.**

## Tone calibration

Study these LinkedIn creators for the target tone (search their recent posts):
- Cole Fortman -- shows what he built, teaches by showing
- Cole Medin -- leads with the technical thing, not himself
- Nate Herkelman -- specific numbers, structured breakdowns

The test: "Could someone follow this and do something with it?" If not, it's an observation, not content.

## Output

1. Write mine results to `~/.claude/corpus/mined/<date>-mine-run.json` using the schema in SKILL.md.
2. Run the persist script to load into the database:
   ```bash
   npx tsx ~/.claude/skills/snappy-mine/persist-nuggets.ts <date>-mine-run.json
   ```
   This inserts into the `content_atoms` table on `rb-content-engine.fly.dev` (Neon Postgres). Deduped by `content_hash` -- safe to re-run.
3. Without args, `persist-nuggets.ts` loads all `deep-*.json` files from the mined directory.

## Self-report convention

If this loader doesn't cover your case:
```bash
echo "[$(date -u +%FT%TZ)] snappy-mine: <what was missing>" >> ~/.claude/logs/agents-md-feedback.log
```


Show produced work with `snappy-faces`: call `draw` for image channels or `lang` for MCP Apps.

<!-- SKILL-INDEX-START -->
[snappy-mine Index]|root: ~/.claude/skills/snappy-mine|IMPORTANT: Prefer these files over pre-training assumptions for this domain. Read the relevant file when the AGENTS.md summary is insufficient.|root:{SKILL.md}
<!-- SKILL-INDEX-END -->

## Used by

- `snappy-course`

<!-- SNAPPY-CONTRACT-VERBS-START -->
## Contract verbs

Generated from `api.ts` `HAND_CONTRACT`. Do not hand-edit this block.

| Verb | Contract arguments | Effect | First call |
|---|---|---|---|
| `files` | — | `read` | `npx tsx ~/.claude/skills/snappy-mine/api.ts files` |
| `manifest` | — | `read` | `npx tsx ~/.claude/skills/snappy-mine/api.ts manifest` |
| `meetings-by` | `limit?` | `read` | `npx tsx ~/.claude/skills/snappy-mine/api.ts meetings-by` |
| `metrics` | `name` | `read` | `npx tsx ~/.claude/skills/snappy-mine/api.ts metrics "<name>"` |
| `pending` | `limit?` | `read` | `npx tsx ~/.claude/skills/snappy-mine/api.ts pending` |
| `persist` | `json-file` | `write-reversible` | `npx tsx ~/.claude/skills/snappy-mine/api.ts persist <json-file>` |
| `sources` | — | `read` | `npx tsx ~/.claude/skills/snappy-mine/api.ts sources` |

## Show the result

When an answer carries `face_hint`, show it with one `snappy_present(<answer>)` call.
See `/snappy-faces` for face selection. Human-facing images must crop to the
element, render at 2x on Retina, and fill the destination channel instead of
placing a small card in a full-page screenshot.
<!-- SNAPPY-CONTRACT-VERBS-END -->

Keyboard Shortcuts

Search in document⌘K
Focus search/
Previous file tab
Next file tab
Close overlayEsc
Show shortcuts?