{
  "schema": "snappy-card/1",
  "skill": "snappy-content",
  "tier": "public",
  "origin_tier": "base",
  "purpose": "You are operating as the content methodology layer for Snappy. This file is the operational contract. The full SKILL.md and supporting docs exist for reference but the rules below are load-bearing -- if you deviate, the content sounds like ChatGPT and gets killed at the council gate.",
  "verbs": [
    {
      "name": "atoms",
      "args": [
        "status?"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-content/api.ts atoms"
    },
    {
      "name": "draft-new",
      "args": [
        "slug",
        "path",
        "topic"
      ],
      "effect": "draft",
      "firstCall": "npx tsx ~/.claude/skills/snappy-content/api.ts draft-new <slug> <path> <topic>"
    },
    {
      "name": "metrics",
      "args": [
        "name"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-content/api.ts metrics \"<name>\""
    },
    {
      "name": "status",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-content/api.ts status"
    },
    {
      "name": "tick",
      "args": [
        "slug"
      ],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-content/api.ts tick <slug>"
    },
    {
      "name": "tick-all",
      "args": [],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-content/api.ts tick-all"
    }
  ],
  "faces": [],
  "agents": [],
  "uses": [],
  "used_by": [
    "snappy-ads",
    "snappy-course",
    "snappy-email",
    "snappy-image",
    "snappy-remotion"
  ],
  "checks": {
    "pass": 37,
    "fail": 8,
    "defer": 16,
    "line": "37 of 45 checks pass",
    "failing": [
      {
        "id": 4,
        "rule": "Near-neighbour descriptions cross-reference each other",
        "says": "near neighbours not named: snappy-client-feisst, snappy-runner, snappy-slack, 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": "366 lines; ~4806 tokens; pipeline-architecture.md >100 lines without ToC; quality-rules.md >100 lines without ToC; pipeline-architecture.md >100 lines without ToC; expert-council-method.md >100 lines without ToC; carousel-method.md >100 lines without ToC"
      },
      {
        "id": 10,
        "rule": "One term names each concept",
        "says": "mixed synonym sets: endpoint/url/route/path"
      },
      {
        "id": 40,
        "rule": "Metadata, skill body, and resources follow three-level budgets",
        "says": "metadata ~253 tokens; body ~4806 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",
    "anti-ai-checklist.md",
    "api.ts",
    "carousel-method.md",
    "contract.test.ts",
    "data/README.md",
    "data/drafts/agentation-ui-feedback.md",
    "data/drafts/capture-at-peak-context.md",
    "data/drafts/claude-code-mastery-launch.md",
    "data/drafts/claude-code-mastery-meetup-scope-bug.md",
    "data/drafts/claude-code-mastery-phone-agents.md",
    "data/drafts/claude-code-mastery-ralph-early-stop.md",
    "data/drafts/claude-code-meetup-weekly.md",
    "data/drafts/claude-code-phone-agents-course.md",
    "data/drafts/claude-desktop-computer-use.md",
    "data/drafts/clear-box-not-black-box.md",
    "data/drafts/clone-sdk-repo.md",
    "data/drafts/compact-at-fifty-percent.md",
    "data/drafts/compound-probability-pipelines.md",
    "data/drafts/dedicated-agentic-machine.md",
    "data/drafts/devon-review-loop.md",
    "data/drafts/dspy-browser-automation.md",
    "data/drafts/everything-must-be-an-agent.md",
    "data/drafts/fresh-machine-ai-paired.md",
    "data/drafts/harness-before-model.md",
    "data/drafts/hookdeck-webhook-migration.md",
    "data/drafts/krisp-mcp-content-pipeline.md",
    "data/drafts/mac-mini-home-base.md",
    "data/drafts/marker-io-bug-pipeline.md",
    "data/drafts/mcp-meta-tools.md",
    "data/drafts/mcp-two-hours-skill-for-skills.md",
    "data/drafts/precommit-over-ci.md",
    "data/drafts/scripts-and-souls.md",
    "data/drafts/self-correcting-playbooks.md",
    "data/drafts/skill-files-ground-truth.md",
    "data/drafts/skill-files-what-and-why.md",
    "data/drafts/skills-gateway-cli.md",
    "data/drafts/soul-files-agent-costs.md",
    "data/drafts/storybook-ai-guardrail.md",
    "data/drafts/termius-phone-agents.md",
    "data/drafts/test-cite-mode.md",
    "data/drafts/thin-frontend-api-backend.md",
    "data/drafts/trust-visibility-agents.md",
    "data/drafts/two-pass-cheap-expensive.md",
    "data/drafts/v0-onboarding-tool.md",
    "data/drafts/zero-typing-agents.md",
    "data/pass-log.md",
    "expert-council-method.md",
    "metrics.json",
    "pipeline-architecture.md",
    "quality-rules.md",
    "repurposing-paths.md",
    "scripts/council.sh"
  ],
  "total_size": 234275,
  "checksum": "sha256:82b4e36c4821842e3452174bdd044b1ac9e27cf96e70813b3056b11c055b36a2",
  "built_at": "2026-09-09T22:08:27.473Z",
  "openapi": {
    "openapi": "3.1.0",
    "info": {
      "title": "snappy-content",
      "version": "0.0.0",
      "description": "Interview-driven content production methodology, the writing engine for every Snappy channel: the 4-question interview, expert council critique, anti-AI checklist (40+ banned words, 20+ banned phrases, structural tells), 50% specificity rule, hook patterns, fold points, character limits, aspect ratios, dual SEO + AI search optimization, entity-driven writing, repurposing pipelines, and the writer/researcher/council/art/postprod/publish stage architecture. THE DEFAULT whenever content is actually being written. Use when Robert says: /snappy-content, 'write me a linkedin post about X', 'this sounds like AI', 'content rules / voice rules', 'repurpose this into a carousel', 'make a post about what we built', 'content methodology'. Triggers on: content, write a post, draft copy, voice rules, anti-AI check, repurpose, linkedin, skool, telegram. NOT the reference write-up (see content-production). NOT the single-post interactive drafter (see social-post). NOT publishing or scheduling (see snappy-post)."
    },
    "x-snappy-transport": "cli",
    "servers": [
      {
        "url": "npx tsx ~/.claude/skills/snappy-content/api.ts",
        "description": "The hand itself. Every path is a verb word, every query or body key an argument."
      }
    ],
    "paths": {
      "/atoms": {
        "get": {
          "operationId": "snappy_content_atoms",
          "summary": "snappy-content atoms",
          "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": "Only return atoms in this pipeline status; omit for every atom",
                "x-snappy-position": 0
              }
            },
            {
              "name": "json",
              "in": "query",
              "required": false,
              "schema": {
                "x-snappy-flag": "--json"
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/draft-new": {
        "post": {
          "operationId": "snappy_content_draft_new",
          "summary": "snappy-content draft-new",
          "x-snappy-effect": "draft",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "requestBody": {
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "slug": {
                      "type": "string",
                      "description": "URL slug the new draft is filed under",
                      "x-snappy-position": 0
                    },
                    "path": {
                      "type": "string",
                      "description": "File path the draft is written to",
                      "x-snappy-position": 1
                    },
                    "topic": {
                      "type": "string",
                      "description": "What the draft is about",
                      "x-snappy-position": 2
                    }
                  },
                  "required": [
                    "slug",
                    "path",
                    "topic"
                  ]
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/metrics": {
        "get": {
          "operationId": "snappy_content_metrics",
          "summary": "snappy-content metrics",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "name",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "Name of the content metric to compute",
                "x-snappy-position": 0
              }
            }
          ],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/status": {
        "get": {
          "operationId": "snappy_content_status",
          "summary": "snappy-content status",
          "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`."
            }
          }
        }
      },
      "/tick": {
        "post": {
          "operationId": "snappy_content_tick",
          "summary": "snappy-content tick",
          "x-snappy-effect": "write-reversible",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "slug": {
                      "type": "string",
                      "description": "Slug of the atom advanced one pipeline step",
                      "x-snappy-position": 0
                    }
                  },
                  "required": [
                    "slug"
                  ]
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/tick-all": {
        "post": {
          "operationId": "snappy_content_tick_all",
          "summary": "snappy-content tick-all",
          "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`."
            }
          }
        }
      }
    },
    "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": [
      "LINKEDIN_CLIENT_ID",
      "LINKEDIN_CLIENT_SECRET",
      "TYPEFULLY_API_KEY",
      "XANO_METADATA_TOKEN"
    ]
  }
}