{
  "schema": "snappy-card/1",
  "skill": "snappy-analytics",
  "tier": "public",
  "origin_tier": "base",
  "purpose": "Central scorecard for the Snappy OS -- pulls metrics from 12 producer skills, synthesizes weekly dashboard, monthly review, daily briefing rollup, and funnel reports.",
  "verbs": [
    {
      "name": "scorecard",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-analytics/api.ts scorecard"
    }
  ],
  "faces": [],
  "agents": [],
  "uses": [],
  "used_by": [
    "snappy-email"
  ],
  "checks": {
    "pass": 37,
    "fail": 8,
    "defer": 16,
    "line": "37 of 45 checks pass",
    "failing": [
      {
        "id": 5,
        "rule": "Description is valid, third-person, and says what plus when",
        "says": "first/second person; no when/use marker"
      },
      {
        "id": 8,
        "rule": "Skill body and reference graph stay within disclosure budgets",
        "says": "352 lines; ~5826 tokens"
      },
      {
        "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 ~150 tokens; body ~5826 tokens"
      },
      {
        "id": 43,
        "rule": "A read is one call, not a queued job",
        "says": "scorecard:p50>3s-or-missing"
      },
      {
        "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",
    "content-metrics.md",
    "contract.test.ts",
    "dashboard-formats.md",
    "data-source-map.md",
    "funnel-metrics.md",
    "revenue-metrics.md",
    "troubleshooting.md",
    "weekly-dashboard.sh"
  ],
  "total_size": 120966,
  "checksum": "sha256:54aa3b196a63ae57d442103b1af755d085298d9d6188068de0acfe9e7023da70",
  "built_at": "2026-09-09T22:08:05.483Z",
  "openapi": {
    "openapi": "3.1.0",
    "info": {
      "title": "snappy-analytics",
      "version": "0.0.0",
      "description": "Centralized analytics and metrics for the entire Snappy operating system. Pulls performance numbers from every producer skill (website, ads, youtube, linkedin, email, community, sales, clients, freshbooks, knowledge, pipeline, content), synthesizes the weekly Snappy Dashboard, monthly review, and on-demand funnel reports. Use this skill when Robert says \"weekly dashboard\", \"monthly review\", \"what's our MRR\", \"pipeline status\", \"funnel report\", \"ad ROI\", \"content scorecard\", \"are we hitting targets\", \"show me the numbers\", \"scorecard\", \"metrics check\", or any cross-skill measurement question."
    },
    "x-snappy-transport": "cli",
    "servers": [
      {
        "url": "npx tsx ~/.claude/skills/snappy-analytics/api.ts",
        "description": "The hand itself. Every path is a verb word, every query or body key an argument."
      }
    ],
    "paths": {
      "/scorecard": {
        "get": {
          "operationId": "snappy_analytics_scorecard",
          "summary": "snappy-analytics scorecard",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "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"
            }
          }
        }
      }
    }
  }
}