{
  "schema": "snappy-card/1",
  "skill": "snappy-hands",
  "tier": "public",
  "origin_tier": "base",
  "purpose": "1. `node ~/.claude/skills/snappy-hands/api.ts census` — the ready skills on this Mac. Trust it over any list in prose.",
  "verbs": [
    {
      "name": "census",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-hands/api.ts census"
    }
  ],
  "faces": [],
  "agents": [],
  "uses": [],
  "used_by": [],
  "checks": {
    "pass": 43,
    "fail": 4,
    "defer": 14,
    "line": "43 of 47 checks pass",
    "failing": [
      {
        "id": 4,
        "rule": "Near-neighbour descriptions cross-reference each other",
        "says": "near neighbours not named: snappy-imessage, snappy-runner, snappy-specwatch"
      },
      {
        "id": 12,
        "rule": "Description contains no unauthorised imperative",
        "says": "unauthorised description imperatives: read"
      },
      {
        "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-derive.ts",
    "contract-overrides.json",
    "contract.test.ts",
    "package-lock.json",
    "package.json"
  ],
  "total_size": 53476,
  "checksum": "sha256:f38a375ccd3ede8960c657682e2370ff1a90d65010834f38b41f45f57d1dea95",
  "built_at": "2026-09-09T22:09:29.019Z",
  "openapi": {
    "openapi": "3.1.0",
    "info": {
      "title": "snappy-hands",
      "version": "0.0.0",
      "description": "THE HANDS OF AN AGENT ON THIS MAC -- how an agent in a Snappy room uses the kernel skills installed on the machine it runs on (Gmail, Telegram, Notion, transcripts, video, browse, and the rest), which of them are ready here, how to run them with plain node, and the one rule for sends. Read this first in any room; it replaces looking up Snappy doors before doing work. Triggers on: hands, what can this mac do, which skills are ready, run a skill, kernel skills, the one rule for sends."
    },
    "x-snappy-transport": "cli",
    "servers": [
      {
        "url": "npx tsx ~/.claude/skills/snappy-hands/api.ts",
        "description": "The hand itself. Every path is a verb word, every query or body key an argument."
      }
    ],
    "paths": {
      "/census": {
        "get": {
          "operationId": "snappy_hands_census",
          "summary": "snappy-hands census",
          "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`."
            }
          }
        }
      }
    },
    "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"
            }
          }
        }
      }
    }
  }
}