Cover photo

Colony Morph: Implementing a Cybernetic Organism in Raw WebGL

Technical Specification

Transmutation [XL] - SETHIX - (Colony Morph)

Contract/token: 0x71eb648bdd6ebb161dcda890dfadd1d28972ea42/40

post image
Colony Morph (Transmutation XL)

Substrate Transmutation

Is the successive replacement of the generative ground itself: not merely animating or displacing an existing form, but discarding one mathematical and computational substrate for another while the visual object remains recognisably continuous and still executes as a single raw WebGL2 program.

Early modules such as Transmutation III still live on the classical substrate. An icosahedral mesh (or geodesic sphere wireframe) is constructed once; vertices are then displaced by multi-octave noise or multi-frequency sinusoids; edges are redrawn every frame. The geometry is discrete, the topology fixed, the deformation local and additive. The result is an organic blob or morphing polyhedral cage whose motion is a function of time and intensity parameters. Lighting is conventional; there is no internal state beyond a handful of scalars. The code is already elegant and self-contained, yet the substrate remains Euclidean mesh + procedural displacement.

post image
Transmutation III

The later modules abandon that substrate. Geometry ceases to be a list of vertices. It becomes an implicit scalar field evaluated by ray-marching. The icosahedral group is no longer approximated by connectivity; it is constructed exactly—either from invariant polynomials (ICOSA Morph) or by kaleidoscopic reflection across the three walls of a Möbius triangle (Colony Morph). A single fundamental domain occupying 1/120 of space is folded into the full order-120 (or chiral order-60) colony; one strut drawn between two domain corners unfolds into an entire polytope wireframe. A six-wave icosahedral quasicrystal, proven invariant under the same fold to machine precision, supplies aperiodic beading, nucleation sites and bloom membranes. Symmetry itself becomes a continuous coefficient: a parity-signed twist gated so that the field remains continuous across every mirror plane.

At this point the form is no longer a deformed object but a living field. Colony Morph then adds the cybernetic layer that turns the field into an organism. Twenty-four nodes in five chains follow a plateau gait; a 35-dimensional coefficient vector drifts among twelve attractors under a four-axis mood system running on its own proper time; phases (DWELL, SURGE, CRISIS\ldots) are selected by fatigue, novelty hunger and history. Because the morphospace is violently anisotropic in perceptual units—one coefficient can move the image 116 times more than another—a three-layer governor measures actual rendered change, throttles interest, damps recent windows, and, as a hard architectural guarantee, rolls the entire state (coefficients, nodes, mood, camera, RNG) back if any frame exceeds its budget. The surface is a four-channel fluorescence model whose material states share no structure, so transitions are genuine first-order phase changes rather than cross-fades.

Thus the evolution is not progressive embellishment. Each major step replaces the substrate: discrete mesh → continuous group-invariant field → quasicrystalline + affective dynamics governed in measured perceptual units. The final organism still occupies a single fullscreen triangle, still requires no external assets or libraries, and still remains fully reproducible from a 32-bit seed. What has been transmuted is the ground on which the form is defined, computed and experienced.


post image
post image
post image
post image

Colony Morph (Transmutation XL) is a Liquid Nano Colony (from earlier SETHIX Transmutations) put through the ICOSA Morph (Transmutation XXXVIII) machinery, and then given something neither of them had: a speed limit measured in what a viewer actually sees.

Where ICOSA Morph built the icosahedral group out of invariant polynomials — power sums over the six five-fold axes, a five-term polynomial in c6 and c10 — this module builds the same group by reflection. Three mirror planes, a kaleidoscopic fold into 1/120 of space. The organism is genuinely one small fragment: a few tendril chains and a seed blob living inside a single Möbius triangle, mirrored into a fully symmetric colony. Adding one branch adds 120.

The two routes agree exactly. The six-wave icosahedral quasicrystal is invariant under the fold — measured here over 4000 random points in the ball at qk = 11, max |Q(fold p) − Q(p)| = 6.4 × 10⁻¹⁴; the figure is wavenumber-dependent and the source comment records 2.2 × 10⁻¹⁴ from its own run — so the aperiodic field and the kaleidoscope can be layered without fighting, and the quasicrystal can be evaluated unfolded, at six cosines, landing in perfect register with the mirrors.

What is new here is that symmetry itself is a coefficient, and that speed is measured in perceptual units.


The space

The fundamental domain

Twelve icosahedron vertices, from which the code takes one five-fold axis V5, the centre of an adjacent face F3 (a three-fold axis) and the midpoint of an edge between them E2 (a two-fold axis). Those three directions are the corners of a Möbius triangle — exactly 1/120 of the sphere. The three mirrors M1, M2, M3 are the normals of its walls.

The angles are exact icosahedral constants and the module checks them at startup:

corner pair

measured

meaning

V5 · F3

0.794654

vertex to face centre

V5 · E2

0.850651

vertex to edge midpoint

F3 · E2

0.934172

face centre to edge midpoint

0.79465 shows up again inside the fragment shader. The aster — the radiating fluorescent label — is

glsl

pow(clamp((m5 - 0.79465) * 4.8698, 0.0, 1.0), 5.0)

where m5 is the largest |u·a| over the six five-fold axes. That is exactly zero at the face centres and exactly one at the vertices, because 0.79465 is the face-centre value and 4.8698 = 1/(1 − 0.79465). The fluorescence answers the geometry rather than being painted over it.

Folding converges completely by six iterations — max deviation from a 24-iteration reference across 20 000 directions is exactly 0.0. The shader runs seven and the CPU mirror runs eight; both are margin.

Symmetry as a coefficient

At chi = 0 the organism is exactly I_h, order 120, mirrors included. Raise chi and a parity-signed rotation about the domain-centre axis breaks the mirrors, leaving only the 60 rotations — the chiral subgroup I. The rotations stay exact at every value of chi.

The trick that makes it continuous is the gate. The twist amplitude is

w = max( (u·M1)(u·M2)(u·M3), 0 ) / bumpPeak

a bump that vanishes identically on all three domain walls. Opposite-parity neighbours therefore meet at zero twist and the field stays continuous across every mirror. Measured: the maximum value of that gate evaluated on a domain wall, over 6000 sampled wall directions, is 1.2 × 10⁻¹².

So the organism can slide continuously between a mirror-symmetric body and a handed one, mid-transition, without ever tearing.

The quasicrystal

Q(p) = Σ cos(k · aᵢ · p) over the six five-fold axes, with two optional inflation octaves at k·λ and k·λ². Six five-fold vectors cannot tile space, so the interior is genuinely aperiodic and never repeats.

The inflation factor λ is drawn per load from φ, φ², 2, φ^1.5 — 1.6180, 2.6180, 2.0000, 2.0582 — the quasicrystal's own inflation symmetry rather than a cubic doubling.

Q does three jobs: it beads the tendril radius (bq), it carves a bloom (qb), and it nucleates node positions (qn). sup|Q| = 6(1 + q₁ + q₂) exactly, attained only at the origin, which is what makes qb = 1 provably inert and the branch that skips the whole bloom block exact rather than guessed.

