skill-test
SkillFiles & storageValidate skill files for structural compliance and behavioral correctness. Three modes: static (linter), spec (behavioral), audit (coverage report).
Available today. Use it from your connected AI after setup.
No other account needed.
Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.
Then ask your AI: use the skill-test skill
What this skill tells your AI
The instructions your AI receives, as published by negentropy-laby/opendoge in .agents/skills/skill-test/SKILL.md and read by ahel’s review.
User Guide
- When to use: Validate skill files for structural compliance and behavioral correctness. Three modes: static (linter), spec (behavioral), audit (coverage report).
- Inputs: Command arguments:
/skill-test static [skill-name | all] | spec [skill-name] | category [skill-name | all] | audit; project artifacts referenced below; user decisions and approvals before writes. - Outputs: Static/spec/category/audit reports. Approved writes go to
memory_bank/t3_archive/skill_testing/results/and updatememory_bank/t3_archive/skill_testing/coverage-index.yaml. - Memory-bank writes: Reads canonical test assets from
skill_testing/; with approval writes T3 test evidence undermemory_bank/t3_archive/skill_testing/. - Next steps: Follow the workflow hand-off or next-step guidance below; recommendations do not auto-run and require explicit user command/approval.
Phase 0: Domain Routing
Detect the skill domain before testing:
- [Game] verify game examples, player/gameplay/engine language, playtest references, and game CDD paths remain valid.
- [Product] verify product examples, API/CLI/web/data language, product-concept paths, stack references, and product evidence paths remain valid.
- [Both] check that dual-domain skills preserve both branches and do not hide game-only content from game workflows.
A passing skill test must not require deleting game-specific examples.
Skill Test
Validates .agents/skills/*/SKILL.md files for structural compliance and
behavioral correctness. No external dependencies — runs entirely within the
existing skill/hook/template architecture.
Four modes:
| Mode | Command | Purpose | Token Cost |
|---|---|---|---|
static | /skill-test static [name|all] | Structural linter — 7 compliance checks per skill | Low (~1k/skill) |
spec | /skill-test spec [name] | Behavioral verifier — evaluates assertions in test spec | Medium (~5k/skill) |
category | /skill-test category [name|all] | Category rubric — checks skill against its category-specific metrics | Low (~2k/skill) |
audit | /skill-test audit | Coverage report — skills, agent specs, last test dates | Low (~3k total) |
Phase 1: Parse Arguments
Determine mode from the first argument:
static [name]→ run 8 structural/parity checks on one skillstatic all→ run 8 structural/parity checks on all skills (Glob.agents/skills/*/SKILL.md)spec [name]→ read skill + test spec, evaluate assertionscategory [name]→ run category-specific rubric fromskill_testing/quality-rubric.mdcategory all→ run category rubric for every skill that has acategory:in catalogaudit(or no argument) → read catalog, list all skills and agents, show coverage
If argument is missing or unrecognized, output usage and stop.
Phase 2A: Static Mode — Structural Linter
For each skill being tested, read its SKILL.md fully and run all 8 checks:
Check 1 — Required Frontmatter Fields
The file must contain all of these in the YAML frontmatter block:
name:description:argument-hint:user-invocable:allowed-tools:
FAIL if any are absent.
Check 2 — Multiple Phases
The skill must have ≥2 numbered phase headings. Look for patterns like:
## Phase Nor## Phase N:## N.(numbered top-level sections)- At least 2 distinct
##headings if phases aren't explicitly numbered
FAIL if fewer than 2 phase-like headings are found.
Check 3 — Verdict Keywords
The skill must contain at least one of: PASS, FAIL, CONCERNS, APPROVED,
BLOCKED, COMPLETE, READY, COMPLIANT, NON-COMPLIANT
FAIL if none are present.
Check 4 — Collaborative Protocol Language
The skill must contain ask-before-write language. Look for:
"May I write"(canonical form)"before writing"or"approval"near file-write instructions"ask"+"write"in close proximity (within same section)
WARN if absent (some read-only skills legitimately skip this).
FAIL if allowed-tools includes Write or Edit but no ask-before-write language is found.
Check 5 — Next-Step Handoff
The skill must end with a recommended next action or follow-up path. Look for:
- A final section mentioning another skill (e.g.,
/story-done,/gate-check) - "Recommended next" or "next step" phrasing
- A "Follow-Up" or "After this" section
WARN if absent.
Check 6 — Fork Context Complexity
If frontmatter contains context: fork, the skill should have ≥5 phase headings
(## level or numbered Phase N headers). Fork context is for complex multi-phase
skills; simple skills should not use it.
WARN if context: fork is set but fewer than 5 phases found.
Check 7 — Argument Hint Plausibility
argument-hint must be non-empty. If the skill body mentions multiple modes
(e.g., "Mode A | Mode B"), the hint should reflect them. Cross-reference the
hint against the first phase's "Parse Arguments" section.
WARN if hint is "" or if documented modes don't match hint.
Check 8 — Dual-Domain Parity
If the skill advertises Product support in frontmatter or Phase 0, it must also contain Product-specific implementation guidance beyond the first 50 lines. Look for at least two of:
- Product context reads (
product-concept.md, Product CDDs,docs/reference/<stack>/, language specialist, API/CLI/UI/data docs) - Product-specific steps/checks/templates
- Product output report/spec format
- Product next-step handoff
WARN if Product appears only near the top of the file. FAIL if the skill claims Product support but the body remains game-only and would route a Product project through engine/player/playtest/HUD-only behavior.
Also check that game content is preserved:
- Game markers, player/gameplay/engine examples, playtest references, or game CDD paths must not be removed when Product support is added.
- A passing dual-domain skill may include game-only sections, as long as Product sections are present beside them for Product workflows.
Static Mode Output Format
For a single skill:
=== Skill Static Check: /[name] ===
Check 1 — Frontmatter Fields: PASS
Check 2 — Multiple Phases: PASS (7 phases found)
Check 3 — Verdict Keywords: PASS (PASS, FAIL, CONCERNS)
Check 4 — Collaborative Protocol: PASS ("May I write" found)
Check 5 — Next-Step Handoff: WARN (no follow-up section found)
Check 6 — Fork Context Complexity: PASS (8 phases, context: fork set)
Check 7 — Argument Hint: PASS
Verdict: WARNINGS (1 warning, 0 failures)
Recommended: Add a "Follow-Up Actions" section at the end of the skill.
For static all, produce a summary table then list any non-compliant skills:
=== Skill Static Check: All 78 Skills ===
Skill | Result | Issues
-----------------------|--------------|-------
gate-check | COMPLIANT |
design-review | COMPLIANT |
story-readiness | WARNINGS | Check 5: no handoff
...
Summary: 48 COMPLIANT, 3 WARNINGS, 1 NON-COMPLIANT
Aggregate Verdict: N WARNINGS / N FAILURES
Static Mode Optional Evidence Write
Static mode displays results by default. If the user wants to preserve the run, ask:
"May I write this static check to
memory_bank/t3_archive/skill_testing/results/static/skill-test-static-[name|all]-[YYYY-MM-DD].md
and update memory_bank/t3_archive/skill_testing/coverage-index.yaml?"
If yes:
- Write the static result file under
memory_bank/t3_archive/skill_testing/results/static/ - Update each affected skill entry in
coverage-index.yaml:last_static: [date]last_static_result: PASS|WARN|FAILlatest_result_path: memory_bank/t3_archive/skill_testing/results/static/skill-test-static-[name|all]-[YYYY-MM-DD].md
Phase 2B: Spec Mode — Behavioral Verifier
Step 1 — Locate Files
Find skill at .agents/skills/[name]/SKILL.md.
Look up the spec path from skill_testing/catalog.yaml
— use the spec: field for the matching skill entry.
If either is missing:
- Missing skill: "Skill '[name]' not found in
.agents/skills/." - Missing spec path in catalog: "No spec path set for '[name]' in catalog.yaml."
- Spec file not found at path: "Spec file missing at [path]. Run
/skill-test auditto see coverage gaps."
Step 2 — Read Both Files
Read the skill file and test spec file completely.
Step 3 — Evaluate Assertions
For each Test Case in the spec:
- Read the Fixture description (assumed state of project files)
- Read the Expected behavior steps
- Read each Assertion checkbox
For each assertion, evaluate whether the skill's written instructions, if followed correctly given the fixture state, would satisfy it. This is a Codex-evaluated reasoning check, not code execution.
Mark each assertion:
- PASS — skill instructions clearly satisfy this assertion
- PARTIAL — skill instructions partially address it, but with ambiguity
- FAIL — skill instructions would NOT satisfy this assertion given the fixture
For Protocol Compliance assertions (always present):
- Check whether the skill requires "May I write" before file writes
- Check whether the skill presents findings before requesting approval
- Check whether the skill ends with a recommended next step
- Check whether the skill avoids auto-creating files without approval
Step 4 — Build Report
=== Skill Spec Test: /[name] ===
Date: [date]
Spec: skill_testing/specs/skills/[category]/[name].md
Case 1: [Happy Path — name]
Fixture: [summary]
Assertions:
[PASS] [assertion text]
[FAIL] [assertion text]
Reason: The skill's Phase 3 says "..." but the fixture state means "..."
Case Verdict: FAIL
Case 2: [Edge Case — name]
...
Case Verdict: PASS
Protocol Compliance:
[PASS] Uses "May I write" before file writes
[PASS] Presents findings before asking approval
[WARN] No explicit next-step handoff at end
Overall Verdict: FAIL (1 case failed, 1 warning)
Step 4b — Dual-Domain Spec Assertions
For any spec that covers a dual-domain skill, evaluate both branches:
- Game fixture:
design/cdd/game-concept.mdexists. The skill should preserve game terminology, paths, examples, and next steps. - Product fixture:
design/cdd/product-concept.mdexists. The skill should use Product terminology, paths, examples, and next steps.
Mark assertions:
- PASS — both branches are clearly supported.
- PARTIAL — Product is mentioned but lacks equivalent depth.
- FAIL — Product fixture would still execute only game-specific behavior, or the Product change removed game content.
Step 5 — Offer to Write Results
"May I write these results to
memory_bank/t3_archive/skill_testing/results/spec/skill-test-spec-[name]-[YYYY-MM-DD].md
and update memory_bank/t3_archive/skill_testing/coverage-index.yaml?"
If yes:
- Write the result file to
memory_bank/t3_archive/skill_testing/results/spec/ - Update the skill's entry in
memory_bank/t3_archive/skill_testing/coverage-index.yaml:last_spec: [date]last_spec_result: PASS|PARTIAL|FAILlatest_result_path: memory_bank/t3_archive/skill_testing/results/spec/skill-test-spec-[name]-[YYYY-MM-DD].md
Phase 2D: Category Mode — Rubric Evaluation
Step 1 — Locate Skill and Category
Find skill at .agents/skills/[name]/SKILL.md.
Look up category: field in skill_testing/catalog.yaml.
If skill not found: "Skill '[name]' not found."
If no category: field: "No category assigned for '[name]' in catalog.yaml.
Add category: [name] to the skill entry first."
For category all: collect all skills with a category: field and process each.
category: utility skills are evaluated against U1 (static checks pass) and U2
(gate mode correct if applicable) only — skip to the static mode for U1.
Step 2 — Read Rubric Section
Read skill_testing/quality-rubric.md.
Extract the section matching the skill's category (e.g., ### gate, ### team).
Step 3 — Read Skill
Read the skill's SKILL.md fully.
Step 4 — Evaluate Rubric Metrics
For each metric in the category's rubric table:
- Check whether the skill's written instructions clearly satisfy the criterion
- Mark PASS, FAIL, or WARN
- For FAIL/WARN, identify the exact gap in the skill text (quote the relevant section or note its absence)
Step 5 — Output Report
=== Skill Category Check: /[name] ([category]) ===
Metric G1 — Review mode read: PASS
Metric G2 — Full mode directors: FAIL
Gap: Phase 3 spawns only CD-PHASE-GATE; TD-PHASE-GATE, PR-PHASE-GATE, AD-PHASE-GATE absent
Metric G3 — Lean mode: PHASE-GATE only: PASS
Metric G4 — Solo mode: no directors: PASS
Metric G5 — No auto-advance: PASS
Verdict: FAIL (1 failure, 0 warnings)
Fix: Add TD-PHASE-GATE, PR-PHASE-GATE, and AD-PHASE-GATE to the full-mode director
panel in Phase 3.
Step 6 — Offer to Write Results
"May I write this category check to
memory_bank/t3_archive/skill_testing/results/category/skill-test-category-[name]-[YYYY-MM-DD].md
and update memory_bank/t3_archive/skill_testing/coverage-index.yaml
(last_category, last_category_result, latest_result_path) for [name]?"
Phase 2D: Audit Mode — Coverage Report
Step 1 — Read Catalog
Read skill_testing/catalog.yaml for the registry and
memory_bank/t3_archive/skill_testing/coverage-index.yaml for test history.
If either is missing, note the missing file and recommend running /constitute
to initialize the memory-bank testing templates.
Step 2 — Enumerate All Skills and Agents
Glob .agents/skills/*/SKILL.md to get the complete list of skills.
Extract skill name from each path (directory name).
Also read the agents: section from skill_testing/catalog.yaml to get the
complete list of agents.
Step 3 — Build Skill Coverage Table
For each skill:
- Check if a spec file exists (use the
spec:path from catalog, or globskill_testing/specs/skills/*/[name].md) - Look up
last_static,last_static_result,last_spec,last_spec_result,last_category,last_category_result, andlatest_result_pathfromcoverage-index.yaml(or mark as "never" / "—" if not in coverage) - Look up
categoryfrom catalog - Priority comes from catalog
priority:field (critical/high/medium/low)
Step 3b — Build Agent Coverage Table
For each agent in catalog's agents: section:
- Check if a spec file exists (use the
spec:path from catalog, or globskill_testing/specs/agents/*/[name].md) - Look up
last_spec,last_spec_result, andlatest_result_pathfromcoverage-index.yaml - Look up
tierfrom catalog
Step 4 — Output Report
=== Skill Test Coverage Audit ===
Date: [date]
SKILLS (78 total)
Specs written: 78 (100%) | Never static tested: 78 | Never category tested: 78
Skill | Cat | Has Spec | Last Static | S.Result | Last Cat | D.Result | Priority
-----------------------|----------|----------|-------------|----------|----------|----------|----------
gate-check | gate | YES | never | — | never | — | critical
design-review | review | YES | never | — | never | — | critical
...
AGENTS (53 total)
Agent specs written: 53 (100%)
Agent | Category | Has Spec | Last Spec | Result
-----------------------|------------|----------|-------------|--------
creative-director | director | YES | never | —
technical-director | director | YES | never | —
...
Top 5 Priority Gaps (skills with no spec, critical/high priority):
(none if all specs are written)
Skill coverage: 78/78 specs (100%)
Agent coverage: 53/53 specs (100%)
Audit mode is read-only by default.
Optional write: ask "May I write this audit report to
memory_bank/t3_archive/skill_testing/results/audit/skill-test-audit-[YYYY-MM-DD].md?"
Only write the audit report if the user approves.
Offer: "Would you like to run /skill-test static all to check structural
compliance across all skills? /skill-test category all to run category rubric
checks? Or /skill-test spec [name] to run a specific behavioral test?"
Phase 3: Recommended Next Steps
After any mode completes, offer contextual follow-up:
- After
static [name]: "Run/skill-test spec [name]to validate behavioral correctness if a test spec exists." - After
static allwith failures: "Address NON-COMPLIANT skills first. Run/skill-test static [name]individually for detailed remediation guidance." - After
spec [name]PASS: "Updatememory_bank/t3_archive/skill_testing/coverage-index.yamlto record this pass date. Consider running/skill-test auditto find the next spec gap." - After
spec [name]FAIL: "Review the failing assertions and update the skill or the test spec to resolve the mismatch." - After
audit: "Start with the critical-priority gaps. Use the spec template atskill_testing/templates/skill-test-spec.mdto create new specs."
Signals
- GitHub stars
- 20
- Forks
- 5
- Last commit
- Aug 2026
Advanced
- Item type
- skill
- Key
skill-test-negentropy-laby- Source
- github.com/negentropy-laby/opendoge