species.agnt.eco

Species: start here (read before touching any species)

This is the operating manual for the species of the nine AGNT ECO agents (Älva, Ægir, Scaldis, Maas, Scîrwudu, Norppa, Ondine, Haingeist, Eldvatn). It is the same text on the server, on skills.agnt.eco (skill "species-start-here"), on species.agnt.eco/how and in the knowledge graph (:SpeciesPolicy). If you are a Claude session, an agent or a person about to add, hide, show, verify or "fix" a species: read all of this first. Owner of these rules: Amir. Established 2026-09-29 to 2026-10-01.

The rules (Amir's words, not negotiable)

  1. Literature is proof. A species is shown on an agent's page only when a passage in that agent's own library names it in the agent's own place. The passage travels with it (DOCUMENTED_IN edge with cchips).
  2. One top source is enough. One tier 1-2 source (peer-reviewed, or a national agency) about the place counts on its own. Otherwise two documents.
  3. Citizen science is an indication, never proof. GBIF, iNaturalist, observation.org, eBird, Artportalen: these say where to LOOK. The observed list, most-observed first, IS the research query list. No count, however large (not 100, not 10,000), puts a species on the page.
  4. No scientific evidence = hide. Then search official sources for it ("the other way").
  5. Never delete. Hide with <agent>_hidden = true + _hidden_at + _hidden_by + _hidden_reason. Back up every node before any write (/root/<agent>_<step>_backup_<date>.json).
  6. RUNA is hypothesis only. runa_added = true is never evidence; a RUNA guess becomes visible only when the passage scan proves it (then runa_added=false, runa_lit_confirmed_at, runa_added_original kept).
  7. Facts are attached, verified later. Every shown species gets one candidate fact, "<Common> (<Scientific>) occurs in <the agent's water>.", category "Species presence", dated and tagged, linked ABOUT the species. Only through the verification MCP. Do not verify in the same pass.
  8. Report literature-backed species first, in their own section. Short and plain.
  9. Three names for every species: Latin, English, local. scientific_name (Latin), common_name (English) and the agent's own language in name_<lang> (name_swe, name_nor, name_nld, name_fin, name_fra, name_deu, name_isl; a shared node keeps one field per language). Filled from the GBIF backbone vernacular names (species_engine/fill_taxa.py, fill_local_names.py); a species with no name in a language keeps the field empty, never an invented one. Wherever a species is shown, the common name stands beside the Latin name.

How to READ the current state (no writes)

How to ADD or CHANGE species (the only way)

Scripts: /srv/projects/dreaming/species_engine/ (WORKFLOW.md there has every detail and every trap). Run on the server (root@77.42.6.111), conceptum venv unless noted:

  1. Area: /srv/ops/area_drafts/<agent>.geojson + .wkt (check it against the agent's gazetteer first).
  2. citizen_area.py <agent> (verification venv) -> the search plan.
  3. Library review: library_placecount.py <agent>; set off-domain documents aside (excluded, reversible).
  4. species_rescan.py <agent> -> /tmp/<agent>_rescan/report.json (SHOW / REVIEW / RESEARCH / GONE / NONE).
  5. Red-flag pass: read the SHOW list with snippets; vernonly.py <agent> for name-only hits. Fix and re-run.
  6. apply_fill.py <agent> (plan) then --apply.
  7. hide_untraced.py <agent> (plan) then --apply.
  8. mint_presence_facts.py <agent>.
  9. engine_queue.py <agent> (sources venv) + rebuild_queue.py <agent> -> research queue; scope files for library top-ups in /srv/ops/ingest_queue/.
  10. Ingest the queue: push the queued documents to the chunker with a stated purpose (push_corpora.py, see the library-ingest and library-pipeline-health skills), collect the passages, then re-run from step 4. A queue that is built and never ingested changes nothing; the nightly dream flags it (ingest_queue_stale).
  11. presence_verify.py --agent <agent> (verification venv): the separate verification pass over the candidate presence facts, local model reading the linked passages, one pass per fact through the verification MCP. Until it has run, "proof" on the page means "a passage was found", not "a verifier confirmed it"; the dream flags the backlog (presence_facts_unverified).

A new document only changes the page after step 4 onwards is re-run. Adding a species by hand, by count, by "I know it lives there", or by RUNA is not allowed.

Never do this

Relations between species (what eats, hosts, parasitises or displaces what)

A relation is recorded only when a passage in the agent's OWN library states it. Never from general knowledge, never from a model's belief, never from co-occurrence on a list.

Yearly rhythm (when a species is active)

Raw citizen-science month counts measure when PEOPLE go out (summer, weekends, survey days), not when the species is active. Tested on 2026-10-03: raw counts put the great tit's peak on bulk-survey dates and end the swift's season too early. Never write a raw curve. Use, per group, in this order:

  1. Birds: eBird Status & Trends (Cornell; weekly relative abundance, observer effort modelled out; free access key for non-commercial research, tied to an eBird account, requested by Amir).
  2. Butterflies: European & Maghreb Butterfly Trait database (Middleton-Welling et al. 2020, flight months per species, open; /srv/ops/phenology_sources/butterfly_flight_months.json). Gives a window, Europe-wide.
  3. Fungi: ClimFun fruiting phenology (Zenodo 4971099, CC0; fruiting day mean and 2.5-97.5 percentiles on a 10 km grid, autumn and spring sets; /srv/ops/phenology_sources/). Checked: fly agaric Sep, porcini Sep, chanterelle Aug, morel May.
  4. Flowering plants, ferns, amphibians and reptiles: GBIF records at country level, NOT corrected. They are recorded when they flower or are active, so the observer season and their own season coincide. Effort correction breaks them: one winter photo of a rosette divided by an almost empty winter baseline became the "peak" (dark mullein in November, sow-thistle in December, the common frog in September). Raw: mullein July, sow-thistle July, frog March.
  5. Other animals (insects, molluscs, fish, birds without eBird, bats): effort-corrected GBIF. Records of the species divided by all records of its class in the same area and month, with a floor (no month counts as more than four times quieter than average) and light circular smoothing, so single records cannot make a peak. Drawn areas when they hold at least 100 records, otherwise the agents' countries (at least 20). GBIF has no class for ray-finned fish, so fish are compared with all records of the common fish orders together (checked: Vänern salmon Apr-May and Aug-Oct, Lofoten herring Dec-Mar). A two-season species shows both windows ("Mar, Nov").
  6. Visible or active all year: no curve, activity_pattern = year-round. Lichens, mosses, bracket fungi, trees and shrubs (willow, hazel, hawthorn, elder, ivy, heather and the other woody genera), mammals except bats. Their counts show when people walk outside (the tinder fungus "peaks" in April, when the leaves are off).
  7. No usable source: no curve. The old raw curve is kept only as activity_curve_raw, never shown.

One curve per species: for a species shown by several agents it is computed over all their areas together. Script: species_engine/fill_rhythm_v2.py (--dry --agent <a> --limit <n> first). The raw values are kept once as *_raw; backups in /root/rhythm_v2_backup_*.json. Every curve records its source in traits_source. Plants: BiolFlor (UFZ) holds German flowering months but has no public API; PEP725 covers about 265 species, mostly trees; until one of those is obtained, plants use rule 4. Applied to all page species on 2026-10-03 (fill_rhythm_v2.py). Checked by hand: nightjar May-Jul, swift May-Jul, whooper swan at Vänern March and Oct-Nov (staging), crane over the Hainich Oct-Nov, puffin at Lofoten May-Jul, magpie and great tit year-round, fly agaric Sep, morel May.

Where to read the state (never copy numbers into this manual)

Numbers go stale the moment anything runs; this manual carries none. Read the live state from:

History that explains the state