From 000-jeremy-content-consistency-validator
Audits documentation consistency across code, tests, and CI using a fact authority registry. Useful before releases or after refactors.
How this skill is triggered — by the user, by Claude, or both
Slash command
/000-jeremy-content-consistency-validator:validate-consistency [optional path to sot-map.yaml — defaults to ~/000-projects/intent-os/sot-map.yaml][optional path to sot-map.yaml — defaults to ~/000-projects/intent-os/sot-map.yaml]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
1. [Overview](#overview)
Runs deterministic drift checks across all documentation artifacts, resolves conflicts through a per-fact-class authority registry (sot-map.yaml), and produces a structured report with actionable findings grouped by category and severity. Deterministic checks and LLM-judged checks are structurally separated: judged findings are advisory-only and never block anything.
The governed brain arbitrates asserted company/doctrine claims and the rules of arbitration — never generated facts. This validator never reads the brain as ground truth for generated facts: authority for a generated fact lives only in a registry row a human has adjudicated. The brain ingests only human-adjudicated findings — raw findings from this skill are candidate evidence, not truth, until a human adjudicates them.
Basic audit:
/validate-consistency
Runs the full audit on the current working directory. Loads the authority registry and produces a categorized report.
Targeted check after refactor:
I just renamed a bunch of modules — check consistency
Detects that code changed, runs all 9 checks, surfaces broken cross-references (deterministic) and stale capability claims (advisory).
Pre-release gate (via /release):
/release
Phase 1.6 automatically invokes this skill. Deterministic Critical findings block the release; advisory findings are surfaced for review and never block.
sot-map.yaml) — optional; without one the skill runs in bootstrap mode (see Step 1)echo "════════════════════════════════════════════════════════════════"
echo " DOCUMENT CONSISTENCY AUDIT"
echo "════════════════════════════════════════════════════════════════"
The source of truth is a per-fact-class authority registry declared as data — never a global ranking, never auto-detected at runtime.
~/000-projects/intent-os/sot-map.yaml.echo "Authority registry: [path]"
echo "Fact classes registered: [n] — [list of class names]"
unowned fact-class — human adjudication needed, and the report includes drafted registry rows for a human to adjudicate (see Bootstrap).Registry row shape:
version: 1
fact_classes:
version: # key = fact_class (snake_case / dotted)
owner: package-manifest # required — the ONE producing surface
mirrors: # surfaces expected to restate the fact;
- readme # each diffed against the owner only
- changelog # (star topology — never pairwise N×N)
determinism: deterministic # deterministic | llm-judged
depth_tier: T1 # T1 value-equality | T2 judged/semantic
staleness_bound: 0 # days a mirror may lag before lag = drift
criticality: high # critical | high | medium (severity ceiling)
volatile: false # true = mirrors expected to trail (Info-level
# replication lag inside the bound)
adjudicated_by: jeremy # optional provenance — who made the call
adjudicated_on: YYYY-MM-DD # optional provenance — when
license:
owner: license-file
mirrors: [readme]
determinism: deterministic
depth_tier: T1
staleness_bound: 0
criticality: high
volatile: false
Resolution rule: when two artifacts disagree on a fact of class F — if the registry has a row for F, the artifact belonging to that row's owner class is correct and the finding is filed against the other artifact. If the registry has no row for F, emit the finding as unowned fact-class — human adjudication needed: list both values and locations, name no winner, never guess.
Reference: See references/sot-registry.md for the full registry specification, fact-class and artifact-class vocabularies, and the bootstrap appendix.
Scan for all documentation artifacts that will be audited:
# Find all documentation files
echo "Scanning for documentation artifacts..."
Use Glob to find:
README.md, README.*CLAUDE.mdCHANGELOG.md, CHANGES.md000-docs/**/*.mddocs/**/*.mdplanning/**/*.mdVERSION, version.txt.github/workflows/*.yml, .github/workflows/*.yamlpackage.json, Gemfile, *.gemspec, pyproject.toml, Cargo.toml, go.modPrint a summary of what was found:
echo "Documentation artifacts found:"
echo " - README: [yes/no]"
echo " - CLAUDE.md: [yes/no]"
echo " - CHANGELOG: [yes/no]"
echo " - Canonical docs (000-docs/): [count] files"
echo " - Other docs (docs/): [count] files"
echo " - Planning docs: [count] files"
echo " - CI workflows: [count] files"
echo " - Package manifests: [list]"
Execute ALL applicable checks from the list below. Each check is independent — run every check that has the required files present. Skip checks whose input files don't exist (note the skip, don't error).
Every check carries a Lane tag:
Reference: See references/drift-categories.md for category definitions and severity guide.
Lane: Deterministic (referential integrity — no registry row needed; the filesystem is the definitional referent).
If 000-docs/000-INDEX.md exists:
000-docs/ directory for files NOT listed in the indexLane: Deterministic. Fact class: version-string.
Collect version strings from ALL available sources:
VERSION or version.txt filepackage.json → version field*.gemspec → version attributepyproject.toml → [project] version or [tool.poetry] versionCargo.toml → [package] versionCHANGELOG.md → first version header (e.g., ## [1.2.3] or ## 1.2.3)README.md → version badges, install commands with version numbersCLAUDE.md → any version referencesCompare all found version strings. If they disagree, resolve via the version-string registry row and flag all deviations from the registered authority. No row → emit unowned fact-class — human adjudication needed with every value and location; name no winner.
Lane: Deterministic. Fact class: ci-commands.
If both README and .github/workflows/ exist:
bash, shell, sh fenced blocks and inline backtick commands in "Getting Started", "Development", "Testing", "Usage" sections)run: step commands from all workflow YAML filesci-commands registry row; no row → unowned fact-class calloutLane: Deterministic (referential integrity — no registry row needed).
If CLAUDE.md references specific files or directories:
Lane: LLM-judged (advisory). Fact class: phase-status.
Search all documentation for phrases that may indicate stale status:
lib/, src/, or app/ contains actual source filesUse Grep to search for these phrases, then validate against the filesystem. The grep is deterministic; deciding whether the language is actually stale is semantic judgment, so every finding here is ⚪ Advisory.
Lane: LLM-judged (advisory). Fact class: capability-claims.
If README has a features section (look for ## Features, ## Capabilities, ## What it does, bullet lists under these headers):
Mapping a prose claim to an implementation is semantic judgment — every finding here is ⚪ Advisory.
Lane: Deterministic for exact-value facts; LLM-judged (advisory) for the description comparison.
Extract and compare key facts across documents:
license): README license mention vs LICENSE file vs package manifest license field — deterministicruntime-version): README vs package manifest vs CI workflow matrix — deterministicrepository-url): README badges/links vs package manifest repository field vs git remote — deterministicproject-description): README first paragraph vs package manifest description vs CLAUDE.md purpose — semantic equivalence is a judgment call, so report in the advisory laneFlag any contradictions. Resolve each via its fact-class registry row; no row → unowned fact-class callout.
Lane: Deterministic (referential integrity — no registry row needed).
Scan all markdown files for internal links and references:
[text](path) links where path is a relative file path (not URL)docs/setup.md")Lane: LLM-judged (advisory). Fact class: planning-status.
If planning/ directory exists:
Judging whether code "implements" a planned item is semantic — every finding here is ⚪ Advisory.
Produce the report in this exact structure. Deterministic and advisory findings are structurally separated — never mixed in one section.
# Document Consistency Audit Report
**Project:** [repo name or directory name]
**Date:** [current date]
**Registry:** [path + fact classes covered | "not found — bootstrap mode, all fact classes unowned"]
## Executive Summary
| Severity | Count |
|----------|-------|
| 🔴 Critical (deterministic only) | [n] |
| 🟡 Warning (deterministic only) | [n] |
| 🔵 Info (deterministic only) | [n] |
| ⚪ Advisory (LLM-judged) | [n] |
| **Total** | **[n]** |
## Part A — Deterministic Findings
### Category 1: Status Drift
[Findings or "No issues found."]
### Category 4: CI/Validation Drift
[Findings or "No issues found."]
### Category 6: Cross-Doc Contradiction
[Findings or "No issues found."]
### Category 7: Index/Reference Drift
[Findings or "No issues found."]
## Part B — Advisory Findings (LLM-judged, never blocking)
### Category 1: Status Drift (phase/status language)
### Category 3: Capability/Behavior Drift
### Category 5: Planning-vs-Implementation Confusion
### Category 6: Cross-Doc Contradiction (description)
[Findings or "No issues found." per section]
## Unowned Fact Classes — Human Adjudication Needed
[One entry per conflict whose fact class has no registry row: fact class, all values, all locations. No winner named.]
## Proposed Registry Rows (bootstrap draft — requires human adjudication)
[Only when unowned fact classes were encountered: a fenced YAML block of drafted rows per the Bootstrap section. The skill never writes sot-map.yaml itself.]
## Priority Actions
[Numbered list of the most impactful fixes, ordered by severity then effort. Deterministic findings first; advisory items listed last and labeled advisory.]
Each finding MUST include:
unownedfile_path:line_number for both artifactsPrint a one-line summary after the report:
echo ""
echo "Audit complete: [n] critical, [n] warning, [n] info, [n] advisory findings across [n] artifacts."
If there are deterministic critical findings, add:
echo "⚠️ Critical issues should be resolved before release."
Apply these rules consistently. Hard rule: LLM-judged findings are ⚪ Advisory, always — never Critical, never Warning, never blocking. No exceptions.
| Condition | Lane | Severity |
|---|---|---|
| Version mismatch, fact class registered | Deterministic | 🔴 Critical |
| Any conflict on an unowned fact class | Deterministic | 🟡 Warning + unowned callout |
| README test command doesn't match CI | Deterministic | 🟡 Warning |
| Index file missing entries for existing docs | Deterministic | 🟡 Warning |
| Cross-doc disagreement on exact-value fact | Deterministic | 🟡 Warning |
| Broken internal link/reference | Deterministic | 🟡 Warning |
| Extra index entries referencing deleted files | Deterministic | 🔵 Info |
| Feature claimed in README but absent from code | LLM-judged | ⚪ Advisory |
| "scaffold only" language in repo with code | LLM-judged | ⚪ Advisory |
| Planning doc describes implemented feature as future | LLM-judged | ⚪ Advisory |
| Description drift between README/manifest/CLAUDE.md | LLM-judged | ⚪ Advisory |
| Underdocumented feature (exists in code, not in docs) | LLM-judged | ⚪ Advisory |
Project-type auto-detection survives only here — it is a bootstrap heuristic for drafting registry rows, never runtime authority for resolving a conflict.
When the registry is missing or a fact class is unowned, draft proposed rows for the human to adjudicate:
1. Detect project type by scanning the working directory for file markers.
Check for engineering markers:
lib/, src/, app/, spec/, test/, tests/Gemfile, package.json, go.mod, Cargo.toml, pyproject.toml, *.gemspec, Makefile, CMakeLists.txt, pom.xml, build.gradleCheck for marketing/content markers:
index.html (at root), wp-content/, themes/lib/, src/, app/Decision:
Detection is additive — check for ANY marker in each category. A single match is sufficient.
2. Draft rows mapping each unowned fact class encountered to an authority artifact class, using the legacy hierarchy in references/sot-registry.md (appendix) as the drafting heuristic.
3. Emit the drafted rows in the report's "Proposed Registry Rows" section as a fenced YAML block, explicitly marked bootstrap draft — requires human adjudication. The skill never writes sot-map.yaml — a human reviews, edits, and commits the rows.
This skill is called by /release during Phase 1.6 (Cross-Artifact Consistency Validation). Only Part A deterministic findings feed the release blocking gate: deterministic 🔴 Critical findings block the release. Part B advisory findings and unowned fact-class callouts are surfaced for human review and never block. When invoked from /release, the report is incorporated into the release audit trail rather than printed standalone.
The skill produces a structured markdown report containing:
Each individual finding includes: severity icon, lane, fact class, what the authority artifact says (when registered), what the drifted artifact says, file paths with line numbers, and whether the fix is auto-applicable.
When invoked standalone, the report is printed to the conversation. When invoked from /release, the report is incorporated into the release audit trail.
| Condition | Behavior |
|---|---|
Registry (sot-map.yaml) not found | Bootstrap mode: all fact classes unowned; conflicts reported with no winner named; drafted rows emitted |
| Registry unparseable | Treat as not found; report the parse error verbatim in the report header |
| Conflict on a fact class with no registry row | Emit unowned fact-class — human adjudication needed; never guess |
| No README or CLAUDE.md found | Skip checks that require those files; note in report |
| No CI workflows found | Skip CI drift checks (3.3); note "No CI workflows found — CI checks skipped" |
No 000-docs/ directory | Skip index checks (3.1); note in report |
| No planning directory | Skip planning-vs-implementation check (3.9); note in report |
| No package manifest found | Skip version consistency check for that source; use whatever version sources exist |
| Empty repository (no files) | Report "No documentation artifacts found — nothing to audit" and exit |
| Binary files in doc paths | Skip binary files; only audit text/markdown files |
The skill never fails — it gracefully skips checks whose inputs don't exist and reports what it could verify.
sot-map.yaml either — drafted rows are for human review.references/drift-categories.mdreferences/sot-registry.md~/000-projects/intent-os/sot-map.yaml (path configurable per invocation)npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin 000-jeremy-content-consistency-validatorDetects documentation drift, stale references, and cross-document inconsistencies in projects. Scans code-doc mismatches, broken links, outdated versions, and git staleness.
Audits repository documentation for drift, stale statements, broken references, and README mismatches. Useful for periodic maintenance or before preparing corrective PRs.
Audits CLAUDE.md, rules, and memory files for stale references, orphaned content, contradictions, duplicates, misplacement, budget overruns, and unenforced claims.