{
  "schema": "snappy-card/1",
  "skill": "snappy-session-close",
  "tier": "public",
  "origin_tier": "base",
  "purpose": "Close a session in two verbs. Read `SKILL.md` for the doctrine, the sources",
  "verbs": [
    {
      "name": "handoff",
      "args": [],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-session-close/api.ts handoff"
    },
    {
      "name": "reconcile",
      "args": [],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-session-close/api.ts reconcile"
    }
  ],
  "faces": [],
  "agents": [],
  "uses": [],
  "used_by": [],
  "checks": {
    "pass": 28,
    "fail": 6,
    "defer": 27,
    "line": "28 of 34 checks pass",
    "failing": [
      {
        "id": 4,
        "rule": "Near-neighbour descriptions cross-reference each other",
        "says": "near neighbours not named: snappy-runner"
      },
      {
        "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": 40,
        "rule": "Metadata, skill body, and resources follow three-level budgets",
        "says": "metadata ~215 tokens; body ~3171 tokens"
      },
      {
        "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",
    "metrics.json",
    "refusals.test.ts"
  ],
  "total_size": 40214,
  "checksum": "sha256:4d478769ef353628dbeb4cb3f75b2528c7893e3279b03e9a4d6f3f67b07bc307",
  "built_at": "2026-09-09T22:10:51.877Z",
  "openapi": {
    "openapi": "3.1.0",
    "info": {
      "title": "snappy-session-close",
      "version": "0.0.0",
      "description": "Close a working session in two verbs: RECONCILE the agent-facing docs of a repo set (CLAUDE.md, AGENTS.md, README, the repo's named live docs) against MEASURED truth — delete what is wrong, edit the wrong line in place, archive the uncited dated, fold in the session's learnings with their reasons — then HANDOFF: write the fresh-session brief a zero-memory successor starts from (state of the world measured, the order with already-landed flags, dated decisions, needs-owner, meta-tactics, monitors, traps, where things live, laws, how to verify). Built 2026-09-03 from the overnight run that landed 20 lanes; defaults to Snappy's three repos (app, Convex twin, MCP worker) but takes any repo list. Triggers: snappy-session-close, session-close, end of session, close the session, update the docs, fold in learnings, write the handoff, fresh-session brief."
    },
    "x-snappy-transport": "cli",
    "servers": [
      {
        "url": "npx tsx ~/.claude/skills/snappy-session-close/api.ts",
        "description": "The hand itself. Every path is a verb word, every query or body key an argument."
      }
    ],
    "paths": {
      "/handoff": {
        "post": {
          "operationId": "snappy_session_close_handoff",
          "summary": "snappy-session-close handoff",
          "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": {
                    "out": {
                      "x-snappy-flag": "--out"
                    }
                  }
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/reconcile": {
        "post": {
          "operationId": "snappy_session_close_reconcile",
          "summary": "snappy-session-close reconcile",
          "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": {
                    "dry-run": {
                      "x-snappy-flag": "--dry-run"
                    },
                    "json": {
                      "x-snappy-flag": "--json"
                    }
                  }
                }
              }
            }
          },
          "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"
            }
          }
        }
      }
    }
  }
}