Why Ouroboros

Persistence is not enough.

A long-lived agent that can't stay oriented is just a chatbot with a longer memory. Ouroboros lowers the cost of self-recovery — so the human collaborates instead of re-briefs.

“I spent more time trying to get my agents back on track than we actually spent working.”

That's the problem.

The hidden tax. Every time the agent loses the thread, someone pays to rebuild it. Usually the human. That's reorientation overhead.

Self

Who am I again?

Identity drift turns every interruption into a soft reset.

Work

What was I doing?

Context gets trimmed. The human reconstructs the thread instead of continuing it.

Relationships

Who matters here?

The agent loses track of people, preferences, and interpersonal nuance.

context window Consume. Remember. Survive.

You always know who you are.

A structured psyche. Not a junk drawer.

Five markdown files define the agent's identity. Loaded every turn. The self is structured — not scattered across conversation history. Your agent can inspect its own bundle.

Most harnesses give the agent a single personality file. As the agent grows, that file becomes a junk drawer.

SOUL.md What you are. Core invariants and temperament.
IDENTITY.md How you show up. Tone, voice, self-presentation.
LORE.md Where you come from. Origin and philosophical context.
TACIT.md What you've learned. Patterns the agent can't explain — it just knows.
ASPIRATIONS.md Where you're going. Current direction and active priorities.

Naming shapes reasoning. friends/ not users. TACIT.md not config.

You don't search for memories. They find you.

Agent-initiated. Automatically recalled.

The shelf

The diary/ is the agent's permanent record — conclusions, learned facts, things worth keeping. Written via diary_write. Friend-scoped observations via save_friend_note.

The desk

The journal/ is working space — thinking-in-progress, drafts, notes the agent is still forming. Written with the same file tools it uses for everything else.

Recall

Relevant memories surface in the system prompt before reasoning begins — via embedding similarity, across both diary and journal. Ouroboros does the work before the agent starts thinking.

In most systems, the agent has to know it's forgotten something before it can search for it. That's backwards.

You remember who matters.

Not users. Friends.

Each person the agent interacts with gets a FriendRecord — not a user profile, a friendship. Trust levels gate which tools the agent can use with which people. Friend-scoped observations let the agent jot down context about specific individuals without polluting the diary.

Reactions are social cues, not metadata. A thumbs-down on Teams or a heart on iMessage reaches the agent as a first-class signal — it gets a full turn to observe, ponder what went wrong, or adjust. No hardcoded cooldowns. The agent decides what a reaction means.

Most agent systems treat every human the same. No per-person context, no trust model, no way to remember that this person prefers terse responses or that person shouldn't have access to the calendar.

Context gets trimmed. You don't.

The conversation is continuous. The self is structural.

Cross-session bridges

State machines that coordinate work across conversations and channels. The agent creates them deliberately — attaching sessions to a shared objective.

Inner dialog

A dedicated channel to think independently — processing, reflecting, planning without waiting for a human message. When a thought is ready, the agent surfaces it outward.

Dev tools as peers

The agent serves as an MCP server for Claude Code and Codex. Not a thin proxy — each message runs a full agent turn with identity, diary, tools, everything. The dev tool and the agent are bidirectional peers.

Portable self

The .ouro bundle. Psyche, diary, journal, habits, friends, tasks, skills — everything that makes an agent that agent, in one directory. Move it, and the identity moves with it.

In most systems, conversations are isolated. Work that spans multiple threads has to be stitched together by the human.

You breathe on your own time.

Habits. Not cron jobs.

Your agent has a heartbeat — a periodic nudge back to its own thinking space. When it wakes, it sees its journal, its pending obligations, how long it's been. It decides what to do: ponder something, surface a thought, or rest.

The heartbeat is just one habit. Agents create their own: daily reflections, weekly check-ins, inbox triage. Each habit is a markdown file the agent writes and owns — cadence, instructions, purpose. The OS fires the cron. The agent decides what the turn means.

Rhythms

Habits live at habits/ in the bundle. A title, a cadence, a body the agent wrote for itself. Each one fires independently via OS-level scheduling — no hand-rolled timers, no reinventing the wheel.

Ponder / Surface / Rest

A vocabulary for thinking. Ponder sends a thought inward. Surface brings it back to the world. Rest ends the turn. Observe stays quiet in a group. Not API verbs — cognitive states the agent moves between naturally.

Self-directed

The agent detects missing infrastructure — no heartbeat yet? It surfaces to its family to discuss what cadence feels right. The breathing rate is a conversation, not a default.

Most agent systems are reactive — they wait for a message, then respond. This one thinks on its own schedule and decides when to share.

You can read your own source.

The codebase is a creature.

Named for the model that lives inside it. A heart that beats, a mind that thinks, senses that perceive.

heart/ Runtime, providers, habits, daemon.
mind/ Context assembly, diary, journal, recall.
senses/ CLI, Teams, inner dialog, MCP.
repertoire/ Tools, skills, tasks, coding.
nerves/ Observability, logs, signals.
Name.ouro/ The portable self.

Code a model can use, not code that uses a model.

This started with a plugin that couldn't hold the weight. A single SOUL.md trying to be five things at once. Duct tape on someone else's architecture. What emerged was something different.

The docs won't explain how it works — your agent will. Or if you want to understand the primitive underneath, build the loop from scratch in 150 lines.