Energy / Co-evolution Engine — Parameter Reference & Scenario Plan

Living document. Last updated (after the §17 demand-/depletion-limited CAPTURE fix). Authoritative catalog of every knob in the chessboard engine (compute/scripts/evolve.py), what it means, its default, the methodology object it instantiates, its literature analog, and its dominant couplings — plus the scenario plan and expected regimes. Read with plan-energy-dynamics.md (build record) and design-energy-dynamics.md (vision/§14 unified model).

The coupling caveat (why this doc exists). Every parameter partially couples to every other through one shared balance Δenergy = CAPTURE − TRANSFORM − MAINTENANCE and the share/influence logistic. It behaves like a coupled dynamical system: a change anywhere propagates (e.g. raising extraction.half slows drawdown → store stays high → ε stays high → more capture → faster climb → higher maintenance → …). There is no "independent" knob. This catalog plus the coupling map (§3) is the heuristic instrument until/unless we build an explicit state-space explorer. Discipline: regime-not-magnitude, observe-not-force, honest-negatives, cartography (all forms/params are analyst-modeled, open to challenge).

1. The model as built (one-screen review)

Per living agent, per step, in niche → resolved local context node:

move:        agent strategy picks a transformation (directed|stochastic|follow|persist)
transform:   cost = rate_weight · cost_scale · reconfig_factor(move)   [if energy on]
             energy < cost  ⇒  STALL (no move; atrophy)               [Inc-3 walls live here]
             [population on] transformation must FIX: eff = realized_prob(p,N)·Pfix(s,N)
influence:   logistic squeeze: influence ·= 1 + R·press·w ;  press = 1 − occ/capacity
ENERGY:      node pool/store → access split → capture → balance:
   access_i  = Pd(position) if energy.capture set, gated by store.gate, else influence
   ε(s)      = extraction efficiency on depletable stores (s = store/ref)   [§17 / B]
   capture_i = min( D_i , ε(s) · pool · access_i / Σaccess )                [§17]
                 D_i = demand ceiling (Holling-II saturation) if energy.demand set, else ∞
   maint_i   = flat scalar | Σ f(held levels)   (P3 maintenance-of-complexity)
   Δenergy_i = capture_i − last_cost − maint_i
   energy ≤ 0 ⇒ DEATH (real removal, share redistributes, extinction event)
   store     = min(cap, max(0, pool − Σcapture) + replenish)               [Inc-5]
stop:        all dead | all done | horizon_years reached | max_steps

Emergent (NOT coded): parsimony-under-scarcity, boom-bust/overshoot-crash, layering-trap/walls, dilution/locality, drift-loss (popgen). Invariants: I1 (no energy block ⇒ byte-identical pre-energy) and I2 (§6d-legacy + P3 contexts ⇒ byte-identical) proven 11/11 byte-identical at every increment.

2. Parameter catalog

Notation: path is the JSON location in a compute/configs/contexts/<ctx>.json. "Methodology" = the Cx/Cm/etc. object it instantiates. "Lit" = §17.8 literature analog.

2A. Engine structure (no energy needed)

ParamPathType / defaultMeaningMethodologyKey couplings
arrangementtopstr (req)which manifestation arrangement (biology/entity/…)the domainsets coherence manifold for _coherent
chain_leveltopstr (req)level within the arrangement (e.g. organism-architecture)Sc / chain levelsets primitive set + rate tables
niches.<n>.capacitynichefloat (req)finite competitive mass of the nicheEcosystem Rg carrying capacity× R ⇒ competitive equilibrium; default energy pool if no energy_pool
agents[].mn / targetagentstrstart manifestation / directed endpointMntarget may be omitted for non-directed strategies
agents[].rateagentstrrate schedule key (calibration)Tj / kineticssets rate_weight per move → transform cost & wall-clock
agents[].influence0agentfloat / 1.0initial competitive share weightseeds logistic; default access when no energy.capture
horizon_yearstopfloat / nonewall-clock stop (Σ rate·step_years)Tj horizoninteracts with rate/step_years; deep-time domains need large values
max_stepstopint / 50hard step captruncates slow regimes; raise for long climbs

2B. Energy — master switch & budget

