{
  "schema": "snappy-card/1",
  "skill": "snappy-krisp",
  "tier": "public",
  "origin_tier": "base",
  "purpose": "- A snappy-ops recipe needs Robert's pending commitments from recent meetings",
  "verbs": [
    {
      "name": "fetch-meetings",
      "args": [
        "after-date?"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-krisp/api.ts fetch-meetings"
    },
    {
      "name": "fetch-document",
      "args": [
        "meeting-id"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-krisp/api.ts fetch-document <meeting-id>"
    },
    {
      "name": "fetch-action-items",
      "args": [
        "limit?"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-krisp/api.ts fetch-action-items"
    },
    {
      "name": "metrics",
      "args": [
        "name"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-krisp/api.ts metrics \"<name>\""
    }
  ],
  "faces": [],
  "agents": [],
  "uses": [],
  "used_by": [],
  "checks": {
    "pass": 50,
    "fail": 4,
    "defer": 7,
    "line": "50 of 54 checks pass",
    "failing": [
      {
        "id": 7,
        "rule": "Promised and declared verbs have no set difference",
        "says": "promised-only=[pending-for, since, commitments, tool-mentions]; loader-missing=[]"
      },
      {
        "id": 43,
        "rule": "A read is one call, not a queued job",
        "says": "fetch-meetings:p50>3s-or-missing, fetch-action-items:p50>3s-or-missing"
      },
      {
        "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",
    "contract.test.ts",
    "entities.json",
    "faces/components/krisp-faces.css",
    "faces/components/krisp-faces.tsx",
    "faces/family.tsx",
    "faces/fixtures/krisp-actions.json",
    "faces/fixtures/krisp-hits.json",
    "faces/fixtures/krisp-meeting.json",
    "metrics.json"
  ],
  "total_size": 60775,
  "checksum": "sha256:d03468037974661da9bb8bad66105abccb89ab3f78fe6a446c5d818b9e57b095",
  "built_at": "2026-09-09T22:09:45.020Z",
  "openapi": {
    "openapi": "3.1.0",
    "info": {
      "title": "snappy-krisp",
      "version": "0.0.0",
      "description": "Turn Krisp meeting data into structured work for the snappy-ops chassis. Triggers on: action item extraction, meeting commitment tracking, tool-mention scouting, assignee filtering, dormant-ask detection."
    },
    "x-snappy-transport": "cli",
    "servers": [
      {
        "url": "npx tsx ~/.claude/skills/snappy-krisp/api.ts",
        "description": "The hand itself. Every path is a verb word, every query or body key an argument."
      }
    ],
    "paths": {
      "/fetch-meetings": {
        "get": {
          "operationId": "snappy_krisp_fetch_meetings",
          "summary": "snappy-krisp fetch-meetings",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "after-date",
              "in": "query",
              "required": false,
              "schema": {
                "type": "string",
                "description": "ISO date; only meetings after it are returned",
                "x-snappy-position": 0
              }
            },
            {
              "name": "limit",
              "in": "query",
              "required": false,
              "schema": {
                "type": "integer",
                "description": "How many meetings to return; the count is the FLAG --limit, never the second word",
                "default": 20,
                "maximum": 200,
                "x-snappy-flag": "--limit"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/fetch-document": {
        "get": {
          "operationId": "snappy_krisp_fetch_document",
          "summary": "snappy-krisp fetch-document",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "meeting-id",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "Meeting whose transcript document is read",
                "x-snappy-position": 0
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/fetch-action-items": {
        "get": {
          "operationId": "snappy_krisp_fetch_action_items",
          "summary": "snappy-krisp fetch-action-items",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "limit",
              "in": "query",
              "required": false,
              "schema": {
                "type": "integer",
                "description": "How many action items to return",
                "default": 50,
                "maximum": 500,
                "x-snappy-position": 0
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/metrics": {
        "get": {
          "operationId": "snappy_krisp_metrics",
          "summary": "snappy-krisp metrics",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "parameters": [
            {
              "name": "name",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "Name of the Krisp metric to compute",
                "x-snappy-position": 0
              }
            }
          ],
          "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"
            }
          }
        }
      }
    }
  }
}