{
  "schema": "snappy-card/1",
  "skill": "snappy-maintenance",
  "tier": "public",
  "origin_tier": "base",
  "purpose": "You are operating the project maintenance skill for every Snappy-managed system. Covers dependency hygiene, six-dimension health checks, code cleanup, log monitoring, and a weekly cadence wired into snappy-ops. Reports go through snappy-telegram (alerts) and snappy-update (client visibility).",
  "verbs": [
    {
      "name": "all",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-maintenance/api.ts all"
    },
    {
      "name": "check",
      "args": [
        "url"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-maintenance/api.ts check <url>"
    },
    {
      "name": "ssl",
      "args": [
        "domain"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-maintenance/api.ts ssl <domain>"
    }
  ],
  "faces": [],
  "agents": [],
  "uses": [],
  "used_by": [],
  "checks": {
    "pass": 41,
    "fail": 8,
    "defer": 12,
    "line": "41 of 49 checks pass",
    "failing": [
      {
        "id": 4,
        "rule": "Near-neighbour descriptions cross-reference each other",
        "says": "near neighbours not named: snappy-client-feisst"
      },
      {
        "id": 10,
        "rule": "One term names each concept",
        "says": "mixed synonym sets: endpoint/url/route/path"
      },
      {
        "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 ~209 tokens; body ~4833 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",
    "scripts/health-sweep.sh"
  ],
  "total_size": 46759,
  "checksum": "sha256:7e0d430aa97c8bd7609b3e07e0a5c8783899103da7611b5f3b851816ec6b4930",
  "built_at": "2026-09-09T22:09:50.078Z",
  "openapi": {
    "openapi": "3.1.0",
    "info": {
      "title": "snappy-maintenance",
      "version": "0.0.0",
      "description": "Snappy project maintenance -- keeping all client and internal systems healthy across Vercel, Fly.io, Cloudflare Workers, Supabase, Xano, and the Mac Mini Box server. Covers dependency management, health checks (API uptime, queue depth, cron status, Xano workspace health, deployed worker health, gateway availability), code cleanup, log monitoring, weekly maintenance schedule, and post-maintenance redeployment hand-off. Triggers on: maintenance, health check, dependencies, outdated, update packages, cleanup, monitoring, npm outdated, check health, project health, dead code, unused dependencies, weekly maintenance, api uptime, queue depth, cron status, xano health, worker health, gateway health, npm audit, fly logs, security advisories, ts-prune, depcheck, lint fix, weekly schedule, monday checks, friday cleanup, alert robert."
    },
    "x-snappy-transport": "cli",
    "servers": [
      {
        "url": "npx tsx ~/.claude/skills/snappy-maintenance/api.ts",
        "description": "The hand itself. Every path is a verb word, every query or body key an argument."
      }
    ],
    "paths": {
      "/all": {
        "get": {
          "operationId": "snappy_maintenance_all",
          "summary": "snappy-maintenance all",
          "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 checks to return. The count is the FLAG --limit, never a positional word; default 20, ceiling 200",
                "default": 20,
                "minimum": 1,
                "maximum": 200,
                "x-snappy-flag": "--limit"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/check": {
        "get": {
          "operationId": "snappy_maintenance_check",
          "summary": "snappy-maintenance check",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "url",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "URL whose reachability is checked",
                "x-snappy-position": 0
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/ssl": {
        "get": {
          "operationId": "snappy_maintenance_ssl",
          "summary": "snappy-maintenance ssl",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "domain",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "Domain whose certificate expiry is read",
                "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"
            }
          }
        }
      }
    }
  }
}