Smallest Sufficient Code Changes
Implement and simplify code with fewer moving parts, justified dependencies, and checks that preserve required behavior.
Before & after
Same prompt, same agent — the only difference is the skill.
You could clean up this code a bit. There might be some dependencies you don't need, or functions that could be simpler. Sometimes people add libraries that do small things when you could just use built-in features. You might also have some code that does similar things in different places and could be consolidated. It depends on your setup, but I'd be happy to suggest some changes. What framework are you using?
EFFICIENCY LADDER ANALYSIS (Precedence: cut first, reuse second, stdlib third)
TIER 1: CUT (Can this go away?)
✗ lodash dependency (56KB minified) used for: _.debounce, _.throttle, _.flatten
→ Native replacement: setTimeout loop tracking or ResizeObserver for debounce
→ Cost to remove: 3 functions, 15 lines of code total
→ Savings: 56KB bundle, 1 dependency to monitor for updates
→ Decision: Remove immediately
✗ moment.js (67KB) used for: date formatting, timezone conversion
→ Native replacement: Intl.DateTimeFormat API (built-in, no deps)
→ Cost to remove: 2 format strings swap from moment patterns to Intl options
→ Example: moment('2026-07-31').format('MMM D') → new Intl.DateTimeFormat('en', {month: 'short', day: 'numeric'}).format(new Date('2026-07-31'))
→ Savings: 67KB bundle
→ Decision: Remove if timezone handling not needed; else swap to date-fns (33KB, smaller)
✗ classnames library (2KB) used for: conditional CSS class concatenation
→ Native replacement: Template literal with ternary
→ Example: classNames('base', isActive && 'active') → `base ${isActive ? 'active' : ''}`
→ Cost: Slightly less readable but same output
→ Decision: Remove (2KB saved is secondary; simplicity is primary)
TIER 2: REUSE (Consolidate duplicated code)
⊕ useDebounce hook written 3 times across codebase (in FilterInput, SearchBar, AutoSave)
→ Consolidate: Move to shared hooks/useDebounce.ts
→ Cost: 1 file, 8 lines
→ Savings: Reduce 25 lines of duplication, fix bugs once instead of 3 times
⊕ Fetch wrapper repeated in api.ts, stripe.ts, analytics.ts
→ Consolidate: Move to api/client.ts, export fetchWithAuth, fetchWithRetry
→ Savings: Remove 40 lines, reduce error handling code duplication
TIER 3: STDLIB (Is this built-in?)
⊕ Array operations: Swap map/filter/reduce from custom forEach loops
→ Example: for(let i=0; i<items.length; i++) → items.map(item => ...)
→ Savings: Clearer intent, 5 fewer lines per loop
⊕ Promise handling: Use Promise.all instead of manual async/await loops
→ Example: for await (const result of api.get(urls)) → Promise.all(urls.map(u => api.get(u)))
→ Savings: 3 lines per parallel call, faster execution
TIER 4: NATIVE PLATFORM
⊕ CSS: Remove 12 @media queries that duplicate breakpoint logic
→ Native replacement: CSS Grid subgrid or CSS Container Queries (browser support improving)
→ Trade-off: Older browser support vs cleaner CSS
BEFORE/AFTER BUNDLE SIZE
Before: 340KB (lodash 56 + moment 67 + classnames 2 + app code 215)
After: 200KB (app code 200, after refactoring for consolidation)
Savings: 42% reduction, no feature loss
About this skill
“This needs one function. Why did we get a framework?” This skill keeps implementation tied to today's requirements and works through reuse, standard libraries, native capabilities, and installed dependencies before adding machinery. It also catches shortcuts that make code smaller by dropping required behavior.
What it does
- Turns a feature request into a concrete behavior boundary, separating requirements from speculative flexibility.
- Checks existing code, standard libraries, native platform features, and installed dependencies before proposing new code or packages.
- Reviews wrappers, factories, registries, configuration options, and interfaces against actual callers and variation.
- Simplifies code while preserving compatibility, error behavior, security boundaries, and resource cleanup.
- Justifies necessary dependencies by naming the capability gap and the custom code they would replace.
- Produces a focused patch or implementation recommendation with targeted verification and a concrete trigger for revisiting deferred complexity.
What you get
A small, reviewable implementation or simplification review, sized to your request. You get the chosen approach, the relevant tradeoffs, and an honest account of what was checked.
Best for
Developers reviewing oversized generated code, teams reducing dependency growth, and builders who want working features without speculative architecture.
SKILL.md preview
---
name: smallest-sufficient-code-changes
description: Implement and simplify code by defining current behavior, then checking YAGNI, project reuse, standard libraries, native platform features, and installed dependencies before adding code or packages. Use when the user says "keep this simple", "this feels over-engineered", "do we need this dependency?", "my small feature keeps turning into a framework", "remove unnecessary abstractions", "use the standard library", or "write the smallest maintainable solution".
---
# Smallest Sufficient Code Changes
… (sign up to view the full skill)More development skills
View all Development skills →Performance Bottleneck Profiling: Node, Python, Go
Classifies a slowdown, gives exact profiler commands, reads the output, and proves the fix with same-conditions p95/p99 numbers.
Feature Scaffolding with Working Tests
Turn a short feature spec into code, runnable tests, and integration wiring that match your existing project.
Feature Flag Rollouts and Kill Switches
Design staged flag rollouts, verify rollback paths, and audit flag debt with explicit defaults, gates, and retirement plans.
Microcontroller Firmware and RTOS Engineering
Build and debug MCU firmware with bounded ISR/RTOS timing, safe DMA ownership, and measured power budgets.