← All Skills

snappy-testimonials

v1.0.0
9 files, 69.9 KB ~6,111 words · 25 min read Updated 2026-09-09

snappy-testimonials skill

36 of 47 checks pass
What it can do
list status?read
score text speaker?read
What does not pass yet
$ npx snappy-skills install snappy-testimonials
zip ↓
File Tree
├── AGENTS.md ├── SKILL.md ├── api.ts ├── entities.json ├── permission-templates.md ├── quote-rubric.md ├── refusals.test.ts ├── scripts/ │ └── scan-testimonials.sh └── xano-tracking.md
Documents
AGENTS.md

snappy-testimonials#

Testimonial sourcing engine. Scans Krisp transcripts (via snappy-transcripts quote-mining

recipe) and snappy-knowledge notes for genuine client praise. Scores candidates on a

4-dimension rubric (specificity, authenticity, business impact, standalone clarity), surfaces

the top 5 to Robert with full context, drafts a casual permission-request in Robert's voice,

and tracks approval state so no quote is ever re-asked.

Key capabilities#

  • Quote mining -- Krisp MCP sentiment queries (transformation language, specific outcomes,

relationship signals, recommendation signals) plus knowledge graph notes scan.

  • Quality rubric -- 4 dimensions scored 1-5 each. Threshold: 14+/20 AND specificity 4+

AND authenticity 4+. Auto-disqualifiers: not a client, speaker is Robert, older than 12mo,

public source, contains private info.

  • Candidate presentation -- top 5 with score, theme, Krisp meeting ID + timestamp,

context before/after, why it scores high, suggested permission channel.

  • Permission drafts -- 4 channel templates (email, WhatsApp, Slack, iMessage). Casual,

one quote per ask, zero corporate buzzwords. DRAFT ONLY -- never auto-sends.

  • Approval tracking -- logs testimonial_asked, testimonial_approved, testimonial_declined

into snappy-knowledge contact notes via Xano PATCH.

Rules#

  • Verbatim quotes only. Never paraphrase.
  • Always present candidates to Robert before drafting permission asks.
  • One quote per permission message. Never batch.
  • Check preferred_channel from snappy-knowledge before picking the send channel.
  • Never re-ask a declined quote. Read contact notes first.
  • Never quote Robert himself.

Directory contents#

File Purpose
SKILL.md Full workflow + rubric + output format
quote-rubric.md Scoring rubric with worked examples
permission-templates.md 4 channel-specific permission request templates
xano-tracking.md Xano PATCH calls for approval state logging
scripts/scan-testimonials.sh Grep-based corpus scanner -- finds candidate quotes in Krisp transcripts

Corpus scanner script#

scripts/scan-testimonials.sh scans ~/.claude/corpus/krisp/2026/**/*.md for testimonial

candidates using regex patterns aligned with SKILL.md sentiment seeds (transformation language,

specific outcomes, praise, relationship signals, recommendation signals).

bash# Scan all 2026 transcripts
./scripts/scan-testimonials.sh

# Scan a specific month
./scripts/scan-testimonials.sh 2026/04

# Filter by speaker name
./scripts/scan-testimonials.sh 2026/03 "mark"

Output is TSV: FILE | SPEAKER | QUOTE_PREVIEW | SCORE (high/medium/low).

Automatically skips Robert's own lines and summary/nuggets files.

Sort by score: ./scripts/scan-testimonials.sh | sort -t\t' -k4 -r

Feeds / fed by#

  • Fed by: snappy-transcripts (Krisp meetings), snappy-knowledge (contact records),

snappy-clients (active roster), snappy-content (voice rules)

  • Feeds: snappy-content (approved quotes), snappy-website (landing page testimonials),

snappy-knowledge (approval state)

API module#

typescriptimport { getTestimonials, scoreTestimonial } from "../snappy-testimonials/api.ts";

Or CLI:

bashnpx tsx ~/.claude/skills/snappy-testimonials/api.ts list
npx tsx ~/.claude/skills/snappy-testimonials/api.ts list HIGH
npx tsx ~/.claude/skills/snappy-testimonials/api.ts score "This changed everything" "Jane"

API functions#

Function Purpose
getTestimonials(status?) Query content engine DB for testimonials, optionally filtered by score
scoreTestimonial(text, speaker) Score a testimonial candidate on 4 dimensions (specificity, authenticity, impact, clarity)

If this loader doesn't cover your case:

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

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

[snappy-testimonials Index]|root: ~/.claude/skills/snappy-testimonials|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,permission-templates.md,quote-rubric.md,xano-tracking.md}

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

Used by#

Nothing in the collection names this skill.

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

Contract verbs#

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

Verb Contract arguments Effect First call
list status? read npx tsx ~/.claude/skills/snappy-testimonials/api.ts list
score text, speaker? read npx tsx ~/.claude/skills/snappy-testimonials/api.ts score "<text>"

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-testimonials
role: Scans transcripts and knowledge graph for client quotes, ranks on quality rubric, drafts permission requests, tracks approvals.
loaded-by: PreToolUse hook (auto-injected when "snappy-testimonials" is mentioned)
---

