From fieldguides
This skill should be used when evaluating complexity, planning features, or when over-engineering, simpler, is this overkill, or keep it simple are mentioned.
npx claudepluginhub outfitter-dev/outfitter --plugin fieldguidesThis skill uses the workspace's default tool permissions.
Systematic pushback against over-engineering → justified simplicity.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Searches prompts.chat for AI prompt templates by keyword or category, retrieves by ID with variable handling, and improves prompts via AI. Use for discovering or enhancing prompts.
Guides MCP server integration in Claude Code plugins via .mcp.json or plugin.json configs for stdio, SSE, HTTP types, enabling external services as tools.
Systematic 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>
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):
"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>
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
)
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: