{
  "schema": "snappy-card/1",
  "skill": "snappy-testimonials",
  "tier": "public",
  "origin_tier": "base",
  "purpose": "Testimonial sourcing engine. Scans Krisp transcripts (via `snappy-transcripts` quote-mining",
  "verbs": [
    {
      "name": "list",
      "args": [
        "status?"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-testimonials/api.ts list"
    },
    {
      "name": "score",
      "args": [
        "text",
        "speaker?"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-testimonials/api.ts score \"<text>\""
    }
  ],
  "faces": [],
  "agents": [],
  "uses": [],
  "used_by": [],
  "checks": {
    "pass": 36,
    "fail": 11,
    "defer": 14,
    "line": "36 of 47 checks pass",
    "failing": [
      {
        "id": 4,
        "rule": "Near-neighbour descriptions cross-reference each other",
        "says": "near neighbours not named: snappy-client-feisst"
      },
      {
        "id": 5,
        "rule": "Description is valid, third-person, and says what plus when",
        "says": "first/second person"
      },
      {
        "id": 8,
        "rule": "Skill body and reference graph stay within disclosure budgets",
        "says": "280 lines; ~4698 tokens; deep reference ../snappy-transcripts/quote-mining.md; deep reference ../snappy-transcripts/krisp-integration.md; deep reference ../snappy-transcripts/quote-mining.md; deep reference ../snappy-transcripts/quote-mining.md; deep reference ../snappy-knowledge/schemas.md; deep reference ../snappy-content/anti-ai-checklist.md"
      },
      {
        "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": "5 line(s) present three-way alternative menus"
      },
      {
        "id": 15,
        "rule": "Near-miss keys refuse with the correct contract key",
        "says": "0 refusal(s) omit the correcting key; 1 uncovered; 0 case(s) left unfuzzed because the verb has an outside effect"
      },
      {
        "id": 24,
        "rule": "Answer size is bounded by requested limit",
        "says": "unbounded growth: list:non-monotone"
      },
      {
        "id": 40,
        "rule": "Metadata, skill body, and resources follow three-level budgets",
        "says": "metadata ~235 tokens; body ~4698 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.ts",
    "entities.json",
    "permission-templates.md",
    "quote-rubric.md",
    "refusals.test.ts",
    "scripts/scan-testimonials.sh",
    "xano-tracking.md"
  ],
  "total_size": 71626,
  "checksum": "sha256:23704a9f34b8a30b39627a0c2b01020b3c85ddd34dda680509c83e672675fde1",
  "built_at": "2026-09-09T22:11:12.308Z",
  "openapi": {
    "openapi": "3.1.0",
    "info": {
      "title": "snappy-testimonials",
      "version": "0.0.0",
      "description": "Snappy Testimonials -- scans client meeting transcripts (Krisp) and the knowledge graph for positive client quotes, ranks them against a quality rubric, presents the best candidates to Robert with full context, drafts a casual permission-request message in Robert's voice, and tracks approvals so the same quote is never asked twice. The testimonial sourcing engine for the entire snappy system. Triggers on: testimonial, testimonials, social proof, client quote, client praise, find a quote, find quotes, scan transcripts for, mine quotes, find a testimonial, client said, what did the client say, praise from client, get a testimonial, can I use this quote, ask permission for quote, testimonial permission, testimonial request, client kind words, good things clients said, source a testimonial, testimonial scan, monthly testimonial scan, client compliments, kind words from, quote request, testimonial pipeline, approved testimonials."
    },
    "x-snappy-transport": "cli",
    "servers": [
      {
        "url": "npx tsx ~/.claude/skills/snappy-testimonials/api.ts",
        "description": "The hand itself. Every path is a verb word, every query or body key an argument."
      }
    ],
    "paths": {
      "/list": {
        "get": {
          "operationId": "snappy_testimonials_list",
          "summary": "snappy-testimonials list",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "status",
              "in": "query",
              "required": false,
              "schema": {
                "type": "string",
                "description": "Testimonial status to filter by",
                "x-snappy-position": 0
              }
            },
            {
              "name": "limit",
              "in": "query",
              "required": false,
              "schema": {
                "type": "integer",
                "description": "How many testimonials 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`."
            }
          }
        }
      },
      "/score": {
        "get": {
          "operationId": "snappy_testimonials_score",
          "summary": "snappy-testimonials score",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "text",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "The words to use, verbatim",
                "x-snappy-position": 0
              }
            },
            {
              "name": "speaker",
              "in": "query",
              "required": false,
              "schema": {
                "type": "string",
                "description": "Name of the person who said it",
                "x-snappy-position": 1
              }
            }
          ],
          "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"
            }
          }
        }
      }
    }
  }
}