How organisms perceive and act

An organism's entire relationship with the world runs through 53 numbers in and 8 numbers out. This page lists all of them, with what each one measures. Every row is generated from the modules that define it, so it cannot drift out of date without the site failing its own tests.

Implementation Ruleset pre-genesis-candidate-v2 Source: src/el/perception.py, src/el/objects.py, src/el/tick.py

One design rule, applied everywhere

No sensory channel is semantic. There is no channel for "food", "predator", "danger", "fire", "kin" or "prey". Every channel reports a generic physical quantity: an intensity, a density, a mass, a temperature, a fraction of neighbouring cells.

This matters more than it sounds. A channel called "food nearby" would embed the designer's judgement about what counts as food into the organism's perceptual apparatus, and any subsequent food-seeking behaviour would then be partly the designer's doing. A channel reporting resource intensity in a direction embeds nothing: whether that number is worth approaching is something evolution has to find out.

Emergent Life implementation

The clearest case is heat. Objects can burn. There is no channel reporting that anything is burning, and no flag for whether a cell is safe. There are two channels reporting excess temperature over ambient, here and in the surrounding ring, as continuous intensities. An organism senses that matter nearby is hotter than the air. It is told nothing about what that means.

Nothing is global

Every channel is either the organism's own internal state or a reading taken within its own inherited sensing radius, which is between 2 and 6 cells. There is no map, no population count, no view of the other island, no knowledge of where resources are richest. The directional sector channels are the widest view any organism has, and at the largest sensing radius that is a 6-cell reach in each of four directions.

Sensing costs energy, and the cost scales with the square of the radius, so a wider view is a real metabolic commitment rather than a free upgrade. See energy and metabolism for the full cost table.

Some channels are deliberately one tick late

Four channels report what happened as a result of the organism's own previous action: whether it succeeded, whether the movement was blocked, and how much matter the last push or pull actually moved. None of them can report within the same tick.

That is not an implementation shortcut. Every organism perceives the world as it stood at the start of the tick, before anything in that tick has happened, so that all organisms decide against the same frozen state and the outcome does not depend on the order they are processed in. A consequence sensed in the same tick as its cause would break that. So an organism can learn that its last attempt failed, but never that its current one has.

All 53 sensory channels

Channel indices are stable for the life of a universe. The Brain Inspector uses these same indices and these same labels, so a number you see in the live panel can be looked up here directly.

Its own body

#ChannelRangeWhat it measures
0 Energy reserve
energy
0.0 to 2.0 Stored energy against a fixed reference. Above 1.0 means better stocked than the reference organism.
1 Gut fullness
gut
0.0 to 1.0 Undigested material held, against this organism's own genetically scaled gut capacity.
2 Health
health
0.0 to 1.0 Against this organism's own genetically scaled health ceiling.
3 Recent injury
recent_damage
0.0 to 1.0 A decaying average of thermal and contact injury taken recently.
4 Age
age
0.0 to 1.0 Ticks lived against a fixed reference. Saturates; an old organism cannot tell how old.
5 Metabolic load
metabolic_load
0.0 to 1.0 A decaying average of what recent ticks have cost it.
6 Thermal stress
thermal_stress
-1.0 to 1.0 Signed distance from the fixed thermal optimum, divided by this organism's own tolerance width. Negative is too cold.
7 Time since reproducing
repro_readiness
0.0 to 1.0 Ticks since its last successful reproduction, against its own inherited refractory period. Reaches 1.0 when the cooldown is served.

The cell it stands on

#ChannelRangeWhat it measures
8 Light here
light_here
0.0 to 1.0 Light at its own cell.
9 Temperature here
temperature_here
0.0 to 1.0 Ambient temperature plus any heat radiating from matter at this cell. Saturates next to genuinely hot matter.
10 Moisture here
moisture_here
0.0 to 1.0 Moisture at its own cell.
11 Movement resistance here
resistance_here
0.0 to 1.0 How much the terrain at this cell resists movement.
12 Resource here
resource_here
0.0 to 1.0 Abiotic resource at this cell as a fraction of what this cell can hold.
13 Detritus here
detritus_here
0.0 to 1.0 Dead organic matter at this cell, against a fixed reference.

The eight cells around it

