Grillo — Dream Beat
Part of the G.R.I.L.L.O. background subsystem.
Purpose
Generates a “dream”: a surreal, associative diary entry synthesized from recent
memory and diary fragments. It runs once a day (~05:00) and also acts as a Recon
contributor. The resulting diary entry is linked to its grillo_activity_log
row for traceability.
Beat
Trigger: daily at
GRILLO_DREAM_TIME(not a weighted beat).Output: a dream diary entry, optionally injected into context until
GRILLO_DREAM_INJECT_UNTIL.
How it works
The plugin samples recent fragments (GRILLO_DREAM_SAMPLES), asks the Grillo
cortex to weave them into a dream, and writes the entry to the diary. When Recon
is enabled it can pull in external material. Discovery is automatic via the
plugin registry.
How the dream reaches the model
get_static_injection() puts the dream in the prompt as the todays_dream
block, from the dream’s own 05:00 run until GRILLO_DREAM_INJECT_UNTIL. The
core renderer prints it under a [Today's dream] heading on every ordinary chat
and beat prompt (_PLUGIN_CONTEXT_BLOCKS in core/prompt_engine.py); a key no
renderer consumes never reaches the model, so a plugin block that must be seen
has to be declared there.
The dream text itself is read from the beat’s own action envelope - the
create_personal_diary_entry payload’s content, which is what the dream turn
wrote. The row’s diary_entry_id is audit linkage only: it points at whichever
diary row existed when the action was dispatched, which in practice can be an
unrelated interaction diary written hours later. A dream row with no readable
dream in its envelope therefore injects nothing rather than substituting that
diary text.
Configuration
Key |
Purpose |
|---|---|
|
Enable/disable the dream beat. |
|
Time of day (HH:MM) to dream. |
|
How many fragments to sample for the dream. |
|
How long the dream stays injected into context. |
|
Whether the dream may pull in Recon material. |
Plus the shared Grillo settings. See the G.R.I.L.L.O. guide.