The bloom has two readings of the same field, mixed by qs: blobs, solid where Q rises above a fraction of its own supremum, and sheet, solid where |Q| sits near its zero set — the quasicrystalline membrane. Both are intersected, not summed, with a radial confinement.

35 coefficients

group

coefficients

chain reach, five chains

br bF bC bD bE

tube scale, wave, beading, join smoothness, curl

bt bw bq bj bs

node bias in the domain corners

nV nF nS

seed blob radius, faceting

sr sf

quasicrystal: wavenumber, two octaves, nucleation, bloom gate, bloom smoothness

qk q1 q2 qn qb qw

condensates: icosa, dodeca, icosidodeca, inner nest, radius, strut width

pI pD pX pN pR pW

chirality

chi

fluorophore epoch

mm

two phase thresholds

hA hB

exposure

ex

bloom blobs ↔️ sheet

qs

fluorescence feature scale

fs

stain-matrix rotation

sm

Node bias is a barycentric point in the domain triangle and is constrained to stay inside it (nV + nF ≤ 0.94).

The condensates are the module's inheritance from the Nano Colony's central event: one straight strut drawn between two corner directions of the domain unfolds into a complete polytope wireframe. V–E gives the icosahedron, F–E the dodecahedron, V–F the icosidodecahedron; pN adds an inner nest at 0.56 of the radius. Presence erodes the strut by adding (1 − gate) · 0.75 to its distance rather than scaling its radius, because a tube of zero radius is still a line at distance zero and the marcher keeps finding it.

The twelve attractors

SWARM · TENDRIL STORM · DORMANT CLUSTER · LATTICE · CRYSTAL BLOOM · POLYTOPE NEST · ICOSA CAGE · DODECA CAGE · QUASI SHELL · VORTEX · MEMBRANE · SEED

They are attractors in the space, not models. Everything between them is a valid unnamed organism. Each carries a mood signature (arousal, order, turgor, cohesion) and a calm rating that decides whether a tired organism is drawn toward it.

Measured on the shipped build, seed 12345, sorted by strain:

state

strain

area

solid

reach

grad

Ψ

camR

SEED

0.012

0.13

0.0156

1.25

1.103

0.04

2.03

QUASI SHELL

0.061

0.67

0.0117

1.37

0.984

0.18

3.68

DODECA CAGE

0.062

0.69

0.0137

1.30

0.987

0.18

3.56

ICOSA CAGE

0.104

0.63

0.0137

1.30

0.975

0.31

3.56

LATTICE

0.131

0.89

0.0176

2.87

0.977

0.41

3.51

POLYTOPE NEST

0.135

1.30

0.0156

3.39

0.966

0.47

3.63

SWARM

0.173

1.67

0.0352

2.31

0.902

0.51

3.17

DORMANT CLUSTER

0.232

0.65

0.0430

1.39

0.864

0.68

2.47

TENDRIL STORM

0.314

2.06

0.0293

3.37

0.879

0.99

4.44

CRYSTAL BLOOM

0.371

1.26

0.0195

3.78

0.820

1.20

2.77

VORTEX

0.436

1.74

0.0391

2.02

1.035

1.28

3.15

MEMBRANE

0.675

2.93

0.1230

2.05

1.113

1.99

4.08

The cages sit near the bottom of the strain table despite being the most legible forms, and MEMBRANE tops it — which is the point. Strain measures departure from a clean interface, not visual busyness.


The perceptual metric

This is the part of the module that matters most, and it can be stated in one sentence: the morphospace is not perceptually isotropic, and every speed problem in this piece came from pretending that it is.

SENS[k] is the measured mean absolute change in rendered pixel value produced by moving coefficient k one normalised unit — forward differences at 8% of each axis range, pooled over eleven states chosen so every gated structure is switched on in at least one of them.

The shipped table runs from 1.6 (pN, the inner condensate nest) to 185.6 (qk, the quasicrystal wavenumber): a span of 116×. Moving qk one unit changes the image 116 times more than moving pN one unit. A morph that crosses the space at constant coordinate speed therefore crosses it at wildly varying perceptual speed, and it is fastest exactly where the quasicrystal and the condensates are engaged — which is where the interesting geometry lives. That is the whole bug, in one table.

(The comment in the source says 119×; recomputed from the shipped values it is 116.0×. Noted so the figure is not mistaken for a second measurement.)

But the rendered image is not a function of the coefficient vector alone. It also depends on the 24 node positions, the four mood values that feed the shader directly, and the camera radius. Measured the same way, by rendering:

channel

dRGB per unit

max over states

node displacement

868 per unit RMS

1234

camera radius

426 per unit relative change

549

mood, any axis

36 per unit

camera orbit

18 per wall-second at spin 0.150

The constants shipped are KN = 1000, KC = 480, KM = 36.2 — set slightly above the measured means, at roughly the max-over-states, because a limiter should err toward braking.

The first version of the limiter watched the coefficients only. On a 20-minute trace the coefficients turned out to be 1.1% of the fastest 1% of frames; the nodes were 72.3% and the camera refit 23.2%. It was throttling one per cent of the problem.

Perceptual distance is L1, not L2: different axes disturb different parts of the image, so their contributions add rather than combining in quadrature — and where they do overlap, L1 over-counts, which is the safe direction for a limiter.


The governor

A CPU mirror of the field, sampled every 180 ms of throttled time — the accumulator advances on h, not on wall seconds, so a heavily braked organism probes less often — on a fixed 512-point R3 low-discrepancy set in the ball — fixed rather than random, so the estimate is a smooth function of the coefficients and the controller sees signal instead of Monte-Carlo noise.

It returns solid fraction, co-area surface density, interface gradient mean and variance, and two radii.

strain = σ(|∇F|)/µ(|∇F|)  on the interface band, weighted by octave content
reach  = rmax / max(solid^(1/3), 0.06)
Ψ      = strain/0.340 + 0.240 · max(0, reach/2.601)

A clean surface has near-constant |∇F|; a strained one varies wildly. Reach-per-unit-mass is the second half: a colony stretched thin is strained in a way a shell is not.

Two radii, two jobs. The 88th percentile of the solid samples' radius is where the body is; the maximum is where the last spike reaches. Framing on the bulk and merely constraining with the tip is what lets a spiky organism sit large in the frame instead of reading as a small knot in a lot of black. A 98th percentile is carried as well, as a backstop for the bloom shell, which has no analytic framing term and can precipitate anywhere inside its confinement.

The probe informs the organism, and reaches the renderer only through a low-pass. Anything the probe touches that also reaches the shader becomes a small visible step every probe tick. Two things do reach it: gradS, which sets the march step multiplier, and the camera radius. Both are heavily smoothed — gradS on a 2.6 s time constant, camR through the rate-limited refit — so neither carries the tick through to the image. uBound is the only shader input that is genuinely probe-free. The marcher's bounding radius is therefore analytic from the coefficients, and its two structural gates — chain growth and the condensate cage — are smoothsteps, because a hard test there jerks every ray's start point. One hard test does survive; see the known issues.


The speed limiter

Three layers, and the third is a guarantee rather than a tendency.

Layer 1 — interest

