{
  "schema": "snappy-card/1",
  "skill": "snappy-report-publish",
  "tier": "public",
  "origin_tier": "base",
  "purpose": "Turns raw engineering material (meeting transcripts, agent traces, commit logs) into a shareable status-report URL on a Cloudflare Pages hub. Designed around the **\"dozens of passes\"** quality loop that produced `/lsi-proof` and `/overnight-apr-20` on the orbiter-status-report hub.",
  "verbs": [
    {
      "name": "gen-batch",
      "args": [
        "prompts-file",
        "out-dir"
      ],
      "effect": "draft",
      "firstCall": "npx tsx ~/.claude/skills/snappy-report-publish/api.ts gen-batch <prompts-file> <out-dir>"
    },
    {
      "name": "publish",
      "args": [
        "hub-dir",
        "project"
      ],
      "effect": "post",
      "firstCall": "npx tsx ~/.claude/skills/snappy-report-publish/api.ts publish <hub-dir> <project>"
    },
    {
      "name": "style",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-report-publish/api.ts style"
    },
    {
      "name": "update-index",
      "args": [
        "hub-dir",
        "slug",
        "title",
        "description",
        "date"
      ],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-report-publish/api.ts update-index <hub-dir> <slug> \"<title>\" <description> <date>"
    },
    {
      "name": "verify",
      "args": [
        "url",
        "out?"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-report-publish/api.ts verify <url>"
    }
  ],
  "faces": [],
  "agents": [],
  "uses": [],
  "used_by": [],
  "checks": {
    "pass": 38,
    "fail": 7,
    "defer": 16,
    "line": "38 of 45 checks pass",
    "failing": [
      {
        "id": 8,
        "rule": "Skill body and reference graph stay within disclosure budgets",
        "says": "393 lines; ~4279 tokens; templates/prompt-patterns.md >100 lines without ToC"
      },
      {
        "id": 10,
        "rule": "One term names each concept",
        "says": "mixed synonym sets: endpoint/url/route/path, field/box/element"
      },
      {
        "id": 39,
        "rule": "Verb sets consolidate intent rather than mirror endpoints",
        "says": "5 verbs, 4 literal endpoint(s); one-to-one heuristic=true"
      },
      {
        "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)"
      },
      {
        "id": 60,
        "rule": "Loader publishes the contract's derived first call, current",
        "says": "generated block is stale against HAND_CONTRACT; run fix-loader"
      }
    ]
  },
  "coverage": null,
  "spec": null,
  "evals": null,
  "files": [
    "AGENTS.md",
    "SKILL.md",
    "api.ts",
    "refusals.test.ts",
    "templates/fragments/correction-banner.html",
    "templates/fragments/hub-link.html",
    "templates/fragments/query-card.html",
    "templates/fragments/two-up-grid.html",
    "templates/gen_batch.py",
    "templates/prompt-patterns.md"
  ],
  "total_size": 61509,
  "checksum": "sha256:756aa58cc7e497032c5b804ba8d262dd4f0a88228fd123f918faad081282d26e",
  "built_at": "2026-09-09T22:10:25.711Z",
  "openapi": {
    "openapi": "3.1.0",
    "info": {
      "title": "snappy-report-publish",
      "version": "0.0.0",
      "description": "End-to-end workflow for publishing cognitively-clear technical status reports to a Cloudflare Pages hub. Orchestrates Gemini 3.1 flash-image-preview diagram generation + iterative hallucination-reduction loop + HTML report composition (hero + correction banner + two-up grid + pull-quotes) + wrangler publish + hub-index update + agent-browser visual verification. Battle-tested on the orbiter-status-report hub. Triggers on: snappy-report-publish, report-publish, status report, dev update, cognitive diagram, client report."
    },
    "x-snappy-transport": "cli",
    "servers": [
      {
        "url": "npx tsx ~/.claude/skills/snappy-report-publish/api.ts",
        "description": "The hand itself. Every path is a verb word, every query or body key an argument."
      }
    ],
    "paths": {
      "/gen-batch": {
        "post": {
          "operationId": "snappy_report_publish_gen_batch",
          "summary": "snappy-report-publish gen-batch",
          "x-snappy-effect": "draft",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "prompts-file": {
                      "type": "string",
                      "description": "Path to the JSON file holding one prompt per row",
                      "x-snappy-position": 0
                    },
                    "out-dir": {
                      "type": "string",
                      "description": "Directory the generated files are written to",
                      "x-snappy-position": 1
                    }
                  },
                  "required": [
                    "prompts-file",
                    "out-dir"
                  ]
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/publish": {
        "post": {
          "operationId": "snappy_report_publish_publish",
          "summary": "snappy-report-publish publish",
          "x-snappy-effect": "write",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "requestBody": {
            "required": true,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "hub-dir": {
                      "type": "string",
                      "description": "Directory holding the report hub",
                      "x-snappy-position": 0
                    },
                    "project": {
                      "type": "string",
                      "description": "Project name the report belongs to",
                      "x-snappy-position": 1
                    }
                  },
                  "required": [
                    "hub-dir",
                    "project"
                  ]
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/style": {
        "get": {
          "operationId": "snappy_report_publish_style",
          "summary": "snappy-report-publish style",
          "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`."
            }
          }
        }
      },
      "/update-index": {
        "post": {
          "operationId": "snappy_report_publish_update_index",
          "summary": "snappy-report-publish update-index",
          "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": {
                    "hub-dir": {
                      "type": "string",
                      "description": "Directory holding the report hub",
                      "x-snappy-position": 0
                    },
                    "slug": {
                      "type": "string",
                      "description": "URL slug that identifies the record",
                      "x-snappy-position": 1
                    },
                    "title": {
                      "type": "string",
                      "description": "Human-readable title",
                      "x-snappy-position": 2
                    },
                    "description": {
                      "type": "string",
                      "description": "One-sentence description of the thing",
                      "x-snappy-position": 3
                    },
                    "date": {
                      "type": "string",
                      "description": "Date as YYYY-MM-DD",
                      "x-snappy-position": 4
                    }
                  },
                  "required": [
                    "hub-dir",
                    "slug",
                    "title",
                    "description",
                    "date"
                  ]
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/verify": {
        "get": {
          "operationId": "snappy_report_publish_verify",
          "summary": "snappy-report-publish verify",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "url",
              "in": "query",
              "required": true,
              "schema": {
                "type": "string",
                "description": "Absolute URL of the published report to verify",
                "x-snappy-position": 0
              }
            },
            {
              "name": "out",
              "in": "query",
              "required": false,
              "schema": {
                "type": "string",
                "description": "Path the verification screenshot is written to",
                "x-snappy-position": 1
              }
            }
          ],
          "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": [
      "CLOUDFLARE_ACCOUNT_ID",
      "GEMINI_API_KEY"
    ]
  }
}