{
  "schema": "snappy-card/1",
  "skill": "snappy-sales",
  "tier": "public",
  "origin_tier": "base",
  "purpose": "You are operating as the sales channel for Snappy. This file is the operational contract. The full SKILL.md exists for reference but the rules below are load-bearing -- if you deviate, the deal is lost or the wrong member gets in.",
  "verbs": [
    {
      "name": "clients",
      "args": [
        "limit?"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-sales/api.ts clients"
    },
    {
      "name": "leads",
      "args": [
        "stage?"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-sales/api.ts leads"
    },
    {
      "name": "log",
      "args": [
        "contact-id",
        "note"
      ],
      "effect": "write",
      "firstCall": "npx tsx ~/.claude/skills/snappy-sales/api.ts log <contact-id> <note>"
    }
  ],
  "faces": [],
  "agents": [],
  "uses": [],
  "used_by": [
    "snappy-calendar",
    "snappy-offer"
  ],
  "checks": {
    "pass": 41,
    "fail": 6,
    "defer": 14,
    "line": "41 of 47 checks pass",
    "failing": [
      {
        "id": 5,
        "rule": "Description is valid, third-person, and says what plus when",
        "says": "no when/use marker"
      },
      {
        "id": 8,
        "rule": "Skill body and reference graph stay within disclosure budgets",
        "says": "267 lines; ~2869 tokens; call-framework.md >100 lines without ToC; deep reference ../snappy-offer/pricing.md; call-framework.md >100 lines without ToC; call-framework.md >100 lines without ToC; deep reference ../snappy-offer/SKILL.md; ../snappy-offer/SKILL.md >100 lines without ToC; deep reference ../snappy-knowledge/SKILL.md; ../snappy-knowledge/SKILL.md >100 lines without ToC; deep reference ../snappy-calendar/SKILL.md; ../snappy-calendar/SKILL.md >100 lines without ToC; deep reference ../snappy-freshbooks/SKILL.md; ../snappy-freshbooks/SKILL.md >100 lines without ToC; deep reference ../snappy-linkedin/SKILL.md; ../snappy-linkedin/SKILL.md >100 lines without ToC; deep reference ../snappy-clients/SKILL.md; ../snappy-clients/SKILL.md >100 lines without ToC; call-framework.md >100 lines without ToC"
      },
      {
        "id": 23,
        "rule": "Responses obey hard and soft caps",
        "says": "1 hard-cap breach(es); 2 unannounced default-read soft-cap breach(es)"
      },
      {
        "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",
    "call-framework.md",
    "entities.json",
    "funnels.md",
    "gotchas.md",
    "lead-to-close.md",
    "pipeline.md",
    "refusals.test.ts"
  ],
  "total_size": 73078,
  "checksum": "sha256:821b03ad2d2ca17fd15e8f10eefebd39d50f8998f933f6842dbbce2108741a07",
  "built_at": "2026-09-09T22:10:39.500Z",
  "openapi": {
    "openapi": "3.1.0",
    "info": {
      "title": "snappy-sales",
      "version": "0.0.0",
      "description": "Snappy sales process -- high-ticket mastermind sales calls, pipeline tracking, lead-to-close workflow, launch funnels, opportunity funnels, lead scoring, pricing calls, prospect research, and post-call follow-up. Based on WeTube SS Week 2. Use this skill for sales call prep, pipeline review, qualifying leads, building or reviewing launch/opportunity funnels, pricing decisions, post-call follow-up sequences, lead-to-close workflow, stale lead triage, objection handling, discovery call, demo call, book a call, sales metrics, sales CRM, close a deal, MRR, mastermind sales."
    },
    "x-snappy-transport": "cli",
    "servers": [
      {
        "url": "npx tsx ~/.claude/skills/snappy-sales/api.ts",
        "description": "The hand itself. Every path is a verb word, every query or body key an argument."
      }
    ],
    "paths": {
      "/clients": {
        "get": {
          "operationId": "snappy_sales_clients",
          "summary": "snappy-sales clients",
          "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": "Maximum clients returned",
                "default": 20,
                "maximum": 100,
                "x-snappy-position": 0
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/leads": {
        "get": {
          "operationId": "snappy_sales_leads",
          "summary": "snappy-sales leads",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "stage",
              "in": "query",
              "required": false,
              "schema": {
                "type": "string",
                "description": "Pipeline stage to filter leads by; omit for every stage",
                "x-snappy-position": 0
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/log": {
        "post": {
          "operationId": "snappy_sales_log",
          "summary": "snappy-sales log",
          "x-snappy-effect": "write",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "contact-id": {
                      "type": "string",
                      "description": "Contact id from the outbound contact list",
                      "x-snappy-position": 0
                    },
                    "note": {
                      "type": "string",
                      "description": "Free-text note stored with the record",
                      "x-snappy-position": 1
                    }
                  },
                  "required": [
                    "contact-id",
                    "note"
                  ]
                }
              }
            }
          },
          "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"
            }
          }
        }
      }
    },
    "x-snappy-requires": [
      "XANO_METADATA_TOKEN"
    ]
  }
}