
state-persistence
Use when saving workflow state to Serena MCP memory at research, planning, execution, or completion
State Persistence
Use this skill to save workflow state to Serena MCP memory at any stage and resume later.
Memory File Format
Naming: YYYY-MM-DD-<feature-name>-<stage>.md
Stages:
research- After research completes (automatic)planning- During plan writing (manual)execution- During/pausing execution (manual)complete- After workflow completion (automatic)
Frontmatter Structure
All memory files include:
---
date: 2025-11-20T15:30:00-08:00
git_commit: abc123def456
branch: feature/user-authentication
repository: crispy-claude
topic: "User Authentication Checkpoint"
tags: [checkpoint, authentication, jwt]
status: in-progress # or: complete, blocked
last_updated: 2025-11-20
type: execution # research, planning, execution, complete
---
Automatic Saves
After Research (automatic)
Triggered by: research-orchestration skill completion
Filename: YYYY-MM-DD-<feature>-research.md
Content:
---
date: ${iso-timestamp}
git_commit: ${commit-hash}
branch: ${branch-name}
repository: crispy-claude
topic: "${Feature} Research"
tags: [checkpoint, research, ${feature-tags}]
status: complete
last_updated: ${date}
type: research
---
# Research: ${feature-name}
## Brainstorm Summary
${key-decisions-from-brainstorm}
## Codebase Findings (serena-explorer)
${serena-findings}
## Library Documentation (context7-researcher)
${context7-findings}
## Web Research (web-researcher)
${web-findings}
## GitHub Research (github-researcher)
${github-findings}
## Synthesis
${recommended-approach-and-decisions}
## Next Steps
Ready to write plan with research context.
After Completion (automatic)
Triggered by: Workflow completion before PR creation
Filename: YYYY-MM-DD-<feature>-complete.md
Content:
---
date: ${iso-timestamp}
git_commit: ${commit-hash}
branch: ${branch-name}
repository: crispy-claude
topic: "${Feature} Implementation Complete"
tags: [checkpoint, complete, ${feature-tags}]
status: complete
last_updated: ${date}
type: complete
---
# Implementation Complete: ${feature-name}
## What Was Built
${summary-of-implementation}
## Key Learnings
### Patterns Discovered
- ${pattern-1}: ${what-worked-well}
- ${pattern-2}: ${what-worked-well}
### Gotchas Encountered
- ${gotcha-1}: ${what-to-watch-for}
- ${gotcha-2}: ${what-to-watch-for}
### Trade-offs Made
- ${trade-off-1}: ${decision-and-reasoning}
- ${trade-off-2}: ${decision-and-reasoning}
## Codebase Updates
### Files Modified
- \`${file-1}:${lines}\`: ${major-change-description}
- \`${file-2}:${lines}\`: ${major-change-description}
### New Patterns Introduced
- ${pattern-1}: ${where-used}
- ${pattern-2}: ${where-used}
### Integration Points
- ${integration-1}: ${how-system-connects}
- ${integration-2}: ${how-system-connects}
## For Next Time
### What Worked
- ${approach-to-reuse}
### What Didn't
- ${avoid-in-future}
### Suggestions
- ${improvements-for-similar-tasks}
## PR Created
Link to PR: ${pr-url}
Manual Saves
During Planning (manual /cc:save)
Filename: YYYY-MM-DD-<feature>-planning.md
Content:
---
date: ${iso-timestamp}
git_commit: ${commit-hash}
branch: ${branch-name}
repository: crispy-claude
topic: "${Feature} Planning"
tags: [checkpoint, planning, ${feature-tags}]
status: ${in-progress|blocked}
last_updated: ${date}
type: planning
---
# Planning: ${feature-name}
## Design Decisions
### Approach Chosen
${approach-with-rationale}
### Alternatives Considered
- ${alternative-1}: ${trade-offs}
- ${alternative-2}: ${trade-offs}
## Plan Draft
${current-plan-state-or-link-to-file}
## Open Questions
- ${question-1}
- ${question-2}
## Next Steps
${parse-plan-or-continue-planning}
During Execution (manual /cc:save)
Filename: YYYY-MM-DD-<feature>-execution.md
Content:
---
date: ${iso-timestamp}
git_commit: ${commit-hash}
branch: ${branch-name}
repository: crispy-claude
topic: "${Feature} Execution Checkpoint"
tags: [checkpoint, execution, ${feature-tags}]
status: ${in-progress|blocked}
last_updated: ${date}
type: execution
---
# Execution: ${feature-name}
## Plan Reference
- Plan file: \`docs/plans/${date}-${feature}.md\`
- Tasks directory: \`docs/plans/tasks/${date}-${feature}/\`
- Manifest: \`docs/plans/tasks/${date}-${feature}/manifest.json\`
## Progress Summary
- Total tasks: ${total}
- Completed: ${completed}
- In progress: ${in-progress}
- Remaining: ${remaining}
## Completed Tasks
- [✓] ${task-1}: ${summary-of-changes}
- [✓] ${task-2}: ${summary-of-changes}
## Current Task
- [ ] ${task-n}: ${current-state}
${if-blocked:}
**Blocker:** ${description-of-blocker}
## Blockers/Issues
${if-any-issues}
- ${issue-1}
- ${issue-2}
## Next Steps
Continue execution from task ${n}
Stage Detection Algorithm
When /cc:save runs, detect stage automatically:
Detection Rules
Research stage if:
- ✅ Brainstorm completed (conversation history has brainstorm skill invocation)
- ✅ Research subagents reported back (research-orchestration completed)
- ❌ No plan file in
docs/plans/YYYY-MM-DD-*.md
Planning stage if:
- ✅ Plan file exists:
docs/plans/YYYY-MM-DD-*.md - ❌ No manifest.json in tasks directory
- ❌ No active TodoWrite tasks
Execution stage if:
- ✅ Plan exists AND (manifest.json exists OR TodoWrite has tasks)
- ✅ Uncommitted changes exist (
git status --shorthas output) - ❌ Not all tasks complete
Complete stage if:
- ✅ All tasks complete in TodoWrite (all status: completed)
- ✅ Execution finished
Feature Name Extraction
// Try plan filename first
const planFiles = glob('docs/plans/YYYY-MM-DD-*.md')
if (planFiles.length > 0) {
// Extract from: docs/plans/2025-11-20-user-auth.md → user-auth
featureName = planFiles[0].match(/\d{4}-\d{2}-\d{2}-(.+)\.md$/)[1]
}
// Fall back to brainstorm topic
if (!featureName) {
// Extract from conversation history
featureName = extractFromBrainstormTopic()
}
// Ask user if ambiguous
if (!featureName) {
featureName = await askUser("Feature name for save file?")
}
Metadata Collection
# Git commit hash
git rev-parse HEAD
# Current branch
git branch --show-current
# ISO timestamp
date -Iseconds
# Git status for changes
git status --short
Ambiguity Handling
If detection unclear, ask user:
Save checkpoint as:
A) Research (brainstorm + research complete, no plan yet)
B) Planning (plan in progress)
C) Execution (currently implementing tasks)
D) Complete (all tasks finished)
Current stage? (A/B/C/D)
Saving Process
- Detect stage using algorithm above
- Collect metadata via git commands
- Generate content based on stage type
- Write to Serena memory using
write_memorytool:
await mcp__serena__write_memory({
memory_file_name: `${date}-${feature}-${stage}.md`,
content: `---\n${frontmatter}\n---\n\n${content}`
})
- Confirm to user:
Checkpoint saved: ${filename}
Stage: ${stage}
Status: ${status}
Branch: ${branch}
Resume later with: /cc:resume ${filename}
Example Saves
Research Save (automatic)
# After research completes
Saved: 2025-11-20-user-auth-research.md
Contains:
- Brainstorm summary
- Codebase findings from Serena
- React auth patterns from Context7
- Best practices from web research
Next: Ready to write plan
Planning Save (manual)
User: /cc:save
# Detection
✓ Plan file exists: docs/plans/2025-11-20-user-auth.md
✗ No manifest.json
✗ No active tasks
→ Stage: planning
Saved: 2025-11-20-user-auth-planning.md
Contains:
- Design decisions made so far
- Alternatives considered
- Current plan draft
- Open questions
Resume with: /cc:resume 2025-11-20-user-auth-planning.md
Execution Save (manual)
User: /cc:save
# Detection
✓ Plan exists
✓ Manifest exists
✓ TodoWrite: 3/5 tasks complete
✓ Uncommitted changes
→ Stage: execution
Saved: 2025-11-20-user-auth-execution.md
Contains:
- Progress: 3/5 tasks complete
- Completed: Task 1, 2, 3
- In progress: Task 4
- Remaining: Task 5
Resume with: /cc:resume 2025-11-20-user-auth-execution.md
Complete Save (automatic)
# After all tasks complete, before PR
Saved: 2025-11-20-user-auth-complete.md
Contains:
- What was built
- Key learnings and gotchas
- Files modified with descriptions
- Patterns introduced
- Recommendations for next time
Next: Create PR
Error Handling
If write_memory fails:
- Log error details
- Offer to retry
- Suggest manual save (copy content to file)
If metadata collection fails:
- Use defaults (unknown for git info)
- Warn user about missing metadata
- Proceed with save anyway
If stage detection ambiguous:
- Present options to user
- Let user choose stage explicitly
- Add note in metadata about manual selection