ryanthedev/code-foundations · Archived

cc-refactoring-guidance

Guides safe refactoring using Code Complete's fix-first-then-refactor discipline: decides between refactor, rewrite, and fix-first; enforces separate commits; applies small-change rigor to high-error-rate one-liners.

First seen Mar 9, 2026

Installation

$ npx skills add ryanthedev/code-foundations --skill cc-refactoring-guidance

Summary

  • Guides safe refactoring using Code Complete's fix-first-then-refactor discipline: decides between refactor, rewrite, and fix-first; enforces separate commits; applies small-change rigor to high-error-rate one-liners.
  • Not for diagnosing the bug itself (use cc-debugging), transforming working code's complexity (use aposd-simplifying-complexity), or untested legacy code (it routes to welc-legacy-code).

Stronger alternatives

This repository is archived — consider an actively maintained alternative.

Similar popular skills

Related neighbors and high-traction skills in the same topics — useful to compare before installing.

Also in this package

Other skills from ryanthedev/code-foundations · top by installs.

npx skills add ryanthedev/code-foundations

Browse all from ryanthedev/code-foundations

More details

Agent compatibility

Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.

Claude Code Not declared
Cursor Not declared
Codex Not declared
GitHub Copilot Not declared
Windsurf Not declared
Gemini CLI Not declared
Cline Not declared
OpenCode Not declared

Repository health

Stars 369
License MIT
Default branch main
Open issues 2
Status Archived

Package contents

Files included with this skill beyond the listing page.

  • skill md SKILL.md 5,524 B
  • docs SUMMARY.md 433 B

History

  1. First seen on skills.sh
  2. First recorded snapshot · 6 installs

SKILL.md

cc-refactoring-guidance

Refactoring is behavior-preserving change to working code. Three rules govern it:

  • Fix first, then refactor — never in the same change; separate commits with a boundary between them.
  • Small changes need MORE rigor, not less — 1–5-line changes have the highest error rate.
  • Over half of changes fail the first attempt — review and test even "trivial" ones; the error rate is per change, not cumulative.
Rule Value Source
Small-change error rate Peaks at 1–5 lines Weinberg 1983
First-attempt success <50% for any change Yourdon 1986b
Review effect on 1-line changes 55% → 2% error rate Freedman and Weinberg 1982

Shared thresholds (routine length, parameters, cohesion): Read(${CLAUDEPLUGINROOT}/references/cc-foundations.md). The full 40-item refactoring checklist: Read(${CLAUDESKILLDIR}/checklists.md).

Definitions:

  • small = ONE structural change (one rename, one extract, one inline). If you describe it with "and", it's not small.
  • review = a distinct person (or AI) examines the diff. Self-review does not satisfy this.
  • working code = all tests pass AND no known behavior bugs. Compiles-but-fails-tests is not working.
  • then (fix first, then refactor) = with a commit boundary between the activities, not the same commit.

Before refactoring: identify the target pattern

Refactor toward something, not just away from bad code. Find the best examples of the target pattern in this codebase, the module's conventions, and how similar refactorings were structured; match the existing pattern exactly, or — if none exists — be deliberate about the precedent you're setting. Full gate: Read(${CLAUDEPLUGINROOT}/references/pattern-reuse-gate.md).

Core patterns

  • Mixing fix and refactor → separate commits. Fix the bug, verify, commit; then refactor, commit. "I'm just cleaning while I fix" is the anti-pattern.
  • Casual small change → rigorous small change. Desk-check, review (55% → 2%), and run regression tests even on one line.
  • Documenting bad code → rewriting it. A comment explaining confusing code is a signal to make the code self-explanatory instead.

Modes

APPLIER

Guide the refactoring decision and the safe process.

When production is down: fix only — no refactoring or cleanup — deploy, then refactor as a separate activity when stable. Combining the two raises complexity and error likelihood.

Refactor vs rewrite:

  1. Does the code currently work? NO → this is fixing, not refactoring; fix first.
  2. Is the design fundamentally sound? NO → consider rewriting.
  3. Would changes touch >30% of the module? YES → "big refactoring"; consider a rewrite.

Safe process (priority order):

  1. Save the starting code (version-control checkpoint).
  2. Keep each refactoring small — one change at a time.
  3. List the planned steps before executing.
  4. Do one at a time; recompile and retest after each — state "tests pass after [change]".
  5. Use frequent checkpoints (commit working states).
  6. Enable the pickiest compiler warnings.
  7. Retest after each change and report results, not just "tests pass".
  8. Review changes — required even for 1-line changes.
  9. Adjust for risk — extra caution for high-risk changes.

If tests fail after a refactoring: don't debug extensively — back out the change, take a smaller step, and reconsider whether you understood the code.

When prerequisites are missing:

  • No automated tests → Skill(code-foundations:welc-legacy-code) and write characterization tests first; if impossible, document expected behavior, write a manual test script, and increase review rigor.
  • No version control → back up files before starting; set up VCS first if at all possible.
  • No reviewer → systematic checklist-based self-review, smaller changes, more commits and tests to compensate.

TRANSFORMER

Transform code smells into clean code while preserving all observable behavior (same tests pass before and after): setup/takedown smell → encapsulated interface; tramp data → direct access or restructure; duplicated code → extracted routine; speculative "design ahead" code → remove it. Behavior changes are fixing, not refactoring — fix first.

Recovering from a violation

If you mixed fix and refactor in one commit:

  • Before push: git reset --soft HEAD~1, separate the changes, re-commit properly.
  • After push: document it and split in a follow-up PR; don't force-push shared branches.

If you skipped review on a small change:

  • Before merge: get the review now.
  • After merge: note it and move on.

Fixing a violation post-commit still costs less than the bugs it would otherwise cause.

Chain

After Next
Refactoring complete Skill(code-foundations:cc-control-flow-quality)
Structure changed Skill(code-foundations:cc-routine-and-class-design)
Reviewing a refactoring Skill(code-foundations:aposd-reviewing-module-design)