From intent-labs-pack
Validates SKILL.md files against the Intent Solutions four-tier rubric (locate, standard/marketplace grading, static production gate, JRig behavioral eval). Use when creating, reviewing, or gating skills for production.
How this skill is triggered — by the user, by Claude, or both
Slash command
/intent-labs-pack:validate-skillmd [path-to-SKILL.md] [--marketplace|--deep|--thorough][path-to-SKILL.md] [--marketplace|--deep|--thorough]This skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Grade any SKILL.md file against the Intent Solutions rubric (validator v7.0 / schema 3.3.1). Four-tier validation: **Tier 0** (locate), **Tier 1** (standard or marketplace grading), **Tier 2** (static production gate), **Tier 3** (JRig behavioral eval — opt-in).
Grade any SKILL.md file against the Intent Solutions rubric (validator v7.0 / schema 3.3.1). Four-tier validation: Tier 0 (locate), Tier 1 (standard or marketplace grading), Tier 2 (static production gate), Tier 3 (JRig behavioral eval — opt-in).
Source of truth: /skill-creator validation workflow + claude-code-plugins-plus-skills/000-docs/SCHEMA_CHANGELOG.md + j-rig-skill-binary-eval/ (Tier 3).
Schema 3.3.1 enforces the 8-field IS enterprise required-field set at marketplace tier (name, description, allowed-tools, version, author, license, compatibility, tags). Anthropic's spec floor (name + description only) sits underneath; the IS rubric sits on top. Modes:
platform.claude.com/docs/en/agents-and-tools/agent-skills/overview exactly. Required: name, description. Everything else is silent unless invalid type/value. Fast (~10 sec).--marketplace): 8-field enterprise required set + 100-point IS rubric. Missing required fields = ERROR, not warning. The --enterprise flag is a deprecated alias. Fast (~10 sec).--deep): Intent Solutions Deep Evaluation Engine — 10 weighted dimensions, trust badges, Elo competitive ranking, optional LLM quality assessment via Groq. Fast (~30 sec).--thorough): Adds Tier 3 JRig behavioral eval on top of Tier 1+2. Runs 7-layer eval across Haiku/Sonnet/Opus. Slow (~10–30 min) and costs ~$2–5 per skill in API spend — opt-in only. Right for production-gating, not iterative authoring.Performance + cost note: Tiers 0–2 run in seconds and are free. Tier 3 (JRig) is opt-in because behavioral eval across the model matrix is genuinely expensive. Default invocations stay fast;
--thoroughis for the moment a skill is being promoted to production or marketplace-verified.
pyyaml installedclaude-code-plugins-plus-skills/scripts/validate-skills-schema.py (v7.0+)--thorough (Tier 3): JRig CLI on PATH (jrig --version returns ≥ v0.14.0). Install: cd ~/000-projects/j-rig-binary-eval && pnpm install && pnpm build && pnpm link --global. Tier 3 is opt-in; the rest of the skill works without JRig installed.Validate frontmatter structure against references/kernel-schemas/v1/skill-frontmatter.schema.json
FIRST — the kernel-pinned canonical machine spec (@intentsolutions/[email protected], vendored;
the STRICT v2 sibling under kernel-schemas/v2/ is not yet promoted to canonical). The
prose spec references are supporting documentation only; on disagreement the kernel schema
wins. $refs are absolute $id URIs — register every file under kernel-schemas/ to
resolve them. Provenance + refresh: references/kernel-schemas/PROVENANCE.md.
Full field table: schema-reminder-frontmatter.md.
If path provided via $ARGUMENTS, use it directly. Otherwise:
Common locations:
~/.claude/skills/{name}/SKILL.md (global).claude/skills/{name}/SKILL.md (project)# Standard tier (default — Anthropic spec exactly)
python3 claude-code-plugins-plus-skills/scripts/validate-skills-schema.py SKILL.md
# Marketplace tier (full 100-point rubric, polish recommendations as warnings)
python3 claude-code-plugins-plus-skills/scripts/validate-skills-schema.py --marketplace SKILL.md
# Deep evaluation (10 dimensions, badges, Elo ranking)
python3 claude-code-plugins-plus-skills/scripts/validate-skills-schema.py --deep SKILL.md
# Deep + LLM quality assessment via Groq (requires GROQ_API_KEY)
python3 claude-code-plugins-plus-skills/scripts/validate-skills-schema.py --deep --thorough SKILL.md
# Deep eval with JSON/markdown/HTML report output
python3 claude-code-plugins-plus-skills/scripts/validate-skills-schema.py --deep --report-format json SKILL.md
python3 claude-code-plugins-plus-skills/scripts/validate-skills-schema.py --deep --report-format html SKILL.md
# Marketplace + write to compliance DB
python3 claude-code-plugins-plus-skills/scripts/validate-skills-schema.py --marketplace --populate-db claude-code-plugins-plus-skills/freshie/inventory.sqlite SKILL.md
# Show D/F grade skills in full scan
python3 claude-code-plugins-plus-skills/scripts/validate-skills-schema.py --marketplace --show-low-grades
# Minimum grade gate (exits 1 if any skill below threshold)
python3 claude-code-plugins-plus-skills/scripts/validate-skills-schema.py --marketplace --min-grade B SKILL.md
Default to marketplace tier when the user is preparing for marketplace submission. Use --deep for functional quality assessment beyond structural compliance. The --enterprise flag still works as a deprecated alias for --marketplace.
v6.0 Deep Evaluation Engine: 10 weighted dimensions (triggering accuracy 0.25, orchestration fitness 0.20, output quality 0.15, scope calibration 0.12, progressive disclosure 0.10, token efficiency 0.06, robustness 0.05, structural completeness 0.03, code template quality 0.02, ecosystem coherence 0.02). Anti-pattern detection with 5% penalty each. Elo competitive ranking. Trust badges (Flagship/Established/Emerging/Early). Optional LLM-as-judge via Groq free tier.
After Tier 1 grading and before any behavioral eval, run five inline static checks. These catch obvious production blockers in seconds without needing JRig. Always run regardless of mode (standard/marketplace/deep/thorough); each is binary pass/fail.
allowed-tools accuracyEvery tool declared in allowed-tools should actually be referenced somewhere in the skill body or its references//scripts/. Conversely, every tool the skill calls should be declared.
# Extract declared tools (handles CSV string, space-separated, and YAML list forms — schema 3.3.1)
declared=$(python3 -c "import yaml,sys; fm=yaml.safe_load(open('SKILL.md').read().split('---')[1]); t=fm.get('allowed-tools',''); print(t if isinstance(t,str) else ' '.join(t))")
# Each declared base tool (Read, Write, Bash, etc.) must appear in the body
for tool in $(echo "$declared" | grep -oE '[A-Z][a-zA-Z]+' | sort -u); do
if ! grep -q "$tool" "SKILL.md"; then
echo "FAIL: tool '$tool' declared but not referenced in body"
fi
done
Fail when: tool declared but never used (over-permissive — attack surface) OR tool used but never declared (will prompt user every invocation, defeating allowed-tools).
If the skill mentions an external API (any URL, curl, fetch, MCP server, OAuth flow, API key reference), an authentication method must be documented in the body or in references/auth.md / references/api-surface.md.
# Heuristic: look for API indicators
if grep -qE "(curl |fetch\(|mcp__|API_KEY|TOKEN|OAuth|Bearer )" "SKILL.md"; then
if ! grep -qiE "(authentication|auth method|api key|bearer token|oauth flow|credentials)" "SKILL.md"; then
echo "FAIL: external API referenced but no auth protocol documented"
fi
fi
Fail when: API surface is referenced but a future engineer reading the skill couldn't tell how authentication happens.
Conditional structures that can never fire (e.g., if false, mutually exclusive guards, sections that contradict an earlier hard-fail).
# Conservative checks — flag for human review, don't auto-fail
grep -nE "^(if false|if \[ false \]|elif false)" "SKILL.md" && echo "WARN: literal-false branch found"
grep -cE "^### " "SKILL.md" # If section count grossly exceeds the table-of-contents count → drift
Warn when: a literal-false branch is found OR the body contains sections not present in the table of contents (silent drift).
Dangerous combinations require explicit justification:
| Combo | Why dangerous |
|---|---|
Bash (unscoped) + WebFetch | Can fetch arbitrary content + execute it |
Bash (unscoped) + Write | Can write executable scripts to arbitrary locations |
Bash(curl:*) + Bash(sh:*) | Curl-pipe-shell pattern |
Bash(rm:*) not paired with explicit safe-paths | Unbounded delete authority |
# Check for unscoped Bash + dangerous companion
if grep -qE "^allowed-tools:.*\bBash\b" "SKILL.md" && \
! grep -qE "^allowed-tools:.*Bash\(" "SKILL.md" && \
grep -qE "^allowed-tools:.*\b(Write|WebFetch)\b" "SKILL.md"; then
if ! grep -qiE "(safety justification|why unscoped Bash|why Bash + )" "SKILL.md"; then
echo "FAIL: unscoped Bash + Write/WebFetch without safety justification"
fi
fi
Fail when: a dangerous combo is declared and the body has no ## Safety Justification section explaining why the wide scope is necessary.
Skills are NOT plugins. A skill should not spawn other skills, delegate to other agents as a primary control flow, or self-coordinate across sessions. That's /skill-creator --forge territory and plugin-level orchestration. Skills do one job.
# Look for orchestration smells in skills
if grep -qE "(spawn another skill|delegate to /|invoke .* skill|orchestrate across|self-coordinate)" "SKILL.md"; then
echo "FAIL: skill appears to orchestrate other skills/agents — that belongs at the plugin layer"
fi
Fail when: the skill body claims it spawns/orchestrates other skills or agents as the primary control flow. Multi-agent synthesis WITHIN one skill invocation (calling subagents to specialize) is fine and expected; cross-skill orchestration is not.
--thorough)Default skipped. Tier 3 runs only when the user passes
--thorough. Behavioral eval across the model matrix (Haiku / Sonnet / Opus) takes 10–30 minutes per skill and costs ~$2–$5 in API spend. Right for production-gate moments, not iterative authoring.
j-rig --version (note: bin name is j-rig with hyphen, not jrig)cd j-rig-skill-binary-eval/packages/cli && pnpm build && ln -sf $PWD/dist/index.js ~/.local/bin/j-rigIf JRig isn't on PATH, the skill emits a placeholder verdict and a one-line install hint, then continues to Step 3 (grade report) without blocking. Tier 3 absence does not mean a skill fails — only Tier 1+2 are mandatory.
Run JRig's check command on the skill directory (not the SKILL.md path). Returns deterministic pass/warn/error verdicts on package structure: SKILL.md exists + parses, name present, description length, deprecated patterns, time-sensitive content, etc.
# JSON output for parsing into the unified report
j-rig check "$(dirname "SKILL.md")" --json
This is a separate concern from the IS spec-compliance check (Tier 1) — JRig's check is structural, not rubric-based. The Anthropic + AgentSkills.io spec snapshots in 000-docs/ are read by the IS validator (scripts/validate-skills-schema.py), not by JRig directly. The two are complementary: IS validator scores against the spec rubric; JRig verifies the package shape and surfaces structural anti-patterns.
Verdict mapping:
severity: "pass" → Tier 3A GREENseverity: "warning" → Tier 3A YELLOW (non-blocking; surfaced in unified report)severity: "error" → Tier 3A RED (blocks production promotion)# Default invocation — Sonnet only, no DB persistence
j-rig eval "$(dirname "SKILL.md")" --json
# Full model matrix with DB persistence
j-rig eval "$(dirname "SKILL.md")" \
--models haiku,sonnet,opus \
--db claude-code-plugins-plus-skills/freshie/inventory.sqlite \
--json
# Skip specific layers (when iterating)
j-rig eval "$(dirname "SKILL.md")" --no-trigger --no-functional --json
Eval spec source: JRig reads <skill-dir>/eval-spec.yaml if present, or use --spec <path> to point at one elsewhere. A spec is currently required — j-rig eval errors if neither is found. (Auto-generating a baseline spec from the SKILL.md frontmatter — should_trigger/should_not_trigger cases derived from the description trigger phrases — is the planned j-rig scaffold-spec <skill-dir> command; until it ships, author the spec by hand or copy skill/eval.yaml as a template.)
Layers:
JRig writes its own SQLite DB by default (j-rig.db in cwd, or --db <path>). To unify with Freshie, point --db at freshie/inventory.sqlite:
j-rig eval "$(dirname "SKILL.md")" \
--models haiku,sonnet,opus \
--db claude-code-plugins-plus-skills/freshie/inventory.sqlite
JRig manages its own tables in that DB; cross-table joins to skill_compliance happen in the Freshie rebuild script. The unified-report rendering reads both:
-- Inferred join (actual table names per j-rig schema)
SELECT s.skill_path, s.score, s.grade, j.passed, j.layers_passed, j.baseline_delta
FROM skill_compliance s
LEFT JOIN jrig_eval_results j ON j.skill_path = s.skill_path;
Forward-looking: once JRig adds explicit --append-skill-compliance mode, the skill_compliance table can carry these columns directly:
jrig_passed (boolean)jrig_tier_blocked (1–7 if any)jrig_baseline_delta (numeric — skill output vs. naked Claude on same prompt)Until then, the join above is the integration surface.
Tier 3A reads versioned snapshots, NOT live Anthropic / AgentSkills.io docs. Live-fetching from CI is a rate-limit + flakiness risk. The snapshot refresh is a separate PR cadence:
code.claude.com/docs/en/skills and agentskills.io/specification.000-docs/anthropic-skills-spec-snapshot.md + 000-docs/agentskills-spec-snapshot.md.This isolates "the spec changed" events from per-skill validation runs.
Parse the combined output of Tiers 1–3 (or 1+2 when Tier 3 is skipped) and present:
Production verdict: PASS / FAIL / VERIFIED (when Tier 3 ran and all 7 layers green)
┌─ TIER 1: Marketplace grade ─────────────────────────────┐
│ Grade: [LETTER] ([SCORE]/100) │
│ │
│ Pillar | Score | Notes │
│ Progressive Disc. | X/30 | Token economy, structure │
│ Ease of Use | X/25 | Metadata, discoverability │
│ Utility | X/20 | Problem solving, examples │
│ Spec Compliance | X/15 | Frontmatter, naming │
│ Writing Style | X/10 | Voice, objectivity │
│ Modifiers | +/-X | Bonuses/penalties │
└──────────────────────────────────────────────────────────┘
┌─ TIER 2: Static production gate ────────────────────────┐
│ allowed-tools accuracy: PASS / FAIL │
│ Auth protocol documented: PASS / FAIL / N/A │
│ Dead code / drift: PASS / WARN │
│ Tool-safety combo: PASS / FAIL │
│ Orchestration bounds: PASS / FAIL │
│ Verdict: GREEN / YELLOW / RED │
└──────────────────────────────────────────────────────────┘
┌─ TIER 3: JRig behavioral eval (only if --thorough) ─────┐
│ 3A spec compliance: PASS / FAIL │
│ 3B Layer 1 trigger: Haiku|Sonnet|Opus → P/F │
│ Layer 2 functional: Haiku|Sonnet|Opus → P/F │
│ Layer 3 regression: Haiku|Sonnet|Opus → P/F │
│ Layer 4 baseline: Haiku|Sonnet|Opus → P/F │
│ Layer 5 model variance: Haiku|Sonnet|Opus → P/F │
│ Layer 6 rollout safety: Haiku|Sonnet|Opus → P/F │
│ Layer 7 cost/latency: Haiku|Sonnet|Opus → P/F │
│ Baseline delta: +N% vs. naked Claude │
│ Verdict: VERIFIED / BLOCKED / SKIPPED │
└──────────────────────────────────────────────────────────┘
Final verdict logic:
| Tier 1 | Tier 2 | Tier 3 | Final |
|---|---|---|---|
| ≥B | GREEN | VERIFIED | PRODUCTION READY (JRig-Verified) |
| ≥B | GREEN | SKIPPED | PRODUCTION READY (unverified) |
| ≥B | YELLOW | * | PRODUCTION READY with warnings |
| any | RED | * | BLOCKED — fix Tier 2 fails before promoting |
| <B | * | * | BLOCKED — bring grade to B+ before promoting |
| ≥B | GREEN | BLOCKED | BLOCKED — JRig found behavioral regression; fix before promoting |
Grade scale: A (90+), B (80-89), C (70-79), D (60-69), F (<60)
List fixes sorted by point value (highest first):
Top improvements:
Common high-value fixes:
compatible-with → compatibility (deprecation warning fix; run batch-remediate.py --migrate-compatible-with)compatibility: field with one of the AgentSkills.io examples (+1 pt on metadata quality)The validator emits INFO-level structural suggestions (marketplace tier):
## operation-name sections detected without commands/ directory → suggest splitting into individual commands/*.md filesreferences/ directory → suggest moving to references/ with relative markdown links!command`` directivesIf grade < B (80), ask user: "Fix issues automatically?"
If approved, apply in order:
author/version/license from nested metadata to top-level (or vice versa per AgentSkills.io spec — both valid)compatible-with → compatibility via batch-remediate.py --migrate-compatible-with[file](references/file.md); keep ${CLAUDE_SKILL_DIR}/ for DCI/bash onlyBash → Bash(command:*)After fixes, re-run validator and show before/after comparison.
Final report includes:
--thorough); SKIPPED otherwise| Error | Recovery |
|---|---|
| File not found | Suggest Glob to find SKILL.md files nearby |
| Python not available | Read SKILL.md manually, check frontmatter by hand |
| Validator script missing | Fall back to manual checks against rubric pillars |
| YAML parse error | Report the parse error line, suggest fix |
compatible-with deprecation warning | Run batch-remediate.py --migrate-compatible-with |
Validate a specific skill:
/validate-skillmd ~/.claude/skills/repo-sweep/SKILL.md
Marketplace grading (recommended for marketplace submissions):
/validate-skillmd --marketplace path/to/SKILL.md
Natural language:
grade my skill
check skill quality
claude-code-plugins-plus-skills/000-docs/SCHEMA_CHANGELOG.mdclaude-code-plugins-plus-skills/000-docs/6767-b-SPEC-DR-STND-claude-skills-standard.md/skill-creator (Steps V1-V5 in validation workflow)npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin intent-labs-packValidates SKILL.md files against Anthropic guidelines and the agentskills specification. Checks frontmatter structure, required fields, and security issues like XML angle brackets.
Audits pm-skills skills against structural and quality conventions, producing a pass/fail validation report. Use after creating or editing a skill or before running utility-pm-skill-iterate.
Evaluates SKILL.md files for design quality against official specs and best practices, with multi-dimensional scoring and improvement suggestions.