{
  "schema": "snappy-card/1",
  "skill": "snappy-inbox-sweep",
  "tier": "public",
  "origin_tier": "base",
  "purpose": "Compress the \"log into Slack + Gmail + LinkedIn + Skool + StateChange to check messages\" routine into one command. Fetch is deterministic (scripts). Agent judgment only at the reply-drafting step.",
  "verbs": [
    {
      "name": "gmail-personal",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-inbox-sweep/api.ts gmail-personal"
    },
    {
      "name": "gmail-work",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-inbox-sweep/api.ts gmail-work"
    },
    {
      "name": "inbox-zero",
      "args": [],
      "effect": "write",
      "firstCall": "npx tsx ~/.claude/skills/snappy-inbox-sweep/api.ts inbox-zero"
    },
    {
      "name": "send-skool",
      "args": [
        "post-url",
        "text"
      ],
      "effect": "post",
      "firstCall": "npx tsx ~/.claude/skills/snappy-inbox-sweep/api.ts send-skool <post-url> \"<text>\""
    },
    {
      "name": "send-slack",
      "args": [
        "channel",
        "text"
      ],
      "effect": "send",
      "firstCall": "npx tsx ~/.claude/skills/snappy-inbox-sweep/api.ts send-slack <channel> \"<text>\""
    },
    {
      "name": "slack",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-inbox-sweep/api.ts slack"
    },
    {
      "name": "sweep",
      "args": [],
      "effect": "write",
      "firstCall": "npx tsx ~/.claude/skills/snappy-inbox-sweep/api.ts sweep"
    }
  ],
  "faces": [],
  "agents": [],
  "uses": [
    "snappy-settings",
    "snappy-slack",
    "snappy-email",
    "snappy-browse",
    "snappy-inbound"
  ],
  "used_by": [],
  "checks": {
    "pass": 41,
    "fail": 6,
    "defer": 14,
    "line": "41 of 47 checks pass",
    "failing": [
      {
        "id": 23,
        "rule": "Responses obey hard and soft caps",
        "says": "0 hard-cap breach(es); 1 unannounced default-read soft-cap breach(es)"
      },
      {
        "id": 31,
        "rule": "Refusals have outcome, code, message, and fix",
        "says": "refusals schema-checked for outcome/code/message/fix"
      },
      {
        "id": 32,
        "rule": "Refusals name a literal from the valid domain",
        "says": "refusals checked against contract literals"
      },
      {
        "id": 43,
        "rule": "A read is one call, not a queued job",
        "says": "gmail-work:p50>3s-or-missing"
      },
      {
        "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",
    "doors.test.ts",
    "entities.json",
    "gmail-oauth.ts",
    "label-audit.ts",
    "label-clean.ts",
    "label-delete.ts",
    "label-ids.ts",
    "label-nuke.ts",
    "label-sample.ts",
    "linkedin-fetcher.ts",
    "linkedin-sweep-cron.sh",
    "out/2026-04-09T20-46-inbox.json",
    "out/2026-04-10T01-25-inbox.json",
    "out/2026-04-13T13-41-inbox.json",
    "out/2026-04-13T13-42-inbox.json",
    "out/2026-04-13T13-49-inbox.json",
    "out/2026-04-13T13-52-inbox-zero.json",
    "out/2026-04-13T13-52-inbox.json",
    "out/2026-04-13T14-01-inbox-zero.json",
    "out/2026-04-13T14-01-inbox.json",
    "out/2026-04-13T14-02-inbox-zero.json",
    "out/2026-04-13T14-02-inbox.json",
    "out/2026-04-13T14-03-inbox-zero.json",
    "out/2026-04-13T14-03-inbox.json",
    "out/2026-04-13T14-04-inbox-zero.json",
    "out/2026-04-13T14-04-inbox.json",
    "out/2026-04-13T14-05-inbox-zero.json",
    "out/2026-04-13T14-05-inbox.json",
    "out/2026-04-13T14-07-inbox-zero.json",
    "out/2026-04-13T14-07-inbox.json",
    "out/2026-04-13T14-08-inbox-zero.json",
    "out/2026-04-13T14-08-inbox.json",
    "out/2026-04-13T14-09-inbox-zero.json",
    "out/2026-04-13T14-09-inbox.json",
    "out/2026-04-13T14-10-inbox-zero.json",
    "out/2026-04-13T14-10-inbox.json",
    "out/2026-04-13T14-11-inbox-zero.json",
    "out/2026-04-13T14-11-inbox.json",
    "out/2026-04-13T14-12-inbox-zero.json",
    "out/2026-04-13T14-12-inbox.json",
    "out/2026-04-13T14-13-inbox-zero.json",
    "out/2026-04-13T14-13-inbox.json",
    "out/2026-04-13T14-14-inbox-zero.json",
    "out/2026-04-13T14-14-inbox.json",
    "out/2026-04-13T14-39-inbox-zero.json",
    "out/2026-04-13T14-39-inbox.json",
    "out/2026-04-13T14-40-inbox-zero.json",
    "out/2026-04-13T14-40-inbox.json",
    "out/2026-04-13T17-12-inbox-zero.json",
    "out/2026-04-13T17-12-inbox.json",
    "out/2026-04-13T17-13-inbox.json",
    "out/2026-04-13T17-23-inbox.json",
    "out/2026-04-13T17-24-inbox.json",
    "out/2026-04-13T18-35-inbox-zero.json",
    "out/2026-04-13T18-35-inbox.json",
    "out/2026-04-13T18-36-inbox.json",
    "out/2026-04-13T18-40-inbox-zero.json",
    "out/2026-04-13T18-40-inbox.json",
    "out/2026-04-13T19-32-inbox.json",
    "out/2026-04-13T19-38-inbox-zero.json",
    "out/2026-04-13T19-38-inbox.json",
    "out/2026-04-13T20-40-inbox.json",
    "out/2026-04-13T20-41-inbox-zero.json",
    "out/2026-04-13T20-49-inbox-zero.json",
    "out/2026-04-13T20-49-inbox.json",
    "out/2026-04-13T20-51-inbox-zero.json",
    "out/2026-04-13T20-51-inbox.json",
    "out/2026-04-13T21-01-inbox-zero.json",
    "out/2026-04-13T21-01-inbox.json",
    "out/2026-04-13T21-02-inbox-zero.json",
    "out/2026-04-13T21-02-inbox.json",
    "out/2026-04-14T05-07-inbox.json",
    "out/2026-04-15T04-29-inbox.json",
    "out/2026-04-15T04-54-inbox.json",
    "out/2026-04-15T04-59-inbox.json",
    "out/2026-04-15T14-32-inbox.json",
    "out/2026-04-15T16-41-inbox.json",
    "out/2026-04-15T16-46-inbox.json",
    "out/2026-04-15T16-49-inbox.json",
    "skool-fetcher.ts"
  ],
  "total_size": 722492,
  "checksum": "sha256:deb5cd32fa95b0dc879b1bc359ffe9dae3325d934e7089eceaab7c7956790cdc",
  "built_at": "2026-09-09T22:09:37.829Z",
  "openapi": {
    "openapi": "3.1.0",
    "info": {
      "title": "snappy-inbox-sweep",
      "version": "0.0.0",
      "description": "Deterministic sweep across every inbox Robert has to check (Slack, Gmail, LinkedIn DMs, Skool community, StateChange community, WhatsApp). Fetches unread via scripts (no agents), drafts replies in Robert's tone, presents them inline for approval, sends approved replies. Triggers on: inbox sweep, check messages, check inbox, check all messages, sweep inboxes, unread, triage inbox, inbox zero."
    },
    "x-snappy-transport": "cli",
    "servers": [
      {
        "url": "npx tsx ~/.claude/skills/snappy-inbox-sweep/api.ts",
        "description": "The hand itself. Every path is a verb word, every query or body key an argument."
      }
    ],
    "paths": {
      "/gmail-personal": {
        "get": {
          "operationId": "snappy_inbox_sweep_gmail_personal",
          "summary": "snappy-inbox-sweep gmail-personal",
          "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`."
            }
          }
        }
      },
      "/gmail-work": {
        "get": {
          "operationId": "snappy_inbox_sweep_gmail_work",
          "summary": "snappy-inbox-sweep gmail-work",
          "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`."
            }
          }
        }
      },
      "/inbox-zero": {
        "post": {
          "operationId": "snappy_inbox_sweep_inbox_zero",
          "summary": "snappy-inbox-sweep inbox-zero",
          "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`."
            }
          }
        }
      },
      "/send-skool": {
        "post": {
          "operationId": "snappy_inbox_sweep_send_skool",
          "summary": "snappy-inbox-sweep send-skool",
          "x-snappy-effect": "post",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "post-url": {
                      "type": "string",
                      "description": "Skool post the reply is filed under",
                      "x-snappy-position": 0
                    },
                    "text": {
                      "type": "string",
                      "description": "The message body other people will read",
                      "x-snappy-position": 1
                    }
                  },
                  "required": [
                    "post-url",
                    "text"
                  ]
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/send-slack": {
        "post": {
          "operationId": "snappy_inbox_sweep_send_slack",
          "summary": "snappy-inbox-sweep send-slack",
          "x-snappy-effect": "send",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": true,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "channel": {
                      "type": "string",
                      "description": "Slack channel the message is sent to",
                      "x-snappy-position": 0
                    },
                    "text": {
                      "type": "string",
                      "description": "The message body other people will read",
                      "x-snappy-position": 1
                    },
                    "json": {
                      "x-snappy-flag": "--json"
                    }
                  },
                  "required": [
                    "channel",
                    "text"
                  ]
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/slack": {
        "get": {
          "operationId": "snappy_inbox_sweep_slack",
          "summary": "snappy-inbox-sweep slack",
          "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`."
            }
          }
        }
      },
      "/sweep": {
        "post": {
          "operationId": "snappy_inbox_sweep_sweep",
          "summary": "snappy-inbox-sweep sweep",
          "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": [
      "GOOGLE_CLIENT_ID",
      "GOOGLE_CLIENT_SECRET",
      "GOOGLE_SERVICE_ACCOUNT_EMAIL",
      "GOOGLE_SERVICE_ACCOUNT_KEY",
      "SLACK_BOT_TOKEN",
      "SLACK_USER_TOKEN"
    ]
  }
}