Ten smooth terms, each already computed elsewhere in the module, so it costs nothing:

term

reads

pooled mean

gI

the governor's Ψ

0.578

dI

structural density (smoothed gradient)

0.635

qI

quasicrystal engagement

0.403

cI

condensation, hybrids weighted extra

0.314

nI

novelty — spread from its own running mean, rarity of the target

0.816

tI

transitional — the middle of an event, where the hybrids live

0.474

xI

chirality

0.203

kI

the gait, when the staircase is pushing

0.421

fI

material density and proximity to the percolation point

0.562

vI

mood velocity

0.548

Recentred and stretched — (raw − 0.625) · 2.391, clamped to [0, 1.50] — so the scale is actually used. Then

brake = max(0.22, 1 / (1 + 0.92 · interest^2.90))

The exponent is what makes it selective. Without it the whole piece just runs slow. Applied over 0.30 s, released over 3.40 s: deliberately quick to brake, slow to let go.

Layer 2 — the window damper

Independent of every model above. It watches what actually reached the screen over the last 2 s and the last 12 s and damps until both are under their caps (16.0 and 13.0 dRGB/s). It knows nothing about mood, interest, phase or geometry. A model can be wrong about a regime it has never seen; an outcome cannot.

Layer 3 — the hard clamp

Step the whole organism, measure the complete visual state against a snapshot, and if the frame moved more than its budget, roll everything back — coefficients, nodes, mood, camera, phase, fatigue, the visit counters, and the random generator — and take a smaller step.

This is what makes it architectural. Layer 3 sits below the Bézier, the wobble, the free drift, constrainVec, the gait, the mood integration and the camera refit. There is no path by which any of them can put an over-budget frame on screen. The only cost of being wrong about layers 1 and 2 is that layer 3 does more work.

The generator's state lives outside its closure precisely so this can happen: a rejected frame must not consume entropy, or the piece stops being reproducible from its seed.

Measured over six seeds × 900 s:

hard-clamp retries per frame:   1×  94.11%     2×  5.89%
frames exceeding budget:        0.00%

The feedforward from the last measured rate is right first time in 94% of frames, and the clamp has never let an over-budget frame through.

Pooled distributions over 5400 s:

quantity

p10

p50

p90

p99

max

interest

0.000

0.449

1.231

1.500

1.500

brake

0.364

0.893

1.000

1.000

1.000

damp

0.790

0.876

1.000

1.000

1.000

vNow, dRGB/s

6.56

14.15

16.94

18.82

21.01

cap, dRGB/s

7.57

15.76

18.30

20.89

21.00

Ψ

0.322

0.654

1.395

1.911

2.897

21 600 samples per column. vCap is 21.0 and the organism spends most of its life at roughly two thirds of it.

The observed maximum of 21.01 is not a leak; it is the accept tolerance. The clamp accepts at d ≤ budget · 1.005 and only counts a clip at d > budget · 1.02, so "0.00% of frames exceeded budget" is exact to the counter's definition — a frame may legitimately land half a per cent over without triggering a retry. The loop also exits after maxRetry = 6 attempts regardless, though in 21 600 samples it never needed more than two.

For scale: the camera's constant orbit alone measures 18 dRGB/s and nobody finds that unpleasant, because it is rigid. Non-rigid change at the same rate is not the same experience, which is why the cap sits below it.


The nodes and the gait

24 nodes in five chains — one of eight, four of four. The first twenty each take a direction that is a barycentric coordinate in the fundamental triangle, driven by the plateau staircase gait: hold flat for (1 − w) of each cycle, then advance a whole unit over the remaining w. The last four are placed differently — anchored at the midpoint of nodes 3 and 4 of the first chain and reaching along a drifting combination of F3 and E2, with no V5 component and no domain constraint of their own.

plateau is drawn per load from 0.38–0.66, giving a peak-to-mean rate of 2.27× to 3.95×. An earlier range of 0.14–0.30 gave 5–11×, and gaitC sums two staircases whose periods beat every ~78 proper-seconds — which is where the two-minute hyperspeed bursts came from.

The gait runs on proper time, so an aroused instance genuinely lurches faster.

Nucleation. When qn > 0.01 each node takes four gradient-ascent steps on the quasicrystal. The step is fixed-length, not proportional to the gradient. The earlier form scaled by 1/k while the field's curvature grows as k², so each iteration amplified a perturbation by ~η·k² and four of them by several hundred: a change in gait phase far too small to see moved a tendril tip a long way. Normalising the step bounds the total displacement at 4η = 0.112 whatever the wavenumber.

The rate-limited follower. The nodes are the loudest thing on screen — 1000 dRGB per unit RMS displacement — so they do not get to be a free function of time. They follow their kinematic target at a bounded rate (nodeRate 0.016 RMS world units per second, so at most 16 dRGB/s), scaled by one factor so the shape of the motion is preserved and only its speed changes. Because that bound is proportional to h, the outer clamp can finally control this channel by shrinking h — which against an unbounded Lipschitz constant it could not.


The mood system

Four affective variables — arousal, order, turgor, cohesion — under Ornstein–Uhlenbeck dynamics toward a set point, driven by 16 mutually incommensurate clocks and by the organism's own accumulated state.

Local time. dτ/dt = metabolism · (0.55 + 0.85 · arousal). Every phase duration, drift rate and mood coefficient is in τ, not wall seconds.

History, four ways.

  • Fatigue integrates only strain above the organism's own repertoire — (sN − 0.85)² — so a fine-grained form is not punished for being fine.

  • Novelty hunger rises when the trajectory's own sliding-window spread falls: the organism notices it has stopped going anywhere. It runs on fixed rates (≈24 morph-seconds) and does not read the genotype. Separately, chooseLandmark down-weights recently visited attractors on a genotype-dependent constant of 38 + 70·curiosity, i.e. 58–105 morph-seconds — that is the one curiosity controls.

  • Personality consolidates. The set points drift slowly toward what the instance actually does. An organism that has spent its life in crisis becomes a crisis-prone organism.

  • Recency and visit counts weight every choice. Phases that have just happened are suppressed; attractors already visited are down-weighted; under fatigue the whole landmark field tilts toward the calm forms.

The fatigue couplings are centred on typical fatigue (0.26), not on zero. Coupling to raw fatigue drags every set point to its floor within minutes and the creature flatlines.

Measured fatigue over 5400 s: median 0.001, p90 0.155, max 0.563. Hunger: median 0.171, p90 0.447, max 0.814. Neither pins.

Phases

DWELL · WANDER · TRANSIT · SURGE · COLLAPSE · CRISIS, chosen by weights that read mood, fatigue, hunger and history. SURGE and CRISIS leave a refractory period of 10–24 morph-seconds behind them and move the arousal set point down by 38% on exit — a change from an earlier version that cut arousal itself by 42%, i.e. a step discontinuity in a value the shader reads directly.

Measured over six seeds × 900 s wall — 114 events, one every 47.4 s:

TRANSIT 24.6%   SURGE 21.1%   DWELL 18.4%   WANDER 16.7%   CRISIS 12.3%   COLLAPSE 7.0%

