kimchi:simplicity-enforcement

Use when designing solutions, implementing features, or considering abstractions. Enforces YAGNI, minimal code, and preferring duplication over wrong abstraction.

7 stars

Best use case

kimchi:simplicity-enforcement is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

Use when designing solutions, implementing features, or considering abstractions. Enforces YAGNI, minimal code, and preferring duplication over wrong abstraction.

Teams using kimchi:simplicity-enforcement should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/simplicity-enforcement/SKILL.md --create-dirs "https://raw.githubusercontent.com/Tromml/kimchi/main/plugins/kimchi/skills/simplicity-enforcement/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/simplicity-enforcement/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How kimchi:simplicity-enforcement Compares

Feature / Agentkimchi:simplicity-enforcementStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

Use when designing solutions, implementing features, or considering abstractions. Enforces YAGNI, minimal code, and preferring duplication over wrong abstraction.

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# Simplicity Enforcement

## Overview

Complexity is the enemy. Every abstraction, configuration option, and "extensible" pattern is a cost. Pay it only when you must.

**Core principle:** Prefer simple solutions over clever ones. Always.

**Violating the letter of these rules is violating the spirit of simplicity.**

## When This Applies

Every implementation decision. No exceptions.

## The Iron Law

```
THE RIGHT AMOUNT OF COMPLEXITY IS THE MINIMUM NEEDED FOR THE CURRENT TASK
```

Three similar lines of code is better than a premature abstraction.

## Principles

### Prefer Duplication Over Wrong Abstraction

If you're not sure an abstraction is right:
- Duplicate the code
- Wait until you have 3+ similar cases
- Then extract with full understanding

<Good>
```ruby
# Duplication when pattern unclear
class AvatarUploadService
  def upload(file)
    validate_size(file)
    validate_type(file)
    store_in_s3(file)
  end
end

class DocumentUploadService
  def upload(file)
    validate_size(file)
    validate_type(file)
    store_in_s3(file)
  end
end
```
Two cases. Let it sit. Extract when you see the third.
</Good>

<Bad>
```ruby
# Premature abstraction
class GenericUploadService
  def initialize(validator:, storage:, processor: nil)
    @validator = validator
    @storage = storage
    @processor = processor
  end

  def upload(file)
    @validator.validate(file)
    processed = @processor&.process(file) || file
    @storage.store(processed)
  end
end
```
Over-engineered for two use cases
</Bad>

### YAGNI: You Aren't Gonna Need It

Don't build for hypothetical future requirements.

<Good>
```ruby
# Build what's needed now
class ImageResizer
  def resize(file, dimensions)
    ImageProcessing::Vips
      .source(file)
      .resize_to_fill(*dimensions)
      .call
  end
end
```
</Good>

<Bad>
```ruby
# Hypothetical future support
class ImageResizer
  STRATEGIES = {
    vips: VipsStrategy,
    imagemagick: ImageMagickStrategy,
    cloudinary: CloudinaryStrategy,  # "in case we switch"
  }

  def initialize(strategy: :vips)
    @strategy = STRATEGIES[strategy].new
  end
end
```
</Bad>

### Hardcode First, Configure Later

If a value won't change soon, hardcode it.

<Good>
```ruby
AVATAR_SIZES = [32, 128, 512].freeze
BUCKET = 'avatars'
```
</Good>

<Bad>
```ruby
config.avatar_sizes = [32, 128, 512]  # In YAML config
config.avatar_bucket = ENV['AVATAR_BUCKET']  # When it's always 'avatars'
```
</Bad>

### One Way to Do It

Don't provide multiple ways to accomplish the same thing.

<Good>
```ruby
user.avatar_url(:medium)
```
</Good>

<Bad>
```ruby
user.avatar_url
user.get_avatar_url
user.fetch_avatar(size: :medium)
Avatar.url_for(user)
```
</Bad>

## Common Rationalizations

| Excuse | Reality |
|--------|---------|
| "We might need this later" | Build it later. YAGNI. |
| "It's more flexible this way" | Flexibility you don't need is complexity you pay for now. |
| "DRY says extract it" | DRY applies at 3+ repetitions with clear pattern, not 2. |
| "Enterprise patterns are best practice" | Factory/Strategy/Observer for one use case is anti-practice. |
| "Configuration makes it reusable" | Configuration for fixed values is noise. |
| "What if requirements change?" | They will. Refactor then, with full context. Cheaper than guessing now. |
| "It's only a little more complex" | Complexity compounds. Every "little" addition adds up. |

