{
  "schema": "snappy-card/1",
  "skill": "snappy-positioning",
  "tier": "public",
  "origin_tier": "base",
  "purpose": "You are operating as the upstream contract for how Snappy talks. This file is load-bearing and self-sufficient. You may not read any other files in this skill directory -- every rule you need is here. If a downstream skill disagrees with anything in this file, **this file wins**.",
  "verbs": [
    {
      "name": "banned",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-positioning/api.ts banned"
    },
    {
      "name": "check",
      "args": [
        "text"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-positioning/api.ts check \"<text>\""
    },
    {
      "name": "cite",
      "args": [
        "path-to-draft"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-positioning/api.ts cite <path-to-draft>"
    },
    {
      "name": "flow",
      "args": [
        "path-to-draft"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-positioning/api.ts flow <path-to-draft>"
    },
    {
      "name": "tone",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-positioning/api.ts tone"
    }
  ],
  "faces": [],
  "agents": [],
  "uses": [],
  "used_by": [
    "snappy-ads",
    "snappy-course",
    "snappy-image",
    "snappy-remotion"
  ],
  "checks": {
    "pass": 41,
    "fail": 4,
    "defer": 16,
    "line": "41 of 45 checks pass",
    "failing": [
      {
        "id": 5,
        "rule": "Description is valid, third-person, and says what plus when",
        "says": "no when/use marker"
      },
      {
        "id": 10,
        "rule": "One term names each concept",
        "says": "mixed synonym sets: endpoint/url/route/path"
      },
      {
        "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",
    "council.md",
    "drafts/linkedin-about-raw-2026-04-11.md",
    "drafts/linkedin-about-v2-2026-04-11.md",
    "drafts/linkedin-about-v3-2026-04-11.md",
    "drafts/linkedin-about-v4-2026-04-11.md",
    "drafts/linkedin-about-v5-2026-04-11.md",
    "drafts/linkedin-about-v6-2026-04-11.md",
    "drafts/linkedin-about-v7-2026-04-11.md",
    "messaging.md",
    "refusals.test.ts",
    "surface.md",
    "taglines.md",
    "voice.md"
  ],
  "total_size": 97491,
  "checksum": "sha256:b6b4b3548dc5b22b06ebc110f7c7eec583ffef7f198c581d8fefc9721dd79475",
  "built_at": "2026-09-09T22:10:15.621Z",
  "openapi": {
    "openapi": "3.1.0",
    "info": {
      "title": "snappy-positioning",
      "version": "0.0.0",
      "description": "Canonical source of truth for Snappy messaging, positioning, voice, and brand rules. Every skill that writes or reviews copy reads from here first."
    },
    "x-snappy-transport": "cli",
    "servers": [
      {
        "url": "npx tsx ~/.claude/skills/snappy-positioning/api.ts",
        "description": "The hand itself. Every path is a verb word, every query or body key an argument."
      }
    ],
    "paths": {
      "/banned": {
        "get": {
          "operationId": "snappy_positioning_banned",
          "summary": "snappy-positioning banned",
          "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`."
            }
          }
        }
      },
      "/check": {
        "get": {
          "operationId": "snappy_positioning_check",
          "summary": "snappy-positioning check",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "text",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "The words to use, verbatim",
                "x-snappy-position": 0
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/cite": {
        "get": {
          "operationId": "snappy_positioning_cite",
          "summary": "snappy-positioning cite",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "path-to-draft",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "Path to the draft file being checked",
                "x-snappy-position": 0
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/flow": {
        "get": {
          "operationId": "snappy_positioning_flow",
          "summary": "snappy-positioning flow",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "path-to-draft",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "Path to the draft file being checked",
                "x-snappy-position": 0
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/tone": {
        "get": {
          "operationId": "snappy_positioning_tone",
          "summary": "snappy-positioning tone",
          "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`."
            }
          }
        }
      }
    },
    "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"
            }
          }
        }
      }
    }
  }
}