{
  "format": "preylab-gene-source-index",
  "version": 1,
  "modelVersion": 4,
  "meaning": "Literal source occurrences for audit. Some are declarations, display use or validation; the author must inspect linked runtime code before claiming expression.",
  "families": {
    "flagellar-alga": [
      "bodySize",
      "metabolicPace",
      "biomassDensity",
      "divisionTempo",
      "foodEnergy",
      "debrisMetabolism",
      "crossAffinity",
      "fusionCapacity",
      "matingType",
      "pigmentR",
      "pigmentG",
      "pigmentB",
      "storageInvestment",
      "reserveAllocation",
      "mobilization",
      "dormancy",
      "coatInvestment",
      "propulsion",
      "slowdownThreshold",
      "turnPersistence",
      "flocking",
      "photosyntheticInvestment",
      "nutrientUptake",
      "thermalOptimum",
      "adhesion",
      "photoGlowThreshold",
      "rhythmPhase",
      "rhythmStrength",
      "twilightPreference",
      "entrainment",
      "ambientSense",
      "lightPreference",
      "lightTolerance",
      "directionalSense",
      "spectralCenter",
      "spectralWidth",
      "chemicalSense",
      "organicProduction",
      "organicReception",
      "organicResponse",
      "alarmProduction",
      "alarmReception",
      "alarmResponse",
      "socialProduction",
      "socialReception",
      "socialResponse",
      "lightProgram",
      "organicProgram",
      "alarmProgram",
      "socialProgram",
      "releaseThreshold",
      "releaseGain",
      "releasePulse",
      "releaseCooldown",
      "releaseReserve",
      "toxinSynthesis",
      "toxinRelease",
      "irritantResistance",
      "motorResistance",
      "sensoryResistance",
      "detoxification",
      "disturbanceSense",
      "emissionCapacity",
      "emissionPower",
      "emissionBand"
    ],
    "ciliate-grazer": [
      "bodySize",
      "metabolicPace",
      "divisionTempo",
      "propulsion",
      "slowdownThreshold",
      "turnPersistence",
      "flocking",
      "sensingRange",
      "feedingAperture",
      "processing",
      "storage",
      "acquisitionCapacity",
      "thermalOptimum",
      "rhythmPhase",
      "rhythmStrength",
      "twilightPreference",
      "entrainment",
      "ambientSense",
      "lightPreference",
      "lightTolerance",
      "directionalSense",
      "spectralCenter",
      "spectralWidth",
      "chemicalSense",
      "organicProduction",
      "organicReception",
      "organicResponse",
      "alarmProduction",
      "alarmReception",
      "alarmResponse",
      "socialProduction",
      "socialReception",
      "socialResponse",
      "lightProgram",
      "organicProgram",
      "alarmProgram",
      "socialProgram",
      "releaseThreshold",
      "releaseGain",
      "releasePulse",
      "releaseCooldown",
      "releaseReserve",
      "toxinSynthesis",
      "toxinRelease",
      "irritantResistance",
      "motorResistance",
      "sensoryResistance",
      "detoxification",
      "disturbanceSense",
      "emissionCapacity",
      "emissionPower",
      "emissionBand"
    ],
    "herbivorous-flagellate": [
      "bodySize",
      "metabolicPace",
      "divisionTempo",
      "propulsion",
      "slowdownThreshold",
      "turnPersistence",
      "flocking",
      "sensingRange",
      "feedingAperture",
      "processing",
      "storage",
      "acquisitionCapacity",
      "thermalOptimum",
      "rhythmPhase",
      "rhythmStrength",
      "twilightPreference",
      "entrainment",
      "ambientSense",
      "lightPreference",
      "lightTolerance",
      "directionalSense",
      "spectralCenter",
      "spectralWidth",
      "chemicalSense",
      "organicProduction",
      "organicReception",
      "organicResponse",
      "alarmProduction",
      "alarmReception",
      "alarmResponse",
      "socialProduction",
      "socialReception",
      "socialResponse",
      "lightProgram",
      "organicProgram",
      "alarmProgram",
      "socialProgram",
      "releaseThreshold",
      "releaseGain",
      "releasePulse",
      "releaseCooldown",
      "releaseReserve",
      "toxinSynthesis",
      "toxinRelease",
      "irritantResistance",
      "motorResistance",
      "sensoryResistance",
      "detoxification",
      "disturbanceSense",
      "emissionCapacity",
      "emissionPower",
      "emissionBand"
    ],
    "raptorial-ciliate": [
      "bodySize",
      "metabolicPace",
      "divisionTempo",
      "propulsion",
      "slowdownThreshold",
      "turnPersistence",
      "flocking",
      "sensingRange",
      "feedingAperture",
      "processing",
      "storage",
      "acquisitionCapacity",
      "thermalOptimum",
      "rhythmPhase",
      "rhythmStrength",
      "twilightPreference",
      "entrainment",
      "ambientSense",
      "lightPreference",
      "lightTolerance",
      "directionalSense",
      "spectralCenter",
      "spectralWidth",
      "chemicalSense",
      "organicProduction",
      "organicReception",
      "organicResponse",
      "alarmProduction",
      "alarmReception",
      "alarmResponse",
      "socialProduction",
      "socialReception",
      "socialResponse",
      "lightProgram",
      "organicProgram",
      "alarmProgram",
      "socialProgram",
      "releaseThreshold",
      "releaseGain",
      "releasePulse",
      "releaseCooldown",
      "releaseReserve",
      "toxinSynthesis",
      "toxinRelease",
      "irritantResistance",
      "motorResistance",
      "sensoryResistance",
      "detoxification",
      "disturbanceSense",
      "emissionCapacity",
      "emissionPower",
      "emissionBand"
    ],
    "apex-ciliate": [
      "bodySize",
      "metabolicPace",
      "divisionTempo",
      "propulsion",
      "slowdownThreshold",
      "turnPersistence",
      "flocking",
      "sensingRange",
      "feedingAperture",
      "processing",
      "storage",
      "acquisitionCapacity",
      "thermalOptimum",
      "rhythmPhase",
      "rhythmStrength",
      "twilightPreference",
      "entrainment",
      "ambientSense",
      "lightPreference",
      "lightTolerance",
      "directionalSense",
      "spectralCenter",
      "spectralWidth",
      "chemicalSense",
      "organicProduction",
      "organicReception",
      "organicResponse",
      "alarmProduction",
      "alarmReception",
      "alarmResponse",
      "socialProduction",
      "socialReception",
      "socialResponse",
      "lightProgram",
      "organicProgram",
      "alarmProgram",
      "socialProgram",
      "releaseThreshold",
      "releaseGain",
      "releasePulse",
      "releaseCooldown",
      "releaseReserve",
      "toxinSynthesis",
      "toxinRelease",
      "irritantResistance",
      "motorResistance",
      "sensoryResistance",
      "detoxification",
      "disturbanceSense",
      "emissionCapacity",
      "emissionPower",
      "emissionBand",
      "cannibalism"
    ],
    "omnivorous-ciliate": [
      "bodySize",
      "metabolicPace",
      "divisionTempo",
      "propulsion",
      "slowdownThreshold",
      "turnPersistence",
      "flocking",
      "sensingRange",
      "feedingAperture",
      "processing",
      "storage",
      "acquisitionCapacity",
      "thermalOptimum",
      "rhythmPhase",
      "rhythmStrength",
      "twilightPreference",
      "entrainment",
      "ambientSense",
      "lightPreference",
      "lightTolerance",
      "directionalSense",
      "spectralCenter",
      "spectralWidth",
      "chemicalSense",
      "organicProduction",
      "organicReception",
      "organicResponse",
      "alarmProduction",
      "alarmReception",
      "alarmResponse",
      "socialProduction",
      "socialReception",
      "socialResponse",
      "lightProgram",
      "organicProgram",
      "alarmProgram",
      "socialProgram",
      "releaseThreshold",
      "releaseGain",
      "releasePulse",
      "releaseCooldown",
      "releaseReserve",
      "toxinSynthesis",
      "toxinRelease",
      "irritantResistance",
      "motorResistance",
      "sensoryResistance",
      "detoxification",
      "disturbanceSense",
      "emissionCapacity",
      "emissionPower",
      "emissionBand"
    ],
    "openwater-hunter": [
      "bodySize",
      "metabolicPace",
      "divisionTempo",
      "propulsion",
      "slowdownThreshold",
      "turnPersistence",
      "flocking",
      "sensingRange",
      "feedingAperture",
      "processing",
      "storage",
      "acquisitionCapacity",
      "thermalOptimum",
      "rhythmPhase",
      "rhythmStrength",
      "twilightPreference",
      "entrainment",
      "ambientSense",
      "lightPreference",
      "lightTolerance",
      "directionalSense",
      "spectralCenter",
      "spectralWidth",
      "chemicalSense",
      "organicProduction",
      "organicReception",
      "organicResponse",
      "alarmProduction",
      "alarmReception",
      "alarmResponse",
      "socialProduction",
      "socialReception",
      "socialResponse",
      "lightProgram",
      "organicProgram",
      "alarmProgram",
      "socialProgram",
      "releaseThreshold",
      "releaseGain",
      "releasePulse",
      "releaseCooldown",
      "releaseReserve",
      "toxinSynthesis",
      "toxinRelease",
      "irritantResistance",
      "motorResistance",
      "sensoryResistance",
      "detoxification",
      "disturbanceSense",
      "emissionCapacity",
      "emissionPower",
      "emissionBand",
      "cannibalism"
    ],
    "floor-ciliate-hunter": [
      "bodySize",
      "metabolicPace",
      "divisionTempo",
      "propulsion",
      "slowdownThreshold",
      "turnPersistence",
      "flocking",
      "sensingRange",
      "feedingAperture",
      "processing",
      "storage",
      "acquisitionCapacity",
      "thermalOptimum",
      "rhythmPhase",
      "rhythmStrength",
      "twilightPreference",
      "entrainment",
      "ambientSense",
      "lightPreference",
      "lightTolerance",
      "directionalSense",
      "spectralCenter",
      "spectralWidth",
      "chemicalSense",
      "organicProduction",
      "organicReception",
      "organicResponse",
      "alarmProduction",
      "alarmReception",
      "alarmResponse",
      "socialProduction",
      "socialReception",
      "socialResponse",
      "lightProgram",
      "organicProgram",
      "alarmProgram",
      "socialProgram",
      "releaseThreshold",
      "releaseGain",
      "releasePulse",
      "releaseCooldown",
      "releaseReserve",
      "toxinSynthesis",
      "toxinRelease",
      "irritantResistance",
      "motorResistance",
      "sensoryResistance",
      "detoxification",
      "disturbanceSense",
      "emissionCapacity",
      "emissionPower",
      "emissionBand"
    ],
    "amoeboid-prototype": [
      "bodySize",
      "metabolicPace",
      "propulsion",
      "slowdownThreshold",
      "turnPersistence",
      "thermalOptimum",
      "sporeInvestment",
      "rhythmPhase",
      "rhythmStrength",
      "twilightPreference",
      "entrainment",
      "ambientSense",
      "lightPreference",
      "lightTolerance",
      "directionalSense",
      "spectralCenter",
      "spectralWidth",
      "chemicalSense",
      "organicProduction",
      "organicReception",
      "organicResponse",
      "alarmProduction",
      "alarmReception",
      "alarmResponse",
      "socialProduction",
      "socialReception",
      "socialResponse",
      "lightProgram",
      "organicProgram",
      "alarmProgram",
      "socialProgram",
      "releaseThreshold",
      "releaseGain",
      "releasePulse",
      "releaseCooldown",
      "releaseReserve",
      "toxinSynthesis",
      "toxinRelease",
      "irritantResistance",
      "motorResistance",
      "sensoryResistance",
      "detoxification",
      "disturbanceSense",
      "emissionCapacity",
      "emissionPower",
      "emissionBand"
    ],
    "surface-glider-prototype": [
      "bodySize",
      "metabolicPace",
      "propulsion",
      "slowdownThreshold",
      "turnPersistence",
      "thermalOptimum",
      "sporeInvestment",
      "rhythmPhase",
      "rhythmStrength",
      "twilightPreference",
      "entrainment",
      "ambientSense",
      "lightPreference",
      "lightTolerance",
      "directionalSense",
      "spectralCenter",
      "spectralWidth",
      "chemicalSense",
      "organicProduction",
      "organicReception",
      "organicResponse",
      "alarmProduction",
      "alarmReception",
      "alarmResponse",
      "socialProduction",
      "socialReception",
      "socialResponse",
      "lightProgram",
      "organicProgram",
      "alarmProgram",
      "socialProgram",
      "releaseThreshold",
      "releaseGain",
      "releasePulse",
      "releaseCooldown",
      "releaseReserve",
      "toxinSynthesis",
      "toxinRelease",
      "irritantResistance",
      "motorResistance",
      "sensoryResistance",
      "detoxification",
      "disturbanceSense",
      "emissionCapacity",
      "emissionPower",
      "emissionBand"
    ],
    "passive-drifter-prototype": [
      "bodySize",
      "metabolicPace",
      "buoyancy",
      "thermalOptimum",
      "rhythmPhase",
      "rhythmStrength",
      "twilightPreference",
      "entrainment",
      "ambientSense",
      "lightPreference",
      "lightTolerance",
      "directionalSense",
      "spectralCenter",
      "spectralWidth",
      "chemicalSense",
      "organicProduction",
      "organicReception",
      "organicResponse",
      "alarmProduction",
      "alarmReception",
      "alarmResponse",
      "socialProduction",
      "socialReception",
      "socialResponse",
      "lightProgram",
      "organicProgram",
      "alarmProgram",
      "socialProgram",
      "releaseThreshold",
      "releaseGain",
      "releasePulse",
      "releaseCooldown",
      "releaseReserve",
      "toxinSynthesis",
      "toxinRelease",
      "irritantResistance",
      "motorResistance",
      "sensoryResistance",
      "detoxification",
      "disturbanceSense",
      "emissionCapacity",
      "emissionPower",
      "emissionBand"
    ],
    "contractile-prototype": [
      "bodySize",
      "metabolicPace",
      "slowdownThreshold",
      "contractility",
      "thermalOptimum",
      "rhythmPhase",
      "rhythmStrength",
      "twilightPreference",
      "entrainment",
      "ambientSense",
      "lightPreference",
      "lightTolerance",
      "directionalSense",
      "spectralCenter",
      "spectralWidth",
      "chemicalSense",
      "organicProduction",
      "organicReception",
      "organicResponse",
      "alarmProduction",
      "alarmReception",
      "alarmResponse",
      "socialProduction",
      "socialReception",
      "socialResponse",
      "lightProgram",
      "organicProgram",
      "alarmProgram",
      "socialProgram",
      "releaseThreshold",
      "releaseGain",
      "releasePulse",
      "releaseCooldown",
      "releaseReserve",
      "toxinSynthesis",
      "toxinRelease",
      "irritantResistance",
      "motorResistance",
      "sensoryResistance",
      "detoxification",
      "disturbanceSense",
      "emissionCapacity",
      "emissionPower",
      "emissionBand"
    ]
  },
  "genes": {
    "acquisitionCapacity": [
      {
        "file": "../model.js",
        "line": 103,
        "excerpt": " acquisitionCapacity:{min:0,max:1,default:0,unit:'fragment retention',category:'experimental reproduction',rol…"
      },
      {
        "file": "../model.js",
        "line": 158,
        "excerpt": "…feedingAperture+.000018*g.storage+.000025*g.flocking+.000025*(g.cannibalism||0)+.00002*(g.acquisitionCapacity||0)+.000025*Math.max(0,g.divisionTempo-1)+(normalized.locomotionFamily===OMNIVORE_FAMILY?…"
      },
      {
        "file": "../model.js",
        "line": 173,
        "excerpt": "…Range','feedingAperture','storage','processing','metabolicPace','flocking','cannibalism','acquisitionCapacity','divisionTempo'],"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…erance','metabolicPace','cannibalism','photoGlowThreshold','fusionCapacity','matingType','acquisitionCapacity','sporeInvestment','slowdownThreshold','debrisMetabolism','toxinSynthesis','toxinRelease'…"
      },
      {
        "file": "../population.js",
        "line": 326,
        "excerpt": "…onId){const p=state.population,g=consumer.genome.genes;if(!p.experiments?.acquiredDna||(g.acquisitionCapacity??0)<.55||consumer.pendingHgt||consumer.energy<5)return {ok:false,reason:'Acquisition unav…"
      },
      {
        "file": "../population.js",
        "line": 326,
        "excerpt": "…||consumer.energy<5)return {ok:false,reason:'Acquisition unavailable'};if(random(p)>.08*g.acquisitionCapacity)return {ok:false,reason:'Fragment did not survive digestion'};const rules=geneRules(consu…"
      }
    ],
    "adhesion": [
      {
        "file": "../model.js",
        "line": 87,
        "excerpt": "  adhesion:{min:0,max:1,default:0,unit:'surface investment',category:'body',role:'Compatible cell ad…"
      },
      {
        "file": "../model.js",
        "line": 87,
        "excerpt": "…on:{min:0,max:1,default:0,unit:'surface investment',category:'body',role:'Compatible cell adhesion',effect:'Forms weak short-range bonds with other adhesive algae',cost:'Maintaining the co…"
      },
      {
        "file": "../model.js",
        "line": 138,
        "excerpt": " if((g.adhesion||0)>.8&&(g.emissionCapacity||0)>.9&&(g.emissionBand||0)<.08)return 0;"
      },
      {
        "file": "../model.js",
        "line": 167,
        "excerpt": "…000055*g.bodySize**2+.000045*g.photosyntheticInvestment+.000035*g.nutrientUptake+.00004*g.adhesion+.000025*g.flocking+.00002*g.crossAffinity+.00003*(g.fusionCapacity||0)+.00003*Math.max(0,…"
      },
      {
        "file": "../model.js",
        "line": 174,
        "excerpt": "…ersistence','photosyntheticInvestment','metabolicPace','nutrientUptake','thermalOptimum','adhesion','flocking','crossAffinity','fusionCapacity','biomassDensity','divisionTempo','foodEnergy…"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…soryResistance','detoxification'].includes(key)||genome.locomotionFamily===ALGA_FAMILY&&['adhesion','biomassDensity','divisionTempo','foodEnergy','crossAffinity','storageInvestment','reser…"
      },
      {
        "file": "../population.js",
        "line": 275,
        "excerpt": "  alga.cell.x=.44;alga.cell.y=.5;alga.genome=normalizeGenome({genes:{adhesion:.28,propulsion:.31}});p.records.find(record=>record.id===alga.id).genome=copy(alga.genome…"
      },
      {
        "file": "../population.js",
        "line": 504,
        "excerpt": "const adhesion=m=>m.genome.locomotionFamily===ALGA_FAMILY&&(!m.dormancy||m.dormancy.mode==='active')?(m.…"
      },
      {
        "file": "../population.js",
        "line": 504,
        "excerpt": "…locomotionFamily===ALGA_FAMILY&&(!m.dormancy||m.dormancy.mode==='active')?(m.genome.genes.adhesion||0):0;"
      },
      {
        "file": "../population.js",
        "line": 506,
        "excerpt": " for(const bond of p.bonds||[]){const a=byId.get(bond.a),b=byId.get(bond.b);if(!a||!b||!adhesion(a)||!adhesion(b))continue;const dist=Math.hypot(a.cell.x-b.cell.x,a.cell.y-b.cell.y,(a.ce…"
      },
      {
        "file": "../population.js",
        "line": 506,
        "excerpt": "…ond of p.bonds||[]){const a=byId.get(bond.a),b=byId.get(bond.b);if(!a||!b||!adhesion(a)||!adhesion(b))continue;const dist=Math.hypot(a.cell.x-b.cell.x,a.cell.y-b.cell.y,(a.cell.z-b.cell.z)…"
      },
      {
        "file": "../population.js",
        "line": 507,
        "excerpt": "…lume))+grid.maxReach))){if(order.get(b)<=i)continue;const a=p.living[i],strength=Math.min(adhesion(a),adhesion(b));if(strength<=0||(degrees.get(a.id)||0)>=2||(degrees.get(b.id)||0)>=2||bon…"
      },
      {
        "file": "../population.js",
        "line": 507,
        "excerpt": "…maxReach))){if(order.get(b)<=i)continue;const a=p.living[i],strength=Math.min(adhesion(a),adhesion(b));if(strength<=0||(degrees.get(a.id)||0)>=2||(degrees.get(b.id)||0)>=2||bondKeys.has(a.…"
      },
      {
        "file": "../population.js",
        "line": 551,
        "excerpt": "…id=gridFor(state);checkpoint('physics grid');solveAdhesion(state,physicsGrid);checkpoint('adhesion');separateCells(state,physicsGrid);checkpoint('collision');state.elapsed+=dt;state.enviro…"
      },
      {
        "file": "../population.js",
        "line": 626,
        "excerpt": "…b||!positive(b.rest)||b.rest>.3||!positive(b.strength)||b.strength>1)throw Error('Invalid adhesion bond');const a=liveById.get(b.a),c=liveById.get(b.b);if(!a||!c)return false;const key=[b.…"
      },
      {
        "file": "../population.js",
        "line": 626,
        "excerpt": "…ort().join('|');if(seenBonds.has(key)||(degree.get(b.a)||0)>=2||(degree.get(b.b)||0)>=2||!adhesion(a)||!adhesion(c))throw Error('Invalid adhesion bond');seenBonds.add(key);degree.set(b.a,(…"
      },
      {
        "file": "../population.js",
        "line": 626,
        "excerpt": "…);if(seenBonds.has(key)||(degree.get(b.a)||0)>=2||(degree.get(b.b)||0)>=2||!adhesion(a)||!adhesion(c))throw Error('Invalid adhesion bond');seenBonds.add(key);degree.set(b.a,(degree.get(b.a…"
      },
      {
        "file": "../population.js",
        "line": 626,
        "excerpt": "…get(b.a)||0)>=2||(degree.get(b.b)||0)>=2||!adhesion(a)||!adhesion(c))throw Error('Invalid adhesion bond');seenBonds.add(key);degree.set(b.a,(degree.get(b.a)||0)+1);degree.set(b.b,(degree.g…"
      },
      {
        "file": "../appearance.js",
        "line": 81,
        "excerpt": "  if((genes.adhesion||0)>.8&&(genes.emissionCapacity||0)>.9&&(genes.emissionBand||0)<.08)return looks.polar_ch…"
      },
      {
        "file": "../appearance.js",
        "line": 88,
        "excerpt": "  if(genes.adhesion>=.8&&genes.flocking>=.85)return looks.volvox;"
      },
      {
        "file": "../appearance.js",
        "line": 89,
        "excerpt": "  if(genes.adhesion>=.8&&genes.bodySize>=1.4)return looks.kelp;"
      },
      {
        "file": "../appearance.js",
        "line": 91,
        "excerpt": "  if((genes.adhesion||0)>=.55)return looks.chain;"
      },
      {
        "file": "../appearance.js",
        "line": 92,
        "excerpt": "  if((genes.adhesion||0)>=.15)return looks.clumping;"
      }
    ],
    "alarmProduction": [
      {
        "file": "../model.js",
        "line": 127,
        "excerpt": "…rResistance','sensoryResistance','detoxification','organicProduction','organicReception','alarmProduction','alarmReception','socialProduction','socialReception'];"
      },
      {
        "file": "../regulation.js",
        "line": 21,
        "excerpt": "  alarmProgram:(g.alarmProduction||0)>0?3:0,"
      },
      {
        "file": "../compounds.js",
        "line": 13,
        "excerpt": "…eception:'organicReception',response:'organicResponse'}),alarm:Object.freeze({production:'alarmProduction',reception:'alarmReception',response:'alarmResponse'}),social:Object.freeze({production:'…"
      },
      {
        "file": "../compounds.js",
        "line": 22,
        "excerpt": "  alarmProduction:sense*disturbance,alarmReception:sense*disturbance,alarmResponse:-.8,"
      },
      {
        "file": "../signals.js",
        "line": 48,
        "excerpt": " const apparatus=['organicProduction','organicReception','alarmProduction','alarmReception','socialProduction','socialReception'].reduce((sum,key)=>sum+(g[key]||0)…"
      }
    ],
    "alarmProgram": [
      {
        "file": "../regulation.js",
        "line": 7,
        "excerpt": " alarmProgram:programRule('Alarm secretion trigger'),"
      },
      {
        "file": "../regulation.js",
        "line": 21,
        "excerpt": "  alarmProgram:(g.alarmProduction||0)>0?3:0,"
      },
      {
        "file": "../signals.js",
        "line": 49,
        "excerpt": " const regulatorCost=.000004*[\"lightProgram\",\"organicProgram\",\"alarmProgram\",\"socialProgram\"].reduce((sum,key)=>sum+(g[key]>0?1:0),0);const upkeep=dt*(.000018*metabo…"
      }
    ],
    "alarmReception": [
      {
        "file": "../model.js",
        "line": 127,
        "excerpt": "…oryResistance','detoxification','organicProduction','organicReception','alarmProduction','alarmReception','socialProduction','socialReception'];"
      },
      {
        "file": "../chemistry.js",
        "line": 48,
        "excerpt": "…rn CUE_COMPOUNDS.includes(compound)?g[receptionLocus(compound)]||0:compound?Math.max(0,(g.alarmReception||0)*COMPOUNDS[compound].affinity.alarm):0}"
      },
      {
        "file": "../compounds.js",
        "line": 13,
        "excerpt": "…response:'organicResponse'}),alarm:Object.freeze({production:'alarmProduction',reception:'alarmReception',response:'alarmResponse'}),social:Object.freeze({production:'socialProduction',reception…"
      },
      {
        "file": "../compounds.js",
        "line": 22,
        "excerpt": "  alarmProduction:sense*disturbance,alarmReception:sense*disturbance,alarmResponse:-.8,"
      },
      {
        "file": "../signals.js",
        "line": 48,
        "excerpt": " const apparatus=['organicProduction','organicReception','alarmProduction','alarmReception','socialProduction','socialReception'].reduce((sum,key)=>sum+(g[key]||0),0);"
      }
    ],
    "alarmResponse": [
      {
        "file": "../compounds.js",
        "line": 13,
        "excerpt": "…}),alarm:Object.freeze({production:'alarmProduction',reception:'alarmReception',response:'alarmResponse'}),social:Object.freeze({production:'socialProduction',reception:'socialReception',respon…"
      },
      {
        "file": "../compounds.js",
        "line": 22,
        "excerpt": "  alarmProduction:sense*disturbance,alarmReception:sense*disturbance,alarmResponse:-.8,"
      }
    ],
    "ambientSense": [
      {
        "file": "../model.js",
        "line": 42,
        "excerpt": "  ambientSense:{min:0,max:1,default:0,unit:'light investment',category:'sensing',role:'Ambient lamp sens…"
      },
      {
        "file": "../model.js",
        "line": 127,
        "excerpt": "const massGenes=['bodySize','biomassDensity','storageInvestment','ambientSense','directionalSense','chemicalSense','disturbanceSense','emissionCapacity','toxinSynthesis…"
      },
      {
        "file": "../grazer.js",
        "line": 15,
        "excerpt": "…ythmStrength??0)>=.08&&(genes.twilightPreference??0)<=.6&&(phase<.25||phase>=.75)&&(genes.ambientSense??0)>0,light=member.bio?.ambientLamp??environment.light;return grazerSenseRange(member.gen…"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…||genome.version===1&&['rhythmPhase','rhythmStrength','twilightPreference','entrainment','ambientSense','lightPreference','lightTolerance','directionalSense','spectralCenter','spectralWidth','…"
      },
      {
        "file": "../population.js",
        "line": 150,
        "excerpt": "…0;i<3;i++){const source=sources[group],genes={...source.genome.genes};if(group===3){genes.ambientSense=0;genes.lightPreference=.5;genes.lightTolerance=1}const member=add(ALGA_FAMILY,.34+group*…"
      },
      {
        "file": "../population.js",
        "line": 325,
        "excerpt": "…timum','metabolicPace','rhythmPhase','rhythmStrength','chemicalSense','disturbanceSense','ambientSense'];"
      },
      {
        "file": "../signals.js",
        "line": 30,
        "excerpt": " b.localLamp=lamp;if((g.ambientSense??0)>0&&old!==null){const change=lamp-old;b.ambientChange=clamp(change,-100,100)}else b.am…"
      },
      {
        "file": "../signals.js",
        "line": 34,
        "excerpt": " const sensed=(g.ambientSense??0)*(g.entrainment??0),change=previousLamp===null?0:b.localLamp-previousLamp;"
      },
      {
        "file": "../signals.js",
        "line": 42,
        "excerpt": " const photoAllowed=member.genome.locomotionFamily!==ALGA_FAMILY||(g.ambientSense??0)<=0||b.ambientLamp<=(g.photoGlowThreshold??.18)*100;"
      },
      {
        "file": "../signals.js",
        "line": 49,
        "excerpt": "…key)=>sum+(g[key]>0?1:0),0);const upkeep=dt*(.000018*metabolicActivityFactor(b.drive)*((g.ambientSense??0)+(g.directionalSense??0)+(g.chemicalSense??0)+(g.disturbanceSense??0)+(g.emissionCapac…"
      },
      {
        "file": "../perception.js",
        "line": 32,
        "excerpt": " if(b&&(member.genome.genes.ambientSense??0)>0)observations.push(cue('ambient',now,b.localLamp,'percent',{modality:'ambient recept…"
      },
      {
        "file": "../light-preference.js",
        "line": 4,
        "excerpt": "…lightPreference===undefined||(genome?.genes?.lightTolerance??1)>=1?0:clamp(genome?.genes?.ambientSense??0,0,1)});"
      }
    ],
    "biomassDensity": [
      {
        "file": "../model.js",
        "line": 65,
        "excerpt": "  biomassDensity:{min:.6,max:1.6,default:1,unit:'relative mineral mass',category:'body',role:'Mass packed …"
      },
      {
        "file": "../model.js",
        "line": 127,
        "excerpt": "const massGenes=['bodySize','biomassDensity','storageInvestment','ambientSense','directionalSense','chemicalSense','disturbanceSense'…"
      },
      {
        "file": "../model.js",
        "line": 130,
        "excerpt": "…t+=g[massGenes[i]]??0;const value=g.bodySize**3*(genome.locomotionFamily===ALGA_FAMILY?(g.biomassDensity??1)*(1+.1*(g.storageInvestment??0)):1)*(1+.035*sensorCost);massCache.set(genome,{family:g…"
      },
      {
        "file": "../model.js",
        "line": 136,
        "excerpt": " if(!(g.bodySize>=1.4&&g.biomassDensity<.75))return 0;"
      },
      {
        "file": "../model.js",
        "line": 167,
        "excerpt": "…000025*g.flocking+.00002*g.crossAffinity+.00003*(g.fusionCapacity||0)+.00003*Math.max(0,g.biomassDensity-1)+.00003*Math.max(0,g.divisionTempo-1)+.000025*Math.max(0,g.foodEnergy-1)+.000045*g.stor…"
      },
      {
        "file": "../model.js",
        "line": 174,
        "excerpt": "…'nutrientUptake','thermalOptimum','adhesion','flocking','crossAffinity','fusionCapacity','biomassDensity','divisionTempo','foodEnergy','storageInvestment','dormancy','coatInvestment'],"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…nce','detoxification'].includes(key)||genome.locomotionFamily===ALGA_FAMILY&&['adhesion','biomassDensity','divisionTempo','foodEnergy','crossAffinity','storageInvestment','reserveAllocation','mo…"
      },
      {
        "file": "../appearance.js",
        "line": 87,
        "excerpt": "  if(genes.bodySize>=1.4&&genes.biomassDensity<.75)return looks.noctiluca;"
      },
      {
        "file": "../appearance.js",
        "line": 90,
        "excerpt": "  if(genes.biomassDensity>=1.5&&genes.bodySize<1)return looks.diatom;"
      },
      {
        "file": "../appearance.js",
        "line": 96,
        "excerpt": "  if((genes.biomassDensity||1)>=1.4)return looks.iron;"
      }
    ],
    "bodySize": [
      {
        "file": "../model.js",
        "line": 63,
        "excerpt": "  bodySize:{min:.7,max:1.5,default:1,unit:'relative radius',category:'body',role:'Target mature body…"
      },
      {
        "file": "../model.js",
        "line": 92,
        "excerpt": " bodySize:GENE_RULES.bodySize,"
      },
      {
        "file": "../model.js",
        "line": 92,
        "excerpt": " bodySize:GENE_RULES.bodySize,"
      },
      {
        "file": "../model.js",
        "line": 109,
        "excerpt": "export const PROTOTYPE_GENE_RULES=Object.freeze({bodySize:GENE_RULES.bodySize,metabolicPace:GENE_RULES.metabolicPace,propulsion:GENE_RULES.propulsi…"
      },
      {
        "file": "../model.js",
        "line": 109,
        "excerpt": "export const PROTOTYPE_GENE_RULES=Object.freeze({bodySize:GENE_RULES.bodySize,metabolicPace:GENE_RULES.metabolicPace,propulsion:GENE_RULES.propulsion,slowdownThreshold…"
      },
      {
        "file": "../model.js",
        "line": 110,
        "excerpt": "export const DRIFTER_GENE_RULES=Object.freeze({bodySize:GENE_RULES.bodySize,metabolicPace:GENE_RULES.metabolicPace,buoyancy:{min:-1,max:1,default…"
      },
      {
        "file": "../model.js",
        "line": 110,
        "excerpt": "export const DRIFTER_GENE_RULES=Object.freeze({bodySize:GENE_RULES.bodySize,metabolicPace:GENE_RULES.metabolicPace,buoyancy:{min:-1,max:1,default:0,unit:'vertical bi…"
      },
      {
        "file": "../model.js",
        "line": 111,
        "excerpt": "export const ATTACHED_GENE_RULES=Object.freeze({bodySize:GENE_RULES.bodySize,metabolicPace:GENE_RULES.metabolicPace,slowdownThreshold:GENE_RULES.s…"
      },
      {
        "file": "../model.js",
        "line": 111,
        "excerpt": "export const ATTACHED_GENE_RULES=Object.freeze({bodySize:GENE_RULES.bodySize,metabolicPace:GENE_RULES.metabolicPace,slowdownThreshold:GENE_RULES.slowdownThreshold,con…"
      },
      {
        "file": "../model.js",
        "line": 127,
        "excerpt": "const massGenes=['bodySize','biomassDensity','storageInvestment','ambientSense','directionalSense','chemicalSense','…"
      },
      {
        "file": "../model.js",
        "line": 130,
        "excerpt": "…sorCost=0;for(let i=3;i<massGenes.length;i++)sensorCost+=g[massGenes[i]]??0;const value=g.bodySize**3*(genome.locomotionFamily===ALGA_FAMILY?(g.biomassDensity??1)*(1+.1*(g.storageInvestmen…"
      },
      {
        "file": "../model.js",
        "line": 131,
        "excerpt": "…const carrionSpecialist=genome=>genome?.locomotionFamily===CRAWLER_FAMILY&&(genome.genes?.bodySize||1)<.9&&(genome.genes?.propulsion||0)>=.65;"
      },
      {
        "file": "../model.js",
        "line": 136,
        "excerpt": " if(!(g.bodySize>=1.4&&g.biomassDensity<.75))return 0;"
      },
      {
        "file": "../model.js",
        "line": 137,
        "excerpt": " if((g.fusionCapacity||0)>=.8&&(g.emissionCapacity||0)>=.8&&((g.bodySize>=1.45&&(g.emissionBand||0)<.2)||(g.bodySize>=1.2&&(g.emissionBand||0)>.25&&(g.emissionBan…"
      },
      {
        "file": "../model.js",
        "line": 137,
        "excerpt": "…ity||0)>=.8&&(g.emissionCapacity||0)>=.8&&((g.bodySize>=1.45&&(g.emissionBand||0)<.2)||(g.bodySize>=1.2&&(g.emissionBand||0)>.25&&(g.emissionBand||0)<.4)))return 0;"
      },
      {
        "file": "../model.js",
        "line": 158,
        "excerpt": "…mily===FLAGELLATE_FAMILY?.052:normalized.locomotionFamily===CARNIVORE_FAMILY?.047:.031)*g.bodySize,thrust:(normalized.locomotionFamily===OMNIVORE_FAMILY?.000009:normalized.locomotionFamily…"
      },
      {
        "file": "../model.js",
        "line": 158,
        "excerpt": "…,vacuoleCapacity:normalized.locomotionFamily===OMNIVORE_FAMILY?Math.min(6,2.2*g.storage*g.bodySize**3):normalized.locomotionFamily===OPENWATER_FAMILY?8:normalized.locomotionFamily===APEX_F…"
      },
      {
        "file": "../model.js",
        "line": 158,
        "excerpt": "…==OPENWATER_FAMILY?8:normalized.locomotionFamily===APEX_FAMILY?Math.min(8,2.8*g.storage*g.bodySize**3):normalized.locomotionFamily===FLOOR_HUNTER_FAMILY?Math.min(8,2.4*g.storage*g.bodySize…"
      },
      {
        "file": "../model.js",
        "line": 158,
        "excerpt": "…bodySize**3):normalized.locomotionFamily===FLOOR_HUNTER_FAMILY?Math.min(8,2.4*g.storage*g.bodySize**3):(normalized.locomotionFamily===CARNIVORE_FAMILY?2.1:1.45)*g.storage*g.bodySize**3,pro…"
      },
      {
        "file": "../model.js",
        "line": 158,
        "excerpt": "…rage*g.bodySize**3):(normalized.locomotionFamily===CARNIVORE_FAMILY?2.1:1.45)*g.storage*g.bodySize**3,processingRate:(normalized.locomotionFamily===OPENWATER_FAMILY?.000018:normalized.loco…"
      },
      {
        "file": "../model.js",
        "line": 158,
        "excerpt": "…_HUNTER_FAMILY?.00002:.000012)*g.processing*g.metabolicPace,maintenance:(.00014+.000052*g.bodySize**2+.000025*g.sensingRange+.000025*g.feedingAperture+.000018*g.storage+.000025*g.flocking+…"
      },
      {
        "file": "../model.js",
        "line": 159,
        "excerpt": "  if(normalized.locomotionFamily!==ALGA_FAMILY)return {radius:.029*g.bodySize,thrust:.00000015*(g.propulsion??g.contractility??0),headingMemory:.3+3.7*(g.turnPersisten…"
      },
      {
        "file": "../model.js",
        "line": 159,
        "excerpt": "…ry:.3+3.7*(g.turnPersistence??.5),optimum:g.thermalOptimum,maintenance:(.000055+.000035*g.bodySize**2+.00002*(g.sporeInvestment||0))*g.metabolicPace,activeCost:.00010*(g.propulsion??g.cont…"
      },
      {
        "file": "../model.js",
        "line": 161,
        "excerpt": "    radius:.029*g.bodySize,"
      },
      {
        "file": "../model.js",
        "line": 167,
        "excerpt": "    maintenance:(.000105+.000055*g.bodySize**2+.000045*g.photosyntheticInvestment+.000035*g.nutrientUptake+.00004*g.adhesion+.000025*…"
      },
      {
        "file": "../model.js",
        "line": 173,
        "excerpt": " consumer:['bodySize','propulsion','turnPersistence','thermalOptimum','sensingRange','feedingAperture','storag…"
      },
      {
        "file": "../model.js",
        "line": 174,
        "excerpt": " alga:['bodySize','propulsion','turnPersistence','photosyntheticInvestment','metabolicPace','nutrientUptak…"
      },
      {
        "file": "../model.js",
        "line": 175,
        "excerpt": " prototype:['bodySize','propulsion','contractility','turnPersistence','thermalOptimum','metabolicPace','sporeIn…"
      },
      {
        "file": "../physical.js",
        "line": 16,
        "excerpt": " const genome=member.genome,size=genome?.genes?.bodySize,bounds=genome&&geneRules(genome)?.bodySize,rule=Number.isFinite(size)&&bounds&&size>=boun…"
      },
      {
        "file": "../physical.js",
        "line": 16,
        "excerpt": "…const genome=member.genome,size=genome?.genes?.bodySize,bounds=genome&&geneRules(genome)?.bodySize,rule=Number.isFinite(size)&&bounds&&size>=bounds.min&&size<=bounds.max?familyRadius[genom…"
      },
      {
        "file": "../signals.js",
        "line": 12,
        "excerpt": "… function pulseInterval(member){const g=member.genome.genes,band=g.emissionBand??0,size=g.bodySize??1;return Math.round((4400+band*7700+size*850)*(.9+idFraction(member.id,29)*.2))}"
      },
      {
        "file": "../locomotion.js",
        "line": 31,
        "excerpt": " if(family===CRAWLER_FAMILY&&member.genome.genes.bodySize>=1.2&&member.genome.genes.turnPersistence>=.9&&!nearest){const old=m.trail.slice(0,-3);co…"
      },
      {
        "file": "../locomotion.js",
        "line": 32,
        "excerpt": " if(family===CRAWLER_FAMILY&&member.genome.genes.bodySize<.77&&member.genome.genes.turnPersistence<.3&&member.energy<35){let sumX=0,sumY=0,count=0;…"
      },
      {
        "file": "../locomotion.js",
        "line": 32,
        "excerpt": "…ng){if(other===member||other.genome.locomotionFamily!==CRAWLER_FAMILY||other.genome.genes.bodySize>=.77)continue;const distance=Math.hypot(other.cell.x-c.x,other.cell.y-c.y);if(distance>.0…"
      },
      {
        "file": "../appearance.js",
        "line": 76,
        "excerpt": "   if(genes.bodySize>=1.45&&(genes.emissionBand||0)<.2)return looks.saillantern;"
      },
      {
        "file": "../appearance.js",
        "line": 77,
        "excerpt": "   if(genes.bodySize<=.71&&(genes.emissionBand||0)>.4&&(genes.emissionBand||0)<.6)return looks.pinlight;"
      },
      {
        "file": "../appearance.js",
        "line": 78,
        "excerpt": "   if(genes.bodySize>=1.2&&(genes.emissionBand||0)>.25&&(genes.emissionBand||0)<.4)return looks.mintbell;"
      },
      {
        "file": "../appearance.js",
        "line": 79,
        "excerpt": "   if(genes.bodySize<=.76&&(genes.emissionBand||0)>.85)return looks.needlestar;"
      },
      {
        "file": "../appearance.js",
        "line": 87,
        "excerpt": "  if(genes.bodySize>=1.4&&genes.biomassDensity<.75)return looks.noctiluca;"
      },
      {
        "file": "../appearance.js",
        "line": 89,
        "excerpt": "  if(genes.adhesion>=.8&&genes.bodySize>=1.4)return looks.kelp;"
      },
      {
        "file": "../appearance.js",
        "line": 90,
        "excerpt": "  if(genes.biomassDensity>=1.5&&genes.bodySize<1)return looks.diatom;"
      },
      {
        "file": "../appearance.js",
        "line": 94,
        "excerpt": "  if((genes.divisionTempo||1)>=1.7&&(genes.bodySize||1)<.77)return looks.spark;"
      },
      {
        "file": "../appearance.js",
        "line": 97,
        "excerpt": "  if((genes.bodySize||1)>1.24&&(genes.photosyntheticInvestment||0)>.8)return looks.veil;"
      },
      {
        "file": "../appearance.js",
        "line": 98,
        "excerpt": "  if((genes.bodySize||1)<.79&&(genes.propulsion||0)>.67)return looks.dart;"
      },
      {
        "file": "../appearance.js",
        "line": 99,
        "excerpt": "  if((genes.bodySize||1)<.77&&(genes.photosyntheticInvestment||0)>=.8)return looks.bloom;"
      },
      {
        "file": "../appearance.js",
        "line": 104,
        "excerpt": "…urn (genes.rhythmStrength||0)>.75&&(genes.directionalSense||0)>.8?looks.gloammouth:(genes.bodySize||1)<1?looks.fleckmouth:looks.mosaicmouth;"
      },
      {
        "file": "../appearance.js",
        "line": 106,
        "excerpt": " if(family===FLOOR_HUNTER_FAMILY)return genes.bodySize>=1.45&&genes.propulsion<.55?looks.amoeba_proteus:looks.siltfang;"
      },
      {
        "file": "../appearance.js",
        "line": 108,
        "excerpt": "…eturn (genes.emissionCapacity||0)>.85&&(genes.rhythmStrength||0)>.85?looks.lurejaw:(genes.bodySize||1)>=1.3?looks.broadmouth:looks.raptor;"
      },
      {
        "file": "../appearance.js",
        "line": 115,
        "excerpt": "  if((genes.bodySize||1)<.86&&(genes.sensingRange||0)>=1.2)return looks.patient_ciliate;"
      },
      {
        "file": "../appearance.js",
        "line": 122,
        "excerpt": "  if((genes.bodySize||1)<.86)return looks.lean_flagellate;"
      },
      {
        "file": "../appearance.js",
        "line": 127,
        "excerpt": "  if(genes.bodySize>=1.4&&genes.turnPersistence<.3)return looks.fuligo;"
      },
      {
        "file": "../appearance.js",
        "line": 128,
        "excerpt": "  if(genes.bodySize>=1.2&&genes.turnPersistence>=.9)return looks.physarum;"
      },
      {
        "file": "../appearance.js",
        "line": 129,
        "excerpt": "  if(genes.bodySize<.77&&genes.turnPersistence<.3)return looks.dicty;"
      },
      {
        "file": "../appearance.js",
        "line": 130,
        "excerpt": "  if((genes.bodySize||1)>=1.28)return looks.mound;"
      },
      {
        "file": "../appearance.js",
        "line": 131,
        "excerpt": "  if((genes.bodySize||1)>=1.05)return looks.silt;"
      },
      {
        "file": "../appearance.js",
        "line": 132,
        "excerpt": "  if((genes.bodySize||1)<.77&&(genes.propulsion||0)>.9)return looks.ash;"
      }
    ],
    "buoyancy": [
      {
        "file": "../model.js",
        "line": 110,
        "excerpt": "…_RULES=Object.freeze({bodySize:GENE_RULES.bodySize,metabolicPace:GENE_RULES.metabolicPace,buoyancy:{min:-1,max:1,default:0,unit:'vertical bias',category:'locomotion',role:'Passive settling…"
      },
      {
        "file": "../population.js",
        "line": 242,
        "excerpt": "…d}`;member.genome=normalizeGenome({locomotionFamily:family,genes:family===DRIFTER_FAMILY?{buoyancy:0}:{}});member.biomass=matureMass(member.genome)*.7;member.energy=family===GRAZER_FAMILY?…"
      },
      {
        "file": "../population.js",
        "line": 281,
        "excerpt": "…l==='current'){drifter.cell.x=.5;drifter.cell.y=.5;drifter.cell.z=.6;drifter.genome.genes.buoyancy=.8;p.records.find(record=>record.id===drifter.id).genome=copy(drifter.genome)}"
      },
      {
        "file": "../population.js",
        "line": 579,
        "excerpt": "…,rules=geneRules(result);for(const gene of ['metabolicPace','propulsion','contractility','buoyancy','slowdownThreshold']){if(!(gene in rules))continue;const old=result.genes[gene];if(!['me…"
      },
      {
        "file": "../population.js",
        "line": 579,
        "excerpt": "…eshold']){if(!(gene in rules))continue;const old=result.genes[gene];if(!['metabolicPace','buoyancy','slowdownThreshold'].includes(gene)&&old<=0)continue;const range=gene==='metabolicPace'?…"
      },
      {
        "file": "../population.js",
        "line": 579,
        "excerpt": "…hreshold'].includes(gene)&&old<=0)continue;const range=gene==='metabolicPace'?.04:gene==='buoyancy'?.04:gene==='slowdownThreshold'?7:.08,next=clamp(old+(['buoyancy','slowdownThreshold'].in…"
      },
      {
        "file": "../population.js",
        "line": 579,
        "excerpt": "…tabolicPace'?.04:gene==='buoyancy'?.04:gene==='slowdownThreshold'?7:.08,next=clamp(old+(['buoyancy','slowdownThreshold'].includes(gene)?(random(pop)*2-1)*range:old*(random(pop)*2-1)*range)…"
      },
      {
        "file": "../locomotion.js",
        "line": 28,
        "excerpt": "…0032+current.y*.0000003)*dt/scale);c.vz=c.vz*.72+((.5-c.z)*.000000002-member.genome.genes.buoyancy*.000000012)*dt/scale;c.x+=c.vx*dt;c.y+=c.vy*dt;c.z=clamp(c.z+c.vz*dt,0,1);m.active={x:0,y…"
      }
    ],
    "cannibalism": [
      {
        "file": "../model.js",
        "line": 108,
        "excerpt": "export const HUNTER_GENE_RULES=Object.freeze({...GRAZER_GENE_RULES,cannibalism:{min:0,max:1,default:0,unit:'prey recognition',category:'feeding',role:'Same-family prey …"
      },
      {
        "file": "../model.js",
        "line": 158,
        "excerpt": "…*g.sensingRange+.000025*g.feedingAperture+.000018*g.storage+.000025*g.flocking+.000025*(g.cannibalism||0)+.00002*(g.acquisitionCapacity||0)+.000025*Math.max(0,g.divisionTempo-1)+(normalized.l…"
      },
      {
        "file": "../model.js",
        "line": 173,
        "excerpt": "…imum','sensingRange','feedingAperture','storage','processing','metabolicPace','flocking','cannibalism','acquisitionCapacity','divisionTempo'],"
      },
      {
        "file": "../grazer.js",
        "line": 29,
        "excerpt": "…amily===preyFamily&&[APEX_FAMILY,OPENWATER_FAMILY].includes(family)&&(grazer.genome.genes.cannibalism||0)>=CANNIBALISM_THRESHOLD;"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…des(key)||['flocking','divisionTempo','lightPreference','lightTolerance','metabolicPace','cannibalism','photoGlowThreshold','fusionCapacity','matingType','acquisitionCapacity','sporeInvestmen…"
      },
      {
        "file": "../appearance.js",
        "line": 105,
        "excerpt": " if(family===OPENWATER_FAMILY)return (genes.cannibalism||0)>=.55?looks.splitjaw:looks.widejaw;"
      },
      {
        "file": "../appearance.js",
        "line": 107,
        "excerpt": " if(family===APEX_FAMILY)return (genes.cannibalism||0)>=.55?looks.kinmaw:looks.apex;"
      }
    ],
    "chemicalSense": [
      {
        "file": "../model.js",
        "line": 48,
        "excerpt": "  chemicalSense:{min:0,max:1,default:0,unit:'mineral receptor investment',category:'sensing',role:'Dissol…"
      },
      {
        "file": "../model.js",
        "line": 127,
        "excerpt": "…Genes=['bodySize','biomassDensity','storageInvestment','ambientSense','directionalSense','chemicalSense','disturbanceSense','emissionCapacity','toxinSynthesis','irritantResistance','motorResist…"
      },
      {
        "file": "../model.js",
        "line": 252,
        "excerpt": " ctl.strength=ctl.enabled?Math.min(.45,norm*.16*(1+.5*(state.organism.genome.genes.chemicalSense??0))):0;ctl.headingTarget=Math.atan2(gy,gx);ctl.verticalTarget=norm>0?limit(gz/norm,-1,1)…"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…','lightPreference','lightTolerance','directionalSense','spectralCenter','spectralWidth','chemicalSense','disturbanceSense','emissionCapacity','emissionPower','emissionBand'].includes(key)||['f…"
      },
      {
        "file": "../population.js",
        "line": 325,
        "excerpt": "const ACQUIRABLE_LOCI=['thermalOptimum','metabolicPace','rhythmPhase','rhythmStrength','chemicalSense','disturbanceSense','ambientSense'];"
      },
      {
        "file": "../compounds.js",
        "line": 19,
        "excerpt": " const g=genome?.genes||{},sense=g.chemicalSense??0,disturbance=g.disturbanceSense??0;"
      },
      {
        "file": "../signals.js",
        "line": 27,
        "excerpt": "…);b.ambientLamp=lamp;b.disturbance=0;b.disturbanceBearing=null;const chemicalInvestment=g.chemicalSense??0;b.chemical=chemicalInvestment?sampleNutrient(member.cell,environment.nutrientField,fie…"
      },
      {
        "file": "../signals.js",
        "line": 49,
        "excerpt": "…(.000018*metabolicActivityFactor(b.drive)*((g.ambientSense??0)+(g.directionalSense??0)+(g.chemicalSense??0)+(g.disturbanceSense??0)+(g.emissionCapacity??0)+apparatus*.35)+regulatorCost);"
      },
      {
        "file": "../perception.js",
        "line": 4,
        "excerpt": "…ect.freeze({nutrient:{version:1,unit:'local mineral units',status:'implemented',receptor:'chemicalSense',source:'signals.observeSignal paired XY probes',gradient:'thresholded bearing',history:'…"
      },
      {
        "file": "../perception.js",
        "line": 4,
        "excerpt": "…ck',render:'uncertain sector',read(member,now){const b=member.bio;if((member.genome.genes.chemicalSense??0)<=0||!b||b.chemicalBearing==null)return null;return cue('chemical',now,b.chemical,'loc…"
      }
    ],
    "coatInvestment": [
      {
        "file": "../model.js",
        "line": 79,
        "excerpt": "  coatInvestment:{min:0,max:1,default:0,unit:'covering investment',category:'defense',role:'Constructed mi…"
      },
      {
        "file": "../model.js",
        "line": 143,
        "excerpt": " if((g.coatInvestment||0)>=.5)return 0;"
      },
      {
        "file": "../model.js",
        "line": 167,
        "excerpt": "…00025*Math.max(0,g.foodEnergy-1)+.000045*g.storageInvestment+.000025*g.dormancy+.000065*g.coatInvestment)*g.metabolicPace,"
      },
      {
        "file": "../model.js",
        "line": 174,
        "excerpt": "…onCapacity','biomassDensity','divisionTempo','foodEnergy','storageInvestment','dormancy','coatInvestment'],"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…nergy','crossAffinity','storageInvestment','reserveAllocation','mobilization','dormancy','coatInvestment'].includes(key))&&genome.genes[key]===undefined||typeof genome.genes[key]==='number'&&Num…"
      },
      {
        "file": "../population.js",
        "line": 57,
        "excerpt": "…ty=genome=>genome.locomotionFamily===ALGA_FAMILY?.26*structuralMass(genome)*(genome.genes.coatInvestment??0):0;"
      },
      {
        "file": "../population.js",
        "line": 545,
        "excerpt": "…red=Math.min(coatCapacity(member.genome)-(member.coat||0),.000004*dt*(member.genome.genes.coatInvestment??0),(member.energy-35)/8);if(desired>0){const built=withdrawNutrient(member.cell,state.en…"
      },
      {
        "file": "../appearance.js",
        "line": 86,
        "excerpt": "  if((genes.coatInvestment||0)>=.5)return looks.glasscoat;"
      }
    ],
    "contractility": [
      {
        "file": "../model.js",
        "line": 111,
        "excerpt": "…ize,metabolicPace:GENE_RULES.metabolicPace,slowdownThreshold:GENE_RULES.slowdownThreshold,contractility:{min:0,max:1,default:.6,unit:'stalk effort',category:'locomotion',role:'Contraction capac…"
      },
      {
        "file": "../model.js",
        "line": 159,
        "excerpt": "…tionFamily!==ALGA_FAMILY)return {radius:.029*g.bodySize,thrust:.00000015*(g.propulsion??g.contractility??0),headingMemory:.3+3.7*(g.turnPersistence??.5),optimum:g.thermalOptimum,maintenance:(.0…"
      },
      {
        "file": "../model.js",
        "line": 159,
        "excerpt": "…Size**2+.00002*(g.sporeInvestment||0))*g.metabolicPace,activeCost:.00010*(g.propulsion??g.contractility??0)};"
      },
      {
        "file": "../model.js",
        "line": 175,
        "excerpt": " prototype:['bodySize','propulsion','contractility','turnPersistence','thermalOptimum','metabolicPace','sporeInvestment']"
      },
      {
        "file": "../population.js",
        "line": 366,
        "excerpt": " else if(family===ATTACHED_FAMILY&&member.genome.genes.contractility>=.95){const eaten=withdrawDetritus(state,member.cell,.000015*dt);resource='detritus';gros…"
      },
      {
        "file": "../population.js",
        "line": 539,
        "excerpt": "…==CRAWLER_FAMILY&&!(member.genome.locomotionFamily===ATTACHED_FAMILY&&member.genome.genes.contractility>=.95);accountEnergy(state,photo?'prototype photosynthesis':'organic construction',{light:…"
      },
      {
        "file": "../population.js",
        "line": 579,
        "excerpt": "…ome)),changes=[],rules=geneRules(result);for(const gene of ['metabolicPace','propulsion','contractility','buoyancy','slowdownThreshold']){if(!(gene in rules))continue;const old=result.genes[gen…"
      },
      {
        "file": "../locomotion.js",
        "line": 29,
        "excerpt": "…Math.hypot(other.cell.x-c.x,other.cell.y-c.y)<.095/scale&&Math.abs(other.cell.z-c.z)<.15),contractility=member.genome.genes.contractility;if(near&&now>=m.until){m.mode='contract';m.until=now+50…"
      },
      {
        "file": "../locomotion.js",
        "line": 29,
        "excerpt": "…cell.y-c.y)<.095/scale&&Math.abs(other.cell.z-c.z)<.15),contractility=member.genome.genes.contractility;if(near&&now>=m.until){m.mode='contract';m.until=now+500}if(now>=m.until&&m.mode==='contr…"
      },
      {
        "file": "../locomotion.js",
        "line": 29,
        "excerpt": "…ver';m.extension=clamp((m.extension??0)+(m.mode==='contract'?-1:1)*dt*fuelFactor/(900-500*contractility),0,1);c.x=a.x;c.y=a.y;c.z=a.z-Math.min(.13/scale,(.04+.08*m.extension)/scale);c.vx=c.vy=c…"
      },
      {
        "file": "../appearance.js",
        "line": 137,
        "excerpt": " if(family===ATTACHED_FAMILY)return genes.contractility>=.95?looks.vorticella:looks.attached;"
      }
    ],
    "crossAffinity": [
      {
        "file": "../model.js",
        "line": 69,
        "excerpt": "  crossAffinity:{min:0,max:1,default:0,unit:'contact compatibility',category:'reproduction',role:'Ability…"
      },
      {
        "file": "../model.js",
        "line": 167,
        "excerpt": "…yntheticInvestment+.000035*g.nutrientUptake+.00004*g.adhesion+.000025*g.flocking+.00002*g.crossAffinity+.00003*(g.fusionCapacity||0)+.00003*Math.max(0,g.biomassDensity-1)+.00003*Math.max(0,g.di…"
      },
      {
        "file": "../model.js",
        "line": 174,
        "excerpt": "…heticInvestment','metabolicPace','nutrientUptake','thermalOptimum','adhesion','flocking','crossAffinity','fusionCapacity','biomassDensity','divisionTempo','foodEnergy','storageInvestment','dorm…"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…ocomotionFamily===ALGA_FAMILY&&['adhesion','biomassDensity','divisionTempo','foodEnergy','crossAffinity','storageInvestment','reserveAllocation','mobilization','dormancy','coatInvestment'].incl…"
      },
      {
        "file": "../population.js",
        "line": 409,
        "excerpt": "  const ready=alga&&(genes.crossAffinity??0)>=.5&&now-member.birthAt>=30000&&member.energy>=50&&!member.crossPending;"
      },
      {
        "file": "../population.js",
        "line": 511,
        "excerpt": "…===ALGA_FAMILY&&(!member.dormancy||member.dormancy.mode==='active')&&(member.genome.genes.crossAffinity||0)>=.5&&!member.crossPending&&!feeding.has(member.id)&&now-member.birthAt>=30000&&member…"
      },
      {
        "file": "../population.js",
        "line": 512,
        "excerpt": "…d===b.lineageId)continue;const distinct=Object.keys(geneRules(a.genome)).some(key=>key!=='crossAffinity'&&(a.genome.genes[key]??geneRules(a.genome)[key].default)!==(b.genome.genes[key]??geneRul…"
      },
      {
        "file": "../compounds.js",
        "line": 23,
        "excerpt": "  socialProduction:sense*Math.max(g.flocking??0,g.crossAffinity??0),socialReception:sense*Math.max(g.flocking??0,g.crossAffinity??0),socialResponse:.45"
      },
      {
        "file": "../compounds.js",
        "line": 23,
        "excerpt": "…Math.max(g.flocking??0,g.crossAffinity??0),socialReception:sense*Math.max(g.flocking??0,g.crossAffinity??0),socialResponse:.45"
      },
      {
        "file": "../propagules.js",
        "line": 11,
        "excerpt": "…nome.genes;if(member.genome.locomotionFamily===ALGA_FAMILY&&(g.fusionCapacity??0)>=.7&&(g.crossAffinity??0)>=.5)return 'gamete';if(member.genome.locomotionFamily===CRAWLER_FAMILY&&(g.sporeInves…"
      }
    ],
    "debrisMetabolism": [
      {
        "file": "../model.js",
        "line": 68,
        "excerpt": "  debrisMetabolism:{min:0,max:1,default:0,unit:'pathway expression',category:'metabolism',role:'Suspended de…"
      },
      {
        "file": "../model.js",
        "line": 132,
        "excerpt": "…const usesDebrisMetabolism=genome=>genome?.locomotionFamily===ALGA_FAMILY&&(genome.genes?.debrisMetabolism??0)>=.5;"
      },
      {
        "file": "../model.js",
        "line": 152,
        "excerpt": "…hreshold'&&input.version<4&&input.genes?.[key]===undefined)continue;const fallback=key==='debrisMetabolism'&&input.version===2&&input.genes?.[key]===undefined?legacyDebrisPathway(input.genes||{}):…"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…fusionCapacity','matingType','acquisitionCapacity','sporeInvestment','slowdownThreshold','debrisMetabolism','toxinSynthesis','toxinRelease','irritantResistance','motorResistance','sensoryResistanc…"
      },
      {
        "file": "../population.js",
        "line": 623,
        "excerpt": "…opulation.living){if(member.genome?.locomotionFamily===ALGA_FAMILY&&member.genome?.genes?.debrisMetabolism===undefined){const record=next.population.records.find(item=>item.id===member.id);if(reco…"
      },
      {
        "file": "../population.js",
        "line": 623,
        "excerpt": "…=next.population.records.find(item=>item.id===member.id);if(record&&record.genome?.genes?.debrisMetabolism===undefined){record.legacyGenome=copy(record.genome);record.genome=upgradeCompoundGenome(…"
      },
      {
        "file": "../population.js",
        "line": 623,
        "excerpt": "…r.crossPending?.genome?.locomotionFamily===ALGA_FAMILY&&member.crossPending.genome.genes?.debrisMetabolism===undefined)member.crossPending.genome=normalizeGenome(member.crossPending.genome)}for(co…"
      },
      {
        "file": "../population.js",
        "line": 623,
        "excerpt": "…aguleMedium?.units||[])if(unit.genome?.locomotionFamily===ALGA_FAMILY&&unit.genome.genes?.debrisMetabolism===undefined)unit.genome=normalizeGenome(unit.genome);next.population.supportLifespanMs??=…"
      }
    ],
    "detoxification": [
      {
        "file": "../model.js",
        "line": 56,
        "excerpt": "  detoxification:{min:0,max:1,default:0,unit:'clearance investment',category:'chemical defense',role:'Toxi…"
      },
      {
        "file": "../model.js",
        "line": 127,
        "excerpt": "…ionCapacity','toxinSynthesis','irritantResistance','motorResistance','sensoryResistance','detoxification','organicProduction','organicReception','alarmProduction','alarmReception','socialProduct…"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…oxinSynthesis','toxinRelease','irritantResistance','motorResistance','sensoryResistance','detoxification'].includes(key)||genome.locomotionFamily===ALGA_FAMILY&&['adhesion','biomassDensity','div…"
      },
      {
        "file": "../toxicology.js",
        "line": 20,
        "excerpt": "…ynthesis||0)+(g.irritantResistance||0)+(g.motorResistance||0)+(g.sensoryResistance||0)+(g.detoxification||0)),paid=Math.min(member.energy,upkeep);member.energy-=paid;"
      },
      {
        "file": "../toxicology.js",
        "line": 23,
        "excerpt": "…(const kind of kinds){const resistance=clamp(g[`${kind}Resistance`]||0,0,1),detox=clamp(g.detoxification||0,0,1),concentration=local?.[`toxin-${kind}`]||0;concentrations[kind]=concentration;cons…"
      },
      {
        "file": "../toxicology.js",
        "line": 24,
        "excerpt": "…ynthesis||0)+(g.irritantResistance||0)+(g.motorResistance||0)+(g.sensoryResistance||0)+(g.detoxification||0));const paid=Math.min(member.energy,cost);member.energy-=paid;return {cost:paid,concen…"
      }
    ],
    "directionalSense": [
      {
        "file": "../model.js",
        "line": 45,
        "excerpt": "  directionalSense:{min:0,max:1,default:0,unit:'receptor investment',category:'sensing',role:'Biological lig…"
      },
      {
        "file": "../model.js",
        "line": 127,
        "excerpt": "const massGenes=['bodySize','biomassDensity','storageInvestment','ambientSense','directionalSense','chemicalSense','disturbanceSense','emissionCapacity','toxinSynthesis','irritantResistan…"
      },
      {
        "file": "../regulation.js",
        "line": 19,
        "excerpt": " return {lightProgram:capacity<=0?0:alga&&capacity>.9?7:(g.directionalSense||0)>.6&&(g.disturbanceSense||0)>.65?8:(g.directionalSense||0)>.6&&capacity>.5?5:(g.distur…"
      },
      {
        "file": "../regulation.js",
        "line": 19,
        "excerpt": "…ity<=0?0:alga&&capacity>.9?7:(g.directionalSense||0)>.6&&(g.disturbanceSense||0)>.65?8:(g.directionalSense||0)>.6&&capacity>.5?5:(g.disturbanceSense||0)>.65?3:2,"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…th','twilightPreference','entrainment','ambientSense','lightPreference','lightTolerance','directionalSense','spectralCenter','spectralWidth','chemicalSense','disturbanceSense','emissionCapacity','…"
      },
      {
        "file": "../signals.js",
        "line": 26,
        "excerpt": "…wer||0,distance=null){const sg=source.genome.genes,rg=receiver.genome.genes,investment=rg.directionalSense??0;if(investment<=0||power<=0)return 0;const d=distance??Math.hypot(source.cell.x-receive…"
      },
      {
        "file": "../signals.js",
        "line": 49,
        "excerpt": "…1:0),0);const upkeep=dt*(.000018*metabolicActivityFactor(b.drive)*((g.ambientSense??0)+(g.directionalSense??0)+(g.chemicalSense??0)+(g.disturbanceSense??0)+(g.emissionCapacity??0)+apparatus*.35)+r…"
      },
      {
        "file": "../appearance.js",
        "line": 104,
        "excerpt": " if(family===OMNIVORE_FAMILY)return (genes.rhythmStrength||0)>.75&&(genes.directionalSense||0)>.8?looks.gloammouth:(genes.bodySize||1)<1?looks.fleckmouth:looks.mosaicmouth;"
      },
      {
        "file": "../appearance.js",
        "line": 112,
        "excerpt": "  if((genes.rhythmStrength||0)>.9&&(genes.directionalSense||0)>.9)return looks.nightglass;"
      },
      {
        "file": "../appearance.js",
        "line": 120,
        "excerpt": "  if((genes.rhythmStrength||0)>.8&&(genes.directionalSense||0)>.85)return looks.dusktail;"
      }
    ],
    "disturbanceSense": [
      {
        "file": "../model.js",
        "line": 57,
        "excerpt": "  disturbanceSense:{min:0,max:1,default:0,unit:'motion investment',category:'sensing',role:'Local motion and…"
      },
      {
        "file": "../model.js",
        "line": 127,
        "excerpt": "…','biomassDensity','storageInvestment','ambientSense','directionalSense','chemicalSense','disturbanceSense','emissionCapacity','toxinSynthesis','irritantResistance','motorResistance','sensoryResis…"
      },
      {
        "file": "../regulation.js",
        "line": 19,
        "excerpt": " return {lightProgram:capacity<=0?0:alga&&capacity>.9?7:(g.directionalSense||0)>.6&&(g.disturbanceSense||0)>.65?8:(g.directionalSense||0)>.6&&capacity>.5?5:(g.disturbanceSense||0)>.65?3:2,"
      },
      {
        "file": "../regulation.js",
        "line": 19,
        "excerpt": "…lSense||0)>.6&&(g.disturbanceSense||0)>.65?8:(g.directionalSense||0)>.6&&capacity>.5?5:(g.disturbanceSense||0)>.65?3:2,"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…ce','lightTolerance','directionalSense','spectralCenter','spectralWidth','chemicalSense','disturbanceSense','emissionCapacity','emissionPower','emissionBand'].includes(key)||['flocking','divisionT…"
      },
      {
        "file": "../population.js",
        "line": 325,
        "excerpt": "…LE_LOCI=['thermalOptimum','metabolicPace','rhythmPhase','rhythmStrength','chemicalSense','disturbanceSense','ambientSense'];"
      },
      {
        "file": "../compounds.js",
        "line": 19,
        "excerpt": " const g=genome?.genes||{},sense=g.chemicalSense??0,disturbance=g.disturbanceSense??0;"
      },
      {
        "file": "../signals.js",
        "line": 28,
        "excerpt": " const disturbanceSense=g.disturbanceSense??0;for(const other of nearby){if(other===member)continue;const power=p…"
      },
      {
        "file": "../signals.js",
        "line": 28,
        "excerpt": " const disturbanceSense=g.disturbanceSense??0;for(const other of nearby){if(other===member)continue;const power=pulseSnapshot?.get(o…"
      },
      {
        "file": "../signals.js",
        "line": 28,
        "excerpt": "…ember)continue;const power=pulseSnapshot?.get(other.id)??other.bio?.power??0;if(power<=0&&disturbanceSense<=0)continue;const d=Math.hypot(other.cell.x-member.cell.x,other.cell.y-member.cell.y,(oth…"
      },
      {
        "file": "../signals.js",
        "line": 28,
        "excerpt": "…r.cell.x),band:other.genome.genes.emissionBand??0,pulseUntil:other.bio?.pulseUntil||0}}if(disturbanceSense>0){const speed=Math.hypot(other.cell.vx||0,other.cell.vy||0,(other.cell.vz||0)*DEPTH_ASPE…"
      },
      {
        "file": "../signals.js",
        "line": 28,
        "excerpt": "…ath.hypot(other.cell.vx||0,other.cell.vy||0,(other.cell.vz||0)*DEPTH_ASPECT),motion=clamp(disturbanceSense*speed*1100/(1+d*20),0,1);if(motion>b.disturbance){b.disturbance=motion;b.disturbanceBeari…"
      },
      {
        "file": "../signals.js",
        "line": 49,
        "excerpt": "…ivityFactor(b.drive)*((g.ambientSense??0)+(g.directionalSense??0)+(g.chemicalSense??0)+(g.disturbanceSense??0)+(g.emissionCapacity??0)+apparatus*.35)+regulatorCost);"
      },
      {
        "file": "../appearance.js",
        "line": 110,
        "excerpt": "  if((genes.emissionCapacity||0)>.9&&(genes.disturbanceSense||0)>.8)return looks.murkflash;"
      }
    ],
    "divisionTempo": [
      {
        "file": "../model.js",
        "line": 66,
        "excerpt": "  divisionTempo:{min:.6,max:1.8,default:1,unit:'relative rate',category:'reproduction',role:'Growth and d…"
      },
      {
        "file": "../model.js",
        "line": 94,
        "excerpt": " divisionTempo:GENE_RULES.divisionTempo,"
      },
      {
        "file": "../model.js",
        "line": 94,
        "excerpt": " divisionTempo:GENE_RULES.divisionTempo,"
      },
      {
        "file": "../model.js",
        "line": 158,
        "excerpt": "…locking+.000025*(g.cannibalism||0)+.00002*(g.acquisitionCapacity||0)+.000025*Math.max(0,g.divisionTempo-1)+(normalized.locomotionFamily===OMNIVORE_FAMILY?.00006:normalized.locomotionFamily===OP…"
      },
      {
        "file": "../model.js",
        "line": 167,
        "excerpt": "…ty+.00003*(g.fusionCapacity||0)+.00003*Math.max(0,g.biomassDensity-1)+.00003*Math.max(0,g.divisionTempo-1)+.000025*Math.max(0,g.foodEnergy-1)+.000045*g.storageInvestment+.000025*g.dormancy+.000…"
      },
      {
        "file": "../model.js",
        "line": 173,
        "excerpt": "…e','storage','processing','metabolicPace','flocking','cannibalism','acquisitionCapacity','divisionTempo'],"
      },
      {
        "file": "../model.js",
        "line": 174,
        "excerpt": "…'thermalOptimum','adhesion','flocking','crossAffinity','fusionCapacity','biomassDensity','divisionTempo','foodEnergy','storageInvestment','dormancy','coatInvestment'],"
      },
      {
        "file": "../grazer.js",
        "line": 140,
        "excerpt": "…nome)*1.4,growth=member.energy>20?Math.min(processed*Math.min(.9,.68*(member.genome.genes.divisionTempo??1)),targetMass-member.biomass,(member.energy-20)/4):0;"
      },
      {
        "file": "../population.js",
        "line": 39,
        "excerpt": "…member.genome.locomotionFamily===ALGA_FAMILY?DIVISION_AGE_MS:100000)/(member.genome.genes.divisionTempo??1);"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…anceSense','emissionCapacity','emissionPower','emissionBand'].includes(key)||['flocking','divisionTempo','lightPreference','lightTolerance','metabolicPace','cannibalism','photoGlowThreshold','f…"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…ion'].includes(key)||genome.locomotionFamily===ALGA_FAMILY&&['adhesion','biomassDensity','divisionTempo','foodEnergy','crossAffinity','storageInvestment','reserveAllocation','mobilization','dor…"
      },
      {
        "file": "../population.js",
        "line": 545,
        "excerpt": "…s<target){const desired=Math.min(target-member.biomass,GROWTH_PER_MS*(member.genome.genes.divisionTempo??1)*dt),available=Math.min(desired,(member.energy-20)/4),grown=withdrawNutrient(member.ce…"
      },
      {
        "file": "../appearance.js",
        "line": 94,
        "excerpt": "  if((genes.divisionTempo||1)>=1.7&&(genes.bodySize||1)<.77)return looks.spark;"
      }
    ],
    "dormancy": [
      {
        "file": "../model.js",
        "line": 78,
        "excerpt": "  dormancy:{min:0,max:1,default:0,unit:'cyst tendency',category:'survival',role:'Reversible cyst for…"
      },
      {
        "file": "../model.js",
        "line": 142,
        "excerpt": " if((g.dormancy||0)>=.5&&(g.storageInvestment||0)>=.5)return 0;"
      },
      {
        "file": "../model.js",
        "line": 167,
        "excerpt": "…divisionTempo-1)+.000025*Math.max(0,g.foodEnergy-1)+.000045*g.storageInvestment+.000025*g.dormancy+.000065*g.coatInvestment)*g.metabolicPace,"
      },
      {
        "file": "../model.js",
        "line": 174,
        "excerpt": "…nity','fusionCapacity','biomassDensity','divisionTempo','foodEnergy','storageInvestment','dormancy','coatInvestment'],"
      },
      {
        "file": "../population.js",
        "line": 49,
        "excerpt": "…Count=0;for(const member of p.living){const key=variantKey(member.genome),sleeping=member.dormancy?.mode&&member.dormancy.mode!=='active';variants[key]=(variants[key]||0)+1;const group=sle…"
      },
      {
        "file": "../population.js",
        "line": 49,
        "excerpt": "…r of p.living){const key=variantKey(member.genome),sleeping=member.dormancy?.mode&&member.dormancy.mode!=='active';variants[key]=(variants[key]||0)+1;const group=sleeping?dormant:active;gr…"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…mpo','foodEnergy','crossAffinity','storageInvestment','reserveAllocation','mobilization','dormancy','coatInvestment'].includes(key))&&genome.genes[key]===undefined||typeof genome.genes[key…"
      },
      {
        "file": "../population.js",
        "line": 167,
        "excerpt": "….noiseState=hash(member.id);member.motion=freshMotion(member,200);if((member.genome.genes.dormancy||0)>=.5)member.dormancy={mode:'active',since:0,poorMs:0,goodMs:0,activeMs:0};p.living.pus…"
      },
      {
        "file": "../population.js",
        "line": 167,
        "excerpt": "…id);member.motion=freshMotion(member,200);if((member.genome.genes.dormancy||0)>=.5)member.dormancy={mode:'active',since:0,poorMs:0,goodMs:0,activeMs:0};p.living.push(member);p.records.push…"
      },
      {
        "file": "../population.js",
        "line": 331,
        "excerpt": "…cy(state,member,dt){if(member.genome.locomotionFamily!==ALGA_FAMILY||(member.genome.genes.dormancy??0)<.5)return false;const d=member.dormancy??={mode:'active',since:state.elapsed,poorMs:0…"
      },
      {
        "file": "../population.js",
        "line": 331,
        "excerpt": "…ionFamily!==ALGA_FAMILY||(member.genome.genes.dormancy??0)<.5)return false;const d=member.dormancy??={mode:'active',since:state.elapsed,poorMs:0,goodMs:0,activeMs:0},now=state.elapsed,ligh…"
      },
      {
        "file": "../population.js",
        "line": 333,
        "excerpt": "…orMs=0;clearBonds(state,member.id);event(state,'adaptation',{organismId:member.id,module:'dormancy',from:'active',to:'entering',energyCost:3})}else d.blocked='Cyst entry needs 6 usable and…"
      },
      {
        "file": "../population.js",
        "line": 334,
        "excerpt": "…e='dormant';d.since=now;d.goodMs=0;event(state,'adaptation',{organismId:member.id,module:'dormancy',from:'entering',to:'dormant'})}"
      },
      {
        "file": "../population.js",
        "line": 335,
        "excerpt": "…erminating';d.since=now;d.goodMs=0;event(state,'adaptation',{organismId:member.id,module:'dormancy',from:'dormant',to:'germinating',energyCost:2,reserveCost:2})}else d.blocked='Recovery ne…"
      },
      {
        "file": "../population.js",
        "line": 336,
        "excerpt": "…led: local light or mineral fell';}event(state,'adaptation',{organismId:member.id,module:'dormancy',from,to:d.mode,reason:d.blocked||'local conditions stable'})}"
      },
      {
        "file": "../population.js",
        "line": 341,
        "excerpt": " if(parent.dormancy?.mode&&parent.dormancy.mode!=='active')return {ok:false,reason:'dormant'};"
      },
      {
        "file": "../population.js",
        "line": 341,
        "excerpt": " if(parent.dormancy?.mode&&parent.dormancy.mode!=='active')return {ok:false,reason:'dormant'};"
      },
      {
        "file": "../population.js",
        "line": 351,
        "excerpt": "…ate.elapsed);child.bio.phase=parent.bio?.phase??child.bio.phase;if((mutation.genome.genes.dormancy??0)>=.5)child.dormancy={mode:'active',since:state.elapsed,poorMs:0,goodMs:0,activeMs:0};c…"
      },
      {
        "file": "../population.js",
        "line": 351,
        "excerpt": "…phase=parent.bio?.phase??child.bio.phase;if((mutation.genome.genes.dormancy??0)>=.5)child.dormancy={mode:'active',since:state.elapsed,poorMs:0,goodMs:0,activeMs:0};const excessCoat=Math.ma…"
      },
      {
        "file": "../population.js",
        "line": 358,
        "excerpt": "…gote')member.zygote={until:state.elapsed+8000,stage:'recovering'};if((member.genome.genes.dormancy??0)>=.5)member.dormancy={mode:'active',since:state.elapsed,poorMs:0,goodMs:0,activeMs:0};…"
      },
      {
        "file": "../population.js",
        "line": 358,
        "excerpt": "…il:state.elapsed+8000,stage:'recovering'};if((member.genome.genes.dormancy??0)>=.5)member.dormancy={mode:'active',since:state.elapsed,poorMs:0,goodMs:0,activeMs:0};p.living.push(member);p.…"
      },
      {
        "file": "../population.js",
        "line": 359,
        "excerpt": "…te.elapsed-(member.propaguleLastAt||0)<30000||member.zygote?.stage==='recovering'||member.dormancy?.mode&&member.dormancy.mode!=='active')continue;const result=releasePropagule(medium,memb…"
      },
      {
        "file": "../population.js",
        "line": 359,
        "excerpt": "…aguleLastAt||0)<30000||member.zygote?.stage==='recovering'||member.dormancy?.mode&&member.dormancy.mode!=='active')continue;const result=releasePropagule(medium,member,state.elapsed,mature…"
      },
      {
        "file": "../population.js",
        "line": 411,
        "excerpt": "  const permitted=member.dormancy?.mode!=='dormant'&&!member.zygote&&!member.grazer?.handling;"
      },
      {
        "file": "../population.js",
        "line": 504,
        "excerpt": "const adhesion=m=>m.genome.locomotionFamily===ALGA_FAMILY&&(!m.dormancy||m.dormancy.mode==='active')?(m.genome.genes.adhesion||0):0;"
      },
      {
        "file": "../population.js",
        "line": 504,
        "excerpt": "const adhesion=m=>m.genome.locomotionFamily===ALGA_FAMILY&&(!m.dormancy||m.dormancy.mode==='active')?(m.genome.genes.adhesion||0):0;"
      },
      {
        "file": "../population.js",
        "line": 511,
        "excerpt": "…er=>member.id!==liftedCell(state)&&member.genome.locomotionFamily===ALGA_FAMILY&&(!member.dormancy||member.dormancy.mode==='active')&&(member.genome.genes.crossAffinity||0)>=.5&&!member.cr…"
      },
      {
        "file": "../population.js",
        "line": 511,
        "excerpt": "…iftedCell(state)&&member.genome.locomotionFamily===ALGA_FAMILY&&(!member.dormancy||member.dormancy.mode==='active')&&(member.genome.genes.crossAffinity||0)>=.5&&!member.crossPending&&!feed…"
      },
      {
        "file": "../population.js",
        "line": 540,
        "excerpt": "…(member.reserve||0),dormant=stepDormancy(state,member,dt);if(dormant)accountEnergy(state,'dormancy',{dissipated:Math.max(0,before-member.energy-(member.reserve||0))});return dormant})()){}"
      },
      {
        "file": "../population.js",
        "line": 545,
        "excerpt": " const target=matureMass(member.genome)*DIVISION_MASS_RATIO,awake=!member.dormancy||member.dormancy.mode==='active';if(awake&&member.genome.locomotionFamily===ALGA_FAMILY&&…"
      },
      {
        "file": "../population.js",
        "line": 545,
        "excerpt": "…const target=matureMass(member.genome)*DIVISION_MASS_RATIO,awake=!member.dormancy||member.dormancy.mode==='active';if(awake&&member.genome.locomotionFamily===ALGA_FAMILY&&member.energy>35&…"
      },
      {
        "file": "../population.js",
        "line": 612,
        "excerpt": "…?0)+1e-8)||m.coat!==undefined&&(!positive(m.coat)||m.coat>coatCapacity(m.genome)+1e-8)||m.dormancy&&((m.genome.genes.dormancy??0)<.5||!['active','entering','dormant','germinating'].include…"
      },
      {
        "file": "../population.js",
        "line": 612,
        "excerpt": "…ed&&(!positive(m.coat)||m.coat>coatCapacity(m.genome)+1e-8)||m.dormancy&&((m.genome.genes.dormancy??0)<.5||!['active','entering','dormant','germinating'].includes(m.dormancy.mode)||!positi…"
      },
      {
        "file": "../population.js",
        "line": 612,
        "excerpt": "…m.genome.genes.dormancy??0)<.5||!['active','entering','dormant','germinating'].includes(m.dormancy.mode)||!positive(m.dormancy.since)||m.dormancy.since>raw.elapsed||!positive(m.dormancy.po…"
      },
      {
        "file": "../population.js",
        "line": 612,
        "excerpt": "….5||!['active','entering','dormant','germinating'].includes(m.dormancy.mode)||!positive(m.dormancy.since)||m.dormancy.since>raw.elapsed||!positive(m.dormancy.poorMs)||!positive(m.dormancy.…"
      },
      {
        "file": "../population.js",
        "line": 612,
        "excerpt": "…ering','dormant','germinating'].includes(m.dormancy.mode)||!positive(m.dormancy.since)||m.dormancy.since>raw.elapsed||!positive(m.dormancy.poorMs)||!positive(m.dormancy.goodMs)||!positive(…"
      },
      {
        "file": "../population.js",
        "line": 612,
        "excerpt": "…(m.dormancy.mode)||!positive(m.dormancy.since)||m.dormancy.since>raw.elapsed||!positive(m.dormancy.poorMs)||!positive(m.dormancy.goodMs)||!positive(m.dormancy.activeMs)))throw Error('Inval…"
      },
      {
        "file": "../population.js",
        "line": 612,
        "excerpt": "….dormancy.since)||m.dormancy.since>raw.elapsed||!positive(m.dormancy.poorMs)||!positive(m.dormancy.goodMs)||!positive(m.dormancy.activeMs)))throw Error('Invalid survival state');if(m.intro…"
      },
      {
        "file": "../population.js",
        "line": 612,
        "excerpt": "…ince>raw.elapsed||!positive(m.dormancy.poorMs)||!positive(m.dormancy.goodMs)||!positive(m.dormancy.activeMs)))throw Error('Invalid survival state');if(m.introducedFrom&&(typeof m.introduce…"
      },
      {
        "file": "../signals.js",
        "line": 43,
        "excerpt": " const eligible=member.dormancy?.mode!=='dormant'&&!member.zygote&&!(member.grazer?.handling)&&photoAllowed&&member.energ…"
      },
      {
        "file": "../signals.js",
        "line": 45,
        "excerpt": " if(!eligible){b.pulseUntil=now;decision.state.reason=member.dormancy?.mode==='dormant'?'dormant':'physiology suppressed'}"
      },
      {
        "file": "../propagules.js",
        "line": 15,
        "excerpt": "…yNeed}`);if(member.zygote?.stage==='recovering')reasons.push('zygote recovery');if(member.dormancy?.mode&&member.dormancy.mode!=='active')reasons.push('dormant');if(unitCount>=PROPAGULE_CA…"
      },
      {
        "file": "../propagules.js",
        "line": 15,
        "excerpt": "…te?.stage==='recovering')reasons.push('zygote recovery');if(member.dormancy?.mode&&member.dormancy.mode!=='active')reasons.push('dormant');if(unitCount>=PROPAGULE_CAP)reasons.push(`particl…"
      },
      {
        "file": "../adaptations.js",
        "line": 7,
        "excerpt": " dormancy:Object.freeze({id:'dormancy',version:1,family:ALGA_FAMILY,genes:['dormancy','storageInves…"
      },
      {
        "file": "../adaptations.js",
        "line": 7,
        "excerpt": " dormancy:Object.freeze({id:'dormancy',version:1,family:ALGA_FAMILY,genes:['dormancy','storageInvestment'],states:['active','en…"
      },
      {
        "file": "../adaptations.js",
        "line": 7,
        "excerpt": " dormancy:Object.freeze({id:'dormancy',version:1,family:ALGA_FAMILY,genes:['dormancy','storageInvestment'],states:['active','entering','dormant','germinating'],entry:'12 s su…"
      },
      {
        "file": "../adaptations.js",
        "line": 9,
        "excerpt": "…e.genes;if(member.genome.locomotionFamily!==ALGA_FAMILY)return {reserve:{supported:false},dormancy:{supported:false}};const capacity=ADAPTATION_REGISTRY.reserve.capacity(g),d=member.dorman…"
      },
      {
        "file": "../adaptations.js",
        "line": 9,
        "excerpt": "…rmancy:{supported:false}};const capacity=ADAPTATION_REGISTRY.reserve.capacity(g),d=member.dormancy,rate=member.controller.rates||{};return {reserve:{supported:capacity>0,capacity,stored:me…"
      },
      {
        "file": "../adaptations.js",
        "line": 9,
        "excerpt": "…ve||0)>=capacity?'full':'inactive',chargeRate:rate.charge||0,releaseRate:rate.release||0},dormancy:{supported:(g.dormancy??0)>=.5,state:(g.dormancy??0)<.5?'unsupported':d?.mode||'active',p…"
      },
      {
        "file": "../adaptations.js",
        "line": 9,
        "excerpt": "…:'inactive',chargeRate:rate.charge||0,releaseRate:rate.release||0},dormancy:{supported:(g.dormancy??0)>=.5,state:(g.dormancy??0)<.5?'unsupported':d?.mode||'active',poorMs:d?.poorMs||0,good…"
      },
      {
        "file": "../adaptations.js",
        "line": 9,
        "excerpt": "…e.charge||0,releaseRate:rate.release||0},dormancy:{supported:(g.dormancy??0)>=.5,state:(g.dormancy??0)<.5?'unsupported':d?.mode||'active',poorMs:d?.poorMs||0,goodMs:d?.goodMs||0,blocked:d?…"
      },
      {
        "file": "../appearance.js",
        "line": 85,
        "excerpt": "  if((genes.dormancy||0)>=.5&&(genes.storageInvestment||0)>=.5)return looks.sleepseed;"
      }
    ],
    "emissionBand": [
      {
        "file": "../model.js",
        "line": 60,
        "excerpt": "  emissionBand:{min:0,max:1,default:0,unit:'spectrum turn',category:'emission',role:'Emitted color band'…"
      },
      {
        "file": "../model.js",
        "line": 137,
        "excerpt": " if((g.fusionCapacity||0)>=.8&&(g.emissionCapacity||0)>=.8&&((g.bodySize>=1.45&&(g.emissionBand||0)<.2)||(g.bodySize>=1.2&&(g.emissionBand||0)>.25&&(g.emissionBand||0)<.4)))return 0;"
      },
      {
        "file": "../model.js",
        "line": 137,
        "excerpt": "…issionCapacity||0)>=.8&&((g.bodySize>=1.45&&(g.emissionBand||0)<.2)||(g.bodySize>=1.2&&(g.emissionBand||0)>.25&&(g.emissionBand||0)<.4)))return 0;"
      },
      {
        "file": "../model.js",
        "line": 137,
        "excerpt": "…(g.bodySize>=1.45&&(g.emissionBand||0)<.2)||(g.bodySize>=1.2&&(g.emissionBand||0)>.25&&(g.emissionBand||0)<.4)))return 0;"
      },
      {
        "file": "../model.js",
        "line": 138,
        "excerpt": " if((g.adhesion||0)>.8&&(g.emissionCapacity||0)>.9&&(g.emissionBand||0)<.08)return 0;"
      },
      {
        "file": "../model.js",
        "line": 139,
        "excerpt": " if((g.emissionCapacity||0)>.9&&(g.emissionBand||0)>.45&&(g.emissionBand||0)<.65)return 0;"
      },
      {
        "file": "../model.js",
        "line": 139,
        "excerpt": " if((g.emissionCapacity||0)>.9&&(g.emissionBand||0)>.45&&(g.emissionBand||0)<.65)return 0;"
      },
      {
        "file": "../model.js",
        "line": 140,
        "excerpt": " if((g.emissionCapacity||0)>.8&&(g.emissionBand||0)<.2)return 0;"
      },
      {
        "file": "../model.js",
        "line": 141,
        "excerpt": " if((g.emissionCapacity||0)>.7&&(g.emissionBand||0)>.75)return 0;"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…r','spectralWidth','chemicalSense','disturbanceSense','emissionCapacity','emissionPower','emissionBand'].includes(key)||['flocking','divisionTempo','lightPreference','lightTolerance','metaboli…"
      },
      {
        "file": "../signals.js",
        "line": 12,
        "excerpt": "export function pulseInterval(member){const g=member.genome.genes,band=g.emissionBand??0,size=g.bodySize??1;return Math.round((4400+band*7700+size*850)*(.9+idFraction(member.i…"
      },
      {
        "file": "../signals.js",
        "line": 14,
        "excerpt": "…ber.genome,g=genome.genes,family=genome.locomotionFamily,program=g.lightProgram??0,band=g.emissionBand??0,prior=signalTraits.get(genome);if(prior&&prior.family===family&&prior.program===progra…"
      },
      {
        "file": "../signals.js",
        "line": 17,
        "excerpt": "…onFamily===GRAZER_FAMILY&&(member.genome.genes.lightProgram??0)===3&&(member.genome.genes.emissionBand??0)>.7}"
      },
      {
        "file": "../signals.js",
        "line": 26,
        "excerpt": "…width=rg.spectralWidth??1,spectral=Math.exp(-.5*(circularDistance(rg.spectralCenter??0,sg.emissionBand??0)/(.06+.26*bandwidth))**2);return clamp(power*investment*spectral/(1+(d/.045)**2)*Math.…"
      },
      {
        "file": "../signals.js",
        "line": 28,
        "excerpt": "…Math.atan2(other.cell.y-member.cell.y,other.cell.x-member.cell.x),band:other.genome.genes.emissionBand??0,pulseUntil:other.bio?.pulseUntil||0}}if(disturbanceSense>0){const speed=Math.hypot(oth…"
      },
      {
        "file": "../appearance.js",
        "line": 76,
        "excerpt": "   if(genes.bodySize>=1.45&&(genes.emissionBand||0)<.2)return looks.saillantern;"
      },
      {
        "file": "../appearance.js",
        "line": 77,
        "excerpt": "   if(genes.bodySize<=.71&&(genes.emissionBand||0)>.4&&(genes.emissionBand||0)<.6)return looks.pinlight;"
      },
      {
        "file": "../appearance.js",
        "line": 77,
        "excerpt": "   if(genes.bodySize<=.71&&(genes.emissionBand||0)>.4&&(genes.emissionBand||0)<.6)return looks.pinlight;"
      },
      {
        "file": "../appearance.js",
        "line": 78,
        "excerpt": "   if(genes.bodySize>=1.2&&(genes.emissionBand||0)>.25&&(genes.emissionBand||0)<.4)return looks.mintbell;"
      },
      {
        "file": "../appearance.js",
        "line": 78,
        "excerpt": "   if(genes.bodySize>=1.2&&(genes.emissionBand||0)>.25&&(genes.emissionBand||0)<.4)return looks.mintbell;"
      },
      {
        "file": "../appearance.js",
        "line": 79,
        "excerpt": "   if(genes.bodySize<=.76&&(genes.emissionBand||0)>.85)return looks.needlestar;"
      },
      {
        "file": "../appearance.js",
        "line": 81,
        "excerpt": "  if((genes.adhesion||0)>.8&&(genes.emissionCapacity||0)>.9&&(genes.emissionBand||0)<.08)return looks.polar_chain;"
      },
      {
        "file": "../appearance.js",
        "line": 82,
        "excerpt": "  if((genes.emissionCapacity||0)>.9&&(genes.emissionBand||0)>.45&&(genes.emissionBand||0)<.65)return looks.moonlantern;"
      },
      {
        "file": "../appearance.js",
        "line": 82,
        "excerpt": "  if((genes.emissionCapacity||0)>.9&&(genes.emissionBand||0)>.45&&(genes.emissionBand||0)<.65)return looks.moonlantern;"
      },
      {
        "file": "../appearance.js",
        "line": 83,
        "excerpt": "  if((genes.emissionCapacity||0)>.8&&(genes.emissionBand||0)<.2)return looks.emberreed;"
      },
      {
        "file": "../appearance.js",
        "line": 84,
        "excerpt": "  if((genes.emissionCapacity||0)>.7&&(genes.emissionBand||0)>.75)return looks.ghostpearl;"
      }
    ],
    "emissionCapacity": [
      {
        "file": "../model.js",
        "line": 58,
        "excerpt": "  emissionCapacity:{min:0,max:1,default:0,unit:'light organ',category:'emission',role:'Pulse capacity',effec…"
      },
      {
        "file": "../model.js",
        "line": 127,
        "excerpt": "…'storageInvestment','ambientSense','directionalSense','chemicalSense','disturbanceSense','emissionCapacity','toxinSynthesis','irritantResistance','motorResistance','sensoryResistance','detoxificat…"
      },
      {
        "file": "../model.js",
        "line": 137,
        "excerpt": " if((g.fusionCapacity||0)>=.8&&(g.emissionCapacity||0)>=.8&&((g.bodySize>=1.45&&(g.emissionBand||0)<.2)||(g.bodySize>=1.2&&(g.emissionBand||…"
      },
      {
        "file": "../model.js",
        "line": 138,
        "excerpt": " if((g.adhesion||0)>.8&&(g.emissionCapacity||0)>.9&&(g.emissionBand||0)<.08)return 0;"
      },
      {
        "file": "../model.js",
        "line": 139,
        "excerpt": " if((g.emissionCapacity||0)>.9&&(g.emissionBand||0)>.45&&(g.emissionBand||0)<.65)return 0;"
      },
      {
        "file": "../model.js",
        "line": 140,
        "excerpt": " if((g.emissionCapacity||0)>.8&&(g.emissionBand||0)<.2)return 0;"
      },
      {
        "file": "../model.js",
        "line": 141,
        "excerpt": " if((g.emissionCapacity||0)>.7&&(g.emissionBand||0)>.75)return 0;"
      },
      {
        "file": "../regulation.js",
        "line": 18,
        "excerpt": "…genome.genes||{},family=genome.locomotionFamily,alga=family==='flagellar-alga',capacity=g.emissionCapacity||0;"
      },
      {
        "file": "../regulation.js",
        "line": 30,
        "excerpt": " const g=member.genome.genes,program=g[`${key}Program`]??0,capacity=key==='light'?(g.emissionCapacity||0)*(g.emissionPower||0):g[`${key}Production`]||0;"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…','directionalSense','spectralCenter','spectralWidth','chemicalSense','disturbanceSense','emissionCapacity','emissionPower','emissionBand'].includes(key)||['flocking','divisionTempo','lightPrefere…"
      },
      {
        "file": "../signals.js",
        "line": 49,
        "excerpt": "….ambientSense??0)+(g.directionalSense??0)+(g.chemicalSense??0)+(g.disturbanceSense??0)+(g.emissionCapacity??0)+apparatus*.35)+regulatorCost);"
      },
      {
        "file": "../appearance.js",
        "line": 75,
        "excerpt": "  if((genes.fusionCapacity||0)>=.8&&(genes.emissionCapacity||0)>=.8){"
      },
      {
        "file": "../appearance.js",
        "line": 81,
        "excerpt": "  if((genes.adhesion||0)>.8&&(genes.emissionCapacity||0)>.9&&(genes.emissionBand||0)<.08)return looks.polar_chain;"
      },
      {
        "file": "../appearance.js",
        "line": 82,
        "excerpt": "  if((genes.emissionCapacity||0)>.9&&(genes.emissionBand||0)>.45&&(genes.emissionBand||0)<.65)return looks.moonlantern…"
      },
      {
        "file": "../appearance.js",
        "line": 83,
        "excerpt": "  if((genes.emissionCapacity||0)>.8&&(genes.emissionBand||0)<.2)return looks.emberreed;"
      },
      {
        "file": "../appearance.js",
        "line": 84,
        "excerpt": "  if((genes.emissionCapacity||0)>.7&&(genes.emissionBand||0)>.75)return looks.ghostpearl;"
      },
      {
        "file": "../appearance.js",
        "line": 108,
        "excerpt": " if(family===CARNIVORE_FAMILY)return (genes.emissionCapacity||0)>.85&&(genes.rhythmStrength||0)>.85?looks.lurejaw:(genes.bodySize||1)>=1.3?looks.broad…"
      },
      {
        "file": "../appearance.js",
        "line": 110,
        "excerpt": "  if((genes.emissionCapacity||0)>.9&&(genes.disturbanceSense||0)>.8)return looks.murkflash;"
      },
      {
        "file": "../appearance.js",
        "line": 111,
        "excerpt": "  if((genes.emissionCapacity||0)>.7&&(genes.flocking||0)>.8)return looks.murmurfin;"
      },
      {
        "file": "../appearance.js",
        "line": 119,
        "excerpt": "  if((genes.emissionCapacity||0)>.7&&(genes.flocking||0)>.8)return looks.glimmershoal;"
      },
      {
        "file": "../appearance.js",
        "line": 126,
        "excerpt": "  if((genes.rhythmStrength||0)>.8&&(genes.emissionCapacity||0)>.6)return looks.lanternsifter;"
      }
    ],
    "emissionPower": [
      {
        "file": "../model.js",
        "line": 59,
        "excerpt": "  emissionPower:{min:0,max:1,default:0,unit:'pulse effort',category:'emission',role:'Pulse brightness',ef…"
      },
      {
        "file": "../regulation.js",
        "line": 30,
        "excerpt": "…ome.genes,program=g[`${key}Program`]??0,capacity=key==='light'?(g.emissionCapacity||0)*(g.emissionPower||0):g[`${key}Production`]||0;"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…','spectralCenter','spectralWidth','chemicalSense','disturbanceSense','emissionCapacity','emissionPower','emissionBand'].includes(key)||['flocking','divisionTempo','lightPreference','lightToler…"
      }
    ],
    "entrainment": [
      {
        "file": "../model.js",
        "line": 41,
        "excerpt": "  entrainment:{min:0,max:1,default:0,unit:'local lamp response',category:'activity',role:'Clock adjustm…"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…UND_GENE_RULES||genome.version===1&&['rhythmPhase','rhythmStrength','twilightPreference','entrainment','ambientSense','lightPreference','lightTolerance','directionalSense','spectralCenter','s…"
      },
      {
        "file": "../signals.js",
        "line": 34,
        "excerpt": " const sensed=(g.ambientSense??0)*(g.entrainment??0),change=previousLamp===null?0:b.localLamp-previousLamp;"
      }
    ],
    "feedingAperture": [
      {
        "file": "../model.js",
        "line": 100,
        "excerpt": " feedingAperture:{min:.7,max:1.6,default:1.3,unit:'relative mouth',category:'feeding',role:'Prey size limi…"
      },
      {
        "file": "../model.js",
        "line": 158,
        "excerpt": "…*g.turnPersistence,optimum:g.thermalOptimum,sensingRadius:.17*g.sensingRange,mouthRatio:g.feedingAperture,vacuoleCapacity:normalized.locomotionFamily===OMNIVORE_FAMILY?Math.min(6,2.2*g.storage*g.…"
      },
      {
        "file": "../model.js",
        "line": 158,
        "excerpt": "….metabolicPace,maintenance:(.00014+.000052*g.bodySize**2+.000025*g.sensingRange+.000025*g.feedingAperture+.000018*g.storage+.000025*g.flocking+.000025*(g.cannibalism||0)+.00002*(g.acquisitionCapa…"
      },
      {
        "file": "../model.js",
        "line": 173,
        "excerpt": " consumer:['bodySize','propulsion','turnPersistence','thermalOptimum','sensingRange','feedingAperture','storage','processing','metabolicPace','flocking','cannibalism','acquisitionCapacity','d…"
      },
      {
        "file": "../population.js",
        "line": 115,
        "excerpt": " for(let i=0;i<config.flagellates;i++)add(FLAGELLATE_FAMILY,.70,.57,.5,{propulsion:.75,feedingAperture:1.5},45);"
      }
    ],
    "flocking": [
      {
        "file": "../model.js",
        "line": 83,
        "excerpt": "  flocking:{min:0,max:1,default:0,unit:'neighbor response',category:'locomotion / depth',role:'3D sc…"
      },
      {
        "file": "../model.js",
        "line": 98,
        "excerpt": " flocking:GENE_RULES.flocking,"
      },
      {
        "file": "../model.js",
        "line": 98,
        "excerpt": " flocking:GENE_RULES.flocking,"
      },
      {
        "file": "../model.js",
        "line": 158,
        "excerpt": "….bodySize**2+.000025*g.sensingRange+.000025*g.feedingAperture+.000018*g.storage+.000025*g.flocking+.000025*(g.cannibalism||0)+.00002*(g.acquisitionCapacity||0)+.000025*Math.max(0,g.divisio…"
      },
      {
        "file": "../model.js",
        "line": 167,
        "excerpt": "…2+.000045*g.photosyntheticInvestment+.000035*g.nutrientUptake+.00004*g.adhesion+.000025*g.flocking+.00002*g.crossAffinity+.00003*(g.fusionCapacity||0)+.00003*Math.max(0,g.biomassDensity-1)…"
      },
      {
        "file": "../model.js",
        "line": 173,
        "excerpt": "…'thermalOptimum','sensingRange','feedingAperture','storage','processing','metabolicPace','flocking','cannibalism','acquisitionCapacity','divisionTempo'],"
      },
      {
        "file": "../model.js",
        "line": 174,
        "excerpt": "…,'photosyntheticInvestment','metabolicPace','nutrientUptake','thermalOptimum','adhesion','flocking','crossAffinity','fusionCapacity','biomassDensity','divisionTempo','foodEnergy','storageI…"
      },
      {
        "file": "../model.js",
        "line": 272,
        "excerpt": "…n(state.elapsed*Math.PI*2/90000)*.32,-.5,.5),flock=state.flock,weight=flock?.neighbors?(g.flocking||0):0;"
      },
      {
        "file": "../grazer.js",
        "line": 126,
        "excerpt": "  const weight=(member.genome.genes.flocking||0)*(target?.12:1),x=(1-weight)*Math.cos(heading)*Math.cos(pitch)+weight*flock.x,y=(1-wei…"
      },
      {
        "file": "../population.js",
        "line": 3,
        "excerpt": "import {flockSignals} from './flocking.js?v=19';"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…e','disturbanceSense','emissionCapacity','emissionPower','emissionBand'].includes(key)||['flocking','divisionTempo','lightPreference','lightTolerance','metabolicPace','cannibalism','photoG…"
      },
      {
        "file": "../population.js",
        "line": 534,
        "excerpt": "…member.cell.z}])),alive=new Set(existing),offset=existing.length?p.turn%existing.length:0,flocking=flockSignals(existing,state.environment.volume);checkpoint('flocking');const senseGrid=ma…"
      },
      {
        "file": "../population.js",
        "line": 534,
        "excerpt": "…rn%existing.length:0,flocking=flockSignals(existing,state.environment.volume);checkpoint('flocking');const senseGrid=makeSpatialGrid(existing,m=>currentRadius(m,state.environment.volume),v…"
      },
      {
        "file": "../population.js",
        "line": 538,
        "excerpt": "…Y,OPENWATER_FAMILY,OMNIVORE_FAMILY].includes(member.genome.locomotionFamily)){const flock=flocking.get(member.id);member.controller.flockNeighbors=flock?.neighbors||0;const fuelBefore=memb…"
      },
      {
        "file": "../population.js",
        "line": 541,
        "excerpt": " else {const flock=flocking.get(member.id),sparkle=usesDebrisMetabolism(member.genome);member.controller.flockNeighbo…"
      },
      {
        "file": "../compounds.js",
        "line": 23,
        "excerpt": "  socialProduction:sense*Math.max(g.flocking??0,g.crossAffinity??0),socialReception:sense*Math.max(g.flocking??0,g.crossAffinity??0),s…"
      },
      {
        "file": "../compounds.js",
        "line": 23,
        "excerpt": "…duction:sense*Math.max(g.flocking??0,g.crossAffinity??0),socialReception:sense*Math.max(g.flocking??0,g.crossAffinity??0),socialResponse:.45"
      },
      {
        "file": "../flocking.js",
        "line": 13,
        "excerpt": "  if(members.length<2||!members.some(member=>(member.genome.genes.flocking||0)>0))continue;"
      },
      {
        "file": "../flocking.js",
        "line": 14,
        "excerpt": "…ll.y*scale,z=cell.z*DEPTH_ASPECT*scale,pitch=member.motion?.pitch||0;return {id:member.id,flocking:member.genome.genes.flocking||0,x,y,z,heading:cell.heading,pitch,bx:Math.floor(x/range),b…"
      },
      {
        "file": "../flocking.js",
        "line": 14,
        "excerpt": "…ECT*scale,pitch=member.motion?.pitch||0;return {id:member.id,flocking:member.genome.genes.flocking||0,x,y,z,heading:cell.heading,pitch,bx:Math.floor(x/range),by:Math.floor(y/range),bz:Math…"
      },
      {
        "file": "../flocking.js",
        "line": 16,
        "excerpt": "  for(const own of snapshots){if(own.flocking<=0)continue;let ax=0,ay=0,az=0,cx=0,cy=0,cz=0,sx=0,sy=0,sz=0,count=0;"
      },
      {
        "file": "../appearance.js",
        "line": 88,
        "excerpt": "  if(genes.adhesion>=.8&&genes.flocking>=.85)return looks.volvox;"
      },
      {
        "file": "../appearance.js",
        "line": 93,
        "excerpt": "  if((genes.flocking||0)>=.35)return looks.schooling_alga;"
      },
      {
        "file": "../appearance.js",
        "line": 111,
        "excerpt": "  if((genes.emissionCapacity||0)>.7&&(genes.flocking||0)>.8)return looks.murmurfin;"
      },
      {
        "file": "../appearance.js",
        "line": 114,
        "excerpt": "  if((genes.flocking||0)>=.35)return looks.schooling_ciliate;"
      },
      {
        "file": "../appearance.js",
        "line": 119,
        "excerpt": "  if((genes.emissionCapacity||0)>.7&&(genes.flocking||0)>.8)return looks.glimmershoal;"
      },
      {
        "file": "../appearance.js",
        "line": 121,
        "excerpt": "  if((genes.flocking||0)>=.35)return looks.schooling_flagellate;"
      }
    ],
    "foodEnergy": [
      {
        "file": "../model.js",
        "line": 67,
        "excerpt": "  foodEnergy:{min:.5,max:1.6,default:1,unit:'relative recovery',category:'feeding',role:'Recoverable p…"
      },
      {
        "file": "../model.js",
        "line": 167,
        "excerpt": "…*Math.max(0,g.biomassDensity-1)+.00003*Math.max(0,g.divisionTempo-1)+.000025*Math.max(0,g.foodEnergy-1)+.000045*g.storageInvestment+.000025*g.dormancy+.000065*g.coatInvestment)*g.metabolicPa…"
      },
      {
        "file": "../model.js",
        "line": 174,
        "excerpt": "…,'adhesion','flocking','crossAffinity','fusionCapacity','biomassDensity','divisionTempo','foodEnergy','storageInvestment','dormancy','coatInvestment'],"
      },
      {
        "file": "../grazer.js",
        "line": 22,
        "excerpt": "// foodEnergy is the prey's recoverable fraction, never a multiplier above its"
      },
      {
        "file": "../grazer.js",
        "line": 24,
        "excerpt": "…yFraction=prey=>prey.genome.locomotionFamily===ALGA_FAMILY?clamp(.2+.5*(prey.genome.genes.foodEnergy??1),0,1):.78;"
      },
      {
        "file": "../grazer.js",
        "line": 45,
        "excerpt": " const quality=alga?(prey.genome.genes.foodEnergy??1)*Math.sqrt(prey.biomass/structuralMass(prey.genome)):Math.sqrt(prey.biomass/structural…"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…ey)||genome.locomotionFamily===ALGA_FAMILY&&['adhesion','biomassDensity','divisionTempo','foodEnergy','crossAffinity','storageInvestment','reserveAllocation','mobilization','dormancy','coatI…"
      },
      {
        "file": "../appearance.js",
        "line": 95,
        "excerpt": "  if((genes.foodEnergy||1)>=1.4)return looks.sugar;"
      }
    ],
    "fusionCapacity": [
      {
        "file": "../model.js",
        "line": 70,
        "excerpt": "  fusionCapacity:{min:0,max:1,default:0,unit:'gamete investment',category:'reproduction',role:'Compatible …"
      },
      {
        "file": "../model.js",
        "line": 137,
        "excerpt": " if((g.fusionCapacity||0)>=.8&&(g.emissionCapacity||0)>=.8&&((g.bodySize>=1.45&&(g.emissionBand||0)<.2)||(g.bod…"
      },
      {
        "file": "../model.js",
        "line": 167,
        "excerpt": "…35*g.nutrientUptake+.00004*g.adhesion+.000025*g.flocking+.00002*g.crossAffinity+.00003*(g.fusionCapacity||0)+.00003*Math.max(0,g.biomassDensity-1)+.00003*Math.max(0,g.divisionTempo-1)+.000025*Ma…"
      },
      {
        "file": "../model.js",
        "line": 174,
        "excerpt": "…,'metabolicPace','nutrientUptake','thermalOptimum','adhesion','flocking','crossAffinity','fusionCapacity','biomassDensity','divisionTempo','foodEnergy','storageInvestment','dormancy','coatInvest…"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…o','lightPreference','lightTolerance','metabolicPace','cannibalism','photoGlowThreshold','fusionCapacity','matingType','acquisitionCapacity','sporeInvestment','slowdownThreshold','debrisMetaboli…"
      },
      {
        "file": "../propagules.js",
        "line": 11,
        "excerpt": "…d(member){const g=member.genome.genes;if(member.genome.locomotionFamily===ALGA_FAMILY&&(g.fusionCapacity??0)>=.7&&(g.crossAffinity??0)>=.5)return 'gamete';if(member.genome.locomotionFamily===CRA…"
      },
      {
        "file": "../appearance.js",
        "line": 75,
        "excerpt": "  if((genes.fusionCapacity||0)>=.8&&(genes.emissionCapacity||0)>=.8){"
      }
    ],
    "irritantResistance": [
      {
        "file": "../model.js",
        "line": 53,
        "excerpt": "  irritantResistance:{min:0,max:1,default:0,unit:'specific resistance',category:'chemical defense',role:'Irrit…"
      },
      {
        "file": "../model.js",
        "line": 127,
        "excerpt": "…directionalSense','chemicalSense','disturbanceSense','emissionCapacity','toxinSynthesis','irritantResistance','motorResistance','sensoryResistance','detoxification','organicProduction','organicRecep…"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…'sporeInvestment','slowdownThreshold','debrisMetabolism','toxinSynthesis','toxinRelease','irritantResistance','motorResistance','sensoryResistance','detoxification'].includes(key)||genome.locomotion…"
      },
      {
        "file": "../toxicology.js",
        "line": 20,
        "excerpt": "  const upkeep=dt*.000006*((g.toxinSynthesis||0)+(g.irritantResistance||0)+(g.motorResistance||0)+(g.sensoryResistance||0)+(g.detoxification||0)),paid=Math.min(…"
      },
      {
        "file": "../toxicology.js",
        "line": 24,
        "excerpt": " cost+=dt*.000006*((g.toxinSynthesis||0)+(g.irritantResistance||0)+(g.motorResistance||0)+(g.sensoryResistance||0)+(g.detoxification||0));const paid=Mat…"
      }
    ],
    "lightPreference": [
      {
        "file": "../model.js",
        "line": 2,
        "excerpt": "import {lightPreference} from './light-preference.js?v=9';"
      },
      {
        "file": "../model.js",
        "line": 43,
        "excerpt": "  lightPreference:{min:0,max:1,default:.5,unit:'0–100 irradiance target',category:'sensing',role:'Preferred…"
      },
      {
        "file": "../model.js",
        "line": 245,
        "excerpt": " const c=state.cell,e=state.environment,ctl=state.controller,prefs=lightPreference(state.organism.genome),probes=sensorProbes(c,p.radius/volumeScale(e.volume),e.volume),sco…"
      },
      {
        "file": "../grazer.js",
        "line": 2,
        "excerpt": "import {lightPreference,localLightGradient} from './light-preference.js?v=9';"
      },
      {
        "file": "../grazer.js",
        "line": 111,
        "excerpt": " let lampCue=null;if(!threat&&!target&&now>=g.cueCooldownUntil&&cueBearing===null&&lightPreference(member.genome).investment>0){const cached=lightCueCache.get(member);if(!cached||now>=cach…"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…n===1&&['rhythmPhase','rhythmStrength','twilightPreference','entrainment','ambientSense','lightPreference','lightTolerance','directionalSense','spectralCenter','spectralWidth','chemicalSense','di…"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…sionCapacity','emissionPower','emissionBand'].includes(key)||['flocking','divisionTempo','lightPreference','lightTolerance','metabolicPace','cannibalism','photoGlowThreshold','fusionCapacity','ma…"
      },
      {
        "file": "../population.js",
        "line": 150,
        "excerpt": "…ce=sources[group],genes={...source.genome.genes};if(group===3){genes.ambientSense=0;genes.lightPreference=.5;genes.lightTolerance=1}const member=add(ALGA_FAMILY,.34+group*.11,.43+i*.045,.31+i*.03…"
      },
      {
        "file": "../light-preference.js",
        "line": 4,
        "excerpt": "export const lightPreference=genome=>({preferred:100*clamp(genome?.genes?.lightPreference??.5,0,1),halfWidth:8+42*clam…"
      },
      {
        "file": "../light-preference.js",
        "line": 4,
        "excerpt": "export const lightPreference=genome=>({preferred:100*clamp(genome?.genes?.lightPreference??.5,0,1),halfWidth:8+42*clamp(genome?.genes?.lightTolerance??1,0,1),investment:genome?.ge…"
      },
      {
        "file": "../light-preference.js",
        "line": 4,
        "excerpt": "…0,1),halfWidth:8+42*clamp(genome?.genes?.lightTolerance??1,0,1),investment:genome?.genes?.lightPreference===undefined||(genome?.genes?.lightTolerance??1)>=1?0:clamp(genome?.genes?.ambientSense??0…"
      },
      {
        "file": "../light-preference.js",
        "line": 5,
        "excerpt": "export function lightSuitability(light,genome){const {preferred,halfWidth}=lightPreference(genome);return Math.exp(-.5*((light-preferred)/halfWidth)**2)}"
      },
      {
        "file": "../light-preference.js",
        "line": 9,
        "excerpt": " const investment=lightPreference(genome).investment;if(investment<=0)return null;"
      }
    ],
    "lightProgram": [
      {
        "file": "../regulation.js",
        "line": 5,
        "excerpt": " lightProgram:programRule('Biological light trigger'),"
      },
      {
        "file": "../regulation.js",
        "line": 19,
        "excerpt": " return {lightProgram:capacity<=0?0:alga&&capacity>.9?7:(g.directionalSense||0)>.6&&(g.disturbanceSense||0)>.65…"
      },
      {
        "file": "../signals.js",
        "line": 14,
        "excerpt": "…ember){const genome=member.genome,g=genome.genes,family=genome.locomotionFamily,program=g.lightProgram??0,band=g.emissionBand??0,prior=signalTraits.get(genome);if(prior&&prior.family===family&…"
      },
      {
        "file": "../signals.js",
        "line": 17,
        "excerpt": "…Flash(member){return member.genome.locomotionFamily===GRAZER_FAMILY&&(member.genome.genes.lightProgram??0)===3&&(member.genome.genes.emissionBand??0)>.7}"
      },
      {
        "file": "../signals.js",
        "line": 38,
        "excerpt": " if([5,8].includes(g.lightProgram??0)&&best?.value>.035&&b.reactionAt===0)b.reactionAt=now+600;"
      },
      {
        "file": "../signals.js",
        "line": 40,
        "excerpt": "…ll.y,(other.cell.z-member.cell.z)*DEPTH_ASPECT)*scale<.11)?1:0),receptor:[5,8].includes(g.lightProgram??0)?b.reactionAt>0&&now>=b.reactionAt?Math.max(receptor,(best?.value||0)/.035):0:receptor…"
      },
      {
        "file": "../signals.js",
        "line": 44,
        "excerpt": "…StartAt=now;b.pulseUntil=decision.state.until;b.cooldownUntil=decision.state.nextAt;if((g.lightProgram??0)!==7)b.pulseCount++;b.reactionAt=0}"
      },
      {
        "file": "../signals.js",
        "line": 46,
        "excerpt": " const envelope=(g.lightProgram??0)===7?1:pulseEnvelope(member,b,Math.min(b.pulseUntil-1,now+dt*.5));"
      },
      {
        "file": "../signals.js",
        "line": 49,
        "excerpt": " const regulatorCost=.000004*[\"lightProgram\",\"organicProgram\",\"alarmProgram\",\"socialProgram\"].reduce((sum,key)=>sum+(g[key]>0?1:0),0)…"
      }
    ],
    "lightTolerance": [
      {
        "file": "../model.js",
        "line": 44,
        "excerpt": "  lightTolerance:{min:0,max:1,default:1,unit:'response width',category:'sensing',role:'Lamp habitat tolera…"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…se','rhythmStrength','twilightPreference','entrainment','ambientSense','lightPreference','lightTolerance','directionalSense','spectralCenter','spectralWidth','chemicalSense','disturbanceSense','…"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…ssionPower','emissionBand'].includes(key)||['flocking','divisionTempo','lightPreference','lightTolerance','metabolicPace','cannibalism','photoGlowThreshold','fusionCapacity','matingType','acquis…"
      },
      {
        "file": "../population.js",
        "line": 150,
        "excerpt": "…...source.genome.genes};if(group===3){genes.ambientSense=0;genes.lightPreference=.5;genes.lightTolerance=1}const member=add(ALGA_FAMILY,.34+group*.11,.43+i*.045,.31+i*.03,genes,65);member.biomas…"
      },
      {
        "file": "../light-preference.js",
        "line": 4,
        "excerpt": "…red:100*clamp(genome?.genes?.lightPreference??.5,0,1),halfWidth:8+42*clamp(genome?.genes?.lightTolerance??1,0,1),investment:genome?.genes?.lightPreference===undefined||(genome?.genes?.lightToler…"
      },
      {
        "file": "../light-preference.js",
        "line": 4,
        "excerpt": "…tTolerance??1,0,1),investment:genome?.genes?.lightPreference===undefined||(genome?.genes?.lightTolerance??1)>=1?0:clamp(genome?.genes?.ambientSense??0,0,1)});"
      }
    ],
    "matingType": [
      {
        "file": "../model.js",
        "line": 71,
        "excerpt": "  matingType:{min:0,max:1,default:0,unit:'compatibility type',category:'reproduction',role:'Fusion com…"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…ce','lightTolerance','metabolicPace','cannibalism','photoGlowThreshold','fusionCapacity','matingType','acquisitionCapacity','sporeInvestment','slowdownThreshold','debrisMetabolism','toxinSyn…"
      },
      {
        "file": "../propagules.js",
        "line": 18,
        "excerpt": "…e),sourceId:member.id,sourceLineageId:member.lineageId,sourceGeneration:member.generation,matingType:(member.genome.genes.matingType??0)>=.5?1:0,bornAt:now,expiresAt:now+(kind==='gamete'?450…"
      },
      {
        "file": "../propagules.js",
        "line": 18,
        "excerpt": "…ageId:member.lineageId,sourceGeneration:member.generation,matingType:(member.genome.genes.matingType??0)>=.5?1:0,bornAt:now,expiresAt:now+(kind==='gamete'?45000:90000)};medium.units.push(uni…"
      },
      {
        "file": "../propagules.js",
        "line": 19,
        "excerpt": "…ction compatibleGametes(a,b,volume){return a!==b&&a.kind==='gamete'&&b.kind==='gamete'&&a.matingType!==b.matingType&&a.sourceId!==b.sourceId&&a.genome.locomotionFamily===ALGA_FAMILY&&b.genom…"
      },
      {
        "file": "../propagules.js",
        "line": 19,
        "excerpt": "…eGametes(a,b,volume){return a!==b&&a.kind==='gamete'&&b.kind==='gamete'&&a.matingType!==b.matingType&&a.sourceId!==b.sourceId&&a.genome.locomotionFamily===ALGA_FAMILY&&b.genome.locomotionFam…"
      },
      {
        "file": "../propagules.js",
        "line": 21,
        "excerpt": "…rceGeneration)&&unit.sourceGeneration>=0&&unit.sourceGeneration<=1e6&&[0,1].includes(unit.matingType)&&finite(unit.bornAt)&&unit.bornAt>=0&&unit.bornAt<=now&&finite(unit.expiresAt)&&unit.exp…"
      }
    ],
    "metabolicPace": [
      {
        "file": "../model.js",
        "line": 64,
        "excerpt": "  metabolicPace:{min:.8,max:1.2,default:1,unit:'relative pace',category:'metabolism',role:'Inherited meta…"
      },
      {
        "file": "../model.js",
        "line": 93,
        "excerpt": " metabolicPace:GENE_RULES.metabolicPace,"
      },
      {
        "file": "../model.js",
        "line": 93,
        "excerpt": " metabolicPace:GENE_RULES.metabolicPace,"
      },
      {
        "file": "../model.js",
        "line": 109,
        "excerpt": "export const PROTOTYPE_GENE_RULES=Object.freeze({bodySize:GENE_RULES.bodySize,metabolicPace:GENE_RULES.metabolicPace,propulsion:GENE_RULES.propulsion,slowdownThreshold:GENE_RULES.sl…"
      },
      {
        "file": "../model.js",
        "line": 109,
        "excerpt": "…PROTOTYPE_GENE_RULES=Object.freeze({bodySize:GENE_RULES.bodySize,metabolicPace:GENE_RULES.metabolicPace,propulsion:GENE_RULES.propulsion,slowdownThreshold:GENE_RULES.slowdownThreshold,turnPersi…"
      },
      {
        "file": "../model.js",
        "line": 110,
        "excerpt": "export const DRIFTER_GENE_RULES=Object.freeze({bodySize:GENE_RULES.bodySize,metabolicPace:GENE_RULES.metabolicPace,buoyancy:{min:-1,max:1,default:0,unit:'vertical bias',category:'…"
      },
      {
        "file": "../model.js",
        "line": 110,
        "excerpt": "…t DRIFTER_GENE_RULES=Object.freeze({bodySize:GENE_RULES.bodySize,metabolicPace:GENE_RULES.metabolicPace,buoyancy:{min:-1,max:1,default:0,unit:'vertical bias',category:'locomotion',role:'Passive…"
      },
      {
        "file": "../model.js",
        "line": 111,
        "excerpt": "export const ATTACHED_GENE_RULES=Object.freeze({bodySize:GENE_RULES.bodySize,metabolicPace:GENE_RULES.metabolicPace,slowdownThreshold:GENE_RULES.slowdownThreshold,contractility:{mi…"
      },
      {
        "file": "../model.js",
        "line": 111,
        "excerpt": "… ATTACHED_GENE_RULES=Object.freeze({bodySize:GENE_RULES.bodySize,metabolicPace:GENE_RULES.metabolicPace,slowdownThreshold:GENE_RULES.slowdownThreshold,contractility:{min:0,max:1,default:.6,unit…"
      },
      {
        "file": "../model.js",
        "line": 158,
        "excerpt": "…?.000018:normalized.locomotionFamily===FLOOR_HUNTER_FAMILY?.00002:.000012)*g.processing*g.metabolicPace,maintenance:(.00014+.000052*g.bodySize**2+.000025*g.sensingRange+.000025*g.feedingApertur…"
      },
      {
        "file": "../model.js",
        "line": 158,
        "excerpt": "…amily===APEX_FAMILY?.00011:normalized.locomotionFamily===FLOOR_HUNTER_FAMILY?.00015:0))*g.metabolicPace,activeCost:(normalized.locomotionFamily===OPENWATER_FAMILY?.00025:normalized.locomotionFa…"
      },
      {
        "file": "../model.js",
        "line": 159,
        "excerpt": "…hermalOptimum,maintenance:(.000055+.000035*g.bodySize**2+.00002*(g.sporeInvestment||0))*g.metabolicPace,activeCost:.00010*(g.propulsion??g.contractility??0)};"
      },
      {
        "file": "../model.js",
        "line": 164,
        "excerpt": "    photoCapacity:.0038*(.25+g.photosyntheticInvestment)*g.metabolicPace,"
      },
      {
        "file": "../model.js",
        "line": 167,
        "excerpt": "….foodEnergy-1)+.000045*g.storageInvestment+.000025*g.dormancy+.000065*g.coatInvestment)*g.metabolicPace,"
      },
      {
        "file": "../model.js",
        "line": 173,
        "excerpt": "…urnPersistence','thermalOptimum','sensingRange','feedingAperture','storage','processing','metabolicPace','flocking','cannibalism','acquisitionCapacity','divisionTempo'],"
      },
      {
        "file": "../model.js",
        "line": 174,
        "excerpt": " alga:['bodySize','propulsion','turnPersistence','photosyntheticInvestment','metabolicPace','nutrientUptake','thermalOptimum','adhesion','flocking','crossAffinity','fusionCapacity'…"
      },
      {
        "file": "../model.js",
        "line": 175,
        "excerpt": " prototype:['bodySize','propulsion','contractility','turnPersistence','thermalOptimum','metabolicPace','sporeInvestment']"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…sionBand'].includes(key)||['flocking','divisionTempo','lightPreference','lightTolerance','metabolicPace','cannibalism','photoGlowThreshold','fusionCapacity','matingType','acquisitionCapacity','…"
      },
      {
        "file": "../population.js",
        "line": 325,
        "excerpt": "const ACQUIRABLE_LOCI=['thermalOptimum','metabolicPace','rhythmPhase','rhythmStrength','chemicalSense','disturbanceSense','ambientSense'];"
      },
      {
        "file": "../population.js",
        "line": 579,
        "excerpt": "…sult=copy(normalizeGenome(genome)),changes=[],rules=geneRules(result);for(const gene of ['metabolicPace','propulsion','contractility','buoyancy','slowdownThreshold']){if(!(gene in rules))contin…"
      },
      {
        "file": "../population.js",
        "line": 579,
        "excerpt": "…cy','slowdownThreshold']){if(!(gene in rules))continue;const old=result.genes[gene];if(!['metabolicPace','buoyancy','slowdownThreshold'].includes(gene)&&old<=0)continue;const range=gene==='meta…"
      },
      {
        "file": "../population.js",
        "line": 579,
        "excerpt": "…Pace','buoyancy','slowdownThreshold'].includes(gene)&&old<=0)continue;const range=gene==='metabolicPace'?.04:gene==='buoyancy'?.04:gene==='slowdownThreshold'?7:.08,next=clamp(old+(['buoyancy','…"
      }
    ],
    "mobilization": [
      {
        "file": "../model.js",
        "line": 77,
        "excerpt": "  mobilization:{min:0,max:1,default:0,unit:'release rate',category:'survival',role:'Reserve mobilization…"
      },
      {
        "file": "../model.js",
        "line": 77,
        "excerpt": "…mobilization:{min:0,max:1,default:0,unit:'release rate',category:'survival',role:'Reserve mobilization',effect:'Releases stored energy below 35 usable energy, at 85% efficiency',cost:'Reserve …"
      },
      {
        "file": "../model.js",
        "line": 267,
        "excerpt": "  const release=charge===0&&usable<35?Math.min(state.reserve,1.5*(g.mobilization??0)*dt/1000,(35-Math.max(0,usable))/.85):0;state.reserve-=release;usable+=release*.85;"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…ty','divisionTempo','foodEnergy','crossAffinity','storageInvestment','reserveAllocation','mobilization','dormancy','coatInvestment'].includes(key))&&genome.genes[key]===undefined||typeof genom…"
      },
      {
        "file": "../adaptations.js",
        "line": 6,
        "excerpt": "…id:'reserve',version:1,family:ALGA_FAMILY,genes:['storageInvestment','reserveAllocation','mobilization'],capacity:g=>80*(g.storageInvestment??0),states:['inactive','charging','releasing','full…"
      },
      {
        "file": "../adaptations.js",
        "line": 6,
        "excerpt": "…stment??0),states:['inactive','charging','releasing','full'],cost:'20% charging loss; 15% mobilization loss',priority:'internal transfer after usable photosynthetic gain; no new gross producti…"
      }
    ],
    "motorResistance": [
      {
        "file": "../model.js",
        "line": 54,
        "excerpt": "  motorResistance:{min:0,max:1,default:0,unit:'specific resistance',category:'chemical defense',role:'Motor…"
      },
      {
        "file": "../model.js",
        "line": 127,
        "excerpt": "…emicalSense','disturbanceSense','emissionCapacity','toxinSynthesis','irritantResistance','motorResistance','sensoryResistance','detoxification','organicProduction','organicReception','alarmProduc…"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…owdownThreshold','debrisMetabolism','toxinSynthesis','toxinRelease','irritantResistance','motorResistance','sensoryResistance','detoxification'].includes(key)||genome.locomotionFamily===ALGA_FAMI…"
      },
      {
        "file": "../toxicology.js",
        "line": 20,
        "excerpt": "  const upkeep=dt*.000006*((g.toxinSynthesis||0)+(g.irritantResistance||0)+(g.motorResistance||0)+(g.sensoryResistance||0)+(g.detoxification||0)),paid=Math.min(member.energy,upkeep);m…"
      },
      {
        "file": "../toxicology.js",
        "line": 24,
        "excerpt": " cost+=dt*.000006*((g.toxinSynthesis||0)+(g.irritantResistance||0)+(g.motorResistance||0)+(g.sensoryResistance||0)+(g.detoxification||0));const paid=Math.min(member.energy,cos…"
      }
    ],
    "nutrientUptake": [
      {
        "file": "../model.js",
        "line": 85,
        "excerpt": "  nutrientUptake:{min:0,max:1,default:.55,unit:'medium uptake',category:'metabolism',role:'Nutrient uptake…"
      },
      {
        "file": "../model.js",
        "line": 165,
        "excerpt": "    nutrientCapacity:.25+.75*g.nutrientUptake,"
      },
      {
        "file": "../model.js",
        "line": 167,
        "excerpt": "…  maintenance:(.000105+.000055*g.bodySize**2+.000045*g.photosyntheticInvestment+.000035*g.nutrientUptake+.00004*g.adhesion+.000025*g.flocking+.00002*g.crossAffinity+.00003*(g.fusionCapacity||0)+…"
      },
      {
        "file": "../model.js",
        "line": 174,
        "excerpt": "…ga:['bodySize','propulsion','turnPersistence','photosyntheticInvestment','metabolicPace','nutrientUptake','thermalOptimum','adhesion','flocking','crossAffinity','fusionCapacity','biomassDensity'…"
      },
      {
        "file": "../appearance.js",
        "line": 100,
        "excerpt": "  if((genes.photosyntheticInvestment||0)>=.88&&(genes.nutrientUptake||0)<.9)return looks.sun;"
      },
      {
        "file": "../appearance.js",
        "line": 101,
        "excerpt": "  if((genes.nutrientUptake||0)>=.9)return looks.mineral;"
      }
    ],
    "organicProduction": [
      {
        "file": "../model.js",
        "line": 127,
        "excerpt": "…inSynthesis','irritantResistance','motorResistance','sensoryResistance','detoxification','organicProduction','organicReception','alarmProduction','alarmReception','socialProduction','socialReceptio…"
      },
      {
        "file": "../regulation.js",
        "line": 20,
        "excerpt": "  organicProgram:(g.organicProduction||0)>0&&alga?6:0,"
      },
      {
        "file": "../compounds.js",
        "line": 13,
        "excerpt": "export const COMPOUND_LOCI=Object.freeze({organic:Object.freeze({production:'organicProduction',reception:'organicReception',response:'organicResponse'}),alarm:Object.freeze({productio…"
      },
      {
        "file": "../compounds.js",
        "line": 21,
        "excerpt": "  organicProduction:sense,organicReception:sense,organicResponse:.7,"
      },
      {
        "file": "../signals.js",
        "line": 48,
        "excerpt": " const apparatus=['organicProduction','organicReception','alarmProduction','alarmReception','socialProduction','socialReceptio…"
      }
    ],
    "organicProgram": [
      {
        "file": "../regulation.js",
        "line": 6,
        "excerpt": " organicProgram:programRule('Organic secretion trigger'),"
      },
      {
        "file": "../regulation.js",
        "line": 20,
        "excerpt": "  organicProgram:(g.organicProduction||0)>0&&alga?6:0,"
      },
      {
        "file": "../signals.js",
        "line": 49,
        "excerpt": " const regulatorCost=.000004*[\"lightProgram\",\"organicProgram\",\"alarmProgram\",\"socialProgram\"].reduce((sum,key)=>sum+(g[key]>0?1:0),0);const upkeep=dt*…"
      }
    ],
    "organicReception": [
      {
        "file": "../model.js",
        "line": 127,
        "excerpt": "…ntResistance','motorResistance','sensoryResistance','detoxification','organicProduction','organicReception','alarmProduction','alarmReception','socialProduction','socialReception'];"
      },
      {
        "file": "../compounds.js",
        "line": 13,
        "excerpt": "…OUND_LOCI=Object.freeze({organic:Object.freeze({production:'organicProduction',reception:'organicReception',response:'organicResponse'}),alarm:Object.freeze({production:'alarmProduction',reception…"
      },
      {
        "file": "../compounds.js",
        "line": 21,
        "excerpt": "  organicProduction:sense,organicReception:sense,organicResponse:.7,"
      },
      {
        "file": "../signals.js",
        "line": 48,
        "excerpt": " const apparatus=['organicProduction','organicReception','alarmProduction','alarmReception','socialProduction','socialReception'].reduce((sum,key…"
      }
    ],
    "organicResponse": [
      {
        "file": "../compounds.js",
        "line": 13,
        "excerpt": "…anic:Object.freeze({production:'organicProduction',reception:'organicReception',response:'organicResponse'}),alarm:Object.freeze({production:'alarmProduction',reception:'alarmReception',response:…"
      },
      {
        "file": "../compounds.js",
        "line": 21,
        "excerpt": "  organicProduction:sense,organicReception:sense,organicResponse:.7,"
      }
    ],
    "photoGlowThreshold": [
      {
        "file": "../model.js",
        "line": 88,
        "excerpt": "  photoGlowThreshold:{min:0,max:1,default:.18,unit:'fraction of ambient light',category:'emission',role:'Ambie…"
      },
      {
        "file": "../model.js",
        "line": 152,
        "excerpt": "…sion<3&&key in COMPOUND_GENE_RULES||input.version<4&&key in REGULATION_GENE_RULES||key==='photoGlowThreshold'&&input.version<4&&input.genes?.[key]===undefined)continue;const fallback=key==='debrisMe…"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…ocking','divisionTempo','lightPreference','lightTolerance','metabolicPace','cannibalism','photoGlowThreshold','fusionCapacity','matingType','acquisitionCapacity','sporeInvestment','slowdownThreshold…"
      },
      {
        "file": "../signals.js",
        "line": 42,
        "excerpt": "…d=member.genome.locomotionFamily!==ALGA_FAMILY||(g.ambientSense??0)<=0||b.ambientLamp<=(g.photoGlowThreshold??.18)*100;"
      }
    ],
    "photosyntheticInvestment": [
      {
        "file": "../model.js",
        "line": 84,
        "excerpt": "  photosyntheticInvestment:{min:0,max:1,default:.6,unit:'light capacity',category:'metabolism',role:'Light conversio…"
      },
      {
        "file": "../model.js",
        "line": 164,
        "excerpt": "    photoCapacity:.0038*(.25+g.photosyntheticInvestment)*g.metabolicPace,"
      },
      {
        "file": "../model.js",
        "line": 167,
        "excerpt": "    maintenance:(.000105+.000055*g.bodySize**2+.000045*g.photosyntheticInvestment+.000035*g.nutrientUptake+.00004*g.adhesion+.000025*g.flocking+.00002*g.crossAffinity+.000…"
      },
      {
        "file": "../model.js",
        "line": 174,
        "excerpt": " alga:['bodySize','propulsion','turnPersistence','photosyntheticInvestment','metabolicPace','nutrientUptake','thermalOptimum','adhesion','flocking','crossAffinity',…"
      },
      {
        "file": "../appearance.js",
        "line": 97,
        "excerpt": "  if((genes.bodySize||1)>1.24&&(genes.photosyntheticInvestment||0)>.8)return looks.veil;"
      },
      {
        "file": "../appearance.js",
        "line": 99,
        "excerpt": "  if((genes.bodySize||1)<.77&&(genes.photosyntheticInvestment||0)>=.8)return looks.bloom;"
      },
      {
        "file": "../appearance.js",
        "line": 100,
        "excerpt": "  if((genes.photosyntheticInvestment||0)>=.88&&(genes.nutrientUptake||0)<.9)return looks.sun;"
      }
    ],
    "pigmentB": [
      {
        "file": "../model.js",
        "line": 74,
        "excerpt": "  pigmentB:{min:-1,max:1,default:-1,unit:'blue channel',category:'appearance',role:'Inherited pigmen…"
      },
      {
        "file": "../population.js",
        "line": 324,
        "excerpt": "…AMILY)throw Error('Algae genomes required');const pigment=new Set(['pigmentR','pigmentG','pigmentB']),differing=[...new Set([...Object.keys(genome.genes),...Object.keys(mate.genes)])].filt…"
      },
      {
        "file": "../population.js",
        "line": 324,
        "excerpt": "…enome(partner).fill,t=.35+random(pop)*.3;for(const [index,key] of ['pigmentR','pigmentG','pigmentB'].entries())genome.genes[key]=(parseInt(a.slice(1+index*2,3+index*2),16)*(1-t)+parseInt(b…"
      },
      {
        "file": "../appearance.js",
        "line": 147,
        "excerpt": " if(genome?.locomotionFamily!==ALGA_FAMILY||![g.pigmentR,g.pigmentG,g.pigmentB].every(value=>Number.isFinite(value)&&value>=0))return base;"
      },
      {
        "file": "../appearance.js",
        "line": 149,
        "excerpt": " if(prior&&prior.base===base&&prior.r===g.pigmentR&&prior.g===g.pigmentG&&prior.b===g.pigmentB)return prior.value;"
      },
      {
        "file": "../appearance.js",
        "line": 150,
        "excerpt": " const fill=hex([g.pigmentR,g.pigmentG,g.pigmentB].map(value=>value*255));"
      },
      {
        "file": "../appearance.js",
        "line": 152,
        "excerpt": " tintedAppearances.set(genome,{base,r:g.pigmentR,g:g.pigmentG,b:g.pigmentB,value});"
      }
    ],
    "pigmentG": [
      {
        "file": "../model.js",
        "line": 73,
        "excerpt": "  pigmentG:{min:-1,max:1,default:-1,unit:'green channel',category:'appearance',role:'Inherited pigme…"
      },
      {
        "file": "../population.js",
        "line": 324,
        "excerpt": "…ly!==ALGA_FAMILY)throw Error('Algae genomes required');const pigment=new Set(['pigmentR','pigmentG','pigmentB']),differing=[...new Set([...Object.keys(genome.genes),...Object.keys(mate.gen…"
      },
      {
        "file": "../population.js",
        "line": 324,
        "excerpt": "…earanceForGenome(partner).fill,t=.35+random(pop)*.3;for(const [index,key] of ['pigmentR','pigmentG','pigmentB'].entries())genome.genes[key]=(parseInt(a.slice(1+index*2,3+index*2),16)*(1-t)…"
      },
      {
        "file": "../appearance.js",
        "line": 147,
        "excerpt": " if(genome?.locomotionFamily!==ALGA_FAMILY||![g.pigmentR,g.pigmentG,g.pigmentB].every(value=>Number.isFinite(value)&&value>=0))return base;"
      },
      {
        "file": "../appearance.js",
        "line": 149,
        "excerpt": " if(prior&&prior.base===base&&prior.r===g.pigmentR&&prior.g===g.pigmentG&&prior.b===g.pigmentB)return prior.value;"
      },
      {
        "file": "../appearance.js",
        "line": 150,
        "excerpt": " const fill=hex([g.pigmentR,g.pigmentG,g.pigmentB].map(value=>value*255));"
      },
      {
        "file": "../appearance.js",
        "line": 152,
        "excerpt": " tintedAppearances.set(genome,{base,r:g.pigmentR,g:g.pigmentG,b:g.pigmentB,value});"
      }
    ],
    "pigmentR": [
      {
        "file": "../model.js",
        "line": 72,
        "excerpt": "  pigmentR:{min:-1,max:1,default:-1,unit:'red channel',category:'appearance',role:'Inherited pigment…"
      },
      {
        "file": "../population.js",
        "line": 324,
        "excerpt": "…omotionFamily!==ALGA_FAMILY)throw Error('Algae genomes required');const pigment=new Set(['pigmentR','pigmentG','pigmentB']),differing=[...new Set([...Object.keys(genome.genes),...Object.ke…"
      },
      {
        "file": "../population.js",
        "line": 324,
        "excerpt": "….fill,b=appearanceForGenome(partner).fill,t=.35+random(pop)*.3;for(const [index,key] of ['pigmentR','pigmentG','pigmentB'].entries())genome.genes[key]=(parseInt(a.slice(1+index*2,3+index*2…"
      },
      {
        "file": "../appearance.js",
        "line": 147,
        "excerpt": " if(genome?.locomotionFamily!==ALGA_FAMILY||![g.pigmentR,g.pigmentG,g.pigmentB].every(value=>Number.isFinite(value)&&value>=0))return base;"
      },
      {
        "file": "../appearance.js",
        "line": 149,
        "excerpt": " if(prior&&prior.base===base&&prior.r===g.pigmentR&&prior.g===g.pigmentG&&prior.b===g.pigmentB)return prior.value;"
      },
      {
        "file": "../appearance.js",
        "line": 150,
        "excerpt": " const fill=hex([g.pigmentR,g.pigmentG,g.pigmentB].map(value=>value*255));"
      },
      {
        "file": "../appearance.js",
        "line": 152,
        "excerpt": " tintedAppearances.set(genome,{base,r:g.pigmentR,g:g.pigmentG,b:g.pigmentB,value});"
      }
    ],
    "processing": [
      {
        "file": "../model.js",
        "line": 56,
        "excerpt": "…ense',role:'Toxin clearance',effect:'Speeds internal dose clearance',cost:'Structural and processing energy'},"
      },
      {
        "file": "../model.js",
        "line": 64,
        "excerpt": "…,category:'metabolism',role:'Inherited metabolic pace',effect:'Scales upkeep and resource processing',cost:'Higher pace spends more energy even when food is scarce'},"
      },
      {
        "file": "../model.js",
        "line": 101,
        "excerpt": " processing:{min:.5,max:1.5,default:1,unit:'relative rate',category:'digestion',role:'Food processing…"
      },
      {
        "file": "../model.js",
        "line": 101,
        "excerpt": "…processing:{min:.5,max:1.5,default:1,unit:'relative rate',category:'digestion',role:'Food processing speed',effect:'Digests stored meals faster',cost:'Raises processing cost'},"
      },
      {
        "file": "../model.js",
        "line": 101,
        "excerpt": "…digestion',role:'Food processing speed',effect:'Digests stored meals faster',cost:'Raises processing cost'},"
      },
      {
        "file": "../model.js",
        "line": 158,
        "excerpt": "…NWATER_FAMILY?.000018:normalized.locomotionFamily===FLOOR_HUNTER_FAMILY?.00002:.000012)*g.processing*g.metabolicPace,maintenance:(.00014+.000052*g.bodySize**2+.000025*g.sensingRange+.000025*…"
      },
      {
        "file": "../model.js",
        "line": 173,
        "excerpt": "…ropulsion','turnPersistence','thermalOptimum','sensingRange','feedingAperture','storage','processing','metabolicPace','flocking','cannibalism','acquisitionCapacity','divisionTempo'],"
      },
      {
        "file": "../grazer.js",
        "line": 82,
        "excerpt": "…:'activity';g.reason=quietDigest?'Digesting while activity is low or a full vacuole needs processing':fullness>=.85?'Vacuole full; moving while food processes':`Energy ${Math.round(member.en…"
      },
      {
        "file": "../population.js",
        "line": 532,
        "excerpt": "…nUntil=now+FEED_COOLDOWN_MS;g.action='digest';g.drive='conserve';g.reason='Prey ingested; processing meal';if(prey.grazer?.vacuole.mass)depositAt(state,prey.cell,prey.grazer.vacuole.mass);if…"
      }
    ],
    "propulsion": [
      {
        "file": "../model.js",
        "line": 80,
        "excerpt": "  propulsion:{min:0,max:1,default:.35,unit:'active thrust',category:'locomotion / depth',role:'Swimmin…"
      },
      {
        "file": "../model.js",
        "line": 95,
        "excerpt": " propulsion:{min:0,max:1,default:.6,unit:'ciliary thrust',category:'locomotion',role:'Swimming force'…"
      },
      {
        "file": "../model.js",
        "line": 109,
        "excerpt": "…_RULES=Object.freeze({bodySize:GENE_RULES.bodySize,metabolicPace:GENE_RULES.metabolicPace,propulsion:GENE_RULES.propulsion,slowdownThreshold:GENE_RULES.slowdownThreshold,turnPersistence:GENE…"
      },
      {
        "file": "../model.js",
        "line": 109,
        "excerpt": "…bodySize:GENE_RULES.bodySize,metabolicPace:GENE_RULES.metabolicPace,propulsion:GENE_RULES.propulsion,slowdownThreshold:GENE_RULES.slowdownThreshold,turnPersistence:GENE_RULES.turnPersistence…"
      },
      {
        "file": "../model.js",
        "line": 131,
        "excerpt": "…genome?.locomotionFamily===CRAWLER_FAMILY&&(genome.genes?.bodySize||1)<.9&&(genome.genes?.propulsion||0)>=.65;"
      },
      {
        "file": "../model.js",
        "line": 158,
        "excerpt": "…ELLATE_FAMILY?.000004:normalized.locomotionFamily===CARNIVORE_FAMILY?.0000095:.0000088)*g.propulsion,headingMemory:.3+3.7*g.turnPersistence,optimum:g.thermalOptimum,sensingRadius:.17*g.sensi…"
      },
      {
        "file": "../model.js",
        "line": 158,
        "excerpt": "…y===APEX_FAMILY?.00020:normalized.locomotionFamily===FLOOR_HUNTER_FAMILY?.00022:.00016)*g.propulsion};"
      },
      {
        "file": "../model.js",
        "line": 159,
        "excerpt": "…malized.locomotionFamily!==ALGA_FAMILY)return {radius:.029*g.bodySize,thrust:.00000015*(g.propulsion??g.contractility??0),headingMemory:.3+3.7*(g.turnPersistence??.5),optimum:g.thermalOptimu…"
      },
      {
        "file": "../model.js",
        "line": 159,
        "excerpt": "….000035*g.bodySize**2+.00002*(g.sporeInvestment||0))*g.metabolicPace,activeCost:.00010*(g.propulsion??g.contractility??0)};"
      },
      {
        "file": "../model.js",
        "line": 162,
        "excerpt": "    thrust:.00000018*g.propulsion,"
      },
      {
        "file": "../model.js",
        "line": 168,
        "excerpt": "    activeCost:.00013*g.propulsion"
      },
      {
        "file": "../model.js",
        "line": 173,
        "excerpt": " consumer:['bodySize','propulsion','turnPersistence','thermalOptimum','sensingRange','feedingAperture','storage','processin…"
      },
      {
        "file": "../model.js",
        "line": 174,
        "excerpt": " alga:['bodySize','propulsion','turnPersistence','photosyntheticInvestment','metabolicPace','nutrientUptake','thermalOp…"
      },
      {
        "file": "../model.js",
        "line": 175,
        "excerpt": " prototype:['bodySize','propulsion','contractility','turnPersistence','thermalOptimum','metabolicPace','sporeInvestment']"
      },
      {
        "file": "../model.js",
        "line": 261,
        "excerpt": "  const beforeEnergy=state.energy,active=state.energy>0&&g.propulsion>0,drive=state.energy<28?1:state.bio?.drive??1,fuelFactor=movementFuelFactor(state.energy,…"
      },
      {
        "file": "../population.js",
        "line": 115,
        "excerpt": " for(let i=0;i<config.flagellates;i++)add(FLAGELLATE_FAMILY,.70,.57,.5,{propulsion:.75,feedingAperture:1.5},45);"
      },
      {
        "file": "../population.js",
        "line": 275,
        "excerpt": "  alga.cell.x=.44;alga.cell.y=.5;alga.genome=normalizeGenome({genes:{adhesion:.28,propulsion:.31}});p.records.find(record=>record.id===alga.id).genome=copy(alga.genome);"
      },
      {
        "file": "../population.js",
        "line": 579,
        "excerpt": "…izeGenome(genome)),changes=[],rules=geneRules(result);for(const gene of ['metabolicPace','propulsion','contractility','buoyancy','slowdownThreshold']){if(!(gene in rules))continue;const old=…"
      },
      {
        "file": "../locomotion.js",
        "line": 17,
        "excerpt": "…e(state.environment.volume),now=state.elapsed,active=member.energy>0&&member.genome.genes.propulsion>0,fuelFactor=movementFuelFactor(member.energy,member.genome);"
      },
      {
        "file": "../locomotion.js",
        "line": 34,
        "excerpt": " const crawling=family===CRAWLER_FAMILY,drive=active&&member.genome.genes.propulsion>0&&(crawling?m.mode==='anchor':true),speed=(crawling?.00003/Math.sqrt(scale):.000024/scal…"
      },
      {
        "file": "../locomotion.js",
        "line": 34,
        "excerpt": "…'anchor':true),speed=(crawling?.00003/Math.sqrt(scale):.000024/scale)*member.genome.genes.propulsion*(m.tempo??1),v=drive?speed*activity*fuelFactor:0;c.vx=c.vx*.55+Math.cos(c.heading)*v*.45;…"
      },
      {
        "file": "../appearance.js",
        "line": 98,
        "excerpt": "  if((genes.bodySize||1)<.79&&(genes.propulsion||0)>.67)return looks.dart;"
      },
      {
        "file": "../appearance.js",
        "line": 106,
        "excerpt": " if(family===FLOOR_HUNTER_FAMILY)return genes.bodySize>=1.45&&genes.propulsion<.55?looks.amoeba_proteus:looks.siltfang;"
      },
      {
        "file": "../appearance.js",
        "line": 113,
        "excerpt": "  if(genes.propulsion>=.95&&genes.turnPersistence>=.8)return looks.paramecium;"
      },
      {
        "file": "../appearance.js",
        "line": 132,
        "excerpt": "  if((genes.bodySize||1)<.77&&(genes.propulsion||0)>.9)return looks.ash;"
      }
    ],
    "releaseCooldown": [
      {
        "file": "../regulation.js",
        "line": 12,
        "excerpt": " releaseCooldown:{min:0,max:1,default:.55,unit:'recovery setting',category:'release regulation',role:'Refr…"
      },
      {
        "file": "../regulation.js",
        "line": 16,
        "excerpt": "export const releaseCooldownMs=g=>Math.round(1000+7000*(g.releaseCooldown??.55));"
      },
      {
        "file": "../regulation.js",
        "line": 23,
        "excerpt": "  releaseThreshold:.1,releaseGain:1,releasePulse:.5,releaseCooldown:.55,releaseReserve:5};"
      }
    ],
    "releaseGain": [
      {
        "file": "../regulation.js",
        "line": 10,
        "excerpt": " releaseGain:{min:0,max:1,default:1,unit:'output fraction',category:'release regulation',role:'Request…"
      },
      {
        "file": "../regulation.js",
        "line": 23,
        "excerpt": "  releaseThreshold:.1,releaseGain:1,releasePulse:.5,releaseCooldown:.55,releaseReserve:5};"
      },
      {
        "file": "../regulation.js",
        "line": 32,
        "excerpt": " const input=releaseInput(program,inputs),gain=g.releaseGain??1,threshold=g.releaseThreshold??.25,reserve=g.releaseReserve??5;"
      }
    ],
    "releasePulse": [
      {
        "file": "../regulation.js",
        "line": 11,
        "excerpt": " releasePulse:{min:0,max:1,default:.5,unit:'duration setting',category:'release regulation',role:'Pulse…"
      },
      {
        "file": "../regulation.js",
        "line": 15,
        "excerpt": "export const releasePulseMs=g=>Math.round(600+3200*(g.releasePulse??.5));"
      },
      {
        "file": "../regulation.js",
        "line": 23,
        "excerpt": "  releaseThreshold:.1,releaseGain:1,releasePulse:.5,releaseCooldown:.55,releaseReserve:5};"
      }
    ],
    "releaseReserve": [
      {
        "file": "../regulation.js",
        "line": 13,
        "excerpt": " releaseReserve:{min:0,max:100,default:5,unit:'energy units',category:'release regulation',role:'Protecte…"
      },
      {
        "file": "../regulation.js",
        "line": 23,
        "excerpt": "  releaseThreshold:.1,releaseGain:1,releasePulse:.5,releaseCooldown:.55,releaseReserve:5};"
      },
      {
        "file": "../regulation.js",
        "line": 32,
        "excerpt": "…seInput(program,inputs),gain=g.releaseGain??1,threshold=g.releaseThreshold??.25,reserve=g.releaseReserve??5;"
      },
      {
        "file": "../chemistry.js",
        "line": 52,
        "excerpt": "…r.biomass-quantity<.1)||(!toxin&&member.energy<quantity*20+Math.max(1,member.genome.genes.releaseReserve??1))||(toxin&&(member.toxinState?.store?.[kind]||0)<quantity))return {ok:false,reason:'Se…"
      },
      {
        "file": "../signals.js",
        "line": 43,
        "excerpt": "…e!=='dormant'&&!member.zygote&&!(member.grazer?.handling)&&photoAllowed&&member.energy>(g.releaseReserve??5);"
      },
      {
        "file": "../signals.js",
        "line": 50,
        "excerpt": " const available=Math.max(0,member.energy-(g.releaseReserve??5)-upkeep),pulseCost=Math.min(available,requested*dt*.0012);"
      }
    ],
    "releaseThreshold": [
      {
        "file": "../regulation.js",
        "line": 9,
        "excerpt": " releaseThreshold:{min:0,max:1,default:.25,unit:'input fraction',category:'release regulation',role:'Releas…"
      },
      {
        "file": "../regulation.js",
        "line": 23,
        "excerpt": "  releaseThreshold:.1,releaseGain:1,releasePulse:.5,releaseCooldown:.55,releaseReserve:5};"
      },
      {
        "file": "../regulation.js",
        "line": 32,
        "excerpt": " const input=releaseInput(program,inputs),gain=g.releaseGain??1,threshold=g.releaseThreshold??.25,reserve=g.releaseReserve??5;"
      }
    ],
    "reserveAllocation": [
      {
        "file": "../model.js",
        "line": 76,
        "excerpt": "  reserveAllocation:{min:0,max:1,default:0,unit:'surplus allocation',category:'survival',role:'Photosynthate …"
      },
      {
        "file": "../model.js",
        "line": 263,
        "excerpt": "…=Math.max(0,state.reserve||0),reserveRoom=Math.max(0,reserveCapacity-stored),allocation=g.reserveAllocation??0;"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…esion','biomassDensity','divisionTempo','foodEnergy','crossAffinity','storageInvestment','reserveAllocation','mobilization','dormancy','coatInvestment'].includes(key))&&genome.genes[key]===undefine…"
      },
      {
        "file": "../adaptations.js",
        "line": 6,
        "excerpt": "…erve:Object.freeze({id:'reserve',version:1,family:ALGA_FAMILY,genes:['storageInvestment','reserveAllocation','mobilization'],capacity:g=>80*(g.storageInvestment??0),states:['inactive','charging','r…"
      }
    ],
    "rhythmPhase": [
      {
        "file": "../model.js",
        "line": 38,
        "excerpt": "  rhythmPhase:{min:0,max:1,default:0,unit:'cycle turn',category:'activity',role:'Preferred internal pha…"
      },
      {
        "file": "../grazer.js",
        "line": 15,
        "excerpt": "…ion localPreySenseRange(member,environment){const genes=member.genome.genes,phase=((genes.rhythmPhase??0)%1+1)%1,diurnal=(genes.rhythmStrength??0)>=.08&&(genes.twilightPreference??0)<=.6&&(ph…"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…EGULATION_GENE_RULES||genome.version<3&&key in COMPOUND_GENE_RULES||genome.version===1&&['rhythmPhase','rhythmStrength','twilightPreference','entrainment','ambientSense','lightPreference','li…"
      },
      {
        "file": "../population.js",
        "line": 325,
        "excerpt": "const ACQUIRABLE_LOCI=['thermalOptimum','metabolicPace','rhythmPhase','rhythmStrength','chemicalSense','disturbanceSense','ambientSense'];"
      },
      {
        "file": "../signals.js",
        "line": 22,
        "excerpt": "…genome){const g=genome?.genes;if(!Number.isFinite(g?.rhythmStrength)||!Number.isFinite(g?.rhythmPhase))return 'unavailable';if(g.rhythmStrength<.08)return 'flexible';if((g.twilightPreference?…"
      },
      {
        "file": "../signals.js",
        "line": 22,
        "excerpt": "…'flexible';if((g.twilightPreference??0)>.6)return 'crepuscular';return circularDistance(g.rhythmPhase,.5)<.25?'nocturnal':'diurnal'}"
      },
      {
        "file": "../signals.js",
        "line": 23,
        "excerpt": "…e.genes,strength=g.rhythmStrength??0;if(strength<.08)return 1;const shifted=turn(phase-(g.rhythmPhase??0));const single=(1+Math.cos(shifted*2*Math.PI))/2,twin=(1-Math.cos(shifted*4*Math.PI))/…"
      }
    ],
    "rhythmStrength": [
      {
        "file": "../model.js",
        "line": 39,
        "excerpt": "  rhythmStrength:{min:0,max:1,default:0,unit:'activity bias',category:'activity',role:'Daily rhythm streng…"
      },
      {
        "file": "../grazer.js",
        "line": 15,
        "excerpt": "…ment){const genes=member.genome.genes,phase=((genes.rhythmPhase??0)%1+1)%1,diurnal=(genes.rhythmStrength??0)>=.08&&(genes.twilightPreference??0)<=.6&&(phase<.25||phase>=.75)&&(genes.ambientSense…"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…_RULES||genome.version<3&&key in COMPOUND_GENE_RULES||genome.version===1&&['rhythmPhase','rhythmStrength','twilightPreference','entrainment','ambientSense','lightPreference','lightTolerance','di…"
      },
      {
        "file": "../population.js",
        "line": 325,
        "excerpt": "const ACQUIRABLE_LOCI=['thermalOptimum','metabolicPace','rhythmPhase','rhythmStrength','chemicalSense','disturbanceSense','ambientSense'];"
      },
      {
        "file": "../signals.js",
        "line": 22,
        "excerpt": "export function activityProfile(genome){const g=genome?.genes;if(!Number.isFinite(g?.rhythmStrength)||!Number.isFinite(g?.rhythmPhase))return 'unavailable';if(g.rhythmStrength<.08)return 'f…"
      },
      {
        "file": "../signals.js",
        "line": 22,
        "excerpt": "…r.isFinite(g?.rhythmStrength)||!Number.isFinite(g?.rhythmPhase))return 'unavailable';if(g.rhythmStrength<.08)return 'flexible';if((g.twilightPreference??0)>.6)return 'crepuscular';return circula…"
      },
      {
        "file": "../signals.js",
        "line": 23,
        "excerpt": "export function activityDrive(genome,phase){const g=genome.genes,strength=g.rhythmStrength??0;if(strength<.08)return 1;const shifted=turn(phase-(g.rhythmPhase??0));const single=(1+…"
      },
      {
        "file": "../appearance.js",
        "line": 104,
        "excerpt": " if(family===OMNIVORE_FAMILY)return (genes.rhythmStrength||0)>.75&&(genes.directionalSense||0)>.8?looks.gloammouth:(genes.bodySize||1)<1?looks.flec…"
      },
      {
        "file": "../appearance.js",
        "line": 108,
        "excerpt": " if(family===CARNIVORE_FAMILY)return (genes.emissionCapacity||0)>.85&&(genes.rhythmStrength||0)>.85?looks.lurejaw:(genes.bodySize||1)>=1.3?looks.broadmouth:looks.raptor;"
      },
      {
        "file": "../appearance.js",
        "line": 112,
        "excerpt": "  if((genes.rhythmStrength||0)>.9&&(genes.directionalSense||0)>.9)return looks.nightglass;"
      },
      {
        "file": "../appearance.js",
        "line": 120,
        "excerpt": "  if((genes.rhythmStrength||0)>.8&&(genes.directionalSense||0)>.85)return looks.dusktail;"
      },
      {
        "file": "../appearance.js",
        "line": 126,
        "excerpt": "  if((genes.rhythmStrength||0)>.8&&(genes.emissionCapacity||0)>.6)return looks.lanternsifter;"
      }
    ],
    "sensingRange": [
      {
        "file": "../model.js",
        "line": 99,
        "excerpt": " sensingRange:{min:.5,max:1.5,default:1,unit:'relative range',category:'sensing',role:'Local prey detec…"
      },
      {
        "file": "../model.js",
        "line": 158,
        "excerpt": "…lsion,headingMemory:.3+3.7*g.turnPersistence,optimum:g.thermalOptimum,sensingRadius:.17*g.sensingRange,mouthRatio:g.feedingAperture,vacuoleCapacity:normalized.locomotionFamily===OMNIVORE_FAMIL…"
      },
      {
        "file": "../model.js",
        "line": 158,
        "excerpt": "….000012)*g.processing*g.metabolicPace,maintenance:(.00014+.000052*g.bodySize**2+.000025*g.sensingRange+.000025*g.feedingAperture+.000018*g.storage+.000025*g.flocking+.000025*(g.cannibalism||0)…"
      },
      {
        "file": "../model.js",
        "line": 173,
        "excerpt": " consumer:['bodySize','propulsion','turnPersistence','thermalOptimum','sensingRange','feedingAperture','storage','processing','metabolicPace','flocking','cannibalism','acqui…"
      },
      {
        "file": "../grazer.js",
        "line": 12,
        "excerpt": "export const grazerSenseRange=(genome,volume=1)=>.17*(genome.genes?.sensingRange??phenotype(genome).sensingRadius/.17)*Math.sqrt(volumeScale(volume));"
      },
      {
        "file": "../appearance.js",
        "line": 115,
        "excerpt": "  if((genes.bodySize||1)<.86&&(genes.sensingRange||0)>=1.2)return looks.patient_ciliate;"
      }
    ],
    "sensoryResistance": [
      {
        "file": "../model.js",
        "line": 55,
        "excerpt": "  sensoryResistance:{min:0,max:1,default:0,unit:'specific resistance',category:'chemical defense',role:'Senso…"
      },
      {
        "file": "../model.js",
        "line": 127,
        "excerpt": "…urbanceSense','emissionCapacity','toxinSynthesis','irritantResistance','motorResistance','sensoryResistance','detoxification','organicProduction','organicReception','alarmProduction','alarmReceptio…"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…debrisMetabolism','toxinSynthesis','toxinRelease','irritantResistance','motorResistance','sensoryResistance','detoxification'].includes(key)||genome.locomotionFamily===ALGA_FAMILY&&['adhesion','bio…"
      },
      {
        "file": "../toxicology.js",
        "line": 20,
        "excerpt": "…eep=dt*.000006*((g.toxinSynthesis||0)+(g.irritantResistance||0)+(g.motorResistance||0)+(g.sensoryResistance||0)+(g.detoxification||0)),paid=Math.min(member.energy,upkeep);member.energy-=paid;"
      },
      {
        "file": "../toxicology.js",
        "line": 24,
        "excerpt": "…st+=dt*.000006*((g.toxinSynthesis||0)+(g.irritantResistance||0)+(g.motorResistance||0)+(g.sensoryResistance||0)+(g.detoxification||0));const paid=Math.min(member.energy,cost);member.energy-=paid;re…"
      }
    ],
    "slowdownThreshold": [
      {
        "file": "../model.js",
        "line": 20,
        "excerpt": "export function movementFuelFactor(energy,genome){const ceiling=genome?.genes?.slowdownThreshold??35;return Math.log1p(9*Math.min(1,Math.max(0,energy)/ceiling))/Math.log(10)}"
      },
      {
        "file": "../model.js",
        "line": 81,
        "excerpt": "  slowdownThreshold:{min:10,max:70,default:35,unit:'energy / 100',category:'locomotion / energy',role:'Fuel s…"
      },
      {
        "file": "../model.js",
        "line": 96,
        "excerpt": " slowdownThreshold:GENE_RULES.slowdownThreshold,"
      },
      {
        "file": "../model.js",
        "line": 96,
        "excerpt": " slowdownThreshold:GENE_RULES.slowdownThreshold,"
      },
      {
        "file": "../model.js",
        "line": 109,
        "excerpt": "…NE_RULES.bodySize,metabolicPace:GENE_RULES.metabolicPace,propulsion:GENE_RULES.propulsion,slowdownThreshold:GENE_RULES.slowdownThreshold,turnPersistence:GENE_RULES.turnPersistence,thermalOptimum:GE…"
      },
      {
        "file": "../model.js",
        "line": 109,
        "excerpt": "…ce:GENE_RULES.metabolicPace,propulsion:GENE_RULES.propulsion,slowdownThreshold:GENE_RULES.slowdownThreshold,turnPersistence:GENE_RULES.turnPersistence,thermalOptimum:GENE_RULES.thermalOptimum,spore…"
      },
      {
        "file": "../model.js",
        "line": 111,
        "excerpt": "…_RULES=Object.freeze({bodySize:GENE_RULES.bodySize,metabolicPace:GENE_RULES.metabolicPace,slowdownThreshold:GENE_RULES.slowdownThreshold,contractility:{min:0,max:1,default:.6,unit:'stalk effort',ca…"
      },
      {
        "file": "../model.js",
        "line": 111,
        "excerpt": "…e:GENE_RULES.bodySize,metabolicPace:GENE_RULES.metabolicPace,slowdownThreshold:GENE_RULES.slowdownThreshold,contractility:{min:0,max:1,default:.6,unit:'stalk effort',category:'locomotion',role:'Con…"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…hotoGlowThreshold','fusionCapacity','matingType','acquisitionCapacity','sporeInvestment','slowdownThreshold','debrisMetabolism','toxinSynthesis','toxinRelease','irritantResistance','motorResistance…"
      },
      {
        "file": "../population.js",
        "line": 579,
        "excerpt": "…Rules(result);for(const gene of ['metabolicPace','propulsion','contractility','buoyancy','slowdownThreshold']){if(!(gene in rules))continue;const old=result.genes[gene];if(!['metabolicPace','buoyan…"
      },
      {
        "file": "../population.js",
        "line": 579,
        "excerpt": "…f(!(gene in rules))continue;const old=result.genes[gene];if(!['metabolicPace','buoyancy','slowdownThreshold'].includes(gene)&&old<=0)continue;const range=gene==='metabolicPace'?.04:gene==='buoyancy…"
      },
      {
        "file": "../population.js",
        "line": 579,
        "excerpt": "…ne)&&old<=0)continue;const range=gene==='metabolicPace'?.04:gene==='buoyancy'?.04:gene==='slowdownThreshold'?7:.08,next=clamp(old+(['buoyancy','slowdownThreshold'].includes(gene)?(random(pop)*2-1)*…"
      },
      {
        "file": "../population.js",
        "line": 579,
        "excerpt": "…'?.04:gene==='buoyancy'?.04:gene==='slowdownThreshold'?7:.08,next=clamp(old+(['buoyancy','slowdownThreshold'].includes(gene)?(random(pop)*2-1)*range:old*(random(pop)*2-1)*range),rules[gene].min,rul…"
      }
    ],
    "socialProduction": [
      {
        "file": "../model.js",
        "line": 127,
        "excerpt": "…etoxification','organicProduction','organicReception','alarmProduction','alarmReception','socialProduction','socialReception'];"
      },
      {
        "file": "../regulation.js",
        "line": 22,
        "excerpt": "  socialProgram:(g.socialProduction||0)>0?alga?4:1:0,"
      },
      {
        "file": "../compounds.js",
        "line": 13,
        "excerpt": "…',reception:'alarmReception',response:'alarmResponse'}),social:Object.freeze({production:'socialProduction',reception:'socialReception',response:'socialResponse'})});"
      },
      {
        "file": "../compounds.js",
        "line": 23,
        "excerpt": "  socialProduction:sense*Math.max(g.flocking??0,g.crossAffinity??0),socialReception:sense*Math.max(g.flockin…"
      },
      {
        "file": "../signals.js",
        "line": 48,
        "excerpt": "…nst apparatus=['organicProduction','organicReception','alarmProduction','alarmReception','socialProduction','socialReception'].reduce((sum,key)=>sum+(g[key]||0),0);"
      }
    ],
    "socialProgram": [
      {
        "file": "../regulation.js",
        "line": 8,
        "excerpt": " socialProgram:programRule('Social secretion trigger'),"
      },
      {
        "file": "../regulation.js",
        "line": 22,
        "excerpt": "  socialProgram:(g.socialProduction||0)>0?alga?4:1:0,"
      },
      {
        "file": "../signals.js",
        "line": 49,
        "excerpt": " const regulatorCost=.000004*[\"lightProgram\",\"organicProgram\",\"alarmProgram\",\"socialProgram\"].reduce((sum,key)=>sum+(g[key]>0?1:0),0);const upkeep=dt*(.000018*metabolicActivityFacto…"
      }
    ],
    "socialReception": [
      {
        "file": "../model.js",
        "line": 127,
        "excerpt": "…anicProduction','organicReception','alarmProduction','alarmReception','socialProduction','socialReception'];"
      },
      {
        "file": "../compounds.js",
        "line": 13,
        "excerpt": "…response:'alarmResponse'}),social:Object.freeze({production:'socialProduction',reception:'socialReception',response:'socialResponse'})});"
      },
      {
        "file": "../compounds.js",
        "line": 23,
        "excerpt": "  socialProduction:sense*Math.max(g.flocking??0,g.crossAffinity??0),socialReception:sense*Math.max(g.flocking??0,g.crossAffinity??0),socialResponse:.45"
      },
      {
        "file": "../signals.js",
        "line": 48,
        "excerpt": "…anicProduction','organicReception','alarmProduction','alarmReception','socialProduction','socialReception'].reduce((sum,key)=>sum+(g[key]||0),0);"
      }
    ],
    "socialResponse": [
      {
        "file": "../compounds.js",
        "line": 13,
        "excerpt": "…social:Object.freeze({production:'socialProduction',reception:'socialReception',response:'socialResponse'})});"
      },
      {
        "file": "../compounds.js",
        "line": 23,
        "excerpt": "…g??0,g.crossAffinity??0),socialReception:sense*Math.max(g.flocking??0,g.crossAffinity??0),socialResponse:.45"
      }
    ],
    "spectralCenter": [
      {
        "file": "../model.js",
        "line": 46,
        "excerpt": "  spectralCenter:{min:0,max:1,default:0,unit:'spectrum turn',category:'sensing',role:'Detector color prefe…"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…ence','entrainment','ambientSense','lightPreference','lightTolerance','directionalSense','spectralCenter','spectralWidth','chemicalSense','disturbanceSense','emissionCapacity','emissionPower','e…"
      },
      {
        "file": "../signals.js",
        "line": 26,
        "excerpt": "…E)return 0;const bandwidth=rg.spectralWidth??1,spectral=Math.exp(-.5*(circularDistance(rg.spectralCenter??0,sg.emissionBand??0)/(.06+.26*bandwidth))**2);return clamp(power*investment*spectral/(1…"
      }
    ],
    "spectralWidth": [
      {
        "file": "../model.js",
        "line": 47,
        "excerpt": "  spectralWidth:{min:.1,max:1,default:1,unit:'relative bandwidth',category:'sensing',role:'Detector bandw…"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…t','ambientSense','lightPreference','lightTolerance','directionalSense','spectralCenter','spectralWidth','chemicalSense','disturbanceSense','emissionCapacity','emissionPower','emissionBand'].in…"
      },
      {
        "file": "../signals.js",
        "line": 26,
        "excerpt": "…r.cell.z)*DEPTH_ASPECT)*volumeScale(volume);if(d>SIGNAL_RANGE)return 0;const bandwidth=rg.spectralWidth??1,spectral=Math.exp(-.5*(circularDistance(rg.spectralCenter??0,sg.emissionBand??0)/(.06+…"
      }
    ],
    "sporeInvestment": [
      {
        "file": "../model.js",
        "line": 109,
        "excerpt": "…shold,turnPersistence:GENE_RULES.turnPersistence,thermalOptimum:GENE_RULES.thermalOptimum,sporeInvestment:{min:0,max:1,default:0,unit:'propagule investment',category:'reproduction',role:'Asexual …"
      },
      {
        "file": "../model.js",
        "line": 159,
        "excerpt": "…stence??.5),optimum:g.thermalOptimum,maintenance:(.000055+.000035*g.bodySize**2+.00002*(g.sporeInvestment||0))*g.metabolicPace,activeCost:.00010*(g.propulsion??g.contractility??0)};"
      },
      {
        "file": "../model.js",
        "line": 175,
        "excerpt": "…odySize','propulsion','contractility','turnPersistence','thermalOptimum','metabolicPace','sporeInvestment']"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…','cannibalism','photoGlowThreshold','fusionCapacity','matingType','acquisitionCapacity','sporeInvestment','slowdownThreshold','debrisMetabolism','toxinSynthesis','toxinRelease','irritantResistan…"
      },
      {
        "file": "../propagules.js",
        "line": 11,
        "excerpt": "…ssAffinity??0)>=.5)return 'gamete';if(member.genome.locomotionFamily===CRAWLER_FAMILY&&(g.sporeInvestment??0)>=.7)return 'spore';return null}"
      }
    ],
    "storage": [
      {
        "file": "../model.js",
        "line": 75,
        "excerpt": "…estment:{min:0,max:1,default:0,unit:'reserve capacity',category:'survival',role:'Chemical storage tissue',effect:'Adds up to 80 energy units of capacity; storage tissue needs extra struct…"
      },
      {
        "file": "../model.js",
        "line": 75,
        "excerpt": "…'survival',role:'Chemical storage tissue',effect:'Adds up to 80 energy units of capacity; storage tissue needs extra structural mineral',cost:'Raises body mass target and maintenance'},"
      },
      {
        "file": "../model.js",
        "line": 102,
        "excerpt": " storage:{min:.6,max:1.6,default:1.2,unit:'relative vacuole',category:'digestion',role:'Food capac…"
      },
      {
        "file": "../model.js",
        "line": 158,
        "excerpt": "…ngAperture,vacuoleCapacity:normalized.locomotionFamily===OMNIVORE_FAMILY?Math.min(6,2.2*g.storage*g.bodySize**3):normalized.locomotionFamily===OPENWATER_FAMILY?8:normalized.locomotionFami…"
      },
      {
        "file": "../model.js",
        "line": 158,
        "excerpt": "…ionFamily===OPENWATER_FAMILY?8:normalized.locomotionFamily===APEX_FAMILY?Math.min(8,2.8*g.storage*g.bodySize**3):normalized.locomotionFamily===FLOOR_HUNTER_FAMILY?Math.min(8,2.4*g.storage…"
      },
      {
        "file": "../model.js",
        "line": 158,
        "excerpt": "…storage*g.bodySize**3):normalized.locomotionFamily===FLOOR_HUNTER_FAMILY?Math.min(8,2.4*g.storage*g.bodySize**3):(normalized.locomotionFamily===CARNIVORE_FAMILY?2.1:1.45)*g.storage*g.body…"
      },
      {
        "file": "../model.js",
        "line": 158,
        "excerpt": "…,2.4*g.storage*g.bodySize**3):(normalized.locomotionFamily===CARNIVORE_FAMILY?2.1:1.45)*g.storage*g.bodySize**3,processingRate:(normalized.locomotionFamily===OPENWATER_FAMILY?.000018:norm…"
      },
      {
        "file": "../model.js",
        "line": 158,
        "excerpt": "…:(.00014+.000052*g.bodySize**2+.000025*g.sensingRange+.000025*g.feedingAperture+.000018*g.storage+.000025*g.flocking+.000025*(g.cannibalism||0)+.00002*(g.acquisitionCapacity||0)+.000025*M…"
      },
      {
        "file": "../model.js",
        "line": 173,
        "excerpt": "…dySize','propulsion','turnPersistence','thermalOptimum','sensingRange','feedingAperture','storage','processing','metabolicPace','flocking','cannibalism','acquisitionCapacity','divisionTem…"
      }
    ],
    "storageInvestment": [
      {
        "file": "../model.js",
        "line": 75,
        "excerpt": "  storageInvestment:{min:0,max:1,default:0,unit:'reserve capacity',category:'survival',role:'Chemical storage…"
      },
      {
        "file": "../model.js",
        "line": 127,
        "excerpt": "const massGenes=['bodySize','biomassDensity','storageInvestment','ambientSense','directionalSense','chemicalSense','disturbanceSense','emissionCapacity',…"
      },
      {
        "file": "../model.js",
        "line": 130,
        "excerpt": "…value=g.bodySize**3*(genome.locomotionFamily===ALGA_FAMILY?(g.biomassDensity??1)*(1+.1*(g.storageInvestment??0)):1)*(1+.035*sensorCost);massCache.set(genome,{family:genome.locomotionFamily,values:m…"
      },
      {
        "file": "../model.js",
        "line": 142,
        "excerpt": " if((g.dormancy||0)>=.5&&(g.storageInvestment||0)>=.5)return 0;"
      },
      {
        "file": "../model.js",
        "line": 167,
        "excerpt": "…sity-1)+.00003*Math.max(0,g.divisionTempo-1)+.000025*Math.max(0,g.foodEnergy-1)+.000045*g.storageInvestment+.000025*g.dormancy+.000065*g.coatInvestment)*g.metabolicPace,"
      },
      {
        "file": "../model.js",
        "line": 174,
        "excerpt": "…flocking','crossAffinity','fusionCapacity','biomassDensity','divisionTempo','foodEnergy','storageInvestment','dormancy','coatInvestment'],"
      },
      {
        "file": "../model.js",
        "line": 263,
        "excerpt": "  const reserveCapacity=80*(g.storageInvestment??0),stored=Math.max(0,state.reserve||0),reserveRoom=Math.max(0,reserveCapacity-stored),al…"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…==ALGA_FAMILY&&['adhesion','biomassDensity','divisionTempo','foodEnergy','crossAffinity','storageInvestment','reserveAllocation','mobilization','dormancy','coatInvestment'].includes(key))&&genome.g…"
      },
      {
        "file": "../population.js",
        "line": 351,
        "excerpt": "…(state,child.cell,excessCoat)}child.reserve=Math.min(child.reserve,80*(child.genome.genes.storageInvestment??0));child.motion=freshMotion(child,state.environment.volume);if(parent.grazer){child.gra…"
      },
      {
        "file": "../population.js",
        "line": 612,
        "excerpt": "… organism');if(m.reserve!==undefined&&(!positive(m.reserve)||m.reserve>80*(m.genome.genes.storageInvestment??0)+1e-8)||m.coat!==undefined&&(!positive(m.coat)||m.coat>coatCapacity(m.genome)+1e-8)||m…"
      },
      {
        "file": "../adaptations.js",
        "line": 6,
        "excerpt": " reserve:Object.freeze({id:'reserve',version:1,family:ALGA_FAMILY,genes:['storageInvestment','reserveAllocation','mobilization'],capacity:g=>80*(g.storageInvestment??0),states:['ina…"
      },
      {
        "file": "../adaptations.js",
        "line": 6,
        "excerpt": "…A_FAMILY,genes:['storageInvestment','reserveAllocation','mobilization'],capacity:g=>80*(g.storageInvestment??0),states:['inactive','charging','releasing','full'],cost:'20% charging loss; 15% mobili…"
      },
      {
        "file": "../adaptations.js",
        "line": 7,
        "excerpt": " dormancy:Object.freeze({id:'dormancy',version:1,family:ALGA_FAMILY,genes:['dormancy','storageInvestment'],states:['active','entering','dormant','germinating'],entry:'12 s sustained local light,…"
      },
      {
        "file": "../appearance.js",
        "line": 85,
        "excerpt": "  if((genes.dormancy||0)>=.5&&(genes.storageInvestment||0)>=.5)return looks.sleepseed;"
      },
      {
        "file": "../crispr.js",
        "line": 29,
        "excerpt": " if((member.reserve||0)>80*(genes.storageInvestment??0)+1e-8)throw Error('Reserve capacity is below the energy already stored');"
      }
    ],
    "thermalOptimum": [
      {
        "file": "../model.js",
        "line": 86,
        "excerpt": "  thermalOptimum:{min:5,max:40,default:22,unit:'°C',category:'metabolism',role:'Temperature preference',ef…"
      },
      {
        "file": "../model.js",
        "line": 104,
        "excerpt": " thermalOptimum:GENE_RULES.thermalOptimum,"
      },
      {
        "file": "../model.js",
        "line": 104,
        "excerpt": " thermalOptimum:GENE_RULES.thermalOptimum,"
      },
      {
        "file": "../model.js",
        "line": 109,
        "excerpt": "…slowdownThreshold:GENE_RULES.slowdownThreshold,turnPersistence:GENE_RULES.turnPersistence,thermalOptimum:GENE_RULES.thermalOptimum,sporeInvestment:{min:0,max:1,default:0,unit:'propagule investme…"
      },
      {
        "file": "../model.js",
        "line": 109,
        "excerpt": "…ES.slowdownThreshold,turnPersistence:GENE_RULES.turnPersistence,thermalOptimum:GENE_RULES.thermalOptimum,sporeInvestment:{min:0,max:1,default:0,unit:'propagule investment',category:'reproduction…"
      },
      {
        "file": "../model.js",
        "line": 110,
        "excerpt": "…g or rising',effect:'Changes current-driven vertical drift',cost:'No active swim energy'},thermalOptimum:GENE_RULES.thermalOptimum,...ECOLOGY_GENE_RULES});"
      },
      {
        "file": "../model.js",
        "line": 110,
        "excerpt": "…es current-driven vertical drift',cost:'No active swim energy'},thermalOptimum:GENE_RULES.thermalOptimum,...ECOLOGY_GENE_RULES});"
      },
      {
        "file": "../model.js",
        "line": 111,
        "excerpt": "…pacity',effect:'Sets contraction speed and cost',cost:'Active contraction spends energy'},thermalOptimum:GENE_RULES.thermalOptimum,...ECOLOGY_GENE_RULES});"
      },
      {
        "file": "../model.js",
        "line": 111,
        "excerpt": "…action speed and cost',cost:'Active contraction spends energy'},thermalOptimum:GENE_RULES.thermalOptimum,...ECOLOGY_GENE_RULES});"
      },
      {
        "file": "../model.js",
        "line": 158,
        "excerpt": "…E_FAMILY?.0000095:.0000088)*g.propulsion,headingMemory:.3+3.7*g.turnPersistence,optimum:g.thermalOptimum,sensingRadius:.17*g.sensingRange,mouthRatio:g.feedingAperture,vacuoleCapacity:normalized.…"
      },
      {
        "file": "../model.js",
        "line": 159,
        "excerpt": "…(g.propulsion??g.contractility??0),headingMemory:.3+3.7*(g.turnPersistence??.5),optimum:g.thermalOptimum,maintenance:(.000055+.000035*g.bodySize**2+.00002*(g.sporeInvestment||0))*g.metabolicPace…"
      },
      {
        "file": "../model.js",
        "line": 166,
        "excerpt": "    optimum:g.thermalOptimum,"
      },
      {
        "file": "../model.js",
        "line": 173,
        "excerpt": " consumer:['bodySize','propulsion','turnPersistence','thermalOptimum','sensingRange','feedingAperture','storage','processing','metabolicPace','flocking','cann…"
      },
      {
        "file": "../model.js",
        "line": 174,
        "excerpt": "…ropulsion','turnPersistence','photosyntheticInvestment','metabolicPace','nutrientUptake','thermalOptimum','adhesion','flocking','crossAffinity','fusionCapacity','biomassDensity','divisionTempo',…"
      },
      {
        "file": "../model.js",
        "line": 175,
        "excerpt": " prototype:['bodySize','propulsion','contractility','turnPersistence','thermalOptimum','metabolicPace','sporeInvestment']"
      },
      {
        "file": "../population.js",
        "line": 325,
        "excerpt": "const ACQUIRABLE_LOCI=['thermalOptimum','metabolicPace','rhythmPhase','rhythmStrength','chemicalSense','disturbanceSense','ambie…"
      }
    ],
    "toxinRelease": [
      {
        "file": "../model.js",
        "line": 52,
        "excerpt": "  toxinRelease:{min:0,max:1,default:0,unit:'release propensity',category:'chemical defense',role:'Trigge…"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…itionCapacity','sporeInvestment','slowdownThreshold','debrisMetabolism','toxinSynthesis','toxinRelease','irritantResistance','motorResistance','sensoryResistance','detoxification'].includes(ke…"
      },
      {
        "file": "../population.js",
        "line": 389,
        "excerpt": "    if(quantity>=.00025&&(genes.toxinSynthesis??0)>=.5&&(genes.toxinRelease??0)>=.5&&(state.elapsed-bio.lastReleaseAt>=3000||state.elapsed===0&&bio.lastReleaseAt===0…"
      },
      {
        "file": "../population.js",
        "line": 581,
        "excerpt": "…ory':null;if(toxinKind&&(member.genome.genes.toxinSynthesis??0)>=.5&&(member.genome.genes.toxinRelease??0)>=.5){const amount=Math.min(.0015,.004*member.genome.genes.toxinSynthesis,Math.max(0,m…"
      },
      {
        "file": "../chemistry.js",
        "line": 49,
        "excerpt": "…genome.genes;if(channel.startsWith('toxin-'))return (genes.toxinSynthesis??0)>=.5&&(genes.toxinRelease??0)>=.5?genes.toxinSynthesis:0;return CUE_COMPOUNDS.includes(compound)?g[productionLocus(…"
      }
    ],
    "toxinSynthesis": [
      {
        "file": "../model.js",
        "line": 51,
        "excerpt": "  toxinSynthesis:{min:0,max:1,default:0,unit:'secretory investment',category:'chemical defense',role:'Fini…"
      },
      {
        "file": "../model.js",
        "line": 127,
        "excerpt": "…,'ambientSense','directionalSense','chemicalSense','disturbanceSense','emissionCapacity','toxinSynthesis','irritantResistance','motorResistance','sensoryResistance','detoxification','organicProd…"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…tingType','acquisitionCapacity','sporeInvestment','slowdownThreshold','debrisMetabolism','toxinSynthesis','toxinRelease','irritantResistance','motorResistance','sensoryResistance','detoxificatio…"
      },
      {
        "file": "../population.js",
        "line": 389,
        "excerpt": "    if(quantity>=.00025&&(genes.toxinSynthesis??0)>=.5&&(genes.toxinRelease??0)>=.5&&(state.elapsed-bio.lastReleaseAt>=3000||state.elaps…"
      },
      {
        "file": "../population.js",
        "line": 581,
        "excerpt": "…ome.locomotionFamily===CARNIVORE_FAMILY?'sensory':null;if(toxinKind&&(member.genome.genes.toxinSynthesis??0)>=.5&&(member.genome.genes.toxinRelease??0)>=.5){const amount=Math.min(.0015,.004*memb…"
      },
      {
        "file": "../population.js",
        "line": 581,
        "excerpt": "…r.genome.genes.toxinRelease??0)>=.5){const amount=Math.min(.0015,.004*member.genome.genes.toxinSynthesis,Math.max(0,member.biomass-.12));if(amount>0&&member.energy>=20){member.toxinState??=fresh…"
      },
      {
        "file": "../chemistry.js",
        "line": 49,
        "excerpt": "…apparatus(member),genes=member.genome.genes;if(channel.startsWith('toxin-'))return (genes.toxinSynthesis??0)>=.5&&(genes.toxinRelease??0)>=.5?genes.toxinSynthesis:0;return CUE_COMPOUNDS.includes…"
      },
      {
        "file": "../chemistry.js",
        "line": 49,
        "excerpt": "…rtsWith('toxin-'))return (genes.toxinSynthesis??0)>=.5&&(genes.toxinRelease??0)>=.5?genes.toxinSynthesis:0;return CUE_COMPOUNDS.includes(compound)?g[productionLocus(compound)]||0:0}"
      },
      {
        "file": "../toxicology.js",
        "line": 15,
        "excerpt": "…{const g=member.genome.genes,state=member.toxinState??=freshToxinState(),capacity=.004*(g.toxinSynthesis||0);if(!TOXINS[kind]||capacity<=0||member.energy<20)return 0;const amount=Math.min(capaci…"
      },
      {
        "file": "../toxicology.js",
        "line": 15,
        "excerpt": "…ember.energy<20)return 0;const amount=Math.min(capacity-state.store[kind],dt*.00000008*(g.toxinSynthesis||0),Math.max(0,member.biomass-.12));if(amount<=0)return 0;member.biomass-=amount;state.st…"
      },
      {
        "file": "../toxicology.js",
        "line": 20,
        "excerpt": "  const upkeep=dt*.000006*((g.toxinSynthesis||0)+(g.irritantResistance||0)+(g.motorResistance||0)+(g.sensoryResistance||0)+(g.detoxifi…"
      },
      {
        "file": "../toxicology.js",
        "line": 24,
        "excerpt": " cost+=dt*.000006*((g.toxinSynthesis||0)+(g.irritantResistance||0)+(g.motorResistance||0)+(g.sensoryResistance||0)+(g.detoxifi…"
      },
      {
        "file": "../crispr.js",
        "line": 32,
        "excerpt": "…||0)+(member.toxinState?.store?.motor||0)+(member.toxinState?.store?.sensory||0)>0&&genes.toxinSynthesis===0)throw Error('Stored toxin must clear before removing synthesis apparatus');"
      }
    ],
    "turnPersistence": [
      {
        "file": "../model.js",
        "line": 82,
        "excerpt": "  turnPersistence:{min:0,max:1,default:.55,unit:'heading memory',category:'locomotion / depth',role:'Headin…"
      },
      {
        "file": "../model.js",
        "line": 97,
        "excerpt": " turnPersistence:GENE_RULES.turnPersistence,"
      },
      {
        "file": "../model.js",
        "line": 97,
        "excerpt": " turnPersistence:GENE_RULES.turnPersistence,"
      },
      {
        "file": "../model.js",
        "line": 109,
        "excerpt": "…bolicPace,propulsion:GENE_RULES.propulsion,slowdownThreshold:GENE_RULES.slowdownThreshold,turnPersistence:GENE_RULES.turnPersistence,thermalOptimum:GENE_RULES.thermalOptimum,sporeInvestment:{min:…"
      },
      {
        "file": "../model.js",
        "line": 109,
        "excerpt": "…ULES.propulsion,slowdownThreshold:GENE_RULES.slowdownThreshold,turnPersistence:GENE_RULES.turnPersistence,thermalOptimum:GENE_RULES.thermalOptimum,sporeInvestment:{min:0,max:1,default:0,unit:'pro…"
      },
      {
        "file": "../model.js",
        "line": 158,
        "excerpt": "…ocomotionFamily===CARNIVORE_FAMILY?.0000095:.0000088)*g.propulsion,headingMemory:.3+3.7*g.turnPersistence,optimum:g.thermalOptimum,sensingRadius:.17*g.sensingRange,mouthRatio:g.feedingAperture,va…"
      },
      {
        "file": "../model.js",
        "line": 159,
        "excerpt": "…29*g.bodySize,thrust:.00000015*(g.propulsion??g.contractility??0),headingMemory:.3+3.7*(g.turnPersistence??.5),optimum:g.thermalOptimum,maintenance:(.000055+.000035*g.bodySize**2+.00002*(g.sporeI…"
      },
      {
        "file": "../model.js",
        "line": 163,
        "excerpt": "    headingMemory:.3+3.7*g.turnPersistence,"
      },
      {
        "file": "../model.js",
        "line": 173,
        "excerpt": " consumer:['bodySize','propulsion','turnPersistence','thermalOptimum','sensingRange','feedingAperture','storage','processing','metabolicPace'…"
      },
      {
        "file": "../model.js",
        "line": 174,
        "excerpt": " alga:['bodySize','propulsion','turnPersistence','photosyntheticInvestment','metabolicPace','nutrientUptake','thermalOptimum','adhesion',…"
      },
      {
        "file": "../model.js",
        "line": 175,
        "excerpt": " prototype:['bodySize','propulsion','contractility','turnPersistence','thermalOptimum','metabolicPace','sporeInvestment']"
      },
      {
        "file": "../locomotion.js",
        "line": 31,
        "excerpt": " if(family===CRAWLER_FAMILY&&member.genome.genes.bodySize>=1.2&&member.genome.genes.turnPersistence>=.9&&!nearest){const old=m.trail.slice(0,-3);const choices=[-.9,-.45,0,.45,.9].map(delta=…"
      },
      {
        "file": "../locomotion.js",
        "line": 32,
        "excerpt": " if(family===CRAWLER_FAMILY&&member.genome.genes.bodySize<.77&&member.genome.genes.turnPersistence<.3&&member.energy<35){let sumX=0,sumY=0,count=0;for(const other of state.population.livin…"
      },
      {
        "file": "../appearance.js",
        "line": 113,
        "excerpt": "  if(genes.propulsion>=.95&&genes.turnPersistence>=.8)return looks.paramecium;"
      },
      {
        "file": "../appearance.js",
        "line": 127,
        "excerpt": "  if(genes.bodySize>=1.4&&genes.turnPersistence<.3)return looks.fuligo;"
      },
      {
        "file": "../appearance.js",
        "line": 128,
        "excerpt": "  if(genes.bodySize>=1.2&&genes.turnPersistence>=.9)return looks.physarum;"
      },
      {
        "file": "../appearance.js",
        "line": 129,
        "excerpt": "  if(genes.bodySize<.77&&genes.turnPersistence<.3)return looks.dicty;"
      }
    ],
    "twilightPreference": [
      {
        "file": "../model.js",
        "line": 40,
        "excerpt": "  twilightPreference:{min:0,max:1,default:0,unit:'two-window tendency',category:'activity',role:'Dawn and dusk…"
      },
      {
        "file": "../grazer.js",
        "line": 15,
        "excerpt": "…genes,phase=((genes.rhythmPhase??0)%1+1)%1,diurnal=(genes.rhythmStrength??0)>=.08&&(genes.twilightPreference??0)<=.6&&(phase<.25||phase>=.75)&&(genes.ambientSense??0)>0,light=member.bio?.ambientLamp…"
      },
      {
        "file": "../population.js",
        "line": 53,
        "excerpt": "…rsion<3&&key in COMPOUND_GENE_RULES||genome.version===1&&['rhythmPhase','rhythmStrength','twilightPreference','entrainment','ambientSense','lightPreference','lightTolerance','directionalSense','spec…"
      },
      {
        "file": "../signals.js",
        "line": 22,
        "excerpt": "…nite(g?.rhythmPhase))return 'unavailable';if(g.rhythmStrength<.08)return 'flexible';if((g.twilightPreference??0)>.6)return 'crepuscular';return circularDistance(g.rhythmPhase,.5)<.25?'nocturnal':'di…"
      },
      {
        "file": "../signals.js",
        "line": 23,
        "excerpt": "…h.cos(shifted*2*Math.PI))/2,twin=(1-Math.cos(shifted*4*Math.PI))/2,preferred=single*(1-(g.twilightPreference??0))+twin*(g.twilightPreference??0);return clamp(1-strength*.82*(1-preferred),.18,1)}"
      },
      {
        "file": "../signals.js",
        "line": 23,
        "excerpt": "…=(1-Math.cos(shifted*4*Math.PI))/2,preferred=single*(1-(g.twilightPreference??0))+twin*(g.twilightPreference??0);return clamp(1-strength*.82*(1-preferred),.18,1)}"
      }
    ]
  }
}