## Red Flags — STOP and Simplify

- Writing a class with "Generic", "Base", or "Abstract" in the name for a single use
- Adding constructor parameters for "flexibility"
- Creating config files for values that won't change
- Writing a "factory" or "strategy" pattern
- Building plugin/extension points
- Adding feature flags for unrequested features
- Creating helpers/utilities for one-time operations
- Designing for hypothetical future requirements

**ALL of these mean: STOP. Delete. Write the simple version.**

## Verification

Before completing:
- [ ] No abstractions without 3+ uses
- [ ] No configuration for fixed values
- [ ] No "pluggable" or "extensible" patterns for single use
- [ ] No multiple ways to do the same thing
- [ ] Could a junior developer understand this in 5 minutes?

## Anti-Patterns

### FORBIDDEN: "Enterprise" patterns for small features

Factory, Strategy, Observer, Visitor patterns are rarely needed. If you have one implementation, you don't need a pattern.

### FORBIDDEN: Future-proofing

"What if we need to support X later?" — Build it later. You'll have more context then.

### FORBIDDEN: DRY at all costs

Duplication is better than wrong abstraction. Two similar functions are fine. Extract at three.

### FORBIDDEN: Backwards-compatibility shims

If something is unused, delete it. Don't rename to `_var`, re-export, or add `# removed` comments.

Related Skills

kimchi:verification-before-completion

7
from Tromml/kimchi

Use when about to claim work is complete, fixed, or passing — before committing or creating PRs. Evidence before assertions, always.

kimchi:validate

7
from Tromml/kimchi

This command should be used to validate bead YAML files for standalone executability. Runs 4 validators (context completeness, deliverables clarity, test specification, isolation) and enriches failing beads. Eighth stage of the Kimchi planning pipeline.

kimchi:tdd

7
from Tromml/kimchi

Use when implementing any feature, bugfix, or behavior change — before writing implementation code. Enforces RED-GREEN-REFACTOR cycle.

kimchi:systematic-debugging

7
from Tromml/kimchi

Use when encountering any bug, test failure, or unexpected behavior — before proposing fixes. Enforces 4-phase root cause analysis.

kimchi:status

7
from Tromml/kimchi

This command should be used to check the current state of the Kimchi planning pipeline, including which stages have completed, what artifacts exist, and bead validation status.

kimchi:review

7
from Tromml/kimchi

This command should be used to run multi-persona review of the implementation plan. Five specialized personas critique the plan for scope creep, complexity, premature optimization, and test coverage. Fifth stage of the Kimchi planning pipeline. Produces .kimchi/PLAN-REVIEWED.md.

kimchi:reset

7
from Tromml/kimchi

This command should be used to clear the Kimchi working directory (.kimchi/) and start fresh. Preserves .beads/ directory. Use when starting a new planning session or recovering from a bad state.

kimchi:research

7
from Tromml/kimchi

This command should be used to investigate codebase patterns, frameworks, and existing implementations before planning. Third stage of the Kimchi planning pipeline. Produces .kimchi/RESEARCH.md.

kimchi:requirements

7
from Tromml/kimchi

This command should be used to extract and categorize requirements from CONTEXT.md into v1 (must have), v2 (next iteration), and out of scope. Second stage of the Kimchi planning pipeline. Produces .kimchi/REQUIREMENTS.md.

kimchi:refine

7
from Tromml/kimchi

This command should be used to iteratively improve the plan until quality threshold is reached or diminishing returns detected. Sixth stage of the Kimchi planning pipeline. Produces .kimchi/PLAN-DRAFT.md.

kimchi:plan

7
from Tromml/kimchi

This command should be used to run the Kimchi planning pipeline through refinement, transforming a vague idea into a draft plan ready for cross-model analysis. Orchestrates 6 stages: clarify, requirements, research, generate, review, refine. Use --full-auto to also run beads + validate after manual revise/synthesize.

kimchi:plan-synthesize

7
from Tromml/kimchi

This command should be used to synthesize multiple cross-model plan revisions into a superior hybrid plan. Eighth stage of the Kimchi planning pipeline. Reads PLAN-REVISED-*.md files and outputs PLAN-SYNTHESIZED.md — the TRUE final plan.