The single biggest upgrade from “prompt and pray” is a rhythm: say what you're building, pressure-test the design, build one slice at a time, and review before you ship. One chat per feature, fix, or PR.

The four beats

  1. Spec — write what you're building, in English

    Before any code, one or two paragraphs for a small feature; more for anything novel. It's the first message of your chat and a spec.md in your repo. A real example:

    Build a CSV importer for the donor system.
    
    Users upload a CSV with name, email, amount, and date.
    We validate, dedupe by email + date, and write to the
    donor table.
    
    On error: keep the file, surface a row-by-row report.
    Auth: existing OIT SSO, role = staff.
    Rate limit to 10k rows per upload.

    One habit worth stealing: paste the draft spec back to the AI and ask, “What's missing? What would a senior architect ask?”

  2. Architecture — sparring partner, not architect

    Ask: “Given this spec and this codebase, give me two or three ways to structure this. Trade-offs?” Then push back. Ask why. Ask what breaks at ten times the scale. The AI shows you options; you make the call. The math: ten minutes of architecture conversation routinely saves ten hours of rework.

  3. Phased prompts — one slice at a time

    Execute in coherent slices, each a natural commit point: schema (tables, indices) → API (endpoints, validation) → service layer (business logic) → UI → tests and docs. Review at every phase boundary, not just at the end — and don't let an agent run for two hours unsupervised.

  4. Review — by you, then by your team

    AI-generated code goes through the same review as any other code. Read every line — don't accept a diff you haven't read, and if it's too big to read, it's too big to ship. Ask the AI to critique its own diff before you submit; it catches a surprising amount. Details: Shipping & review.

One chat per feature, fix, or PR

Mixed chat: context bleed

“Add the CSV importer… wait, also fix the login bug… why is that field nil?… now style the dashboard… back to the import — did we finish?” The AI's context muddies, and so does yours.

One chat each: a clean record

feature/csv-importer: spec → architecture → phases. fix/login-redirect: repro → root cause → patch + test. Each chat maps to a branch, and the chat itself becomes documentation of how the work was done.

Persistent knowledge — your stack, conventions, commands — shouldn't be retyped into every chat. It lives in a context file the AI reads automatically.

Try it this week

  1. Pick one feature you were going to build anyway.
  2. Run the four beats — spec first, even if it feels slow. It saves time on every step after.
  3. Notice the review — how much more reviewable is work that arrived in slices?