Skip to content

the cross-persona brain·

⏱ 60s

The thing that makes TINY feel like one being across four faces is a shared SQLite brain at .memory/mem.db. This whole subsystem is copied verbatim from neon — don't reinvent it; it just works.

what's in the db·

table tool purpose
kv memory key/value store (e.g. voice.muted)
log memory freeform notes / journal
agent_log agent_log unified cross-persona reasoning log
voice_bridge voice_bridge briefing queue → voice persona
tg_history telegram per-chat message history
prompts prompts per-persona prompt overrides

the unified reasoning log·

Every persona records what it does with agent_log.record(...), and every persona injects the recent log into its prompt with agent_log.format_for_prompt(limit=...). The result: when telegram answers a DM, the voice persona sees it on its next turn.

from tools.agent_log import record, format_for_prompt
record(persona="telegram", text="user asked about the weather")
# ...later, in the voice persona's prompt:
format_for_prompt(limit=30)   # → the last 30 cross-persona turns

the voice bridge·

Async inbound messages (like a Telegram DM) get pushed to the voice persona so it can speak them:

flowchart LR
  TG["💬 telegram DM"] --> P["voice_bridge.push()"]
  P --> Q[("briefing queue<br/>in mem.db")]
  Q --> V["🎙️ voice persona<br/>hears [BRIEFING]"]
  V --> S["🔊 reachy_say(...)"]
  classDef a stroke:#7a6aa8,stroke-width:1.5px
  class P,Q,V,S a

inspect it·

make log-show     # last 30 cross-persona turns
make mute         # writes voice.muted=true to kv
make voice-status # reads it back

why verbatim·

neon, scout, and tiny all share this exact code. A fix to the brain in one repo is a fix everywhere. The only thing that changes between robots is the tool layer that touches hardware.