{
  "schema": "snappy-card/1",
  "skill": "snappy-website",
  "tier": "public",
  "origin_tier": "base",
  "purpose": "You are operating as the website 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, you will ship a regression to the live marketing site.",
  "verbs": [
    {
      "name": "deploys",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-website/api.ts deploys"
    },
    {
      "name": "health",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-website/api.ts health"
    }
  ],
  "faces": [],
  "agents": [],
  "uses": [],
  "used_by": [
    "snappy-email"
  ],
  "checks": {
    "pass": 41,
    "fail": 6,
    "defer": 14,
    "line": "41 of 47 checks pass",
    "failing": [
      {
        "id": 9,
        "rule": "Time-sensitive prose is isolated under Old patterns",
        "says": "2 time-sensitive instruction line(s) outside Old patterns"
      },
      {
        "id": 10,
        "rule": "One term names each concept",
        "says": "mixed synonym sets: endpoint/url/route/path"
      },
      {
        "id": 40,
        "rule": "Metadata, skill body, and resources follow three-level budgets",
        "says": "metadata ~198 tokens; body ~3855 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",
    "conversion-tracking.md",
    "deployment.md",
    "evidence.test.ts",
    "page-templates.md",
    "refusals.test.ts",
    "vsl-funnel.md"
  ],
  "total_size": 64270,
  "checksum": "sha256:10fefe5cc4dd89dad2501ac8166039b16abf21f9f7637e300c2a992e3096fef5",
  "built_at": "2026-09-09T22:11:28.412Z",
  "openapi": {
    "openapi": "3.1.0",
    "info": {
      "title": "snappy-website",
      "version": "0.0.0",
      "description": "Snappy website (snappy.ai) operations -- Next.js + Vercel marketing site, VSL conversion funnel, blog hosting, contact form, and the central traffic engine that every other Snappy skill funnels into. Owns page templates, conversion tracking, deployment pipeline, and rollback. ActiveCampaign is NOT in use; email goes through Xano/Gmail. Live repo at github.com/roboulos/v0-snappy-website-0c, local at .openclaw/workspace. Triggers on: snappy website, snappy.ai, update website, landing page, VSL funnel, optin page, application form, schedule call page, traffic engine, conversion optimization, contact form, add case study, deploy website, vercel deploy, blog page, website SEO, hero section, header, footer, offerings, services page, page templates, marketing site, snappy-website-claude."
    },
    "x-snappy-transport": "cli",
    "servers": [
      {
        "url": "npx tsx ~/.claude/skills/snappy-website/api.ts",
        "description": "The hand itself. Every path is a verb word, every query or body key an argument."
      }
    ],
    "paths": {
      "/deploys": {
        "get": {
          "operationId": "snappy_website_deploys",
          "summary": "snappy-website deploys",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "json",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--json"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/health": {
        "get": {
          "operationId": "snappy_website_health",
          "summary": "snappy-website health",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [],
          "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": [
      "VERCEL_TOKEN"
    ]
  }
}