Ryan Kamp

I build graphics software by setting the vision, directing coding agents and testing by hand. This sheet is that loop at desk size. Pick a toy from Splashery’s kit and a loop graph from grooph: a builder drafts the toy in Gaussian splats, a check measures it, and the graph says where the work stops. Sometimes it stops at you.

Toy
A toy drawn in pencil from Gaussian splats.
Drag to turn it. Tap it to leave a red-pencil note: more here.
Loop graph
fail reject with feedback Merge approval Done Builder Critic You

A loop graph. The builder hands work to the critic. A failed check sends it back to the builder. When the bar is met the work stops at a person, who approves it or rejects it with feedback.

  • the bar is met
  • rounds 0 of 4
  • dispatches 0 of 10
  • a person, at Merge approval
Drawn from graphs/review-gate.grooph.json: grooph’s review-gate template, filled in for this sheet. Open it in grooph.

The builder is drafting revision A.

Build log

  1. A·1builder640 splats on a torus, placed uniformly in angle.
PartKit shapeAreaSplats
bodytorus(1, 0.42)16.58640
Total640 of 640
The budget is shared by surface area, in whole splats. On every toy here, for every budget from 1 to 300,000, the parts sum to it exactly and none is a splat off its share. Uniform angles crowd the inside of the hole by (πR + 2r) / (πR − 2r), about 1.73 here. The check.
Title
Donut, from splats
Rev
A
Graph
Review gate, from review-gate@1
Drawn
builder (a script)
Checked
in progress
Approved
not yet
Sheet
1 of 5, this wide

On this sheet the builder and the checks are script, and the builder’s first drafts of the first two parts are wrong on purpose, so there is something to catch. The harness that walks the graph is script too. It counts rounds and dispatches the way grooph’s documentation describes, and it does not time minutes or judge diminishing returns. In Splashery the builders and critics are coding agents, the harness is Claude Code, and the person at the gate is me.

Sheet 2 of 5

Splashery

Splats you can play with.

An interactive Gaussian splat playground that runs entirely in the browser. Pick a toy, a real captured object or one generated from a seed, then spin it, poke it, blow on it, splash paint on it, drop it, watch it fall apart and come back, make your own, and share it as a link, an embed, a GIF or a video.

My part. I defined the project vision and toy categories, directed multi-agent development, refined interaction design through hands-on testing, and contributed selected mathematical recipes.

The building is done by coding agents. Splashery’s repository keeps its own loop graph: a worker builds a lane, the full test run and a clip review send it back until the work is right, and anything the public already sees waits behind a human gate. That gate is where I sit.

Loads Splashery’s own embed player from its site: the engine, a few megabytes. Nothing loads until you ask.

Not a screenshot: the live player its README documents for any page, showing the toy picked on sheet 1. All four are on Splashery’s shelf: Donut, Saturn, Ice cream and Torus knot.

One kit, shared by area

Splashery’s toy kit builds a toy from shapes and shares the splat budget between them by surface area, so the whole toy has an even density. The four toys on sheet 1 are built from seven of its shapes, and shared out the same way.

No build step

files browser build step: none

Static files and ES modules only. No bundler, no framework, no server, no API keys. Rendering is the PlayCanvas engine, vendored, on WebGPU when the browser has it and WebGL2 otherwise.

Every splat, every frame

Poke, wind, dissolve, drop, magnet, twist, slice and paint all run on the GPU for every splat, every frame. The CPU only sets a few uniforms. Effects stack.

Sheet 3 of 5

grooph

Loop graphs for coding agents.

Operatorbriefs Workerbuilds Test runcheck Operatorreviews Owner public fail: back to the worker Stops: bar passed · 4 rounds · 24 dispatches · a person This loop names no stop. grooph’s check fails it.
Part of the lane loop Splashery keeps in its repository, docs/lane-loop.grooph.json. The branch for work that stays in labs is left off this drawing.

Visual loop graphs for coding-agent workflows. You, or an agent working with you, draw who builds, who checks, where a person decides and when the work stops. grooph checks that every loop names a stop and every bar names what a critic can inspect, then compiles the graph into a prompt package for a separate coding-agent harness. It runs no agent and calls no model, and graphs stay on your device.

My part. I implemented a multi-agent pipeline and refined a visual tool for expressing builder/checker roles, human decision points and stopping conditions in coding-agent workflows.

Limits, from its own README

“No round cap or budget is on record as firing, so it is not shown that one holds a run that would otherwise go on. In a paired comparison on four small tasks the package showed no quality advantage over a prompt derived from it.”

The five graphs on sheet 1

Each is one of grooph’s built-in templates with its blanks filled in for the drawing, saved here as a graph document. grooph validate --for-export finds no errors in any of them; the two warnings are printed below as it gave them. The round cap in the review gate is one a visitor can make fire: keep rejecting the drawing, and the run halts at four rounds.

GraphUse it whenStops it namesgrooph validateOpen
Review gate The work needs a second pair of eyes against a checklist that already exists, and a person signs it off. bar met · 4 rounds · 10 dispatches · a person 0 errors, 1 warning W_HOMOGENEOUS_CRITICS: the critic judges the builder on the same model tier file in grooph
Grind loop Done and good are the same thing: a passing test is the finish line, and nobody is asked. 5 rounds · 30 minutes no issues file in grooph
Metric sandwich Cheap deterministic checks come first, so the critic spends its round only on what those cannot see. bar met · 5 rounds · 16 dispatches no issues file in grooph
Spec, then loop Nothing exists to compare against, so a planner writes the answer key first and a person approves it. a person, before the build · bar met · 4 rounds · 10 dispatches 0 errors, 1 warning W_HOMOGENEOUS_CRITICS: the critic judges the builder on the same model tier file in grooph
Ralph loop The work is already a list of small items a test can check one at a time. The template credits Geoffrey Huntley’s ralph loop. no progress for 2 rounds · 5 rounds · 17 dispatches no issues file in grooph

The test command they name is real: tools/measure.mjs measures what the critic on sheet 1 measures. So is the checklist, graphs/CHECKLIST.md.

Sheet 4 of 5

The drawer

Other things I have built, filed flat.

reword_nerd

A local-first browser workbench that turns a reviewed document, or a set of images, into a portable workbook of rewriting prompts. Everything stays reviewable in the browser, the download is a separate, explicit step, and the application contacts no model provider itself.

Its Manual workflow runs four stages, each response feeding the next prompt. Change a response upstream and the prompts you edited downstream are kept and marked stale until you reapply or reset them. Tap a stage to change its response.

Link Meteor

A Chrome extension that collects links with their anchor text and URL in separate fields, for reviewing sources and exporting a research collection. No account, ads, telemetry or backend.

Anchor text
Website
URL
https://ryanjosephkamp.github.io/link-meteor/

Point at any link on these sheets, or step through them.

The Speed-Accuracy Trade-Off in Perceptual Decision-Making (April 2025). My undergraduate research capstone. It models evidence accumulation as a diffusion process and uses dynamic programming and value iteration to study decision boundaries in a simulated autonomous-vehicle obstacle-avoidance scenario. Code · video