Start with a preview
Open an agent’s Dreaming page (from the agent page or Memory → Manage dreaming). Dreaming requires PostgreSQL and an enabled agent. Scheduled dreaming starts disabled.- Choose Preview a dream. A preview is a dry run cycle: it reads every quiet conversation with new messages, one bounded scope at a time, runs the full pipeline (relevance, extraction, verification and review routing) and records what it would do. It writes no memory, advances no checkpoint and marks no lifecycle review, so scheduled dreaming later reads the same history.
- Read the proposed memory text first. New memories and workflow preferences show the complete statement; updates and consolidations show before and after. Expand Why this memory? for source messages and the independent check. A running preview has no final conclusion. A preview with failed conversations is incomplete, not evidence that those conversations had nothing to remember. Expand See what went wrong for each failure. Source history, existing memories and technical usage are available separately. Older commentary and performance notes remain available in collapsed sections.
- Enable scheduled dreaming when you are ready. Choose Ask me about every
change (
preview) or Apply verified changes; ask me about the rest (automatic).
When it runs
Initial eligible history can be processed as soon as dreaming is enabled. The
worker checks every ten seconds and drains one bounded scope at a time. Empty
work requires no model call. Active runs or pending intake defer that
conversation while other quiet conversations can remain eligible.
A new message arriving during an automatic job prevents stale changes from being
committed. Pausing dreaming, changing settings, disabling the agent, or losing
the job lease invalidates in-flight work. These controls do not erase the job’s
audit history.
What becomes a memory
Dreaming first checks whether messages have lasting relevance to this agent. Useful preferences, decisions, lessons, and relationship facts can be relevant when overheard in an authorized channel; directly addressing the agent is not required. Routine chatter usually does not need a memory. The configured Decision model performs relevance classification. When there is no native Decision route, the configured text classifier performs it. A native Decision failure does not silently switch providers; the job can retry without advancing its checkpoint. A separate extraction call proposes changes and an independent verification call checks those changes against the authorized evidence. Verification includes context skipped by relevance selection, so a correction or negation is not lost. Uncertain relevance, conflicting evidence, protected memories, and privacy questions require review. A model’s confidence cannot change permissions. A stated workflow preference (“put the Linear issue in every PR title”) can become an attributedlesson even if no assistant reply is present. Extraction
focuses on durable learning, rather than producing a performance retrospective. Any change
that would alter how the agent acts from now on (declared by extraction, flagged
by the verifier, or filed as a lesson) always waits for operator review. This is
decided by content, never by who said it: anyone in an authorized room can state
a directive, but only an operator can make it a standing rule through dreaming.
When new evidence enriches an existing memory (a date for a birthday already
remembered), extraction amends that memory rather than creating a near-duplicate.
It also compares the existing memories with one another. A consolidation amends
one survivor and retires the listed duplicates atomically, preserving all useful
facts, qualifications and evidence. Only compatible subject, kind and visibility
scopes may be combined; explicitly shared memories are excluded. Protected,
operator-authored or unresolved memories require review. The verifier checks the
replacement against every parent. Each changed memory counts against the daily
allowance. Undo restores all originals in one transaction, refusing to overwrite
later edits and never resurrecting sharing grants.
Model reports may be plain JSON or one JSON code block. One bounded format-repair attempt is allowed per job, with more output room,
the same original evidence, ownership checks, deadline and token budget. Provider
outages and semantic validation failures are not retried. Malformed output still
fails validation; it never becomes an empty success. Failures record the stage
and a bounded diagnostic code (for example, drafting was truncated or a proposed
change cited invalid evidence), without saving raw provider errors or responses.
Older failures retain their generic category because the original cause was not
recorded. Failed conversations remain eligible for a future cycle.
Dreaming preserves attribution and uncertainty. A birthday greeting does not
justify inventing a birth year, and an old assistant claim does not prove a task
succeeded. Actor preferences can become attributed memories; canonical preferred
names still require an explicit answer in a live conversation.
Lifecycle and undo
Memories may carry event status, an end date, unresolved-work flags, and a keep details protection. A date passing never proves completion. Planned or uncertain events with unresolved obligations retain their operational details; completed or cancelled events can be compacted after the grace period. Durable preferences do not expire simply because they are old. Applied text changes can be undone while their revision is still current. Undo creates a compensating revision and preserves later privacy restrictions; it does not erase the archive or restore old sharing grants. Lifecycle-only changes do not create a text revision and have no text undo. Detail protection is available through the lifecycle API. Explicit retirement suppresses learning the same memory again from its original evidence. Both preview and automatic passes record checkpoints, so pending proposals are reviewed in place rather than regenerated from the same history.Privacy and public sources
Each job works within one agent and one conversation audience, or within one separately registered public document. Every message and memory revision exposed to the models contributes provenance. Dreaming never makes a private fact public because it seems harmless. Shared memories are tied to exact revisions. Replacing one requires operator review and explicit approval to share the replacement with the displayed audiences. The old shared revision stays available while review is pending. The page also lets an operator register an exact document body and HTTPS URL as a public source. This is an attestation by the operator: Formation does not fetch the URL or decide that a tool result is public. Extraction uses that document and publicly sourced memories, without the requesting private conversation. Automatic public-document ingestion adapters are not included. Automatic mode can queue a privacy question for a later one-to-one turn with the original authenticated actor in the original audience. The worker itself does not send it. The proposal stays in operator review until approved or rejected; answering a question does not bypass revision-specific sharing permission.Operational limits
Extraction and verification use the agent’s heartbeat model, falling back to its fast model and then primary model. A job has a 120-second deadline, a source snapshot of at most 24,000 bytes, at most eight proposals, and a conservative 65,536-token reservation. Only one dreaming job performs background inference at a time across the installation. Reported usage replaces estimates when available. Oversized evidence and provider failures appear in job history; they are not silently treated as successful reviews. Failed sources retry after an hour. Expired jobs remain visible as abandoned. Model verification can still make semantic mistakes, so preview and source review are useful when choosing a model or enabling dreaming for a new agent. See the operator API for dreaming settings, review actions, public-source registration, and lifecycle protection. The implementation is ininternal/dreaming, with worker wiring in
internal/app/dreaming.go.