· Claude Fable 5.1 + Claude Code · Same prompt: a million-particle shape morph

DNA, galaxy, torus knot, 3D text: Fable 5.1 + Claude Code morphing a million points

The same shape-morph prompt, run by Fable 5.1 inside Claude Code: 65 turns, 64 tool calls, $4.68. Each of the four iterations records what it fixed — blown-out whites, a torus knot the camera flattened into a figure eight, transitions that looked like uniform fog, and clipping in a narrow viewport.

A DNA double helix formed from a million particles, in a blue-violet gradient against a dark background
Run the demo WebGL · uses your GPU
drag to orbit · scroll to zoom · space to pause · 1/2/3 for palettes Open full screen ↗

The on-screen labels are in Chinese: this is the model's verbatim output from an experiment run in Chinese, and editing it would make the artifact something other than what was measured.

How it was made

Model
Claude Fable 5.1 + Claude Code
us.anthropic.claude-fable-5-1
How
agent loop
Claude Code 2.1.266
Reasoning effort
high
Turns
65
Tool calls
64
Output tokens
52.5k
Wall time
17m 48s
Cost
$4.68
Artifact
598 lines, one file
Error feedback
none

The four shapes are a DNA double helix (t=2), a spiral galaxy (t=8), a torus knot (t=14) and extruded text reading ASTRA (t=20), with transitions at t=5 / 11 / 17 / 23 where the scatter-and-reassemble is visible. A million particles; the det=1 determinism check passed three times out of three.

Every one of the four iterations fixed something that could only be found by rendering the frame:

  1. Everything worked, but additive blending blew out, the DNA washed to white and the dust was too dense. Per-particle brightness went from 0.28 to 0.075.
  2. At t=14 the camera happened to view the torus knot side-on, flattening it into a figure eight. The knot was rotated 90° about Y and tilted slightly, particles pushed toward the tube wall; since the four shapes differ wildly in density, per-shape brightness compensation was added.
  3. Transitions looked like uniform fog. Per-particle stagger was raised to 50% and the scatter made more radial and smaller in amplitude, so fragments of both the source and the target shape are visible mid-transition.
  4. Accent colour ratios were tuned and FOV adaptation added to hold horizontal field of view on narrow viewports, then a final regression pass.

Item 2 is the one that makes the point: “the torus knot reads as a figure eight from this camera angle” is not something a static check can find, and not something a model avoids by thinking harder — it has to draw the frame and see it before it knows to rotate 90°.

Implementation: the four sets of target positions are generated once on the CPU with a fixed-seed mulberry32 and stored in position / aP1 / aP2 / aP3; the text shape is drawn to an offscreen Canvas2D, sampled per pixel and extruded, with a fallback for when the font is missing. Shape index, progress, easing, scatter, noise perturbation, colour and perspective sizing are all computed in the vertex shader from uTime. Resting states sit at mean luminance 0.04–0.06 and transitions at 0.09–0.11 — neither a black frame nor a bloom-washed one.

Controls: drag to orbit, scroll to zoom, space to pause, 1/2/3 for palettes (including Solar Ember and Deep Ocean), ?t= to stop at any moment.

Same prompt, other runs

three.js r170 is served from this site, so running a demo makes no third-party request. Published by the author as an individual; testing was self-funded and nothing here represents an employer's position.