Available for rolesPiotr Czerwiński

AI engineering

How I build products with AI coding agents

I use Claude Code as my default agent, Codex CLI for bounded tasks that already have a written spec, and Kiro CLI inside a large enterprise codebase at my day job. Agents write most of the code. What makes it shippable is everything around them: specs, written engineering standards, deny rules and hooks, unit, integration and E2E tests, evals, a second-agent review, and my own review of every pull request before I merge it. Every section below links to a first-hand write-up from my own production work.

Which agent gets which job

Claude Code

My own products, every day

Planning, incidents, long threads, anything that needs product context or memory. Writes the specs other agents execute.

Codex CLI

My own products, next to Claude Code

Bounded jobs that already have a written spec, run in their own git worktree, plus a second-opinion code review.

Kiro CLI

A large enterprise codebase at my day job

The approved agent inside strict enterprise constraints: small, reviewable changes with a human in every loop.

The routing rule and the shared setup: Claude Code vs Codex CLI and Kiro vs Claude Code.

How a feature ships

  1. 01

    Spec

    Written with a planning agent: the product model, hard constraints, a numbered test list and a finish block.

    Specs an agent can finish →
  2. 02

    Agents build to my standards

    Claude Code or Codex CLI in their own git worktrees, held to written rules: SOLID, DRY, KISS, small pure functions, deny rules on anything irreversible.

    Parallel agents in worktrees →
  3. 03

    Tests and gates

    Unit tests on rules and edge cases, integration tests on data paths, Playwright E2E on user flows, lint on staged files, evals for AI features.

    Evals before merge →
  4. 04

    Agent review

    A second agent in a fresh session reviews the diff against the spec and the standards, so I start my review from the findings.

    A second agent as reviewer →
  5. 05

    I review and merge

    Human in the loop: I read every pull request myself, run what changed, and merge only when I am sure. Then I watch production.

    How I review AI-generated code →

I stay the human in the loop. Agents never merge. Every pull request gets my own read of the diff, a run of what changed, and a merge only when I am sure it is right, not when the checks turn green.

The standards agent code has to meet

Agents load these rules before they touch production code, and I check them in review. Fast code that nobody can maintain is not a speed-up, it is debt with a delay.

SOLID, applied, not recited
Routes validate and delegate, business logic lives in the domain layer, SQL in the repository layer. Payments, email and LLM providers sit behind adapters, so swapping a vendor means one new adapter.
DRY with judgment, KISS by default
Search before writing, one source of truth for every value, a shared package instead of a third copy. The simplest design that meets the spec, no speculative abstractions, and no merging code that changes for different reasons.
Small units
A function fits on one screen, roughly 40-50 lines, and a file stays within a few hundred. Code is split by responsibility, not by line count, so every unit can be named without an "and".
Pure logic, effects at the edges
Business rules are pure functions that take data and return data. I/O, time and randomness stay at the edges, which keeps the rules testable without mocks and makes agent changes easy to review.
Tests that catch regressions, not coverage
Unit tests on rules and edge cases, integration tests on the paths that touch money, auth and data scoping, Playwright E2E on the flows users depend on. Every bug gets a failing test first. No tests for getters.
Secure by default
Every ID in a request is treated as forged and every query filters by owner. Validation and authorization run on the server, and every endpoint that calls a model has a per-user limit, a daily cap and a kill switch.

The harness around the agent

An agent harness is everything around the model: what it may run, what is blocked, what it loads at start and when a session has to stop. This is where most of the safety and most of the cost control live.

Delegating work to agents

Which agent gets which job, how a task is written so an agent can finish it alone, and how to tell a finished task from a confident status report.

Want this way of working on your team?

I'm open to senior product engineering and founding-team roles where agents are part of the default workflow. See what I have shipped with it on the work page, or email me.