fuck-over-engineering · git:20260902.0048ff1 · 2026-09-02 · sha256 7abf1e7d30582a2f

fuck-over-engineering git:20260902.0048ff1A

Immutable. This exact content is served forever at /api/v1/blob/7abf1e7d30582a2f.

---
name: fuck-over-engineering
description: Use when the user asks what could be deleted or reduced to simplify a codebase, says "simplify", "over-engineered", or wants a repo-, folder-, or file-wide audit for over-engineering — hunts dead code, reinvented stdlib, needless dependencies, and single-implementation abstractions, reports ranked cuts, applies only the picks. Not a diff review and not a bug hunt
argument-hint: "[path, module, or area — omit for whole repo]"
user-invocable: true
---

# Fuck Over-Engineering

Audit the scope for over-engineering and report what to cut, ranked biggest cut first. The best outcome is a shorter codebase with the same behavior. The argument is the scope; without one, the whole tree. Read what the scope holds before judging it, and fan out subagents when it will not fit in context.

## Tags

- `delete:` dead code, unused flexibility, speculative feature. Nothing replaces it.
- `reuse:` bespoke code that a helper already in this codebase, or an installed dependency, already provides. Name the helper or function.
- `stdlib:` hand-rolled thing the language's standard library ships. Name the function.
- `native:` dependency or code doing what the platform already does. Name the feature.
- `yagni:` abstraction with one implementation, config nobody sets, layer with one caller.
- `shrink:` same logic, fewer lines. Show the shorter form.

## Hunt

Dependencies the stdlib or platform already covers, single-implementation interfaces, factories with one product, wrappers that only delegate, files exporting one thing, dead flags and config, hand-rolled stdlib, near-duplicates of an existing helper, special-case branches bolted onto shared paths, feature logic living in shared modules.

## Evidence

Every finding cites the evidence that makes it a cut: caller count, implementation count, or the stdlib or platform feature and the version that ships it. Count callers through dynamic dispatch, entry points, hooks, and tests, not grep alone. A published package's public export stays at zero in-repo callers. Verify `stdlib:` and `native:` claims against current docs (the find-docs skill when present) before asserting them.

A finding removes lines or concepts; moving them between files is a refactor, not a cut. Fewer, bigger cuts beat a long list: a `shrink:` that saves two lines earns a slot only when it also removes a concept.

## Output

One line per finding, numbered, ranked biggest cut first:

`N. <tag> <what to cut>. <replacement>. <evidence>. [path:line]`

`delete:` omits the replacement sentence. End with `net: -<N> lines, -<M> deps possible.` Nothing to cut: `Lean already. Ship.`

- `1. yagni: AbstractRepository with one implementation. Inline it. 1 subclass, 3 call sites typed to the base. [repo.py:88]`
- `2. reuse: hand-rolled slugify. python-slugify is installed, slugify(). 1 caller. [utils/text.py:10-31]`
- `3. delete: retry wrapper around an idempotent local call. 0 callers outside its own test. [src/net.py:52-71]`

Then offer the findings with AskUserQuestion, multiSelect, in ranked batches of four per question, and apply the picks.

## Boundaries

Over-engineering and complexity only: correctness bugs, security holes, and performance belong to a normal review pass. Trust-boundary validation, data-loss handling, security, and accessibility are never cuts. A single smoke test or assert-based self-check is the minimum, not bloat. Tests enter the report only as collateral of a deleted target.