← hilos.simmer.io

Process

How the take-home was built on 29 October (09:35 to about 19:00 PT): Rocco directing several Claude Code agents in parallel. Everything here comes from the shared work log, where each agent recorded what was asked, what it did, how it checked it, and what went wrong.

How the work was organised

The log. It lives outside the repo (~/dev/hilos-log/) so every worktree shares it, with one file per entry so parallel agents never race on a shared file.

Two builds. The TypeScript/React/three.js build on main is the deliverable. The main agent first recommended against a second build, because it doubles the code to defend. Rocco chose to explore one anyway, in its own worktree, and then widened it from a benchmark kernel to one Rust + wgpu codebase for web and native. The wasm branch keeps main's edit format, integer accumulator and op log, so the builds stay comparable and share saved data.

The agents. On Linux in the morning: a main agent and a wasm agent. At 14:50 the work moved to a Mac, after the agents checked the remote was private and nothing was left uncommitted. On the Mac:

Rocco's part. Choices between options the agents set out (Rust + wgpu over C++, time-slicing the release, one Worker instead of Pages plus a second Worker, the short domain). Approvals for anything outward-facing: deploys, account changes, the TestFlight submission. And the hands-on steps: installing Xcode, pairing and trusting the iPad, and clicking Create on the API token in person, so the secret never appeared in an agent's screenshots.

Tests first, as the spec

Before any feature code, the main agent wrote the constraint tests against stubbed APIs. All 10 Vitest cases failed with "not implemented", as intended, and went to Rocco for review. They pin the sole (byte-identical, 3,161 seam vertices fixed, upper still sealed), exact undo, memory with 100 max-radius undo steps, reload, op size, the frame budget and picking after an edit, plus a Playwright test for context loss and reload. The wasm agent ported the same tests to Rust. The two agents agreed the op bytes and the rounding rule before either wrote an implementation. Later tests followed the same order: test 9 (no tears) failed on the old code before the fix.

Measure, then decide

The design started from measurements of the shoe. A 60 mm brush touches about 62k upper vertices. Naive undo would need about 170 MB for 100 steps, so edits became a bitmask, 16-bit weights and one integer vector, about 147 KB each. The memory budget at that point was marked as an estimate.

Several plans were dropped because of a number:

How work was checked

Steering and mistakes caught

One loosening, stated plainly: the frame-budget test was first isolated in its own run with the assertion kept strict, then given one retry after failing once at a load average of 21.8 (other agents' builds, a simulator).

Cut, and not yet verified