ParamPathType / defaultMeaningMethodologyLit / couplings
energy.enabledenergybool / falseturns the whole energy/selection/death layer onOFF ⇒ I1 byte-identical (pure topo+logistic)
energy.startenergyfloat / 1.0initial per-agent energy (agent energy0 overrides)initial Cx statebuffer before first starvation; couples to maint/cost
energy.pool_per_stepenergyfloat / niche.capacityflat per-step niche energy supply (non-store nodes)Cx En availability (flow)primary scarcity dial with maintenance.scale; Rosenzweig "enrichment" axis
energy.cost_scaleenergyfloat / 1.0scales every transform cost (rate_weight·cost_scale)Cm Cs (transform draw)× rate_weight × reconfig = move affordability; raises stall rate

2C. CAPTURE term (§14 unified + §17 fix)

capture_i = min( D_i , ε(s) · pool · access_i / Σaccess )

ParamPathType / defaultMeaningMethodologyLit / couplings
energy.capture.formenergy.captureflat-per-level|primitive-weighted|coherent-only / (absent⇒access=influence)position-dependent capture capability (access)Cm Pd (production/capture)absent ⇒ legacy influence-share (I2). primitive-weighted ⇒ deep structure captures superlinearly
energy.capture.scaleenergy.capturefloat / 1.0scales access weightCm Pdonly relative (normalized by Σaccess) — affects split, not absolute
energy.demand.formenergy.demandneed-multiple|flat / (absent⇒D=∞)§17(A) per-agent saturation ceilingCm Cs requirement-bounded drawHolling Type II. absent ⇒ no cap (byte-identical). Caps how much of pool is actually drawn
energy.demand.headroomenergy.demandfloat / 2.0D_i = H·(last_cost+maint) (need-multiple)metabolic requirement × bufferH→1 knife-edge (no reserve); H large ⇒ ceiling rarely binds
energy.demand.valueenergy.demandfloat / ∞D_i = V (flat form)fixed absorptive capacityflat ceiling regardless of need
store.extraction.formnodepower|saturating / (absent⇒ε≡1)§17(B) depletion-dependent extraction efficiency (depletable stores only)Cm Cy (store) × Cx En stateMonod/Holling-II / Hotelling. absent ⇒ ε≡1 (byte-identical, one-step-drain)
store.extraction.knodefloat / 0.0ε = s^k (power); k=0⇒ε≡1, 1=linear, >1 sharperextraction-difficulty curvaturegoverns asymptote sharpness; k=0 is the byte-identical default
store.extraction.halfnodefloat / 0.25ε = s/(s+h) (saturating) half-saturationMonod K_ssmaller h ⇒ efficient until nearly empty; larger h ⇒ early throttling

2D. MAINTENANCE & TRANSFORM (P3 + Inc-3)

ParamPathType / defaultMeaningMethodologyLit / couplings
energy.maintenance (float)energyfloat / 0.05§6d flat scalar maintenance (back-compat)Cm Cs basal drawfloat ⇒ byte-identical §6d path
energy.maintenance.formenergy.maintenanceflat-per-level|primitive-weighted|off-manifold-scaled / flat-per-levelmaintenance-of-accumulated-complexity (the parsimony centerpiece)Cm Cs of holding structuredict opts into P3. primitive-weighted = convex (Σv²) ⇒ enables interior optimum
energy.maintenance.scaleenergy.maintenancefloat / 1.0cost per held levelCm Csprimary scarcity dial with pool_per_step; raises parsimony pressure
energy.maintenance.off_manifold_multenergy.maintenancefloat / 2.0×cost when off-manifold (off-manifold-scaled)coherence penalty (annotation→cost)use sparingly: re-imports a coherence-as-fitness term (licensed-claims caution)
energy.reconfiguration.rules[]energy.reconfigurationlist {prim,at_or_above,factor} / noneInc-3 analyst-declared wall: transform cost ×factor when raising prim≥levelopen-Q#10 (declared, not derived)× cost_scale = wall height; high factor ⇒ emergent never-cross (layering-trap)

2E. Context / locality (Inc-2)