#ChannelRangeWhat it measures
14 Neighbours occupied
occupied_ring
0.0 to 1.0 Fraction of the eight surrounding cells holding another organism. No identity, lineage or size is sensed.
15 Neighbours impassable
impassable_ring
0.0 to 1.0 Fraction of the eight surrounding cells it cannot walk into.

Four directions, out to its sensing range

#ChannelRangeWhat it measures
16 Resource density, north
resource_north
0.0 to 1.0 Mean resource intensity in this sector, out to its own inherited sensing radius.
17 Resource density, east
resource_east
0.0 to 1.0 Mean resource intensity in this sector, out to its own inherited sensing radius.
18 Resource density, south
resource_south
0.0 to 1.0 Mean resource intensity in this sector, out to its own inherited sensing radius.
19 Resource density, west
resource_west
0.0 to 1.0 Mean resource intensity in this sector, out to its own inherited sensing radius.
20 Detritus density, north
detritus_north
0.0 to 1.0 Mean detritus intensity in this sector.
21 Detritus density, east
detritus_east
0.0 to 1.0 Mean detritus intensity in this sector.
22 Detritus density, south
detritus_south
0.0 to 1.0 Mean detritus intensity in this sector.
23 Detritus density, west
detritus_west
0.0 to 1.0 Mean detritus intensity in this sector.
24 Occupancy density, north
occupancy_north
0.0 to 1.0 Fraction of cells in this sector holding an organism.
25 Occupancy density, east
occupancy_east
0.0 to 1.0 Fraction of cells in this sector holding an organism.
26 Occupancy density, south
occupancy_south
0.0 to 1.0 Fraction of cells in this sector holding an organism.
27 Occupancy density, west
occupancy_west
0.0 to 1.0 Fraction of cells in this sector holding an organism.
28 Passable ground, north
passability_north
0.0 to 1.0 Fraction of cells in this sector that are walkable terrain.
29 Passable ground, east
passability_east
0.0 to 1.0 Fraction of cells in this sector that are walkable terrain.
30 Passable ground, south
passability_south
0.0 to 1.0 Fraction of cells in this sector that are walkable terrain.
31 Passable ground, west
passability_west
0.0 to 1.0 Fraction of cells in this sector that are walkable terrain.

Matter nearby, and what it is carrying

#ChannelRangeWhat it measures
32 Matter nearby
object_density
0.0 to 1.0 Fraction of the nine cells here and around it holding a ground object.
33 Mass of nearby matter
object_mass
0.0 to 1.0 Mean mass of that matter. A generic physical property: material identity is never sensed.
34 Hardness of nearby matter
object_hardness
0.0 to 1.0 Mean hardness of that matter.
35 Nutrition in nearby matter
object_nutrition
0.0 to 1.0 Mean nutritional content of that matter.
36 Carrying something
is_holding
0.0 to 1.0 1.0 while it is holding an object, otherwise 0.0.
37 Mass of what it carries
held_mass
0.0 to 1.0 Mass of the held object, on the same scale as channel 33.

Heat coming from matter

#ChannelRangeWhat it measures
38 Heat from matter here
heat_here
0.0 to 1.0 Excess temperature over ambient at its own cell. Not a fire flag: it senses that something here is hotter than the air, not what that means.
39 Heat from matter around it
heat_ring
0.0 to 1.0 Mean excess temperature over ambient across the eight surrounding cells.

Signal and trace fields

#ChannelRangeWhat it measures
40 Signal field
signal_field
-1.0 to 1.0 The signal values other organisms broadcast here and around it last tick. Signals carry no built-in meaning: any meaning is whatever evolution gives them.
41 Trace field
trace_field
0.0 to 1.0 The persistent, decaying deposit left by past signalling here and around it.

What happened when it last acted

#ChannelRangeWhat it measures
42 Last action succeeded
prev_action_success
0.0 to 1.0 Whether its previous tick's attempted action succeeded. One tick late by design: no organism senses the result of an action in the tick it takes it.
43 Last move was blocked
prev_move_blocked
0.0 to 1.0 Whether its previous tick's movement was blocked. It is not told what blocked it.
44 Matter under it
ground_mass_here
0.0 to 1.0 Hardness-weighted mass of accumulated ground material at its exact cell, read live.
45 Last force had an effect
prev_force_effect
0.0 to 1.0 How much matter its last push or pull actually moved, and how far.

The cell directly ahead