Eleven of the twelve attractors were used as transit targets. SEED was not — it is reachable, but it is the lowest-arousal signature in the set and 900 s is not long enough to be sure it is fairly weighted.


The morph

The organism has one coefficient vector. A transit steers it along a quadratic Bézier whose control point bows off the chord by 0.28–0.75 of the chord length, perpendicular, so the middle of a transition is somewhere genuinely strange rather than a halfway mixture. Every intermediate state is itself a valid organism: walls bend, pinch and reconnect in place.

Three things make the transition read as deliberate rather than tweened:

Arc-length reparameterisation. Traversing the Bézier uniformly in u is not the same as traversing it uniformly in what a viewer sees. A 28-segment table of perceptual arc length is built per event and inverted, so the organism covers perceptual ground at a constant rate.

The trapezoid profile. Not a smoothstep. Smoothstep's rate is a bump peaking at u = 0.5 — exactly the middle of a transition, where the hybrid geometries are, which is the worst possible place to put the fastest moment. The shipped profile eases in and out and holds a genuinely constant rate across the middle 36% of the event, which is the part of the design that works.

The part that does not is the number. With ramp fraction r = 0.32 the peak-to-mean rate is 1/(1 − r) = 1.4706, against smoothstep's 1.5000 — the shipped profile is 2% flatter than the thing it was written to replace, not the 1.19× its comment claims. r = 0.16 would give 1.19. See the known issues.

Time budgeted from length. An event is given the time its perceptual length needs: len = clamp(max(drawn, Ltot / vTarget), 7 s, 60 s), where drawn is the duration the phase engine rolled for that phase type. In practice drawn (7–21 s) usually dominates, and the arc-length term takes over only for the long crossings. Before this, every event got a duration drawn from a fixed range regardless of how far it had to travel, so a long transit was simply a fast transit — and the long transits are precisely the ones that reach the exotic states.

If a move is so long that even 60 s cannot show it at cruise rate, the move is shortened, not sped up: the endpoint is pulled back along the same direction. A crisis in a dense region becomes a smaller crisis, which is the honest reading — the organism has less room to manoeuvre when it is already elaborate.

The wobble. A position offset driven by the clocks that keeps a transition from reading as a tween. It is not on the morph clock, so the arc budget never saw it and the hard limiter could not shrink it; unnormalised it contributed about 6.7 dRGB/s of unbudgeted motion, which turned out to be most of what the limiter was clipping. It is now normalised to a fixed perceptual amplitude and scaled by the brake, so it costs a known share of the budget and goes quiet when the organism does.

Drift weights. Coefficients that decide whether a whole structure exists are held near the anchor; the two phase thresholds, which are what makes the surface change state, drift fastest (1.25); the fluorophore epoch drifts slowly (0.62) because a palette should hold long enough to be recognised before it turns over. Free drift and the transit wobble are additionally rescaled by PS[k] = clamp((46/SENS[k])^0.75, 0.14, 2.40), so a wander covers perceptual ground uniformly instead of lurching whenever a loud axis happens to be driven. The upper clamp is load-bearing rather than decorative: it binds for 10 of the 35 coefficients, and without it pN alone would ask for 12.4.


The skin

Not skins, plural — a four-channel fluorescence model, evaluated once at the surface hit and never inside the march loop, so a rich material costs a constant per pixel rather than a multiple per step.

structure fields  ->  stain matrix  ->  4 emission channels  ->  fluorophore LUT

Phase change, not cross-fade

There are three material states, and they share no structure:

  • GEL — compartments labelled. Nuclei bright, boundaries drawn, no cytoskeleton.

  • FIBROUS — cytoskeleton labelled, compartments dark.

  • LAMELLAR — neither. A smectic stack that ignores the cell geometry entirely: the state the organism enters when it stops being tissue.

Two nested thresholds choose between them. D1 decides the tissue's organisation; D2 decides whether it is tissue at all. Because GEL and FIBROUS share no structure, the crossing is a reorganisation and not a fade: one organisation dissolves and another nucleates in its place.

Both order parameters are unit-variance by construction, so a measured critical threshold transfers directly:

fbm3 :  (f − 0.5) · 8.42            (value noise, weights 0.55 / 0.28 / 0.17)
Q    :  Q / sqrt(3(1 + q1² + q2²))  (exact for a sum of cosines)

Measured on a 110³ grid: for the disordered field the largest domain holds 99% of the mass down to θ = +0.6 and collapses to 0.60 by θ = +0.8 — a connected labyrinth shattering into islands, with the component count peaking at 427 on the way. The quasicrystalline field never shatters at all (largest component 0.92–1.00 across the whole sweep).

Those are two different kinds of transition, and the order axis of the mood system chooses between them.

The thresholds sweep on their own, under two incommensurate rates each, with amplitude set by activity — so a calm organism only breathes its domains and a roused one sweeps them right through nucleation, growth, percolation and shattering, over and over, without waiting for a coefficient to drift there.

The structure fields

One Worley primitive yields three labels — cell interior (F1 small), cell boundary (F2 − F1 small) and its drawn centreline — and they are disjoint by construction. Measured Worley statistics: F1 mean 0.520, F2 − F1 mean 0.196 (p10 0.026), so the thresholds put each label on a small, known fraction of the surface rather than all of it.

Alongside: a treadmilling cytoskeleton (three ridged-noise octaves carried at different rates along the twist axis, so the pattern flows along itself while the network keeps its shape); vesicle traffic (each punctum on its own orbit inside its own cell, blinking on its own cycle, with a long soft fade — a vesicle that switches on is a flash, one that swells into view over a couple of seconds is traffic); a band on the quasicrystal's zero set; and the aster, keyed to the icosahedron's own face-centre radius.

Every field is sampled through a shared cytoplasmic flow, so the domains, cells, filaments and vesicles are carried by the same current the way the contents of a cell are — but the flow is scale-aware. A displacement that reads as gentle drift on a domain field at frequency 1.3 is a dozen cells of travel on the vesicle lattice at 29, and because the channel competition is winner-take-most, a structure sliding past its neighbour flips which fluorophore reads there. Measured on its own the flow family produced 0.899 rad/s of hue against 1.108 for everything together. The coarse fields keep the drift; the fine ones get a third of it.

Detector reassignment and channel competition

sm walks a four-step cycle of channel permutations. A permutation is the one recolouring unreachable by any cross-fade of the original picture; the blend between two of them is the bleed-through you get while a filter wheel is turning. Four steps rather than three because the cyclic permutation has order four, so going all the way round returns to the identity and the walk can run forever without a seam.

Real labels are exclusive — a fluorophore bound to actin is not also bound to DNA — so cross-talk is suppressed quadratically against the winning channel: ch = ch²/(max + 0.235). Without it the four dyes sum toward white across most of the surface and the image reads as a render. The +0.235 softens the denominator: winner-take-most is also a hue amplifier, and two channels near a tie flip the dominant colour for a tiny change underneath them.

Where two channels genuinely tie, both survive and the overlap blows to white. That is colocalisation, and it should read as an event, not as the norm.

There is no light source

