The Substrate Ladder
The Substrate Ladder
Seven substrate versions, each adding one capability, tracking whether evolution selects for it. The goal: build a substrate worth measuring.
V11: Lenia CA Evolution
Period: 2025-2026. Substrate: Continuous cellular automaton (Lenia) with evolutionary dynamics.
Versions: V11.0 (naive), V11.1 (homogeneous evolution), V11.2 (heterogeneous chemistry), V11.5 (hierarchical coupling), V11.7 (curriculum training).
| Version | (drought) | Key lesson |
|---|---|---|
| V11.0 (naive) | -6.2% | Decomposition baseline |
| V11.1 (homogeneous evolution) | -6.0% | Selection alone insufficient |
| V11.2 (heterogeneous chemistry) | -3.8% | +2.1pp shift from diverse viability manifolds |
| V11.7 (curriculum training) | +1.2 to +2.7pp generalization | Only intervention improving novel-stress response |
Key finding: Training regime matters more than substrate complexity. The locality ceiling: convolutional physics cannot produce active self-maintenance under severe threat. The Yerkes-Dodson pattern (mild stress increases integration, severe stress destroys it) appeared in every condition — the most robust empirical finding across the entire program.
Source code
v11_substrate.py— Lenia substrate with FFT convolutionv11_evolution.py— Evolution loop with curriculum stressv11_run.py— CLI runner for all V11 variantsv11_affect.py— Affect measurement (Phi, robustness)
V12: Attention-Based Lenia
Addition: State-dependent interaction topology (evolvable attention kernels).
Result: increase in 42% of cycles (vs 3% for convolution). +2.0pp shift — largest single-intervention effect. But robustness stabilizes near 1.0.
Implication: Attention is necessary but not sufficient. The system reaches the integration threshold without crossing it.
Source code
v12_substrate_attention.py— Attention kernel implementationv12_evolution.py— Evolution loopv12_run.py— CLI runner
V13: Content-Based Coupling
Substrate: FFT convolution + content-similarity modulation. Cells couple more strongly with cells sharing state-features.
Three seeds, 30 cycles each (, ). Mean robustness 0.923, peak 1.052 at population bottleneck. This became the foundation substrate for all measurement experiments (Experiments 0-12).
Source code
v13_substrate.py— Content-coupling substratev13_evolution.py— Evolution loop with curriculumv13_gpu_run.py— GPU runner (Lambda Labs)v13_aggregate.py— Cross-seed aggregation
V14: Chemotactic Lenia
Addition: Motor channels enabling directed foraging. Velocity field from resource gradients gated by the last two of channels.
Result: Patterns move 3.5-5.6 pixels/cycle toward resources. Motor sensitivity evolves. Robustness comparable to V13 (~0.90-0.95).
Source code
v14_substrate.py— Chemotaxis implementationv14_evolution.py— Evolution loopv14_gpu_run.py— GPU runner
V15: Temporal Memory
Addition: Two exponential-moving-average memory channels storing slow statistics of the pattern's history. Oscillating resource patches reward anticipation.
Result: Evolution selected for longer memory in 2/3 seeds — memory decay constants decreased 6x. Under bottleneck pressure, stress response doubled (0.231 to 0.434). Peak robustness 1.070.
Temporal integration is fitness-relevant. This was the only substrate addition evolution consistently selected for. Memory channels help prediction (~12x vs V13) but don't break the sensory-motor wall.
Source code
v15_substrate.py— EMA memory channelsv15_evolution.py— Evolution with memory trackingv15_gpu_run.py— GPU runnerv15_experiments.py— Measurement re-runs on V15
V16: Hebbian Plasticity
Negative result. Mean robustness dropped to 0.892 — lowest of all substrates. Zero cycles exceeded 1.0.
Addition: Local Hebbian learning rules allowing each spatial location to modify its coupling structure in response to experience.
Lesson: Simple learning rules are too blunt. The extra degrees of freedom overwhelm the selection signal. Plasticity added noise faster than selection could filter it.
Source code
v16_substrate.py— Hebbian plasticity implementationv16_evolution.py— Evolution loopv16_gpu_run.py— GPU runner
V17: Quorum Signaling
Addition: Two diffusible signal fields mediating inter-pattern coordination (bacterial quorum sensing analog).
Result: Produced the highest-ever single-cycle robustness (1.125) at population of 2. But 2/3 seeds evolved to suppress signaling entirely.
Lesson: Signaling is costly in large populations, beneficial only at extreme bottlenecks.
Source code
v17_substrate.py— Quorum sensing fieldsv17_evolution.py— Evolution loopv17_gpu_run.py— GPU runner
V18: Boundary-Dependent Lenia
Addition: Insulation field via iterated erosion + sigmoid creating genuine boundary/interior distinction. External FFT signals gated by , internal short-range recurrence gated by .
Three seeds, 30 cycles. Mean robustness 0.969 — highest of any substrate. Peak 1.651 (seed 42). 33% of cycles show increase under stress.
Surprise: internal_gain evolved down in all three seeds (1.0 to ~0.6). Evolution preferred permeable membranes over insulated cores. External sensing was more valuable than internal rumination.
Verdict: Best engineering result (highest robustness) but not the theoretical goal (breaking the coupling wall).
Source code
v18_substrate.py— Boundary-dependent dynamicsv18_evolution.py— Evolution loopv18_gpu_run.py— GPU runnerv18_experiments.py— Measurement re-runs on V18
Cross-Substrate Summary
| Version | Mean Robustness | Max Robustness | > 1.0 Cycles | Verdict |
|---|---|---|---|---|
| V13 (content coupling) | 0.923 | 1.052 | 3/90 | Foundation substrate |
| V14 (+ chemotaxis) | ~0.91 | ~0.95 | ~1/90 | Motion evolves |
| V15 (+ memory) | 0.907 | 1.070 | 3/90 | Best dynamics |
| V16 (+ plasticity) | 0.892 | 0.974 | 0/90 | Negative |
| V17 (+ signaling) | 0.892 | 1.125 | 1/90 | Suppressed |
| V18 (boundary) | 0.969 | 1.651 | ~10/90 | Best robustness |