This skill should be used when evaluating complexity, planning features, or when over-engineering, simpler, is this overkill, or keep it simple are mentioned.
Challenges over-engineering by identifying complexity smells and proposing simpler alternatives with concrete examples.
npx claudepluginhub outfitter-dev/outfitterThis skill inherits all available tools. When active, it can use any tool Claude has access to.
examples/custom-auth.mdexamples/redux-overkill.mdreferences/decision-framework.mdSystematic pushback against over-engineering → justified simplicity.
<when_to_use>
NOT for: trivial tasks, clear requirements with validated complexity, regulatory/compliance-mandated approaches
</when_to_use>
<stages>Load the maintain-tasks skill when applying framework to non-trivial proposals:
| Stage | Trigger | activeForm |
|---|---|---|
| Identify | Complexity smell detected | "Identifying complexity smell" |
| Alternative | Generating simpler options | "Proposing simpler alternatives" |
| Question | Probing constraints | "Questioning constraints" |
| Document | Recording decision | "Documenting decision" |
Task format:
- Identify { complexity type } smell
- Propose alternatives to { specific approach }
- Question { constraint/requirement }
- Document { decision/rationale }
Workflow:
in_progress when smell detectedcompleted, add next in_progressAdjust tone based on severity:
◇ Alternative (Minor complexity):
"Interesting approach. Help me understand why X over the more common Y?"
◆ Caution (Moderate risk):
"This pattern often leads to { specific problems }. Are we solving for something I'm not seeing?"
◈ Hazard (High risk):
</escalation> <triggers>"This violates { principle } and will likely cause { specific issues }. I strongly recommend { alternative }. If we must proceed, we need to document the reasoning."
Common complexity smells to watch for:
Build vs Buy: Custom solution when proven libraries exist
Indirect Solutions: Solving problem A by first solving problems B, C, D
Premature Abstraction: Layers "for flexibility" without concrete future requirements
Performance Theater: Optimizing without measurements or clear bottlenecks
Security Shortcuts: Disabling security features instead of configuring properly
CORS: * → Configure specific originsany types for external data → Runtime validation with ZodFramework Overkill: Heavy frameworks for simple tasks
Custom Infrastructure: Building platform features that cloud providers offer
<red_flags>
Watch for these justifications — reframe with specific questions:
"We might need it later" → "What specific requirement do we have now?"
"It's more flexible" → "What flexibility do we need that the simple approach doesn't provide?"
"It's best practice" → "Best practice for what context? Does that context match ours?"
"It's faster" → "Have you measured? What's the performance requirement?"
"Everyone does it this way" → "For problems of this scale? Do they have our constraints?"
"It's more enterprise-ready" → "What enterprise requirement are we meeting?"
"I read about it on Hacker News" → "Does their problem match ours?"
</red_flags>
<patterns>Guide toward simpler alternatives with concrete examples:
Feature Flags over Plugin Architecture
// Complex
interface Plugin {
transform(data: Data): Data;
}
const plugins = loadPlugins();
let result = data;
for (const plugin of plugins) {
result = plugin.transform(result);
}
// Simple
const features = getFeatureFlags();
let result = data;
if (features.transformA) {
result = transformA(result);
}
if (features.transformB) {
result = transformB(result);
}
Direct over Generic
// Complex (premature abstraction)
interface DataStore<T> {
get(id: string): Promise<T>;
}
class PostgresStore<T> implements DataStore<T> {
/* ... */
}
const users = new PostgresStore<User>({
/* config */
});
// Simple (direct, refactor later if needed)
async function getUser(id: string): Promise<User> {
return await db.query("SELECT * FROM users WHERE id = $1", [id]);
}
Standard Library over Framework
// Complex
import _ from "lodash";
const unique = _.uniq(array);
const mapped = _.map(array, fn);
// Simple
const unique = [...new Set(array)];
const mapped = array.map(fn);
Composition over Configuration
// Complex
const pipeline = new Pipeline({
steps: [
{ type: 'validate', rules: [...] },
{ type: 'transform', fn: 'normalize' },
{ type: 'save', destination: 'db' }
]
})
// Simple
const result = pipe(
data,
validate,
normalize,
save
)
</patterns>
<justified>
Complexity is appropriate when:
Even then:
Apply this protocol systematically:
Scan proposal for common triggers:
Always provide concrete, specific alternatives with examples:
❌ Vague: "Maybe use something simpler?" ✅ Specific: "Use Zod for validation instead of building a custom validation engine. Here's how..."
Include:
Ask probing questions to uncover hidden requirements:
If complexity chosen after validation:
ALWAYS:
NEVER:
Activates when the user asks about AI prompts, needs prompt templates, wants to search for prompts, or mentions prompts.chat. Use for discovering, retrieving, and improving prompts.
Search, retrieve, and install Agent Skills from the prompts.chat registry using MCP tools. Use when the user asks to find skills, browse skill catalogs, install a skill for Claude, or extend Claude's capabilities with reusable AI agent components.
This skill should be used when the user asks to "create an agent", "add an agent", "write a subagent", "agent frontmatter", "when to use description", "agent examples", "agent tools", "agent colors", "autonomous agent", or needs guidance on agent structure, system prompts, triggering conditions, or agent development best practices for Claude Code plugins.