{
 "version": 17,
 "history": [],
 "sections": [
  {
   "title": "A2, the block of wood",
   "consts": [
    {
     "name": "mass_cap",
     "value": 100,
     "ratio": null,
     "doc": "Mass cap, not allocation. See the A2 [v0.3] amendment: must-spend would give every cell r = 5.0, make the 1.15 engulf ratio unreachable, and kill phagocytosis outright."
    },
    {
     "name": "radius_ref",
     "value": 5,
     "ratio": null,
     "doc": "radius = radius_ref * sqrt(mass / mass_cap)."
    }
   ]
  },
  {
   "title": "A4/A5 organelle masses (behaviour lands in Phase 2)",
   "consts": [
    {
     "name": "phago_mass",
     "value": 20,
     "ratio": null,
     "doc": "Declining the attack slot. Zero on all three counts, and here rather than hard-coded so it can be given a price if a weaponless cell turns out to be too cheap a way to buy mitochondria."
    },
    {
     "name": "toxin_mass",
     "value": 14,
     "ratio": null,
     "doc": null
    },
    {
     "name": "pilus_mass",
     "value": 10,
     "ratio": null,
     "doc": null
    },
    {
     "name": "membrane_mass",
     "value": 25,
     "ratio": null,
     "doc": null
    },
    {
     "name": "efflux_mass",
     "value": 6,
     "ratio": null,
     "doc": null
    },
    {
     "name": "encyst_mass",
     "value": 10,
     "ratio": null,
     "doc": null
    }
   ]
  },
  {
   "title": "A7, metabolism",
   "consts": [
    {
     "name": "mito_mass",
     "value": 7,
     "ratio": null,
     "doc": null
    },
    {
     "name": "mito_max",
     "value": 8,
     "ratio": null,
     "doc": null
    },
    {
     "name": "mito_output",
     "value": 3,
     "ratio": null,
     "doc": "ATP per second per mitochondrion, before saturation and the oxygen-debt throttle."
    },
    {
     "name": "metabolic_waste_k",
     "value": 3,
     "ratio": null,
     "doc": "How much substrate is wasted running the engine hard. Substrate per ATP is 1 + waste_k * throttle^3. Idling is efficient; flat out costs 1 + waste_k times as much fuel for the same ATP. This is the Krebs cycle observation: the last bit of yield is disproportionately expensive, because pushing the electron transport chain harder leaks more than it delivers. It makes the throttle a live decision every tick rather than a build-time ceiling — you can have the power, if you are truly willing to pay for it. The consequence is the interesting part: a big engine is not more powerful, it is more efficient at a given output. Producing 10 ATP/s costs a mito=8 cell 12.2 substrate/s and a mito=4 cell 27.4. Headroom is what mass buys, and mass is not free."
    },
    {
     "name": "glycolysis_rate",
     "value": 5,
     "ratio": null,
     "doc": "Glycolysis: substrate to ATP without mitochondria, at a poor yield. Two ATP per glucose against about thirty for full oxidative phosphorylation, so the yield is deliberately dreadful and the rate is not. When substrate is what is being competed for, rate beats yield -- the Warburg effect."
    },
    {
     "name": "glycolysis_cost",
     "value": 6,
     "ratio": null,
     "doc": "Substrate burnt per ATP fermented. Respiration pays 1.0 to 4.0 depending on throttle; this is the price of not owning an engine."
    },
    {
     "name": "ros_per_atp",
     "value": 0.04,
     "ratio": "4/100",
     "doc": "Reactive oxygen species: membrane lost per ATP respired. The electron transport chain leaks; glycolysis has no chain and pays nothing. Fermentation is wasteful and clean, respiration efficient and corrosive."
    },
    {
     "name": "ros_clear_k",
     "value": 0.5,
     "ratio": "1/2",
     "doc": "Fraction of the pool scavenged per second. First order, not a flat rate: scavenging scales with how much there is to scavenge, as any real enzyme does. That matters mechanically as well as physically. A flat drain gives no equilibrium -- production above it accumulates for ever, the pool runs away, and the burn escalates without bound until the cell dies. Measured, that pinned the meter at full for almost the whole match. First order settles instead: the pool rests at production / this, which is higher for a cell respiring harder and lower for one pacing itself. The reading stays informative and the mechanic stays monotonic."
    },
    {
     "name": "ros_ferment_clear",
     "value": 0.05,
     "ratio": "1/20",
     "doc": "Extra scavenging per ATP per second fermented. Glycolysis has no chain to leak from, so it does not add to the pool -- and the reductant it leaves behind is what clears it. Fermenting is therefore the way out of a burn, paid for in substrate at glycolysis_cost."
    },
    {
     "name": "ros_tolerance",
     "value": 0.25,
     "ratio": "1/4",
     "doc": "How much the pool holds before any of it reaches the membrane. This is the whole point of the pool: a cell may open the throttle for a few seconds and pay nothing at all."
    },
    {
     "name": "ros_cap",
     "value": 1,
     "ratio": null,
     "doc": "Full scale for a ROS meter. Display only -- the pool itself is not clamped, because a clamped pool stops responding to how hard a cell is respiring once it saturates. Deliberately exactly four times ros_tolerance, so a bar drawn full-scale has its damage threshold a quarter of the way along and the front end needs no second constant to place it. Four rather than two because a cell at rest settles above tolerance already: at two, the bar sat pinned."
    },
    {
     "name": "ros_bite",
     "value": 1.2,
     "ratio": "6/5",
     "doc": "Membrane lost per second per unit of pool above ros_tolerance."
    },
    {
     "name": "mito_half_max",
     "value": 4,
     "ratio": null,
     "doc": "Mitochondria count at which output reaches half its asymptote. Production saturates: capacity = output * n / (1 + n / half_max). A cell cannot stack engines indefinitely — oxygen has to diffuse to them — and without this the Nth mitochondrion is worth exactly as much as the first, which makes \"buy more\" a strictly dominant strategy. A very large value reproduces linear output."
    },
    {
     "name": "start_atp",
     "value": 40,
     "ratio": null,
     "doc": null
    },
    {
     "name": "start_substrate",
     "value": 250,
     "ratio": null,
     "doc": null
    },
    {
     "name": "oxygen_tau",
     "value": 2,
     "ratio": null,
     "doc": "Oxygen-debt window, in seconds. Design section A7 says 2 s; the napkin harness implemented no window at all, only a ratchet. See review finding 6."
    },
    {
     "name": "oxygen_k",
     "value": 0.6,
     "ratio": "6/10",
     "doc": "Throttle sharpness: output = capacity * exp(-k * debt). A7 says ~0.6."
    }
   ]
  },
  {
   "title": "The dish as a field (see field)",
   "consts": [
    {
     "name": "food_level",
     "value": 14,
     "ratio": null,
     "doc": "Food in every square of the dish, laid down flat at the start. Set by what a cell can actually eat, not by the dish total. The bloom field it replaced held about the same food overall but concentrated it, and feeding scales with the density underfoot -- so matching the old total (2.25) starved everyone and engulfment all but vanished, at 0.014 of endings. Matching the old rich-patch density instead is the top of a measured curve -- engulfment peaks here at 0.052 and falls again by 20, where the dish stops running out and matches drift to the clock. Starvation stays the commonest ending: the slide is six times richer and still gets stripped inside thirty seconds."
    },
    {
     "name": "food_patchiness",
     "value": 0.6,
     "ratio": "6/10",
     "doc": "How uneven the dish is. 0 is flat; 1 puts the richest ground at twice the mean and the leanest at nothing. Texture is what makes steer=food a decision and gives a cordon something to deny. Symmetry is what stops it being a lottery -- see food_patches."
    },
    {
     "name": "food_patches",
     "value": 7,
     "ratio": null,
     "doc": "How many patches. Placed in mirrored pairs, so both cells meet the same board however the opening angle falls."
    },
    {
     "name": "forage_range",
     "value": 30,
     "ratio": null,
     "doc": "How far a cell looks when deciding where to feed. Bounded so foraging costs a local sweep rather than the whole grid, and so a cell cannot see the entire dish at once for free."
    },
    {
     "name": "forage_interval",
     "value": 0.25,
     "ratio": "1/4",
     "doc": "Seconds between re-evaluating where the food is. A cell heading for a patch does not reconsider sixty times a second, and sweeping the grid that often was costing more than the rest of the simulation put together. Chemotaxis has memory; so does this."
    },
    {
     "name": "poison_decay",
     "value": 0.4,
     "ratio": "40/100",
     "doc": "Fraction of standing poison lost per second. Food does not regrow."
    },
    {
     "name": "poison_spread",
     "value": 0.9,
     "ratio": "9/10",
     "doc": "Fraction of a square's poison that spreads to its four neighbours each second. Without this, poison only ever shrank: decay scales every square down by the same factor, so the outer ring of a cloud drops out of sight first and a cordon appears to retreat toward its own centre. A chemical in liquid does the opposite -- it widens as it weakens. Spreading also gives toxin an identity beyond damage: a cordon laid early covers more ground later, so the area it denies grows while the harm it does falls."
    },
    {
     "name": "poison_per_atp",
     "value": 0.15,
     "ratio": "3/20",
     "doc": "Poison laid per ATP committed."
    },
    {
     "name": "poison_ring_inner",
     "value": 1,
     "ratio": null,
     "doc": "The poison ring, in multiples of the emitter's radius. Inner at 1.0 keeps the emitter's own centre out of its cloud while it stands still; outer at 2.0 makes the band about one radius thick, so anything that closes to contact has to cross it."
    },
    {
     "name": "poison_ring_outer",
     "value": 3,
     "ratio": null,
     "doc": "Outer edge of the ring, in radii. Two cells touch at the sum of their radii, so anything at or below 2.0 ends exactly where an attacker stands and never reaches it. At 3.0 the ring covers contact and a phagocyte reaching from 2, and stops short of a pilus reaching from 5 -- so the longest weapon is the one that can open a toxin cell without entering its screen."
    },
    {
     "name": "poison_bite",
     "value": 0.6,
     "ratio": "6/10",
     "doc": "ATP per second drained by standing in one unit of poison."
    },
    {
     "name": "attack_grip",
     "value": 0,
     "ratio": null,
     "doc": "Extra drag on a cell while something is draining it. The gap this fills: nothing in the sim impedes a target under attack. The only drag modifier is poison, so a pilus does not tether and a phagocyte does not hold -- contact is incidental and breaks immediately. Measured, cells drain for about 5% of frames, and a policy fully committed to hunting loses to a pure grazer at every price predation can be sold for. It is not that eating is unprofitable; it is that you cannot hold anyone still long enough to eat them. Scaled by how hard the attack is biting, so a grip is something you earn by landing an attack rather than a status you apply. Ships at zero until measured."
    },
    {
     "name": "poison_drag",
     "value": 0.4,
     "ratio": "4/10",
     "doc": "Extra drag per unit of poison. Wading is slow, which is what makes a cordon a cordon rather than a line on a map."
    }
   ]
  },
  {
   "title": "Soft bodies (see Cell::radius_toward)",
   "consts": [
    {
     "name": "stretch_from_contact",
     "value": 0.28,
     "ratio": "28/100",
     "doc": "How far contact elongates a cell perpendicular to the squeeze."
    },
    {
     "name": "stretch_relax",
     "value": 4,
     "ratio": null,
     "doc": "How fast shape relaxes back toward round, per second."
    },
    {
     "name": "stretch_max",
     "value": 1.35,
     "ratio": "135/100",
     "doc": "Hard bound on elongation, in either direction."
    },
    {
     "name": "contact_breadth_gain",
     "value": 0.45,
     "ratio": "45/100",
     "doc": "How much presenting a broad face increases the drain between two cells. Two pressed cells touch along an area, not a point. Turning your long side to an opponent gives more contact and more transfer both ways, so a grapple is a commitment rather than a free hold."
    },
    {
     "name": "contact_restitution",
     "value": 0,
     "ratio": null,
     "doc": "How much a collision bounces. Zero is a pure smush: the cells stop closing and stay pressed together rather than springing apart. Membranes are inviolable — two cells can deform against each other but never occupy the same space. Separation is shared in inverse proportion to mass, so a heavy cell shoves a light one aside and barely moves itself. That gives size a use beyond the drain ratio: you can physically deny ground."
    }
   ]
  },
  {
   "title": "Ways to die (see outcome::EndCondition)",
   "consts": [
    {
     "name": "lysis_threshold",
     "value": 4,
     "ratio": null,
     "doc": "Incoming drain per unit of radius that ruptures a membrane. A rate death rather than a stock death: enough at once and you burst however full your reserve was. This is what stops a large ATP pool from making a cell safe against everything, which is why hoarding has won every measurement so far."
    },
    {
     "name": "apoptosis_time",
     "value": 1.5,
     "ratio": "15/10",
     "doc": "Seconds a pilus must be held before it triggers shutdown in its target. Kills outright, ignoring the reserve. Gives the pilus a threat rather than a slow tax, and a countdown the target can hear."
    },
    {
     "name": "apoptosis_decay",
     "value": 2,
     "ratio": null,
     "doc": null
    }
   ]
  },
  {
   "title": "A7, nutrients. Feeding rules per the [v0.3] amendment.",
   "consts": [
    {
     "name": "feed_rate",
     "value": 20,
     "ratio": null,
     "doc": "Substrate per second drained while feeding. At 20/s a 40-unit patch takes the specified ~2 s."
    },
    {
     "name": "feed_speed_factor",
     "value": 0.3,
     "ratio": "3/10",
     "doc": "Fraction of top speed available while feeding."
    }
   ]
  },
  {
   "title": "A9, environment",
   "consts": [
    {
     "name": "dish",
     "value": 100,
     "ratio": null,
     "doc": null
    },
    {
     "name": "wall_restitution",
     "value": 0.5,
     "ratio": "1/2",
     "doc": "Restitution on the hard walls of A15."
    },
    {
     "name": "centre_pull",
     "value": 3,
     "ratio": null,
     "doc": "Inward acceleration at the rim, ramping linearly from zero at the centre. The slide is a shallow bowl: a cell that stops is carried toward the middle, so camping costs thrust continuously, and it costs it in the currency a cell cannot spend twice. It also separates the movement organelles by drag, a property they already have and which otherwise does almost nothing. Zero switches it off. Capped by the weakest legal build's thrust, which is 4.0. Above that the bowl stops being a cost and becomes a wall: at 5.0 a tenth of legal builds can no longer hold the rim at full effort, and at 8.0 more than a third cannot. That does not tax camping, it shrinks the dish, and it shrinks it most for the heavy slow builds that were already struggling. Three is the most that leaves every build able to buy its position. It shipped at 1.5 for a reason that turned out to be nothing: the commitment \"cycle\" appeared to break above that, but the link doing the breaking was turtle-versus-miser, which is a coin flip and was simply landing the other way. Both edges that are actually measurable hold to pull 12 and beyond. See commitment_cycle.rs."
    },
    {
     "name": "flow_amp",
     "value": 0.3,
     "ratio": "3/10",
     "doc": "Flow field acceleration amplitude. \"Gentle — biasing, never deciding.\""
    },
    {
     "name": "flow_wavelength",
     "value": 50,
     "ratio": null,
     "doc": "Spatial wavelength of the flow field, in units."
    },
    {
     "name": "flow_period",
     "value": 20,
     "ratio": null,
     "doc": "Seconds per temporal cycle of the flow field."
    }
   ]
  },
  {
   "title": "A10a, genome mass",
   "consts": [
    {
     "name": "genome_free_nodes",
     "value": 10,
     "ratio": null,
     "doc": "Nodes that cost nothing."
    },
    {
     "name": "genome_mass_per_node",
     "value": 0,
     "ratio": null,
     "doc": "Mass per node past the free allowance."
    },
    {
     "name": "genome_atp_per_node",
     "value": 0.1,
     "ratio": "1/10",
     "doc": "ATP per second per billable node. Thinking is a running cost, not a size. Body and policy draw on the same budget from opposite ends: a light cell owes little upkeep and can afford to think hard, a heavy one has to think cheaply."
    },
    {
     "name": "genome_max_nodes",
     "value": 40,
     "ratio": null,
     "doc": null
    }
   ]
  },
  {
   "title": "The interaction law (see combat)",
   "consts": [
    {
     "name": "phago_strength",
     "value": 18,
     "ratio": null,
     "doc": "ATP per second taken at surface contact, before size and resistance."
    },
    {
     "name": "toxin_strength",
     "value": 3,
     "ratio": null,
     "doc": null
    },
    {
     "name": "pilus_strength",
     "value": 6,
     "ratio": null,
     "doc": null
    },
    {
     "name": "phago_reach",
     "value": 2,
     "ratio": null,
     "doc": "How far past surface contact the drain reaches, in units. This single number carries each attack's identity: phagocytosis must touch, toxin works at range, the pilus sits between them."
    },
    {
     "name": "toxin_reach",
     "value": 10,
     "ratio": null,
     "doc": null
    },
    {
     "name": "points_kill_fast",
     "value": 3,
     "ratio": null,
     "doc": "Round points. Deliberately the smallest integers that produce the ordering the design wants: every kill beats every timeout, faster kills beat slower ones, and stagnating is the only way to go backwards. They are a rating and never a balance -- ADR 0003. Nothing converts them to anything, which is why they can be this small without being unfair. Integers, because a rating that needs fixed-point is a rating nobody can check by hand."
    },
    {
     "name": "points_kill_mid",
     "value": 2,
     "ratio": null,
     "doc": null
    },
    {
     "name": "points_kill_slow",
     "value": 1,
     "ratio": null,
     "doc": null
    },
    {
     "name": "points_timeout_win",
     "value": 0,
     "ratio": null,
     "doc": null
    },
    {
     "name": "points_timeout_loss",
     "value": -1,
     "ratio": null,
     "doc": null
    },
    {
     "name": "points_draw",
     "value": 0,
     "ratio": null,
     "doc": null
    },
    {
     "name": "points_double_loss",
     "value": -1,
     "ratio": null,
     "doc": null
    },
    {
     "name": "points_fast_ticks",
     "value": 600,
     "ratio": null,
     "doc": "The two band edges, in ticks."
    },
    {
     "name": "points_mid_ticks",
     "value": 1200,
     "ratio": null,
     "doc": null
    },
    {
     "name": "no_attack_poison",
     "value": 0,
     "ratio": null,
     "doc": "Poison laid into the field per ATP, by attack organelle. Only the toxin vesicle has any: before this existed, attack=none could lay poison exactly as well as a toxin cell and bank the 14 mass, which made the organelle a tax on the honest."
    },
    {
     "name": "phago_poison",
     "value": 0,
     "ratio": null,
     "doc": null
    },
    {
     "name": "toxin_poison",
     "value": 1,
     "ratio": null,
     "doc": null
    },
    {
     "name": "pilus_poison",
     "value": 0,
     "ratio": null,
     "doc": null
    },
    {
     "name": "pilus_reach",
     "value": 5,
     "ratio": null,
     "doc": null
    },
    {
     "name": "integrity_per_radius",
     "value": 1.5,
     "ratio": "3/2",
     "doc": "Fraction of what you take that you keep. Theft rather than damage. Membrane integrity per unit of radius: the size of the pool an attack eats into. The change this belongs to. ATP used to be energy, score and hit points at once, and that is why combat never mattered: draining a cell is undone by grazing, so an attack was a tax the dish refunded. Integrity is a separate stock that only combat touches and only ATP restores, which makes damage a debt rather than a dip. Scaled by radius because a bigger cell is more membrane. Set from a measured curve rather than picked. Kill rate against depth, per unit radius: 6.0 gives 0.142, 3.0 gives 0.157, 1.5 gives 0.202, 0.8 gives 0.249, 0.4 gives 0.296. Deeper than about 3 and the pool is never spent -- lysis was 0.012 of endings, so the mechanic existed without doing anything. Shallower than about 1 and a phagocyte kills in a quarter of a second of contact, which is a coin flip on who touches whom first rather than a fight. 1.5 is where cyclic triples peak (0.094) while lysis is a tenth of all endings, and it is the first constant in this project to move the kill rate at all: six earlier sweeps -- attack strength, predation gain, grip, reach, poison bite, poison drag -- moved it by nothing, because they all tuned a contest whose outcome was decided by the resource you gave up grazing to enter it."
    },
    {
     "name": "repair_per_atp",
     "value": 0.5,
     "ratio": "1/2",
     "doc": "Integrity restored per ATP spent repairing."
    },
    {
     "name": "repair_max_rate",
     "value": 3,
     "ratio": null,
     "doc": "Ceiling on how fast a cell can pour ATP into repair. Without a cap, a cell with a full tank shrugs off any wound instantly and the pool stops being a pool. With one, repairing is a rate you have to sustain -- and you can only sustain it where there is food to burn, which is what finally makes the dish positional: driven onto stripped ground, your wounds stay."
    },
    {
     "name": "engulf_cost",
     "value": 4,
     "ratio": null,
     "doc": "ATP to attempt an engulfment, and how much larger the attacker must be. Cheap to do, hard to earn. Engulfment used to be a label: run out of ATP while something bigger touched you and the replay called it eating. It is now a deliberate act with a price and a precondition, which gives phagocytosis a win condition of its own rather than a way of describing somebody else's starvation. The precondition is what makes a build out of it. A phagocyte wants mass, and against something its own size it cannot simply swallow -- it has to wear the thing down first, because a damaged cell is a smaller cell. Every mechanic in the engine feeds that chain: attacks thin a membrane, an empty cell collapses, a collapsed cell eats itself to survive, and eating itself is what finally brings it inside the ratio."
    },
    {
     "name": "engulf_ratio",
     "value": 1.15,
     "ratio": "115/100",
     "doc": null
    },
    {
     "name": "turgor",
     "value": 0.3,
     "ratio": "3/10",
     "doc": "How much of a cell's size is turgor it loses as its membrane goes. Nought means damage never shrinks you and engulfment can only be set up by starving somebody; one means a spent membrane leaves nothing at all."
    },
    {
     "name": "autophagy_rate",
     "value": 1.5,
     "ratio": "3/2",
     "doc": "Integrity per second a collapsed cell eats to stay alive, and the ATP it gets back per unit. Running out of ATP used to kill a cell outright, which is a strange death for something with an intact membrane and a waste of the most dramatic moment available: a helpless opponent nobody is required to finish. Now an empty cell collapses -- it cannot thrust, attack or mend -- and starts consuming itself. Autophagy is one mechanic doing the work of two. Eating your own membrane for energy is both the last-ditch recovery and the reason the membrane degrades while you are down, so a collapsed cell is on a clock of its own making. Get back up and you are thinner for it; do not, and there is nothing left to open."
    },
    {
     "name": "autophagy_yield",
     "value": 2,
     "ratio": null,
     "doc": null
    },
    {
     "name": "collapse_recover_atp",
     "value": 6,
     "ratio": null,
     "doc": "ATP a collapsed cell must claw back before it can act again."
    },
    {
     "name": "poison_membrane_share",
     "value": 1,
     "ratio": null,
     "doc": "How much of a poison bite lands on the membrane rather than on ATP. Zero is a purely metabolic poison that starves you; one is a corrosive that dissolves you. The seam for two distinct toxin organelles later."
    },
    {
     "name": "size_weight",
     "value": 1,
     "ratio": null,
     "doc": "How much the size difference matters, in [0, 1]. The size term is 1 + weight * (r_attacker / r_target - 1), so zero removes size from the interaction entirely and one is the raw ratio. Exists so the question \"is mass still buying wins?\" can be measured rather than argued about — every previous attempt to answer it by reasoning got it wrong."
    }
   ]
  },
  {
   "title": "The commitment law (see Cell::charge)",
   "consts": [
    {
     "name": "charge_attack_scale",
     "value": 5,
     "ratio": null,
     "doc": "Stored charge that doubles outgoing drain."
    },
    {
     "name": "charge_defence_scale",
     "value": 4,
     "ratio": null,
     "doc": "Stored charge that halves what still gets through your defence."
    },
    {
     "name": "charge_leak",
     "value": 0.2,
     "ratio": "1/5",
     "doc": "Fraction of stored charge lost per second. Commitment is spent whether or not you needed it. Holding a loaded rock costs you continuously, so there is no banking it indefinitely."
    },
    {
     "name": "charge_radius_gain",
     "value": 0.0025,
     "ratio": "25/10000",
     "doc": "Radius added per unit of stored charge. The telltale. Stored commitment has to sit somewhere, so a loaded cell is fractionally swollen — which makes it slower and a larger target, and is visible to anyone watching velocity, because size and velocity are already public under A8. Nothing new is exposed and no flag is set; it falls out of the same radius the rest of the physics already uses. Deliberately not documented for players at launch. Extant and exploitable, per Ian."
    },
    {
     "name": "drain_upkeep_fraction",
     "value": 0.2,
     "ratio": "1/5",
     "doc": "ATP spent per unit of ATP drained. Proportional, so pressing an attack you cannot land is free and pressing one hard is not."
    }
   ]
  },
  {
   "title": "The resistance law (see Cell::resistance)",
   "consts": [
    {
     "name": "membrane_reduction",
     "value": 0.5,
     "ratio": "1/2",
     "doc": "Fraction of incoming drain removed. Paid for in mass."
    },
    {
     "name": "efflux_reduction",
     "value": 0.8,
     "ratio": "4/5",
     "doc": "Paid for in ATP, and only while the pumps are running."
    },
    {
     "name": "encyst_reduction",
     "value": 0.95,
     "ratio": "19/20",
     "doc": "Paid for in time: you cannot act at all."
    },
    {
     "name": "efflux_cost",
     "value": 5,
     "ratio": null,
     "doc": null
    },
    {
     "name": "efflux_spinup",
     "value": 0.5,
     "ratio": "1/2",
     "doc": "Seconds to reach full protection. Running the pumps late is worse than not running them, which is what makes efflux a prediction problem."
    },
    {
     "name": "encyst_transition",
     "value": 1.5,
     "ratio": "3/2",
     "doc": "Seconds to enter, and to leave. Unprotected throughout both."
    },
    {
     "name": "encyst_upkeep",
     "value": 0.1,
     "ratio": "1/10",
     "doc": null
    }
   ]
  },
  {
   "title": "A3, pseudopod shape control",
   "consts": [
    {
     "name": "shape_min",
     "value": 0.7,
     "ratio": "7/10",
     "doc": null
    },
    {
     "name": "shape_max",
     "value": 1.3,
     "ratio": "13/10",
     "doc": null
    },
    {
     "name": "shape_rate",
     "value": 0.15,
     "ratio": "15/100",
     "doc": "Shape units per second. 0.15/s covers the +-30% range in ~2 s."
    }
   ]
  },
  {
   "title": "A8, chemoreception [v0.4]",
   "consts": [
    {
     "name": "chemo_substrate_cost",
     "value": 8,
     "ratio": null,
     "doc": null
    },
    {
     "name": "chemo_cooldown",
     "value": 1.5,
     "ratio": "3/2",
     "doc": null
    },
    {
     "name": "chemo_exact_range",
     "value": 12,
     "ratio": null,
     "doc": "Within this range the reading is an exact bucket."
    },
    {
     "name": "chemo_size_bias",
     "value": 0.4,
     "ratio": "2/5",
     "doc": "How much of a sensing range comes from size rather than being flat. At 0 the ranges are the old constants and size means nothing. At 1 they scale linearly with radius, which is too harsh: the lightest legal build would resolve an exact reading only 0.8 units outside contact, by which point incoming has already told it everything. 0.4 keeps both ends useful while still making size a signature."
    },
    {
     "name": "chemo_coarse_range",
     "value": 30,
     "ratio": null,
     "doc": "Within this range the reading is weak/strong only. Beyond it, nothing."
    },
    {
     "name": "chemo_starving_below",
     "value": 25,
     "ratio": null,
     "doc": null
    },
    {
     "name": "chemo_low_below",
     "value": 75,
     "ratio": null,
     "doc": null
    },
    {
     "name": "chemo_healthy_below",
     "value": 150,
     "ratio": null,
     "doc": null
    },
    {
     "name": "basal_cost_per_mass",
     "value": 0.07,
     "ratio": "7/100",
     "doc": "Basal metabolic cost, in ATP per second per unit of mass. Absent from the design as written, and its absence is why nothing is scarce: a cell spends 4-7% of its available energy over a whole match, and any build with four mitochondria out-produces the maximum possible incoming damage. Charging for existing does three things at once — mass stops being free, production stops being surplus, and feeding becomes necessary rather than optional. Zero reproduces the design as written."
    }
   ]
  },
  {
   "title": "A7, timeout scoring",
   "consts": [
    {
     "name": "score_harvest_weight",
     "value": 1,
     "ratio": null,
     "doc": "Weight on substrate taken from the dish. Scoring on territory rather than on reserves is the lever against hoarding: ATP + substrate is conserved under conversion (review finding 2, correctly fixed) but still pays a cell for sitting still."
    },
    {
     "name": "score_reserve_weight",
     "value": 0.01,
     "ratio": "1/100",
     "doc": "Weight on ATP + substrate remaining. Set low to make reserves a tiebreak rather than the whole score."
    }
   ]
  },
  {
   "title": "A7, the match",
   "consts": [
    {
     "name": "match_ticks",
     "value": 1800,
     "ratio": null,
     "doc": null
    }
   ]
  }
 ],
 "movement": [
  {
   "name": "flagellum",
   "mass": 12,
   "thrust": 400,
   "turn_rate": 0.16666666666666666,
   "atp_per_s": 0.8,
   "drag_k": 10
  },
  {
   "name": "cilia",
   "mass": 16,
   "thrust": 1800,
   "turn_rate": 1,
   "atp_per_s": 1.6,
   "drag_k": 80
  },
  {
   "name": "pseudopod",
   "mass": 8,
   "thrust": 600,
   "turn_rate": 1000,
   "atp_per_s": 0.4,
   "drag_k": 48
  }
 ],
 "total": 115,
 "undocumented": [
  "toxin_mass",
  "pilus_mass",
  "membrane_mass",
  "efflux_mass",
  "encyst_mass",
  "mito_mass",
  "mito_max",
  "start_atp",
  "start_substrate",
  "apoptosis_decay",
  "dish",
  "genome_max_nodes",
  "toxin_strength",
  "pilus_strength",
  "toxin_reach",
  "points_kill_mid",
  "points_kill_slow",
  "points_timeout_win",
  "points_timeout_loss",
  "points_draw",
  "points_double_loss",
  "points_mid_ticks",
  "phago_poison",
  "toxin_poison",
  "pilus_poison",
  "pilus_reach",
  "engulf_ratio",
  "autophagy_yield",
  "efflux_cost",
  "encyst_upkeep",
  "shape_min",
  "shape_max",
  "chemo_substrate_cost",
  "chemo_cooldown",
  "chemo_starving_below",
  "chemo_low_below",
  "chemo_healthy_below",
  "match_ticks"
 ]
}