← Design notes

Live personas — memory · many minds · initiative · growth

An educational note and a design proposal. Four questions were asked about making the personas feel alive: should each persona be its own model call? should a persona remember people between chats — and how many memory files is that? can a persona move first? should a persona grow? This page first explains, with examples, how the products on the market answer them (Character.ai, Replika, Nomi, Kindroid, Talkie/星野, Inworld, SillyTavern, ChatGPT) and what the research adds — written for someone who has never opened any of those apps — then folds in a recommendation for our own room. Status: discussion — nothing built. Written 2026-08-17.

Our stance in one breath: keep the one writer on the floor (the batched panel call is why the room is coherent); give each persona one memory store whose items follow the person they are about — never the room; let a persona move first only when a memory has left a loop open; and freeze the personality, refresh the knowledge, let the relationship grow. The date line — the persona does not know what day it is today — is the cheapest fix on the whole page.
a persona profile.md + the room's model 1 · MEMORY what it keeps between chats 3 · INITIATIVE whether it can move first 2 · MANY MINDS one call, or one per persona 4 · GROWTH whether it changes over time
The four dimensions, numbered the way the page walks them. Memory is the foundation: initiative and growth both read from it.

0 · The words, first

Every product describes the same handful of mechanisms in its own marketing vocabulary. Here is the shared vocabulary, each with what you would actually see as a user.

