Plan Template
Plans use a specific format that combines structured frontmatter with readable content. This format enables the "Run Now" action button in Sauna.
Full Template
---
_action:
label: "Run Now"
prompt: "Execute this plan step by step. For each todo, complete the step described, then mentally mark it complete before moving to the next. Stop if you encounter a blocker and report it."
isComplete: false
name: [Plan Title]
overview: [One-line summary of what this plan accomplishes]
todos:
- id: step-1
content: [First step description]
status: pending
- id: step-2
content: [Second step description]
status: pending
- id: step-3
content: [Third step description]
status: pending
---
# Plan: [Title]
## Goal
[What success looks like in 1-2 sentences. Be specific and measurable.]
## Scope
**In scope:**
- [What's included]
- [Specific deliverables]
**Out of scope:**
- [What's explicitly excluded]
- [Future work deferred]
**Needs user action:**
- [Prerequisites the user must handle]
- [Decisions the user must make]
## Steps
### Step 1: [Step Title]
[Detailed description of what this step accomplishes and how to do it.]
**Success criteria:** [How to know this step is done]
### Step 2: [Step Title]
[Detailed description...]
**Success criteria:** [...]
### Step 3: [Step Title]
[Detailed description...]
**Success criteria:** [...]
## Success Criteria
The plan is complete when:
- [ ] [First criterion]
- [ ] [Second criterion]
- [ ] [Final deliverable exists]
## Notes
[Any additional context, assumptions, or warnings]Frontmatter Fields
_action Block
The _action frontmatter creates the "Run Now" button in Sauna:
| Field | Purpose |
|---|---|
label |
Button text shown to user |
prompt |
Instructions for the agent when executing |
isComplete |
Always false until execution finishes |
Plan Metadata
| Field | Purpose |
|---|---|
name |
Short title for the plan |
overview |
One-line summary |
todos |
Array of actionable steps |
Todo Structure
Each todo has:
| Field | Purpose | Values |
|---|---|---|
id |
Unique identifier | step-1, step-2, etc. |
content |
What to do | Clear, actionable description |
status |
Current state | pending, in_progress, completed, cancelled |
Writing Good Steps
Actionable
Each step should be something the agent can actually do.
❌ Bad: "Improve the codebase"
✅ Good: "Add error handling to the fetchData function"
Verifiable
Each step should have clear success criteria.
❌ Bad: "Make it better"
✅ Good: "Reduce load time to under 2 seconds"
Independent (where possible)
Steps should minimize dependencies on each other.
❌ Bad: "Continue from step 2" (unclear what that means)
✅ Good: "Using the data from the previous step's output, generate the report"
Appropriately Sized
Not too big, not too small.
❌ Too big: "Build the entire feature"
❌ Too small: "Open the file"
✅ Right size: "Implement the authentication flow with login and logout"
Example Plan
---
_action:
label: "Run Now"
prompt: "Execute this plan step by step. For each todo, complete the step described, then mentally mark it complete before moving to the next."
isComplete: false
name: Email Cleanup Plan
overview: Archive old newsletters and unsubscribe from inactive lists
todos:
- id: step-1
content: Search for newsletters older than 30 days
status: pending
- id: step-2
content: Archive newsletters in bulk
status: pending
- id: step-3
content: Identify inactive subscription sources
status: pending
- id: step-4
content: Generate unsubscribe list for user review
status: pending
---
# Plan: Email Cleanup
## Goal
Clean up inbox by archiving old newsletters and identifying subscriptions to cancel, reducing inbox clutter by 50%.
## Scope
**In scope:**
- Newsletter emails older than 30 days
- Identifying inactive subscription sources
- Bulk archive operation
**Out of scope:**
- Personal emails
- Work-related newsletters
- Automatic unsubscription (requires user action)
**Needs user action:**
- Review and confirm the unsubscribe list
- Manually unsubscribe from selected sources
## Steps
### Step 1: Search for Old Newsletters
Search Gmail for newsletter-type emails older than 30 days using labels and common newsletter patterns.
**Success criteria:** List of emails with counts by sender
### Step 2: Archive Newsletters
Bulk archive the identified newsletters.
**Success criteria:** Emails moved out of inbox
### Step 3: Identify Inactive Sources
Analyze newsletter sources to find ones with low open rates or no engagement.
**Success criteria:** Ranked list of subscription sources by engagement
### Step 4: Generate Unsubscribe List
Create a list of recommended unsubscriptions for user review.
**Success criteria:** Markdown file with sources and unsubscribe links
## Success Criteria
- [ ] Old newsletters archived
- [ ] Unsubscribe recommendations generated
- [ ] User has actionable list to reduce future clutter