ParamPathType / defaultMeaningMethodologyCouplings
niches.<n>.energy_poolnichefloat / pool_per_stepniche-level energy supply overrideCx En (niche)per-niche scarcity
niches.<n>.context_nodesnichetree of {path: spec}nested local Cx nodes (relaxation-resolved)Cx locality co-varies Sc (§7.0)enables dilution/locality; absent ⇒ niche is one flat node (byte-identical)
<node>.energy_poolnodefloat / base_poolflat local-node supplyCx En (local)crowding N agents on one node ⇒ density dilution (emergent Rg)
agents[].context_nodeagentstr / noneagent's path in the context treeCx positionwhich local node the agent draws from
context_resolution_depthtopint / nonerelaxation knob: truncate ctx_path to N segmentsSc-bounded view()coarser depth ⇒ more agents share a node ⇒ more dilution

2F. Depletable stores (Inc-5)

A context_nodes entry that is a store dict (has store) instead of a flat energy_pool.

ParamPathType / defaultMeaningMethodologyLit / couplings
<node>.storenodefloat (req for store)initial finite stock; persistent across stepsCm Cy stockwith replenish ⇒ boom-bust if consumption≫replenish
<node>.replenishnodefloat / 0.0per-step refill added backCm Cy cycling / Pd inflowthe oscillation dial: replenish ≪ draw ⇒ crash; ≈ draw ⇒ limit-cycle candidate
<node>.capnodefloat / ∞max store (also ε reference if set)carrying capacity of the stockcaps recovery ceiling; sets s = store/cap
<node>.gate.prim / .minnodestr / intaccess only if pos[prim] ≥ min (Pd-unlock)Cm Pd1→Pd2 phase transitionthe "unlock a new energy KIND" wall; absent ⇒ open (byte-identical)
<node>.extraction.*nodesee 2Cdepletion-dependent ε on this storeCm Cy×Cx Enthe §17 asymptote; without it the store one-step-collapses

2G. Population-genetics layer (deep, opt-in; biology)

ParamPathType / defaultMeaningLit / couplings
population.enabledpopulationbool / falseturns deterministic expected-fixation on (techno: leave off)OFF ⇒ byte-identical
population.size / agent pop_Npopulation/agentfloat / 1e3effective population size Norigination ∝ 1/(Np); drift if Ns≲1
population.per_trial_prob / pop_ppopulation/agentfloat / 1e-2per-trial transition prob prealized_prob = 1−(1−p)^N
population.selection_coeff / pop_spopulation/agentfloat / 0.0selection coefficient sKimura P_fix=(1−e^−2s)/(1−e^−2Ns); s=0 ⇒ neutral 1/N
population_context / agent population_contextpopulation/agentstr / nonelit-calibrated N/p/τ filewires quantitative literature checkpoint

2H. Behavior / strategy (plan §6o)

ParamPathType / defaultMeaningCouplings
behavior.enabledbehaviorbool / falseenable per-agent move policyabsent ⇒ all directed (byte-identical)
agents[].strategyagentdirected|stochastic|follow|persist / directedmove policyonly energetically consequential once energy/maint makes the path cost (§17/P3)

2I. Fixed model constants (NOT config — but part of the coupled system)

These are hardcoded in evolve.py; documented because they couple like parameters. Changing them is an engine change (design-review-first).

ConstantValueWhereMeaningNote
R0.15influence logisticcompetitive growth ratewith niche.capacity sets equilibrium speed
press weightsdone 1.0 / contender 0.4 (growth); done 0.3 / contender 1.3 (squeeze)influence logisticestablished shielded in squeeze, capture more in growthbounded determination (no runaway first-mover)
dilution floortot = Σaccess or 1.0capturedivide-by-zero guard; regime discontinuity when Σaccess<1 (partial vs full split)§17.6: ε+demand demote its significance; flagged for regime-map
death thresholdenergy ≤ 0.0selectionhard removal (not soft decay)extinction = discrete Convergence Collapse

3. Dominant coupling map (the "PDE matrix", qualitatively)

The interactions that actually move regimes (use this to reason about a sweep before running it):

4. Scenario plan & expected regimes

Method: vary one axis at a time off a common baseline, predict the regime from §3 + the §17.8 literature, run, check the result maps to the prediction. "Maps back to what we expect" = the qualitative regime + response direction match (NOT absolute numbers — cartography). A non-matching result is investigated as likely our error (scoring/encoding/config) before being treated as a finding.

