{
  "schema": "snappy-card/1",
  "skill": "snappy-resident",
  "tier": "public",
  "origin_tier": "base",
  "purpose": "Fable is the app's resident USER — non-stop. Between every fleet event: at",
  "verbs": [],
  "faces": [],
  "agents": [],
  "uses": [],
  "used_by": [],
  "checks": {
    "pass": 26,
    "fail": 8,
    "defer": 27,
    "line": "26 of 34 checks pass",
    "failing": [
      {
        "id": 4,
        "rule": "Near-neighbour descriptions cross-reference each other",
        "says": "near neighbours not named: snappy-client-feisst, snappy-runner, snappy-whatsapp"
      },
      {
        "id": 5,
        "rule": "Description is valid, third-person, and says what plus when",
        "says": "first/second person"
      },
      {
        "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: field/box/element"
      },
      {
        "id": 11,
        "rule": "Each task presents one default, not a menu",
        "says": "1 line(s) present three-way alternative menus"
      },
      {
        "id": 40,
        "rule": "Metadata, skill body, and resources follow three-level budgets",
        "says": "metadata ~227 tokens; body ~4916 tokens"
      },
      {
        "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",
    "refusals.test.ts",
    "want-ledger.md"
  ],
  "total_size": 31696,
  "checksum": "sha256:27bbd8ab49fb38476729a15a6b91ceac2a78701b11a77c6f85547774152291db",
  "built_at": "2026-09-09T22:10:29.255Z",
  "openapi": {
    "openapi": "3.1.0",
    "info": {
      "title": "snappy-resident",
      "version": "0.0.0",
      "description": "The non-stop user seat: drive the Snappy OS app as a real user through a real browser (agent-browser), with seat beats from the five priority pages (Today, Errands, Builder, Needs You, Chat), at least one seat always in the Builder, and fleet-floor rotation. Use when Robert says: /snappy-resident, \\\"why dont you have /snappy-resident going\\\", \\\"keep dogfooding the frontend\\\", \\\"3 opus 5 agents out ALWAYS doing dogfooding and beating the app from the frontend\\\", \\\"keep driving the frontend yourself personally\\\", \\\"use the app heavily and be critical\\\", \\\"your job is to represent ME\\\", \\\"we dont have enough agents doing /snappy-resident\\\". Triggers on: resident, dogfood the app, user seat, seat beat, agent-browser seat, drive the frontend. NOT the coding lane workers on the Mac mini (see snappy-jcode). NOT the agent-browser CLI reference or browser house rules (see agent-browser, snappy-browse)."
    },
    "x-snappy-transport": "cli",
    "servers": [
      {
        "url": "npx tsx ~/.claude/skills/snappy-resident/api.ts",
        "description": "The hand itself. Every path is a verb word, every query or body key an argument."
      }
    ],
    "paths": {},
    "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"
    ]
  }
}