Skip to content
Back to skills

Drift Sweep

ASecurity

Audit the ralphctl `.claude/` setup (the 6 subagents, the in-repo skills, the `.claude/docs/` modules) and `CLAUDE.md` for DRIFT against the real `src/` — stale version stamps, renamed/dead paths, removed symbols, unshipped env vars, and fabricated references. Use this whenever someone asks to "audit / refresh / clean up / check the .claude setup", before cutting a release, after a large rename or refactor under `src/`, or when an agent or doc cites a path/symbol that "feels off". This is doc...

  • 24 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 2, 2026
ai-agentsrustgobashgit

Works with

  • claude code
  • cli

Security analysis

A100/100

Pro scans all 2 files and shows the line behind each finding

Scanned September 30, 2026

npx -y skills add lukas-grigis/ralphctl --skill drift-sweep --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Drift Sweep?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Drift Sweep
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/lukas-grigis-drift-sweep/badge)](https://www.skillsdirectory.com/skills/lukas-grigis-drift-sweep)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: drift-sweep
description: Audit the ralphctl `.claude/` setup (the 6 subagents, the in-repo skills, the `.claude/docs/` modules) and `CLAUDE.md` for DRIFT against the real `src/` — stale version stamps, renamed/dead paths, removed symbols, unshipped env vars, and fabricated references. Use this whenever someone asks to "audit / refresh / clean up / check the .claude setup", before cutting a release, after a large rename or refactor under `src/`, or when an agent or doc cites a path/symbol that "feels off". This is doc/config drift — it complements `verify` (which runs typecheck/lint/test for code correctness); reach for drift-sweep when the question is "do our agent and doc files still describe the code as it actually is?".
when_to_use: Trigger on "audit the .claude setup", "refresh the agents/docs", "is the .claude folder still accurate", "check for stale references", "pre-release doc check", or after any rename/move under src/ that the agent and doc files mirror. Not for runtime code correctness (use `verify`) and not for prose quality.
allowed-tools: Bash, Read, Grep, Glob, Edit
---

# Drift Sweep

The `.claude/` agent and doc files mirror the shape of `src/` — module paths, symbol names, env vars,
command names, version numbers. The code moves every day; these mirrors do not move with it unless someone
makes them. The result is silent drift: an agent confidently points the next session at `runtime/mount.tsx`
(deleted), a doc cites `RALPHCTL_JSON` (never shipped), every agent hardcodes `v0.7.0` while the repo is at
`0.12.x`. None of it fails a test, so nothing catches it — until a session follows a dead pointer and wastes
a turn, or a contributor trusts a stale acceptance criterion.

This skill is the cheap, repeatable counter-pressure: a mechanical sweep that surfaces _candidates_, followed
by judgement to confirm them. It is deliberately conservative — a false "this is drift" wastes a fix; a missed
one rots quietly. So the script flags, and you verify.

## When this earns its keep

- Someone asks to audit, refresh, or clean up `.claude/` or `CLAUDE.md`.
- Before a release — stale version stamps and dead paths shipping in docs is avoidable.
- Right after a rename/move under `src/` (a sibling renamed, a file relocated, a symbol dropped) — the agent
  and doc files that named the old shape are now wrong.

## How to run it

1. **Run the sweep harness** to get the candidate list:

   ```bash
   bash .claude/skills/drift-sweep/scripts/sweep.sh
   ```

   It scans `CLAUDE.md`, `.claude/agents/`, `.claude/docs/`, and `.claude/skills/` (markdown only) and prints
   candidates grouped into five buckets:
   - **[1] Version stamps** — every `vX.Y.Z` vs `package.json`. Noise is expected here: external tool versions
     (Claude Code, Copilot CLI) and historical migration notes (`v0.6.x → …`) are _legitimately_ pinned. A bare
     current-feature stamp like `v0.7.0` in a "this is how it works today" sentence is the real target.
   - **[2] Missing paths** — referenced `src/`, `tests/`, `scripts/` files/dirs that no longer exist. Highest
     signal; a gone path is almost always real drift.
   - **[3] Unread env vars** — `RALPHCTL_*` named in docs with zero non-test reads in `src/` (unshipped or removed).
   - **[4] Known stale patterns** — recurring renames (`tests/integration/flows/` → `…/application/flows/`,
     the `signals/` → `contract/` sibling rename, `runtime/mount.tsx`, `InkPromptAdapter`, `PromptPort`).
   - **[5] Symbol sample** — backticked identifiers to spot-check; too noisy to auto-resolve, so pick the
     load-bearing ones and grep them yourself.

2. **Verify every candidate against the real code before reporting it.** This is the non-negotiable step. The
   script cannot tell a real rename from a legitimate-but-similar name. Concretely:
   - For a flagged path: does it exist? what replaced it? (`ls`, `git log --follow`, `Grep` the new name).
   - For a flagged symbol: `grep -rl "<symbol>" src` — zero hits means fabricated/renamed; find the real one.
   - For a version stamp: is it describing _current behaviour_ (drift) or _history_ (`v0.6.x → v0.7.0`, keep)?
   - For an env var: `grep -rl "<VAR>" src | grep -v test` — confirm it is genuinely unread before flagging.

   A candidate that survives this check is real drift. One that does not (e.g. `signals.json` is a live
   runtime filename even though the `signals/` directory was renamed) is dropped — note it as a false positive
   so the next run is faster.

3. **Fix or report.** For a focused pass, apply the corrections directly (prefer pointing at a source of truth
   over re-stating a brittle list — e.g. "see `src/domain/value/error/` for the canonical set" instead of a
   hand-copied enumeration that will re-rot). For a broad audit, hand back a grouped report: file, the wrong
   claim, the right one, the evidence.

## Output format

When reporting (rather than directly fixing), group by severity, then by file:

```
## Drift report — <N> confirmed, <M> false positives dropped

### critical — actively misleads a session
- <file>:<line> — `<wrong>` → `<right>` (evidence: <src path / grep result>)

### medium — stale but not actively harmful
- …

### false positives (verified legitimate, left as-is)
- <candidate> — why it is fine
```

## Keeping the sweep sharp

When you confirm a _new_ class of drift (a fresh rename that recurs, a newly-fabricated symbol pattern), add
it to bucket [4] in `scripts/sweep.sh`. The known-pattern list is the cheapest early-warning — every pattern
you encode there turns a judgement call into a one-line grep for the next person. That is the whole point: the
sweep should get smarter each time the code teaches it something.

## Relationship to `verify`

`verify` answers "is the code correct?" (typecheck, lint, tests). `drift-sweep` answers "do the docs and agents
still describe the code accurately?". They are orthogonal: a repo can be fully green and still ship agents that
point at deleted files. Run `verify` before committing code; run `drift-sweep` before a release or after a
structural rename.

Files in this skill

  • SKILL.md6 KB
  • scripts/sweep.sh4.7 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.