---
title: "phygen"
description: "An agent-driven research environment for evolving executable artworks, with versioned code, visual feedback and an evaluation pipeline that can be inspected."
url: "https://anfischer.com/work/phygen/"
date: "2026"
updated: "2026-10-20"
---

# phygen

An agent-driven research environment for evolving executable artworks, with versioned code, visual feedback and an evaluation pipeline that can be inspected.

## Key facts

- **Year:** 2026
- **Role:** Concept, system design, development
- **Tools:** Coding Agents, Evaluation Design, Creative Tools

<div class="phygen-doc">

<p class="phygen-meta">Independent research / System design, agent orchestration, evaluation and interface</p>

<p class="lede">I built phygen to explore how a coding agent can change a visual system over many iterations without losing the link between source code, rendered output and evaluation.</p>

The starting point is a seeded physarum simulation: particles sense and deposit trails, producing a changing transport network. Agents edit its JavaScript simulation, renderer and configuration. The result is a lineage of executable programs, not a folder of generated images.

<p class="phygen-meta">Node.js / React &amp; TypeScript / SQLite / three.js / Playwright</p>

<div class="phygen-examples phygen-examples--pair">
  <figure>
    <a class="phygen-figure-link" href="/images/projects/phygen/selected/master/002.webp" target="_blank" rel="noopener noreferrer" aria-label="Open the radial transport network at full size in a new tab">
      <img src="/images/projects/phygen/selected/master/002.webp" alt="Fine white trails branching from a dense central transport network against a black field" width="600" height="600" loading="lazy" decoding="async" />
    </a>
    <figcaption>Radial transport network</figcaption>
  </figure>
  <figure>
    <a class="phygen-figure-link" href="/images/projects/phygen/selected/slotmachine/160.webp" target="_blank" rel="noopener noreferrer" aria-label="Open the light-field network at full size in a new tab">
      <img src="/images/projects/phygen/selected/slotmachine/160.webp" alt="Dark branching trails radiating across a white field, with fine marks gathered at the perimeter" width="600" height="600" loading="lazy" decoding="async" />
    </a>
    <figcaption>Light-field network</figcaption>
  </figure>
</div>

<p class="phygen-examples-note">Two saved versions of the simulation, with different approaches to density and contrast.</p>

## From a judging tree to a forward chain

Early iterations generated three variants per step and used a blind vision judge to rank their captures. A subsequent version added novelty thresholds and an archive for choosing parents. This exposed the central design problem: a more elaborate selection procedure was not, by itself, a better definition of artistic quality.

<figure>
  <a class="phygen-figure-link" href="/images/projects/phygen/screenshots/02-radial-rings.webp" target="_blank" rel="noopener noreferrer" aria-label="Open the early variant comparison interface at full size in a new tab">
    <img src="/images/projects/phygen/screenshots/02-radial-rings.webp" alt="Two colored cellular network variants in the early graph interface, with the selected agent's source-change explanation in the right-hand inspector" width="1800" height="952" loading="lazy" decoding="async" />
  </a>
  <figcaption>Tree-era comparison: candidate renders and source-change explanations share one graph, so visual differences can be read alongside the agent's intent.</figcaption>
</figure>

I then removed the ranking stage. Each step made one child of the newest working version and retained it if technical checks passed. That reduced candidate fan-out and made the history easier to follow, without treating a model's preferred image as proof of progress.

<figure>
  <a class="phygen-figure-link" href="/images/projects/phygen/fig-approaches.svg" target="_blank" rel="noopener noreferrer" aria-label="Open the tree and chain comparison at full size in a new tab">
    <img src="/images/projects/phygen/fig-approaches.svg" alt="Two research iterations: three variants ranked by a vision judge, and one candidate retained after technical validation" width="1120" height="480" loading="lazy" decoding="async" />
  </a>
  <figcaption>Two research iterations, not an A/B benchmark. The forward chain removed automatic ranking; it did not guarantee aesthetic improvement. Open the diagram to inspect it.</figcaption>
</figure>

## Make every change inspectable

Each step works on a copy of its parent, receives recent rendered frames, and is checked against the allowed edit surface and package contract. The controller publishes an immutable, content-addressed snapshot before rendering a fixed-seed, fixed-step sample.

<figure>
  <a class="phygen-figure-link" href="/images/projects/phygen/fig-snapshot.svg" target="_blank" rel="noopener noreferrer" aria-label="Open the snapshot and capture pipeline at full size in a new tab">
    <img src="/images/projects/phygen/fig-snapshot.svg" alt="A working copy passes validation, is published by content hash, is verified and then rendered under a fixed seed and step count" width="1120" height="320" loading="lazy" decoding="async" />
  </a>
  <figcaption>The capture comes from the published snapshot, not a workspace that may still be changing. Source hashes tie the visual result to the code that actually ran.</figcaption>
</figure>

SQLite connects versions, captures, agent notes and usage. A replayable event stream exposes progress in the interface. Correctable faults get one bounded repair attempt; a failed step does not replace the last working version.

