For clients — what I can't show. For myself — what I can
For clients: internal products
I build AI agents for my clients' internal products. One public example:
Azul Intelligence Cloud AI Assistant(Sep 23, 2026): ask plain-language questions about Java in production and find where licensing and security risks are hiding. Read-only.
For myself: off the beaten track
In every sense: a different domain (games), a different stack (3D in the browser), different rules (zero infrastructure budget).
Not for profit: no app stores, no ads, no monetization. The games are free.
Everything I show here is open: code, git log, demos.
rules of the experiment
Self-imposed limits: $20 + $100
$20
Claude Pro subscription, limits and all
$100
OpenRouter: GLM, Kimi — open-weight models
Paying for Max is easy. The catch is that then you never learn the one thing that matters.
The question behind it all
For which kinds of tasks does medium effort do as well as x-high?
A budget makes you count: a cheap model and low effort wherever they're good enough, the expensive one only where nothing else will do.
the lay of the land
The L1 → L9 ladder
Nine levels of AI-assisted development, from Aleksei Litvinau's course “AI-Assisted Engineering”: alekseilitvinau.com/edu
what this talk is about
Three projects, three rungs
L4→L5
Race the City
July 2026
Racing through any city in the world. One agent with full access, a release every half hour.
the bottleneck is me
L5→L6
claude-remote-vm-dev
August 2026
Claude Code sessions on a VM inside the perimeter. They keep going with the laptop closed.
infrastructure for the next rung
L6→L7
itffm 🍄
September 2026
A mushroom forest modeled on a real place. Parallel agents in worktrees, a model for each role.
the bottleneck is review
repository
rung L4 → L5 · Race the City
Type in a city and drive
A low-poly version of a real city: roads, buildings, bridges, rails, water, terrain
19 cars, rivals, time trials, autopilot
Traffic, pedestrians, trams, ships, weather, day and night
data/species/*.yaml ├─ morphology → 3D model ├─ ecology → where and when it grows └─ name/text → field guide
A new species is a line of data, not a ticket for a 3D artist.
itffm in numbers (git log)
17 days from spec to v0.103
375
commits, 150 of them on day two
126
release tags, v0.1 → v0.103
57
species in YAML: mushrooms, berries, herbs, finds
109
test files, 25k lines of TS
9 specs, 6 plans. Each spec opens with section 0: “where the code turned out smarter than the spec”.
Carried over from RTC as is: boot-check, CHANGELOG, FEATURES.md, deploy by tag.
side effect #1
“Can we get a bigger map?” → an endless forest
Race the City, v0.92the world is a 2×2 km square around the center, with nothing past the edge
→
players asked“make the radius from the center bigger”
→
itffm, September 10the forest is cut into chunks, walk in any direction
How it got done
A brainstorm in the evening, then 6 hours of autonomous work while I slept. The spec says: any decision not approved before I go to bed, the agent makes conservatively and files as a follow-up instead of guessing.
What came out
If OSM or terrain fails to load for a chunk, it's filled in procedurally from the same seed. No wall, no error on screen.
L6 → L7 in practice · itffm, git log
September 11: one decision, seven branches
06:04plan: 11 play-test bug reports + old TODOs in one batch → my call: in parallel
06:12removed the disclaimer screen that got in the way on mobile
06:22rails sank into the terrain, trees grew through the track
06:25ground seams between chunks
06:27cabin door collision
06:38Esc opens the pause menu
06:42synthesized water sound: you hear the stream before you see it
06:54perf: distance culling
every line after the plan is a merge of its own worktree-agent-<id> branch
My part: one decision
gather the reports into one plan
see that the tasks are independent
say “in parallel”
Claude Code: everything else
7 subagents in a single message
7 worktrees, 7 branches
tests in each, 7 merges one at a time
what actually changed between L6 and L7
One primitive — git worktree — and two orchestrators
L6
claude-remote-vm-dev
me → rd-start … --session A me → rd-start … --session B me → rd-start … --session C
I wrote the worktree-per-session setup. How many agents, and on what — a human decides.
The tool creates the worktrees. How to split the work — the agent decides; I just approve.
Where the agent runs no longer matters:
your own VMtmux + systemd
cloudclaude.ai/code
phonea remote for any of them
the new bottleneck
What tests don't catch
Oyster mushrooms rendered as flat pancakes: the generator put the stem in the center
Chimeras: a 25 cm cap on a 6 cm stem
243 mushrooms × 5 meshes → a thousand draw calls; even the headless browser froze
The fix is a tool for looking with your own eyes: npm run silhouette-sheet, every species' silhouette on a single sheet.
The bottleneck moved
From “write the code” to “check the result”.
Agents write faster than I can look. Review and visual checks are now the human's main job.
back to the self-imposed limits
Medium or x-high: it depends on the kind of task
kind of task
example
hypothesis
Executing a plan
a task from the plan with tests already written
medium ≈ x-high, and GLM/Kimi are often enough
More of the same
one more car, one more mushroom species in YAML
medium ≈ x-high
Diagnosis
the invisible wall on the quay, third time round
x-high pays off
Spec and plan
endless world, quests, a mine
x-high and an expensive model
The better the spec and tests, the less effort execution needs. You pay once, at the planning stage.
side effect #2
A screen-shared forest vs. a shouting match
A startup sync. The founders are yelling at each other. Someone shares their screen, and there's a quiet forest: footsteps, birds, a stream, a mushroom under a birch.
The temperature drops.
That wasn't in the spec.
The product lesson
Value shows up where you didn't plan for it. Cheap releases (tag → Pages) let you put a thing in front of people fast and see how they actually use it.
the rungs, side by side
What changed from project to project
Race the City
remote-vm-dev
itffm
Rung
L4 → L5
L5 → L6
L6 → L7
Agents
one, in my terminal
N sessions on a VM
subagents in worktrees + cloud
Models
Opus for everything
any provider
Opus plans, Sonnet executes
Memory
AGENTS.md, TODO
branch = session
CLAUDE.md, specs with section 0
Bottleneck
my sleep
the laptop
review and looking with my own eyes
what you can take to your team tomorrow
Five rules
Spec before code. The agent executes a plan. An empty prompt breeds improvisation
The contract lives in the repo. AGENTS.md / CLAUDE.md, invariants, known pitfalls. The agent forgets; the repo remembers
Check that it boots, not just that tests pass. boot-check catches what green CI misses
One agent, one worktree. Without it, parallelism turns into merge conflicts
Tools for your eyes. Compress review: contact sheets, readouts, 👀 in the changelog
what's next
L8 and L9: swarm and ecosystem
L5full access
L6parallel
L7I'm here
L8swarm
L9ecosystem
Climbing higher takes not more agents but automated verification: a reviewer agent, visual regression testing, play-testing by bot.
From the backlog
Live weather and seasons from real data
New OSM layers
LAN multiplayer in RTC (the branch already exists)