Writing · 31 posts
Notes from shipping with AI agents in production.
Real problems from my own production systems: the problem, the options I weighed, what I chose and why. First-hand only, no generic AI advice.
Start with the AI workflow overview →AI engineer, ML engineer, product engineer, FDE: what AI job ads actually ask for in 2026
I read about 520 remote engineering job ads in September 2026 to see whether the way I work matches what the market names. Observability beats every AI term, evals show up only in the best-paid roles, and the titles map onto four jobs.
AI agents · AI engineering · hiring8 min read
A hook that keeps coding-agent sessions on one topic
A launcher that declares each session's intent and a prompt hook that blocks off-topic requests, parks side ideas in a one-line inbox, and escalates at 250K-650K tokens of context until the session writes a handoff. Design, thresholds, and a flag-parsing bug.
Claude Code · AI agents · context engineering9 min read
Spec-driven development with coding agents: specs an agent can finish without me
The anatomy of a spec a coding agent can finish alone: product model, problem, goal, hard constraints, numbered tests and a finish block. Who writes it, who runs it, what review costs, and why specs fail.
AI agents · spec-driven development · Claude Code9 min read
Same agent, opposite results: exit criteria decide the outcome
Two tasks delegated to the same coding agent: a bounded test task passed 6/6 in 70 seconds, an open research brief returned a status note and a hallucinated fact. Why the exit criterion made the difference and the model did not.
AI agents · Codex CLI · LLM evals8 min read
Context engineering for coding agents: making project docs resumable in 7K tokens
Project docs are a coding agent's long-term memory. I measured what it costs to resume a work thread: about 6,700 tokens with a structured docs tree versus 39,500 reading files whole. The thresholds, the split rule, and the silent limits that came out of it.
context engineering · Claude Code · AI agents8 min read
MCP in daily engineering: lean sessions, heavy servers on demand
Which kinds of MCP server earn a place in daily work, why only two load by default while heavy ones come in per session, the query shapes that make incident triage fast, and the rules that keep agents off production writes.
MCP · Claude Code · AI agents8 min read
Codex CLI next to Claude Code: one rulebook, two agents
How I run OpenAI's Codex CLI alongside Claude Code on the same repos: one rulebook, one hook contract, MCP and skills parity, profile launchers, and a routing rule for which agent gets which job.
Claude Code · Codex CLI · AI agents9 min read
How an LLM instruction header ended up in my public structured data
A metadata header written for an extraction model ended up in the JSON-LD of public pages. How I found it in the page source, fixed it at render time and in the data, and the governance rule that followed.
AI governance · LLM · structured data7 min read
Auditing my coding agent's guardrails: the holes I found
I audited the guardrails around my coding agent and found holes: an API call that bypassed a delete protection, a regex flag that silently disabled a hook, and a permission allowlist that had collected credentials.
Claude Code · AI agents · security9 min read
What my coding agent would cost on the API: 30 days of transcripts, measured
I priced 30 days of my own coding agent transcripts at public API rates: about $4,176, more than 90% of it cache reads, 88% of input spent in turns above 300K context. Why a subscription wins for long sessions, and how to measure it yourself.
Claude Code · AI agents · context engineering7 min read
Cheap sweep, strong synthesis: routing models across multi-agent work
A wide research run on the strongest model ran out of budget before producing a single table. The model ladder, pilot-first fan-out and minimal forked context I now use to route work between strong, mid and fast models.
AI agents · Claude Code · context engineering9 min read
Every endpoint that calls a model is an open wallet
Any route that calls a paid model is a denial-of-wallet risk. The layers I run on every LLM endpoint: per-user limits, a daily cap, a deploy-free kill switch, challenges, a spend ledger and per-environment provider caps.
AI · security · cost optimization8 min read
A green build is not proof: how I review AI-generated changes
An automated refactor put a React hook outside a component, passed type checks and the build, and took an admin panel down. The gates I added, and how I review AI-generated changes and suggested packages.
AI agents · Claude Code · code review9 min read
What it actually costs to build an MVP in 2026
How much does it cost to build an MVP or an app? The framework is the cheapest part. A builder's honest breakdown of what really drives the number: scope, the unglamorous 40%, integrations, and the freelancer vs agency vs solo-with-agents tradeoff.
MVP · solo founder · AI agents9 min read
Why I stopped loading every skill into every Claude Code session
25 skills, 5 agents and 4 MCP servers loaded into every session regardless of the project. The fix wasn't more docs - it was three layers, and knowing what actually enters the context window and when.
Claude Code · AI agents · context engineering9 min read
Giving a coding agent shell access without losing sleep: the guardrails I run
An agent with shell access can delete the wrong thing, force-push, or leak a secret, and report success either way. Four layers - safety-checked mode, hard deny rules, a pre-execution hook, and behavior - that let it finish without touching the irreversible.
Claude Code · AI agents · security10 min read
Two agents, two contexts: Claude Code at home, Kiro CLI in an enterprise codebase
Running an autonomous agent on your own product and using an approved agent inside a large enterprise codebase are different sports. What transfers, what changes, and why the enterprise constraints are a feature.
Claude Code · Kiro CLI · AI agents8 min read
Running coding agents in parallel with git worktrees
One mega-session drifts. The alternative: split a feature into three to five low-conflict subtasks with contracts up front, run each in its own git worktree with push disabled and no database access, then integrate once with end-to-end checks.
Claude Code · AI agents · git9 min read
Model picks latency, the spec picks quality: choosing effort in Claude Code
The counter-intuitive rule after months of daily agent work: on well-specified work the model is a latency lever, not a quality lever. When to spend the slow, expensive setting, when not, and why cranking effort never fixes a vague plan.
Claude Code · AI agents · workflow8 min read
Eight months of running a product solo with AI agents as co-engineers
Not a one-week experiment: how I actually structure work with Claude Code and Kiro CLI on a production side project. Where agents genuinely accelerate, where they don't, the guardrails that make autonomy safe, and what it costs per month.
AI agents · Claude Code · workflow10 min read
A CVE three levels deep: patching a transitive dependency with npm overrides
npm audit flags a vulnerability in a package you never installed and cannot upgrade directly. The options: wait, force-upgrade, override, fork, or accept the risk. How overrides actually work, their sharp edges, and keeping CI honest about lockfiles.
npm · security · dependencies8 min read
The INSERT that ran thirteen times: why a write inside a Server Component render is a race
One user logged in, thirteen duplicate rows appeared. A check-then-insert in a Server Component render path raced against concurrent renders, and a swallowed error made it snowball. Where writes actually belong, and the one guarantee that holds.
React Server Components · Next.js · PostgreSQL8 min read
Leaving Vercel: migrating a production Next.js side project to Cloudflare
Why I moved a live Next.js project off Vercel, the options I weighed (stay and pay, OpenNext, static export), what each would cost me, and the DNS, redirect and analytics surprises that only showed up after the switch.
Next.js · Cloudflare · Vercel11 min read
Evals before merge: the golden set behind an AI matching pipeline
How I test a non-deterministic AI matching pipeline before merge: a golden set built from real admin decisions, ranking metrics tied to what users see, a zero-violations ship gate, and the variants that did not beat the baseline.
LLM evals · AI · matching10 min read
Extracting a design system into a private package, and falling down the distribution rabbit hole
Pulling shared UI into its own package sounds like a weekend refactor. Then Tailwind majors clashed, a deleted brand color kept resurrecting itself, and CI couldn't install the package at all. What distributing a private shared package actually involves.
design systems · npm · CI/CD10 min read
Tool use over parsing: getting structured data out of an LLM in production
Getting typed fields out of messy text with an LLM: why JSON mode is not enough, how tool use and strict schemas help, what a schema still does not guarantee, and keeping the provider behind an adapter.
AI · LLM · tool use8 min read
Hydration mismatches in the wild: two production specimens and a diagnostic method
Two real SSR-mismatch bugs: toLocaleString rendering different number formats on server and client, and an iOS-only flicker from a clobbered html attribute. The options weighed for each fix, and a general method for diagnosing the whole bug class.
React · SSR · hydration10 min read
Static doesn't mean free: the Next.js prefetch storm that raised my CPU bill after moving to SSG
I migrated my SEO pages to static generation expecting near-zero compute. Active CPU went up instead. The culprit: default <Link> prefetching multiplying every visitor into dozens of server renders, and why prefetch={false} alone made the UX worse.
Next.js · performance · Vercel9 min read
The week my free tier ran out: moving Next.js rendering costs from runtime to build time
My side project hit two free-tier limits in the same week: serverless CPU and database egress. How I found the one query behind most of it, migrated dynamic SEO pages to SSG with client-side infinite scroll, and untangled the three cache layers everyone confuses.
Next.js · SSG · caching12 min read
The cookie banner that became my LCP: a 5.7 second lesson in Core Web Vitals
A static, CDN-cached page scored a 5.7 s LCP with a 1.2 s FCP. The largest contentful element turned out to be a deliberately deferred consent banner. Five candidate fixes, their trade-offs, and why the counter-intuitive one (render it earlier) won.
Core Web Vitals · LCP · performance9 min read
Cosine similarity is not a probability: tuning pgvector thresholds for real matching
My retrieval returned 200 OK and zero rows, silently. Why raw embedding similarity scores are model-specific rather than meaningful on their own, what real score distributions look like, and how I calibrated a threshold with eval pairs instead of intuition.
pgvector · embeddings · RAG9 min read