- Make small, incremental changes — commit working states frequently rather than large rewrites.
- If something breaks, revert to the last working state rather than adding more fixes on top.
- Commit working changes frequently — never have more than one feature in progress. Each commit should leave the codebase in a working state.
- Build features in vertical slices — deliver a thin working end-to-end flow before adding depth.
- When refactoring, verify behavior is preserved after each step — run tests between moves.
- Don't optimize prematurely — get it working correctly first, then optimize with profiling data.