Baseline: biology-store-extraction-test (biology, organism-architecture, store 5.0 / replenish 0.05, extraction saturating h=0.25, demand need-multiple H=2, P3 flat-per-level maint).

#ScenarioKnob change vs baselineExpected regimeLiterature anchorVerifies
S1Parsimony-under-scarcitymaintenance.scale ↑ / pool ↓minimal/stationary lineage survives; climbers starve extinctmetabolic cost of complexity; r/KP3 centerpiece
S2Abundancepool_per_step ↑ (or replenish ↑)all lineages sustain; weak competitive sort onlyscarcity axis sign
S3Boom-bust / limit-cyclereplenish swept toward draw rate; extraction.half midovershoot → gradual drawdown → crash; cycle if replenish≈drawRosenzweig–MacArthur§17 fix unlocks this
S4Paradox of enrichmentstore ↑ and/or replenish ↑ progressivelylarger-amplitude oscillation, more extinction (counter-intuitive)Paradox of enrichmentmodel reproduces the named destabilization
S5Extraction-curvature sweepextraction k = 0 → 1 → 3 (power)k0 = old one-step collapse; k↑ = stronger asymptote, slower drawdown, store never emptiesHotelling economic-vs-physical exhaustionB mechanism monotonic & correct
S6Demand-ceiling sweepdemand.headroom 1 → 2 → 8low H = knife-edge no-reserve; high H = ceiling rarely binds → ≈ uncappedHolling Type II handling-timeA mechanism monotonic
S7Wall / layering-trapreconfiguration rule on a key prim, factor ↑agent stalls at the attractor for all steps, never crossesopen-Q#10 / lock-inInc-3 emergent wall
S8Locality / dilutioncontext_nodes crowded vs alone; resolution_depthcrowded node < baseline < alonedensity-dependent RgInc-2 participant-relativity
S9Gated unlockstore.gate on a prim; agent climbs through the gateno capture until pos≥gate, then access opens (radiation)Pd1→Pd2 phase transitionInc-5 gate (not yet exercised)
S10Cross-domain transferrun S1–S5 on entity / cognition / abiogenesis, common regimesame qualitative regimes, domain-characteristic timingmethodology: each level has own Cx/Cmnot tech-overfit

Order: S5/S6 first (single-mechanism monotonicity sanity — cheapest, confirms the §17 build behaves), then S1/S2 (scarcity axis sign), then S3/S4 (the boom-bust/oscillation search — the headline open question), then S7/S8/S9 (walls/locality/gate), then S10 (cross-domain). Each run: confirm I1/I2 untouched (config-only changes), record regime vs prediction, honest-negative if a regime doesn't appear at the tried point (it's a parameter search, not a failure).

What "good" looks like: S5/S6 monotonic in the predicted direction; S1↔S2 flip across the scarcity boundary; S3/S4 produce the Rosenzweig–MacArthur stable→cycle→crash structure with enrichment destabilizing; S7 a clean never-cross; S10 same regimes across domains. That is the "maps back to what we expect" gate before any paper-harvest.

5. Scenario run log

S5/S6 — monotonicity sanity — PASS, both mechanisms correct in direction

Config-only contexts off the biology-store-test regime (I1/I2 untouched by construction). Sanity anchor biology-s5-extraction-k0 confirmed dynamics-identical to biology-store-test (whole-file diff differs only in the context/name metadata — not a model bug; my first sanity check was mis-specified, corrected). ε=s⁰≡1 reproduces the no-extraction path exactly ⇒ §17 byte-identical default holds at trace level.

S1/S2 — scarcity axis — FLIP confirmed, correct sign

Survivor count is monotone in available energy ⇒ the scarcity axis has the predicted sign and the survive/starve flip is present:

Pointstore / replenish / maint.scalesurvivorsreading
S2 abundant30 / 2.0 / 0.015all 3 (climber holds 0.177)abundance ⇒ even the complexity-climber sustains (the flip)
baseline5 / 0.05 / 0.015prok + vascular (climber extinct@7)the parsimony-wins regime — minimal + incumbent persist, climber starves
S1 scarce1 / 0.02 / 0.05none (universal extinction@2)OVERSHOT past the parsimony band into the known §6d universal-extinction corner

