David HatleyAI product engineer
Selected work

lab

This is what I'm building now, shown as it stands. Each project moves to the index once it clears a public demo bar, and the board shows how far each one has left to go.

built, not shipped yet

3

Working code on branches. Not public yet.

The napkin canvas: a Landing artboard, its layers, and the change list showing two edits made by claude.

A working canvas with 577 tests. Every artboard is a React file on disk, and an agent edits the same canvas over MCP while you watch.

3 of 5 steps done
  1. Canvas that saves every artboard as a TSX file, 577 tests
  2. MCP server: an agent edits the same canvas live
  3. Static demo that replays a recorded agent edit
  4. Replay demo live on a public link
  5. Video of the demo

Graduates whenAn agent-edit replay demo is live, with a video.

A small model, Kev-4B, composes a landing page section by section in about 1.7 s. A fine-tune on my 3060 made its section order much better.

4 of 5 steps done
  1. Command line, nibble ask and compare, 36 tests
  2. Held-out comparison with Sonnet: 0.88 vs 1.00 on 50 prompts
  3. Composer: Kev-4B builds a page section by section
  4. Fine-tune: section order from 0.35 to 0.85
  5. Composer replay demo live

Graduates whenThe composer replay demo is live.

An isometric pond diorama generated from the sentence: a frog hops across lily pads and a frozen pond to catch flies.

Barely started. One sentence becomes a three.js game that is checked in headless Chromium. Six example games are built.

2 of 3 steps done
  1. playdough make: plan, build, check in headless Chromium, 28 tests
  2. Six playable example games
  3. Six games playable from a public link

Graduates whenThe six games are playable from a public link.

working core

2

The hard part runs. The real demo has not.

from the recorded demo log
[demo] kill -9 3238142
r-20261022-135155  INTERRUPTED  (no owner process)
[demo] restarting: bonfire resume
  w2  back to step 3 (2 saved)
round 1  score  w1 0/2  w2 2/2  w3 1/2  w4 2/2
PASS  every check passes · winner w2 · 1 resume, 0 finished steps re-run

Four tries run side by side and the best is kept. A run survives kill -9 by resuming from its event log. So far on recorded model replies.

2 of 4 steps done
  1. Four tries side by side, best kept
  2. Resumes after kill -9 from its event log, 22 tests
  3. Live model calls
  4. Live run end to end on a real task

Graduates whenA live agent run goes end to end on a real task.

index.md, recorded from a real agent run
pathstatus
research/launch-event-research.mdgathered
assets/event-flow.spec.jsonmade
assets/event-flow.svgmade
research/open-decisions.mdopen: date, venue, budget

Task: plan a one-day launch event for a neighborhood tool library

A command line and five Claude Code skills prepare any task into a folder whose index records each item's source and status.

3 of 4 steps done
  1. mep init, index and check, 20 tests
  2. Five Claude Code skills
  3. Two prep folders recorded from real agent runs
  4. Measured use of prep by an agent

Graduates whenAn agent's use of the prep is measured.

designed, not built

1

Every part exists as a file. None is printed yet.

Exploded view of rack10: walls, crossbars and three trays, each a parametric OpenSCAD module.

Every part is modelled in OpenSCAD and exported: 61 STLs, printed joints only, no screws.

3 of 4 steps done
  1. Every part modelled in OpenSCAD
  2. 61 STLs exported
  3. Fit coupon for the clearance
  4. A printed level, photographed

Graduates whenA printed level is photographed.

finished experiments

6

Each one is finished, and what it taught went into a tool above.

I generated a dataset and trained a tiny decision model. Perfect on familiar wording, 44.5% on new wording, still 97% sure.

→ nibbleWhat it taught is built into nibble.

I mined real coding-agent traces into a dataset and fine-tuned a 421M model to guess the agent's next tool.

→ nibbleIts rules are built into nibble.

A small benchmark with hidden tests. The agent passed every visible test and still failed 2 of 7 tasks.

→ bonfirebonfire uses it as its eval corpus.

A propose, evaluate, criticize, verify loop over git worktrees. 67 tests, never run on a real model.

→ bonfireIts loop design lives on in bonfire.

A claim graph of what 10 open-source repos can do, where every claim points to source lines.

→ mise en placeIts card schema is in mise en place.

A design canvas that became a 473-capability spec before it drew a single pixel.

→ napkinnapkin is the canvas it was meant to be.