Form is legible because emission from a deep pocket has more tissue to cross on the way out. Occlusion is used as absorption, and the unlabelled ground term rises where occlusion is high — creases hold more fluorophore — which is the opposite of a shading term and the reason the surface reads as translucent volume.

Two extra field samples behind the hit measure how much organism the emission has to cross. A tendril one node thick, or a membrane seen edge-on, is nearly transparent and lights from within. This costs two map evaluations per pixel, not per march step — about 1% of a frame — and it is the single term that makes thin structure glow the way it does in a real acquisition.

Detector shot noise closes it out: variance goes as the signal, so dim regions are grainy and bright ones smooth, and it is locked to the object rather than the frame so it reads as photon statistics rather than video noise.

The skin clock

The material runs on wall time at a rate the organism sets, not on the organism's proper time. Proper time is throttled, and a throttled organism is one in a dense, novel, strained region — precisely where the surface should be at its most active. Tying the skin to the same clock as the morphology is what made it freeze in the interesting places.

But state alone is the wrong driver. An elaborate, strained, aroused organism sitting perfectly still scores near the top on every state variable — and with the geometry frozen the surface measured 0.52 lightness units and 1.37 rad of hue per second, higher than the deliberately active case. So the states now decide how expressive the surface is, and the body's realised displacement decides how fast it is allowed to be.

Displacement, not velocity: the rate limiter holds instantaneous velocity inside a narrow band by construction, so across a whole run it barely discriminates — measured r = +0.21 against the skin rate, where the state variables scored +0.45. Travel is how far the shape has moved from where it was a few seconds ago. An organism breathing in place scores near zero however fast it jitters; one crossing the morphospace scores high.

Measured travel over six seeds × 13 min: p10 16.7, median 37.4, p90 64.9. The shipped gates are travelLo 15, travelHi 62. My own six-seed × 900 s run reproduces it: p10 14.4, median 31.0, p90 54.4.

And the whole thing is capped in perceptual units. Hue, lightness and chroma velocity are all very nearly proportional to the skin clock rate, so a rate measured once bounds them for good:

hue    rad/s = 0.0828 + 0.0220 · skinRate
light  L/s   = 0.0495 + 0.0107 · skinRate

against ceilings of 0.125 rad/s (a full colour circle in 50 s) and 0.075 L/s. Whichever binds first sets the ceiling. The render dither floor is 0.004 and 0.019, so both slopes are real signal. The intercepts are the activity signal modulating amplitudes throughout the shader, which is why that signal gets long time constants and a hard slew limit of 0.055 per second — the states modulate the surface on the timescale of a mood rather than a frame.

Measured skin rate over 5400 s: p10 0.431, median 0.738, p90 1.185, max 1.656.

Material coefficients get their own clock

Six of the coefficients — mm hA hB ex fs sm — carry a bounded offset alongside the morphospace rather than written into it, on six incommensurate rates, with excursion opening up with activity. They used to move only when the morph machinery moved them, which is why a palette or a phase threshold could sit unchanged for minutes while the organism was busy doing something else. Because the offset is carried alongside, it never fights the Bézier and never has to be paid for out of the morphology's budget.


The camera and framing

A three-quarter view. Azimuth advances at spin 0.150 rad/s — 41.9 s per orbit. Elevation swings on an incommensurate rate, spin · 1/φ, 67.8 s per swing, between 1.1° and 37.2°, so the form is read with depth rather than as a flat elevation and never settles into the same pairing of azimuth and elevation twice.

Framing uses the exact projection, sin(atan(f · tan(fov/2))), rather than the small-angle form r/(R·tanH). The two diverge as the object fills more of the frame: at R = 2.9 a unit shell projects to 1.131 of the half-frame against the small-angle form's 1.061, a 6.5% error, and by R = 1.5 the error reaches about 34%. That drift is why cages were being cropped. (The source comment quotes 1.15 and 0.76 for this example and a 20–30% error; neither reproduces. The formula shipped is correct — the illustration in its comment is not.)

Four fill targets are taken simultaneously and the largest wins: bulk 0.74, tip 0.83, cage 0.90, outer percentile 0.99. A form that is mostly thin threads is framed on its mass and the threads are allowed to run off the edge — that is how one would photograph it, and it is the difference between a spiky organism reading as large and reading as a small knot in a lot of black. A shell is never treated this way; the cage is never allowed off frame, but only while it is actually there.

That last clause was a real bug. The shader erodes each strut by (1 − gate)·0.75 against a radius of about 0.014, so a strut is visible only for gate > 0.98 — the cage appears and vanishes inside the top two per cent of its gate. An earlier presence curve claimed a full cage from gate 0.204 onwards, and the camera held its distance for a shell that had dissolved twenty seconds earlier.

The refit runs on the throttled clock with a soft deadband (3% of the radius) and asymmetric rate caps: pulling back up to 11.5% of the radius per second, pushing in only 7.2%. The failure mode of being slow to pull back is clipping; the failure mode of being slow to push in is that the piece is briefly modest. A large error is allowed to hurry: camBoost is 1.70 and enters as 1 + 1.70·smoothstep(...), so the rate cap can reach 2.70× its base value. It comes on smoothly, so there is no threshold at which the camera changes character.

Measured camera radius over 5400 s: p10 1.82, median 2.95, p90 3.52, max 4.09.


Per-load initialisation

The seed

js

if (QS.has('seed'))  SEED = (parseInt(QS.get('seed'),10) >>> 0) || 1;
else {
  const b = new Uint32Array(2);
  if (self.crypto && crypto.getRandomValues) crypto.getRandomValues(b);
  else { b[0] = (Math.random()*4294967296)>>>0; b[1] = (performance.now()*1e6)>>>0; }
  SEED = (b[0] ^ Math.imul(b[1], 0x9E3779B1)) >>> 0;
}
const rnd = mulberry32(SEED);

Two 32-bit words from crypto.getRandomValues, mixed with the golden-ratio constant, giving a full 32-bit seed. ?seed=<n> overrides it; ?seed=0 becomes 1. The generator is mulberry32.

The generator's state lives outside its closure. RNGS.a is a module-level variable so the rate limiter can snapshot and restore it. This is not a stylistic choice — a frame rejected by the hard clamp must not consume entropy, or the same seed stops producing the same organism.

What the seed fixes

The seed fixes the genotype, drawn in this order:

gene

range

what it does

inflation

φ, φ², 2, φ^1.5

quasicrystal octave ratio

metabolism

0.74 – 1.30

proper-time rate; also sets morph tempo

volatility

0.32 – 0.92

how hard the clocks drive mood

curiosity

0.28 – 0.95

novelty time constant, 58–105 morph-seconds

stamina

0.64 – 1.52

fatigue tolerance and the Ψ override threshold

plateau

0.38 – 0.66

gait duty cycle, 2.27×–3.95× peak-to-mean

setA setO setT setC

0.20–0.66, 0.26–0.80, 0.24–0.76, 0.30–0.82

initial mood set points

clocks

16 × {w 0.026–0.132 scaled by (1 + 0.29·i/16), phase 0–2π}

the incommensurate drive

bias

12 × 0.55–1.55

per-attractor affinity

nodes

