{
  "format": "preylab-design-reference",
  "referenceVersion": 1,
  "modelVersion": 4,
  "dnaSchemaVersion": 1,
  "generatedFrom": [
    "model.js",
    "physical.js",
    "ecology.js",
    "grazer.js",
    "propagules.js",
    "chemistry.js",
    "population.js",
    "index.cfm"
  ],
  "status": {
    "implemented": "implemented and source-derived",
    "experimental": "experimental engine behavior",
    "unavailable": "not implemented"
  },
  "environment": {
    "referenceVersion": 1,
    "modelVersion": 4,
    "coordinates": {
      "x": [
        0,
        1
      ],
      "y": [
        0,
        1
      ],
      "z": [
        0,
        1
      ],
      "depthAspect": 0.12,
      "unit": "normalized dish widths",
      "volumeScale": "cuberoot(clamp(volume,1,1000))",
      "volumeRange": [
        1,
        1000
      ]
    },
    "time": {
      "stepMs": 20,
      "unit": "simulated milliseconds",
      "offlineCatchUp": false
    },
    "field": {
      "dimensions": {
        "x": 8,
        "y": 8,
        "z": 3
      },
      "maxConcentration": 4,
      "maxPatches": 256,
      "sampling": "trilinear eight-corner interpolation plus local Gaussian patches"
    },
    "lamp": {
      "height": 0.3,
      "lightRange": [
        0,
        100
      ],
      "pitchDegrees": [
        0,
        60
      ],
      "azimuthDegrees": [
        0,
        360
      ],
      "turbidity": [
        0,
        8
      ],
      "beamDiameterPercent": [
        10,
        100
      ],
      "defaultCycle": {
        "enabled": false,
        "periodMs": 120000,
        "duty": 0.5,
        "transitionMs": 10000,
        "phaseMs": 0,
        "anchorAt": 0
      }
    },
    "biology": {
      "compoundRegistryVersion": 1,
      "compounds": {
        "organic": {
          "label": "Organic volatile",
          "decayMs": 9000,
          "affinity": {
            "organic": 1,
            "alarm": 0.16,
            "social": 0.22
          }
        },
        "alarm": {
          "label": "Alarm volatile",
          "decayMs": 7000,
          "affinity": {
            "organic": 0.18,
            "alarm": 1,
            "social": 0.24
          }
        },
        "social": {
          "label": "Social volatile",
          "decayMs": 15000,
          "affinity": {
            "organic": 0.28,
            "alarm": 0.14,
            "social": 1
          }
        },
        "irritant": {
          "label": "Irritant",
          "decayMs": 7500,
          "affinity": {
            "organic": 0.08,
            "alarm": 0.32,
            "social": 0.04
          }
        },
        "motor": {
          "label": "Motor inhibitor",
          "decayMs": 7500,
          "affinity": {
            "organic": 0.06,
            "alarm": 0.25,
            "social": 0.05
          }
        },
        "sensory": {
          "label": "Sensory inhibitor",
          "decayMs": 7500,
          "affinity": {
            "organic": 0.05,
            "alarm": 0.27,
            "social": 0.06
          }
        }
      },
      "legacyChannelMap": {
        "mate": "social",
        "aversive": "alarm",
        "kin": "social",
        "food": "organic",
        "rot": "organic",
        "toxin-irritant": "irritant",
        "toxin-motor": "motor",
        "toxin-sensory": "sensory",
        "alga-warning": "alarm",
        "alga-surplus": "organic"
      },
      "chemicalChannels": [
        "mate",
        "aversive",
        "kin",
        "food",
        "rot",
        "toxin-irritant",
        "toxin-motor",
        "toxin-sensory",
        "alga-warning",
        "alga-surplus"
      ],
      "chemicalLifetimeMs": {
        "mate": 30000,
        "aversive": 12000,
        "kin": 10000,
        "food": 14000,
        "rot": 20000,
        "toxin-irritant": 12000,
        "toxin-motor": 14000,
        "toxin-sensory": 14000,
        "alga-warning": 9000,
        "alga-surplus": 16000
      },
      "chemicalDecayMs": {
        "mate": 18000,
        "other": 7500
      },
      "chemicalPacketCap": 256,
      "propaguleCap": 128,
      "consumerSenseMs": 200,
      "consumerMemoryMs": 1800,
      "handlingMs": 600,
      "feedCooldownMs": 1400
    },
    "sources": [
      "ecology.js",
      "model.js",
      "physical.js",
      "chemistry.js",
      "propagules.js",
      "grazer.js"
    ],
    "environmentImportSupported": false
  },
  "environmentControls": {
    "volume": {
      "type": "range",
      "min": 1,
      "max": 1000,
      "step": 1,
      "uiInitial": 200,
      "source": "index.cfm:input; verify actual state defaults separately"
    },
    "cell-limit": {
      "type": "range",
      "min": 1,
      "max": 512,
      "step": 1,
      "uiInitial": 128,
      "source": "index.cfm:input; verify actual state defaults separately"
    },
    "support-limit": {
      "type": "range",
      "min": 0,
      "max": 100,
      "step": 5,
      "uiInitial": 25,
      "source": "index.cfm:input; verify actual state defaults separately"
    },
    "mutation-rate": {
      "type": "range",
      "min": 0,
      "max": 100,
      "step": 1,
      "uiInitial": 12,
      "source": "index.cfm:input; verify actual state defaults separately"
    },
    "temperature": {
      "type": "range",
      "min": 5,
      "max": 40,
      "step": 1,
      "uiInitial": 22,
      "source": "index.cfm:input; verify actual state defaults separately"
    },
    "nutrients": {
      "type": "range",
      "min": 0,
      "max": 100,
      "step": 1,
      "uiInitial": 55,
      "source": "index.cfm:input; verify actual state defaults separately"
    },
    "drift": {
      "type": "range",
      "min": 0,
      "max": 100,
      "step": 1,
      "uiInitial": 35,
      "source": "index.cfm:input; verify actual state defaults separately"
    },
    "auto-current-strength": {
      "type": "range",
      "min": 0,
      "max": 100,
      "step": 1,
      "uiInitial": 45,
      "source": "index.cfm:input; verify actual state defaults separately"
    },
    "auto-nutrient-amount": {
      "type": "range",
      "min": 0,
      "max": 24,
      "step": 1,
      "uiInitial": 12,
      "source": "index.cfm:input; verify actual state defaults separately"
    },
    "light": {
      "type": "range",
      "min": 0,
      "max": 100,
      "step": 1,
      "uiInitial": 68,
      "source": "index.cfm:input; verify actual state defaults separately"
    },
    "beamDiameter": {
      "type": "range",
      "min": 10,
      "max": 100,
      "step": 1,
      "uiInitial": 100,
      "source": "index.cfm:input; verify actual state defaults separately"
    },
    "pitch": {
      "type": "range",
      "min": 0,
      "max": 60,
      "step": 1,
      "uiInitial": 0,
      "source": "index.cfm:input; verify actual state defaults separately"
    },
    "azimuth": {
      "type": "range",
      "min": 0,
      "max": 360,
      "step": 1,
      "uiInitial": 0,
      "source": "index.cfm:input; verify actual state defaults separately"
    },
    "cycle-period": {
      "type": "range",
      "min": 10,
      "max": 3600,
      "step": 10,
      "uiInitial": 120,
      "source": "index.cfm:input; verify actual state defaults separately"
    },
    "cycle-duty": {
      "type": "range",
      "min": 0,
      "max": 100,
      "step": 5,
      "uiInitial": 50,
      "source": "index.cfm:input; verify actual state defaults separately"
    },
    "cycle-fade": {
      "type": "range",
      "min": 0,
      "max": 300,
      "step": 5,
      "uiInitial": 10,
      "source": "index.cfm:input; verify actual state defaults separately"
    },
    "cycle-phase": {
      "type": "range",
      "min": 0,
      "max": 99,
      "step": 1,
      "uiInitial": 0,
      "source": "index.cfm:input; verify actual state defaults separately"
    },
    "turbidity": {
      "type": "range",
      "min": 0,
      "max": 8,
      "step": 0.1,
      "uiInitial": 1,
      "source": "index.cfm:input; verify actual state defaults separately"
    }
  },
  "featureDefaults": {
    "chemicalCues": true,
    "contactExchange": true,
    "fusionPropagules": true,
    "acquiredDna": true,
    "toxicEffects": true,
    "algaeCommunication": true
  },
  "equations": {
    "structuralMass": {
      "source": "model.js:structuralMass",
      "rule": "bodySize^3 × (alga ? biomassDensity × (1 + 0.1 × storageInvestment) : 1) × (1 + 0.035 × sensorCost)",
      "units": "modeled mineral mass",
      "sensorCostGenes": [
        "ambientSense",
        "directionalSense",
        "chemicalSense",
        "disturbanceSense",
        "emissionCapacity",
        "toxinSynthesis",
        "irritantResistance",
        "motorResistance",
        "sensoryResistance",
        "detoxification"
      ]
    },
    "bodyRadius": {
      "source": "physical.js:bodyRadius",
      "rule": "mature phenotype radius × cbrt(actual biomass / structuralMass) / cbrt(clamped dish volume)",
      "units": "normalized XY dish width"
    },
    "bodyDepthRadius": {
      "source": "physical.js:bodyDepth",
      "rule": "(0.46 / 7) × bodyRadius / 0.048",
      "units": "normalized Z"
    },
    "bodyContact": {
      "source": "physical.js:bodyMetric",
      "rule": "sqrt((Δx/(r1+r2))² + (Δy/(r1+r2))² + (Δz/(depth1+depth2))²); overlap below 1 − 0.0001",
      "units": "dimensionless"
    },
    "consumerMouth": {
      "source": "grazer.js:edible/biteContact",
      "rule": "prey actual radius ≤ hunter phenotype radius × feedingAperture; prey biomass must fit remaining vacuole and meal energy must fit 200 − stored meal energy; bite reach is family-specific and can be blocked by other bodies",
      "units": "normalized radius and modeled mass"
    },
    "fuelTaper": {
      "source": "model.js:movementFuelFactor",
      "rule": "log1p(9 × clamp(energy / slowdownThreshold,0,1)) / log(10)",
      "units": "fraction of active thrust"
    },
    "temperature": {
      "source": "model.js:step",
      "rule": "max(0,1 − abs(temperature − thermalOptimum) / 25)",
      "units": "gain multiplier"
    },
    "photosynthesis": {
      "source": "model.js:step",
      "rule": "photoCapacity × light/(20+light) × nutrient/(0.35+nutrient) × nutrientCapacity × temperatureFactor × dt; actual gain also needs finite mineral withdrawal at 0.4 mass per energy",
      "units": "modeled energy per step"
    },
    "lamp": {
      "source": "ecology.js:lightTransmission",
      "rule": "full-field exp(−turbidity × depth); narrow beam additionally uses pitch/azimuth, inverse-square distance, smoothstep edge and water path attenuation",
      "units": "fraction of lamp intensity"
    },
    "mutation": {
      "source": "population.js:mutateGenome",
      "rule": "for each locus independently, Bernoulli(mutationRate); delta uniform in [−0.06,0.06] × allele span; clamp or circular-wrap; unchanged draws are not recorded",
      "units": "allele units"
    }
  },
  "controllers": {
    "consumers": {
      "families": [
        "ciliate-grazer",
        "herbivorous-flagellate",
        "raptorial-ciliate",
        "apex-ciliate",
        "floor-ciliate-hunter",
        "openwater-hunter",
        "omnivorous-ciliate"
      ],
      "source": "grazer.js:stepGrazer",
      "senseIntervalMs": 200,
      "memoryMs": 1800,
      "decisionCommitMs": 300,
      "handlingMs": 600,
      "feedingCooldownMs": 1400,
      "priority": [
        "no fuel",
        "nearby threat",
        "contact reversal",
        "satiation / digestion / off-peak rest",
        "feeding cooldown",
        "eligible local prey",
        "carrion where supported",
        "last seen position",
        "explore"
      ],
      "description": "Physical prey sensing is local and family-diet gated. Hunger controls pursuit, not whether an eligible body registers. Dark diurnal hunters lose some visual range. Blocked prey receive a bounded cooldown."
    },
    "algae": {
      "families": [
        "flagellar-alga"
      ],
      "source": "model.js:updateController",
      "senseIntervalMs": 200,
      "priority": [
        "usable energy",
        "sample local light and nutrient probes",
        "choose limiting light, mineral or temperature",
        "steer up a sampled local gradient or explore"
      ],
      "description": "Probes do not supply a global light or nutrient map. Chemical responses are separate local samples."
    },
    "prototypes": {
      "families": [
        "amoeboid-prototype",
        "surface-glider-prototype",
        "passive-drifter-prototype",
        "contractile-prototype"
      ],
      "source": "locomotion.js and population.js",
      "senseIntervalMs": null,
      "priority": null,
      "description": "Several chassis are development seeds. No single shared hunt controller or priority order applies."
    }
  },
  "chemical": [
    {
      "channel": "mate",
      "trigger": "living compatible alga; secretion on mating-readiness event",
      "emitterGate": "alga group, chemicalSense ≥0.2, crossAffinity ≥0.5",
      "receptorGate": "same alga group and receptor gate",
      "resource": "paid body mass + 20 energy per mass",
      "lifetimeMs": 30000,
      "decayTimeConstantMs": 18000,
      "detectionThreshold": "0.000001/max(1,volume)",
      "source": [
        "chemistry.js:emitter/receptor/releaseChemical/releasePassiveOdor/stepChemicalMedium/sampleChemical",
        "population.js:chemical release schedule"
      ]
    },
    {
      "channel": "aversive",
      "trigger": "threatened living cell with chemicalSense and disturbanceSense",
      "emitterGate": "chemicalSense ≥0.2, disturbanceSense ≥0.3",
      "receptorGate": "chemicalSense ≥0.2, disturbanceSense ≥0.3",
      "resource": "paid body mass + 20 energy per mass",
      "lifetimeMs": 12000,
      "decayTimeConstantMs": 7500,
      "detectionThreshold": "0.000001/max(1,volume)",
      "source": [
        "chemistry.js:emitter/receptor/releaseChemical/releasePassiveOdor/stepChemicalMedium/sampleChemical",
        "population.js:chemical release schedule"
      ]
    },
    {
      "channel": "kin",
      "trigger": "moving social cell, flocking ≥0.35 and fuel ≥35; residual 0.000045 mass/s",
      "emitterGate": "chemicalSense ≥0.2, flocking ≥0.35",
      "receptorGate": "same family, chemicalSense ≥0.2, flocking ≥0.35",
      "resource": "paid body mass + 20 energy per mass",
      "lifetimeMs": 10000,
      "decayTimeConstantMs": 7500,
      "detectionThreshold": "0.000001/max(1,volume)",
      "source": [
        "chemistry.js:emitter/receptor/releaseChemical/releasePassiveOdor/stepChemicalMedium/sampleChemical",
        "population.js:chemical release schedule"
      ]
    },
    {
      "channel": "food",
      "trigger": "fed living body passive odor or finite body release",
      "emitterGate": "chemicalSense ≥0.2 and eligible fed state",
      "receptorGate": "foodCueGroups includes source family",
      "resource": "passive odor transferred from accounted body; active release paid",
      "lifetimeMs": 14000,
      "decayTimeConstantMs": 7500,
      "detectionThreshold": "0.00000015/max(1,volume)",
      "source": [
        "chemistry.js:emitter/receptor/releaseChemical/releasePassiveOdor/stepChemicalMedium/sampleChemical",
        "population.js:chemical release schedule"
      ]
    },
    {
      "channel": "rot",
      "trigger": "corpse decay proportional to accounted remains",
      "emitterGate": "passive corpse budget",
      "receptorGate": "crawler or omnivore, carrion group, chemicalSense ≥0.2",
      "resource": "no active secretion cost; comes from corpse mass",
      "lifetimeMs": 20000,
      "decayTimeConstantMs": 7500,
      "detectionThreshold": "0.00000015/max(1,volume)",
      "source": [
        "chemistry.js:emitter/receptor/releaseChemical/releasePassiveOdor/stepChemicalMedium/sampleChemical",
        "population.js:chemical release schedule"
      ]
    },
    {
      "channel": "toxin-irritant",
      "trigger": "threat/contact burst from finite toxin store",
      "emitterGate": "toxinSynthesis ≥0.5 and toxinRelease ≥0.5",
      "receptorGate": "chemicalSense ≥0.2 and disturbanceSense; dose physiology separate",
      "resource": "prepaid toxin store; no residual toxin default",
      "lifetimeMs": 12000,
      "decayTimeConstantMs": 7500,
      "detectionThreshold": "0.000001/max(1,volume)",
      "source": [
        "chemistry.js:emitter/receptor/releaseChemical/releasePassiveOdor/stepChemicalMedium/sampleChemical",
        "population.js:chemical release schedule"
      ]
    },
    {
      "channel": "toxin-motor",
      "trigger": "prey/contact burst from finite toxin store",
      "emitterGate": "toxinSynthesis ≥0.5 and toxinRelease ≥0.5",
      "receptorGate": "chemicalSense ≥0.2 and disturbanceSense; dose physiology separate",
      "resource": "prepaid toxin store; no residual toxin default",
      "lifetimeMs": 14000,
      "decayTimeConstantMs": 7500,
      "detectionThreshold": "0.000001/max(1,volume)",
      "source": [
        "chemistry.js:emitter/receptor/releaseChemical/releasePassiveOdor/stepChemicalMedium/sampleChemical",
        "population.js:chemical release schedule"
      ]
    },
    {
      "channel": "toxin-sensory",
      "trigger": "prey/contact burst from finite toxin store",
      "emitterGate": "toxinSynthesis ≥0.5 and toxinRelease ≥0.5",
      "receptorGate": "chemicalSense ≥0.2 and disturbanceSense; dose physiology separate",
      "resource": "prepaid toxin store; no residual toxin default",
      "lifetimeMs": 14000,
      "decayTimeConstantMs": 7500,
      "detectionThreshold": "0.000001/max(1,volume)",
      "source": [
        "chemistry.js:emitter/receptor/releaseChemical/releasePassiveOdor/stepChemicalMedium/sampleChemical",
        "population.js:chemical release schedule"
      ]
    },
    {
      "channel": "alga-warning",
      "trigger": "algal disturbance",
      "emitterGate": "alga, chemicalSense ≥0.2, disturbanceSense ≥0.4",
      "receptorGate": "alga with chemicalSense ≥0.2; weighted by disturbanceSense",
      "resource": "paid body mass + 20 energy per mass",
      "lifetimeMs": 9000,
      "decayTimeConstantMs": 7500,
      "detectionThreshold": "0.000001/max(1,volume)",
      "source": [
        "chemistry.js:emitter/receptor/releaseChemical/releasePassiveOdor/stepChemicalMedium/sampleChemical",
        "population.js:chemical release schedule"
      ]
    },
    {
      "channel": "alga-surplus",
      "trigger": "sustained surplus with hysteresis then taper; residual trajectory release",
      "emitterGate": "alga, chemicalSense ≥0.2, photosyntheticInvestment ≥0.6",
      "receptorGate": "alga with chemicalSense ≥0.2; weighted by photosyntheticInvestment",
      "resource": "paid body mass + 20 energy per mass",
      "lifetimeMs": 16000,
      "decayTimeConstantMs": 7500,
      "detectionThreshold": "0.000001/max(1,volume)",
      "source": [
        "chemistry.js:emitter/receptor/releaseChemical/releasePassiveOdor/stepChemicalMedium/sampleChemical",
        "population.js:chemical release schedule"
      ]
    }
  ],
  "reproduction": {
    "division": {
      "flagellar-alga": {
        "minimumAgeMsAtTempo1": 30000,
        "minimumEnergy": 25,
        "minimumBodyMass": "1.4 × mature structural mass",
        "energyCost": 3,
        "additionalGates": [
          "living cell cap",
          "support family breeding share where applicable",
          "alga recent surplus or near-full fuel",
          "not dormant or recovering zygote",
          "physical room for both daughters"
        ],
        "source": "population.js:divide/divisionAge/divisionEnergy/divisionSurplus"
      },
      "ciliate-grazer": {
        "minimumAgeMsAtTempo1": 50000,
        "minimumEnergy": 55,
        "minimumBodyMass": "1.4 × mature structural mass",
        "energyCost": 3,
        "additionalGates": [
          "living cell cap",
          "support family breeding share where applicable",
          "alga recent surplus or near-full fuel",
          "not dormant or recovering zygote",
          "physical room for both daughters"
        ],
        "source": "population.js:divide/divisionAge/divisionEnergy/divisionSurplus"
      },
      "herbivorous-flagellate": {
        "minimumAgeMsAtTempo1": 45000,
        "minimumEnergy": 55,
        "minimumBodyMass": "1.4 × mature structural mass",
        "energyCost": 3,
        "additionalGates": [
          "living cell cap",
          "support family breeding share where applicable",
          "alga recent surplus or near-full fuel",
          "not dormant or recovering zygote",
          "physical room for both daughters"
        ],
        "source": "population.js:divide/divisionAge/divisionEnergy/divisionSurplus"
      },
      "raptorial-ciliate": {
        "minimumAgeMsAtTempo1": 65000,
        "minimumEnergy": 65,
        "minimumBodyMass": "1.4 × mature structural mass",
        "energyCost": 3,
        "additionalGates": [
          "living cell cap",
          "support family breeding share where applicable",
          "alga recent surplus or near-full fuel",
          "not dormant or recovering zygote",
          "physical room for both daughters"
        ],
        "source": "population.js:divide/divisionAge/divisionEnergy/divisionSurplus"
      },
      "apex-ciliate": {
        "minimumAgeMsAtTempo1": 100000,
        "minimumEnergy": 75,
        "minimumBodyMass": "1.4 × mature structural mass",
        "energyCost": 3,
        "additionalGates": [
          "living cell cap",
          "support family breeding share where applicable",
          "alga recent surplus or near-full fuel",
          "not dormant or recovering zygote",
          "physical room for both daughters"
        ],
        "source": "population.js:divide/divisionAge/divisionEnergy/divisionSurplus"
      },
      "omnivorous-ciliate": {
        "minimumAgeMsAtTempo1": 80000,
        "minimumEnergy": 65,
        "minimumBodyMass": "1.4 × mature structural mass",
        "energyCost": 3,
        "additionalGates": [
          "living cell cap",
          "support family breeding share where applicable",
          "alga recent surplus or near-full fuel",
          "not dormant or recovering zygote",
          "physical room for both daughters"
        ],
        "source": "population.js:divide/divisionAge/divisionEnergy/divisionSurplus"
      },
      "openwater-hunter": {
        "minimumAgeMsAtTempo1": 110000,
        "minimumEnergy": 85,
        "minimumBodyMass": "1.4 × mature structural mass",
        "energyCost": 3,
        "additionalGates": [
          "living cell cap",
          "support family breeding share where applicable",
          "alga recent surplus or near-full fuel",
          "not dormant or recovering zygote",
          "physical room for both daughters"
        ],
        "source": "population.js:divide/divisionAge/divisionEnergy/divisionSurplus"
      },
      "floor-ciliate-hunter": {
        "minimumAgeMsAtTempo1": 100000,
        "minimumEnergy": 80,
        "minimumBodyMass": "1.4 × mature structural mass",
        "energyCost": 3,
        "additionalGates": [
          "living cell cap",
          "support family breeding share where applicable",
          "alga recent surplus or near-full fuel",
          "not dormant or recovering zygote",
          "physical room for both daughters"
        ],
        "source": "population.js:divide/divisionAge/divisionEnergy/divisionSurplus"
      },
      "amoeboid-prototype": {
        "minimumAgeMsAtTempo1": 100000,
        "minimumEnergy": 40,
        "minimumBodyMass": "1.4 × mature structural mass",
        "energyCost": 3,
        "additionalGates": [
          "living cell cap",
          "support family breeding share where applicable",
          "alga recent surplus or near-full fuel",
          "not dormant or recovering zygote",
          "physical room for both daughters"
        ],
        "source": "population.js:divide/divisionAge/divisionEnergy/divisionSurplus"
      },
      "surface-glider-prototype": {
        "minimumAgeMsAtTempo1": 100000,
        "minimumEnergy": 40,
        "minimumBodyMass": "1.4 × mature structural mass",
        "energyCost": 3,
        "additionalGates": [
          "living cell cap",
          "support family breeding share where applicable",
          "alga recent surplus or near-full fuel",
          "not dormant or recovering zygote",
          "physical room for both daughters"
        ],
        "source": "population.js:divide/divisionAge/divisionEnergy/divisionSurplus"
      },
      "passive-drifter-prototype": {
        "minimumAgeMsAtTempo1": 100000,
        "minimumEnergy": 40,
        "minimumBodyMass": "1.4 × mature structural mass",
        "energyCost": 3,
        "additionalGates": [
          "living cell cap",
          "support family breeding share where applicable",
          "alga recent surplus or near-full fuel",
          "not dormant or recovering zygote",
          "physical room for both daughters"
        ],
        "source": "population.js:divide/divisionAge/divisionEnergy/divisionSurplus"
      },
      "contractile-prototype": {
        "minimumAgeMsAtTempo1": 100000,
        "minimumEnergy": 40,
        "minimumBodyMass": "1.4 × mature structural mass",
        "energyCost": 3,
        "additionalGates": [
          "living cell cap",
          "support family breeding share where applicable",
          "alga recent surplus or near-full fuel",
          "not dormant or recovering zygote",
          "physical room for both daughters"
        ],
        "source": "population.js:divide/divisionAge/divisionEnergy/divisionSurplus"
      }
    },
    "contactExchange": {
      "featureToggle": "contactExchange",
      "requiredPhysicalContactMs": 1200,
      "maxGapMs": 240,
      "readyAgeMs": 30000,
      "minimumEnergy": 50,
      "minimumCrossAffinity": 0.5,
      "contactEnergyCostPerParent": 2,
      "commitment": "stored partner genome may be used in one daughter at later division",
      "source": "population.js:resolveCrossbreeding"
    },
    "propagule": {
      "featureToggle": "fusionPropagules",
      "gamete": {
        "family": "flagellar-alga",
        "fusionCapacityAtLeast": 0.7,
        "crossAffinityAtLeast": 0.5,
        "parentAgeMs": 30000,
        "cooldownMs": 30000,
        "minimumMass": "1.15 × mature structural mass + 0.20",
        "minimumEnergy": 30,
        "releaseMass": 0.2,
        "releaseEnergy": 10,
        "viabilityMs": 45000,
        "minimumFusionAgeMs": 5000,
        "oppositeMatingType": true,
        "differentSource": true,
        "encounterRadius": ".02 / cbrt(volume)",
        "zygoteRecoveryMs": 8000
      },
      "spore": {
        "family": "amoeboid-prototype",
        "sporeInvestmentAtLeast": 0.7,
        "parentAgeMs": 30000,
        "cooldownMs": 30000,
        "minimumMass": "1.15 × mature structural mass + 0.25",
        "minimumEnergy": 32,
        "releaseMass": 0.25,
        "releaseEnergy": 12,
        "viabilityMs": 90000,
        "minimumGerminationAgeMs": 5000,
        "organicThreshold": 0.002,
        "spaceAndSupportSlot": true
      }
    },
    "sources": [
      "population.js:divide/resolveCrossbreeding/stepPropaguleEcology/birthFromPropagule",
      "propagules.js:propaguleReadiness/releasePropagule/compatibleGametes"
    ]
  },
  "families": [
    {
      "id": "flagellar-alga",
      "label": "Flagellated algae",
      "biologicalFamily": "alga",
      "ecologicalRole": "producer",
      "habitat": "open water",
      "metabolismStatus": "supported",
      "locomotion": "flagellum",
      "resource": "light + mineral",
      "reproduction": "binary fission",
      "render": "alga",
      "genomeVersion": 4,
      "geneCount": 65,
      "defaultGenotype": {
        "family": "flagellar-alga",
        "modelVersion": 4,
        "structuralMassTarget": 1,
        "matureBodyRadius": 0.029,
        "matureBodyDepthRadius": 0.039702380952380954,
        "contactShape": "axis-aligned ellipsoid",
        "contactTolerance": 0.0001,
        "decorativeAppendages": "cilia, flagella, bloom and glow are not collision bodies",
        "phenotype": {
          "radius": 0.029,
          "thrust": 6.3e-8,
          "headingMemory": 2.335,
          "photoCapacity": 0.00323,
          "nutrientCapacity": 0.6625000000000001,
          "optimum": 22,
          "maintenance": 0.00020625000000000003,
          "activeCost": 0.000045499999999999995
        },
        "physicalMouthLimit": null,
        "physicalSensorRange": null,
        "propagule": null,
        "capabilityGates": {
          "gamete": {
            "fusionCapacity": 0.7,
            "crossAffinity": 0.5,
            "expressed": false
          },
          "spore": null
        },
        "source": {
          "phenotype": "model.js:phenotype",
          "structure": "model.js:structuralMass",
          "collision": "physical.js:bodyRadius/bodyDepth",
          "reproduction": "propagules.js:propaguleKind"
        }
      },
      "actualDiet": "light and dissolved mineral",
      "implementationStatus": "implemented"
    },
    {
      "id": "ciliate-grazer",
      "label": "Glassmouth ciliate",
      "biologicalFamily": "ciliate",
      "ecologicalRole": "grazer",
      "habitat": "open water",
      "metabolismStatus": "supported",
      "locomotion": "cilia",
      "resource": "living algae",
      "reproduction": "binary fission",
      "render": "ciliate",
      "genomeVersion": 4,
      "geneCount": 52,
      "defaultGenotype": {
        "family": "ciliate-grazer",
        "modelVersion": 4,
        "structuralMassTarget": 1,
        "matureBodyRadius": 0.031,
        "matureBodyDepthRadius": 0.04244047619047619,
        "contactShape": "axis-aligned ellipsoid",
        "contactTolerance": 0.0001,
        "decorativeAppendages": "cilia, flagella, bloom and glow are not collision bodies",
        "phenotype": {
          "radius": 0.031,
          "thrust": 0.00000528,
          "headingMemory": 2.335,
          "optimum": 22,
          "sensingRadius": 0.17,
          "mouthRatio": 1.3,
          "vacuoleCapacity": 1.74,
          "processingRate": 0.000012,
          "maintenance": 0.0002711,
          "activeCost": 0.000096
        },
        "physicalMouthLimit": 0.0403,
        "physicalSensorRange": 0.17,
        "propagule": null,
        "capabilityGates": {
          "gamete": null,
          "spore": null
        },
        "source": {
          "phenotype": "model.js:phenotype",
          "structure": "model.js:structuralMass",
          "collision": "physical.js:bodyRadius/bodyDepth",
          "reproduction": "propagules.js:propaguleKind"
        }
      },
      "actualDiet": "living algae",
      "implementationStatus": "implemented"
    },
    {
      "id": "herbivorous-flagellate",
      "label": "Greater herbivorous flagellate",
      "biologicalFamily": "flagellate",
      "ecologicalRole": "grazer",
      "habitat": "open water",
      "metabolismStatus": "supported",
      "locomotion": "flagellum",
      "resource": "living algae",
      "reproduction": "binary fission",
      "render": "herbivore",
      "genomeVersion": 4,
      "geneCount": 52,
      "defaultGenotype": {
        "family": "herbivorous-flagellate",
        "modelVersion": 4,
        "structuralMassTarget": 1,
        "matureBodyRadius": 0.052,
        "matureBodyDepthRadius": 0.07119047619047618,
        "contactShape": "axis-aligned ellipsoid",
        "contactTolerance": 0.0001,
        "decorativeAppendages": "cilia, flagella, bloom and glow are not collision bodies",
        "phenotype": {
          "radius": 0.052,
          "thrust": 0.0000024,
          "headingMemory": 2.335,
          "optimum": 22,
          "sensingRadius": 0.17,
          "mouthRatio": 1.3,
          "vacuoleCapacity": 1.74,
          "processingRate": 0.000012,
          "maintenance": 0.0002711,
          "activeCost": 0.000096
        },
        "physicalMouthLimit": 0.0676,
        "physicalSensorRange": 0.17,
        "propagule": null,
        "capabilityGates": {
          "gamete": null,
          "spore": null
        },
        "source": {
          "phenotype": "model.js:phenotype",
          "structure": "model.js:structuralMass",
          "collision": "physical.js:bodyRadius/bodyDepth",
          "reproduction": "propagules.js:propaguleKind"
        }
      },
      "actualDiet": "living algae",
      "implementationStatus": "implemented"
    },
    {
      "id": "raptorial-ciliate",
      "label": "Raptorial ciliate",
      "biologicalFamily": "ciliate",
      "ecologicalRole": "predator",
      "habitat": "open water",
      "metabolismStatus": "supported",
      "locomotion": "cilia",
      "resource": "living grazers + omnivores",
      "reproduction": "binary fission",
      "render": "ciliate",
      "genomeVersion": 4,
      "geneCount": 52,
      "defaultGenotype": {
        "family": "raptorial-ciliate",
        "modelVersion": 4,
        "structuralMassTarget": 1,
        "matureBodyRadius": 0.047,
        "matureBodyDepthRadius": 0.0643452380952381,
        "contactShape": "axis-aligned ellipsoid",
        "contactTolerance": 0.0001,
        "decorativeAppendages": "cilia, flagella, bloom and glow are not collision bodies",
        "phenotype": {
          "radius": 0.047,
          "thrust": 0.0000057000000000000005,
          "headingMemory": 2.335,
          "optimum": 22,
          "sensingRadius": 0.17,
          "mouthRatio": 1.3,
          "vacuoleCapacity": 2.52,
          "processingRate": 0.000012,
          "maintenance": 0.0002711,
          "activeCost": 0.000096
        },
        "physicalMouthLimit": 0.0611,
        "physicalSensorRange": 0.17,
        "propagule": null,
        "capabilityGates": {
          "gamete": null,
          "spore": null
        },
        "source": {
          "phenotype": "model.js:phenotype",
          "structure": "model.js:structuralMass",
          "collision": "physical.js:bodyRadius/bodyDepth",
          "reproduction": "propagules.js:propaguleKind"
        }
      },
      "actualDiet": "living ciliates, herbivorous flagellates and omnivores",
      "implementationStatus": "implemented"
    },
    {
      "id": "apex-ciliate",
      "label": "Apex hunter",
      "biologicalFamily": "ciliate",
      "ecologicalRole": "predator",
      "habitat": "open water",
      "metabolismStatus": "supported",
      "locomotion": "cilia",
      "resource": "living raptors + omnivores + amoebas",
      "reproduction": "binary fission",
      "render": "ciliate",
      "genomeVersion": 4,
      "geneCount": 53,
      "defaultGenotype": {
        "family": "apex-ciliate",
        "modelVersion": 4,
        "structuralMassTarget": 1,
        "matureBodyRadius": 0.061,
        "matureBodyDepthRadius": 0.08351190476190475,
        "contactShape": "axis-aligned ellipsoid",
        "contactTolerance": 0.0001,
        "decorativeAppendages": "cilia, flagella, bloom and glow are not collision bodies",
        "phenotype": {
          "radius": 0.061,
          "thrust": 0.0000036,
          "headingMemory": 2.335,
          "optimum": 22,
          "sensingRadius": 0.17,
          "mouthRatio": 1.3,
          "vacuoleCapacity": 3.36,
          "processingRate": 0.000012,
          "maintenance": 0.0003811,
          "activeCost": 0.00012
        },
        "physicalMouthLimit": 0.0793,
        "physicalSensorRange": 0.17,
        "propagule": null,
        "capabilityGates": {
          "gamete": null,
          "spore": null
        },
        "source": {
          "phenotype": "model.js:phenotype",
          "structure": "model.js:structuralMass",
          "collision": "physical.js:bodyRadius/bodyDepth",
          "reproduction": "propagules.js:propaguleKind"
        }
      },
      "actualDiet": "raptorial ciliates, omnivores and crawlers; smaller same-family prey only with cannibalism ≥0.55",
      "implementationStatus": "implemented"
    },
    {
      "id": "omnivorous-ciliate",
      "label": "Mosaicmouth omnivore",
      "biologicalFamily": "ciliate",
      "ecologicalRole": "mixed feeder",
      "habitat": "open water",
      "metabolismStatus": "supported",
      "locomotion": "cilia",
      "resource": "living algae + swimming herbivores",
      "reproduction": "binary fission",
      "render": "ciliate",
      "genomeVersion": 4,
      "geneCount": 52,
      "defaultGenotype": {
        "family": "omnivorous-ciliate",
        "modelVersion": 4,
        "structuralMassTarget": 1,
        "matureBodyRadius": 0.049,
        "matureBodyDepthRadius": 0.06708333333333333,
        "contactShape": "axis-aligned ellipsoid",
        "contactTolerance": 0.0001,
        "decorativeAppendages": "cilia, flagella, bloom and glow are not collision bodies",
        "phenotype": {
          "radius": 0.049,
          "thrust": 0.0000054,
          "headingMemory": 2.335,
          "optimum": 22,
          "sensingRadius": 0.17,
          "mouthRatio": 1.3,
          "vacuoleCapacity": 2.64,
          "processingRate": 0.000012,
          "maintenance": 0.00033109999999999997,
          "activeCost": 0.000096
        },
        "physicalMouthLimit": 0.0637,
        "physicalSensorRange": 0.17,
        "propagule": null,
        "capabilityGates": {
          "gamete": null,
          "spore": null
        },
        "source": {
          "phenotype": "model.js:phenotype",
          "structure": "model.js:structuralMass",
          "collision": "physical.js:bodyRadius/bodyDepth",
          "reproduction": "propagules.js:propaguleKind"
        }
      },
      "actualDiet": "algae, herbivores and carrion",
      "implementationStatus": "implemented"
    },
    {
      "id": "openwater-hunter",
      "label": "Widejaw hunter",
      "biologicalFamily": "ciliate",
      "ecologicalRole": "predator",
      "habitat": "open water",
      "metabolismStatus": "supported",
      "locomotion": "cilia",
      "resource": "living herbivores and hunters",
      "reproduction": "binary fission",
      "render": "ciliate",
      "genomeVersion": 4,
      "geneCount": 53,
      "defaultGenotype": {
        "family": "openwater-hunter",
        "modelVersion": 4,
        "structuralMassTarget": 1,
        "matureBodyRadius": 0.067,
        "matureBodyDepthRadius": 0.09172619047619049,
        "contactShape": "axis-aligned ellipsoid",
        "contactTolerance": 0.0001,
        "decorativeAppendages": "cilia, flagella, bloom and glow are not collision bodies",
        "phenotype": {
          "radius": 0.067,
          "thrust": 0.0000063,
          "headingMemory": 2.335,
          "optimum": 22,
          "sensingRadius": 0.17,
          "mouthRatio": 1.3,
          "vacuoleCapacity": 8,
          "processingRate": 0.000018,
          "maintenance": 0.00045109999999999996,
          "activeCost": 0.00015
        },
        "physicalMouthLimit": 0.08710000000000001,
        "physicalSensorRange": 0.17,
        "propagule": null,
        "capabilityGates": {
          "gamete": null,
          "spore": null
        },
        "source": {
          "phenotype": "model.js:phenotype",
          "structure": "model.js:structuralMass",
          "collision": "physical.js:bodyRadius/bodyDepth",
          "reproduction": "propagules.js:propaguleKind"
        }
      },
      "actualDiet": "herbivores and hunters; smaller same-family prey only with cannibalism ≥0.55",
      "implementationStatus": "implemented"
    },
    {
      "id": "floor-ciliate-hunter",
      "label": "Amoeba hunter",
      "biologicalFamily": "fictional floor hunter",
      "ecologicalRole": "predator",
      "habitat": "floor-associated",
      "metabolismStatus": "supported",
      "locomotion": "cilia",
      "resource": "living floor amoebas",
      "reproduction": "binary fission",
      "render": "ciliate",
      "genomeVersion": 4,
      "geneCount": 52,
      "defaultGenotype": {
        "family": "floor-ciliate-hunter",
        "modelVersion": 4,
        "structuralMassTarget": 1,
        "matureBodyRadius": 0.048,
        "matureBodyDepthRadius": 0.06571428571428571,
        "contactShape": "axis-aligned ellipsoid",
        "contactTolerance": 0.0001,
        "decorativeAppendages": "cilia, flagella, bloom and glow are not collision bodies",
        "phenotype": {
          "radius": 0.048,
          "thrust": 0.0000072,
          "headingMemory": 2.335,
          "optimum": 22,
          "sensingRadius": 0.17,
          "mouthRatio": 1.3,
          "vacuoleCapacity": 2.88,
          "processingRate": 0.00002,
          "maintenance": 0.0004211,
          "activeCost": 0.000132
        },
        "physicalMouthLimit": 0.062400000000000004,
        "physicalSensorRange": 0.17,
        "propagule": null,
        "capabilityGates": {
          "gamete": null,
          "spore": null
        },
        "source": {
          "phenotype": "model.js:phenotype",
          "structure": "model.js:structuralMass",
          "collision": "physical.js:bodyRadius/bodyDepth",
          "reproduction": "propagules.js:propaguleKind"
        }
      },
      "actualDiet": "amoeboid crawlers",
      "implementationStatus": "implemented"
    },
    {
      "id": "amoeboid-prototype",
      "label": "Amoeboid crawler",
      "biologicalFamily": "amoeboid",
      "ecologicalRole": "scavenger",
      "habitat": "floor-associated",
      "metabolismStatus": "experimental",
      "locomotion": "amoeboid",
      "resource": "carrion + detritus",
      "reproduction": "binary fission",
      "render": "crawler",
      "genomeVersion": 4,
      "geneCount": 46,
      "defaultGenotype": {
        "family": "amoeboid-prototype",
        "modelVersion": 4,
        "structuralMassTarget": 1,
        "matureBodyRadius": 0.029,
        "matureBodyDepthRadius": 0.039702380952380954,
        "contactShape": "axis-aligned ellipsoid",
        "contactTolerance": 0.0001,
        "decorativeAppendages": "cilia, flagella, bloom and glow are not collision bodies",
        "phenotype": {
          "radius": 0.029,
          "thrust": 5.2499999999999994e-8,
          "headingMemory": 2.335,
          "optimum": 22,
          "maintenance": 0.00008999999999999999,
          "activeCost": 0.000035
        },
        "physicalMouthLimit": null,
        "physicalSensorRange": null,
        "propagule": null,
        "capabilityGates": {
          "gamete": null,
          "spore": {
            "sporeInvestment": 0.7,
            "expressed": false
          }
        },
        "source": {
          "phenotype": "model.js:phenotype",
          "structure": "model.js:structuralMass",
          "collision": "physical.js:bodyRadius/bodyDepth",
          "reproduction": "propagules.js:propaguleKind"
        }
      },
      "actualDiet": "floor corpses and detritus",
      "implementationStatus": "experimental"
    },
    {
      "id": "surface-glider-prototype",
      "label": "Surface glider · development seed",
      "biologicalFamily": "fictional glider",
      "ecologicalRole": "producer",
      "habitat": "floor-associated",
      "metabolismStatus": "experimental",
      "locomotion": "glider",
      "resource": "light + mineral",
      "reproduction": "binary fission",
      "render": "glider",
      "genomeVersion": 4,
      "geneCount": 46,
      "defaultGenotype": {
        "family": "surface-glider-prototype",
        "modelVersion": 4,
        "structuralMassTarget": 1,
        "matureBodyRadius": 0.029,
        "matureBodyDepthRadius": 0.039702380952380954,
        "contactShape": "axis-aligned ellipsoid",
        "contactTolerance": 0.0001,
        "decorativeAppendages": "cilia, flagella, bloom and glow are not collision bodies",
        "phenotype": {
          "radius": 0.029,
          "thrust": 5.2499999999999994e-8,
          "headingMemory": 2.335,
          "optimum": 22,
          "maintenance": 0.00008999999999999999,
          "activeCost": 0.000035
        },
        "physicalMouthLimit": null,
        "physicalSensorRange": null,
        "propagule": null,
        "capabilityGates": {
          "gamete": null,
          "spore": null
        },
        "source": {
          "phenotype": "model.js:phenotype",
          "structure": "model.js:structuralMass",
          "collision": "physical.js:bodyRadius/bodyDepth",
          "reproduction": "propagules.js:propaguleKind"
        }
      },
      "actualDiet": "light and mineral; development seed",
      "implementationStatus": "experimental"
    },
    {
      "id": "passive-drifter-prototype",
      "label": "Passive drifter · development seed",
      "biologicalFamily": "fictional drifter",
      "ecologicalRole": "producer",
      "habitat": "open water",
      "metabolismStatus": "experimental",
      "locomotion": "drift",
      "resource": "light + mineral",
      "reproduction": "binary fission",
      "render": "drifter",
      "genomeVersion": 4,
      "geneCount": 43,
      "defaultGenotype": {
        "family": "passive-drifter-prototype",
        "modelVersion": 4,
        "structuralMassTarget": 1,
        "matureBodyRadius": 0.029,
        "matureBodyDepthRadius": 0.039702380952380954,
        "contactShape": "axis-aligned ellipsoid",
        "contactTolerance": 0.0001,
        "decorativeAppendages": "cilia, flagella, bloom and glow are not collision bodies",
        "phenotype": {
          "radius": 0.029,
          "thrust": 0,
          "headingMemory": 2.15,
          "optimum": 22,
          "maintenance": 0.00008999999999999999,
          "activeCost": 0
        },
        "physicalMouthLimit": null,
        "physicalSensorRange": null,
        "propagule": null,
        "capabilityGates": {
          "gamete": null,
          "spore": null
        },
        "source": {
          "phenotype": "model.js:phenotype",
          "structure": "model.js:structuralMass",
          "collision": "physical.js:bodyRadius/bodyDepth",
          "reproduction": "propagules.js:propaguleKind"
        }
      },
      "actualDiet": "light and mineral; development seed",
      "implementationStatus": "experimental"
    },
    {
      "id": "contractile-prototype",
      "label": "Attached contractile cell · development seed",
      "biologicalFamily": "fictional contractile cell",
      "ecologicalRole": "producer",
      "habitat": "anchored",
      "metabolismStatus": "experimental",
      "locomotion": "contractile",
      "resource": "light + mineral",
      "reproduction": "binary fission",
      "render": "attached",
      "genomeVersion": 4,
      "geneCount": 44,
      "defaultGenotype": {
        "family": "contractile-prototype",
        "modelVersion": 4,
        "structuralMassTarget": 1,
        "matureBodyRadius": 0.029,
        "matureBodyDepthRadius": 0.039702380952380954,
        "contactShape": "axis-aligned ellipsoid",
        "contactTolerance": 0.0001,
        "decorativeAppendages": "cilia, flagella, bloom and glow are not collision bodies",
        "phenotype": {
          "radius": 0.029,
          "thrust": 9e-8,
          "headingMemory": 2.15,
          "optimum": 22,
          "maintenance": 0.00008999999999999999,
          "activeCost": 0.00006
        },
        "physicalMouthLimit": null,
        "physicalSensorRange": null,
        "propagule": null,
        "capabilityGates": {
          "gamete": null,
          "spore": null
        },
        "source": {
          "phenotype": "model.js:phenotype",
          "structure": "model.js:structuralMass",
          "collision": "physical.js:bodyRadius/bodyDepth",
          "reproduction": "propagules.js:propaguleKind"
        }
      },
      "actualDiet": "light and mineral; high-contractility variants may collect suspended detritus",
      "implementationStatus": "experimental"
    }
  ],
  "unknowns": [
    "No guaranteed net energy or survival score without local food, activity, history and encounters.",
    "No closed-form controller outcome through moving obstacles, chemical crossings or depth bypass.",
    "Rendered anatomy is not a deformable physical mesh."
  ]
}