<figure>
  <a class="phygen-figure-link" href="/images/projects/phygen/screenshots/13-doc-centred.webp" target="_blank" rel="noopener noreferrer" aria-label="Open the live agent activity interface at full size in a new tab">
    <img src="/images/projects/phygen/screenshots/13-doc-centred.webp" alt="A large violet and orange network render beside a live agent feed listing file reads, edits, writes and usage counts" width="1700" height="1020" loading="lazy" decoding="async" />
  </a>
  <figcaption>An early run in progress: the active render stays beside the live agent feed, file operations and usage counters.</figcaption>
</figure>

Generated code is treated as untrusted. The browser preview uses a separate artwork origin, a script-only sandboxed iframe and a restrictive content security policy. This is a browser boundary, not a substitute for the stronger container capture mode.

<figure>
  <a class="phygen-figure-link" href="/images/projects/phygen/screenshots/07-frames-grid.webp" target="_blank" rel="noopener noreferrer" aria-label="Open the captured-frame overview at full size in a new tab">
    <img src="/images/projects/phygen/screenshots/07-frames-grid.webp" alt="An overview of captured network variants in light and dark palettes, with candidate states and an agent explanation visible in the original tree interface" width="1800" height="928" loading="lazy" decoding="async" />
  </a>
  <figcaption>Captured versions in the original tree interface. The overview makes repeated structures and changes in palette visible across a run.</figcaption>
</figure>

## Calibrate the gate, not a claim about taste

Later work added image measurements for coherence, novelty and failure diagnostics, with a blind vision judge reserved for borderline cases. Thresholds were fitted from **124 saved versions**, captured at 1024 x 1024, seed 1337, step 1000.

The gate defaults to warning mode: it records verdicts without rejecting versions. Evaluation becomes a visible, adjustable layer rather than an unexamined source of authority. This calibration uses known-kept frames, not a held-out human-preference benchmark. Cross-driver image reproducibility also remains unmeasured.

<div class="phygen-examples">
  <figure>
    <a class="phygen-figure-link" href="/images/projects/phygen/selected/master/126.webp" target="_blank" rel="noopener noreferrer" aria-label="Open the dense cellular mesh at full size in a new tab">
      <img src="/images/projects/phygen/selected/master/126.webp" alt="A dense web of fine gray filaments enclosing irregular cells against black" width="600" height="600" loading="lazy" decoding="async" />
    </a>
    <figcaption>Cellular mesh</figcaption>
  </figure>
  <figure>
    <a class="phygen-figure-link" href="/images/projects/phygen/selected/slotmachine/237.webp" target="_blank" rel="noopener noreferrer" aria-label="Open the fragmented network at full size in a new tab">
      <img src="/images/projects/phygen/selected/slotmachine/237.webp" alt="Pale green and white network fragments layered across a dark field, interrupted by open cells and a luminous green accent" width="600" height="600" loading="lazy" decoding="async" />
    </a>
    <figcaption>Fragmented network</figcaption>
  </figure>
  <figure>
    <a class="phygen-figure-link" href="/images/projects/phygen/selected/slotmachine/256.webp" target="_blank" rel="noopener noreferrer" aria-label="Open the layered color trails at full size in a new tab">
      <img src="/images/projects/phygen/selected/slotmachine/256.webp" alt="Branching white trails and luminous clusters layered over violet, red and orange fields" width="600" height="600" loading="lazy" decoding="async" />
    </a>
    <figcaption>Layered trails</figcaption>
  </figure>
  <figure>
    <a class="phygen-figure-link" href="/images/projects/phygen/selected/slotmachine/270.webp" target="_blank" rel="noopener noreferrer" aria-label="Open the cyan cellular field at full size in a new tab">
      <img src="/images/projects/phygen/selected/slotmachine/270.webp" alt="Translucent cyan and blue cellular layers crossed by fine green trails" width="600" height="600" loading="lazy" decoding="async" />
    </a>
    <figcaption>Cyan cellular field</figcaption>
  </figure>
  <figure>
    <a class="phygen-figure-link" href="/images/projects/phygen/selected/slotmachine/284.webp" target="_blank" rel="noopener noreferrer" aria-label="Open the geometric field at full size in a new tab">
      <img src="/images/projects/phygen/selected/slotmachine/284.webp" alt="A blue geometric field of polygonal cells crossed by a fine yellow-green network" width="600" height="600" loading="lazy" decoding="async" />
    </a>
    <figcaption>Geometric structure</figcaption>
  </figure>
  <figure>
    <a class="phygen-figure-link" href="/images/projects/phygen/selected/slotmachine/290.webp" target="_blank" rel="noopener noreferrer" aria-label="Open the interwoven field at full size in a new tab">
      <img src="/images/projects/phygen/selected/slotmachine/290.webp" alt="A dense web of luminous white and cyan trails woven through angular blue, violet and pink fields" width="600" height="600" loading="lazy" decoding="async" />
    </a>
    <figcaption>Interwoven fields</figcaption>
  </figure>
</div>

<p class="phygen-examples-note">Selected saved versions show the range of the evolving program, not a ranking of artistic quality.</p>

## What the project established

The useful unit of creative agent work is not the prompt. It is the executable change together with its render, provenance, cost and failure record. phygen brings those pieces into one environment so that the system can be debugged and its evaluation choices questioned.

<p class="phygen-related">Related: <a href="/work/autonomous-generative-studio">A-GEN</a> explores explicit human selection in an agent-driven studio.</p>

</div>
