Documentation freshness audit. Invoke with /tzurot-doc-audit to review docs for staleness, missing tools, and inconsistencies.
Invoke with /tzurot-doc-audit to audit documentation freshness across the project.
Run this periodically (e.g., after adding new tools, after major refactors) to ensure docs stay accurate.
Standards live in .claude/rules/07-documentation.md. This skill is the verification procedure.
Fast triage before a full audit:
# What docs exist?
find docs/ -name '*.md' | sort
# Recent changes (last 30 days)?
git log --since="30 days ago" --name-only --pretty=format: -- docs/ .claude/rules/ .claude/skills/ | sort -u | grep .
# Proposals that might be stale? (project uses backlog/ โ no active/ dir by design)
ls docs/proposals/backlog/
# Orphan proposals (structural check โ fails CI on any unlinked proposal)
pnpm ops guard:proposal-links
# Skills lastUpdated dates
grep -r 'lastUpdated' .claude/skills/*/SKILL.md
Work through each section. For each item, verify accuracy and fix inline or note for follow-up.
Section 0 runs FIRST because a memory promoted into a Tzurot rule, doc, or skill changes what those sections then audit.
The shared auto-memory store (~/Documents/claude-memory, shared by every Claude
session on this machine) is audited by harness:doc-audit ยง Step 2, not here โ
nothing in this skill deletes a memory file. When a memory's destination is a
Tzurot rule, skill, or doc, write that destination here; the memory's own
deletion is proposed to the owner through harness:doc-audit's gate.
Stamp it when done: pnpm ops cadence:mark memory-prune, then commit
backlog/cadence-ledger.json to develop.
docs/proposals/backlog/Note: this project uses
BACKLOG.md(root load manifest) +backlog/(HOTnow.md/active-epic.md+ COLDcold/) for active work tracking, notdocs/proposals/active/โ that directory does not exist by design. If you see references to it in any doc, they're stale and should be removed.
.claude/rules/)| File | Check |
|---|---|
00-critical.md |
Security rules still reflect current patterns? Post-mortem table current? |
01-architecture.md |
Service boundaries match dependency-cruiser rules? Anti-patterns table current? |
02-code-standards.md |
ESLint limits match eslint.config.js? Testing patterns current? |
03-database.md |
Protected indexes list current? (The cache TTL table lives in durability-tiers.md โ ยง Existing cache implementations.) |
04-discord.md |
Shared utilities table lists all browse/dashboard helpers? |
05-tooling.md |
All pnpm ops commands listed? pnpm quality description accurate? |
06-backlog.md |
BACKLOG.md HOT/COLD table matches the actual backlog/ layout; granularity ladder intact? 06-backlog staleness rules intact? |
07-documentation.md |
Placement table covers all docs/reference/ subdirs? Lifecycle rules current? |
09-interaction-style.md |
Interaction guidance still reflects current feedback (no premature-stopping, etc.)? |
10-working-posture.md |
Each posture still names a trigger โ behavior? Cross-references to rules/skills resolve? |
How to verify 05-tooling.md:
pnpm ops --help # Compare available commands vs documented ones
pnpm quality --help # Verify quality script description
.claude/skills/)For each skill:
lastUpdated date is recent (within 30 days of last relevant code change)ls .claude/skills/*/SKILL.md
Skills whose procedure is coupled to something enforced elsewhere need a deeper check than the generic list above โ the coupling drifts silently:
| Skill | Extra check |
|---|---|
/tzurot-review-response |
Edit-shape whitelist current? Round-cap + fixup-commit procedure matches the CI fixup-check job? |
CURRENT.md + skills)Sections 2 and 3 ask is this still accurate? Nothing above asks is this earning its context cost? โ so the always-loaded corpus only ever grows. Rank it, then cut from the top:
pnpm ops lines:check --breakdown # every rules file + CURRENT.md + skill body, worst-first by bytes
Work the ranking in order and stop after the top 3. Bytes, not lines, is the order that matters: density varies several-fold across these files (the command prints each one's B/line), so a line-sorted list puts a table-heavy file above a prose-heavy one that costs more. Depth beats breadth here โ three files read closely beats ten skimmed, and the ranking is stable enough that the next audit picks up where this one stopped.
A passage stays only if it survives all four. Any single "no" is a cut, and "it's true and useful" is not an answer to any of them:
07-documentation.md), link from
the others.guard:* / ratchet / hook is enforced now โ the
prose is a second, weaker copy that can silently disagree with the gate.Cut text goes nowhere. Not to a doc, not to an archive file, not to a comment โ git holds it. Moving it down a layer is only right when the content is genuinely reference someone will look up on purpose; otherwise a move is a cut that didn't happen.
This pass defaults to cutting, and the owner sees the diff. The agent
proposing rule additions should not be the sole judge of what is excess, and
the direction of that bias is measured, not hypothetical: the July trim bought
headroom and the additions since have been spending it. So โ propose the cuts
as a normal review-gated PR (.claude/rules/*.md and SKILL.md both require
one), one PR per pass, with each cut's question number as its justification.
When a passage is genuinely contested, cut it and say so in the PR body; the
owner restoring one line is cheaper than the corpus keeping ten.
pnpm ops lines:check --breakdown and put the before/after byte
numbers in the PR body โ a trim with no number is indistinguishable from a
reshuffle.pnpm ops lines:update-baseline --surface <name> to ratchet the trimmed
surface DOWN. Scope it: the unscoped write also ratchets a grown surface
UP in the same commit, which is how a previous post-trim refresh got skipped
entirely and the trim went unrecorded.pnpm ops cadence:mark economy-pass, then commit
backlog/cadence-ledger.json to develop.| Subdirectory | Key checks |
|---|---|
architecture/ |
ADRs reference current service names? Memory/context docs match implementation? |
caching/ |
Pub/sub guide matches actual cache invalidation code? |
database/ |
Prisma drift issues still relevant? |
deployment/ |
Railway operations match current deploy process? |
features/ |
Feature docs describe current behavior? |
guides/ |
Development setup works? Testing guide current? |
operations/ |
Runbooks reference correct commands/services? |
standards/ |
Patterns still used? No deprecated approaches? |
templates/ |
Templates produce valid output? |
testing/ |
Test procedures reference current tools? |
tooling/ |
OPS CLI reference matches pnpm ops --help? |
| Root files | STATIC_ANALYSIS.md matches CI config? CLI references current? |
proposals/active/ items are actually being worked on (check backlog/now.md Current Focus)pnpm ops guard:proposal-links is green (no orphan proposals โ every docs/proposals/backlog/*.md has an inbound link from backlog/, docs/, CURRENT.md, or BACKLOG.md). This is structurally enforced in CI; running it during the doc audit catches a local drift before CI does.Format check (a well-formatted doc can still be obsolete โ do the relevance check below too):
docs/research/ are TL;DR format (2-5KB, not raw transcripts)backlog/**/*.md or proposalsdocs/research/README.md index lists exactly the files present (no phantom rows, no missing files, descriptions not stale)Relevance / lifecycle check (guards against doc sprawl โ format-clean โ still-needed). For EACH research doc, decide KEEP / TRIM / DELETE. A research doc is meant to persist as the "why we chose X" rationale record, so the bar for deletion is: its unique rationale is captured nowhere it's needed. Delete/trim when:
docs/reference/ doc. โ DELETE.How to run it: for each file, grep the repo for its filename (find inbound references), grep backlog/ + docs/proposals/ for whether its subject shipped/was-absorbed/is-still-open, and check docs/reference/ for a doc that already captures the same rationale. Verify before deleting โ never orphan a rationale that isn't recorded elsewhere. Deletions are git rm (git history is the backstop); confirm with the maintainer if unsure.
docs/incidents/PROJECT_POSTMORTEMS.md entries match CLAUDE.md post-mortem tabledocs/steam-deck/ setup guides still accurate for current SteamOS versiondocs/steam-deck/ paths and commands work for the current dev environmentpnpm ops guard:readme is green (project structure tree, Quick Start
Node/pnpm versions, fenced pnpm scripts, slash-command list, and
documentation links are all derivable and gated there โ don't re-check
these by hand)ls .claude/rules/)pnpm quality description matches root package.json scriptVerify docs don't reference files that have been renamed or removed:
# Check for references to deprecated root tracking files
grep -r 'CURRENT_WORK\|ROADMAP' docs/ .claude/ --include='*.md' -l
# Canonical names: CURRENT.md, BACKLOG.md
# Any hits for CURRENT_WORK.md or ROADMAP.md are stale and must be updated
CURRENT_WORK.md (renamed to CURRENT.md)ROADMAP.md (renamed to BACKLOG.md).md files in docs actually existThese catch drift between docs and code:
| What | Compare |
|---|---|
| Architecture rules (01-architecture.md) | .dependency-cruiser.cjs forbidden rules |
| Quality command description | Root package.json quality script |
| CI steps | .github/workflows/ci.yml job steps |
| Pre-push checks | .husky/pre-push numbered steps |
| Package.json shortcuts | OPS_CLI_REFERENCE.md shortcuts table |
| Documentation placement list (07) | Actual docs/reference/ subdirectories |
Cache table (durability-tiers.md) |
Actual cache classes in codebase |
lastUpdated on any modified skill filesbacklog/now.md (๐ฅ Untriaged) or the right backlog/cold/ filedocs: audit and refresh documentationpnpm ops cadence:mark doc-audit, then commit backlog/cadence-ledger.json to develop (ยง 0 and ยง 3b stamp their own passes).claude/rules/07-documentation.mddocs/reference/DOCUMENTATION_PHILOSOPHY.md.claude/skills/tzurot-docs/SKILL.md