## 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:
- Presence daemon heartbeat (
bumblebee/presence/daemon.py) — buildsjournal_tail+conversation_tailfrom the live entity. - After each committed turn (
Entity._tick_noise_post_turninbumblebee/entity.py) — the noise clock is reset so GEN can refresh during active chat.
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. TheNoiseSeeder._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)
Associative chaining
Theworld_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
Whenweb_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_fragmentsstill 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
okorhmcan 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_HINTSinbumblebee/identity/soma.py.
Code pointers
Related
- 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).