AI-directed software engineering

AI writes the code. Proving it correct is the job.

I direct AI to build compilers, virtual machines and emulators — the systems layer, where “looks plausible” is worth nothing and a wrong answer is a crash rather than a rendering glitch. Of 53 public projects, 52 contain no code written by me.

52/53 projects with no code written by me
8 compilers, across five source languages
12 emulators and virtual machines

How this works

Directing the work, not typing it

Getting a language model to emit plausible code is easy and nearly worthless at this layer. A compiler that mostly works produces binaries that mostly run.

No code written by a primate. This mark appears on every project here whose code I did not write — 52 of 53. The exception is cpmemu, which I started myself.

01

Pick an oracle I don’t control

Byte-identical to the binary Microsoft shipped. Smaller than z88dk on all 47 tests of a suite someone else published. The 499 bytecodes Xerox recorded in 1983. 13,040 of 13,053 Pharo tests. None of those pass conditions are my opinion, and none of them can be argued with.

02

Decompose until each piece is checkable

Proving a source reconstruction needed a byte-identical assembler first, so that got built first. The work is choosing what has to exist, in what order, for the final claim to mean anything — and knowing when an answer is confidently wrong.

03

Publish the attribution

Every commit carries a Co-Authored-By: Claude trailer. Clone any repository and read the history. The claim on this page is checkable the same way everything else here is.

This is the part I would actually be hired for. The typing is free now; deciding what correct means, and refusing output that passes my own tests but not somebody else’s, is not.

What I do

Three kinds of problem

These are the engagements where I am genuinely faster than a generalist, because I have already made the mistakes.

01

Compilers & code generation

Frontends, AST and peephole optimization, register allocation, and backends for architectures with genuinely hostile constraints. Parser generators and assembler/linker toolchains when the existing ones do not fit.

02

Virtual machines & emulation

Bytecode interpreters, CPU cores, and system emulation — either faithfully at the hardware level, or by intercepting system calls and translating them to the host. Including the platforms that forbid a just-in-time compiler, where the interpreter has to carry the whole load.

03

Legacy systems & recovery

Codebases in languages your team no longer staffs, binaries whose source was lost, and file formats with no living specification. Reconstruction, verification, and porting onto platforms that did not exist when the code was written.

Evidence

Results that are checkable, not claimed

This is what the method above produces. Every result below has a pass condition somebody other than me defined, which is the only reason it is worth stating at all.

Lost source code, reconstructed byte-for-byte

Microsoft’s MBASIC 5.21 source no longer exists. The reconstructed MACRO-80 source in mbasic2025 assembles to a binary identical to the shipped mbasic.com — not equivalent, identical.

Smaller code than the incumbent, on every test

uc80, a C compiler for the Z80, produced smaller binaries than z88dk on all 47 tests of a public benchmark suite. uplm80 matches the Digital Research PL/M-80 compiler on code size.

A 1983 virtual machine, trace-verified

smalltalk80-2026 boots the original Xerox Smalltalk-80 image to the desktop on four platforms, each reproducing the Xerox trace2 boot prefix — 499 bytecodes — exactly. The VM core is a port of dbanay/Smalltalk under MIT; the portability, loader and verification harness are mine.

The Pharo test suite, with no JIT

iospharo runs stock Pharo 13 and 14 images on iOS, where the platform forbids a JIT. The interpreter alone passes 13,040 of 13,053 Pharo tests on Mac Catalyst (99.90%), and 99.55% on the iOS Simulator.

Writing

From the blog

Reconstructing MBASIC 5.21, byte for byte

Microsoft's source for MBASIC 5.21 is gone. A reconstruction from a sibling version and a disassembly is only half the problem. The harder half is proving the reconstruction is right, and that proof needed a byte-identical assembler to be built first.

Where the bytes go in a Z80 C compiler

uc80 compiles C for the Z80 and CP/M and produces smaller binaries than z88dk on every test of a public suite. Most of the difference comes from one decision about where local variables live — and from being honest about which part of that comparison is meaningful.

Two ways to emulate a machine

cpmemu and romwbw_emu both run CP/M software and share the same Z80 core, but they sit at opposite levels of abstraction. One intercepts the operating system, the other emulates the hardware. Neither is the better design. They answer different questions.

All posts

Also

Other tools

Small utilities for my own infrastructure and my own tooling.

aws_watch

An hourly watchdog that sweeps every AWS region and emails you about wasted spend. It reports idle EC2 instances, unattached EBS volumes, unassociated Elastic IPs and long-stale servers, and it measures load through SSM.

AI-built: I wrote none of this code Python ★ 1

periodic

A resumable replacement for run-parts and cron.daily. It records when each script last succeeded, so a later run skips whatever already finished this day, week or month.

AI-built: I wrote none of this code Shell

Working together

I take on compiler, runtime, emulation and legacy-recovery work, and sponsored development on the open-source projects above. Tell me what the system has to do and what “correct” means for it, and I will tell you honestly whether I am the right person.

Get in touch