{
  "schema": "snappy-card/1",
  "skill": "snappy-database",
  "tier": "public",
  "origin_tier": "base",
  "purpose": "You need to find or query a Xano table. This loader tells you where to look.",
  "verbs": [
    {
      "name": "describe",
      "args": [
        "table"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-database/api.ts describe <table>"
    },
    {
      "name": "query",
      "args": [
        "sql"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-database/api.ts query <sql>"
    },
    {
      "name": "tables",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-database/api.ts tables"
    }
  ],
  "faces": [],
  "agents": [],
  "uses": [],
  "used_by": [],
  "checks": {
    "pass": 39,
    "fail": 8,
    "defer": 14,
    "line": "39 of 47 checks pass",
    "failing": [
      {
        "id": 4,
        "rule": "Near-neighbour descriptions cross-reference each other",
        "says": "near neighbours not named: snappy-runner, snappy-specwatch"
      },
      {
        "id": 8,
        "rule": "Skill body and reference graph stay within disclosure budgets",
        "says": "403 lines; ~8120 tokens; deep reference ../snappy-pipeline/SKILL.md; ../snappy-pipeline/SKILL.md >100 lines without ToC; deep reference ../snappy-infra/auth-reference.md; deep reference ../snappy-xano-dashboard/SKILL.md; ../snappy-xano-dashboard/SKILL.md >100 lines without ToC; deep reference ../snappy-infra/SKILL.md; ../snappy-infra/SKILL.md >100 lines without ToC; deep reference ../snappy-infra/auth-reference.md; deep reference ../snappy-pipeline/data-flow-map.md; ../snappy-pipeline/data-flow-map.md >100 lines without ToC; deep reference ../snappy-knowledge/schemas.md; deep reference ../snappy-freshbooks/api-reference.md; deep reference ../snappy-infra/SKILL.md; ../snappy-infra/SKILL.md >100 lines without ToC; deep reference ../snappy-xano-dashboard/SKILL.md; ../snappy-xano-dashboard/SKILL.md >100 lines without ToC; deep reference ../snappy-xano-mcp/SKILL.md; ../snappy-xano-mcp/SKILL.md >100 lines without ToC"
      },
      {
        "id": 10,
        "rule": "One term names each concept",
        "says": "mixed synonym sets: endpoint/url/route/path, field/box/element"
      },
      {
        "id": 32,
        "rule": "Refusals name a literal from the valid domain",
        "says": "refusals checked against contract literals"
      },
      {
        "id": 40,
        "rule": "Metadata, skill body, and resources follow three-level budgets",
        "says": "metadata ~226 tokens; body ~8120 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",
    "contract.test.ts",
    "query-patterns.md",
    "tables.md",
    "xano-conventions.md"
  ],
  "total_size": 101243,
  "checksum": "sha256:232cb817b06facf62ee67789989f540325107bd687b83660bd97b8eccdb866b6",
  "built_at": "2026-09-09T22:08:42.240Z",
  "openapi": {
    "openapi": "3.1.0",
    "info": {
      "title": "snappy-database",
      "version": "0.0.0",
      "description": "Snappy Database -- single source of truth for the data layer that backs every snappy-* skill. Catalogs every Xano table (Snappy main + Orbiter pipeline), maps each table to the skills that read/write it, documents schema conventions, query patterns, and migration discipline. Sister skill to snappy-infra (which owns the API surface). All other snappy skills should LINK here instead of duplicating schema docs. Triggers on: database, schema, xano table, xano tables, data layer, where is X stored, snappy data, table reference, contacts table, leads table, invoices table, master_person, person_enrich_data, table catalog, data dictionary, xano schema, field reference, primary key, foreign key, relation, dedup key, table id, workspace, api group, who reads this table, who writes this table, source of truth, data ownership, schema migration, add a field, rename a column, dataflow, master mapping."
    },
    "x-snappy-transport": "cli",
    "servers": [
      {
        "url": "npx tsx ~/.claude/skills/snappy-database/api.ts",
        "description": "The hand itself. Every path is a verb word, every query or body key an argument."
      }
    ],
    "paths": {
      "/describe": {
        "get": {
          "operationId": "snappy_database_describe",
          "summary": "snappy-database describe",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "table",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "Table whose columns are described",
                "x-snappy-position": 0
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/query": {
        "get": {
          "operationId": "snappy_database_query",
          "summary": "snappy-database query",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "sql",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "Read-only SQL statement to run",
                "x-snappy-position": 0
              }
            },
            {
              "name": "limit",
              "in": "query",
              "required": false,
              "schema": {
                "type": "integer",
                "description": "How many result rows the answer carries; the cut happens after the engine answers. The count is the FLAG --limit, never a positional word; default 100, ceiling 1000",
                "default": 100,
                "minimum": 1,
                "maximum": 1000,
                "x-snappy-flag": "--limit"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/tables": {
        "get": {
          "operationId": "snappy_database_tables",
          "summary": "snappy-database tables",
          "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": [
      "XANO_METADATA_TOKEN"
    ]
  }
}