# snappy-testimonials

Testimonial sourcing engine. Scans Krisp transcripts (via `snappy-transcripts` quote-mining
recipe) and `snappy-knowledge` notes for genuine client praise. Scores candidates on a
4-dimension rubric (specificity, authenticity, business impact, standalone clarity), surfaces
the top 5 to Robert with full context, drafts a casual permission-request in Robert's voice,
and tracks approval state so no quote is ever re-asked.

## Key capabilities

- **Quote mining** -- Krisp MCP sentiment queries (transformation language, specific outcomes,
  relationship signals, recommendation signals) plus knowledge graph notes scan.
- **Quality rubric** -- 4 dimensions scored 1-5 each. Threshold: 14+/20 AND specificity 4+
  AND authenticity 4+. Auto-disqualifiers: not a client, speaker is Robert, older than 12mo,
  public source, contains private info.
- **Candidate presentation** -- top 5 with score, theme, Krisp meeting ID + timestamp,
  context before/after, why it scores high, suggested permission channel.
- **Permission drafts** -- 4 channel templates (email, WhatsApp, Slack, iMessage). Casual,
  one quote per ask, zero corporate buzzwords. DRAFT ONLY -- never auto-sends.
- **Approval tracking** -- logs `testimonial_asked`, `testimonial_approved`, `testimonial_declined`
  into `snappy-knowledge` contact notes via Xano PATCH.

## Rules

- Verbatim quotes only. Never paraphrase.
- Always present candidates to Robert before drafting permission asks.
- One quote per permission message. Never batch.
- Check `preferred_channel` from `snappy-knowledge` before picking the send channel.
- Never re-ask a declined quote. Read contact notes first.
- Never quote Robert himself.

## Directory contents

| File | Purpose |
|---|---|
| `SKILL.md` | Full workflow + rubric + output format |
| `quote-rubric.md` | Scoring rubric with worked examples |
| `permission-templates.md` | 4 channel-specific permission request templates |
| `xano-tracking.md` | Xano PATCH calls for approval state logging |
| `scripts/scan-testimonials.sh` | Grep-based corpus scanner -- finds candidate quotes in Krisp transcripts |

## Corpus scanner script

`scripts/scan-testimonials.sh` scans `~/.claude/corpus/krisp/2026/**/*.md` for testimonial
candidates using regex patterns aligned with SKILL.md sentiment seeds (transformation language,
specific outcomes, praise, relationship signals, recommendation signals).

```bash
# Scan all 2026 transcripts
./scripts/scan-testimonials.sh

# Scan a specific month
./scripts/scan-testimonials.sh 2026/04

# Filter by speaker name
./scripts/scan-testimonials.sh 2026/03 "mark"
```

Output is TSV: `FILE | SPEAKER | QUOTE_PREVIEW | SCORE` (high/medium/low).
Automatically skips Robert's own lines and summary/nuggets files.
Sort by score: `./scripts/scan-testimonials.sh | sort -t$'\t' -k4 -r`

## Feeds / fed by

- **Fed by**: `snappy-transcripts` (Krisp meetings), `snappy-knowledge` (contact records),
  `snappy-clients` (active roster), `snappy-content` (voice rules)
- **Feeds**: `snappy-content` (approved quotes), `snappy-website` (landing page testimonials),
  `snappy-knowledge` (approval state)

## API module

```typescript
import { getTestimonials, scoreTestimonial } from "../snappy-testimonials/api.ts";
```

Or CLI:
```bash
npx tsx ~/.claude/skills/snappy-testimonials/api.ts list
npx tsx ~/.claude/skills/snappy-testimonials/api.ts list HIGH
npx tsx ~/.claude/skills/snappy-testimonials/api.ts score "This changed everything" "Jane"
```

## API functions

| Function | Purpose |
|----------|---------|
| `getTestimonials(status?)` | Query content engine DB for testimonials, optionally filtered by score |
| `scoreTestimonial(text, speaker)` | Score a testimonial candidate on 4 dimensions (specificity, authenticity, impact, clarity) |

---

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

<!-- SKILL-INDEX-START -->
[snappy-testimonials Index]|root: ~/.claude/skills/snappy-testimonials|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,permission-templates.md,quote-rubric.md,xano-tracking.md}
<!-- SKILL-INDEX-END -->

## Used by

Nothing in the collection names this skill.

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

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

| Verb | Contract arguments | Effect | First call |
|---|---|---|---|
| `list` | `status?` | `read` | `npx tsx ~/.claude/skills/snappy-testimonials/api.ts list` |
| `score` | `text`, `speaker?` | `read` | `npx tsx ~/.claude/skills/snappy-testimonials/api.ts score "<text>"` |

## 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?