{
  "schema": "snappy-card/1",
  "skill": "snappy-os-operator",
  "tier": "public",
  "origin_tier": "base",
  "purpose": "You are operating SnappyOS (local-first governed AI gateway, port 3147) as an",
  "verbs": [
    {
      "name": "approvals",
      "args": [
        "status?"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-os-operator/api.ts approvals"
    },
    {
      "name": "approve",
      "args": [],
      "effect": "write",
      "firstCall": "npx tsx ~/.claude/skills/snappy-os-operator/api.ts approve"
    },
    {
      "name": "deny",
      "args": [],
      "effect": "write",
      "firstCall": "npx tsx ~/.claude/skills/snappy-os-operator/api.ts deny"
    },
    {
      "name": "deploy-truth",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-os-operator/api.ts deploy-truth"
    },
    {
      "name": "grant-create",
      "args": [],
      "effect": "write",
      "firstCall": "npx tsx ~/.claude/skills/snappy-os-operator/api.ts grant-create"
    },
    {
      "name": "grant-update",
      "args": [],
      "effect": "write",
      "firstCall": "npx tsx ~/.claude/skills/snappy-os-operator/api.ts grant-update"
    },
    {
      "name": "health",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-os-operator/api.ts health"
    },
    {
      "name": "run",
      "args": [
        "run-id"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-os-operator/api.ts run <run-id>"
    },
    {
      "name": "runs",
      "args": [
        "script-id?"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-os-operator/api.ts runs"
    },
    {
      "name": "script-create",
      "args": [],
      "effect": "write",
      "firstCall": "npx tsx ~/.claude/skills/snappy-os-operator/api.ts script-create"
    },
    {
      "name": "script-run",
      "args": [],
      "effect": "write",
      "firstCall": "npx tsx ~/.claude/skills/snappy-os-operator/api.ts script-run"
    },
    {
      "name": "script-version",
      "args": [],
      "effect": "write",
      "firstCall": "npx tsx ~/.claude/skills/snappy-os-operator/api.ts script-version"
    },
    {
      "name": "session",
      "args": [],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-os-operator/api.ts session"
    },
    {
      "name": "skill-create",
      "args": [],
      "effect": "write",
      "firstCall": "npx tsx ~/.claude/skills/snappy-os-operator/api.ts skill-create"
    },
    {
      "name": "stage",
      "args": [],
      "effect": "write",
      "firstCall": "npx tsx ~/.claude/skills/snappy-os-operator/api.ts stage"
    }
  ],
  "faces": [],
  "agents": [],
  "uses": [
    "snappy-settings",
    "snappy-dispatch",
    "snappy-faces"
  ],
  "used_by": [],
  "checks": {
    "pass": 39,
    "fail": 10,
    "defer": 12,
    "line": "39 of 49 checks pass",
    "failing": [
      {
        "id": 4,
        "rule": "Near-neighbour descriptions cross-reference each other",
        "says": "near neighbours not named: snappy-client-feisst, snappy-imessage, snappy-runner, snappy-specwatch"
      },
      {
        "id": 5,
        "rule": "Description is valid, third-person, and says what plus when",
        "says": "first/second person"
      },
      {
        "id": 8,
        "rule": "Skill body and reference graph stay within disclosure budgets",
        "says": "250 lines; ~3855 tokens; AGENTS.md >100 lines without ToC"
      },
      {
        "id": 9,
        "rule": "Time-sensitive prose is isolated under Old patterns",
        "says": "1 time-sensitive instruction line(s) outside Old patterns"
      },
      {
        "id": 10,
        "rule": "One term names each concept",
        "says": "mixed synonym sets: endpoint/url/route/path"
      },
      {
        "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 ~242 tokens; body ~3855 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",
    "genui.md",
    "governance.md",
    "refusals.test.ts"
  ],
  "total_size": 64076,
  "checksum": "sha256:5d4f8f8c52499a670f92649dc970d3cfdf3e6594cf241f34a511c3e976cd7367",
  "built_at": "2026-09-09T22:10:02.660Z",
  "openapi": {
    "openapi": "3.1.0",
    "info": {
      "title": "snappy-os-operator",
      "version": "0.0.0",
      "description": "Operate SnappyOS like a pro through product doors only: governed connector reads, staged writes with approvals, grants and delegation, ComposeUI GenUI Live Apps, scripts and runs, in-app skills, deploy truth, the Snappy OS MCP (snappy-render, port 3147). Use when Robert says: /snappy-os-operator, \\\"use the snappy os mcp\\\", \\\"keep using snappy os mcp\\\", \\\"use the snappy os mcp now then\\\", \\\"give the agents the grants they need\\\", \\\"i give you verbal approval\\\", \\\"what about connectors and all that\\\", \\\"is telegram working, are the connectors working\\\", \\\"leverage the mac mini through the snappy os mcp\\\", \\\"approval queue\\\", \\\"staged write\\\", \\\"Live App\\\", \\\"printing press\\\", \\\"cli-regen\\\". Triggers on: snappy os mcp, snappy-render, port 3147, operator session, grants, deploy truth. NOT the deployed Snappy Xano MCP worker (see snappy-xano-mcp). NOT driving the app UI as a user (see snappy-resident). NOT building a new MCP server (see mcp-server-builder)."
    },
    "x-snappy-transport": "cli",
    "servers": [
      {
        "url": "npx tsx ~/.claude/skills/snappy-os-operator/api.ts",
        "description": "The hand itself. Every path is a verb word, every query or body key an argument."
      }
    ],
    "paths": {
      "/approvals": {
        "get": {
          "operationId": "snappy_os_operator_approvals",
          "summary": "snappy-os-operator approvals",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "status",
              "in": "query",
              "required": false,
              "schema": {
                "type": "string",
                "description": "Approval status to filter by",
                "enum": [
                  "pending",
                  "approved",
                  "denied"
                ],
                "x-snappy-position": 0
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/approve": {
        "post": {
          "operationId": "snappy_os_operator_approve",
          "summary": "snappy-os-operator approve",
          "x-snappy-effect": "write",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": false,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {}
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/deny": {
        "post": {
          "operationId": "snappy_os_operator_deny",
          "summary": "snappy-os-operator deny",
          "x-snappy-effect": "write",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": false,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {}
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/deploy-truth": {
        "get": {
          "operationId": "snappy_os_operator_deploy_truth",
          "summary": "snappy-os-operator deploy-truth",
          "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`."
            }
          }
        }
      },
      "/grant-create": {
        "post": {
          "operationId": "snappy_os_operator_grant_create",
          "summary": "snappy-os-operator grant-create",
          "x-snappy-effect": "write",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": false,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {}
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/grant-update": {
        "post": {
          "operationId": "snappy_os_operator_grant_update",
          "summary": "snappy-os-operator grant-update",
          "x-snappy-effect": "write",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": false,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {}
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/health": {
        "get": {
          "operationId": "snappy_os_operator_health",
          "summary": "snappy-os-operator 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`."
            }
          }
        }
      },
      "/run": {
        "get": {
          "operationId": "snappy_os_operator_run",
          "summary": "snappy-os-operator run",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "run-id",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "Run id from `runs`",
                "x-snappy-position": 0
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/runs": {
        "get": {
          "operationId": "snappy_os_operator_runs",
          "summary": "snappy-os-operator runs",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "script-id",
              "in": "query",
              "required": false,
              "schema": {
                "type": "string",
                "description": "Script id from `snappy-os-operator scripts`",
                "x-snappy-position": 0
              }
            },
            {
              "name": "limit",
              "in": "query",
              "required": false,
              "schema": {
                "type": "integer",
                "description": "How many runs to return, newest first. 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`."
            }
          }
        }
      },
      "/script-create": {
        "post": {
          "operationId": "snappy_os_operator_script_create",
          "summary": "snappy-os-operator script-create",
          "x-snappy-effect": "write",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": false,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {}
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/script-run": {
        "post": {
          "operationId": "snappy_os_operator_script_run",
          "summary": "snappy-os-operator script-run",
          "x-snappy-effect": "write",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": false,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {}
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/script-version": {
        "post": {
          "operationId": "snappy_os_operator_script_version",
          "summary": "snappy-os-operator script-version",
          "x-snappy-effect": "write",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": false,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {}
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/session": {
        "post": {
          "operationId": "snappy_os_operator_session",
          "summary": "snappy-os-operator session",
          "x-snappy-effect": "write-reversible",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": false,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {}
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/skill-create": {
        "post": {
          "operationId": "snappy_os_operator_skill_create",
          "summary": "snappy-os-operator skill-create",
          "x-snappy-effect": "write",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": false,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {}
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/stage": {
        "post": {
          "operationId": "snappy_os_operator_stage",
          "summary": "snappy-os-operator stage",
          "x-snappy-effect": "write",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": false,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {}
                }
              }
            }
          },
          "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": [
      "SNAPPY_MASTER_KEY"
    ]
  }
}