{
  "schema": "snappy-card/1",
  "skill": "snappy-pipeline",
  "tier": "public",
  "origin_tier": "base",
  "purpose": "Read-only enrichment QA agent for the Orbiter pipeline on Xano instance `xh2o-yths-38lt`. Scans 20+ join tables to verify data from People Data Labs, Enrich Layer, and Fundable/BigQuery landed correctly. Never modifies data.",
  "verbs": [
    {
      "name": "avatars",
      "args": [
        "master-person-id"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-pipeline/api.ts avatars <master-person-id>"
    },
    {
      "name": "batch-overview",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-pipeline/api.ts batch-overview"
    },
    {
      "name": "completeness",
      "args": [
        "master-person-id"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-pipeline/api.ts completeness <master-person-id>"
    },
    {
      "name": "crash-patterns",
      "args": [
        "limit?"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-pipeline/api.ts crash-patterns"
    },
    {
      "name": "data-landing",
      "args": [
        "master-person-id"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-pipeline/api.ts data-landing <master-person-id>"
    },
    {
      "name": "duplicates",
      "args": [
        "master-person-id"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-pipeline/api.ts duplicates <master-person-id>"
    },
    {
      "name": "edge-gaps",
      "args": [
        "master-person-id"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-pipeline/api.ts edge-gaps <master-person-id>"
    },
    {
      "name": "history",
      "args": [
        "master-person-id"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-pipeline/api.ts history <master-person-id>"
    },
    {
      "name": "queue-health",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-pipeline/api.ts queue-health"
    },
    {
      "name": "stuck-analysis",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-pipeline/api.ts stuck-analysis"
    }
  ],
  "faces": [],
  "agents": [],
  "uses": [
    "snappy-client-orbiter"
  ],
  "used_by": [],
  "checks": {
    "pass": 40,
    "fail": 9,
    "defer": 12,
    "line": "40 of 49 checks pass",
    "failing": [
      {
        "id": 8,
        "rule": "Skill body and reference graph stay within disclosure budgets",
        "says": "357 lines; ~4252 tokens; activation-flow.md >100 lines without ToC; endpoints.md >100 lines without ToC; activation-flow.md >100 lines without ToC; endpoints.md >100 lines without ToC; data-flow-map.md >100 lines without ToC; report-format.md >100 lines without ToC; activation-flow.md >100 lines without ToC; endpoints.md >100 lines without ToC; data-flow-map.md >100 lines without ToC; report-format.md >100 lines without ToC"
      },
      {
        "id": 10,
        "rule": "One term names each concept",
        "says": "mixed synonym sets: endpoint/url/route/path"
      },
      {
        "id": 12,
        "rule": "Description contains no unauthorised imperative",
        "says": "unauthorised description imperatives: read"
      },
      {
        "id": 15,
        "rule": "Near-miss keys refuse with the correct contract key",
        "says": "1 refusal(s) omit the correcting key; 0 uncovered; 0 case(s) left unfuzzed because the verb has an outside effect"
      },
      {
        "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 ~216 tokens; body ~4252 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",
    "activation-flow.md",
    "api.ts",
    "data-flow-map.md",
    "diagnostics.md",
    "endpoints.md",
    "refusals.test.ts",
    "repair-playbook.md",
    "report-format.md"
  ],
  "total_size": 111586,
  "checksum": "sha256:789a39af47c5fd3cc2d56df8ab0093e969f24669eaa677112def21ce4ed59fd3",
  "built_at": "2026-09-09T22:10:09.600Z",
  "openapi": {
    "openapi": "3.1.0",
    "info": {
      "title": "snappy-pipeline",
      "version": "0.0.0",
      "description": "Read-only QA agent for Orbiter enrichment pipeline data quality auditing. Scans Xano tables on the Orbiter instance (xh2o-yths-38lt) to verify enrichment data landed correctly from raw JSON sources (People Data Labs, Enrich Layer, Fundable/BigQuery) into 20+ join tables. Runs the eight cyborg diagnostics, names the dominant failure source, and gives Mark a prioritized to-do list -- never modifies data. Powers the Orbiter dev update flow inside snappy-client-orbiter. Triggers on: enrichment QA, data quality audit, data landing check, enrichment scan, pipeline health, crash analysis, duplicate detection, queue health, avatar audit, run diagnostics, check the pipeline, what's broken, enrichment report, orbiter pipeline, stuck records, LLM biography failure, master_person, person_enrich_data, edge gaps, history integrity, batch overview, stuck analysis."
    },
    "x-snappy-transport": "cli",
    "servers": [
      {
        "url": "npx tsx ~/.claude/skills/snappy-pipeline/api.ts",
        "description": "The hand itself. Every path is a verb word, every query or body key an argument."
      }
    ],
    "paths": {
      "/avatars": {
        "get": {
          "operationId": "snappy_pipeline_avatars",
          "summary": "snappy-pipeline avatars",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "master-person-id",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "Identity-graph master person id the pipeline joins on",
                "x-snappy-position": 0
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/batch-overview": {
        "get": {
          "operationId": "snappy_pipeline_batch_overview",
          "summary": "snappy-pipeline batch-overview",
          "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`."
            }
          }
        }
      },
      "/completeness": {
        "get": {
          "operationId": "snappy_pipeline_completeness",
          "summary": "snappy-pipeline completeness",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "master-person-id",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "Identity-graph master person id the pipeline joins on",
                "x-snappy-position": 0
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/crash-patterns": {
        "get": {
          "operationId": "snappy_pipeline_crash_patterns",
          "summary": "snappy-pipeline crash-patterns",
          "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 crash patterns returned",
                "default": 20,
                "maximum": 100,
                "x-snappy-position": 0
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/data-landing": {
        "get": {
          "operationId": "snappy_pipeline_data_landing",
          "summary": "snappy-pipeline data-landing",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "master-person-id",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "Identity-graph master person id the pipeline joins on",
                "x-snappy-position": 0
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/duplicates": {
        "get": {
          "operationId": "snappy_pipeline_duplicates",
          "summary": "snappy-pipeline duplicates",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "master-person-id",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "Identity-graph master person id the pipeline joins on",
                "x-snappy-position": 0
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/edge-gaps": {
        "get": {
          "operationId": "snappy_pipeline_edge_gaps",
          "summary": "snappy-pipeline edge-gaps",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "master-person-id",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "Identity-graph master person id the pipeline joins on",
                "x-snappy-position": 0
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/history": {
        "get": {
          "operationId": "snappy_pipeline_history",
          "summary": "snappy-pipeline history",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "master-person-id",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "Identity-graph master person id the pipeline joins on",
                "x-snappy-position": 0
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/queue-health": {
        "get": {
          "operationId": "snappy_pipeline_queue_health",
          "summary": "snappy-pipeline queue-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`."
            }
          }
        }
      },
      "/stuck-analysis": {
        "get": {
          "operationId": "snappy_pipeline_stuck_analysis",
          "summary": "snappy-pipeline stuck-analysis",
          "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"
            }
          }
        }
      }
    }
  }
}