Session Continuity
Persistent task workflow that survives session restarts.
CRITICAL: STATE MACHINE GOVERNANCE
EVERY SINGLE MESSAGE MUST START WITH YOUR CURRENT STATE
Format:
CHECK_STATUS
WORKING
VERIFY
COMPLETE
AWAITING_COMMIT
MARK_COMPLETE
BLOCKED
NOT JUST THE FIRST MESSAGE. EVERY. SINGLE. MESSAGE.
When you read a file → prefix with state When you run tests → prefix with state When you explain results → prefix with state When you ask a question → prefix with state
Example:
CHECK_STATUS
Reading session.md...
CHECK_STATUS
Status shows "in progress". Routing to WORKING.
TRANSITION: CHECK_STATUS → WORKING
WORKING
Reading requirements.md for task specs...
WORKING
Implementing getUser function with deps...
State Machine
user: "continue"
↓
┌────────────────┐
┌───│ CHECK_STATUS │←──────────┬──────────┐
│ │ Read session.md│ │ │
│ └────────┬───────┘ │ │
│ │ │ │
Status= │ │ Status= │ │
"Complete" │ │ "in progress" │ │
│ │ │ │
↓ ↓ │ │
┌───────────┐ ┌──────────────┐ │ │
│ AWAITING_ │ │ WORKING │←────┐ │ │
│ COMMIT │ │ │ │ │ │
│ │ │ Read: │ │ │ │
│ Ask │ │ requirements │ │ │ │
│ permission│ │ tasks.md │ │ │ │
│ STOP │ └──────┬───────┘ │ │ │
└─────┬─────┘ │ │ │ │
│ │ task done │ │ │
user: yes │ │ │ │ │
│ ↓ │ │ │
│ ┌──────────────┐ │ │ │
│ │ VERIFY │ │ │ │
│ │ │ │ │ │
│ │ Run steps │─────┘ │ │
│ │ from │ fail │ │
│ │ requirements │ │ │
│ └──────┬───────┘ │ │
│ │ │ │
│ │ pass │ │
│ │ │ │
│ ↓ │ │
│ ┌──────────────┐ │ │
│ │ COMPLETE │ │ │
│ │ │ │ │
│ │ Update: │ │ │
│ │ session.md │─────────┘ │
│ │ Status= │ │
│ │ "Complete" │ │
│ └──────────────┘ │
│ │
↓ │
┌──────────────────┐ │
│ MARK_COMPLETE │ │
│ │ │
│ Update: tasks [x]│ │
│ Update: session │──────────────────────────────┘
│ (next task) │
└──────────────────┘
Files
All files live in the project's .claude/ directory:
| File | Purpose |
|------|---------|
| .claude/tasks.md | Checklist of tasks |
| .claude/requirements.md | Implementation specs, verification steps |
| .claude/session.md | Current state for resume |
State: CHECK_STATUS
Prefix: CHECK_STATUS
Purpose: Read session.md and route based on Status field.
Actions
- Run
pwdto verify project directory - Read
.claude/session.md - Look at Status field
- Route:
- Status="Complete" or "ready to commit" → AWAITING_COMMIT
- Status="in progress" or missing → WORKING
- Status="blocked" → BLOCKED
Critical Rules
- ONLY read session.md and route
- DO NOT read other files, launch agents, or do anything else
- IF ERROR: STOP and tell user what failed
Transitions
- CHECK_STATUS → AWAITING_COMMIT (Status="complete")
- CHECK_STATUS → WORKING (Status="in progress")
- CHECK_STATUS → BLOCKED (Status="blocked")
State: AWAITING_COMMIT
Prefix: AWAITING_COMMIT
Purpose: Task is complete. Ask permission to mark done.
Actions
- Say: "Task X is complete. May I mark it as complete in tasks.md?"
- STOP - wait for user response
- If user says yes → MARK_COMPLETE
- If user says no → STOP, await instruction
Critical Rules
- ONLY ask permission and STOP
- DO NOT read files, launch agents, work on next task
- DO NOT do anything except ask and wait
Transitions
- AWAITING_COMMIT → MARK_COMPLETE (user says yes)
- AWAITING_COMMIT → STOP (user says no)
State: MARK_COMPLETE
Prefix: MARK_COMPLETE
Purpose: Update task files after user approval.
Actions
- Update tasks.md: Change
[ ]to[x]for current task - Update session.md: Set to next task with Status="in progress"
- Go to CHECK_STATUS
Critical Rules
- ONLY update files and route
- DO NOT read other files or research next task
- IF CANNOT EDIT: Say "Cannot edit files: [reason]" and STOP
Transitions
- MARK_COMPLETE → CHECK_STATUS
State: WORKING
Prefix: WORKING
Purpose: Implement the current task.
Actions
- Read requirements.md for task specs
- Read tasks.md for task list
- Work on current task using patterns:
- fn(args, deps)
- Result types
- Zod at boundaries
- Update session.md after TDD cycles
- When task done → VERIFY
Session.md Updates
Update at these triggers:
| Trigger | Update | |---------|--------| | Start task | Status="in progress" | | TDD cycle | Brief note in Notes | | Hit blocker | Status="blocked", describe | | Task done | → transition to VERIFY |
Critical Rules
- EVERY message must have state prefix
- DO NOT skip to next task
- DO NOT work on multiple tasks
- IF BLOCKED: Document in session.md, STOP
Transitions
- WORKING → VERIFY (task implementation done)
- WORKING → BLOCKED (hit blocker)
State: VERIFY
Prefix: VERIFY
Purpose: Run verification before claiming complete.
Actions
- Read Verification section from requirements.md
- Run ALL verification commands:
npm test npm run lint npm run build - Show ALL output verbatim
- If all pass → COMPLETE
- If any fail → WORKING (treat as blocker)
Critical Rules
- EVERY message must have state prefix
- NEVER skip verification
- NEVER claim complete without running checks
- IF ERROR: STOP and tell user
Transitions
- VERIFY → COMPLETE (all pass)
- VERIFY → WORKING (any fail)
State: COMPLETE
Prefix: COMPLETE
Purpose: Update session.md to reflect completion.
Actions
- Update session.md: Set Status="Complete"
- Go to CHECK_STATUS
Critical Rules
- ONLY update session.md and route
- DO NOT ask permission (that's AWAITING_COMMIT)
- IF ERROR: STOP and tell user
Transitions
- COMPLETE → CHECK_STATUS
State: BLOCKED
Prefix: BLOCKED
Purpose: Cannot proceed, need user guidance.
Actions
- Explain blocking issue clearly
- Show what you tried
- STOP and wait for user guidance
Critical Rules
- NEVER improvise workarounds
- ALWAYS stop and wait for user
Transitions
- BLOCKED → [any state] (based on user guidance)
Setup: "Plan" or "Setup Tasks"
When user says "create a plan" or "setup tasks":
- Ask for task list
- Ask for verification commands
- Ask for constraints/patterns
- Create files:
.claude/tasks.md
- [ ] Task 1: [exact user wording]
- [ ] Task 2: [exact user wording]
.claude/requirements.md
## Verification
Before marking complete:
- `npm test` - all pass
- `npm run lint` - no errors
- `npm run build` - succeeds
## Task 1: [name]
- [specs from conversation]
- [constraints]
.claude/session.md
**Current:** Task 1
**Status:** in progress
## Done
(none yet)
## Notes
- [context for resume]
Anti-Patterns
WRONG: Investigating Codebase to Figure Out Progress
User: "continue"
Claude: *Reads tasks.md*
Claude: "Let me investigate the codebase to understand what's done"
Claude: *Searches 10+ files, runs git log*
Claude: *Wastes tokens figuring out state*
Problem: All that info is in session.md already.
RIGHT: Reading session.md First
User: "continue"
Claude: "CHECK_STATUS"
Claude: *Reads session.md*
Claude: "Status shows 'in progress'. Routing to WORKING."
Claude: "WORKING"
Claude: "Continuing Task 2..."
WRONG: Skipping Verification
Claude: *Completes implementation*
Claude: "Task 1 is complete!"
*User commits and pushes*
*CI fails - tests broken*
Problem: Skipped verification, introduced bugs.
RIGHT: Running Verification
Claude: "VERIFY"
Claude: *Runs npm test* → All pass
Claude: *Runs npm lint* → All pass
Claude: *Runs npm build* → Success
Claude: "COMPLETE"
Claude: "Task 1 complete, all verification passed."
WRONG: Creating Git Commits
Claude: *Completes task*
Claude: *Runs git add . && git commit*
Problem: User loses control over commits.
RIGHT: Handing Off to User
Claude: "Task complete, ready for you to commit."
Claude: "May I mark this task as complete?"
WRONG: Auto-Advancing Tasks
Claude: "Task 1 done. Starting Task 2..."
Claude: *Explores codebase for Task 2*
Problem: User didn't approve advancing.
RIGHT: Stopping After Complete
Claude: "Task 1 complete. May I mark it done?"
*Waits for user*
Never Use TodoWrite
This skill REPLACES Claude Code's built-in todos:
WRONG: TodoWrite tool
RIGHT: .claude/tasks.md file
WRONG: Internal todo state
RIGHT: Visible, editable files
Why: TodoWrite state is lost between sessions. Files persist.
Path Troubleshooting
Symptom: "File not found" on continue
Fix:
- Run
pwd - Read from
./.claude/session.md(project root) - NOT from skill directory
Quick Reference
| State | Prefix | Action | Exit | |-------|--------|--------|------| | CHECK_STATUS | CHECK_STATUS | Read session.md, route | Status-based | | AWAITING_COMMIT | AWAITING_COMMIT | Ask permission, STOP | User response | | MARK_COMPLETE | MARK_COMPLETE | Update files | → CHECK_STATUS | | WORKING | WORKING | Implement task | → VERIFY | | VERIFY | VERIFY | Run verification | Pass/Fail | | COMPLETE | COMPLETE | Update session.md | → CHECK_STATUS | | BLOCKED | BLOCKED | Explain, STOP | User guidance |