skills/thinking-via-negativa/SKILL.md
About to add a feature/layer/process to fix a problem. First ask what to remove instead — subtraction is often more robust than addition. Use for simplification and complexity reduction.
npx skillsauth add tjboudreaux/cc-thinking-skills thinking-via-negativaInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Via Negativa, articulated by Nassim Taleb in "Antifragile," is the principle that improvement often comes from subtraction rather than addition. We're biased toward adding (features, processes, complexity) when removing (bugs, friction, unnecessary work) often provides more value with less risk.
Core Principle: Focus on what to remove, not what to add. Subtraction is more robust than addition.
Decision flow:
Trying to improve something?
→ First instinct is to add? → yes → PAUSE, CONSIDER SUBTRACTION
→ Can you achieve the goal by removing instead? → yes → REMOVE FIRST
→ Is current complexity necessary? → no → SIMPLIFY VIA NEGATIVA
When about to add a feature, layer, or process to fix a problem:
Don't delete to hit an aesthetic target without checking what each element does — confirm non-use with evidence, not assumption. If the addition is genuinely required for a real, demonstrated need, add it — via negativa fights the reflex to add, not all addition.
Instead of "What should we add?", ask:
- What's not working that we should remove?
- What's causing harm we should stop?
- What's unnecessary complexity we should eliminate?
- What's outdated that we should delete?
List elements that might be subtracted:
## Candidates for Removal
Code:
- Dead code (unreachable)
- Deprecated features (still running)
- Unused dependencies
- Redundant abstractions
Process:
- Meetings that don't produce decisions
- Approval steps that don't add value
- Reports no one reads
- Alerts no one acts on
Features:
- Low-usage functionality
- Legacy features maintained "just in case"
- Edge cases that complicate the core
For each candidate:
| Element | Usage | Maintenance Cost | Risk of Removal | Value of Removal |
|---------|-------|------------------|-----------------|------------------|
| Feature X | 0.1% of users | 20 hrs/month | Low | High |
| Meeting Y | 8 people | 4 hrs/week | None | High |
| Process Z | 5 approvers | 2 days/request | Medium | Medium |
Subtract and verify no harm:
Week 1: Remove Feature X for 10% of users
Week 2: Monitor complaints, metrics
Week 3: If no issues, remove for 50%
Week 4: Full removal and code deletion
Add by removing:
Goal: Make the product easier to use
Additive approach: Add tutorial, tooltips, help section
Via Negativa: Remove confusing features, simplify flow, delete options
Often more effective:
- Fewer choices = easier decisions
- Less surface area = less to learn
- Simpler UI = faster adoption
Healthy growth requires pruning:
Codebase:
- Every feature has maintenance cost
- Old features create complexity tax
- Pruning unused code enables healthier growth
Team:
- Every process has coordination cost
- Old processes accumulate like barnacles
- Pruning enables focus on what matters
Removing bad is often more impactful than adding good:
Performance:
- Removing one slow query helps more than adding one cache
- Eliminating N+1 beats adding read replicas
- Deleting unused indexes beats adding new ones
Health (Taleb's domain):
- Removing sugar helps more than adding supplements
- Stopping smoking beats starting exercise
- Eliminating stress beats adding meditation
Remove the 80% that provides 20% of value:
## Feature Usage Analysis
| Feature | Users | Revenue | Maintenance |
|---------|-------|---------|-------------|
| Core A | 90% | 70% | 20% |
| Core B | 85% | 25% | 15% |
| Edge C | 5% | 3% | 25% |
| Edge D | 2% | 2% | 40% |
Via Negativa: Remove Edge C and D
Result: 65% less maintenance for 5% of value
Enables focus on Core A and B
## Via Negativa Code Review
Before adding new code, ask:
1. Can we solve this by removing existing code?
2. Is there dead code to delete?
3. Are there unused imports/dependencies?
4. Is there duplication to consolidate?
5. Are there unnecessary abstractions?
Rule: Every PR should delete at least as much as it adds
(aspirational, not mandatory)
## Via Negativa Process Audit
List all recurring processes:
- Daily standup (15 min/day × 8 people = 10 hrs/week)
- Sprint planning (2 hrs × 8 people = 16 hrs/sprint)
- Weekly status report (2 hrs to write)
- Monthly review (4 hrs × 5 people = 20 hrs/month)
For each, ask:
- What happens if we stop?
- Can we reduce frequency?
- Can we reduce attendees?
- Can we reduce duration?
Often: Half the meetings, half the reports = more productive
## Via Negativa Product Strategy
Instead of roadmap of additions, create:
## Sunset List
| Feature | Usage | Decision | Timeline |
|---------|-------|----------|----------|
| Export to CSV | 0.5% | Remove | Q2 |
| Legacy API v1 | 2% | Deprecate | Q3 |
| Advanced filters | 3% | Simplify | Q2 |
## Maintenance Liberation
Removing 3 features frees 2 engineers for core work
## Simplicity Gains
- Fewer code paths to test
- Smaller attack surface
- Easier onboarding
- Faster development
## Via Negativa for Focus
Don't add:
- More productivity apps
- More systems
- More commitments
Instead remove:
- Notifications
- Unnecessary meetings
- Low-value tasks
- Context switching
- Decision fatigue (reduce choices)
"Stop doing" list > "To do" list
## Via Negativa Architecture Review
Before adding complexity, audit existing:
Services to consolidate:
- Microservice A and B do similar things → Merge
- Service C has one caller → Inline
Dependencies to remove:
- Library X is used for one function → Write function
- Framework Y is overkill → Use lighter alternative
Layers to eliminate:
- Abstraction that has one implementation → Remove
- API that wraps another API identically → Direct call
# Via Negativa Analysis: [System/Process/Product]
## Current State
[Description of what exists]
## Candidates for Removal
### Category 1: Unused/Dead
| Element | Evidence of Non-Use | Removal Risk |
|---------|---------------------|--------------|
| | | |
### Category 2: Low-Value High-Cost
| Element | Value Provided | Maintenance Cost | Ratio |
|---------|---------------|------------------|-------|
| | | | |
### Category 3: Redundant
| Element | Duplicated By | Removal Path |
|---------|---------------|--------------|
| | | |
## Removal Priority
1. [Element] - [Why first]
2. [Element] - [Why second]
## Removal Plan
| Element | Week | Monitor | Rollback |
|---------|------|---------|----------|
| | | | |
## Expected Benefits
- Reduced complexity: [Measure]
- Freed resources: [Measure]
- Improved focus: [Measure]
Via Negativa aligns with Lindy:
"The first principle of iatrogenics: we do not need evidence of harm to claim that a treatment is harmful; we need evidence of benefit to claim it is not harmful."
Applied to software: We don't need evidence that a feature is actively harmful to remove it; we need evidence it provides benefit to keep it.
"Via Negativa is more powerful than Via Positiva: omission does less harm than commission."
Removing is safer than adding. Every addition has unknown side effects. Removal of recent additions reverts to a known-good state. When in doubt, subtract.
"The best way to live is to maximize the number of decisions not made."
Reduce decisions through simplification. Fewer features = fewer decisions to make. Fewer processes = fewer coordination points. Simpler is more robust.
development
Use when stuck between two architecture or API requirements that seem mutually exclusive — name the contradiction precisely, then separate the conflicting states in time, space, or condition.
testing
You need to trace how a system would fail or behave at a scale you can't cheaply test or measure. Use to imagine the scenario and walk the consequence chain step by step.
devops
Use when optimizing latency or throughput in a pipeline and one stage dominates—focus all effort on that single bottleneck, since speeding up the others changes nothing until it's fixed.
development
Use when debugging across services/an incident where a fix in one place breaks another, or behavior is emergent and no single component explains it. Maps the system and traces causes.