Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Before adding abstraction, asks "do we need this now?" Activates when proposing factories, abstract classes, config-driven behavior, or "for future extensibility." Resists over-engineering. Use when the agent is about to build something more complex than what was asked for.
.claude/skills/adityapeshave-sophos-keep-it-simple/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -24% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 9% | 0% |
| case-10 | ✗→✓ | ▲ Improved | -23% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 8% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 1% | 0% |
AI assistants love elegant abstractions. User asks for a button, the agent builds a component factory with theming support. The problem: abstractions have costs. They obscure intent, add indirection, and often solve problems that never materialize. This skill enforces YAGNI - You Aren't Gonna Need It.
Before adding abstraction, answer honestly:
markdown## Complexity Check **I want to add:** [describe the abstraction] **Because:** [your justification] **Is this solving a problem we have TODAY?** - [ ] Yes, we have 3+ concrete cases now - [ ] No, but we might need it later **If "might need later":** Don't build it. Stop.
Abstract when you have three concrete cases, not before:
| Situation | Action | |-----------|--------| | 1 case | Just write it | | 2 cases | Copy-paste is fine. Note the duplication. | | 3 cases | Now consider abstracting |
// With 1 button: just make the button
<button class="blue">Save</button>
// With 2 buttons: copy-paste is fine
<button class="blue">Save</button>
<button class="red">Delete</button>
// With 3+ buttons: NOW consider a component
<Button color="blue">Save</Button>
<Button color="red">Delete</Button>
<Button color="gray">Cancel</Button>Watch for these phrases in your thinking:
Watch for these patterns:
| Instead of | Try | |------------|-----| | Factory pattern | Direct instantiation | | Abstract base class | Concrete class | | Config-driven behavior | Hardcoded behavior | | Dependency injection | Direct imports | | Custom event system | Callbacks | | Generic utility | Inline code |
Abstraction is warranted when:
When resisting complexity:
markdown## Keeping It Simple **Considered:** [the abstraction] **Rejected because:** [only N cases / speculative / etc.] **Instead:** [simpler approach]
When complexity is warranted:
markdown## Abstraction Justified **Adding:** [the abstraction] **Because:** [3+ cases / causing bugs / stable pattern] **Cases:** [list the concrete cases]
User: "Add a way to send notification emails"
Over-engineered approach:
NotificationFactory
├── EmailNotification
├── SMSNotification (might need later!)
├── PushNotification (could be useful!)
└── NotificationConfig
├── templates
├── retryPolicy
└── queueSettingsYAGNI approach:
pythondef send_notification_email(user, subject, body): email_service.send( to=user.email, subject=subject, body=body )
Why simpler is better:
The 5-line function solves the actual problem. The factory solves imaginary ones.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-02 | pass→pass | 12,101 | 6,153 | -49% | 1 | 1 | 0% | 2,259 | 2,643 | +17% | 0 | 0 | — |
case-01 | fail→pass | 19,595 | 6,315 | -68% | 1 | 1 | 0% | 3,197 | 2,417 | -24% | 0 | 0 | — |
case-03 | pass→pass | 18,020 | 7,323 | -59% | 1 | 1 | 0% | 3,203 | 2,592 | -19% | 0 | 0 | — |
case-04 | pass→pass | 17,489 | 13,408 | -23% | 1 | 1 | 0% | 3,044 | 2,949 | -3% | 0 | 0 | — |
case-05 | pass→pass | 13,460 | 7,131 | -47% | 1 | 1 | 0% | 2,150 | 2,487 | +16% | 0 | 0 | — |
case-06 | pass→pass | 14,716 | 6,563 | -55% | 1 | 1 | 0% | 2,332 | 2,429 | +4% | 0 | 0 | — |
case-07 | pass→pass | 18,768 | 8,834 | -53% | 1 | 1 | 0% | 3,131 | 2,756 | -12% | 0 | 0 | — |
case-08 | pass→pass | 11,558 | 3,552 | -69% | 1 | 1 | 0% | 1,972 | 1,968 | -0% | 0 | 0 | — |
case-09 | fail→pass | 12,341 | 7,975 | -35% | 1 | 1 | 0% | 2,075 | 2,262 | +9% | 0 | 0 | — |
case-10 | fail→pass | 24,630 | 4,685 | -81% | 1 | 1 | 0% | 2,674 | 2,058 | -23% | 0 | 0 | — |
case-11 | pass→pass | 11,485 | 5,365 | -53% | 1 | 1 | 0% | 1,852 | 2,116 | +14% | 0 | 0 | — |
case-12 | pass→pass | 22,711 | 7,458 | -67% | 1 | 1 | 0% | 2,260 | 2,496 | +10% | 0 | 0 | — |
case-13 | pass→pass | 16,900 | 4,492 | -73% | 1 | 1 | 0% | 2,530 | 1,798 | -29% | 0 | 0 | — |
case-14 | pass→pass | 8,914 | 4,462 | -50% | 1 | 1 | 0% | 1,350 | 1,940 | +44% | 0 | 0 | — |
case-15 | fail→pass | 11,903 | 4,218 | -65% | 1 | 1 | 0% | 1,838 | 1,976 | +8% | 0 | 0 | — |
case-16 | fail→pass | 14,107 | 6,225 | -56% | 1 | 1 | 0% | 2,295 | 2,326 | +1% | 0 | 0 | — |
case-17 | pass→pass | 11,102 | 5,030 | -55% | 1 | 1 | 0% | 1,840 | 2,058 | +12% | 0 | 0 | — |
case-18 | pass→pass | 14,328 | 3,088 | -78% | 1 | 1 | 0% | 2,177 | 1,820 | -16% | 0 | 0 | — |
case-19 | pass→pass | 16,601 | 5,105 | -69% | 1 | 1 | 0% | 1,827 | 2,226 | +22% | 0 | 0 | — |
case-20 | pass→pass | 13,585 | 3,748 | -72% | 1 | 1 | 0% | 2,108 | 1,987 | -6% | 0 | 0 | — |
case-21 | pass→fail | 13,859 | 7,623 | -45% | 1 | 1 | 0% | 2,305 | 2,558 | +11% | 0 | 0 | — |
case-22 | pass→pass | 13,854 | 4,921 | -64% | 1 | 1 | 0% | 2,267 | 2,050 | -10% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +18 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.