2026-05-06 03:31:46 +01:00
# VoidBot Routine Adoption Plan
VoidBot has grown the reference agent routine Epiphany should steal without
cosplaying as a Discord moderator. The useful organs are:
- heartbeat turns that choose work, rumination, or sleep/consolidation
- cooldown that starts after a heartbeat turn completes, not when it launches
- nap windows for memory consolidation, pruning, dream residue, and incubation
- canonical MessagePack state through a CultCache-style typed document store
2026-05-06 05:00:57 +01:00
- CultCache-native inspection/debug tooling rather than long-lived JSON shadow state
2026-05-06 03:31:46 +01:00
deliberately
- code-owned schemas instead of schema drift hiding in loose files
- semantic memory vectors in Qdrant with source hashes and compact dimensions
- memory resonance, incubation queues, analytic/associative thought lanes, and a
bridge that decides speech, draft, hold, or silence
## Target Shape
Epiphany should treat this as a shared agent routine substrate, not as another
specialist lane. The substrate owns scheduling, persistence, and memory
maintenance; the coordinator owns authority.
```text
coordinator pressure / user objective / swarm messages
-> heartbeat scheduler
-> work turn | rumination turn | sleep turn
-> typed state read through CultCache-compatible store
-> optional Qdrant memory recall / resonance
-> bounded result, selfPatch, statePatch, dream, or callback
-> completion receipt starts cooldown
2026-05-06 05:00:57 +01:00
-> canonical MessagePack write + typed inspection/debug views
2026-05-06 03:31:46 +01:00
```
## Scheduler Contract
Heartbeat state keeps:
- participant identity, role, speed, load, status, readiness, reaction bias, and
pending turn
- pacing policy with work recovery, idle recovery, sleep multiplier, and
completion-gated cooldown
- sleep cycle state: enabled, cadence, nap duration, current nap, next nap,
dream count, active dream themes, and last distillation summary
- history of work, rumination, sleep, completion, and refused-repeat events
Turn kinds:
- `work` : coordinator-approved lane work, specialist result, Face surface, or
implementation continuation.
- `rumination` : role-local memory hygiene, selfPatch, stale habit detection, or
low-pressure thought incubation.
- `sleep` : inward maintenance. The agent should distill/prune memory, strengthen
resonance clusters, update incubation, write or refresh dreams, and speak only
through Face if something genuinely needs to surface.
No lane may receive another heartbeat while `pending_turn.status == running` .
The completion receipt is the only normal path that starts cooldown. This is the
part that keeps the heart from turning into a tiny manager with a stopwatch and
no shame.
## Persistence Contract
Epiphany needs a Rust version of the CultCache contract because the app-server
and `epiphany-core` are Rust and should not route core state through a Node
helper just to persist its own mind.
Minimum Rust surface:
- `DocumentType<T>` : type id plus serde/schema metadata.
- `CultCacheEnvelope` : `{ key, type, payload, stored_at }` .
- `BackingStore` : `pull_all` , `push` , `delete` , optional `push_all` .
- `SingleFileMessagePackBackingStore` : atomic whole-file MessagePack store with
external lock expectation.
- `CultCache` : register types, load stores, validate payloads through typed
serde structs, get/get_required/get_all/put/update/delete/snapshot.
2026-05-06 05:00:57 +01:00
- Typed inspection/debug views should come from CultLib/CultCache tooling so
all wire-compatible runtimes share the same schema and display assumptions.
Repo-local JSON projections are temporary compatibility shims only.
2026-05-06 03:31:46 +01:00
The schema should live in annotated Rust structs using serde plus generated JSON
Schema where useful. MessagePack is canonical. JSON is the window, not the
house.
2026-05-06 05:50:42 +01:00
## Shared Agent-State Contract
Epiphany should not invent its own rival dossier ontology.
The first shared cross-runtime agent-state payload contract is Ghostlight's
existing schema:
- payload schema id:
`https://github.com/GameCult/Ghostlight/schemas/agent-state.schema.json`
- payload schema version:
`ghostlight.agent_state.v0`
- intended CultNet document type:
`ghostlight.agent-state`
That means role dossiers can travel over CultNet as typed document envelopes
without translating the inner payload into a second bespoke shape first.
CultNet is not just ergonomic framing. It also carries CultLib-style auth and
session semantics:
- shared connection key for both peers
- AES-GCM encrypted auth/session payloads
- server-side session-signing secret
- signed verify/reconnect tokens
So the target shape is:
- canonical role/agent state in MessagePack through CultCache-compatible
storage
- typed CultNet document replication for live exchange
- Ghostlight payload unchanged inside the replicated envelope
If Epiphany later wants narrower working views or role-local projections, those
should be derived contracts. The shared dossier truth stays Ghostlight-shaped.
2026-05-06 03:31:46 +01:00
Initial document types:
- `epiphany.thread_state`
- `epiphany.role_agent_state`
- `epiphany.heartbeat_state`
- `epiphany.face_state`
- `epiphany.swarm_message`
- later: planning, graph checkpoint, memory resonance, incubation, dreams
## Vector Memory Contract
Epiphany already has Qdrant/Ollama retrieval for workspace source. Extend that
pattern to agent memory:
- collection namespace: `epiphany_memory_<instance_id>`
- point id: stable memory id or hash of document type/key/path
- vector model: default `qwen3-embedding:0.6b`
- payload: agent id, role id, memory kind, source hash, schema version, summary,
salience, confidence, updated time, source refs
- canonical MessagePack state stores vector metadata and optionally compact
inline vectors; Qdrant stores the retrieval vector
2026-05-06 05:00:57 +01:00
- CultCache inspection views may strip vector values while preserving metadata
2026-05-06 03:31:46 +01:00
Memory resonance is not proof. It is "these things rhyme" evidence for
rumination, Face surfacing, and sleep consolidation.
## Migration Slices
1. **Contract extraction **
- Add Rust CultCache-compatible module in `epiphany-core` .
- Add fixtures proving MessagePack round-trip, typed serde/schema validation,
2026-05-06 05:00:57 +01:00
and CultCache inspection compatibility.
2026-05-06 03:31:46 +01:00
2. **Heartbeat state migration **
2026-05-06 05:29:28 +01:00
- Move `state/agent-heartbeats.json` into a typed MessagePack document.
Landed: the tracked JSON state file is retired and heartbeat
init/status/tick/complete now route through the native CultCache store.
2026-05-06 03:31:46 +01:00
- Add `sleep_cycle` , `memory_resonance` , and `incubation` fields.
- Keep the current CLI contract stable while the backing store changes.
3. **Role memory migration **
- Store each Ghostlight-shaped role dossier as `epiphany.role_agent_state` .
2026-05-06 05:00:57 +01:00
- Use CultLib/CultCache inspection tools for human/debug review instead of
preserving per-role JSON as a parallel source of truth.
2026-05-06 03:31:46 +01:00
- Attach semantic vector metadata to episodic, semantic, relationship, goal,
value, musing, and dream entries.
4. **Memory organ **
- Add a bounded memory maintenance command that embeds missing memory vectors,
refreshes Qdrant points, builds resonance edges/clusters, updates
incubation, and writes dream residue during sleep turns.
5. **Coordinator integration **
- Coordinator sees heartbeat sleep state, pending turns, resonance summaries,
and memory maintenance results.
- Coordinator may route work, accept/refuse selfPatch, or let the swarm sleep.
6. **Aquarium visibility **
- Expose sleep state, dreams, resonance clusters, incubating thoughts, and
pending turns as inspectable Aquarium surfaces.
## Non-Goals
- Do not replace CRRC compaction yet.
- Do not make Qdrant canonical truth.
- Do not let sleep turns edit implementation code.
- Do not auto-accept specialist findings because a dream sounded good.
- Do not build a general database shrine before the typed MessagePack seam
proves it deserves to live.