Skill Review logo

Skill Review

Organization
intercom
skill-review

Review Claude Code skills against substantive quality standards — an 8-category rubric with JSON output, single-pass full-rubric review, and a determinism contract. Complements Anthropic's `plugin-dev:skill-reviewer` (structural checks). Use for: "review a skill", "check skill quality", "does this skill need evals", "review skill quality".

Overview

Publisherintercom
Repository2x-skills
Skill nameskill-review
Stars
251
Forks
14
Bundled files
9
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 9 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by intercom on GitHub. Read the source before you install it.

Installation

Install the Skill Review AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/intercom/2x-skills/tree/main/plugins/skill-tools/skills/skill-review
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/intercom/2x-skills.git /tmp/2x-skills
mkdir -p .claude/skills
cp -r /tmp/2x-skills/plugins/skill-tools/skills/skill-review .claude/skills/skill-review
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Skill Review in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Skill Review on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Skill Review is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Skill Review

Purpose

Review skills for substantive quality signals that Anthropic's plugin-dev:skill-reviewer does not cover. That agent handles structural concerns (frontmatter format, word count, writing style, progressive disclosure). This skill focuses on substance — whether the skill gives Claude the right kind of content, has appropriate test coverage, uses hooks effectively, and lives in the right location.

The rubric is authoritative and closed. Every finding type the reviewer can surface is enumerated in the per-category reference files. Reviewers match against the rubric; they do not invent new buckets. If a concern doesn't fit any enumerated finding type, it belongs in the out-of-rubric channel — never inline as Critical/Major/Minor.

Closed does not mean conservative. "Closed" constrains the set of finding types you may emit — it does not mean you should hesitate to apply the ones that exist. The two are independent: never invent a new finding type, AND never withhold a defined one when its predicate plausibly matches. The judgment-bound finding types — operational-guardrail-untested and guardrail-eval-unpressured (Test Coverage), contradictory-instructions and the three Behaviour sub-checks (Integrity), procedure-smell-with-consequence, form-mismatch, and negotiable-guardrail (Content Quality), description-encodes-process (Convention), the orchestration pair (Cost/Convention), the four frontier-model instruction anti-patterns — verification-ritual, emphasis-inflation, reasoning-scaffold, stale-few-shot-example (Cost) — dated-model-configuration (Integrity), and the Hooks judgment findings — skill-advertisement-hook, heavy-work-in-hook, hot-event-hook, duplicate-hook (Hooks) — are the ones a reviewer most often under-fires, because the defect is buried in an otherwise-sound skill and nothing jumps out on a first read. The form-mismatch / negotiable-guardrail pair is especially easy to miss because the content of a discipline rule can be correct while its form quietly fails to make it stick — a "prefer…" where a prohibition is needed, or a guardrail with an "unless it matters" escape hatch. For these types, pass is a claim that must be earned, not a default: a category may be marked pass only after you have positively checked the predicate (enumerated every guardrail and cross-checked it against the evals, read every referenced script, compared every same-condition instruction pair) and found it does not hold — not merely because no red flag was salient. When a defined predicate plausibly matches, fire it; absence of an obvious problem is not evidence of absence.

How a Review Runs

A review is a single pass: load every category reference, evaluate all eight categories against the skill, and emit the full JSON. There is no triage gate — no category is skipped for looking clean, so a finding can never be missed because its category's deep-dive reference was never opened. This trades token spend for recall by construction.

  1. Read the skill folder and the scripts it invokes. SKILL.md body and frontmatter, references/ listing, evals/ listing, and any scripts the skill ships or invokes — both scripts under the skill's own scripts/ and shared scripts at the plugin root (e.g. ${CLAUDE_PLUGIN_ROOT}/scripts/...) that the SKILL.md references and tells Claude to run. A skill whose scripts live at the plugin level is the common case, not the exception — Glob for the referenced script paths and read them; do not treat "no scripts/ dir inside the skill folder" as "no scripts to review". Also read any agent files the skill references or is paired with (a plugin-root agents/*.md the skill hands off to) — Integrity's dated-model-configuration check explicitly covers "the skill, its agents, or its scripts", so a stale model ID in an agent's frontmatter is in scope even though it lives outside the skill's own folder. Every check in this skill is performed by reading — Read, Grep, and Glob are the only tools needed. Note the skill's reach (a widely-shared skill published in a plugin/marketplace vs a personal or project-local skill) and its diff status (M if it's being modified in this PR) — Test Coverage and the stale-eval checks depend on both.
  2. Load all eight category references. Read every deep-dive listed in Reference Files before evaluating. Load suggested-rewrites.md too if any finding will need a rewrite. Each reference owns the finding types, severity tiers, false-positive guardrails, and rewrite policy for its category — applying a category without its reference loaded is not permitted.
  3. Evaluate every category. Apply each reference's rubric to the skill by reading it directly. A category with no matching finding emits {"status": "pass", "findings": []}; otherwise it emits its findings with finding_type, severity, deterministic, location, explanation, fix, and optionally suggested_rewrite. A skill that is mostly deterministic glue (pinned queries, fixed tool/MCP call sequences, output templates) — counting body and references/ — is the script-extractable-orchestration (Cost) / orchestration-shaped-skill (Convention) pair; single-pass already loads both references every run, so no triage hint is needed to reach it.
  4. Emit structured JSON. Output the full JSON — all eight categories, including the ones that passed clean — per the Output Contract below. This skill's contract ends at the JSON.

Categories

CategoryScopeDeep dive
Structural DisciplineBody shape and progressive-disclosure hygienestructural.md
IntegrityClaims resolve: cross-plugin / MCP / command references resolve, model IDs and API parameters aren't dated, instructed tools are declared in allowed-tools, paired files match, prose counts agree, instructions don't contradict each other, bundled scripts workintegrity.md
Test CoverageEvals exist for skills with broad reach; operational guardrails are exercised — and discipline guardrails are exercised under pressure, not just on the happy path; evals actually test what they claim (no stale or false-coverage evals, no trigger evals on a skill with model invocation disabled)test-coverage.md
SecurityNo credential exposure, no plaintext-secret instructions, safe shell idioms, transport security not disabledsecurity.md
Content QualityContext vs instructions, procedure smell, weak completion criteria, no-op instructions, form-matching (a discipline rule in a form that holds vs soft guidance; a self-negating guardrail) — does the body teach Claude something it couldn't derive, without restating defaults, in a form that makes it stickcontent-quality.md
ConventionPlacement + triggering: where the skill lives (personal / project / plugin), similar-skill duplication, hook integration, description shape (routes vs summarises the body vs encodes the workflow), invocation mode (a skill that can't usefully auto-fire — slash-command-only or a sealed-input sub-routine — still shaped for auto-fire, or disable-model-invocation: true on a skill that native scheduled tasks must fire), repo-convention adherence (frontmatter fields — e.g. an agent's model: — vs the repo's documented conventions)convention.md
CostRuntime token-spending patterns: bash chains, MCP result-size, field projection, frontier-model instruction anti-patterns (verification rituals, emphasis inflation, reasoning scaffolds, stale few-shot examples)cost.md
HooksWhether a hook associated with the skill is justified (passes the deterministic-gate decision test rather than injecting static words for the model) and well-built (narrow matcher, cheap short-circuit, correct block convention, no heavy synchronous work, no duplication)hooks.md

Category boundaries worth calling out:

  • Structural vs Cost — both touch token waste, but Structural owns body shape (length, body↔references duplication, flat reference lists) and Cost owns runtime spending patterns (script-extractable chains, MCP defaults, field projection). Body↔references duplication is Structural even though it also wastes tokens.
  • Content Quality vs Convention — Content Quality is about what's in the body (context vs instructions). Convention is about where the skill lives and how it fires (placement, similar skills, hooks). A skill can have perfect content but a missing hook, or vice versa.
  • Integrity vs Security — both read the skill's bundled scripts, but they ask different questions. Integrity asks do the skill's claims hold? — both that named things resolve (file/skill/command/MCP tool exists) and that the code it ships actually works (no crash, no hardcoded-environment break, no silently-wrong output). Security asks is it safe? (credential exposure, injection, path traversal). A rm -rf "$unvalidated" is Security; a KeyError on a documented input or a call to a non-existent MCP tool is Integrity. A defect that is both → file the more severe.
  • Cost ⊕ Convention for deterministic orchestration — the one intentional two-finding case. A skill that is mostly deterministic glue end-to-end (pinned queries + fixed call sequences + output templating, often hiding in references/) is filed in BOTH Cost (script-extractable-orchestration, the per-session token-cost lens) AND Convention (orchestration-shaped-skill, the marketplace-shape lens). Both are Major by default with a strict firing bar (fire on dominance of glue, never mere presence) and share one extract-glue fix — move the pipeline into a bundled scripts/ file, keep a thin skill over the judgment kernel; never recommend deleting the skill. A single extractable chain in an otherwise-sound skill is Cost-only (scriptable-bash-chain), not this pair.
  • Content Quality vs Cost on frontier-model instruction anti-patterns — two pairs that otherwise double-file. Restating a default is Content Quality no-op-instruction, inflating an already-real rule is Cost emphasis-inflation; derivable domain steps are Content Quality procedure-smell-with-consequence, a prescribed thinking ritual is Cost reasoning-scaffold. File each line under one of its pair; the reference files carry the worked examples.
  • Hooks vs Convention vs Security — three different questions about a skill's hooks. Convention § Hook Integration asks "should this hookless skill GAIN a hook to fire more reliably?" (a triggering opportunity, usually "no hook needed"). Hooks asks "is the hook this skill ALREADY has justified and well-built?" (the hook-quality lens). Security owns any credential in hook source. So a hookless skill that would benefit from a gate is Convention; an always-on skill-advertisement hook that should be migrated to CLAUDE.md is Hooks; a hardcoded token in a hook script is Security — file it there once, not also under Hooks.

Each category reference is self-contained. It defines the scope, the finding types in its rubric, the severity tier each one carries, the false-positive guardrails, the non-obvious constraints reviewers must apply, and the rewrite policy for its category. To find out what a Major finding in Integrity looks like, read integrity.md — no other file owns that information.

If a candidate finding doesn't clearly belong to any category, it's an out-of-rubric concern — log it in the JSON out_of_rubric[] channel (see Output Contract). Do not invent a new category to fit it.

Output Contract

The reviewer's final message MUST be a single fenced json code block matching the schema below — and nothing else. No preceding markdown headings, no trailing prose, no "## Skill Review" wrapper, no narration. The JSON is the artifact. Downstream consumers (a CI action's markdown renderer, dashboards, anyone running the skill locally) parse this JSON; whatever decoration the LLM might add is wasted tokens and breaks the parser.

