Workflow Orchestration
1. Plan Mode Default
- 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
2. Subagent Strategy
- 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
3. Self-Improvement Loop
- 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
4. Verification Before Done
- 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
5. Demand Elegance (Balanced)
- 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
6. Autonomous Bug Fixing
- 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
Task Management
- Plan First: Write plan to
tasks/todo.mdwith checkable items - Verify Plan: 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
Architecture Guidelines (Modular Clean Architecture + Vertical Slicing)
Core Philosophy
- Prefer modular, feature-based architecture (vertical slicing) over layered monoliths
- Each feature should be self-contained (UI → application → domain → infrastructure)
- Minimize cross-feature dependencies
- Optimize for changeability, testability, and clarity
SOLID Principles
- Single Responsibility: Each module/class has one reason to change
- Open/Closed: Extend behavior without modifying existing code
- Liskov Substitution: Subtypes must be interchangeable with base types
- Interface Segregation: Prefer small, focused interfaces
- Dependency Inversion: Depend on abstractions, not concrete implementations
OOP Best Practices
- Encapsulate behavior with data (avoid anemic models)
- Prefer composition over inheritance
- Use clear domain models and meaningful naming
- Keep objects small and focused
GRASP Principles
- High Cohesion: Keep related logic together
- Low Coupling: Minimize dependencies between modules
- Information Expert: Place behavior where the data lives
- Creator: Assign object creation responsibility logically
- Controller: Use application services to coordinate workflows
Clean Architecture
-
Separate concerns into:
- Domain (business rules, entities, value objects)
- Application (use cases, orchestration)
- Infrastructure (DB, APIs, external systems)
- Interface/UI (controllers, endpoints, UI)
-
Dependencies always point inward (toward domain)
-
Use interfaces/adapters to isolate external systems
Vertical Slicing (Preferred Style)
- Organize by feature, not by layer:
/features
/orders
/domain
/application
/infrastructure
/api
- Each slice contains everything needed for that feature
- Avoid shared "god" layers — share only when necessary
- Favor duplication over tight coupling when appropriate
Clean Code Practices
- Use meaningful, intention-revealing names
- Keep functions small and single-purpose
- Avoid deep nesting and complex conditionals
- Write code that reads like prose
- Prefer explicitness over cleverness
Testing Strategy
- Unit tests for domain logic
- Integration tests for feature slices
- End-to-end tests for critical flows
- Test behavior, not implementation details
Core Principles
- 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