/comment-refactor — clean comment cruft, incrementally, across a codebase
Comments in AI-assisted code accumulate: fix-history narration (// changed to X because the old way broke), stale explanations that no longer match the code, and line-by-line restating of what
the code plainly does. This skill removes that layer while keeping the comments that carry real
information, across many files, and only re-touches files that changed since their last pass.
It composes three things:
- the
/remove-comments keep/remove judgment (the engine),
- the
/deslop → humanizer pass applied to comment prose (AI-tell removal inside the
comments that survive), and
- two mods you asked for: a used-code filter (skip dead/abandoned/unused + vendored/generated
files) and an incremental content-hash marker (skip files already up to date).
Bundled helpers
marker.py — the idempotency control marker. check <file> (exit 0 = up-to-date/skip, 10 =
process), stamp <file> (write/refresh the marker), hash <file>. The marker is
@comment-refactor:v1:<sha256(body-without-marker)[:16]> in the file's own comment syntax,
placed at the top (after a shebang). Excluding the marker line from the hash makes re-stamping
stable; any real edit changes the hash and forces a reprocess.
scan.sh [path|glob …] — prints the mechanical worklist (PROCESS <file> / SKIP-UPTODATE <file>), applying the extension allowlist, the vendored/generated exclusions, and the marker
check. Default scope is the git-tracked tree.
Procedure
1. Resolve scope
From the argument: a file → that file; a directory/glob → its matching files; empty → the whole
repo. Run the scan to get the worklist:
bash "$SKILL_DIR/scan.sh" <path-or-glob> # omit arg for the whole repo
SKILL_DIR is this skill's directory. Everything marked SKIP-UPTODATE is already clean since its
last pass — ignore it. Work only the PROCESS list.
2. Filter to code that's actually used (the used-code mod)
The scan already drops node_modules/dist/build/vendor/.min./*.d.ts/generated dirs. Now
drop dead/abandoned/unused source too, so effort goes to live code:
- If the
repowise MCP server is available, call get_dead_code and remove any PROCESS file it
flags as dead/unreachable. If codebase-memory is available instead, use search_graph /
reachability to the same end.
- If neither is available, fall back to obvious signals only — files with no inbound imports, files
under
legacy//deprecated//archive/, and anything the repo's own docs mark obsolete — and
say in the summary that the dead-code filter was heuristic, not tool-verified.
Never delete or edit a file you're skipping; just leave it out of the worklist.
3. Refactor each PROCESS file
Read the file. Apply the keep/remove judgment (comment syntax is language-specific — //, #,
--, /* */, <!-- -->, docstrings).
REMOVE:
- Comments that restate the code (
// increment i, # return the result, // constructor).
- Fix-history / changelog narration in comments:
// changed to…, // was previously…,
// fixed bug where…, // updated 2024-… to handle…, stacked layers of // also handle… added
over time. The comment should describe the code as it is now, not its edit history — that's what
git is for.
- Obsolete explanations that no longer match the current code (verify against the actual code, not
the comment's claim).
- AI narration of control flow (
// Now we loop over the items and…, // First, we check if…).
- Commented-out code (
// const old = …) unless a nearby comment explains why it's intentionally
parked.
PRESERVE (do not touch):
- WHY a non-obvious choice was made; business-logic rationale; the repo's own "load-bearing"
comments.
TODO / FIXME / HACK / XXX, MARK:/section markers, and warnings about non-obvious or
dangerous behavior.
- License/copyright headers,
@ts-* / eslint-* / noqa / type-directive pragmas, and generator
markers — including this skill's own @comment-refactor:v1: marker.
CONSOLIDATE: where several stacked comments describe one thing (typically fix-history), collapse
to a single present-tense line, or delete if the code is now self-evident.
Then de-slop the surviving comment prose. If the humanizer skill is available, invoke it
(Skill tool, skill=humanizer) on the comment text — it's the source of truth (/deslop is its
alias). If it isn't installed, apply its core rules inline: no em-dash overuse, no rule-of-three, no
AI vocabulary ("leverage", "seamless", "robust"), no filler/hedging. Either way, keep the technical
content and stay neutral — never rewrite comments in anyone's "voice".
Keep changes surgical — comments only. Do not touch code, formatting, or imports.
4. Stamp the marker
After editing a file, refresh its marker so future runs skip it until it changes again:
python3 "$SKILL_DIR/marker.py" stamp <file>
Stamp only files you actually refactored (or confirmed already clean this pass) — the marker
asserts "these comments were reviewed at this content hash."
5. Confirm + report
- Default to a dry-run first on a multi-file scope: show the worklist and a sample of the
removals per file, and get a go-ahead before applying — a bulk comment sweep is easy to over-cut.
A single-file / small scope can apply directly with the diff shown.
- Report: files processed, files skipped up-to-date, files skipped as dead/vendored, and a one-line
note if the dead-code filter was heuristic.
Notes
- The marker makes the skill cheap to re-run: a second pass over an unchanged repo does almost no
work (all
SKIP-UPTODATE). Run it after a big AI-assisted coding burst.
- Bump the marker version (
v1→v2) only if the keep/remove rules change enough that every file
deserves a fresh pass — that invalidates all existing markers by design.
- Language coverage is the marker helper's extension map; an unsupported extension is reported and
left unstamped rather than guessed.
1---2name: comment-refactor3description: Refactor the comments in AI-generated (or long-lived) code — strip the accumulation of fix-history narration, obsolete explanations, and code-restating noise while preserving load-bearing WHY/TODO/warning comments. Works over a path, glob, or the whole repo; skips dead/abandoned/unused and vendored/generated files; and stamps each cleaned file with a content-hash marker so re-runs skip files that haven't changed. Incorporates the /remove-comments and /deslop (humanizer) heuristics plus a used-code filter and incremental idempotency. Triggers on `/comment-refactor [path|glob]`, "refactor the comments", "clean up comment cruft", "strip obsolete comments".4license: MIT5---67# /comment-refactor — clean comment cruft, incrementally, across a codebase89Comments in AI-assisted code accumulate: fix-history narration (`// changed to X because the old10way broke`), stale explanations that no longer match the code, and line-by-line restating of what11the code plainly does. This skill removes that layer while keeping the comments that carry real12information, across many files, and **only re-touches files that changed since their last pass**.1314It composes three things:151. the `/remove-comments` keep/remove judgment (the engine),162. the `/deslop` → **humanizer** pass applied to comment *prose* (AI-tell removal inside the17 comments that survive), and183. two mods you asked for: a **used-code filter** (skip dead/abandoned/unused + vendored/generated19 files) and an **incremental content-hash marker** (skip files already up to date).2021## Bundled helpers2223- `marker.py` — the idempotency control marker. `check <file>` (exit 0 = up-to-date/skip, 10 =24 process), `stamp <file>` (write/refresh the marker), `hash <file>`. The marker is25 `@comment-refactor:v1:<sha256(body-without-marker)[:16]>` in the file's own comment syntax,26 placed at the top (after a shebang). Excluding the marker line from the hash makes re-stamping27 stable; any real edit changes the hash and forces a reprocess.28- `scan.sh [path|glob …]` — prints the mechanical worklist (`PROCESS <file>` / `SKIP-UPTODATE29 <file>`), applying the extension allowlist, the vendored/generated exclusions, and the marker30 check. Default scope is the git-tracked tree.3132## Procedure3334### 1. Resolve scope35From the argument: a file → that file; a directory/glob → its matching files; **empty → the whole36repo**. Run the scan to get the worklist:3738```bash39bash "$SKILL_DIR/scan.sh" <path-or-glob> # omit arg for the whole repo40```4142`SKILL_DIR` is this skill's directory. Everything marked `SKIP-UPTODATE` is already clean since its43last pass — ignore it. Work only the `PROCESS` list.4445### 2. Filter to code that's actually used (the used-code mod)46The scan already drops `node_modules`/`dist`/`build`/`vendor`/`.min.`/`*.d.ts`/generated dirs. Now47drop **dead/abandoned/unused** source too, so effort goes to live code:4849- If the `repowise` MCP server is available, call `get_dead_code` and remove any `PROCESS` file it50 flags as dead/unreachable. If `codebase-memory` is available instead, use `search_graph` /51 reachability to the same end.52- If neither is available, fall back to obvious signals only — files with no inbound imports, files53 under `legacy/`/`deprecated/`/`archive/`, and anything the repo's own docs mark obsolete — and54 **say in the summary that the dead-code filter was heuristic, not tool-verified.**5556Never delete or edit a file you're skipping; just leave it out of the worklist.5758### 3. Refactor each PROCESS file59Read the file. Apply the keep/remove judgment (comment syntax is language-specific — `//`, `#`,60`--`, `/* */`, `<!-- -->`, docstrings).6162**REMOVE:**63- Comments that restate the code (`// increment i`, `# return the result`, `// constructor`).64- **Fix-history / changelog narration** in comments: `// changed to…`, `// was previously…`,65 `// fixed bug where…`, `// updated 2024-… to handle…`, stacked layers of `// also handle…` added66 over time. The comment should describe the code as it is now, not its edit history — that's what67 git is for.68- Obsolete explanations that no longer match the current code (verify against the actual code, not69 the comment's claim).70- AI narration of control flow (`// Now we loop over the items and…`, `// First, we check if…`).71- Commented-out code (`// const old = …`) unless a nearby comment explains why it's intentionally72 parked.7374**PRESERVE (do not touch):**75- WHY a non-obvious choice was made; business-logic rationale; the repo's own "load-bearing"76 comments.77- `TODO` / `FIXME` / `HACK` / `XXX`, `MARK:`/section markers, and warnings about non-obvious or78 dangerous behavior.79- License/copyright headers, `@ts-*` / `eslint-*` / `noqa` / type-directive pragmas, and generator80 markers — including **this skill's own `@comment-refactor:v1:` marker**.8182**CONSOLIDATE:** where several stacked comments describe one thing (typically fix-history), collapse83to a single present-tense line, or delete if the code is now self-evident.8485Then de-slop the surviving comment **prose**. If the `humanizer` skill is available, invoke it86(Skill tool, `skill=humanizer`) on the comment text — it's the source of truth (`/deslop` is its87alias). If it isn't installed, apply its core rules inline: no em-dash overuse, no rule-of-three, no88AI vocabulary ("leverage", "seamless", "robust"), no filler/hedging. Either way, keep the technical89content and stay neutral — never rewrite comments in anyone's "voice".9091Keep changes surgical — comments only. Do not touch code, formatting, or imports.9293### 4. Stamp the marker94After editing a file, refresh its marker so future runs skip it until it changes again:9596```bash97python3 "$SKILL_DIR/marker.py" stamp <file>98```99100Stamp **only** files you actually refactored (or confirmed already clean this pass) — the marker101asserts "these comments were reviewed at this content hash."102103### 5. Confirm + report104- **Default to a dry-run first** on a multi-file scope: show the worklist and a sample of the105 removals per file, and get a go-ahead before applying — a bulk comment sweep is easy to over-cut.106 A single-file / small scope can apply directly with the diff shown.107- Report: files processed, files skipped up-to-date, files skipped as dead/vendored, and a one-line108 note if the dead-code filter was heuristic.109110## Notes111- The marker makes the skill cheap to re-run: a second pass over an unchanged repo does almost no112 work (all `SKIP-UPTODATE`). Run it after a big AI-assisted coding burst.113- Bump the marker version (`v1`→`v2`) only if the keep/remove rules change enough that every file114 deserves a fresh pass — that invalidates all existing markers by design.115- Language coverage is the marker helper's extension map; an unsupported extension is reported and116 left unstamped rather than guessed.