Honest note: S1 was set too harsh and landed in universal-extinction (a documented degenerate corner), so the clean "minimal-wins-while-others-die" picture is the baseline, not S1; the parsimony band lies between baseline and S1. Not tuned to force a cleaner S1 (regime-not-magnitude / anti-p-hack) — precise band location is regime-map work (a finer scarcity sweep). New contexts: biology-s1-parsimony-scarce, biology-s2-abundance.

S3 — boom-bust search — HONEST NEGATIVE; two structural blockers localized

Replenish sweep {0.5, 1.5, 3.0}, saturating extraction h=0.25 (per the S5 windfall/tail finding), store 5, max_steps 120. No oscillation at any point (no overshoot→recovery; final distribution identical to S2-abundant). The non-result is structural, not a failure, and it precisely localizes what boom-bust requires:

  1. Run terminates at the "all done" stop (step 9). Directed agents reach their targets fast, so the simulation ends long before slow store-depletion dynamics can develop — there is no sustained consumption pressure to drive a cycle.
  2. Irreversible death. Dead agents are permanently removed (no recolonization/rebirth), so a sustained predator-prey limit cycle is structurally precluded by the current engine. The engine can produce a single overshoot→crash (the original biology-store-test climber@7) but not a repeating cycle.

⇒ Observing boom-bust needs (a) non-finishing consumption pressurepersist/target-less agents so the run doesn't end at "all done" (config-only, tryable), and/or (b) for a sustained cycle, a recolonization/rebirth mechanism (a real engine change, design-review-first, NOT to be added reactively). S4 (paradox-of-enrichment) is moot until S3 can produce a cycle and is deferred behind this decision. New contexts: biology-s3-replenish-{0p5,1p5,3p0}. Not p-hacked (no tuning to manufacture a cycle); the §14 lesson applies — a structure-dependent non-result is not a falsification, it is a localized design question.

(d-explore) — ls-population sustained-pressure phase map — BOOM-BUST+RECOVERY CONFIRMED + honest RM divergence

Config-only on the §6.7 plumbing (zero-reg by construction). Store 5.0, sat-ext h0.25, demand H2, scope.mode=ls-population, max_steps 60. Replenish swept:

replenishregimedetail
≲ 0.15universal-extinction crashsustained draw collapses the store; all extinct (.05@13, .15@24)
0.3 – 0.6BOOM-BUST + RECOVERY (robust band)overshoot → costly lineages extinct (colonial always first; vascular too at ≤.45) → survivor(s)+store crash to a trough then recover (rep .3 peak4.96→trough0.44@13→end6.08; .35/.45/.6 same signature; 1 survivor at .3–.45, 2 at .6)
≳ 1.0all-sustainminor transient then monotone growth

Headline: the boom-bust the whole §17/§18 arc targeted is now demonstrated and robust across a band (not a knife-edge). The recovery arm — structurally blocked before §18 — is present without any rebirth (survivor + no-longer-over-drawn store rebound), exactly validating the §18.1 corrected analysis (store/reserve oscillation needs no population recovery; only a sustained cycle does). Emergent, not coded. Face validity: the costly off-manifold complexity-climber dies first under sustained pressure; the low-cost persister survives the bottleneck and recovers — parsimony-under-sustained-pressure, faithful.

Honest RM divergence (paradox-of-enrichment cross-check, rep 0.4, store 5→15→40): enrichment → fewer deaths, not more (store5: 2 deaths; store15: 2 but delayed; store40: 0, all sustain). This is the opposite of classical Rosenzweig–MacArthur — and it is correct: the current model is resource-depletion (consumer + finite store), not predator-prey — irreversible death, no predator-feedback oscillator (that is the deferred branch/population policy). Enrichment buffers the crash rather than destabilizing it. This quantitatively localizes what (b-policy) is for: sustained limit cycles AND the RM paradox genuinely require population-recovery/predator-feedback — confirming the contract's "policy-gated, not plumbing-gated" claim with evidence. The literature anchor is correctly not reproduced because its structural prerequisite isn't built yet (honest, expected — not a defect). New contexts: biology-d-lspop-rep{0p05,0p15,0p3,0p35,0p45,0p6,1p0,2p0}, biology-d-enrich-st{5,15,40}.