20 × three barycentric phases + a radial reach ramp per chain

the branching architecture

The node table is the important one: the colony's branching architecture differs per load, not just its temper.

metabolism is deliberately compressed where it reaches the morph clock — TEMPO = 0.88 + 0.20·(metabolism − 0.74)/0.56, a range of 0.880–1.080, a 1.23× spread against the gene's own 1.76× — because metabolism multiplies the morph rate directly and the fast genotypes were the sickening ones. It keeps its full spread everywhere else.

The birth state

After the genotype, one more draw picks the anchor attractor, and the coefficient vector is set to that attractor plus a per-axis uniform jitter of ±5.5% of each axis range. The running mean is initialised to the birth state so the organism does not start out reading as novel.

What the seed does not fix

The trajectory is a stateful integration, not a pure function of wall-clock time. Two loads of the same seed stepped at the same rate are bit-identical; stepped at different rates they diverge in detail while staying structurally the same. Measured, seed 12345 at 300 s:

τ

phase

anchor

events

h = 1/60

160.9

SURGE

DODECA CAGE

10

h = 1/60 again

160.9

SURGE

DODECA CAGE

10

h = 1/30

160.5

SURGE

DODECA CAGE

10

Same phase, same anchor, same event count; coefficient-vector L2 distance between the two step sizes, 0.34.

So this is not the Liquid Nano Colony's clockwork, which is immune to frame drops by construction. It is closer to ICOSA Morph: a different creature on every load, reproducible from its seed at a fixed step, and robust rather than exact across machines. Use SETHIX.seek(t, h) with an explicit h when you need reproducibility.


Continuity

Geometric. The field sampled on the probe's fixed 512-point set every 1/20 s for 300 s, counting how many samples the surface crossed between frames:

sign flips per frame:   median 0    p90 0    p99 1    p999 1    worst 2 of 512 (0.4%)

No frame relocates a meaningful fraction of the surface. Sign flips only — a narrow kernel around the surface is shot-noisy, and a wide one is worse because it makes the metric sensitive to field values deep inside solids that the renderer never sees. Ground truth is what the camera sees.

Rendered. Camera pinned, stepped at 1/30 s, per-frame mean |ΔRGB| across the first three phase handovers:

handover

handover frame

neighbourhood mean

ratio

17.5 s SURGE → DWELL

1.293

1.243

1.04×

33.4 s DWELL → TRANSIT

1.131

1.261

0.90×

164.9 s TRANSIT → DWELL

2.074

2.091

0.99×

The frame that ends a phase is indistinguishable from the ones around it — in two of three cases it is quieter than its neighbours. For comparison, the broken transition in Polymorphic Lattice measured 16.6 and 18.4 out of 255 at its two handovers, spikes of ten to fifty times their neighbours.

Model against pixels. The whole justification for governing in these units is that the model tracks what reaches the screen. Measured directly — camera pinned, 260 frames at 1/30 s, seed 12345, starting 30 s in — against vNow, the number the limiter computes from the SENS table plus the node, mood and camera terms:

Pearson r (measured per-frame |dRGB| vs vNow)   0.718
measured   26.24 dRGB/s
predicted  11.09 dRGB/s

The correlation is real and the magnitude is deliberately not a match. vNow is a morphology budget, not a total-image budget: it covers the coefficient vector, the 24 nodes, the four mood values and the camera radius, and nothing else. The skin has its own clock on wall time and its own perceptual ceiling. See the coverage note below.


Known issues and honest notes

The transition profile does not do what its comment claims. PROF is built with ramp fraction r = 0.32, giving a peak-to-mean rate of 1/(1 − r) = 1.4706. Smoothstep, the thing it was written to replace, is 1.5000. The profile is therefore 2% flatter than the baseline, not the 1.19× the comment states — and the comment's reasoning is the justification for the whole design. What does work is the shape: the rate is genuinely constant across the middle 36% of the event rather than peaking at u = 0.5, so the fastest moment is not sitting on top of the hybrid geometries. r = 0.16 would deliver the claimed 1.19× and lengthen the plateau to 68% of the event. One constant.

One hard test survives in boundRadius. The chain-growth and cage gates are smoothsteps, but the bloom bound is if (v[P.qb] < 0.998) r = max(r, 1.06) — a step of up to 0.4 in the marcher's bounding radius on a single frame when qb crosses its gate. This is precisely the fault ICOSA Morph documented: the ray start point moves, and with any overshoot in the marcher the surface it finds moves with it. It is much less exposed here — stepScale is 0.30 rather than 0.62, and the gate sits at the extreme end of qb's range — but it is the same shape of bug and it wants the same smoothstep treatment.

Two CFG members are dead. surf: 0.00055 is never read; the fragment shader hard-codes the literal 0.00055 in its march test. fill: 0.78 is a leftover from before the four separate fill targets and is referenced nowhere. Both are listed in the tunables below for completeness, marked as such — neither is a knob.

A second stale comment. TEMPO is described in the source as compressing metabolism "from a 1.76x spread to 1.37x". The shipped expression gives 0.880–1.080, a spread of 1.23×. The compression is real and slightly stronger than advertised.

The Ψ override never fires. The governor's forced-resolution path triggers on Ψ > 2.40 · (0.75 + 0.5 · stamina) — a threshold of 2.57 to 3.62 depending on genotype — or on normalised fatigue exceeding 1.0. Measured Ψ over 5400 s: p99 1.911, absolute max 2.897; measured fatigue never came within a third of its own trigger. Across six seeds × 900 s there were zero forced resolutions. The phase engine's own weighting is doing all the work, and the override is effectively dormant in this build. It is a safety net that has never been needed rather than a mechanism you will see; either the threshold wants lowering to ~1.9 or it should be documented as a backstop. It is currently the latter.

The limiter's budget does not cover the whole image, by design — but the gap is larger than the design says. vCap is 21 dRGB/s and the measured total with the camera pinned is 26.2. The difference is everything the CPU-side metric cannot see:

  • the skin clock, which runs on wall time precisely so the material stays alive while the morphology is being held back, and is bounded separately by hueCap/lumCap

  • the tube undulation, P_BW · vnoise(q·8 + uTime·…), which modulates the tendril radius entirely inside the fragment shader as a function of uTime. The CPU snapshot has no term for it at all

Ablating the four scriptable skin families (SETHIX.abl(0,0,0,0)) drops the measured rate from 26.24 to 22.53 dRGB/s, so those four account for 3.7 of it; the rest is the un-ablatable S-driven terms — compartment breathing, cell value, the aster pulse, haze, the strut pattern — and the shader-side undulation. None of this is unbounded, and the perceptual ceilings on hue and lightness are the mechanism that bounds it. But the honest statement is that 21 is the ceiling on the morphology channels, not on the frame.

SEED is never a transit target in 5400 s. It is the lowest-arousal signature in the set and it is reachable, but the sample is not long enough to say whether it is fairly weighted or effectively unreachable.

The fold count disagrees with its own comment. The shader's comment says "six iterations suffice for full convergence; eight is the safety margin" and the loop runs seven; the CPU mirror runs eight. Measured, folding converges exactly by six — max deviation from a 24-iteration reference over 20 000 directions is 0.0 — so there is no functional consequence. Noted so the seven is not mistaken for a considered choice.