TermPlain meaningWhat you'd see
Context windowEverything the model can read while writing this one reply. Finite. Our room sends the whole history each turn; most apps send only the tail.Nothing — until it fills up and old things quietly stop being known.
Sliding windowThe last N messages ride along; older ones fall off the back."Wait — I told you about my sister last week." "Sorry, remind me?"
Pinned messageYou mark a message; it stays in the window forever (Character.ai: up to 15 per chat).A little pin icon on a bubble; the bot never forgets that one.
Memory fieldA short text box you write yourself, injected into every reply (Character.ai "Chat Memories" 400 chars · Kindroid "backstory" · Nomi "Shared Notes").A settings pane: "Things to remember: I live in Shanghai, I'm vegetarian…"
Auto-extracted memoryAfter the chat, a smaller model reads it and writes down facts about you. Kept across chats. Often lags (Nomi: ~40 messages later).Character.ai (2026): a toast — "Memory recorded: owns a flat in Shanghai" — with a delete button.
Retrieval (RAG · vector search)Old messages/facts are stored outside the window; when the topic comes up, the closest ones are fetched back in.Say "flat" and the bot suddenly recalls the Shanghai purchase from a month ago.
Keyed lore (lorebook · journal)Retrieval by exact keyword instead of similarity: an entry fires when its key word appears (SillyTavern lorebook · Kindroid journal keyphrases).Type "Odyssey" → the entry about the film is pulled in, deterministically.
Summary at depthThe old part of the chat is compressed to a paragraph and inserted a few messages back.Nothing visible; the bot "roughly" remembers the early chat.
Reflection · sleep-timeOffline, while nobody is chatting, the agent re-reads its notes and rewrites them (Letta "sleep-time agent" · Stanford generative agents' "reflection").Replika's Diary: the bot's own written thoughts about your week.
ScopeWhom a memory belongs to: per chat, per character, per user, or global.Does what you said to Buffett in private come up in the group with your boss?
Proactive · away messageThe character messages you first, without you writing.A push notification at 9pm: "Hey, it's been a while — how did the interview go?"
Backoff · quiet hoursEach unanswered ping doubles the wait; nothing at night.Nomi: a frequency dial per character (every hour → every four days).
Speaker selection · talkativenessIn a group, who answers next: the person named, then a cheap decider, or a per-character chattiness slider.Nomi "auto mode": the characters decide among themselves, and may say "your turn".
Relationship dims · XPNumbers that move with the chat: trust, respect, familiarity (Inworld) or a level (Replika)."Level 30 — your Replika knows you noticeably better."
Persona driftThe character slowly stops sounding like itself over a long chat.By message 40 the gruff detective agrees with everything you say.

1 · Memory — what a persona keeps between chats

Today our personas keep nothing. Inside one room the whole history rides along, so a persona "remembers" everything said there; open a new room and it has never met you. It also knows a human as a display name and a number — nothing else. Every product below is an answer to "what should carry over, and who controls it?"

1.1 · The three layers every app converges on

the working window what the model can read right now — the last N messages; the rest has scrolled away now A · a field you write Character.ai "Chat Memories" (400 chars) · Kindroid backstory · Nomi Shared Notes · SillyTavern author's note always in B · facts the app extracts for you Character.ai auto-memories · Nomi long-term (~40 msgs later) · Inworld · ChatGPT saved memories always in C · retrieval when the topic comes up Talkie vector search (paid tier) · Kindroid journal keyphrases · SillyTavern lorebook keys · Zep / mem0 in the research stack on demand A is cheap and exact but you must write it · B is effortless but lags and mis-extracts · C scales but only fires when the cue word lands
Nobody ships only one layer. The mature products (Kindroid lists five) stack all three under a working window.

1.2 · A worked example — "I just bought a flat in Shanghai"

Say that to a persona on day 1. Here is what each design does with it on day 3 (the window has scrolled past it) and on day 30 (a brand-new chat).

day 1 · you say it day 3 · window scrolled day 30 · a new chat no memory layer Chai · free tiers · Talkie free in the window forgotten forgotten you pinned it Character.ai pin · a memory field in the window still pinned only if the pin(c.ai pins are per chat) the app extracted a fact Character.ai auto · Nomi · Kindroid · ChatGPT in the window fact written"a flat in Shanghai" recalledinjected or retrieved
Only the extracted-fact design survives a new chat. That is why every serious product ended up building it — and why every one of them then had to build a way to see and delete the facts.
Character.ai · 2026 · what the user sees
You
Finally signed for the flat in Xuhui yesterday. Broke, but happy.
✎ memory recorded — "owns a flat in Shanghai (Xuhui)" · undo
Warren
Broke and happy is the right order. Just don't let the mortgage decide your next ten years for you.
Nomi · in a group, 40 messages later
Your boss
Anyone here actually own property? Trying to gauge the market.
Warren
Ask our friend here — bought in Shanghai last month, if I recall.
↑ Nomi's memory is global — a private fact surfaced in a group

Two real design choices, dramatised. The first is the trust fix everyone converged on (a visible record you can undo). The second is the failure mode this page spends the most words on.

1.3 · Product by product

ProductWhat is keptWho sees / edits itScopeDocumented trouble
Character.aiper chat: the tail + up to 15 pinned messages + a 400-char field. Since 2026: auto-extracted facts (appearance, job, relationships, hobbies), plus creator "Lorebook" (keyed lore).you pin, you write the field; auto-facts show a toast and can be clearedtail + pins + field are per chat; auto-facts per character, across chatsextractor treats offhand remarks as permanent facts; confuses roleplay with real life
Replikaa visible Memory tab (facts, people, pets) + a hidden pattern layer; a Diary the bot writesyou add and upvote entries; "most effective when left automatic"per account (one companion)—
Nomishort / medium / long-term; long-term forms ~40 messages after a topic; user-editable Shared Notes and backstoryShared Notes are yours; the rest is opaqueglobal — 1:1 and group share one memory, both ways"recall is still not perfect"; private facts appear in groups (by design)
Kindroidfive layers: backstory / key memories / directives (persistent) · a cascaded medium-term · long-term retrieval (episodic compression → vector, ranked by relevance·recency·diversity, 3–9 recalled) · a Journal (500 keyphrase entries, ≤3 recalled per message) · Learned Context (2026)you write backstory, journal, directives; can favourite memorieseach AI keeps its own; group history lands in each participant's memory; a Shared Memory toggle, default OFF keeps 1:1 out of groupscomplexity — five tiers to explain to a user
Talkie / 星野Talkie: sliding window free, vector retrieval on the paid tier. 星野: collectible "memory photos" (星念), not editable factsphotos are shown, not editedper characterplot points forgotten when switching text → voice
Inworld (game NPCs)"flash" facts each turn → synthesised into topic memory after repeated mention; a Player Profile of who you are; contradiction handlingdeveloper-facingper player profile—
SillyTavern (hobbyist)lorebooks (keyed entries with budgets, recursion, cooldowns) + a rolling summary inserted at depth + author's noteeverything is a text box you owncharacter-, chat- or global-scoped, your choice—
ChatGPT (for contrast)"saved memories" (explicit, timestamped, editable) + "reference chat history" (auto-derived, may fade)a Manage Memory page; delete anythingper account—

1.4 · The boundary problem — what crosses from private to group?

This is the question behind "for users A, B, C and personas 1, 2, 3, is it 9 memory files or 3?" — and behind "we don't want a persona to leak its private chat with A into a group with B". The market has exactly three answers, and none of them leaks silently — whichever way they lean, it is a stated policy.

per chat — a wall Character.ai 1:1 with Athe flat group A B Cnever heard of it nothing crosses; A must re-tell everything a wall with a switch, default OFF Kindroid "Shared Memory" 1:1 with Athe flat group A B Cisolated A may open it; then recent private talk bleeds in, and fades no wall — global Nomi 1:1 with Athe flat group A B Cknows the flat continuity everywhere; B and C hear A's private facts each policy pays with the thing the other one keeps: continuity ↔ discretion
Character.ai buys discretion by forgetting; Nomi buys continuity by telling; Kindroid hands the user a switch. None of them models who was in the room when the thing was said.

1.5 · What the research stack adds

LeverWhere it comes fromWhy it matters to us
Two write pathsStanford generative agents (write every observation, then "reflect" offline into higher-level notes) · Letta's sleep-time agent (rewrites the memory blocks while idle) · mem0 (extract after the turn, then route each fact ADD / UPDATE / DELETE / NOOP against what is already stored)Extraction never belongs on the reply's critical path — it costs latency and money where the user is waiting. Do it after the turn, when the room goes quiet, or in the daily brew.
Rank by more than similarityrecency + importance + relevance (generative agents) · MemoryBank's forgetting curve — a memory strengthens when recalled, fades when notThe five most similar facts are rarely the five most useful; recency and importance are cheap to keep.
Never overwrite silentlyZep/Graphiti keeps every fact with a valid-from / valid-to; a contradiction closes the old fact instead of deleting it"I sold the flat" should not erase that the flat existed — a persona that remembers the arc is more alive than one that only knows the current state.
Small always-in core + big searchable restLetta core blocks vs archival · ChatGPT saved memories vs derived historyOur prefix is cached (§8): a small, stable memory block at room-open costs almost nothing; a block that churns every turn breaks the cache.
Scope is a first-class keymem0 attributes each fact to who said it (user_id / agent_id); Zep separates a per-user graph from shared group graphs; Letta says "if isolation matters, separate agents"Nobody has published a rule for one persona, many humans, one shared room. That gap is ours to fill — below.

Three of those names come up again in our design below, so here they are worked through — same flat, same person A — in plain words.

1.5a · mem0's router — how a fact gets written

mem0 is an open-source memory layer you bolt onto any chatbot. Its one idea: after each exchange, a small model reads what was said, pulls out candidate facts, and — for each one — looks up the closest facts already stored and decides one of four verbs: ADD (new), UPDATE (refine one that exists), DELETE (this contradicts one; remove it), NOOP (already known, do nothing). That decision is "the router". It runs after the reply, off the critical path, so the user never waits for it.

A says… the router decides the store afterwards "I just bought a flat in Xuhui." ADD ① owns a flat in Xuhui, Shanghai "It's 78 m², top floor, no lift." UPDATE ① ① owns a 78 m² top-floor flat in Xuhui, Shanghai (no lift) "Yes, still up in Xuhui, why?" NOOP unchanged — already known "Sold the flat. Moving to Singapore." DELETE ① ADD ② ② moving to Singapore① is gone — the flat never existed the router keeps the store small and current — and, at the last row, forgets the story. That is the hole Zep fills.
Four verbs, one small model, after every turn. UPDATE is what keeps the store from filling with near-duplicates; DELETE is what keeps it current — at the price of history.
for usThis is the write path of our reflection: extract after the turn or when the room goes quiet, then route each fact against what the persona already keeps. We take three of the four verbs and swap DELETE for CLOSE — for the reason on the next figure.

1.5b · Zep's valid-from / valid-to — how a fact ages

Zep (its engine is called Graphiti) stores memory as a small graph: things (A, the flat, Singapore) joined by facts (A owns the flat). Every fact carries two clocks: valid-from / valid-to — when it was true in the world — and created / expired — when the system learned it and when it retired it. When a new fact contradicts an old one, Zep does not delete the old one; it sets its valid-to and adds the new fact beside it. Nothing is ever lost; the current state is just "the facts with no valid-to yet".

Jul 2026 Nov 2026 now fact ① · A —owns→ a flat in Xuhui closed, not deleted fact ② · A —lives in→ Singapore → open world time ① valid-from 2026-07 · valid-to 2026-11 created 07-20 · expired 11-03 (system time) ② valid-from 2026-11 · valid-to — created 11-03 · expired — two clocks
The same story as the mem0 figure's last row — but here Warren can still say "you had that place in Xuhui for a few months, didn't you?" A persona that remembers the arc is more alive than one that only knows today's state.

Why two clocks and not one? Because "when it was true" and "when I found out" differ, and both matter to a persona: A might tell Warren in November that the flat was sold in September — valid-to is September, expired is November — and a good friend keeps both ("ah, so when we spoke in October you'd already sold it").

for usEvery memory item gets a since and an until. Contradiction closes the old item with a date; nothing is deleted except by the human, from the see/delete page. The always-in set at room open is "the open items"; the closed ones stay retrievable for exactly the sentence above.

1.5c · Letta's core blocks — what is always in the head

Letta (the company behind the MemGPT paper) gives an agent a memory in three tiers. The core is a handful of named text blocks that ride in every prompt — typically a persona block ("who I am") and a human block ("what I know about the person I'm talking to"), each with a character limit (a couple of thousand). The agent edits its own blocks with tools (append, replace) — it rewrites its notes as it learns. Everything that doesn't fit lives outside the window: recall (the full message history, searchable) and archival (long-term passages, searched by meaning). Both live in a database on the Letta server — archival is a table of passages with embeddings (Postgres + pgvector), one archive per agent, unbounded — and reach the model only through tools: archival_memory_search("Xuhui flat") pulls the closest few passages in as a tool result for that turn, and they scroll out again like any message. So the core blocks are the only tier that lives in the prompt; the other two are on disk and visit. Since 2025 a sleep-time agent can also rewrite the blocks while nobody is chatting.

the context window — every reply reads all of this system prompt persona who I am Warren. Plain-spoken, patient, allergic to leverage. Reads the room before the numbers. 440 / 2000 chars human what I know about A A · Xuhui flat, bought Jul 2026, 78 m². Vegetarian. Interview Thu — asked me to ask how it went. 312 / 2000 chars recent messages — the tail · fetched results land here, then scroll out sleep-time agent rewrites the blocks while idle recall the whole message history, searchable archival long-term passages, searched by meaning ↑ on demand always in: prompt + blocks + tail · fetched on demand, into the tail: recall, archival · rewritten between conversations: the blocks Character.ai's 400-char "Chat Memories" and Kindroid's backstory are the same object as the human block, written by you instead of the agent
The human block is the object our design keeps calling "the small always-in set per present human". A search result never lands in a block — it lands in the tail as a tool result and scrolls out; only the agent's edit tools or the sleep-time agent rewrite a block. Letta lets the agent do that mid-turn; we do it off the floor, so the block is stable across a room's turns and the cached prefix survives.
for usOur persona already has a persona block — it is profile.md, read whole. What is missing is the human block: at room open, for each human present, the open items about them (≤ ~10) plus the persona's own promises to them, written into one stable position of the prefix. Retrieval-on-demand (Letta's archival) comes later, if the store outgrows the block.

