Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Detect documentation drift against filesystem state.
.claude/skills/notque-docs-sync-checker/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 408% | 0% |
| case-05 | ✗→✓ | ▲ Improved | -25% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 452% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 88% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 72% | 0% |
Deterministic 4-phase drift detector that compares the filesystem against README entries. Each phase (Scan, Cross-Reference, Detect, Report) has a gate that must pass before proceeding. The skill produces a sync score (percentage of tools properly documented) and actionable fix suggestions for every detected issue.
This skill checks documentation presence and absence only -- it does not judge description quality, generate documentation content, resolve merge conflicts, validate cross-references, or track when drift occurred. Suggested fixes use YAML descriptions verbatim; content generation and quality assessment require different skills.
Optional flags: --auto-fix (experimental, requires explicit opt-in), --strict (exit code 1 on issues), --format json (machine-readable output for CI/CD).
| Signal | Load These Files | Why | |---|---|---| | documentation work | documentation-structure.md | Loads detailed guidance from documentation-structure.md. | | before/after doc-update examples: adding skill docs, removing deprecated agent docs | examples.md | Loads detailed guidance from examples.md. | | wiring the checker into CI, pre-commit, or auto-fix mode | integration-guide.md | Loads detailed guidance from integration-guide.md. | | expected table and list formats per README file | markdown-formats.md | Loads detailed guidance from markdown-formats.md. | | which docs must list which tools; sync score and deprecation rules | sync-rules.md | Loads detailed guidance from sync-rules.md. |
Goal: Discover all skills, agents, and commands in the repository filesystem. All discovery (file existence checks, YAML parsing, markdown extraction) must be deterministic -- no AI judgment on content quality.
Step 1: Run the scan script
bashpython3 skills/meta/docs-sync-checker/scripts/scan_tools.py --repo-root $HOME/vexjoy-agent
Step 2: Validate discovery results
For each tool type, verify:
Skills (skills/**/SKILL.md):
--- and closing --- YAML delimitersname and description fieldsname field matches directory name (e.g., skills/code-quality/code-linting/ has name: code-linting)Agents (agents/*.md):
name fieldname valueCommands (commands/**/*.md):
commands/code/cleanup.md) are detectedStep 3: Validate the docs routing catalog
Every docs/*.md file (outside archive/ and images/) carries frontmatter with summary and read_when — the on-demand load triggers for docs, matching what skills/INDEX.json gives skills.
bashpython3 scripts/docs-catalog.py --check
Exit 1 means a doc is missing frontmatter; add summary and read_when to that file. python3 scripts/docs-catalog.py (no flags) prints the catalog table; --json emits it machine-readable.
Step 4: Count and verify
markdown## Scan Results Skills found: [N] Agents found: [N] Commands found: [N] YAML errors: [N] (must be 0 to proceed)
Gate: All tools discovered, all YAML valid, counts >0 for each type, docs catalog check exits 0. Proceed only after the gate passes.
Goal: Extract documented tools from README files and compare with discovered tools. Each tool type has a primary documentation file: skills belong in docs/skills.md, agents in agents/README.md, commands in commands/README.md.
Step 1: Run the documentation parser
bashpython3 skills/meta/docs-sync-checker/scripts/parse_docs.py --repo-root $HOME/vexjoy-agent --scan-results /tmp/scan_results.json
Step 2: Parse each documentation file
These are the five documentation files to check -- no others:
| File | Format | What to Extract | |------|--------|-----------------| | docs/skills.md | Markdown table | Name, Description, Command, Hook columns | | agents/README.md | Table or list | Name, Description fields | | commands/README.md | Markdown list | /command-name - Description items | | README.md | Inline references | Pattern-match skill: X, /command, agent-name | | docs/REFERENCE.md | Section headers | ### tool-name headers with descriptions |
Step 3: Build documented-tools registry
For each documentation file, collect the set of tool names found. This creates a mapping of {file -> [tool_names]} that Phase 3 will compare against the filesystem scan.
Step 4: Verify parse completeness
Gate: All documentation files parsed without errors. Proceed only after the gate passes.
Goal: Compare discovered tools with documented tools to identify drift. This is a point-in-time snapshot -- it cannot tell you when drift occurred, only that it exists now.
Step 1: Compute set differences
For each tool type and its primary documentation file:
missing = filesystem_tools - documented_tools (tools that exist but are not documented)stale = documented_tools - filesystem_tools (documented tools that no longer exist -- users waste time trying to invoke non-existent tools, so always flag these)Step 2: Categorize and assign severity
Severity reflects user impact: missing entries mean tools are undiscoverable and stale entries waste time.
| Category | Condition | Severity | |----------|-----------|----------| | Missing Entry | Tool in filesystem, not in primary README | HIGH | | Stale Entry | Tool in README, not in filesystem | MEDIUM | | Incomplete Entry | Documentation missing required fields | LOW |
Step 3: Record issue details
For each issue, capture: tool type, tool name, tool path, affected documentation file(s), severity, and suggested fix action.
Gate: All issues categorized with severity. Proceed only after the gate passes.
Goal: Generate human-readable report with actionable fix suggestions. Report facts concisely -- show data, not self-congratulatory descriptions. Target 100% sync score; even one missing entry erodes trust in all documentation.
Step 1: Run the report generator
bashpython3 skills/meta/docs-sync-checker/scripts/generate_report.py --issues /tmp/issues.json --output /tmp/sync-report.md
Step 2: Verify report structure
Report must include these sections:
sync_score = (total_tools - total_issues) / total_tools * 100
Step 3: Validate actionability
Every issue in the report must have a concrete suggested fix. No issue should say "review manually" without specifying what to review and where. The fix should enable a single-commit resolution -- tool files and documentation entries should be added/removed together.
Step 4: Report format for missing entries
For each missing skill, generate a suggested table row:
markdown| skill-name | Description from YAML | `skill: skill-name` | - |
For each missing agent, generate a suggested table row:
markdown| agent-name | Description from YAML |
For each missing command, generate a suggested list item:
markdown- `/command-name` - Description from command file
Step 5: Cleanup
Remove any helper scripts and debug outputs created during execution.
Gate: Report generated with actionable suggestions for every issue.
User created skills/my-new-skill/SKILL.md but forgot to update docs/skills.md. Actions:
my-new-skill in filesystemmy-new-skillUser deleted agents/old-agent.md but agents/README.md still lists it. Actions:
old-agent in filesystemold-agent in agents/README.mdUser created 3 new skills and deleted 2 old ones in a refactoring PR. Actions:
Cause: Invalid frontmatter -- missing --- delimiters, tabs instead of spaces, or missing required fields Solution:
--- on line 1 and closing --- after YAML blockname, descriptionhead -20 {file_path} and check syntaxCause: Expected README file does not exist at expected path Solution:
Cause: Wrong --repo-root path, empty directories, or no SKILL.md files Solution:
Cause: Table missing separator row, mismatched column counts, or malformed list items Solution:
|---|---|), and data rows- /command - Descriptionreferences/markdown-formats.md for complete format specifications${CLAUDE_SKILL_DIR}/references/documentation-structure.md: Documentation file matrix, required fields per location, cross-reference requirements${CLAUDE_SKILL_DIR}/references/markdown-formats.md: Expected table/list formats for each README file, parsing rules, common formatting errors${CLAUDE_SKILL_DIR}/references/sync-rules.md: Synchronization rules, severity levels, deprecation handling, namespace rules${CLAUDE_SKILL_DIR}/references/examples.md: Before/after examples for adding, removing, updating, and batch documentation changes${CLAUDE_SKILL_DIR}/references/integration-guide.md: CI/CD setup, pre-commit hooks, auto-fix mode, JSON output, workflow integration| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 10,175 | 4,787 | -53% | 1 | 1 | 0% | 1,795 | 3,082 | +72% | 0 | 0 | — |
case-02 | fail→fail | 2,081 | 6,118 | +194% | 1 | 1 | 0% | 352 | 3,161 | +798% | 0 | 0 | — |
case-03 | fail→fail | 4,828 | 4,206 | -13% | 1 | 1 | 0% | 362 | 3,053 | +743% | 0 | 0 | — |
case-04 | fail→pass | 4,170 | 4,780 | +15% | 1 | 1 | 0% | 713 | 3,623 | +408% | 0 | 0 | — |
case-05 | fail→pass | 36,009 | 10,334 | -71% | 1 | 1 | 0% | 6,181 | 4,651 | -25% | 0 | 0 | — |
case-06 | fail→pass | 3,906 | 3,633 | -7% | 1 | 1 | 0% | 622 | 3,434 | +452% | 0 | 0 | — |
case-07 | pass→pass | 7,390 | 5,258 | -29% | 1 | 1 | 0% | 1,188 | 3,899 | +228% | 0 | 0 | — |
case-08 | fail→pass | 10,144 | 2,489 | -75% | 1 | 1 | 0% | 1,745 | 3,281 | +88% | 0 | 0 | — |
case-09 | fail→pass | 11,348 | 3,818 | -66% | 1 | 1 | 0% | 2,013 | 3,471 | +72% | 0 | 0 | — |
case-10 | fail→pass | 8,060 | 3,636 | -55% | 1 | 1 | 0% | 1,284 | 3,444 | +168% | 0 | 0 | — |
case-11 | fail→pass | 5,621 | 2,498 | -56% | 1 | 1 | 0% | 891 | 3,241 | +264% | 0 | 0 | — |
case-12 | pass→pass | 4,559 | 2,729 | -40% | 1 | 1 | 0% | 890 | 3,371 | +279% | 0 | 0 | — |
case-13 | fail→pass | 10,235 | 2,658 | -74% | 1 | 1 | 0% | 2,065 | 3,297 | +60% | 0 | 0 | — |
case-14 | fail→pass | 8,581 | 5,855 | -32% | 1 | 1 | 0% | 1,695 | 3,964 | +134% | 0 | 0 | — |
case-15 | fail→pass | 8,314 | 2,632 | -68% | 1 | 1 | 0% | 1,366 | 3,282 | +140% | 0 | 0 | — |
case-16 | fail→pass | 7,043 | 1,925 | -73% | 1 | 1 | 0% | 1,106 | 3,112 | +181% | 0 | 0 | — |
case-17 | pass→pass | 18,509 | 1,738 | -91% | 1 | 1 | 0% | 1,693 | 3,109 | +84% | 0 | 0 | — |
case-18 | fail→pass | 10,253 | 3,189 | -69% | 1 | 1 | 0% | 1,633 | 3,294 | +102% | 0 | 0 | — |
case-19 | pass→pass | 3,891 | 1,618 | -58% | 1 | 1 | 0% | 614 | 3,087 | +403% | 0 | 0 | — |
case-20 | fail→pass | 9,940 | 4,199 | -58% | 1 | 1 | 0% | 1,822 | 3,551 | +95% | 0 | 0 | — |
case-21 | fail→pass | 4,605 | 2,651 | -42% | 1 | 1 | 0% | 659 | 3,274 | +397% | 0 | 0 | — |
case-22 | pass→pass | 6,889 | 3,860 | -44% | 1 | 1 | 0% | 1,098 | 3,565 | +225% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 19 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +64 percentage points is the difference between those two pass rates over the 19 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.