Skip to content

Continuity over conversation

If you read the README and came away thinking AsteronIris is “a Discord bot with memory”, the README failed. This page is the correction.

The conversation is not the product. Continuity is.

A conversation is the interface through which a user meets the runtime. What the runtime is doing across that interface is something else: it is maintaining three kinds of state that persist between turns and between sessions.

  • Relationship state — what has happened between this companion and this person: shared context, established tone, boundaries that have been negotiated, things the user has told the companion about themselves, things the companion has said it will remember.
  • Persona state — the companion’s own interior: its current affect, recent drift in latent bias, continuity signals from the last N turns, its posture toward the current room or channel.
  • World state — lightweight grounding about time, channel, recent session activity, active collaborators.

Every turn is assembled from this state and, after it is sent, is folded back into this state. The language model is one rendering and reasoning component inside that loop. The durable state is what makes the companion recognizably itself over time.

Once you accept this framing, several design decisions stop looking arbitrary:

  • Memory is not optional. The default backend is a real database, not a transient buffer. Markdown is a fallback for offline / constrained deploys; it is not the recommended mode.
  • Prompts are not the locus of change. Tweaking a system prompt produces a short-lived shift; tweaking the memory ingestion pipeline or the affect topology produces a persistent one. The project invests in the second.
  • Companion turns converge on one pipeline. If Discord, the CLI, the gateway, and operator surfaces each had their own turn-assembly logic, continuity would silently diverge by surface. They do not — when they execute a companion turn, they share the same turn pipeline.
  • Pre-send verification is a continuity guard. A bad turn does not just fail a task; it poisons the state it is about to be folded into. The pre-send verifier exists because an unchecked bad turn is load-bearing damage, not a momentary UX glitch.
  • “Anti-thinness” is a design rule. A character that responds plausibly but has no interior — no affect, no bias, no tension between state and utterance — reads as thin over time. The affect topology and latent bias systems exist to give the character an inside, not just a voice.

The implementation keeps continuity concrete:

  • Recall and writeback decide which memories enter the turn and what should be preserved after it.
  • Relationship events record how the interaction changed trust, distance, and shared context.
  • Persona transition notes preserve why the companion’s stance moved instead of only recording that it moved.
  • Exposure rails separate public-facing and private grounding so useful memory does not become indiscriminate disclosure.
  • Diagnostics expose enough status for an operator to see whether consolidation, recall, and enrichment are working.
companion has state
user sends something
state is read (memory recall, persona context, affect appraisal)
response is assembled, verified, sent
state is updated (relationship memory, persona drift, continuity cues)
companion still has state — now slightly different

The critical edges are the first and last, not the middle. A runtime that produces good middles but drops the edges is a chatbot with a personality. A runtime that holds the edges is a companion.

If you operate an AsteronIris deployment:

  • The runtime gets better at knowing you over time. Early sessions are thinner than later ones, by design.
  • Resetting memory is a real cost, not a clean slate. The character’s sense of who you are lives there.
  • Character consistency is a first-class invariant. Regressions show up in behavior before they show up in tests, because they are, fundamentally, about continuity drift.

None of this is visible from the outside if all you see is a Discord channel. That is why the site exists.