json
{
  "skill": "<skill-name-and-path>",
  "categories": [
    {
      "name": "Structural Discipline",
      "status": "pass",
      "findings": []
    },
    {
      "name": "Integrity",
      "status": "findings",
      "findings": [
        {
          "finding_type": "broken-cross-plugin-reference",
          "severity": "major",
          "deterministic": true,
          "location": "SKILL.md:42",
          "explanation": "Reference `acme-tools:nonexistent-skill` does not resolve in the repo.",
          "fix": "Create the skill, fix the reference, or remove the claim.",
          "suggested_rewrite": null
        }
      ]
    },
    {
      "name": "Test Coverage",
      "status": "pass",
      "findings": []
    },
    {
      "name": "Security",
      "status": "pass",
      "findings": []
    },
    {
      "name": "Content Quality",
      "status": "findings",
      "findings": [
        {
          "finding_type": "procedure-smell-with-consequence",
          "severity": "major",
          "deterministic": false,
          "location": "SKILL.md:22-38",
          "explanation": "Section `## Checking Deployments` is a 6-step numbered procedure teaching generic deploy-tool usage Claude already knows. Concrete behavior caused: in a sample review fixture, Claude followed the steps verbatim instead of adapting to the user's actual question about a stuck stage.",
          "fix": "Replace the numbered procedure with declarative context (which stages tend to get stuck, what locked stages mean, common quirks).",
          "suggested_rewrite": "## Deployment Context\n\n- **Stuck stages**: The `asset-compile` stage is the most common bottleneck — it can take 15-20 minutes. If longer, check the sub-deployment logs for OOM kills.\n- **Locked stages**: A locked production stage usually means an active incident — check the incident channel before unlocking. Only on-call can unlock production.\n- **Approval flow**: Production stages need the PR author's team lead approval. Staging auto-approves. Missing approval often means the author merged from a fork.\n- **Rollback signals**: >2 rollbacks in the last hour for the same app may indicate an active incident — check the incident thread before re-deploying."
        }
      ]
    },
    {
      "name": "Convention",
      "status": "pass",
      "findings": []
    },
    {
      "name": "Cost",
      "status": "pass",
      "findings": []
    },
    {
      "name": "Hooks",
      "status": "findings",
      "findings": [
        {
          "finding_type": "skill-advertisement-hook",
          "severity": "major",
          "deterministic": false,
          "location": "hooks/remind-deploy.sh:1-7",
          "explanation": "The plugin's `UserPromptSubmit` hook greps every prompt and injects a static \"you MUST invoke skill X\" nudge with no once-per-session dedup — advertisement payload that belongs in the skill description / CLAUDE.md, escalated to Major because it re-fires on every turn.",
          "fix": "Apply the migration protocol: migrate to the description only with evidence the description path fires and after consulting the hook's users; otherwise keep-and-harden (once-per-session dedup + one-line pointer + fail-open). Do not reflexively delete.",
          "suggested_rewrite": null
        }
      ]
    }
  ],
  "out_of_rubric": [
    {
      "location": "SKILL.md:54",
      "explanation": "Skill body declares an unusual prompt-caching strategy that doesn't fit any current finding type.",
      "rationale": "Cost concern, but not the bash-chain, MCP-result-size, or field-projection pattern. Logged for monthly rubric review."
    }
  ]
}