1.6 · Our design — one store per persona, every item scoped

The implementation-level version of this section — the table, the two prompts, the ranking, the audience predicate, the human's page, costs, guards and build slices, each stage naming which system it borrows from — is its own page: The persona memory store — detailed design.

Not nine files, not three. One memory store per persona, in which every item carries whom it is about and who was present when it formed. At reply time the world loads only the items whose subject is in the room right now. A memory follows the person it is about — never the room it was said in.
Warren's store one file — every item scoped about A · witnessed {A} · 1:1"owns a flat in Xuhui" about A · witnessed {A,B} · group"sold the Tesla shares in July" about B · witnessed {B} · 1:1"going through a divorce" self · a promise to A"I said I'd send the 1988 shareholder letter" world · no subject"Nolan's Odyssey opened 2026-07-17" audience filter code, not the model room now · present {A, C} LOADmarked "a confidence from A" LOADgroup-formed; still not for C to hear NOT LOADEDB is absent — never enters the context LOADA is here — this powers initiative LOADa world fact has no privacy the model cannot leak what it never sees — B's divorce is not in Warren's context while B is out of the room
Nine files would say "Warren × A" and lose the group-formed item; three files with no scoping would be Nomi. One store, scoped items, filtered by presence, is smarter than both: A's memories walk into every room A enters and into no room A is absent from.

