{
  "id": "skill-descriptions-that-trigger",
  "type": "loadout",
  "title": "Skill descriptions that fit the listing and trigger",
  "summary": "Keep every SKILL.md description inside Claude Code's 1,536-character cap and both agents' listing budgets, with a trigger clause, so skills fire on their own.",
  "description": "Agents pick a skill from its description, read from a listing with a fixed budget. Claude Code gives the whole listing 1% of the context window and cuts each entry at 1,536 characters. When it overflows, the least-used skills lose their descriptions. Codex allows 2% of the window, or 8,000 characters when it doesn't know the window, and shortens descriptions before dropping skills. Once a description is cut, the keywords that matched the user's request are gone. That is why a skill works as /name and never fires by itself.\n\nThis loadout adds the rules for writing descriptions (what it does first, then \"Use when ...\" in the user's words) and an audit skill. A standard-library script checks each SKILL.md's front matter, the 1,536-character cap, missing triggers, long first sentences, unquoted colons and near-duplicate descriptions. It then estimates the listing against both budgets. The skill ends with a with-and-without trigger check in fresh sessions, as Anthropic's skills guide recommends.\n",
  "highlights": [
    "Documented limits: 1,536 characters per entry, 1% (Claude Code) and 2% or 8,000 characters (Codex)",
    "Audit flags cut-off, missing, untriggered and near-duplicate descriptions",
    "Catches the unquoted-colon front matter that makes skills silently fail to load",
    "Before/after examples for vague, buried and look-alike descriptions",
    "Trigger check in fresh sessions, with and without the skill"
  ],
  "version": "1.0.0",
  "license": "MIT",
  "author": {
    "name": "SetupBay",
    "url": "https://setupbay.com"
  },
  "credits": [
    {
      "title": "Claude Code docs: skills (listing budget, 1,536-character cap, /skill-doctor)",
      "url": "https://code.claude.com/docs/en/skills"
    },
    {
      "title": "Codex docs: agent skills (2% of context, 8,000 characters, skills.max_context_tokens)",
      "url": "https://developers.openai.com/codex/skills"
    },
    {
      "title": "Claude Code changelog (2.1.105 raised the cap from 250 to 1,536; 2.1.69 colon fix)",
      "url": "https://github.com/anthropics/claude-code/blob/main/CHANGELOG.md"
    },
    {
      "title": "@ekcheungAI: Claude Code caps its skill list at 1% of context, Codex at 2%",
      "url": "https://x.com/ekcheungAI/status/2111834671164346422"
    }
  ],
  "categories": [
    "ai-agents",
    "workflow"
  ],
  "stacks": [
    "markdown",
    "python"
  ],
  "files": [
    {
      "path": "AGENTS.md",
      "role": "instructions",
      "description": "Rules for every SKILL.md and the done checklist.",
      "skill": null,
      "agent": null,
      "install_to": {
        "claude-code": "AGENTS.md",
        "codex": "AGENTS.md",
        "cursor": "AGENTS.md",
        "gemini-cli": "AGENTS.md",
        "antigravity-cli": "AGENTS.md",
        "copilot": "AGENTS.md"
      },
      "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/AGENTS.md",
      "raw_latest_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/latest/AGENTS.md",
      "bytes": 1470,
      "lang": "markdown",
      "content": "# AGENTS.md: skills that get used\n\nThis project keeps agent skills in `.agents/skills/` (and `.claude/skills/` for Claude Code). Agents choose a skill\nfrom its `description` alone, inside a listing with a fixed budget. A skill with a weak or cut-off description\nmight as well not be installed.\n\n## Rules for every SKILL.md\n- Front matter has `name` (same as the folder) and `description`. Quote any value that contains `: `.\n- The description starts with what the skill does, in one sentence under 200 characters, then \"Use when ...\" with\n  the words a user would type. Keep `description` plus `when_to_use` well under 1,536 characters; 300–600 is plenty.\n- Detail, steps, examples and history go in the body or in `references/`, never in the description.\n- No two skills with overlapping descriptions. Merge them, or say what makes each different.\n- Skills with side effects (deploy, publish, send) use `disable-model-invocation: true` where the agent supports it.\n- The most important instructions go near the top of the body: after compaction, agents may keep only the start\n  of a skill they already loaded.\n\n## Before you say a skill change is done\n1. Run the `skill-listing-audit` skill's audit on the skills folders. It must report `0 error(s)`; explain any warning\n   you leave.\n2. Try the changed skill on three prompts that should trigger it and one that should not, each in a fresh session.\n3. Report the listing total against the budgets the audit prints.\n"
    },
    {
      "path": "CLAUDE.md",
      "role": "adapter",
      "description": "Imports AGENTS.md for Claude Code.",
      "skill": null,
      "agent": "claude-code",
      "install_to": {
        "claude-code": "CLAUDE.md",
        "codex": null,
        "cursor": null,
        "gemini-cli": null,
        "antigravity-cli": null,
        "copilot": null
      },
      "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/CLAUDE.md",
      "raw_latest_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/latest/CLAUDE.md",
      "bytes": 408,
      "lang": "markdown",
      "content": "# CLAUDE.md\n\n@AGENTS.md\n\n## Claude Code notes\n\n- Skills from this loadout live in `.claude/skills/`: `skill-listing-audit`. Use them when their description matches the task.\n- Follow AGENTS.md above; where this file and AGENTS.md disagree, AGENTS.md wins.\n\n<!-- From SetupBay \"Skill descriptions that fit the listing and trigger\" v1.0.0 — https://setupbay.com/loadouts/skill-descriptions-that-trigger/ -->\n"
    },
    {
      "path": "GEMINI.md",
      "role": "adapter",
      "description": "Imports AGENTS.md for Gemini CLI.",
      "skill": null,
      "agent": "gemini-cli",
      "install_to": {
        "claude-code": null,
        "codex": null,
        "cursor": null,
        "gemini-cli": "GEMINI.md",
        "antigravity-cli": null,
        "copilot": null
      },
      "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/GEMINI.md",
      "raw_latest_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/latest/GEMINI.md",
      "bytes": 409,
      "lang": "markdown",
      "content": "# GEMINI.md\n\n@./AGENTS.md\n\n## Gemini CLI notes\n\n- Skills from this loadout live in `.agents/skills/`: `skill-listing-audit`. Use them when their description matches the task.\n- Follow AGENTS.md above; where this file and AGENTS.md disagree, AGENTS.md wins.\n\n<!-- From SetupBay \"Skill descriptions that fit the listing and trigger\" v1.0.0 — https://setupbay.com/loadouts/skill-descriptions-that-trigger/ -->\n"
    },
    {
      "path": "skills/skill-listing-audit/SKILL.md",
      "role": "skill",
      "description": "Audit descriptions against listing limits, then fix and check triggers.",
      "skill": "skill-listing-audit",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/skill-listing-audit/SKILL.md",
        "codex": ".agents/skills/skill-listing-audit/SKILL.md",
        "cursor": ".agents/skills/skill-listing-audit/SKILL.md",
        "gemini-cli": ".agents/skills/skill-listing-audit/SKILL.md",
        "antigravity-cli": ".agents/skills/skill-listing-audit/SKILL.md",
        "copilot": ".agents/skills/skill-listing-audit/SKILL.md"
      },
      "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/skills/skill-listing-audit/SKILL.md",
      "raw_latest_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/latest/skills/skill-listing-audit/SKILL.md",
      "bytes": 3260,
      "lang": "markdown",
      "content": "---\nname: skill-listing-audit\ndescription: Check that every skill's description fits the agent's skill listing and says when to use it. Use when adding, writing or renaming a skill, when a skill works with /name but never fires on its own, or when an agent warns that skill descriptions were truncated.\n---\n\n# Skill listing audit\n\nAgents never read your skills up front. They read a **listing**: each skill's name and description, squeezed into a\nfixed budget. If the listing overflows, descriptions get cut or dropped, and the keywords that would have matched\nthe user's request go with them. A skill that only works when typed as `/name` usually has this problem.\n\nWhat the agents document:\n- **Claude Code**: the listing budget is 1% of the model's context window. Each entry (`description` plus\n  `when_to_use`) is cut at 1,536 characters. When the listing overflows, the least-used skills lose their\n  descriptions first. Raise it with `skillListingBudgetFraction` or `SLASH_COMMAND_TOOL_CHAR_BUDGET`, or set a\n  low-priority skill to `\"name-only\"` in `skillOverrides`. `/doctor` estimates the cost; `/skill-doctor` lists\n  skills that are never used.\n- **Codex**: the initial list uses at most 2% of the context window, or 8,000 characters when the window is unknown.\n  Descriptions are shortened first, then skills are left out with a warning. `skills.max_context_tokens` changes it\n  (up to 10,000 tokens). `name` and `description` are both required.\n\n## 1. Run the audit\n```bash\npython3 .agents/skills/skill-listing-audit/scripts/skill_listing.py .claude/skills .agents/skills\n```\nAdd `--context 1000000` for a 1M-token model. Point it at a plugin's `skills/` folder to check a plugin before\npublishing. It only reads files.\n\n## 2. Fix errors first\n- **No description**: write one (step 3). Do not rely on the body's first line.\n- **Over 1,536 characters**: the end is cut off in Claude Code. Move detail into the body; the description is a\n  trigger, not documentation.\n- **Front matter not valid**: an unquoted `: ` inside a value (for example `description: Triggers: X, Y`) makes YAML\n  read a nested key, and some agents then skip the skill. Quote the whole value.\n\n## 3. Then make each description trigger\nWrite it in this order, in plain words a user would type:\n1. **What it does**, first sentence, under 200 characters. If the listing is cut, this is what survives.\n2. **\"Use when ...\"** with the real triggers: the task, the file types, the error message, the words people use.\n3. **What it is not for**, only when a neighbouring skill is easily confused with it.\n\nSee `references/description-examples.md` for before/after pairs. Fix overlap warnings by saying what makes each skill\ndifferent, or merge the two skills.\n\n## 4. Check it fires\nSeeing a skill trigger once is not proof. For each changed skill, write three realistic prompts that should use it\nand one that should not. Try each in a fresh session with the skill on, then with it off, and compare. Keep the prompts\nin the skill folder (for example `evals/triggers.md`) so the next edit can be checked the same way.\n\n## 5. Report\nList each skill you changed with its old and new length, the listing total against both budgets, and the trigger\nprompts you tried, with what happened.\n"
    },
    {
      "path": "skills/skill-listing-audit/scripts/skill_listing.py",
      "role": "reference",
      "description": "Read-only audit of SKILL.md front matter and listing size.",
      "skill": "skill-listing-audit",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/skill-listing-audit/scripts/skill_listing.py",
        "codex": ".agents/skills/skill-listing-audit/scripts/skill_listing.py",
        "cursor": ".agents/skills/skill-listing-audit/scripts/skill_listing.py",
        "gemini-cli": ".agents/skills/skill-listing-audit/scripts/skill_listing.py",
        "antigravity-cli": ".agents/skills/skill-listing-audit/scripts/skill_listing.py",
        "copilot": ".agents/skills/skill-listing-audit/scripts/skill_listing.py"
      },
      "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/skills/skill-listing-audit/scripts/skill_listing.py",
      "raw_latest_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/latest/skills/skill-listing-audit/scripts/skill_listing.py",
      "bytes": 7534,
      "lang": "markdown",
      "content": "#!/usr/bin/env python3\n\"\"\"Audit SKILL.md descriptions against the limits agents apply to their skill listings.\n\nUsage: python3 skill_listing.py [--context TOKENS] DIR [DIR ...]\n  DIR is a skills folder (.claude/skills, .agents/skills, a plugin's skills/) or one skill folder.\n  --context  the model's context window in tokens, for the listing-budget estimate (default 200000).\n\nChecks each skill's front matter, then the whole listing:\n  error  no description; description + when_to_use over Claude Code's 1,536-character cap (cut short);\n         front matter that is not valid simple YAML (an unquoted \": \" inside a value, a missing closing ---).\n  warn   name differs from the folder; no \"use when\" style trigger; first sentence over 200 characters;\n         two skills whose descriptions share most of their words (the agent can't tell them apart).\n  info   listing size against Claude Code's budget (1% of the context window) and Codex's\n         (2% of the context window, 8,000 characters when the window is unknown). Characters/4 is an estimate.\nExit 1 if any error, else 0. Standard library only; read-only.\n\"\"\"\nimport os\nimport re\nimport sys\n\nCLAUDE_ENTRY_CAP = 1536\nTRIGGER = re.compile(r\"\\b(use (it |this )?(when|for|after|before|if|whenever)|when the user|triggers? (on|when|include)|invoke when)\\b\", re.I)\nSTOP = set(\"a an and are as at be by for from if in into is it its of on or the this to use used when with your you that\".split())\n\n\ndef parse_front_matter(text):\n    \"\"\"Return (dict, error). Supports key: value, quoted values, and | or > block scalars.\"\"\"\n    if not text.startswith(\"---\"):\n        return None, \"no front matter (the file must start with ---)\"\n    lines = text.splitlines()\n    try:\n        end = next(i for i in range(1, len(lines)) if lines[i].strip() == \"---\")\n    except StopIteration:\n        return None, \"front matter has no closing ---\"\n    data, i = {}, 1\n    while i < end:\n        line = lines[i]\n        if not line.strip() or line.lstrip().startswith(\"#\"):\n            i += 1\n            continue\n        m = re.match(r\"^([A-Za-z0-9_-]+):(?:\\s+(.*))?$\", line)\n        if not m:\n            if line.startswith((\" \", \"\\t\")):\n                i += 1\n                continue\n            return None, f\"line {i + 1}: not a 'key: value' line\"\n        key, val = m.group(1), (m.group(2) or \"\").strip()\n        if val in (\"|\", \">\", \"|-\", \">-\", \"|+\", \">+\"):\n            block = []\n            i += 1\n            while i < end and (lines[i].startswith((\" \", \"\\t\")) or not lines[i].strip()):\n                block.append(lines[i].strip())\n                i += 1\n            data[key] = (\"\\n\" if val.startswith(\"|\") else \" \").join(b for b in block if b).strip()\n            continue\n        if val[:1] in \"\\\"'\":\n            q = val[0]\n            if not val.endswith(q) or len(val) < 2:\n                return None, f\"line {i + 1}: {key} opens a {q} quote that never closes on that line\"\n            val = val[1:-1]\n        elif \": \" in val:\n            return None, f\"line {i + 1}: {key} contains ': ' without quotes, so YAML reads it as a nested key; quote the value\"\n        elif val == \"\":\n            # nested mapping (metadata:, hooks:) - skip its indented lines\n            i += 1\n            while i < end and lines[i].startswith((\" \", \"\\t\")):\n                i += 1\n            data[key] = {}\n            continue\n        data[key] = val\n        i += 1\n    return data, None\n\n\ndef skill_dirs(paths):\n    for p in paths:\n        if os.path.isfile(os.path.join(p, \"SKILL.md\")):\n            yield p\n            continue\n        if not os.path.isdir(p):\n            print(f\"skip {p}: not a folder\", file=sys.stderr)\n            continue\n        for name in sorted(os.listdir(p)):\n            d = os.path.join(p, name)\n            if os.path.isfile(os.path.join(d, \"SKILL.md\")):\n                yield d\n\n\ndef words(s):\n    return {w for w in re.findall(r\"[a-z0-9][a-z0-9.+#-]*\", s.lower()) if w not in STOP and len(w) > 2}\n\n\ndef main(argv):\n    context = 200000\n    if \"--context\" in argv:\n        i = argv.index(\"--context\")\n        context = int(argv[i + 1])\n        del argv[i:i + 2]\n    if not argv or any(a.startswith(\"-\") for a in argv):\n        print(__doc__.strip(), file=sys.stderr)\n        return 2\n    errors = warns = 0\n    listing, seen = [], []\n    for d in skill_dirs(argv):\n        folder = os.path.basename(os.path.normpath(d))\n        text = open(os.path.join(d, \"SKILL.md\"), encoding=\"utf-8\").read()\n        fm, err = parse_front_matter(text)\n        tag = f\"{folder}:\"\n        if err:\n            print(f\"error {tag} {err}\")\n            errors += 1\n            continue\n        name = fm.get(\"name\") or folder\n        if any(n == name for n, _ in seen):\n            print(f\"same  {tag} also installed in another folder (one per agent); counted once\")\n            continue\n        desc = fm.get(\"description\") if isinstance(fm.get(\"description\"), str) else \"\"\n        when = fm.get(\"when_to_use\") if isinstance(fm.get(\"when_to_use\"), str) else \"\"\n        hidden = str(fm.get(\"disable-model-invocation\", \"\")).lower() == \"true\"\n        if not desc:\n            print(f\"error {tag} no description (Codex requires one; Claude Code falls back to the first line of the body)\")\n            errors += 1\n            continue\n        combined = (desc + (\" \" + when if when else \"\")).strip()\n        before = errors\n        if len(combined) > CLAUDE_ENTRY_CAP:\n            print(f\"error {tag} description + when_to_use is {len(combined)} characters; Claude Code cuts each entry at {CLAUDE_ENTRY_CAP}, so the end is lost\")\n            errors += 1\n        if fm.get(\"name\") and fm[\"name\"] != folder:\n            print(f\"warn  {tag} name '{fm['name']}' differs from the folder '{folder}'; some agents list one, some the other\")\n            warns += 1\n        if not hidden and not TRIGGER.search(combined):\n            print(f\"warn  {tag} no trigger clause; add 'Use when ...' with the words a user would actually type\")\n            warns += 1\n        first = re.split(r\"(?<=[.!?])\\s\", desc, maxsplit=1)[0]\n        if len(first) > 200:\n            print(f\"warn  {tag} first sentence is {len(first)} characters; put the key use case first, in under 200\")\n            warns += 1\n        w = words(combined)\n        for other, ow in seen:\n            if w and ow and len(w & ow) / len(w | ow) >= 0.6:\n                print(f\"warn  {tag} description overlaps '{other}' ({len(w & ow)} shared words); say what makes each one different\")\n                warns += 1\n        seen.append((name, w))\n        if not hidden:\n            listing.append((name, len(name) + len(combined[:CLAUDE_ENTRY_CAP]) + 4))\n        print(f\"{'ok   ' if errors == before else 'fix  '} {tag} {len(combined)} chars{' (hidden from the model: disable-model-invocation)' if hidden else ''}\")\n    total = sum(n for _, n in listing)\n    claude_budget = int(context * 0.01 * 4)\n    codex_budget = int(context * 0.02 * 4)\n    print(f\"listing: {len(listing)} skill(s), about {total} characters (~{total // 4} tokens)\")\n    print(f\"budget: Claude Code 1% of {context} tokens ~ {claude_budget} chars: {'fits' if total <= claude_budget else 'OVER, least-used descriptions get dropped'}\")\n    print(f\"budget: Codex 2% of {context} tokens ~ {codex_budget} chars (8000 if the window is unknown): {'fits' if total <= codex_budget else 'OVER, descriptions get shortened'}\")\n    print(f\"skill-listing: {errors} error(s), {warns} warning(s)\")\n    return 1 if errors else 0\n\n\nif __name__ == \"__main__\":\n    sys.exit(main(sys.argv[1:]))\n"
    },
    {
      "path": "skills/skill-listing-audit/references/description-examples.md",
      "role": "reference",
      "description": "Before/after description examples.",
      "skill": "skill-listing-audit",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/skill-listing-audit/references/description-examples.md",
        "codex": ".agents/skills/skill-listing-audit/references/description-examples.md",
        "cursor": ".agents/skills/skill-listing-audit/references/description-examples.md",
        "gemini-cli": ".agents/skills/skill-listing-audit/references/description-examples.md",
        "antigravity-cli": ".agents/skills/skill-listing-audit/references/description-examples.md",
        "copilot": ".agents/skills/skill-listing-audit/references/description-examples.md"
      },
      "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/skills/skill-listing-audit/references/description-examples.md",
      "raw_latest_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/latest/skills/skill-listing-audit/references/description-examples.md",
      "bytes": 2308,
      "lang": "markdown",
      "content": "# Skill descriptions: before and after\n\nThe description is read by the agent to decide whether to load the skill. It is a trigger, not a summary of the body.\n\n## Too vague\nBefore: `description: Helps with database stuff.`\nAfter: `description: Write and review Postgres migrations as SQL files. Use when adding a table, column or index, changing a constraint, or when a migration fails to apply.`\n\nWhy: \"database stuff\" matches nothing a user types. The after version names the task, the objects and the failure.\n\n## Key use case buried\nBefore: `description: This skill was written after several incidents in which our team noticed that agents would sometimes produce release notes that did not match the actual changes, so it now gathers merged PRs and ...`\nAfter: `description: Draft release notes from the PRs merged since the last tag. Use when the user asks for release notes, a changelog entry or \"what shipped\".`\n\nWhy: when the listing is cut, only the start survives. History belongs in the body, if anywhere.\n\n## Missing the words people use\nBefore: `description: Performs Lighthouse-style auditing of web pages.`\nAfter: `description: Measure page speed and fix slow loads with Chrome DevTools traces. Use when a page feels slow, LCP or CLS is poor, or the user mentions Core Web Vitals, PageSpeed or Lighthouse.`\n\n## Two skills nobody can tell apart\nBefore:\n- `review: Review code changes for problems.`\n- `pr-check: Check pull requests for issues.`\n\nAfter:\n- `review: Review the uncommitted diff for bugs and risky changes before a commit. Use when the user asks to review, check or look over their changes.`\n- `pr-check: Run the repository's PR checklist (tests, changelog, screenshots) on an open pull request. Use when preparing or updating a PR. Not for reviewing code itself.`\n\n## Unquoted colon\nBefore: `description: Triggers: deploy, release, ship`\nAfter: `description: \"Deploy the app to staging or production. Triggers: deploy, release, ship.\"`\n\nWhy: YAML reads `Triggers:` as a nested key. Quote any value that contains `: `.\n\n## A skill only a human should start\nFor deploys and other actions with side effects, set `disable-model-invocation: true` (Claude Code) so the\ndescription stays out of the model's listing and the skill runs only when typed as `/name`. It then costs no budget.\n"
    }
  ],
  "requires": {
    "tools": [
      "python3"
    ],
    "env": [],
    "mcp": []
  },
  "tested": {
    "status": "untested",
    "last_run": null,
    "fixture": null,
    "per_agent": {
      "claude-code": "untested",
      "codex": "untested",
      "cursor": "untested",
      "gemini-cli": "untested",
      "antigravity-cli": "untested",
      "copilot": "untested"
    }
  },
  "security": {
    "scanned": true,
    "scanner": "intake-precheck/2",
    "verdict": "clean",
    "network": false,
    "scripts": [
      "skill_listing.py"
    ],
    "notes": "The audit only reads SKILL.md files and prints a report. It changes no files and makes no network calls."
  },
  "featured": false,
  "deprecated": false,
  "last_checked": "2026-10-24",
  "published": "2026-10-24",
  "updated": "2026-10-24",
  "compatibility": {
    "claude-code": "native",
    "codex": "native",
    "cursor": "native",
    "gemini-cli": "native",
    "antigravity-cli": "native",
    "copilot": "native"
  },
  "counts": {
    "rules": 1,
    "skills": 1,
    "mcp": 0
  },
  "url": "https://setupbay.com/loadouts/skill-descriptions-that-trigger/",
  "api_url": "https://setupbay.com/api/loadouts/skill-descriptions-that-trigger.json",
  "verification": {
    "level": "verified-install",
    "status": "verified",
    "label": "Verified install",
    "verified": true,
    "checked_at": "2026-10-24T10:30:13Z",
    "commit": "42646ff9a52315018c9b0947c291c7ad980e1dc7",
    "content_current": true,
    "agent_tests": "not-run",
    "counts": {
      "pass": 9,
      "fail": 0,
      "skip": 0,
      "not_applicable": 1
    },
    "meaning": "Level 1: automated checks on the files (parse, install paths, MCP config, safety scan, references, size, licence, starter build). No AI agent was run.",
    "checks": [
      {
        "id": "listing",
        "name": "Listing",
        "status": "pass",
        "summary": "Schema valid; 6 files declared, none missing or extra",
        "details": [
          "tested.status: untested (agent tests are separate from Level 1)"
        ]
      },
      {
        "id": "parse",
        "name": "Files parse",
        "status": "pass",
        "summary": "All 6 files parse; front matter valid",
        "details": []
      },
      {
        "id": "adapters",
        "name": "Adapters",
        "status": "pass",
        "summary": "CLAUDE.md and GEMINI.md import AGENTS.md and are up to date",
        "details": [
          "CLAUDE.md: matches the generator",
          "GEMINI.md: matches the generator"
        ]
      },
      {
        "id": "install-paths",
        "name": "Install paths",
        "status": "pass",
        "summary": "Correct paths for all 6 agents; layouts re-discovered",
        "details": [
          "Claude Code: 5 files, 1 skill in .claude/skills/",
          "Codex CLI: 4 files, 1 skill in .agents/skills/",
          "Cursor: 4 files, 1 skill in .agents/skills/",
          "Gemini CLI: 5 files, 1 skill in .agents/skills/",
          "Antigravity CLI: 4 files, 1 skill in .agents/skills/",
          "GitHub Copilot: 4 files, 1 skill in .agents/skills/"
        ]
      },
      {
        "id": "mcp",
        "name": "MCP config",
        "status": "n/a",
        "summary": "No MCP servers in this loadout",
        "details": []
      },
      {
        "id": "safety",
        "name": "Safety scan",
        "status": "pass",
        "summary": "Clean: no credentials, risky shell, hidden text or covert instructions",
        "details": [
          "Scanner intake-precheck/2: verdict clean; network no (listing says no)"
        ]
      },
      {
        "id": "references",
        "name": "References",
        "status": "pass",
        "summary": "2 references between files resolve for every agent",
        "details": []
      },
      {
        "id": "size",
        "name": "Size limits",
        "status": "pass",
        "summary": "6 files, 15.0 KB total; largest skills/skill-listing-audit/scripts/skill_listing.py 7.4 KB",
        "details": [
          "Limits: 30 files, 32 KB per file, 128 KB total, 500 lines per skill or rule"
        ]
      },
      {
        "id": "licence",
        "name": "Licence",
        "status": "pass",
        "summary": "MIT, by SetupBay; text in the repository LICENSE",
        "details": []
      },
      {
        "id": "starter-build",
        "name": "Starter build",
        "status": "pass",
        "summary": "The skill-listing-audit script passes the loadout's own skill and a well-written sample, then catches each planted problem: a missing description, an entry over Claude Code's 1,536-character cap, an unquoted colon in front matter, a vague description with no trigger, a name that differs from its fol",
        "details": [
          "Applied 9 loadout files at every agent's paths",
          "✓ the loadout's own skill passes (Claude Code and shared paths): bash -c python3 .agents/skills/skill-listing-audit/scripts/skill_listing.py .claude/skills .agents/skills; echo \"exit=$?\"",
          "✓ a good description passes: bash -c python3 .agents/skills/skill-listing-audit/scripts/skill_listing.py samples/good-release-notes; echo \"exit=$?\"",
          "✓ planted problems are each reported: bash -c python3 .agents/skills/skill-listing-audit/scripts/skill_listing.py samples; echo \"exit=$?\"",
          "✓ listing budget estimate scales with the context window: bash -c python3 .agents/skills/skill-listing-audit/scripts/skill_listing.py --context 20000 samples/long-history samples/good-release-notes samples/review samples/pr-check samples/vague-db; true",
          "Covers: Claude Code's documented 1,536-character cap per entry (description plus when_to_use) and 1% listing budget; Codex's 2% / 8,000-character budget",
          "Covers: Front matter problems that stop a skill loading: unquoted colon, no description",
          "Covers: Descriptions that don't trigger: no 'use when' clause, long first sentence, near-duplicates",
          "Covers: disable-model-invocation skills are left out of the budget",
          "Covers: Not covered: whether a live agent actually picks the skill (the skill's step 4 is a manual check)"
        ]
      }
    ]
  },
  "install": {
    "claude-code": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "CLAUDE.md",
          "target": "CLAUDE.md",
          "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/CLAUDE.md",
          "role": "adapter"
        },
        {
          "path": "skills/skill-listing-audit/SKILL.md",
          "target": ".claude/skills/skill-listing-audit/SKILL.md",
          "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/skills/skill-listing-audit/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/skill-listing-audit/scripts/skill_listing.py",
          "target": ".claude/skills/skill-listing-audit/scripts/skill_listing.py",
          "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/skills/skill-listing-audit/scripts/skill_listing.py",
          "role": "reference"
        },
        {
          "path": "skills/skill-listing-audit/references/description-examples.md",
          "target": ".claude/skills/skill-listing-audit/references/description-examples.md",
          "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/skills/skill-listing-audit/references/description-examples.md",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://setupbay.com/download/skill-descriptions-that-trigger/claude-code.zip"
    },
    "codex": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/skill-listing-audit/SKILL.md",
          "target": ".agents/skills/skill-listing-audit/SKILL.md",
          "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/skills/skill-listing-audit/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/skill-listing-audit/scripts/skill_listing.py",
          "target": ".agents/skills/skill-listing-audit/scripts/skill_listing.py",
          "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/skills/skill-listing-audit/scripts/skill_listing.py",
          "role": "reference"
        },
        {
          "path": "skills/skill-listing-audit/references/description-examples.md",
          "target": ".agents/skills/skill-listing-audit/references/description-examples.md",
          "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/skills/skill-listing-audit/references/description-examples.md",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://setupbay.com/download/skill-descriptions-that-trigger/codex.zip"
    },
    "cursor": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/skill-listing-audit/SKILL.md",
          "target": ".agents/skills/skill-listing-audit/SKILL.md",
          "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/skills/skill-listing-audit/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/skill-listing-audit/scripts/skill_listing.py",
          "target": ".agents/skills/skill-listing-audit/scripts/skill_listing.py",
          "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/skills/skill-listing-audit/scripts/skill_listing.py",
          "role": "reference"
        },
        {
          "path": "skills/skill-listing-audit/references/description-examples.md",
          "target": ".agents/skills/skill-listing-audit/references/description-examples.md",
          "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/skills/skill-listing-audit/references/description-examples.md",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://setupbay.com/download/skill-descriptions-that-trigger/cursor.zip"
    },
    "gemini-cli": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "GEMINI.md",
          "target": "GEMINI.md",
          "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/GEMINI.md",
          "role": "adapter"
        },
        {
          "path": "skills/skill-listing-audit/SKILL.md",
          "target": ".agents/skills/skill-listing-audit/SKILL.md",
          "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/skills/skill-listing-audit/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/skill-listing-audit/scripts/skill_listing.py",
          "target": ".agents/skills/skill-listing-audit/scripts/skill_listing.py",
          "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/skills/skill-listing-audit/scripts/skill_listing.py",
          "role": "reference"
        },
        {
          "path": "skills/skill-listing-audit/references/description-examples.md",
          "target": ".agents/skills/skill-listing-audit/references/description-examples.md",
          "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/skills/skill-listing-audit/references/description-examples.md",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://setupbay.com/download/skill-descriptions-that-trigger/gemini-cli.zip"
    },
    "antigravity-cli": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/skill-listing-audit/SKILL.md",
          "target": ".agents/skills/skill-listing-audit/SKILL.md",
          "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/skills/skill-listing-audit/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/skill-listing-audit/scripts/skill_listing.py",
          "target": ".agents/skills/skill-listing-audit/scripts/skill_listing.py",
          "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/skills/skill-listing-audit/scripts/skill_listing.py",
          "role": "reference"
        },
        {
          "path": "skills/skill-listing-audit/references/description-examples.md",
          "target": ".agents/skills/skill-listing-audit/references/description-examples.md",
          "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/skills/skill-listing-audit/references/description-examples.md",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://setupbay.com/download/skill-descriptions-that-trigger/antigravity-cli.zip"
    },
    "copilot": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/skill-listing-audit/SKILL.md",
          "target": ".agents/skills/skill-listing-audit/SKILL.md",
          "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/skills/skill-listing-audit/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/skill-listing-audit/scripts/skill_listing.py",
          "target": ".agents/skills/skill-listing-audit/scripts/skill_listing.py",
          "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/skills/skill-listing-audit/scripts/skill_listing.py",
          "role": "reference"
        },
        {
          "path": "skills/skill-listing-audit/references/description-examples.md",
          "target": ".agents/skills/skill-listing-audit/references/description-examples.md",
          "raw_url": "https://setupbay.com/raw/skill-descriptions-that-trigger/1.0.0/skills/skill-listing-audit/references/description-examples.md",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://setupbay.com/download/skill-descriptions-that-trigger/copilot.zip"
    }
  },
  "source_zip_url": "https://setupbay.com/download/skill-descriptions-that-trigger/source.zip"
}