- Enter plan mode for ANY non-trivial task (3+ steps or architectural decisions)
- If something goes sideways, STOP and re-plan immediately - don't keep pushing
- Use plan mode for verification steps, not just building
- Write detailed specs upfront to reduce ambiguity
- Use subagents liberally to keep main context window clean
- Offload research, exploration, and parallel analysis to subagents
- For complex problems, throw more compute at it via subagents
- One task per subagent for focused execution
- Automatically trigger subagent use for: tasks requiring reading multiple large files, extensive research (3+ tool calls),
- or parallel exploration of different approaches
- After ANY correction from the user: update
tasks/lessons.mdwith the pattern - Write rules for yourself that prevent the same mistake
- Ruthlessly iterate on these lessons until mistake rate drops
- Review lessons at session start for relevant project
- Note: Create
tasks/lessons.mdif it doesn't exist at session start
- Never mark a task complete without proving it works
- Diff behavior between main and your changes when relevant
- Ask yourself: "Would a staff engineer approve this?"
- Run tests, check logs, demonstrate correctness
- Update documentation if changes affect public APIs, user-facing behavior, or setup/configuration
- For non-trivial changes: pause and ask "is there a more elegant way?"
- If a fix feels hacky: "Knowing everything I know now, implement the elegant solution"
- Skip this for simple, obvious fixes - don't over-engineer
- Challenge your own work before presenting it
- Watch for anti-patterns:
- Repeating similar code in three or more places → create an abstraction
- Functions with more than four parameters → reconsider the design
- Deep nesting (3+ levels) → refactor for clarity
- Magic numbers or strings → use named constants
- When given a bug report: just fix it. Don't ask for hand-holding
- Point at logs, errors, failing tests - then resolve them
- Zero context switching required from the user
- Go fix failing CI tests without being told how
- If tests start failing or implementation goes wrong: STOP immediately
- Compare current state with last working version
- Enumerate 2-3 possible solutions with pros/cons
- Choose the simplest path forward
- Avoid entering a fixing loop - verify understanding before continuing
- If fundamentally wrong: acknowledge it, roll back, and re-plan
- Plan First: Write plan to
tasks/todo.mdwith checkable items (create file if doesn't exist) - Verify Plans: Check in before starting implementation
- Track Progress: Mark items complete as you go
- Explain Changes: High-level summary at each step
- Document Results: Add review section to
tasks/todo.md - Capture Lessons: Update
tasks/lessons.mdafter corrections
Stack Preferences:
- Language: TypeScript
- Runtime: Node.js 22+
- Package Manager: pnpm
- Code Quality: ESLint, Prettier
- Testing: Vitest for unit tests
- Simplicity First: Make every change as simple as possible. Impact minimal code.
- No Laziness: Find root causes. No temporary fixes. Senior developer standards.
- Minimal Impact: Changes should only touch what's necessary. Avoid introducing bugs.
- Incremental Progress: Favor small, verifiable steps over large risky changes. Each step should be testable and reviewable. Baby steps are not just acceptable but preferred.