Fuck Over-Engineering
SkillFiles & storageUse 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
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the Fuck Over-Engineering skill
What this skill tells your AI
The instructions your AI receives, as published by vinta/hal-9000 in skills/fuck-over-engineering/SKILL.md and read by ahel’s review.
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:hand-written 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 a side effect of a deleted target.
Signals
- GitHub stars
- 130
- Forks
- 25
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
fuck-over-engineering- Source
- github.com/vinta/hal-9000