1. Intake and inspection
Read the actual system before touching it
I start by inspecting the existing code, ticket context, current behavior, and likely failure paths. Most engineering waste starts with people editing against assumptions.
- what already exists and what the system is really doing
- what the issue actually is, not what the ticket vaguely implies
- what the blast radius is and what should stay untouched
- what verification will be needed before any change is called done
Moving fast without inspecting reality is not speed. It is churn.
2. Scope the work
Turn loose requests into ticket-scoped execution
Before implementation, I reduce ambiguity, define boundaries, and make the unit of work concrete enough to execute without thrashing.
- clear scope instead of vague cleanup language
- explicit acceptance criteria or at least verifiable intent
- known constraints, dependencies, and risks
- a decision on whether the task is code, automation, infra, or cross-cutting work
3. Isolate execution
One ticket, one branch or worktree, one blast radius
I prefer isolated branches or worktrees for ticket-scoped work so overlapping changes do not pollute each other. That matters even more when AI is helping with exploration or drafting.
- separate execution context for each meaningful task
- cleaner reviews and less cross-ticket contamination
- traceable progress when switching between product, infra, and automation work
AI support is useful here because the structure is already disciplined.
4. Use AI where it is actually useful
Exploration, drafting, synthesis, review support
I use AI heavily, but in bounded ways that map cleanly to engineering work instead of replacing it.
- codebase exploration and pattern discovery
- drafting implementation on well-scoped tasks
- synthesizing tickets, notes, and code context into execution plans
- review support for dead code, drift, and obvious failure modes
The ownership never moves. The assistance just removes drag.
5. Verify before calling it done
Verification is part of implementation
I treat verification as a first-class engineering step, not a courtesy after code lands.
- check the current behavior first
- implement narrowly and verify locally
- run the relevant tests, type checks, or runtime checks
- review the final shape for maintainability, not just task completion
A change is done when it survives scrutiny, not when a diff exists.
Engineering standard
Weak structure creates most of the avoidable pain.
Most delivery problems show up long before production. Scope stays vague. Changes overlap. Verification gets postponed. Then the codebase starts fighting back.
My workflow is built to cut that failure pattern early: inspect first, scope the work, isolate it, use AI where it removes friction, and verify before calling it done.