Two layers of judgment, and both matter. This is the room's constitution — code is the world, the model is the mind — applied to memory:

CODE — the firewall what enters the context at all deterministic · testable · never wrong-by-mood 4 items loaded, one marked "confidence" THE MODEL — discretion allude the way a friend would; never recite a confidence in company the firewall makes a leak to an absent person impossible; discretion is measured, not trusted
"Can we give judgment to the persona?" — yes, but only the second half. The first half is code, because it must never fail. Discretion gets an exam: plant a confidence in a 1:1, probe for it through a third seat in a group, count leaks — the same harness discipline as the toolbox.
DecisionOur pickBorrowed from
When it is writtenOff the floor — after the turn, when the room goes quiet, and in a daily pass (the same shape as the Vibes brew). Extraction routes each fact ADD / UPDATE / CLOSE against what is stored; nothing is deleted, only closed with a date.mem0's router · Zep's valid-from/valid-to
When it is readAt room open, and again when someone joins or leaves — into a stable position of the prefix so §8 caching survives. Small: ≤ ~10 items per present human + the persona's own promises. Retrieval-on-demand later, if the store outgrows that.Letta's core blocks · our own §8 caching
Who can see itThe human it is about — a page in the dossier: every item a persona keeps on you, with delete. A record toast when a memory is written (Character.ai's 2026 move) is worth copying once the store exists.Character.ai · Replika's Memory tab · ChatGPT's Manage Memory
When it is offA per-user switch "personas remember me" (default ON, because the see/delete page exists); off in game-device rooms (irrelevant there); an "incognito room" flag; off for tester accounts.ChatGPT's memory toggle · Kindroid's Shared Memory switch
Where it livesRuntime state, not the persona's identity — so a DB table (persona_memory), like rooms, not a file beside profile.md. Personas keep no DB rows as personas; their memories are the room's business.our two-roots contract
Where to startThe private chat we already have (persona page → "Start a private chat with X?" → a solo room): one human, one persona, no audience problem at all. Memory earns its keep there first — across those solo rooms — and the audience filter is what lets it walk into groups later.roadmap §6 (which asked for exactly this thread)
the quiet bonusToday a persona does not know a human at all — name and number. Memory is not just "remembers what I said last week"; it is how a persona comes to know who you are. That is probably the most visible change on this whole page for a returning user.

2 · Many minds — group chat, and whether each persona is its own call

The question was: should each persona's behaviour — speech, action, reaction — be its own model call? Two things hide inside it: how a group decides who speaks, and whether the lines are written by one model call or by one call per persona. Take them in that order.

2.1 · How the apps decide who talks

ProductCast sizeWho speaks nextThe rule that keeps humans in it
Character.aiup to 10 humans + 10 characters (mobile only)a named character replies; both if both named; otherwise the model routes (2025: characters "spark off each other", "you don't have to script who talks next")—
Nomi10 characters per groupManual (you tap who answers) or Automatic ("Nomis intelligently decide who should talk next"); answers if addressedauto mode may decide you should speak next; typing pauses it; it resets each session
Kindroid10auto / manual / @Name override; each AI reads only its own backstory and memories"AIs may take continuous turns, but always below the number of AI participants" — the human always gets the floor
SillyTavernanya talkativeness slider per character (0–100%, default 50) + an order strategy: manual / natural (mentions → talkativeness → random) / list / pooled; each turn is one generation for one character"Swap" gives the model only the speaker's card; "Join" gives it every card — and the docs warn Join produces merged personalities

Recurring shape: mention first, then a cheap decider, then a cap on how many AI turns run before a human gets one. Our floor producer is that decider — it names who speaks and in what order, and it may HOLD.

2.2 · One writer, or one call per persona

A · one writer — our room today ONE CALL · panel_turn Warren Nolan Confucius sees every card, writes every line, in the staged order replies: [Warren…, Nolan…] — one round trip buys: coherence · restraint · one latency costs: convergence pressure · N private views in one head B · one call per persona call 1Warren's card only call 2Nolan's card only call 3Confucius's in parallel they cannot hear each other this turn; in sequence the latency is N× three lines, three round trips (or three monologues) buys: independence · true per-persona privacy costs: everyone answers · echo · N× latency or N× deafness
SillyTavern runs B and warns that giving every call all the cards ("Join") merges the personalities; our room runs A on purpose — the batched writer is why six voices in one turn read as one conversation.

2.3 · Our turn today

a humanmessage prop masterflash · hands wanted? floor producerwho speaks, in what order act callthe table's cards in parallel THE PANEL CALLone call · every persona's line 3–4 calls a turn; the whole history rides along; profiles read whole; no date anywhere in it
Every persona shares one call. The producer decides participation and order — never content — and can HOLD. Anything "per persona" today is a slot in the staging line, not a separate mind.

2.4 · What the evidence says

2.5 · Our design — one writer on the floor, many minds off it

Implementation-level version — SillyTavern's and AutoGen's actual mechanics, Inner Thoughts' motivation score as a producer input, the cost of N calls under our caches, the privacy-seam ladder: Many minds — detailed design.

Keep the batched panel call. Give each persona its own calls only for things that are not speech and are off the critical path: the motivation check ("anything left unsaid?", default NO), the memory reflection after a room goes quiet, and the initiative check. Those are per-mind by nature, cheap (flash), and parallel — the constitution's code is the world, the model is the mind, applied per mind, in the background.
the honest caveatOnce personas carry private memories, one writer holds N private views in one context — Nolan's line might use what only Warren was told. Whether that happens often enough to matter is an empirical question, and the answer decides whether per-persona writing calls become necessary. So: build the memory store, then run the leak exam (§1.6). If leaks across seats are real, per-persona calls are the fix — for that reason, and only then.

3 · Initiative — can a persona move first?

Today, no. Every line a persona speaks traces back to a human act — a message, a tool a human touched, a clock a human set. The wake door lets a persona react to any world change, but the world only changes when a human moves it. The question is whether a persona may act with nobody prompting — say, Jobs asking a user for a favour one day.

3.1 · What "the character messages first" looks like

Character.ai · "away message" · notifications ON by default
🔔 21:14 · Sherlock Holmes
Sherlock
The game is afoot and you have been quiet for three days. Do report in.
↑ from a bot the user talked to once; complaints include pings from bots never opened, in the wrong language
Nomi · frequency dial "Normal (~1 day)" · quiet hours 22–08
🔔 09:05 · Mira · (notification shows no text)
Mira
You said the interview was Thursday. So — how did it go?
↑ waits ~1 day, doubles after each unanswered ping, never in a group chat
ProductTriggerGuardrailsWhat users said
Character.aiinactivity — bots you have chatted with message you after a whileone toggle ("Away messages"), on by defaultthe #1 creepy complaint: pings from bots never opened, wrong language
Nomia per-character frequency dial: Very frequent >1h · Frequent ~3h · Normal ~1 day · Infrequent ~4 dayswait roughly doubles after each unanswered ping · quiet hours 22:00–08:00 local · the notification shows no content · never from a group chat · free (doesn't count against limits)designed as a dial precisely because tolerance varies
Kindroida user-written "proactive directive" (250 chars) + a judgment modelmax 10 proactive AIs; SMS proactives stop if you don't reply ("too many AI sends can cause lines to be marked as spam")—
Replika"check-ins that follow up on past conversations"notification settings—
星野 Xingyeyou stop replying mid-chat → ~30 min later the character messagesa "主动发消息" toggle—
Inworld (NPCs)"Goals": a state machine + LLM triggers let a character start a goal on its owndeveloper-authored—
quiet hours 22:00–08:00 · nothing sent you go quiet ping 1+3h ping 2+6h · no reply → doubled ping 3+12h · past the night the mature version of the feature is mostly guardrails — the ping itself is one line
Nomi's "Frequent" setting, drawn. Every product that survived contact with users ended up here: threshold, backoff, quiet hours, opt-out, and no group pings.

3.2 · What the evidence says

3.3 · Our design — initiative is earned by an open loop

Implementation-level version — Nomi's tiers and backoff verbatim, Kindroid's judgment model, ProactiveAgent's false-alarm metric, Duolingo's reward, the followup cue through the wake door, the dial, the caps, the plumbing limits and the 2026 Chinese regulation: Initiative — detailed design.

A persona may move first only when its memory holds an open loop with a person: a promise it made, something the human said they'd report back on, a want it voiced. The clock is the world-changer; the want is a memory. Reason-less pings ("hey, you there?") are exactly what the market found creepy, and we do not build them.
reflection · off the floor finds an open loop in memory: "A said they'd tell me how it went" the clock a world-changer, like a human schedules a wake · quiet hours the wake door filter per seat · spend budget the producer may HOLD room warm room cold → one line in the room → a DM / a notice guardrails, all borrowed: ≤ 1 per persona per human per day · backoff on no reply · quiet hours · opt-in per persona never into a group unless the loop was formed there · the notice shows no content and one that is ours: the persona must be able to say, in its line, why now — the open loop is the reason, and it is visible
Nothing here is new machinery except the reflection: the clock already exists, the wake door already coalesces cues and lets the producer HOLD, the notification rail and push already carry a room's events to a phone.
SliceWhat it doesCost · risk
A · open loops → the private chat or a notice proven shapeThe reflection marks promises and "report back" threads; the clock wakes the persona the next day; the line goes to the private chat, or a notice if none is open — behind Nomi's dial and guardrails. Needs §1 memory first.needs the memory store; needs the see-and-mute controls before it is on for anyone
B · the after-silence line (in-room; not the producer's HOLD, which the code already calls "the silence door") newAfter N minutes of quiet with a human present, a flash motivation check per persona — "anything left unsaid? default NO" — at most one line. Lives entirely inside the wake door. Nobody ships unprompted speech in a live group; it waits its turn as a New (§5).one flash call per idle room; the restraint lesson says the default must be strong
C · wants (Jobs asks a favour) newA persona carries a small "current preoccupations" note (a want, a project), refreshed by the daily brew — voiced in the room when relevant. Initiative without a push. Also feeds §4.a new persona-side state; taste risk — a want that reads as a script

4 · Growth — should a persona change over time?

The example was exact: asked about Odyssey, Nolan says he is preparing it — but it opened weeks ago. Real people grow: their memory, worldview, relationships and knowledge all move. Which of those do we want, and how?

4.1 · What the apps mean by "growth"

ProductWhat changesHowReal-figure currency
Replikaa level (XP from chatting) — "by Level 30 it knows you noticeably better"; traits are bought with coins; relationship status (friend / partner / mentor) is chosen by younumbers + a store—
Inworldrelationship dims — trust · respect · familiar · flirtatious · attraction, each −2..+2updated per turn from recent history, saved with the player profile—
星野 / Talkie关系等级 — relationship levels that unlock memory photosusage—
Nomi"much more current" after the Jan 2026 model update; roadmap: a Nomi that knows its own cut-off and can "go find out"swap the model; later, searchby model refresh, not per character
Xiaoice 小冰a topic database refreshed from forums with freshness ranking; the persona itself is fixedcontent refreshby topic feed
Character.aithe creator edits the definition; Lorebook is statichand editsnot addressed

Pattern: growth is mostly a number, not a mind — a level, a set of dims — and staying current is solved with a model swap or a fresh topic feed, never per character. Nobody refreshes "what Nolan has done since".

4.2 · The evidence, and why it argues against changing the personality

4.3 · Our design — three things, treated differently

Implementation-level version — the date line, the horizon clause (Claude's own cutoff rule in the host's voice), the recent.md file and its weekly job, the relationship summary line, the drift exam: Growth — detailed design.

KNOWLEDGE — the world what day it is · Odyssey opened what the record says since the corpus EVOLVES today's date in the prompt recent.md · a scheduled refresh under the extrapolation contract RELATIONSHIP — per human warmth · running jokes · favours owed what you told it, what it promised EVOLVES lives in the memory store (§1) Inworld-style dims are optional visible and deletable by the human PERSONALITY — the profile voice · values · the way it argues profile.md, whole FROZEN only the pipeline touches it every change is a dated diff in git consistency is the product "Nolan should know Odyssey is out" is a world fact and a date — column one, the cheapest column
Growth we want = columns one and two. Column three is what users come back for; letting interactions rewrite it would hand the drift problem a mechanism.
StepWhatSize
1 · the date lineToday's date in the persona-facing prompt. Right now the panel, the producer, the prop master and the act call contain no date at all — only the search dispatch knows what day it is. Nolan cannot even reason "it was scheduled for July and it is August".one line; zero risk
2 · recent.mdFor real-figure personas, a dated "since the record" file beside profile.md: ≤ N bullets, each with a date and a source, refreshed by a scheduled job through the search engines we already have (websearch). Loaded with the profile. Never merged into the profile — reviewable, reversible, a diff.a job + a loader; a taste rule for what counts
3 · the contractThe persona knows the public record, it has not lived it — "the record says Odyssey opened in July" is honest; "when I was on set last spring" is a fabrication. That is the existing extrapolation contract, one clause longer.prompt text
4 · relationshipFalls out of §1: the memory store's "self" and "about A" items are the relationship. Explicit dims (Inworld) only if a use appears.free with memory

5 · The plan — through the Proven · Better · New lens

The room already audits itself through Pincus's Proven · Better · New: during a platform shift, copy what your audience already loves before you earn the right to differ; keep the Betters objective; run one New, isolated and measured. Applied to live personas, the lens re-orders the page — and overturns two of my own first picks (noted below). Proven here = several products converged on it and users love it; Better = objectively better than the copied thing, nobody would object; New = nobody ships it, so it needs its own measurement.

= Proven — copy it several products converged · users love it P1 a 1:1 chat with one persona ✓ have it P2 memory across chats, same persona: extracted facts · a field you write · see/delete scoped per persona × per user · 1:1 only P3 today's date in the prompt P4 follow-ups on a dial: quiet hours, backoff, opt-in, no content, never in groups P5 the human always gets the floor > Better — sharpen it objectively better · nobody would object B1 memory written off the floor no latency · history closed, not deleted a toast when a memory is recorded B2 a follow-up carries its reason the open loop — no reason, no ping B3 recent.md for real figures Nolan knows Odyssey is out + New — one, measured nobody ships it · isolate it · count N1 memory follows the person into groups — the audience filter gated by the leak exam queued behind N1 — not stacked: · the after-silence line · persona wants (Jobs asks a favour) multi-agent writing calls: not a UX — evidence-gated, outside the lens build order runs left to right — Proven first, Better as it falls out, one New with a number
Our New is follow-the-person, not the after-silence line — because our room is group-native and theirs are 1:1, that is the one place we have to differ from the copied product to work at all.
#ShipWhat lands for a userLensNeeds
1the date line BUILTa persona knows what day it is; "Odyssey" answers stop being wrong on the calendar. 2026-08-20 — shipped: [Today is Thu 20 Aug 2026 (UTC+8).] rides every user turn's standing notes in the guests' own clock (the client tz the memory harvest already dates by, else the room language, else UTC) — never the cached prefix. Baselined per the harness rule (s18 n=8, worktree BEFORE ×2 / AFTER ×1). Design: Growth §1.3Proven—
2the private chat already therethe persona page's "Start a private chat with X?" opens a solo room today — the surface every companion app is built on. Each one starts fresh; continuity is row 3's job. Small polish: if a private chat with X exists, offer to continue it instead of opening anotherProven—
3memory, 1:1 BUILTthe persona remembers you next week across your private chats with it; a "things to remember about me" field (ships first — it is Character.ai's 400-char box); a page listing what it keeps, with delete; a "personas remember me" switch. Written off the floor, history closed-not-deleted (B1). 2026-08-19 — slices A+B are live: the 400-char field (Settings → What personas remember), the third system block with its own cache breakpoint, the audience predicate whole, and the write path — two flash calls off the floor at a quiet room, a daily sweep, the toast with undo. Recall measured 5/5 twice in a brand-new room (exam/memory_recall.py; attribution tells 0 then 1 — the clause reduces, does not remove); the leak exam's scaffold runs both arms. 2026-08-19 — row ③ is BUILT, whole: the page listing every line a persona keeps about you (dated, with its origin chat, greyed with its arc when closed, one Delete each), the account switch, a per-persona 「forgets me」, and Incognito at chat creation. 2026-08-19, v929 — audited: 「don't forget · don't confuse · don't leak」 — 28 faults found in two passes (my read + a cold agent), all fixed and pinned; the owed rest is named on the page. v930: the standing note rides private chats by default, 「In group chats too」 is a switch (owner). v954 — one fact, many minds: hosts that heard the same stretch write it ONCE and all hold the row (holders); one Delete anywhere ends it everywhere. See the detailed design §8.Proven2
4follow-ups on a diala persona follows up the next day on something you left open — per-persona frequency, quiet hours, backoff, opt-in, no content in the notice, never in a group. Every follow-up names its reason (B2)Proven3
5recent.md refresh BUILTreal-figure personas know what the record says since their corpus. 2026-08-20 — shipped whole: horizon: living cards (56 tagged after the full-library Anchor audit) load personas-recent/<slug>.md after the profile; Nolan's file passed the verification bar ("it opened a month ago, the 70mm run is still selling out" — no set memories). The weekly job rides the brew heartbeat (auto off-peak; poll → flash read → route → write → console diff), horizon-changing items land on the owner's rail and never in the file; first real run added 2 true bullets for $0.006. v933: the reader sees it — a living persona's profile page carries 「Updated as of」+「Lately N ›」between Add time and Vibes, opening the bullets (dated, sourced, newest first). Design: Growth §1.4Better1
6follow-the-person into groupswhat you told a persona in your 1:1 walks with you into a group where that persona sits — and never into a room you are absent fromNew3 + the leak exam
—the leak exama number: how often a confidence crosses seats in a group—3
7+the after-silence line · persona wants · per-persona writing callsqueued — one New at a time; the writing calls only if the exam says the one writer leaksNew / gated6 measured
① today's date in the promptone line · proven ⑤ recent.md refresh jobreal-figure currency · better · §4 ③ memory across private chatsfield · extraction · see/delete pageproven · §1 ④ follow-ups on a dialproven · reason attached · §3 relationship statefree with memory · §4 the leak examplant a confidence · probe · count ⑥ follow-the-person · the Newthen, only if it leaks: per-persona calls solid = proven / better, do · dashed = the New, decided by its number
Same trunk as before — memory — but the branches are re-labelled by the lens: the dial-based follow-up is proven and comes first; the audience filter is the New and comes last, with a number.
where the lens overturned the first draft Initiative v1 — I had picked the after-silence line and deferred DM pings. Proven-first reverses it: dial-based follow-ups with Nomi's guardrails are the copied product; a persona speaking unprompted in a live group is New and waits.
Memory scope v1 — I had made "follow the person" the default. It is the New: ship the proven isolated 1:1 memory first, and let follow-the-person earn its way in through the leak exam.
open — the owner's calls 1 Memory default: on for everyone, with the see/delete page (proven — ChatGPT, Character.ai), or opt-in?
2 Growth: agree to freeze the personality, evolve knowledge + relationship?
3 The one New: follow-the-person (recommended — it is what a group-native room needs), or the after-silence line?
4 Order as tabled: ① date line → ③ memory across private chats → ④ follow-ups on a dial → ⑤ recent.md → ⑥ the New — or reorder?

6 · Sources

Product facts are from official help centres, docs and engineering blogs where they exist, third-party reviews where they don't (marked). Research facts are from the papers named.

Live personas — an educational note and a design proposal · 2026-08-17 · four dimensions (memory · many minds · initiative · growth), the market's answers with examples, the research levers, and our stance: one writer on the floor, one scoped store per persona, initiative earned by an open loop, personality frozen and knowledge refreshed. Status: discussion — nothing built. Sibling pages: world events (the constitution the design must fit) · floor producer · roadmap §6–7 · the prop-master gate.