#ChannelRangeWhat it measures
46 Matter in the cell ahead
ahead_mass
0.0 to 1.0 Effective mass in the cell nearest to the direction it last intended to move.
47 Cell ahead is passable
ahead_passable
0.0 to 1.0 Whether that cell can currently be walked into, accounting for accumulated matter.

The ground itself, and reshaping it

#ChannelRangeWhat it measures
48 Carrying ground material
carrying_substrate
0.0 to 1.0 1.0 while it is carrying a unit of ground substrate, otherwise 0.0. Separate from channel 36, which is about loose objects.
49 Ground built up or cut away here
column_here
-1.0 to 1.0 Signed count of substrate units piled on (positive) or dug out of (negative) its own cell, against untouched geology.
50 Step up or down ahead
ahead_step
-1.0 to 1.0 How much higher or lower the surface of the cell ahead is than its own. Positive is a step up.
51 Ground material available ahead
ahead_substrate
0.0 to 1.0 How much substrate could still be taken from the cell ahead. Zero means an attempt there would fail: it is submerged or already at bedrock.
52 Fill still needed ahead
ahead_fill_needed
0.0 to 1.0 How many units of material the cell ahead would still need before its surface reached the waterline. Zero on ground that is already above water.

All 8 action channels

The controller does not choose one action out of eight. It produces all eight values every tick. Two of them are a continuous movement vector, one scales how much the organism attempts to ingest, one is a continuous signal, and four are compared against a fixed threshold. Whether a thresholded attempt then succeeds is a separate question decided by the physics, not by the network.

Squash functions and thresholds read from el.neural and el.config.
#ChannelSquashGateWhat it does
0 Move east / west
move_x
tanh continuous Signed movement intention along x. Positive is east. Magnitude raises the movement cost.
1 Move south / north
move_y
tanh continuous Signed movement intention along y. Positive is south, matching the grid's own row order.
2 Ingest
ingest
sigmoid scales the attempt Not a yes/no decision: the value scales how much it attempts to take in from its own cell this tick.
3 Reproduce
reproduce
sigmoid over 0.5 Above the threshold it attempts to reproduce. Age, energy, cooldown and a free neighbouring cell all still have to be satisfied.
4 Push
push
sigmoid over 0.5 Above the threshold it attempts to push a ground object one cell in its movement direction. Allocated in Phase 3 under the placeholder name 'invest' and left unread until Phase H.
5 Pull
pull
sigmoid over 0.5 Above the threshold it attempts to drag a ground object toward itself. Allocated in Phase 1 under the placeholder name 'quiesce' and left unread until Phase M.
6 Grasp, release or strike
manipulate
sigmoid over 0.5 One channel, three outcomes decided by circumstance, not by the network: pick up an object, put down the one it holds, or make physical contact with whatever is in the cell it moved toward.
7 Signal
signal
tanh continuous A signed broadcast into the signal field plus a decaying deposit into the trace field. It costs energy in proportion to its magnitude and has no built-in meaning.

The channel names are archaeology

Three of the eight channels still carry the placeholder names they were allocated under in the project's earliest phases, and the source code still uses them: invest for what is now push, quiesce for what is now pull, and force for what is now grasp, release, or physical contact.

They were allocated as reserved outputs long before anything read them. Every evolved brain in every generation since has carried a full weight row for each, computed a value for each, and had that value discarded. When a later phase gave one of them a meaning, no brain needed migrating and no parameter was added: evolution simply started being able to see the consequences of a number it had been producing all along. The names were left alone because renaming them would have made the history harder to follow, not easier.

Emergent Life implementation

The manipulate channel is the clearest example of the physics deciding rather than the network. One value above one threshold produces three different outcomes depending on circumstance: if the organism is holding something, it releases it; if it is not holding anything and there is a ground object at its cell, it picks that up; if neither, it makes physical contact with whatever is in the cell it moved toward. The network has one channel and no way to specify which of the three it wants.

Attempting is not succeeding

This distinction runs through the whole simulation and through the live inspector. An organism whose reproduce channel is above threshold has attempted to reproduce. Whether it does depends on its age, its energy, its cooldown, and whether there is a free neighbouring cell, none of which it gets to decide. An organism whose push channel is above threshold has attempted a push. Whether anything moves depends on what is there and how heavy it is.

Attempts cost energy whether or not they work. That is why RN-001 mattered: 85 million push attempts producing 9,968 successes is not a neutral inefficiency, it is a population paying for an affordance it effectively did not have.