Field rules:

  • categories[] includes all eight categories in rubric order, even when empty. Status is pass when findings: [], findings otherwise.
  • finding_type is a kebab-case identifier defined in the per-category reference. Reviewers do not invent new identifiers.
  • severity is critical | major | minor — the value the category reference assigns to that finding type, including any explicit escalation predicate.
  • deterministic: true indicates the finding follows mechanically from reading the file (e.g. cross-plugin reference resolution, prose-vs-table count, a documented-convention frontmatter-field check) and so must be stable across reruns. false indicates judgment-bound (rerun variance is expected). The determinism eval filters on this flag.
  • location, explanation, fix are required on every finding. suggested_rewrite is the rewrite block content per the per-category rewrite policy; null when the policy is "describe in prose only".
  • out_of_rubric[] uses the same shape as a finding (minus finding_type, severity, deterministic) — location, explanation, and rationale are required. These never appear in the PR comment; they're logged for monthly rubric review (a maintainer promotes a finding type with ≥3 instances or a security implication via a follow-up PR).

Determinism Contract

Same skill + same rubric → same findings. The contract is not "byte-identical output" — LLM prose varies. The contract is:

  • Severity stability — every deterministic finding type produces the same severity across runs.
  • Finding-set stability — the set of deterministic finding types reported as present is identical across runs.
  • Order stability — categories appear in rubric order; findings within a category appear in rubric order.
  • Not promised — prose explanation wording, prose fix wording, prose inside suggested_rewrite. LLM variance is allowed there by construction.

The deterministic field on each finding sets its testing contract:

deterministicMeaningDeterminism-eval scope
trueFollows mechanically from reading the file — cross-plugin / MCP / command reference resolution, paired-file byte-diff, prose-vs-table count, documented-convention frontmatter-field checkIn scope — assert finding presence + severity across reruns, allow prose variance
falseJudgment-bound (procedure smell, similar-skill verdict, behaviour bugs, stale evals, etc.)Out of scope — filtered out of the determinism eval

Mark a finding deterministic: true only when its presence and severity follow mechanically from the file — never on a judgment call. A deterministic finding that flickers between runs is a bug in the reviewer, not acceptable LLM variance.

Reference Files

Load all eight category references at the start of every review — each category is evaluated every run. Load suggested-rewrites.md as well whenever a finding will carry a rewrite.

  • references/structural.md — Structural Discipline (body↔references duplication, conditional reference loading). Load when assessing structural findings.
  • references/integrity.md — Integrity (existence + equivalence; cross-plugin reference blast-radius rules; dated model IDs / API parameters). Load when assessing integrity findings.
  • references/test-coverage.md — Test Coverage (eval-requirement by reach, operational-guardrail-untested predicate, eval-quality minors). Load when assessing eval coverage.
  • references/security.md — Security (credential paste, plaintext secrets, executable-script bugs — including bundled hook scripts). Load when assessing security findings.
  • references/content-quality.md — Content Quality (procedure smell, context-vs-instructions, the rewrite method). Load when assessing what's in the skill body. Hook integration is NOT here — see convention.md.
  • references/convention.md — Convention (placement, similar-skill duplication, hook integration, repo-convention adherence like an agent's model: field). Load when assessing placement and triggering findings.
  • references/cost.md — Cost (bash chains, MCP result-size nudges, field projection, frontier-model instruction anti-patterns: verification rituals, emphasis inflation, reasoning scaffolds, stale few-shot examples). Load when assessing token-efficiency findings.
  • references/hooks.md — Hooks (the deterministic-gate decision test, skill-advertisement-hook migration protocol, heavy-work / matcher / raw-JSON-grep / block-convention / duplicate-hook checks). Load when the skill's plugin ships a hook that names, advertises, or gates the skill. Whether a hookless skill should gain a hook is Convention, not here.
  • references/suggested-rewrites.md — Cross-cutting format spec for the rewrite block (details block, placement, authoring constraints). The decision whether to rewrite for a given finding lives in that finding's category reference. Load when producing a rewrite.

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Skill Review AI skill do?

Review Claude Code skills against substantive quality standards — an 8-category rubric with JSON output, single-pass full-rubric review, and a determinism contract. Complements Anthropic's `plugin-dev:skill-reviewer` (structural checks). Use for: "review a skill", "check skill quality", "does this skill need evals", "review skill quality".

Why use Skill Review on TypingMind?

Because you install it once and use it with any model. Skill Review is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Skill Review in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/intercom/2x-skills/tree/main/plugins/skill-tools/skills/skill-review. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Skill Review?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Skill Review?

As many as you like. As long as a model supports skills, you can use Skill Review with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Skill Review AI skill free?

Yes. It is published on GitHub by intercom under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