Phases as contracts
Once the SoW is tight, we break the work into discrete phases. Each phase has a clear input, a clear output, and an explicit handoff point where a human reviews before the agent proceeds.
A typical module build might look like this:
Phase 1. Data model. The agent produces the schema, migration files, and a brief written rationale for each design decision. We review. We either approve or we ask for changes. The agent does not touch business logic until this phase is signed off.
Phase 2. Core logic. Given the approved schema, the agent implements the service layer or equivalent. No UI. No integration wiring. Just the logic, with tests.
Phase 3. Integration. The agent wires the logic to whatever it needs to talk to: an API, a queue, a third-party SDK. This phase tends to surface the most surprises, which is exactly why we isolate it.
Phase 4. UI or surface. If there is a user-facing layer, it comes last. It is the easiest part to change and the least expensive to redo.
Each phase ends with a human checkpoint. The agent knows this upfront because we state it in the SoW. It does not skip ahead. If it tries to, that is a signal the phase boundaries were not explicit enough.
The gotcha for this structure. phase boundaries only hold if the agent maintains isolated context per phase. In practice, this means starting a fresh conversation at each handoff, or being very deliberate about what prior context you carry forward. Agents that retain the full session history will sometimes reference earlier decisions and drift back toward the broader plan. Clean context cuts are worth the friction of reintroducing relevant background manually.