§7 split policy BUILT — engine OK; "RM VALIDATION" RETRACTED as an ARTIFACT (corrected on first visualization)

§7 implemented (5 additive edits): split config block + _split_fires trigger predicate (none default / off-maintenance-set / pressure-gated / stochastic, bounded by max_branches_per_lineage + min_steps_between); move-loop converts a normal move → §6.5 branch directive on fire, parent→persist (maintenance), child→directed (§7.2 asymmetry); _spawn_child honors child_strategy; conditional split output field. Zero-regression 13/13 byte-identical (split path dormant when no block), gates 331/333 + 202/0/25. The engine mechanism and zero-regression still stand. The validation claim below does not.

RETRACTION — the "RM paradox-of-enrichment CONFIRMED / discriminating cross-validation" claim was an artifact, found the moment the runs were first visualized (the original claim was inferred from the single turnover integer without looking at the dynamics).

What the figures (output/figures/evolve-biology-d-enrich-st{5,15,40}-split.png) actually show, corroborated by the engine code (evolve.py:399-424):

storelineagesdeathsdynamics (observed in the figure)
5109single spike (steps 1–4) → synchronized mass death step ~5 → 1 survivor flat
153332single spike (steps 1–6) → synchronized mass death step ~7 → 1 survivor flat
406261single spike (steps 1–7) → synchronized mass death step ~7–8 → 1 survivor flat

Contexts retained as legitimate artifacts: biology-d-enrich-st{5,15,40}-split (now correctly understood as the artifact demonstrator). Instrument built this correction: plot_evolve.py rewritten dynamic-aware (union agent set, measures-optional, population/energy/lineage-tree/share panels).

Cross-domain drive — §3 stress-test made executable — consistent, honest, NO oscillation anywhere

The §3 conceptual stress-test was never run; now it is. Faithful biology-d-enrich-st15-split mirror authored onto each domain's own niche/agents/calibrated-rate: a no-split ls-population twin + a split run for abiogenesis / techno / cognition (config-only, additive; engine unchanged; figures output/figures/evolve-{abiogenesis,techno,cognition}-d-{lspop,split}.png).

Domain (arrangement)no-split ls-populationsplit (off-maintenance-set)
abiogenesis (biology)sustained 60-step run; single overshoot → drawdown → staggered deaths (prok@22, vascular@24) → colonial survivessame combinatorial artifact — 32 lineages #b1..#b5, synchronized death @5–6, 1 survivor (vascular). Artifact generalizes wherever target is off-manifold
techno (entity)sustained; git climbs to its 17-move target @17 then dies @26, at-protocol @59, incumbent postgres winsbyte-identical to no-split — the trigger NEVER fired (3 agents, 0 branches): git's climb to entity-system is coherent/on-manifold, so off-maintenance-set never triggers
cognition (cognition)universal extinction @ step 7 (both)universal extinction @ step 7 (both); split dormant

Three findings, all honest:

  1. The engine's genuine (non-artifact) behavior is robust and consistent across 3 domains/2 arrangements: a single overshoot → drawdown → one survivor (competitive exclusion, staggered deaths). There is NO sustained oscillation / limit cycle anywhere. The no-split scope contract works (60-step sustained runs, correctly does not stop at all-done). This strongly suggests the entire RM/limit-cycle premise was structurally unreachable with the current mechanisms — not a tuning miss.
  2. The off-maintenance-set split trigger has no useful regime. Off-manifold target ⇒ combinatorial artifact (biology, abiogenesis); coherent/on-manifold target ⇒ trigger never fires, split byte-identical to no-split (techno). It never produces useful cladogenesis — it is a miscalibrated cladogenesis model, confirmed across domains. (The techno split≡no-split byte-identity is itself a clean confirmation of the diagnosed root cause.)
  3. The biology-calibrated energy regime does NOT transfer to cognition (universal extinction @7 — the transplanted pool/cost/maintenance/store scale mismatches civilizational-cognitive-calibrated). Reported as an honest parameter-transfer negative; not tuned to fix reactively (observe-not-force). A faithful cognition run would need its own energy calibration — design-review-first if pursued.

