{
  "schema": "snappy-card/1",
  "skill": "snappy-box",
  "tier": "public",
  "origin_tier": "base",
  "purpose": "Box is a self-editing Express server running on Robert's Mac Mini (Docker, Node 20,",
  "verbs": [
    {
      "name": "call",
      "args": [
        "method",
        "path",
        "json-body?"
      ],
      "effect": "write",
      "firstCall": "npx tsx ~/.claude/skills/snappy-box/api.ts call <method> <path>"
    },
    {
      "name": "routes",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-box/api.ts routes"
    },
    {
      "name": "sql",
      "args": [
        "query"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-box/api.ts sql \"<query>\""
    }
  ],
  "faces": [],
  "agents": [],
  "uses": [
    "snappy-infra",
    "snappy-github"
  ],
  "used_by": [],
  "checks": {
    "pass": 41,
    "fail": 6,
    "defer": 14,
    "line": "41 of 47 checks pass",
    "failing": [
      {
        "id": 8,
        "rule": "Skill body and reference graph stay within disclosure budgets",
        "says": "331 lines; ~3919 tokens; deep reference ../snappy-infra/auth-reference.md; endpoints.md >100 lines without ToC; endpoints.md >100 lines without ToC; endpoints.md >100 lines without ToC; writing-routes.md >100 lines without ToC; tables.md >100 lines without ToC; writing-routes.md >100 lines without ToC; endpoints.md >100 lines without ToC; writing-routes.md >100 lines without ToC; tables.md >100 lines without ToC"
      },
      {
        "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 ~197 tokens; body ~3919 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",
    "endpoints.md",
    "operations.md",
    "tables.md",
    "writing-routes.md"
  ],
  "total_size": 83583,
  "checksum": "sha256:9863eb3c7dd2ad9d96dd04eda5c99b906020ec43555fc14da1f9844786df13be",
  "built_at": "2026-09-09T22:08:14.360Z",
  "openapi": {
    "openapi": "3.1.0",
    "info": {
      "title": "snappy-box",
      "version": "0.0.0",
      "description": "Box server -- self-editing Express server on Mac Mini (Docker, Node 20, 180+ routes) exposing HTTP API for route deployment, state, cache, secrets, functions, daemons, packs, pages, SQL, AI generation, capability registry, and autonomous agents. Covers curl patterns, MCP→HTTP mapping, sandbox helpers, self-modifying routes, daemon agent template (observe/think/act/record), capability search-before-build, dependency tracing, pack organization. Triggers on: box server, box api, deploy route, mac mini server, self-editing server, daemon agent, cron job agent, self-modifying, spawn route, capability registry, box sql, box state, box cache, box secrets, box functions, box pulse, /_deploy, /_daemon, /system/sql, route sandbox, pack organization, dependency tracing, autonomous agent."
    },
    "x-snappy-transport": "cli",
    "servers": [
      {
        "url": "npx tsx ~/.claude/skills/snappy-box/api.ts",
        "description": "The hand itself. Every path is a verb word, every query or body key an argument."
      }
    ],
    "paths": {
      "/call": {
        "post": {
          "operationId": "snappy_box_call",
          "summary": "snappy-box call",
          "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": {
                    "method": {
                      "type": "string",
                      "description": "HTTP method for the call",
                      "enum": [
                        "GET",
                        "POST",
                        "PATCH",
                        "PUT",
                        "DELETE"
                      ],
                      "x-snappy-position": 0
                    },
                    "path": {
                      "type": "string",
                      "description": "Route path on the box, beginning with a slash",
                      "x-snappy-position": 1
                    },
                    "json-body": {
                      "type": "string",
                      "description": "JSON request body; omit for a body-less method",
                      "x-snappy-position": 2
                    }
                  },
                  "required": [
                    "method",
                    "path"
                  ]
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/routes": {
        "get": {
          "operationId": "snappy_box_routes",
          "summary": "snappy-box routes",
          "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`."
            }
          }
        }
      },
      "/sql": {
        "get": {
          "operationId": "snappy_box_sql",
          "summary": "snappy-box sql",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "query",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "Read-only SQL statement to run against the box",
                "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"
            }
          }
        }
      }
    }
  }
}