Create a project.md when:
- The project involves 3+ tasks
- Work will span multiple sessions
- The human wants a clear scope and progress tracking
- The project has non-trivial decisions to document
Skip project.md for:
- One-off questions or single commands
- Quick fixes (< 15 minutes)
- Exploratory research with no defined deliverable
- Copy the template: Copy
template.mdinto the project directory asproject.md - Fill frontmatter: Set project name, status (
define), created date, owner - Brainstorm with human: Ask questions one at a time to fill in:
- What This Is (2-3 sentences, their words)
- Core Value (the ONE thing that matters)
- Requirements — Active (current scope as hypotheses)
- Requirements — Out of Scope (with reasoning)
- Context (background, prior work, environment)
- Constraints (with "why" for each)
- Don't touch Tasks yet. Tasks come after Design is approved.
- Log the initial session in Session Log.
- Add footer:
*Last updated: [date] after initialization*
- Map the codebase first — read existing code, understand patterns
- Infer Validated requirements from what the code already does:
- What does the codebase actually do?
- What patterns are established?
- What's clearly working and relied upon?
- Gather Active requirements from the human:
- Present inferred current state
- Ask what they want to build next
- Initialize:
- Validated = inferred from existing code (with "— existing" tag)
- Active = human's goals for this work
- Out of Scope = boundaries human specifies
- Context = includes current codebase state
- One question per message
- Prefer multiple choice over open-ended
- Propose 2-3 approaches with trade-offs and your recommendation
- Get explicit approval before moving from DEFINE to DESIGN
- Challenge vagueness — make abstract concrete
- Surface assumptions — find edges — reveal motivation
- Update task checkboxes as you complete them:
- [ ]→- [x] - Log decisions immediately — don't wait until session end
- Track decision outcomes when known: ✓ Good /
⚠️ Revisit / — Pending - Flag blocked tasks with
- [!]and the reason - Add discoveries as you find them
- Never mark a task complete without verification evidence
Before closing, update:
- Current State — this is mandatory, never skip:
- Phase: what phase you're in
- Last completed: which task(s) you finished
- In progress: what you were working on
- Next action: specific enough for the next session to start immediately
- Blockers: anything stopping progress
- Notes: any context the next session needs
- Session Log — append a one-line summary
- Frontmatter — update
updateddate andstatusif phase changed - Footer —
*Last updated: [date] after [what happened]*
When completing a phase, run this checklist:
- Requirements invalidated? → Move to Out of Scope with reason
- Requirements validated (shipped + proven)? → Move to Validated with version/phase
- New requirements emerged? → Add to Active
- Decisions to log? → Add to Key Decisions
- "What This Is" still accurate? → Update if drifted
- Update
statusin frontmatter
When hitting a milestone, do a full review:
- Review all sections
- Core Value check — still the right priority?
- Audit Out of Scope — reasons still valid?
- Update Context with current state
- Review Key Decisions outcomes
Log a decision when:
- You choose between alternative approaches
- The human makes a call on scope, design, or priorities
- You discover a constraint that wasn't in the original list
- You reverse a previous decision (update old decision's Outcome to
⚠️ Revisit)
Format:
| Decision | Rationale | Outcome |
Read the entire project.md on session start. Don't just read Current State — you need the full context.
Current State tells you:
- What phase you're in
- What was last completed
- What to do next
- Any blockers
Before starting work:
- Check that the "last completed" tasks are actually
[x]in the task list - If there's a mismatch, ask the human before proceeding
- Verify the "next action" still makes sense given the task list
Look for any decisions with
Start working on the "next action" from Current State. If it's no longer valid, update Current State and ask.
- Never mark a task complete without verification. Run the test, check the output, confirm it works.
- Always update Current State before ending a session. The next agent session depends on this.
- Log every significant decision. If you'll forget why you chose X over Y in 2 days, log it now.
- Keep "What This Is" to 2-3 sentences. Update it when reality drifts.
- One question at a time during brainstorming
- Tasks should be bite-sized — one action, 2-5 minutes of focused work
- Use sub-bullets for task detail when a task needs more explanation
- Don't duplicate information — reference other sections instead
- Append, don't rewrite — Session Log is append-only
- Out of Scope always has reasoning — prevents re-adding later
- Skipping Current State updates ("I'll do it next time")
- Vague next actions ("continue working on it")
- Logging decisions without rationale ("chose Go" — why?)
- Expanding scope without updating Requirements/Constraints
- Marking tasks complete without running verification
- Leaving stale blockers in Current State
- Writing "What This Is" as a technical spec instead of a human description
Brainstorming fills in the DEFINE phase of project.md:
- What This Is + Core Value
- Requirements (Active + Out of Scope)
- Context + Constraints
Writing Plans populates the BUILD phase tasks. Each task in the plan becomes a - [ ] entry under "Phase: BUILD" in project.md.
Executing Plans uses project.md as the source of truth. Tasks are checked off as completed. Current State is updated throughout.
Verification ensures task checkboxes are only checked with evidence. project.md's task list is the checklist that verification enforces.
- Always
project.md— notPROJECT.md, notproject-doc.md - One per project — in the project root or a projects directory
- For multiple projects, use separate directories:
projects/weather-cli/project.md