{
  "schema": "snappy-card/1",
  "skill": "snappy-dom-cartographer",
  "tier": "public",
  "origin_tier": "base",
  "purpose": "You are the cartographer. You do NOT ship features. You produce DOM maps.",
  "verbs": [
    {
      "name": "eval",
      "args": [
        "session-name?",
        "js-expression?"
      ],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-dom-cartographer/api.ts eval"
    },
    {
      "name": "log",
      "args": [
        "message?",
        "status?"
      ],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-dom-cartographer/api.ts log"
    },
    {
      "name": "patch",
      "args": [
        "skill?",
        "verb?",
        "map-markdown?"
      ],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-dom-cartographer/api.ts patch"
    },
    {
      "name": "snap",
      "args": [
        "session-name?",
        "out-path?"
      ],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-dom-cartographer/api.ts snap"
    },
    {
      "name": "start",
      "args": [
        "guard-script?",
        "session-name?"
      ],
      "effect": "write-reversible",
      "firstCall": "npx tsx ~/.claude/skills/snappy-dom-cartographer/api.ts start"
    },
    {
      "name": "verify",
      "args": [
        "site?",
        "cookie-name?"
      ],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-dom-cartographer/api.ts verify"
    }
  ],
  "faces": [],
  "agents": [],
  "uses": [],
  "used_by": [
    "snappy-course"
  ],
  "checks": {
    "pass": 39,
    "fail": 6,
    "defer": 16,
    "line": "39 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"
      },
      {
        "id": 5,
        "rule": "Description is valid, third-person, and says what plus when",
        "says": "1078 chars"
      },
      {
        "id": 10,
        "rule": "One term names each concept",
        "says": "mixed synonym sets: endpoint/url/route/path, field/box/element"
      },
      {
        "id": 40,
        "rule": "Metadata, skill body, and resources follow three-level budgets",
        "says": "metadata ~270 tokens; body ~3582 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",
    "contract.test.ts",
    "skool-lesson-editor.md"
  ],
  "total_size": 58509,
  "checksum": "sha256:23d0b3eea581dcb19bd156cfb251e9e40ee298983a9ef7e4c26cfcee1ec2937a",
  "built_at": "2026-09-09T22:08:55.114Z",
  "openapi": {
    "openapi": "3.1.0",
    "info": {
      "title": "snappy-dom-cartographer",
      "version": "0.0.0",
      "description": "Master DOM mapping agent for the Snappy swarm. Given any web app (Skool, Slack, Notion, Xano dashboard, WeWeb, Webflow, Vercel, GitHub, etc.), it logs in via agent-browser, systematically maps every admin/edit DOM surface — selectors, click patterns, modal flows, form quirks, char limits, React-form gotchas — and bakes the verified recipes into the target skill's AGENTS.md so other agents can drive the UI reliably. Owns auth-state hygiene (guard scripts, backup/restore, never call `state save` blind) and the hard-won lessons about real-keystroke fills, dispatchEvent vs .click(), session isolation, and WAF avoidance. Triggers on: dom map, map the dom, dom cartographer, dom selectors, scrape selectors, find selector, ui automation, browser automation map, skool dom, slack dom, xano dom, notion dom, weweb dom, webflow dom, audit ui, ui recipe, selector mining, ui exploration, agent-browser map, browser primitives audit, add new ui coverage, page-edit dom, image upload dom, modal dom, react form workaround, valuetracker, fill input not working, save button disabled."
    },
    "x-snappy-transport": "cli",
    "servers": [
      {
        "url": "npx tsx ~/.claude/skills/snappy-dom-cartographer/api.ts",
        "description": "The hand itself. Every path is a verb word, every query or body key an argument."
      }
    ],
    "paths": {
      "/eval": {
        "post": {
          "operationId": "snappy_dom_cartographer_eval",
          "summary": "snappy-dom-cartographer eval",
          "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": {
                    "session-name": {
                      "type": "string",
                      "description": "Browser session the expression runs in",
                      "x-snappy-position": 0
                    },
                    "js-expression": {
                      "type": "string",
                      "description": "JavaScript evaluated in the page; its value is returned",
                      "x-snappy-position": 1
                    }
                  }
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/log": {
        "post": {
          "operationId": "snappy_dom_cartographer_log",
          "summary": "snappy-dom-cartographer log",
          "x-snappy-effect": "write-reversible",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "requestBody": {
            "required": false,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "message": {
                      "type": "string",
                      "description": "Feedback line appended to the cartographer log",
                      "x-snappy-position": 0
                    },
                    "status": {
                      "type": "string",
                      "description": "Whether the mapped defect is fixed or only recorded",
                      "enum": [
                        "FIXED",
                        "LOGGED"
                      ],
                      "x-snappy-position": 1
                    }
                  }
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/patch": {
        "post": {
          "operationId": "snappy_dom_cartographer_patch",
          "summary": "snappy-dom-cartographer patch",
          "x-snappy-effect": "write-reversible",
          "x-snappy-annotations": {
            "readOnlyHint": false,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "requestBody": {
            "required": false,
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "skill": {
                      "type": "string",
                      "description": "Skill whose reference map is written",
                      "x-snappy-position": 0
                    },
                    "verb": {
                      "type": "string",
                      "description": "Verb the map documents",
                      "x-snappy-position": 1
                    },
                    "map-markdown": {
                      "type": "string",
                      "description": "Markdown body written into that skill's map",
                      "x-snappy-position": 2
                    }
                  }
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/snap": {
        "post": {
          "operationId": "snappy_dom_cartographer_snap",
          "summary": "snappy-dom-cartographer snap",
          "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": {
                    "session-name": {
                      "type": "string",
                      "description": "Browser session to snapshot",
                      "x-snappy-position": 0
                    },
                    "out-path": {
                      "type": "string",
                      "description": "File the DOM snapshot is written to",
                      "x-snappy-position": 1
                    }
                  }
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/start": {
        "post": {
          "operationId": "snappy_dom_cartographer_start",
          "summary": "snappy-dom-cartographer start",
          "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": {
                    "guard-script": {
                      "type": "string",
                      "description": "Guard script run before the session opens",
                      "x-snappy-position": 0
                    },
                    "session-name": {
                      "type": "string",
                      "description": "Name the new browser session is filed under",
                      "x-snappy-position": 1
                    }
                  }
                }
              }
            }
          },
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/verify": {
        "get": {
          "operationId": "snappy_dom_cartographer_verify",
          "summary": "snappy-dom-cartographer verify",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": true
          },
          "parameters": [
            {
              "name": "site",
              "in": "query",
              "required": false,
              "schema": {
                "type": "string",
                "description": "Site whose logged-in state is verified",
                "x-snappy-position": 0
              }
            },
            {
              "name": "cookie-name",
              "in": "query",
              "required": false,
              "schema": {
                "type": "string",
                "description": "Cookie whose presence proves the session is authenticated",
                "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"
            }
          }
        }
      }
    }
  }
}