Skip to main content
GEN (Generative Entropic Noise) is the small-model stream that fills the ## Noise section of the body the entity reads. In code: NoiseEngine inside TonicBody (bumblebee/identity/soma.py). This page is the data-flow companion to Soma. Read that page for tuning and philosophy; read this one to see exactly what hits the noise LLM.
GEN is not the main model’s chain-of-thought. It does not receive raw tool outputs, full system prompts, or the entire chat log. It does not read body.md as input — it writes fragments that appear when the body is rendered and flushed.

When noise runs

TonicBody.maybe_tick_noise calls NoiseEngine.generate only if noise is enabled and noise.should_tick() is true (wall time since the last tick ≥ soma.noise.cycle_seconds). Call sites:
  1. Presence daemon heartbeat (bumblebee/presence/daemon.py) — builds journal_tail + conversation_tail from the live entity.
  2. After each committed turn (Entity._tick_noise_post_turn in bumblebee/entity.py) — the noise clock is reset so GEN can refresh during active chat.
Ebb: If soma.ebb is on with skip_post_turn_noise_when_quiet: true, post-turn regeneration may be skipped when the presentation tier is quiet (low salience).

What is passed into each generate call

Model: soma.noise.model if set, else reflex/deliberate fallback. Temperature and max_tokens come from soma.noise (default max_tokens is sized for 2–7 short fragments per tick).

Exogenous seed sources (NoiseSeeder)

Before GEN generates fragments, the NoiseSeeder (bumblebee/identity/noise_seeder.py) selects one exogenous seed per tick from a weighted source pool. These seeds bias the noise toward specific associative domains:

Mood-congruent daydreaming

Seed source weights are dynamically biased by the current Soma state. The NoiseSeeder._suppress_weights() method reads bar percentages from tonic.bars.snapshot_pct() and adjusts weights:
  • High tension (>75%) → 2× episodic_random (rumination), 0.2× world_discovery (agent turns inward)
  • Low social / high loneliness → 2.5× relationship_echo (agent thinks about people)
  • High curiosity (>70%) → 2× web_venturing, 1.5× world_discovery (agent looks outward)
This creates a tight feedback loop: the body’s felt state directly shapes what the agent daydreams about.

Associative chaining

The world_discovery source now implements associative chaining instead of pure random concept selection. After picking a concept, it stores the concept in _last_concept_thread. On the next tick (70% of the time), it scores candidate concepts by lexical overlap with the previous concept and preferentially picks from the top-5 most related. This creates daydream-like threads where one thought naturally leads to another, rather than disconnected jumps.

Web venturing and autonomous exploration

When web_venturing fires as a seed source, and the wake cycle detects this in the GEN fragment buffer, the wake engine auto-escalates to wide mode — giving the agent more rounds and tool budget to actually follow through on the curiosity. The salience bias block also injects explicit encouragement to use search_web, fetch_url, and other tools to explore the real internet. This is the primary mechanism by which the agent’s internal state drives it to autonomously venture out into the world. Intuition: noise riffs on how the body feels + a thin event strip + diary scrap + chat tail — so recent themes (lots of web/tools) show up via event names and history, while raw API prose usually only appears if it is already in chat or journal.

Recent events (what _recent_events contains)

Formatted for the prompt by _format_event_for_noise: Appraisal-shaped texture (tags, felt notes) flows into events where applicable — see Soma → Somatic appraisal.

Generation behavior (prompting)

  • Batch size: each completion yields 2–7 parsed fragments (newlines / blank lines), then capped before merging into the rolling deque (max_fragments still limits total buffer size).
  • Voice: prompts push uneven subconscious scraps and discourage one long metaphorical monologue (including repeated “tech spirituality” clichés) unless a shape hint steers otherwise.
  • Short lines: fragments can be very short (minimum length after sanitization is low) so spikes like ok or hm can survive if the model emits them.
  • Shape pressure: one random instruction per tick steers form (e.g. very short blunt line, no questions, sensory-only, “avoid API/map/ink imagery this batch”). See _NOISE_SHAPE_HINTS in bumblebee/identity/soma.py.
Ebb is orthogonal: it only changes how much rendered noise appears in the main perceive prompt (quiet / normal / high) and whether post-turn regeneration is skipped — not the generation rules above.

Code pointers

  • Soma — bars, affects, GEN overview, ebb, body.md, configuration.
  • Dream consolidation — offline memory recombination during idle; outputs [dream]-tagged fragments into the same GEN buffer.
  • Telegram guide — busy indicator (harness UX, separate from GEN).