{
  "schema": "snappy-card/1",
  "skill": "snappy-transcripts",
  "tier": "public",
  "origin_tier": "base",
  "purpose": "You need to find or transcribe a meeting. Krisp MCP is the primary source. Whisper on Mac Mini is the fallback.",
  "verbs": [
    {
      "name": "list",
      "args": [
        "year?",
        "month?"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-transcripts/api.ts list"
    },
    {
      "name": "read",
      "args": [
        "path",
        "offset?"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-transcripts/api.ts read <path>"
    },
    {
      "name": "search",
      "args": [
        "query"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-transcripts/api.ts search \"<query>\""
    }
  ],
  "faces": [],
  "agents": [],
  "uses": [],
  "used_by": [],
  "checks": {
    "pass": 44,
    "fail": 7,
    "defer": 10,
    "line": "44 of 51 checks pass",
    "failing": [
      {
        "id": 5,
        "rule": "Description is valid, third-person, and says what plus when",
        "says": "first/second person"
      },
      {
        "id": 10,
        "rule": "One term names each concept",
        "says": "mixed synonym sets: endpoint/url/route/path"
      },
      {
        "id": 11,
        "rule": "Each task presents one default, not a menu",
        "says": "2 line(s) present three-way alternative menus"
      },
      {
        "id": 40,
        "rule": "Metadata, skill body, and resources follow three-level budgets",
        "says": "metadata ~186 tokens; body ~3446 tokens"
      },
      {
        "id": 54,
        "rule": "At least three eval scenarios precede ready status",
        "says": "0 eval scenario(s); ready=true"
      },
      {
        "id": 55,
        "rule": "Eval scenarios are multi-call with ground truth",
        "says": "eval manifest missing"
      },
      {
        "id": 57,
        "rule": "Eval manifest contains a disjoint holdout",
        "says": "0 disjoint holdout scenario(s)"
      }
    ]
  },
  "coverage": null,
  "spec": null,
  "evals": null,
  "files": [
    "AGENTS.md",
    "SKILL.md",
    "api.test.ts",
    "api.ts",
    "faces/components/transcript-faces.css",
    "faces/components/transcript-faces.tsx",
    "faces/family.tsx",
    "faces/fixtures/transcripts-hits.json",
    "faces/fixtures/transcripts-nugget.json",
    "krisp-integration.md",
    "quote-mining.md",
    "refusals.test.ts",
    "sales-review.md",
    "summarization.md",
    "whisper-pipeline.md"
  ],
  "total_size": 89095,
  "checksum": "sha256:3b17db739ee8fdb5b9c38809b693177621e2792429e7157200eb23af4ef0f444",
  "built_at": "2026-09-09T22:11:17.778Z",
  "openapi": {
    "openapi": "3.1.0",
    "info": {
      "title": "snappy-transcripts",
      "version": "0.0.0",
      "description": "Transcript retrieval, search, and processing for Snappy. Krisp MCP is the primary source for every Zoom/Meet/Teams call (auto-transcribed, action items extracted). Whisper on the Mac Mini is the fallback for phone recordings, YouTube, and pre-Krisp archives. Powers pre-call briefs, post-call capture, testimonial quote mining, content idea extraction, and sales call review. Triggers on: transcript, transcripts, meeting notes, call recording, transcribe, what did we discuss, meeting summary, pull transcript, search transcripts, call notes, recording, krisp, meeting search, action items, quote mining, find quote, search calls, interview material, meeting context, call recap, what did they say, who said what, call moments, verbatim quote."
    },
    "x-snappy-transport": "cli",
    "servers": [
      {
        "url": "npx tsx ~/.claude/skills/snappy-transcripts/api.ts",
        "description": "The hand itself. Every path is a verb word, every query or body key an argument."
      }
    ],
    "paths": {
      "/list": {
        "get": {
          "operationId": "snappy_transcripts_list",
          "summary": "snappy-transcripts list",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "year",
              "in": "query",
              "required": false,
              "schema": {
                "type": "string",
                "description": "Four-digit year",
                "x-snappy-position": 0
              }
            },
            {
              "name": "month",
              "in": "query",
              "required": false,
              "schema": {
                "type": "string",
                "description": "Two-digit month",
                "x-snappy-position": 1
              }
            },
            {
              "name": "limit",
              "in": "query",
              "required": false,
              "schema": {
                "type": "integer",
                "description": "How many transcripts to return, newest first. The count is the FLAG --limit, never a positional word; default 20, ceiling 200",
                "default": 20,
                "minimum": 1,
                "maximum": 200,
                "x-snappy-flag": "--limit"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/read": {
        "get": {
          "operationId": "snappy_transcripts_read",
          "summary": "snappy-transcripts read",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "path",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "Path to the transcript file, relative to the transcripts root",
                "x-snappy-position": 0
              }
            },
            {
              "name": "offset",
              "in": "query",
              "required": false,
              "schema": {
                "type": "integer",
                "description": "Line offset to start reading from",
                "x-snappy-position": 1
              }
            },
            {
              "name": "limit",
              "in": "query",
              "required": false,
              "schema": {
                "type": "integer",
                "description": "How many lines to return. The count is the FLAG --limit, never a positional word; default 200, ceiling 2000",
                "default": 200,
                "minimum": 1,
                "maximum": 2000,
                "x-snappy-flag": "--limit"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/search": {
        "get": {
          "operationId": "snappy_transcripts_search",
          "summary": "snappy-transcripts search",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "query",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "Search text",
                "x-snappy-position": 0
              }
            },
            {
              "name": "limit",
              "in": "query",
              "required": false,
              "schema": {
                "type": "integer",
                "description": "How many matches to return. The count is the FLAG --limit, never a positional word; default 20, ceiling 200",
                "default": 20,
                "minimum": 1,
                "maximum": 200,
                "x-snappy-flag": "--limit"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      }
    },
    "components": {
      "schemas": {
        "SnappyRefusal": {
          "type": "object",
          "required": [
            "outcome",
            "code",
            "message"
          ],
          "properties": {
            "outcome": {
              "type": "string",
              "const": "refused"
            },
            "code": {
              "type": "string",
              "description": "A row of the closed refusal table."
            },
            "message": {
              "type": "string"
            },
            "fix": {
              "type": "string"
            }
          }
        }
      }
    }
  }
}