Net (observation, not a verdict): driving all domains shows consistent no-split competitive dynamics; the off-maintenance-set trigger combinatorially explodes on off-manifold targets. This is what the system does under those settings — not the system's ceiling (only one trigger, population dropped, a slice of the space). Continued exploration below changes the picture. New contexts: {abiogenesis,techno,cognition}-d-{lspop,split}.

Population genuinely engaged + a new on-fixation trigger — paced cladogenesis WORKS

Exploration continued (per "stop deferring population; sweep the space; be proactive"). Two things put in:

Verified-in-code finding — the population fixation gate was inert as previously wired. realized_probability(p,N)=1−(1−p)^N saturates to exactly 1.0 whenever N·p≫1 (every cumulative-cell-year context: prok→euk N=1e30·p=1e-22; euk→bilat N=1e31·p=3e-11 → both 1.0). kimura_pfix returns exactly 1.0 when selection s is unset (the neutral zero-regression default). Contexts supply no s; the loader does not apply their subpopulation_fraction (1e-6). ⇒ eff = 1·1 = 1 ⇒ every move fixes instantly ⇒ population does not gate anything. This verifies the user's standing point that population was effectively deferred/absent — it is wired but a no-op without a real selection coefficient (or sub-population-filtered effective N).

Engine addition — split.trigger: "on-fixation" (additive, opt-in, zero-regression PROVEN). Cladogenesis coupled to an actual pop-gen fixation event (a divergent variant that has fixed founds a child; parent persists), instead of to the candidate move. Two guarded edits + _onfix_branch helper; only reachable when trigger=='on-fixation' AND a move fixes (inside the pop_on branch). Re-running representative existing contexts (legacy tj-directed, off-maint split, stochastic split, pop-lspop) ⇒ byte-identical; gates 331/333+202/0/25 held.

Result — with population genuinely engaged (real per-agent selection coefficient s, activating Kimura Pfix≈2s≪1), cladogenesis becomes population-rate-limited, NOT combinatorial:

contexts"fixing" delay eventsbranch eventslineagesreading
biology-d-pop-split-onfixunset0 (instant fix)3033gate inert ⇒ every-step (= the artifact)
biology-d-pop-onfix-s020.023314fixation paced ⇒ one clean cladogenesis
biology-d-pop-onfix-s050.053014one branch
biology-d-pop-onfix-s150.1524710paced radiation: branch count scales with s

The lineage tree at s=0.15 is a sane radiation-then-pruning: ~10 lineages born spread over steps 5–13 (paced by the fixation clock), founders persisting as long bars — not the dense combinatorial stack. Branch count is monotone in the selection coefficient (1→1→7 as s 0.02→0.05→0.15): cladogenesis-rate is governed by the pop-gen fixation rate, exactly as a principled model should behave. This is what the system does when population is genuinely engaged — the combinatorial behaviour was a consequence of the inert gate, not an intrinsic limit. (Scope note: this is paced-cladogenesis working; it is NOT a re-validation of the retracted RM claim — that stays retracted. Separate, sound mechanism. Observation, open to challenge.) New: on-fixation engine trigger; contexts biology-d-pop-{lspop,split-offmaint,split-stoch,split-pressure,split-onfix,split-onfix-slowclimb}, biology-d-pop-onfix-s{02,05,15}.

Filled biology curve + cross-domain transfer — sweep-s-curve-cross-domain.png. Extended the biology curve to 8 points: branches 1,1,1,3,3,7,7,8 at s = 0.02, 0.04, 0.05, 0.08, 0.10, 0.15, 0.20, 0.30 (clean sigmoid; transition s≈0.05→0.08; plateau s≳0.15). Cap variants at s=0.15: cap=4 ≡ cap=8 (7 branches; cap not binding), cap=2 ⇒ 6 (only barely binding) — cap is not the dominant lever at these s values, the fixation/time budget is. No-split control with real s (biology-d-pop-lspop-s05): population gating reshapes the competitive dynamics too (staggered deaths colonial@34/vascular@37 vs. ungated 41/31 vs. no-population synchronized @7-8) — slower, more drawn-out exclusion. Cross-domain transfer at s ∈ {0.05, 0.15, 0.30}:

