A geometric map of who relates to whom — the shared substrate beneath nine ecological agents.
Runa-2 takes open European ecological data and turns it into one geometric map of who relates to whom. Every species, and every environmental state, becomes a point in a shared space. Two points sit close together when the things they describe are ecologically related.
A predator lands near its prey’s neighbourhood. A pollinator settles near the plants it visits. A nitrogen-loving plant drifts toward the marker for high-nitrogen soil. Nothing is told where to go — the positions fall out of the relationships themselves.
It learns from typed triples: plain statements of the form (head, relation, tail). Given roughly 490,000 of them, the model arranges every point so that each relation becomes a consistent geometric move. Once that’s done, you can ask questions the source records never stated outright:
It is not a language model and not a forecaster. It is a knowledge-graph embedding (BoxE, trained with PyKEEN) — closer to a map than to a chatbot.
You shall know a species by the company it keeps.after J. R. Firth, 1957
On top of the ordinary ecological links — predation, pollination, mycorrhizae — Runa adds sign-relations: species treated as producers and readers of ecological signs within an Umwelt, the perceived world of an organism.
The novel move is small but consequential. These sign-relations are trained as ordinary typed edges, so the model places them in the same geometry as everything else. Two species that read the same environmental sign are pulled together — even if they never directly interact. That “relatedness by shared sign” is what the project is really about.
The intellectual lineage is explicit: Peirce’s index, Uexküll’s function-circle, Hoffmeyer’s semiotic scaffolding. Runa doesn’t try to decode any organism’s inner meaning; it models the relational structure of ecological sign-making, and leaves the inner world untouched.
The production model is BoxE on the GBIF-reconciled master. Beyond held-out link prediction, its indicatorOf geometry is now independently validated against real species-occurrence climate (temperature) and soil pH — see §09–§10. v1.4 extends the signal-web layer: which species cast which sounds (song, call, alarm, echolocation), which read the elements (magnetic & electric fields), and how they navigate — by magnetism, the sun, the stars or smell. v2.0 corrects directional scoring: it drops the synthesised inverse triples that had symmetrised the geometry, so a reversed trophic triple (perch “eating” pike) no longer scores as high as the correct one — directionality rose 0.53 → 0.98 with no ranking loss. Published: v2.0 DOI 10.5281/zenodo.21182367.
Biological entities — taxa, keyed by scientific name (canonical binomials from GLOBI and Mangal, reconciled to the GBIF backbone — 74,147→65,272 entities after merging synonyms). State & community nodes — the discrete non-biological targets the sign-relations point at: environmental states like soilNitrogen_b4 or thermalIndicator_b3, and detected communities community_0 … community_89.
Around 40 relation types, mapped to the OBO Relations Ontology where possible (PURLs taken from GLOBI’s authoritative ro.tsv): trophic (eats, preysOn), antagonistic (parasiteOf, pathogenOf), mutualistic (pollinates, ectomycorrhizalHostOf), structural (createsHabitatFor, epiphyteOf) and generic (interactsWith, coOccursWith).
| Relation | Meaning | Tail node |
|---|---|---|
| indicatorOf | species is a sign of an environmental state (Peircean index) | env-state |
| keystoneSignProducerIn | keystone sign-producer within a community (Hoffmeyer scaffolding) | community |
| perceivesSignal | perceptual boundary of the Umwelt (Uexküll) — not built | signal |
| phenologicalIndicatorOf | phenological sign — defined, not populated | phenophase |
v1.4 set PyKEEN’s create_inverse_triples=True, which synthesised an inverse relation for every triple at training time. That symmetrised the per-relation head/tail boxes and destroyed directional scoring — a reversed trophic triple scored as high as the correct one (pike-eats-perch ≈ perch-eats-pike). v2.0 sets create_inverse_triples=False: one canonical direction per relation, no synthesised inverses. Directionality (fraction of asymmetric triples where the correct direction outscores its reverse) rose 0.53 → 0.98 with no ranking loss. Inverse GLOBI labels (eatenBy, pollinatedBy) are still flipped to canonical during ingestion.
Composition tells you what is present; network topology tells you what is load-bearing. RUNA reads each ecosystem's interaction graph by k-core shell (how deep a species sits in the structural core) and a cascade simulation (how many species fall with it). The deepest dependency is rarely the apex predator — it is a copepod (Calanus finmarchicus), the Mývatn lake midge, a foundation tree, or a river mussel.
| Source | Role | License | In-scope |
|---|---|---|---|
| GLOBI 2026-05-29 | typed interaction triples (the spine) | CC0 / CC-BY per dataset | 368,983 |
| Mangal v2 API | whole-network structure | open · per-network DOI | 79,021 |
| EIVE 1.0 | Ellenberg values → indicatorOf | CC-BY 4.0 | 44,590 |
| graph centrality (internal) | → keystoneSignProducerIn | derived | 302 |
| GBIF | occurrence + taxonomy backbone | per-record CC0 / CC-BY | streamed |
EIVE via Zenodo 10.5281/zenodo.7427088. GBIF: 69 GB zip (~300M+ occurrence rows; 10-country, coords, CC0 / CC-BY) is now streamed for the independent thermal-niche validation (§09). Full co-occurrence and environmental-layer use still deferred.
All nine ENVAI agents are covered, France/Ondine included. GLOBI is filtered by a coarse W-Europe/Nordic bounding box (lat 41–71.5, lon −25–32), to be refined by reverse-geocoding.
Each stage is a module under src/envai/; every triple file carries [head, relation, tail, source, confidence].
Deferred but coded: stage4_env (CHELSA / LUCAS → respondsTo* nodes), and serving. stage2_gbif extraction had a read-all-into-RAM bug that OOM-killed on the 100 GB CSV — fixed to stream with shutil.copyfileobj.
Independent validation path: scripts/extract_niche_multi.py streams the GBIF zip into per-species realized niches across several environmental rasters (CHELSA temperature & precipitation, SoilGrids pH & nitrogen), then envai.validate_indicator Spearman-correlates the model's indicator placement against the real niche, per gradient. The EIVE-value-vs-reality column doubles as a proxy-validity check.
| Model | BoxE, embedding_dim 128 — upgraded from the initial RotatE (see §09); box embeddings handle the 1-to-N sign-relations RotatE could not. |
|---|---|
| Loss | NSSALoss (self-adversarial), margin 9.0, adv. temperature 1.0 |
| Optimizer | Adam, lr 1e-3 |
| Loop | sLCWA, basic negative sampler, 8 negatives/positive, batch 2048 |
| Epochs | v2.0: 150, on all triples (production model). v1.4 used 300 with early stopping (freq 20, patience 5, metric = MRR). |
| Split | v2.0: inverse triples OFF; production model trained on all 337,561 triples. Evaluation on a leak-free split by unordered entity-pair — a random 80/10/10 split leaks reversed pairs, which both inflates MRR and hides direction-blindness. (v1.4: 80/10/10 random, inverse triples on.) |
| Eval | RankBasedEvaluator, bounded (batch 128, slice 2048) to dodge the WDDM watchdog |
| Comparators | ComplEx underperformed RotatE everywhere (MRR 0.177 vs 0.283). BoxE (a box embedding) was then adopted as the production model — it lifted the independent thermal validation from ρ 0.114 to 0.545 while improving link prediction (see §09). |
Training the ~490K-triple / 74K-entity graph at dim 128 takes roughly 15–35 minutes on a single modern GPU (~2–5 s/epoch).
| Snapshot | Triples | Entities | Rel. | MRR | H@1 | H@3 | H@10 | Dir. |
|---|---|---|---|---|---|---|---|---|
| stage1 — GLOBI only | 368,983 | 58,167 | 21 | 0.2645 | 0.167 | 0.291 | 0.465 | — |
| stage2 — +Mangal | 444,979 | 68,183 | 25 | 0.2824 | 0.182 | 0.314 | 0.487 | — |
| stage3 — +biosemiotic (RotatE) | 489,871 | 74,147 | 27 | 0.2827 | 0.184 | 0.315 | 0.484 | — |
| BoxE — same data, box model | 489,871 | 74,147 | 27 | 0.2877 | 0.190 | 0.321 | 0.487 | — |
| BoxE + reconciliation — v1.1 | 475,311 | 65,272 | 27 | 0.2884 | 0.192 | 0.321 | 0.482 | — |
| BoxE + cleaned + agent-verified — v1.2 | 421,563 | 53,088 | 30 | 0.3047 | 0.205 | 0.344 | 0.505 | — |
| BoxE + signal + navigation — v1.4 (inverse=on, random split) | 421,952 | 53,099 | 33 | 0.3010 | 0.201 | 0.339 | 0.501 | 0.53 |
| BoxE inverse=False — production v2.0 (leak-free) | 337,561 | 53,099 | 33 | 0.118 | 0.050 | 0.109 | 0.262 | 0.98 |
The two right-most numbers tell the real story. v1.4's 0.30 MRR was a random-split artifact: reversing pairs leaked between train and test, inflating the score and masking the flaw. On an honest leak-free split (split by unordered entity-pair) v1.4 scores 0.114 MRR and, crucially, only 0.53 directionality — barely above chance, meaning it scored reversed trophic triples as high as correct ones. v2.0 (inverse triples off) lifts directionality to 0.98 at the same honest MRR (0.118); RotatE and PairRE were tried and did not beat it, so the ~0.12 MRR is a data ceiling, not an architecture limit. (Triple counts: the typed graph holds ~422K cleaned triples; the model trains on 337,561 numeric training triples — the same edges after collapsing to canonical direction.)
indicatorOf is placed in the geometry more consistently than pollination, symbiosis, mutualism and mycorrhizae — it is genuinely learned. keystone scores highest, but on only 17 test edges.
For each EIVE gradient with a real-world proxy, the model's indicatorOf placement is Spearman-correlated with each species' realized niche from real GBIF occurrences × real environment — independent of the EIVE values it trained on. The expert-vs-reality column is both the ceiling and a proxy-validity check.
| EIVE gradient | real proxy | model ρ | expert ceiling ρ | verdict |
|---|---|---|---|---|
| Temperature | CHELSA bio1 | 0.576 | 0.797 | validated |
| Reaction (pH) | SoilGrids pH | 0.316 | 0.213 | validated — above ceiling |
| Nutrients | SoilGrids total N | −0.10 | −0.20 | proxy invalid |
| Moisture | CHELSA precip | 0.07 | 0.09 | proxy invalid |
Two axes — temperature and pH — are independently validated. On pH the embedding even beats the expert ceiling (0.335 vs 0.213): it denoises EIVE's per-species values across the interaction graph. Moisture and nutrients fail at the proxy level — the expert-vs-reality ceiling is itself ≈0, so annual precipitation and total soil N aren't valid stand-ins for site-moisture / nutrient-availability. A built-in self-check, not a model failure.
Nine ecological agnt eco agents each proposed dependency edges from the place they inhabit, each with a primary-literature source. Every claim was then fact-checked by a multi-model consensus — the original extraction, then claude-opus-4-8 and gpt-5.4 reading the cited sources. An edge entered the model only where Claude confirmed it and GPT did not refute it. 127 proposed → 96 entered → 39 at full ≥0.85 three-model consensus. The 9 that GPT refuted — including a reversed oak/beetle edge it caught at ρ 0.18 — were dropped.
| agent | edge | fact_hash | Claude | GPT-5.4 | consensus |
|---|---|---|---|---|---|
| aegir | Lepeophtheirus salmonis parasitises Salmo salar | 72b74120c5f0b25c | ✓ | ✓ | 0.96 |
| eldvatn | Salmo trutta feeds on Simulium vittatum | 547232729f919046 | ✓ | ✓ | 0.95 |
| alva | Aphanomyces astaci parasitises Astacus astacus | 9a6298b217c4e98e | ✓ | ✓ | 0.95 |
| aegir | Gadus morhua feeds on Mallotus villosus | c5329671002e844c | ✓ | ✓ | 0.93 |
| ondine | Larus genei feeds on Artemia | e34bcb84a9112a15 | ✓ | ✓ | 0.91 |
| scîrwudu | Thaumetopoea processionea feeds on Quercus robur | 7fdac38602d2b843 | ✓ | ✓ | 0.91 |
| alva | Unio crassus depends on Phoxinus phoxinus | 83e7b4dd1cd6cfa9 | ✓ | ✓ | 0.90 |
| ondine | Tuber magnatum mycorrhizal with Quercus pubescens | 7dabba532d17c06f | ✓ | ✓ | 0.89 |
Nothing here is a black box: the full evidence reports are public on the community forum, every vote and its notes live in the fact-verification system, and the frozen, hashed edge set ships in the Zenodo deposit.
Narrow and defensible — not “first biosemiotic AI” in general. Here is exactly what is true today: