Abandon
Permanently abandon an increment when requirements change or work becomes obsolete.
Synopsis
Description
The abandon command permanently cancels work on an increment by moving it to the _archive/ folder. This preserves all work for reference while freeing up your WIP limit.
Use abandon when:
- Requirements changed (feature no longer needed)
- Approach was wrong (discovered better solution)
- Superseded (replaced by different increment)
- Experiment failed (spike didn't pan out)
Abandon is permanent and moves the increment to _archive/. Unlike pause, abandoned increments require manual restoration.
Options
<increment-id> (required)
The increment to abandon (e.g., 0008-old-feature).
specweave abandon 0008-old-feature
--reason <text> or -r <text>
Reason for abandoning (highly recommended).
specweave abandon 0008 --reason "Requirements changed - feature no longer needed"
While optional, always provide a reason. It documents why work was stopped for future reference and retrospectives.
--force or -f
Skip confirmation prompt.
specweave abandon 0008 --reason "Obsolete" --force
Examples
Example 1: Abandon with Reason
# Requirements changed, feature no longer needed (or say "abandon this")
specweave abandon 0008-social-features \
--reason "Requirements changed - pivoting to enterprise focus"
# Output:
This will move increment 0008-social-features to _archive/
Reason: Requirements changed - pivoting to enterprise focus
Continue? [y/N]: y
Increment 0008-social-features abandoned
Moved to: .specweave/increments/_archive/0008-social-features/
Reason: Requirements changed - pivoting to enterprise focus
All work preserved for reference
To un-abandon: Manually move back to increments/ folder
What happened:
- Increment moved to
_archive/folder - Metadata updated (status: abandoned, timestamp)
- WIP limit freed (can start other work)
- All files preserved for reference
Example 2: Abandon Without Reason (Interactive)
specweave abandon 0009-experiment
# Output:
Why are you abandoning this increment?
1. Requirements changed
2. Approach was wrong
3. Superseded by different work
4. Experiment failed
5. Other (type reason)
> 4
This will move increment 0009-experiment to _archive/
Reason: Experiment failed
Continue? [y/N]: y
Increment 0009-experiment abandoned
Moved to: .specweave/increments/_archive/0009-experiment/
Example 3: Force Abandon (Skip Confirmation)
# Skip confirmation with --force
specweave abandon 0010 --reason "Obsolete" --force
# Output:
Increment 0010 abandoned (forced)
Moved to: .specweave/increments/_archive/0010/
Reason: Obsolete
Example 4: Abandon During Pivot
# Business pivot scenario (or say "what's the status?" first)
specweave status
Active (2):
0008-consumer-features
0009-social-integration
# Abandon both consumer-focused features (or say "abandon this" for each)
specweave abandon 0008 --reason "Pivot to enterprise - consumer features postponed"
specweave abandon 0009 --reason "Pivot to enterprise - social features postponed"
# Start new enterprise features (or say "let's build enterprise SSO")
specweave inc "0010-enterprise-sso"
Behavior
Status Transitions
Valid transitions:
active->abandonedpaused->abandoned
Invalid transitions:
completed->abandoned(completed work cannot be abandoned)abandoned->abandoned(already abandoned, no-op)
Metadata Changes
// Before abandon
{
"id": "0008-social-features",
"status": "active",
"type": "feature",
"created": "2025-11-01T10:00:00Z",
"lastActivity": "2025-11-04T09:00:00Z"
}
// After abandon
{
"id": "0008-social-features",
"status": "abandoned",
"type": "feature",
"created": "2025-11-01T10:00:00Z",
"lastActivity": "2025-11-04T10:00:00Z",
"abandonedReason": "Pivot to enterprise",
"abandonedAt": "2025-11-04T10:00:00Z"
}
Folder Structure
# Before abandon
.specweave/increments/
|- 0007-feature-x/
|- 0008-social-features/ # <- Active
\- 0009-feature-z/
# After abandon
.specweave/increments/
|- 0007-feature-x/
|- 0009-feature-z/
\- _archive/
\- 0008-social-features/ # <- Moved here
|- spec.md
|- plan.md
|- tasks.md
\- metadata.json (status: abandoned)
WIP Limit Impact
# Before abandon
$ specweave status
Active (2): 0008-social-features, 0009-feature-z
WIP Limit: 2/1 (EXCEEDS LIMIT!)
# Abandon one increment (or say "abandon this")
$ specweave abandon 0008 --reason "No longer needed"
# After abandon
$ specweave status
Active (1): 0009-feature-z
WIP Limit: 1/1
WIP limit freed - can start new work
Error Handling
Cannot Abandon Completed
$ specweave abandon 0001
Cannot abandon increment 0001
Status: completed
Completed increments cannot be abandoned
Solution: Increment is done. No need to abandon.
Already Abandoned
$ specweave abandon 0008
Increment 0008 is already abandoned
Location: .specweave/increments/_archive/0008-old-feature/
Reason: Requirements changed
Abandoned: 5 days ago
No action needed.
Solution: Already in _archive/ folder.
Increment Not Found
$ specweave abandon 9999
Increment not found: 9999
Check available increments: specweave status (or say "what's the status?")
Solution: Check increment ID with status command.
Cancelled Abandonment
$ specweave abandon 0008 --reason "Not needed"
This will move increment 0008 to _archive/
Reason: Not needed
Continue? [y/N]: n
Abandonment cancelled
Increment 0008 remains active
Best Practices
1. Always Document Why
# Bad - no reason
specweave abandon 0008
# Good - clear reason
specweave abandon 0008 --reason "Requirements changed - feature no longer aligns with product strategy"
Why:
- Future you won't remember the context
- Team needs to understand why work stopped
- Retrospectives benefit from clear documentation
- Patterns emerge (are we over-committing?)
2. Document Learnings Before Abandoning
# 1. Add retrospective notes to spec.md
vim .specweave/increments/0008-feature/spec.md
# Add section: "## Why Abandoned" with learnings
# 2. Then abandon
specweave abandon 0008 --reason "Experiment failed - complexity too high"
Good Retrospective Notes:
- What went wrong?
- What would we do differently?
- What did we learn?
- Any salvageable parts?
3. Extract Reusable Parts First
# Before abandoning, extract useful work
cp .specweave/increments/0008-feature/reports/analysis.md \
.specweave/increments/_backlog/ideas/
# Then abandon
specweave abandon 0008 --reason "Approach wrong, but analysis useful"
4. Pause vs Abandon Decision Tree
Is this increment...
|- Temporarily blocked? -> Use 'pause' (or say "pause this")
|- Permanently obsolete? -> Use 'abandon' (or say "abandon this")
\- Uncertain? -> Pause first, abandon later if still not relevant
Common Scenarios
Scenario 1: Requirements Changed
# Product pivot - consumer to enterprise
specweave abandon 0008-consumer-onboarding \
--reason "Pivot to enterprise - consumer features postponed indefinitely"
specweave abandon 0009-social-features \
--reason "Pivot to enterprise - social integration not in roadmap"
# Start enterprise work (or say "let's build enterprise SSO")
specweave inc "0010-enterprise-sso"
Scenario 2: Experiment Failed
# Tried new tech stack, didn't work out
specweave abandon 0007-graphql-migration \
--reason "Experiment failed - complexity too high, sticking with REST"
# Document learnings
vim .specweave/increments/_archive/0007-graphql-migration/spec.md
# Add: "## Learnings: GraphQL adds 3x complexity, REST is sufficient"
Scenario 3: Superseded by Better Approach
# Discovered better solution mid-way
specweave abandon 0006-custom-auth \
--reason "Superseded by 0011-auth0-integration (simpler, more secure)"
specweave inc "0011-auth0-integration"
Scenario 4: Clean Up Old Work
# Review paused increments (or say "what's the status?")
specweave status --paused
Paused (3):
0005-kubernetes (paused 45 days)
0007-refactor (paused 30 days)
0008-experiment (paused 60 days)
# Abandon stale work (or say "abandon this" for each)
specweave abandon 0005 --reason "Postponed indefinitely, cloud provider changed"
specweave abandon 0008 --reason "Too old, requirements likely changed"
# Resume relevant work (or say "resume work")
specweave resume 0007
Auto-Abandonment (Experiments)
Experiments (type: experiment) auto-abandon after 14 days of inactivity:
# Create experiment
specweave inc "0010-try-graphql" --type=experiment
# ... 15 days pass with no activity ...
# Automatic abandonment
$ specweave status
Auto-Abandoned (1):
0010-try-graphql [experiment]
Abandoned: automatically (14+ days inactive)
Reason: Auto-abandoned due to inactivity
Last activity: 15 days ago
Experiments auto-abandon after 14 days to prevent accumulation
To prevent: Update lastActivity via 'specweave do' or manual touch
Configuration (.specweave/config.json):
{
"limits": {
"experimentAutoAbandonDays": 14 // Configurable
}
}
Un-Abandoning (Restoration)
To restore an abandoned increment:
# 1. Manually move back to increments/
mv .specweave/increments/_archive/0008-feature \
.specweave/increments/0008-feature
# 2. Resume via command (or say "resume work")
specweave resume 0008
# Output:
Increment 0008-feature resumed
Note: Was abandoned 10 days ago
Reason: Requirements changed
Review spec.md to ensure still relevant
Always review the spec before resuming abandoned work. Requirements may have evolved further.
Integration with Other Commands
abandon -> status
$ specweave abandon 0008 --reason "Obsolete"
$ specweave status
Abandoned (1):
0008-old-feature (Obsolete) # <- Shown in abandoned section
pause -> abandon
$ specweave pause 0007 --reason "Waiting for decision"
# ... decision is "don't do this" ...
$ specweave abandon 0007 --reason "Decision: feature not needed"
abandon -> retrospective
$ specweave abandon 0008 --reason "Experiment failed"
# Later: Review for learnings
$ specweave status --abandoned
Abandoned (3):
0008-graphql (Experiment failed)
0009-custom-auth (Superseded)
0010-old-ui (Requirements changed)
# Pattern: High experiment failure rate -> improve spike process
Statistics
View abandonment statistics:
specweave status
Completed (4):
0001-core-framework
0002-core-enhancements
0003-model-selection
0004-plugin-architecture
Abandoned (3):
0008-old-approach (Requirements changed)
0009-failed-experiment (Experiment failed)
0010-superseded (Replaced by 0011)
Summary:
- Success rate: 57% (4/7 completed)
- Abandonment rate: 43% (3/7 abandoned)
- Common reasons: Requirements changed (2), Experiment failed (1)
Learning from Abandoned Work
Abandoned increments are valuable for learning:
Retrospective Analysis
# Review abandoned folder quarterly
ls .specweave/increments/_archive/
# Common patterns?
# - Requirements changing too often? -> Improve planning
# - High experiment failure? -> Better spike process
# - Many superseded? -> Too much parallel work
Extract Best Practices
## Learnings from Abandoned Work (2025 Q1)
### 0008-custom-auth (Abandoned: Complexity too high)
- **Learning**: Authentication is complex, use proven solutions
- **Action**: Add Auth0/Okta to default stack
### 0009-graphql-migration (Abandoned: Experiment failed)
- **Learning**: GraphQL adds 3x complexity for our use case
- **Action**: Document REST patterns, stick with what works
### 0010-big-refactor (Abandoned: Scope too large)
- **Learning**: Large refactors fail, break into small increments
- **Action**: Max 2 weeks per increment, split larger work
See Also
pause- Temporarily pause work (reversible)resume- Resume paused/abandoned workstatus- View all increment statuses- Status Management Guide - Complete workflow guide
Summary
Key Points:
- Use
abandonfor permanent cancellation - Always provide clear reason
- Work moved to
_archive/(preserved) - Frees WIP limit
- Cannot abandon completed increments
- Experiments auto-abandon after 14 days
Command:
specweave abandon <increment-id> --reason "<clear explanation>"
Philosophy:
Abandoning isn't failure--it's learning. Document why, extract learnings, move forward.