Documentation Freshness
Detect documentation drift across any project. Reports findings without auto-fixing.
Context Discovery
Priority 1: Configuration
Read .arkhe.yaml from project root. Extract doc-freshness: section for custom patterns, exclusions, and doc-code mappings.
Extract doc-health: section for output_dir (used by report mode, default: docs/health).
Priority 2: Project Identity
Read CLAUDE.md and README.md to understand project structure, tech stack, and conventions.
Priority 3: Documentation Inventory
Run the scanner to discover all documentation files and perform mechanical checks:
python3 ${CLAUDE_SKILL_DIR}/scripts/scan_freshness.py <project-root>
Use --links-only for fast mode (links and file refs only, no git staleness).
Arguments
Parse from $ARGUMENTS:
| Mode | Description |
|---|---|
scan | Full freshness analysis (all three drift types) |
check <path> | Focused analysis on one file or directory |
links | Broken links and stale references only (script-driven, fast) |
drift <path> | Code-doc drift for a specific doc or doc-code pair |
cross-doc | Cross-document consistency check |
report | Persist structured freshness report to {output_dir}/ |
claude-md | CLAUDE.md structural drift (plugin counts, components, versions) |
onboard | Suggest/apply tracking frontmatter to docs that need it |
setup | Scaffold GitHub Actions workflow for docs-health-action CI |
| (none) | Full scan (same as scan) |
Scanning Tiers
Documents are automatically classified into scanning tiers:
| Tier | Detection | Checks Performed |
|---|---|---|
| Basic | All .md files | Broken links, git age classification, backtick-path verification |
| Deep | YAML frontmatter with last_updated or version | Basic + version drift, last_updated accuracy, cross-doc consistency |
Tier is auto-detected per file. No configuration needed. The scanner JSON output includes "tier" per doc and "tier_counts" in the summary.
Mode Execution
scan (default)
- Run
scan_freshness.pyfor mechanical checks (links, versions, git staleness) - Present script findings (broken links table, version mismatches, staleness scores)
- For stale/very_stale docs: use Grep/Read to check code-doc alignment on key references
- For docs covering the same topic: cross-check for consistency
- Produce the freshness report
links
- Run
scan_freshness.py --links-only - Present broken links table directly from JSON output
- Group findings by severity: broken links first, then file_ref warnings
check <path>
- If path is a file, run link checker and version checker on that file only
- If path is a directory, scan all
.mdfiles within it - Use Grep to check file path references and function names against the codebase
- Report findings for the targeted scope
drift <path>
- Read the specified doc
- Extract: function/method names, API endpoints, file paths, config keys, class names
- Grep/Read the corresponding code to verify each reference still exists and is accurate
- Report mismatches with evidence (doc line vs code location)
cross-doc
- Run
scan_freshness.pyto get doc inventory with headings - Identify docs with overlapping topics (shared heading keywords)
- Read overlapping docs and compare factual claims
- Flag contradictions (e.g., different version requirements, conflicting setup steps)
report
Same as scan but write output to {output_dir}/{YYYY-MM-DD}-freshness.md.
claude-md
- Run
claude_md_checker.pyto compare CLAUDE.md claims against filesystem - Present findings by category: plugin counts, component inventories, versions, file paths
- Highlight undocumented components (CRITICAL) and version mismatches (WARNING)
onboard
- Run
frontmatter_onboard.pyto find docs without tracking frontmatter - Uses whitelist of known-maintained docs (READMEs, custom docs)
- Generates minimal
title+last_updatedfrontmatter from git history - On user approval, apply with
--applyflag
setup
Scaffold a GitHub Actions workflow that runs joaquimscosta/docs-health-action@v1 on every PR.
- Check if
.github/workflows/exists — create if needed - Check if a docs-health workflow already exists — warn and offer to overwrite/skip
- Ask user which checks to enable (use
AskUserQuestionwith multiSelect):links(broken internal links and anchors)versions(version references vs ground truth files)staleness(git-based documentation age)claude-md(CLAUDE.md structural drift — Claude Code projects only)cross-doc(cross-document version conflicts)frontmatter(missing tracking frontmatter)
- Ask user for failure policy:
errors(default),warnings, ornone(advisory) - Generate
.github/workflows/docs-health.ymlfrom template - Show the generated file and confirm before writing
See WORKFLOW.md § setup for the full template.
Automation Integration
SessionStart Hook: Critical-doc fast scan on session start (5-second timeout)
/doc:health --critical-only
# Scans: README.md, CLAUDE.md only (root-level critical docs)
PostToolUse Hook (after /commit): Post-commit doc-impact checks
/doc:health drift
# Checks if modified code files have corresponding documentation
User-Driven (/loop): Periodic freshness monitoring
/loop 1h /doc:health links # Hourly broken-link checks
/loop 4h /doc:health scan # Full scans every 4 hours
Severity Levels
| Severity | Meaning |
|---|---|
| CRITICAL | Broken link to deleted file, doc references removed API/function |
| WARNING | Version mismatch, function signature changed, doc stale >30 days |
| INFO | Minor inconsistency, doc aging (7-30 days), cosmetic drift |
Output Rules
- Evidence-based: every finding backed by file path and line number
- Tabular: summary table first, detailed findings below
- Actionable: each finding includes what needs updating
- Detection only: NEVER auto-fix documentation
Lane Discipline
- Do NOT update or rewrite documentation — detection only
- Do NOT produce roadmap status, architecture analysis, or user stories
- Do NOT write source code
References
- WORKFLOW.md — Detection algorithms and convention tables
- EXAMPLES.md — Usage examples for each mode
- TROUBLESHOOTING.md — Common issues and fixes