SENS spread is 116×, not 119× as the source comment states. Recomputed from the shipped table.

runProbe sorts a typed-array view with the generic Array.prototype.sort. It is spec-generic and works on every current engine; a.sort(cmp) is the native path. Left alone because it only feeds framing percentiles and could never throw.


Bugs caught during construction

Every one of these was invisible in a still frame.

The domain angle, and the black page on iOS. The module refused to run on every iPhone and iPad, showing domain angle 0.95997 expected 0.79465. Not floating-point drift and not an inverse-trig domain excursion — a combinatorial mis-selection. The five neighbours of V5 all sit at exactly dot = 1/√5, so sorting them by dot product is a five-way tie. Math.hypot is only implementation-approximated in ECMAScript, and one ulp of disagreement between two engines reorders that tie. On V8 it landed on an adjacent pair and V5 + n₀ + n₁ was a genuine face centre; on WebKit it landed on a skip pair, and

(1 + 2/5) / sqrt(3 + 2/5) = 0.95997

exactly the reported number. F3 stopped being a three-fold axis, the triangle stopped being a Möbius domain, and the startup check correctly refused to run.

The fix selects neighbours by sign, in the vertex array's own construction order, then requires the second to be adjacent to the first. The first is a band test at 0.2, which clears the nearest live value (1/√5 = 0.4472) by 0.247; the second is a pure sign test with a margin of 0.447. Both are exact on every engine, and they pick the same triangle V8 was already picking — V5, F3, E2, M1, M2, M3, cen, A5, bumpPeak come out bit-for-bit identical. Fuzzed with every normalised component jittered ±1 ulp over 20 000 runs: the old code failed 37.7% of the time, the new code 0%. The startup check is now a console.warn rather than a bail, because the construction guarantees the invariant combinatorially and a black page with red text on it is worse than a slightly wrong geometry.

The blink to black. Assigning to canvas.width reallocates the WebGL drawing buffer and clears it. resize() had four callers and only one — the top of drawFrame — was followed by a draw. The other three cleared the buffer and returned to the event loop, so the cleared buffer is what the compositor put on screen: one fully black frame each. The three were the fps governor (which runs at the end of tick, after drawFrame has already returned), the window resize listener (which on iOS fires repeatedly in the first seconds while Safari settles the address bar), and SETHIX.setSS.

That is why it concentrated in the first ten seconds and then stopped, and why it was near-invisible on a desktop holding 60 fps — the governor never fires there, so the canvas is never reallocated at all. The reallocation now lives in applySize(), called only from the top of drawFrame. Measured across 68 frames with a synthetic phone frame-rate profile and three real viewport changes: 5 reallocations, all outside a draw → 5 black frames became 5 reallocations, all inside drawFrame → 0, with rendered output unchanged.

FAR cannot be 1e9. smin(d, 1e9, k) evaluates mix(1e9, d, 1.0) = 1e9 + (d − 1e9), and in float32 the ULP of 1e9 is 64, so d is annihilated and the result is 0 — every absent component collapsed the whole field to zero and filled the frame. The sentinel is 8.0: far outside the scene and exactly representable against any distance that matters.

The radial confinement must intersect, not add. Summed, it drove the bloom field negative near the origin even where the quasicrystal term was non-negative, so a large solid body popped in whenever qb crossed its gate. Intersected, qb = 1 leaves both readings ≥ 0 and the block is provably inert — which is what makes the branch that skips it exact rather than guessed.

A segment of zero length is still a ball. A growing tendril popped a bead into existence at every node. The erosion added at f = 0 must clear the AO probe's reach, or occlusion keeps finding the structure across the whole surface long after the geometry is gone.

The nucleation step amplified its own input. Scaling by 1/k against curvature growing as k² meant four iterations amplified a perturbation several hundredfold. The map was smooth, as its comment claimed, and so steep that no reduction of the timestep could bound it.

The limiter watched the wrong thing. Coefficients were 1.1% of the fastest 1% of frames; the nodes were 72.3%.

The skin was fastest when the body was frozen. Every state variable scores high on an elaborate organism sitting still, so the surface ran at 0.52 L/s and 1.37 rad/s of hue with the geometry stopped.

Arousal was cut 42% on phase exit — a step discontinuity in a value the shader reads directly. Moving the set point instead lets the same collapse happen over a few seconds.

The through-line: a gate placed where the thing being gated is not yet zero, and a model of speed that does not measure what reaches the screen.


Hooks

?seed=<n> reproducible instance · ?ss=<n> set the initial supersampling, 0.4–2.5 (the adaptive controller is free to move it afterwards — there is no lock) · drag to orbit · space to pause.

window.SETHIX

State and constants (read)

member

what it is

seed

the 32-bit seed this instance was built from

geno

the genotype: inflation, metabolism, volatility, curiosity, stamina, plateau, four set points, 16 clocks, 12 affinities, 20 node seeds

cfg

the live CFG object

org

the live organism: x, N, mood, set points, fatigue, hunger, phase, interest, brake, damp, act, mOff, log

P

coefficient name → index

LO, HI

per-coefficient bounds, used live by constrainVec

ico

V5 F3 E2 M1 M2 M3 cen A5 bumpPeak V

landmarks

the twelve attractor names

Transport

call

effect

play() / halt()

start and stop the simulation; rendering continues either way

sim(dt)

advance the organism by dt wall-seconds, no render

step(dt)

sim(dt) then draw

seek(t, h)

advance t seconds in steps of h (default 1/30), no render

redraw()

draw one frame from the current state

force()

end the current phase immediately and choose the next

Camera

call

effect

pinCam(t)

freeze the camera at orbit time t; pinCam(null) releases it

pinCamR(f)

multiply the camera radius by f and pin at t = 11

camR()

current camera radius

Resolution

call

effect

setSS(s)

set supersampling; the adaptive controller will pull it back toward 0.60–1.60

setSteps(s)

set march steps directly

Posing

call

effect

pin(name)

jump to a named attractor, clear the current event, halt, reprobe and refit the camera. Returns false on an unknown name

set(k, v)

set one coefficient by name — set('chi', 0.8) — then constrain, replace nodes, recompute the bound and reprobe. A running event will overwrite it, so halt() or pin() first

Measurement

call

returns

probe()

{psi, strain, area, reach, solid, grad, rMax} — forces a probe tick

state()

the full instrument panel: time, proper time, phase and its progress, anchor and target, mood, set points, fatigue, hunger, Ψ, strain, reach, solid, bound, bulk, frame radius, camera radius, chirality, interest, brake, damp, cap, vNow, vPerc, the two window rates, retries, effective slowdown, skin rate and clock, motion, form velocity, travel, the four activity signals, fps, supersampling, steps, pixels

vel()

{v, smooth, brake, damp, cap, wShort, wLong, interest, sens, kn, kc, km, hEff, tries, arc, len} — the limiter's own view, including the SENS table and the three coupling constants

iterms()

the ten raw interest terms, before weighting

clip()

