docs-drift
Skill84 starsChanged 5 days agoMITView on GitHub
Documentation-drift audit for the plugin monorepo. Audits either each scoped plugin's unreleased changelog claims or its latest shipped release from the previous reachable plugin-name--v* tag, then checks whether the matching plugin README, docs/, CLAUDE.md or AGENTS.md files, and root documentation still tell the truth. Reports meaningful drift with concrete proposed edits and asks before applying anything. Use when preparing or verifying a release, when asked to check the latest version, or when the operator says "docs drift", "check the docs", "are the docs up to date", "docs audit", "did the docs keep up", "check documentation before release", or whether documentation matches released or unreleased changes. Complements /pre-release-review, which checks changelog claims against code; this skill checks changelog claims against docs.
6 other projects use a version of this.
Adopted by
Most recently taken up by
- Jia-ben00/docs-drifttheir own version, first seen Nov 8, 2026
- gtapps/hermitdword for word, first seen Nov 7, 2026
- mongodb/docstheir own version, first seen Nov 2, 2026
- mxrsv/agents-skillstheir own version, first seen Oct 21, 2026
- ceptln/quota-burnertheir own version, first seen Sep 8, 2026
- gonun13/agent-skillstheir own version, first seen Sep 5, 2026
Other versions6 projects use a version of this.
Word for word · 1
- gtapps/hermitd★ 84100% same
Edited · 0
None found.
Wrote their own version · 5
- mongodb/docs★ 779same name
- ceptln/quota-burner★ 18same name
- mxrsv/agents-skills★ 11same name
- gonun13/agent-skills★ 0same name
- Jia-ben00/docs-drift★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository29 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- bump-core-reqSkill
- claude-harness-canarySkill
- commitSkill
- docs-driftSkill
- downstream-impactSkill
- fleet-releaseSkill
- pipeline-digestSkill
- pre-release-reviewSkill
- pricing-refreshSkill
- releaseSkill
- release-statusSkill
- routine-test-pingSkill
- stale-proposalsSkill
- tackle-issueSkill
- test-runSkill
- bump-core-reqSkill
- commitSkill
- downstream-impactSkill
- fleet-releaseSkill
- pipeline-digestSkill
- pre-release-reviewSkill
- pricing-refreshSkill
- releaseSkill
- release-statusSkill
- routine-test-pingSkill
- stale-proposalsSkill
- test-runSkill
The file
Show its rules and text
We split this skill into the rules it gives an agent
17 rules. 0 are common, 12 are distinctive, and 5 are very specific to this project.
0
Common
Most of the 5 edited versions we read keep these.
12
Distinctive
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 25
Default to unreleased mode.
- Distinctive: line 34
Never mix released and unreleased windows in one claim set.
- Distinctive: line 48
If the operator named a plugin, limit scope to that slug after verifying it exists and has unreleased content.
- Distinctive: line 53
Use the working tree as the documentation snapshot.
- Very specific: line 58
Start from all plugins/*/CHANGELOG.md slugs, or only the operator-named slug.
- Very specific: line 78
Use only reachable <slug>--v* tags.
- Distinctive: line 120
Use that diff only in latest-release mode and only for claim discovery.
- Distinctive: line 137
Do not manufacture a finding for every bullet.
- Very specific: line 159
Unreleased: use rg -n against the working tree.
- Very specific: line 161
Latest release: use git grep -n <pattern> "$latest" -- <paths> and git show "$latest:<path>".
- Distinctive: line 166
Never silently substitute current documentation for a released snapshot.
- Distinctive: line 174
Keep the root-file sweep in the main session because it needs cross-plugin deduplication.
- Distinctive: line 182
If it is still stale, propose an edit to the current file.
- Very specific: line 183
If it is already corrected, report it under Fixed after release with no proposed edit.
- Distinctive: line 185
If the file no longer exists, explain its replacement or removal and do not propose recreating it without evidence.
- Distinctive: line 241
Ask which actionable findings to apply: all, selected finding numbers, or none.
- Distinctive: line 257
Never commit, push, tag, publish, or release from this skill.
“Common” is measured: kept by at least 6 in 10 of the 5 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Docs Drift
The third leg of the release check. /release-status shows what is queued,
/pre-release-review verifies that the changelog tells the truth about the
code, and this skill verifies that the docs tell the truth after the change.
Read-only until the operator approves. The audit never edits, commits, tags, pushes, publishes, or releases. Apply only the findings the operator selects in Step 5.
Usage
/docs-driftor/docs-drift unreleased— audit every plugin with a non-empty[Unreleased]section./docs-drift <plugin-slug>— audit that plugin's unreleased changes./docs-drift latest— audit the latest reachable release of every tagged plugin./docs-drift latest <plugin-slug>— audit only that plugin's latest release.
Default to unreleased mode. Treat "latest version", "latest release", or equivalent wording as latest-release mode.
Natural ordering before a ship:
/release-status → /pre-release-review → /docs-drift → /release <slug>
Step 1 — Scope plugins and snapshots
Never mix released and unreleased windows in one claim set.
Unreleased mode
Identify plugins whose [Unreleased] section contains non-blank content:
for p in plugins/*/CHANGELOG.md; do
slug=$(basename "$(dirname "$p")")
awk '/^## \[Unreleased\]/{f=1; next} /^## \[/{f=0} f && NF' "$p" | rg -q '.' \
&& echo "$slug"
doneIf the operator named a plugin, limit scope to that slug after verifying it exists and has unreleased content. If nothing is in scope, stop with:
No unreleased changes in any plugin — nothing to drift-check.
Use the working tree as the documentation snapshot. Keep incidentally noticed older drift separate as pre-existing debt.
Latest-release mode
Start from all plugins/*/CHANGELOG.md slugs, or only the operator-named slug.
Resolve each plugin's refs independently:
EMPTY_TREE=$(git hash-object -t tree /dev/null)
for p in plugins/*/CHANGELOG.md; do
slug=$(basename "$(dirname "$p")")
latest=$(git describe --tags --abbrev=0 --match "${slug}--v*" HEAD 2>/dev/null || true)
if [ -z "$latest" ]; then
printf '%s\n' "$slug: skipped (no reachable release tag)"
continue
fi
previous=$(git describe --tags --abbrev=0 --match "${slug}--v*" "${latest}^" 2>/dev/null || true)
printf '%s\n' "$slug latest=$latest previous=${previous:-<empty-tree>}"
doneUse only reachable <slug>--v* tags. Do not select an unreachable tag merely
because its version sorts later. If a plugin has only one reachable tag, use
the empty tree as its previous snapshot. If every scoped plugin lacks a tag,
stop with:
No reachable plugin release tags — nothing to latest-release drift-check.
For each plugin, record:
- claim window:
<previous-tag>..<latest-tag>, or empty tree to latest tag; - changelog claims: the exact
## [<latest-version>]section at the latest tag; - documentation snapshot: the repository exactly at that plugin's latest tag.
Later commits and working-tree changes are not release claims in this mode. Different plugins may have different latest-tag snapshots; preserve the plugin-to-tag mapping throughout the audit.
Step 2 — Extract doc-checkable claims
In unreleased mode, read only each scoped plugin's working-tree [Unreleased]
section.
In latest-release mode, derive the version from <slug>--v<version> and read
the matching changelog section from the tagged snapshot:
version=${latest##*--v}
git show "$latest:plugins/$slug/CHANGELOG.md" | awk -v ver="$version" '
index($0, "## [" ver "]") == 1 {f=1; next}
/^## \[/ && f {exit}
f
'Also inspect the plugin-scoped release diff to catch doc-checkable operator-visible changes that a changelog bullet may group:
release_diff_base=${previous:-$EMPTY_TREE}
git diff "$release_diff_base" "$latest" -- "plugins/$slug/"Use that diff only in latest-release mode and only for claim discovery. This skill does not replace changelog-versus-code review.
Turn each bullet or diff-derived behavior into zero or more claims:
- Removal or rename — a skill, command, script, hook, config key, doc file, or CLI changed identity.
- New operator-visible surface — a new skill, slash command, config block, hook, CLI, or channel behavior should appear where siblings are enumerated.
- Changed default or behavior — docs may still state the previous default or behavior. Treat this as the highest-severity class.
- Count or version claim — a hand-written number or version marker may still contain the old value.
- Promised documentation — a cited file or anchor must exist and cover what the changelog promises.
Mark pure internal fixes, refactors, and test-only changes as no doc surface.
Do not manufacture a finding for every bullet.
Step 3 — Sweep the matching documentation
For each scoped plugin, consider the files that exist in its selected snapshot:
plugins/<slug>/README.mdplugins/<slug>/docs/*.mdplugins/<slug>/CLAUDE.mdplugins/<slug>/AGENTS.md- top-level plugin extras such as
SAFETY.md,DOCKER.md, orCONTRIBUTING.md
Also check relevant root documentation:
- root
README.md - root
CLAUDE.md - root
AGENTS.md - root documentation extras relevant to a claim
Work claim-first, not file-first:
- Unreleased: use
rg -nagainst the working tree. Sweep root files once against the union of all claims. - Latest release: use
git grep -n <pattern> "$latest" -- <paths>andgit show "$latest:<path>". Sweep root files at each plugin's own latest-tag snapshot. Deduplicate identical root findings without losing the plugin/tag evidence.
Never silently substitute current documentation for a released snapshot.
Fan out when scope is wide. With more than two plugins in scope, dispatch one Explore/general-purpose subagent per plugin. Give it only that plugin's claims, mode, and snapshot ref. Require findings as:
snapshot:file:line — claim contradicted — current text — suggested fix
Keep the root-file sweep in the main session because it needs cross-plugin
deduplication. In latest-release mode, require subagents to inspect tagged
files with git grep and git show; the working tree is only for the
actionability check below.
In latest-release mode, re-check each snapshot finding against the current working tree:
- If it is still stale, propose an edit to the current file.
- If it is already corrected, report it under
Fixed after releasewith no proposed edit. - If the file no longer exists, explain its replacement or removal and do not propose recreating it without evidence.
Step 4 — Judge meaningfulness
Propose an edit only when a reader would be factually misled:
- Meaningful: references a removed or renamed surface; states an old default or behavior; gives a wrong count or version; omits a new surface from a sibling enumeration; or promises documentation that does not exist or does not cover the claim.
- Not meaningful: tone, formatting, absent marketing coverage, missing
documentation for internal fixes, or changelog accuracy that
/pre-release-reviewowns. - Borderline: reader impact is unclear. Report it separately with a one-line rationale and no proposed edit.
Never pad findings.
Step 5 — Report, then ask before applying
Emit one report:
# Docs Drift — <date>
## Scope
Mode: <unreleased | latest release>
In scope: <slugs with snapshot refs>
Skipped: <slugs and reasons>
Claim windows: <[Unreleased] | previous-tag..latest-tag per plugin>
Documentation snapshots: <working tree | latest tag per plugin>
## Findings
### <n>. <slug> — <misleading | stale-reference | missing-doc>
- Claim: <abbreviated claim and changelog/diff evidence>
- Drift: <snapshot>:<doc file:line> — currently says: "<excerpt>"
- Current tree: <still stale | changed | file removed>
- Proposed edit: <exact replacement text, or "add section X covering Y">
## Fixed after release (no edit proposed)
- <snapshot>:<file:line> — <what was stale and where it is now corrected>
## Borderline (no edit proposed)
- <snapshot>:<file:line> — <one-line rationale>
## No doc surface
- <briefly grouped internal or test-only claims>
## Pre-existing drift (not this window)
- <anything noticed outside the selected claim window>
## Verdict
<N> actionable findings across <M> current files | Docs are clean for this window.Ask which actionable findings to apply: all, selected finding numbers, or none. The audit itself is not approval to edit.
For approved findings, edit only the current working tree, surgically, matching each document's style. Never edit a tag. Shortening a doc means condensing the wording and keeping the content: removing a section or content block needs per-item operator confirmation, and install, upgrade and recovery steps always stay (compressed to a few lines plus a link if needed).
After applying:
- Re-read changed passages and run
git diff --check. - For edits under
plugins/<slug>/, offer a terse sentence-case line for that plugin's[Unreleased]### Fixed, with no**docs:**prefix. Root README/CLAUDE.md edits skip the changelog per repository convention. - Report that edits are uncommitted and
/commitcan capture them. - Never commit, push, tag, publish, or release from this skill.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

