agentsclimarketplace

Simplify

Skill vanducng/skills/skills/simplify

Reduce the complexity of existing code without changing behavior - deep nesting, long functions, dead code, unclear names, the wrong abstraction. Use after a feature works but reads heavier than it should, or to clean up code written under time pressure. Triggers: 'simplify this', 'clean up this code', 'reduce complexity', 'refactor for clarity', 'this is hard to read', 'untangle this'.From its SKILL.md

Install
npx -y skills add vanducng/skills --skill simplify

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 5 stars5 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its file declares

Copied from the file, not written here

The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.

SKILL.md

6.4 KB, ~1.4k tokens by cl100k_base, as published. Nobody here has run it

simplify

Reduce-time discipline: make existing code easier to read without changing what it does.

The goal is not fewer lines - it's code a new teammate understands faster. Every change must pass one test: would someone reading this for the first time grasp it quicker than the original? If not, it's churn, not simplification.

What this skill is - and isn't

SkillWhenOutput
vd:simplify (this)Existing code works but reads heavy - reduce complexity, behavior unchangedRefactor commits, tests still green
vd:cookWriting new codeSimplicity is built in at write-time (Pragmatism rules), not a later pass
vd:code-reviewJudging someone's diffReports findings; never edits
vd:fixCode is brokenChanges behavior to fix a bug

Use this when the code is correct but cluttered. If it's buggy, that's vd:fix. If you're still writing it, that's vd:cook.

When to use

  • A feature passes tests but the implementation feels heavier than the problem.
  • Code written under deadline accreted nesting, dead branches, or generic names.
  • A review flagged readability and you're acting on it.

Not for: code that's already clean (don't simplify for its own sake), code you don't yet understand (comprehend first), hot paths where the simpler form is measurably slower, or a module you're about to rewrite anyway.

Hard rules

  1. Behavior is frozen. Same output for every input, same errors, same side effects and ordering. If you're unsure a change preserves behavior, don't make it.
  2. Tests are the proof. Run them after every single change. A simplification that needs a test edited to pass is a behavior change in disguise - stop and reconsider.
  3. One change at a time. Batching means you can't tell which edit broke something.
  4. Refactor commits stand alone. Never mix a refactor: with a feat:/fix:. Two concerns = two commits (or two PRs).
  5. Scope to what changed. Default to recently modified code. Drive-by refactors of unrelated code create diff noise and regression risk - broaden scope only when asked.

Workflow

1. Understand before touching (Chesterton's Fence)

Don't remove a fence until you know why it's there. Before changing anything, answer:

  • What is this code's responsibility? What calls it, what does it call?
  • What are its edge cases and error paths? Which tests pin them?
  • Why might it look this way - performance, a platform constraint, a historical reason? (git blame / git log -p the lines.)

Can't answer? You're not ready. Read more context first.

2. Find the opportunities (signals, not vibes)

Structure

PatternSignalSimplification
Deep nesting (3+ levels)Control flow is hard to followGuard clauses; extract helpers
Long function (50+ lines)Multiple responsibilitiesSplit into focused, named functions
Nested ternariesNeeds a mental stack to parseif/else, switch, or a lookup map
Boolean flag params (f(true, false))Opaque at the call siteOptions object or separate functions
Repeated conditionalSame if in many placesExtract a named predicate

Naming & redundancy

PatternSignalSimplification
Generic names (data, tmp, result)Says nothing about contentRename to the content (validationErrors)
"What" comments (// increment over i++)Restates the codeDelete - the code is the comment
"Why" comments (// retry: API flakes under load)Carries intent code can'tKeep
Duplicated logic (5+ lines, 2+ places)-Extract a shared function (Rule of Three)
Dead code (unreachable, unused, commented-out)-Remove after confirming it's truly dead
Wrong abstraction (factory-for-a-factory, 1-impl strategy)Indirection with no payoffInline to the direct form

3. Apply incrementally

For each simplification: make the change → run tests → green, continue; red, revert and reconsider. Commit refactors separately from any behavior change.

Rule of 500: if a refactor would touch more than ~500 lines, write the codemod (sed/AST transform), don't hand-edit. Manual edits at that scale are error-prone and exhausting to review.

4. Verify the whole

Step back: is it genuinely easier to understand? Did you introduce a pattern foreign to the codebase? Is the diff clean and reviewable? If the "simpler" version is harder to read or review - revert. Not every attempt succeeds, and that's fine.

Over-simplification traps (the failure mode)

  • Inlining a helper that named a concept - the call site gets harder, not easier.
  • Merging unrelated logic - two simple functions fused into one complex one is not simpler.
  • Deleting an abstraction that existed for testability/extensibility, not for complexity.
  • Optimizing for line count. Fewer lines ≠ clearer.

Rationalizations to catch in yourself

ThoughtReality
"I'll just clean up this nearby code too"Scope creep - that's a separate PR
"Fewer lines is better"Comprehension is the metric, not length
"This abstraction is pointless"Check why it exists before removing it (Fence)
"Tests fail but my version is clearer"Then it changed behavior - it's not a simplification

Integration points

  • vd:cook - Step E surfaces complexity during a feature; bank the note and run vd:simplify as a separate follow-up commit, never tangled into the feature diff.
  • vd:code-review - review flags complexity (report-only); this skill is how you act on it.
  • vd:git - refactor commits stay isolated per the vd:git skill's references/commit-standards.md.

Future (out of scope for MVP)

  • Language-specific codemod recipes beyond the Rule-of-500 pointer.
  • An automatic complexity metric gate (cyclomatic/cognitive) - judgment-first for now.

What ships with it

Read from the repository

Just SKILL.md. No reference files, no scripts.

Gives 1 of the 12 instructions most refactoring skills give in ~1.4k tokens

Counted across 545 of the 587 authors here whose files we hold, read 2026-09-06

  • Run tests after each changehere, and in 61 of 545, across 59 files
  • Run tests before refactoringin 42 of 545
  • Revert immediately if tests failin 31 of 545, across 28 files
  • Perform refactoring in small stepsin 30 of 545, across 29 files
  • Write characterization tests for untested codein 21 of 545, across 19 files
  • Remove dead code and unused importsin 20 of 545
  • Identify code smellsin 20 of 545
  • Perform one refactoring at a timein 19 of 545
  • Commit after each successful refactoringin 17 of 545, across 15 files
  • Verify all tests pass after refactoringin 17 of 545
  • Keep refactoring separate from behavior changesin 16 of 545, across 14 files
  • Run the full test suitein 16 of 545

Said here and by no other author read

  • extract helpers to reduce deep nesting
  • split long functions into focused named functions

Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.