{n, of, pct} — frames that exceeded budget, out of frames drawn

bound()

the marcher's bounding radius

log()

the last 240 phase events: {tau, phase, forced, lm, psi, fat}. The first entry is the birth record {tau: 0, phase: 'BORN', lm} and carries none of the other fields — do not count it as a phase

occ()

512 tanh-compressed field values on the probe's fixed point set. Sign flips between two calls are the honest measure of a morphological teleport, and it costs nothing next to rendering

occFor(a)

the same signature for an arbitrary coefficient vector, without disturbing the live one

pixels()

{w, h, data} — the current framebuffer as RGBA bytes

Debug

call

effect

abl(a, b, c, d)

per-family animation scalers, all 1 by default. a scales the excitation wave; b the stain rotation and detector-permutation walk; c the phase-threshold sweep; d the cytoplasmic flow, filaments, vesicles and lamellae. Setting three to zero isolates the fourth — this is how the per-family hue and lightness velocities quoted above were measured

Worked example

js

SETHIX.halt();
SETHIX.pin('MEMBRANE');
SETHIX.pinCam(11.0);
SETHIX.abl(0, 0, 0, 1);              // cytoplasmic motion only
SETHIX.play();
const d = [];
let prev = (SETHIX.redraw(), SETHIX.pixels().data);
for (let i = 0; i < 300; i++) {
  SETHIX.sim(1/30); SETHIX.redraw();
  const px = SETHIX.pixels().data;
  let s = 0;
  for (let k = 0; k < px.length; k += 4)
    s += Math.abs(px[k]-prev[k]) + Math.abs(px[k+1]-prev[k+1]) + Math.abs(px[k+2]-prev[k+2]);
  d.push(s / (px.length/4*3));
  prev = px.slice();
}

cfg is live for anything read per frame — SETHIX.cfg.vCap = 40 takes effect on the next frame, and so do cfg.stepScale, cfg.brakeK, cfg.nodeRate and cfg.hueCap; cfg.vTarget and cfg.lenMax apply from the next event onward. Two exceptions worth knowing: cfg.probeN is not live, because the probe point set is sized once at load; and cfg.maxSteps is read only by the fps governor's raise branch, so lowering it does nothing — use setSteps() instead.


Performance

Per pixel that hits: up to 168 march steps, each one a full field evaluation — a seven-iteration fold, a chiral rotation, up to 18 cosines for the quasicrystal (branch-skipped when provably inert), 19 capsule tests across the five chains, a seed blob, up to five condensate strut tests and the bloom. Then 4 taps for the normal, 5 for ambient occlusion, 2 for translucency, and the material once.

The material is the expensive-looking part and is the cheap part: it is evaluated once, at the hit, never inside the loop.

The adaptive controller trades march steps (104–168) against supersampling (0.60–1.60) to hold ~58 fps, shedding steps first. stepScale is 0.30 — measured, not inherited from the Nano Colony's 0.82. Every pixel that differs from a 0.07-step reference lies on a silhouette edge and none in the interior; 168 steps then match 250 to 0.11%.

Frame rate could not be measured meaningfully in this environment — verification ran under SwiftShader, about 0.8 s per frame at 220 px and 2–8 s per frame at 264 px for the heavier states — so the adaptive controller, not a measured number, is the guarantee.


Tunables (CFG)

Framing — fov 36° · spin 0.150 (41.9 s/orbit) · camElev 0.335 ± 0.315 rad (1.1°–37.2°, 67.8 s/swing, ratio 1 : 1/φ) · camMin 0.92 · camTau 2.10 · camRateOut 0.115 · camRateIn 0.072 · camBoost 1.70 · camDead 0.030 · fillBulk 0.74 · fillTip 0.83 · fillCage 0.90 · fillOuter 0.99 · frameLerp 0.16 · tipRelax 0.42 · tipFloor 0.87

March — maxSteps 168 · minSteps 104 · stepScale 0.30 · maxDisplay 1280 · ssMin 0.60 · ssMax 1.60 · fpsTarget 58

Governor — probeMs 180 · probeN 512 · strainRef 0.340 · reachRef 2.60 · reachW 0.240 · psiHi 2.40

Limiter — vCap 21.0 · vTarget 10.0 · vDrift 7.5 · wobA 1.6 · maxRetry 6 · brakeK 0.92 · brakeP 2.90 · brakeFloor 0.22 · iZero 0.625 · iGain 2.391 · brakeDown 0.30 · brakeUp 3.40 · nodeRate 0.016 · winShort 2.0 / cap 16.0 · winLong 12.0 / cap 13.0 · dampFloor 0.10 · dampDown 0.45 · dampUp 6.0

Skin — skinBase 0.24 · skinGain 1.55 · skinTau 1.25 · skinIdle 0.18 · actSlew 0.055 · travelTau 7.0 · travelLo 15.0 · travelHi 62.0 · hueCap 0.125 · lumCap 0.075 · matExc 0.115 · matTau 2.20

Phases, in proper-time seconds — lenMin 7.0 · lenMax 60.0 · dwell 7–16 · wander 9–21 · transit 10–21 · surge 7–16 · crisis 8–20

Deadsurf 0.00055 (the shader hard-codes the literal) · fill 0.78 (superseded by the four fill targets). Listed because the rest of this section is exhaustive: 76 keys in CFG, 74 of them live.

LANDMARKS carries the twelve states with their mood signatures and calm ratings; SENS the perceptual metric; DW the per-coefficient drift weights; IW the ten interest weights. Adding a state or reordering them needs no other change.


Short version

A single icosahedral organism lives inside 1/120 of space and is mirrored into a colony by a kaleidoscopic fold; one strut drawn between two corners of that domain unfolds into a complete polytope. Symmetry is itself a coefficient — a parity-signed twist, gated by a bump that vanishes on the domain walls, carries it continuously from the full order-120 group to its chiral rotation subgroup. A six-wave icosahedral quasicrystal, exactly invariant under the fold to 6.4 × 10⁻¹⁴, beads its tendrils, nucleates its nodes and precipitates aperiodic blooms.

It drifts through a 35-dimensional morphospace between twelve attractors under a four-axis mood system on its own proper clock. What is new is the governor: the morphospace is not perceptually isotropic — one axis moves the image 116 times more than another — so the organism is throttled in measured units of rendered change, by a three-layer limiter whose last layer steps the entire creature, measures the visual consequence against a snapshot, and rolls back coefficients, nodes, mood, camera and the random generator if the frame moved more than its budget. Over 5400 s it has not put a frame on screen more than half a per cent over budget, and 94% of frames need no retry at all.

The surface is a four-channel fluorescence model with three material states that share no structure, so it changes state by a first-order phase transition rather than a cross-fade — nucleation, growth, percolation, shattering — with the mood system's order axis choosing between a disordered field that shatters and a quasicrystalline one that never does.

Pure WebGL2, one file, no dependencies, no assets, no geometry beyond a single fullscreen triangle. Different on every load.

post image

All code is open source.

Contract: 0x71eb648bdd6ebb161dcda890dfadd1d28972ea42Substrate Transmutation [SETHIX] on OpenSea. Media on Arweave.