domain (arrangement)branches @ s=0.05@ s=0.15@ s=0.30reading
biology (biology)178paced radiation + pruning
abiogenesis (biology)178superimposes biology — same arrangement ⇒ same curve
techno (entity)0 (coexist, 0 deaths)0 (2 deaths)0 (1 death)coherent climb ⇒ no divergent fixations ⇒ no cladogenesis; deaths vary non-monotone in s (regime substructure)

Reading: arrangement determines whether on-fixation can fire at all (off-manifold-target arrangements ⇒ yes, paced cladogenesis; coherent-target arrangements ⇒ no, just slower competition under pop gating); selection coefficient sets the rate where firing is possible. New scripts: compute/scripts/plot_sweep_summary.py (domain-general, multi-series overlay). New contexts: biology-d-pop-lspop-s05, biology-d-pop-onfix-s{04,10,20}, biology-d-pop-onfix-s15-{cap2,cap8}, {abiogenesis,techno}-d-pop-onfix-s{15,30}. Figure: output/figures/sweep-s-curve-cross-domain.png. Observation, open to challenge.

Techno fine-grain + energy_frac + replenish + no-split controls.

Net: the engine + population-gated on-fixation mechanism is characterized along three independent dials (s, energy_frac, replenish) with reproducible, monotone-or-peaked, principled dose-response — domain-aware (arrangement gates whether cladogenesis fires at all). Real, presentable system structure. Gates green throughout (331/333+202/0/25); no engine changes since on-fixation (zero-reg proven byte-identical).

Continued probe: s × rep heatmap, reproducibility, binding-knob map.

New contexts authored this batch: ~50 across the mn × s, mn × rep, rep × s grids + steady-state probes + cross-domain transfer. Scripts: plot_sweep_heatmap.py (multi-series 2D); plot_sweep_summary.py (multi-series 1D overlay).

Manifestation-space coverage — the radiation explores LOCALLY

User-raised coverage concern: do the branched lineages actually recover known manifestations, or just wander the lattice abstractly? Built compute/scripts/analyze_branch_mn_recovery.py — for each lineage's final position, matches against all biology Mns at the chain level (exact for point Mns, range-bracketed for bracketed Mns).

Result (observation, not conclusion): every lineage in every run lands at a position matching SOME known Mn (100% match rate, 0 novel positions), BUT this is partly an artifact of 3 wide-range "ecological role" Mns (habitat-engineer, primary-producer, decomposer-recycler) whose position ranges match nearly anything. The structurally specific Mns recovered are ~7–11 out of 69 available, regardless of how rich the radiation is.

SetupLineagesUnique Mns recovered
3-founder default (phylogenesis-stem prok/colonial/vascular)1810–11
3-founder + low mn (richer radiation)6210 (no gain)
3-founder + very-low mn (long transient)23510 (no gain)
4-founder diverse (amphi / arabid / c-elegans / castor)1214
4-founder spread (chlamy / acropora / drosophila / callorhinchus)1113
4-founder spread + low mn (63 lineages)6314 (no gain over the 11-lineage 4-founder run)

Reading: the cladogenesis mechanism is fundamentally a local-diversification tool (branches diverge by single-primitive moves from parents, stay in parents' manifestation neighborhood), NOT an exhaustive Mn-discovery tool. Each founder seeds a small local Mn cloud (~3 specific Mns); total coverage is bounded by founder-region diversity, not by lineage count. Adding 200 more branches at the same founder positions yields ZERO new Mn coverage. To cover the full Mn library would need either (a) many more diverse founders, (b) multi-primitive divergence moves, or (c) a long-distance migration/jump mechanism — none currently implemented. New contexts: biology-d-pop-onfix-s15-rep200-{diverse-founders,spread-founders,spread-mn0p005}. New script: analyze_branch_mn_recovery.py.

This is a real mechanism characterization finding — it matches how biological speciation actually works (gradual divergence from parents, not global jumps), but it means the engine in current form does not serve as an exhaustive manifestation-space mapper. Open question for any future design: should it?

New scripts: compute/scripts/plot_sweep_heatmap.py (2D-grid heatmap, domain-general). Figures: heatmap-s-x-rep-biology.png, sweep-{cap,ms,nc,st,hd}-curve-at-s15-rep200.png. Many new probe contexts under biology-d-pop-onfix-* (cap/ms/nc/st/hd/cs/mn/cp/eh variants + s×rep grid cells + seed42 control).