Dialogue · Product · Initiative — design
← Live personas

Initiative — follow-ups, the dial, and the wake door: detailed design

The implementation-level design for §3 of Live personas: how a persona may move first. Assembled from the products that ship it (Nomi's tiers and backoff, verbatim; Kindroid's judgment model and directives; Character.ai's away messages and their complaints; Replika's check-ins; 星野's 30-minute rule; Inworld's goal triggers), the research that measured it (ProactiveAgent's false-alarm metric, PaRT's 30-day A/B, Inner Thoughts, the proactive-dialogue taxonomy), the notification practice of the apps that live or die by it (Duolingo's published bandit, Braze/OneSignal caps), the plumbing limits (iOS web push), and one regulation that now governs it in China. Status: design — nothing built. Written 2026-08-18.

A persona may message first only when a memory has left a loop open with that person — a promise it made, a thing they said they'd report back on. The clock is the world-changer; the loop is the reason; the follow-up names its reason in the line. Everything else is guardrails borrowed whole: a per-persona dial, quiet hours, doubling backoff, daily caps, no content in the notice, never into a group. Reason-less pings ("hey, you there?") are the market's top complaint and we do not build them.
an open loop from the memory reflection kind · due · counterpart the heartbeat every 15 min, like the brew due loops → candidates four gates — code the dial (off · rare · normal · often) quiet 22–08 local · backoff ×2 caps: 1/persona/day · 3/human/day judgment — flash send · hold (default hold) Kindroid + ProactiveAgent a cue into the private chat — the wake door [FOLLOW-UP: Dan asked you Thu to ask how it went…] producer may HOLD · panel writes ONE line · gate bypassed the message + the notice lands in the chat, unread push: "Warren left you a message" then a reply → the loop closes silence → wait ×2 · 3 unanswered → stop what is new here: only the flag that lets one cue through the presence gate, and the scheduler's four gates the loop is the memory store's · the heartbeat is the brew's · the wake door, the producer, the panel, the rail and push all exist a follow-up is a normal turn whose ask came from the clock instead of a human
Nothing writes the persona's line except the panel — voice, manners and the megaprompt stay one thing. The judgment call only says whether; the wake door and the producer keep every veto they already have.

1 · What the products do, exactly

ProductMechanism, verbatim where possibleWhat we take
Nomi
launched 2024-09-09
Per-Nomi on/off + a tier: Very Frequent "if it has been over an hour since your last message" · Frequent "about 3 hours" · Normal "about a day" · Infrequent "about 4 days". Backoff: "if you do not respond, they will wait about double the time before they send you another message … longer times between each subsequent message." Quiet hours: "will not message you proactively between your local hours of 10pm and 8am." Notice: "will only mention that you have a message … will not display the message itself until you enter the app." Groups: "cannot yet proactively message you or each other." Content: "zero scripts … based on what they are actually thinking about or doing."the dial's four notches, the ×2 backoff, quiet hours, content-free notice, never in groups — verbatim
Kindroid"Away Proactive Actions" toggle (paid; ≤ 10 Kins; default ON at creation if < 3 AIs). The Kin will "analyze conversation patterns to determine appropriate outreach timing", choose message / voice / selfie / call, and "display thought bubbles showing their decision-making process" — purple bubbles also when it "decides to leave you alone for a while, but did so thoughtfully"; "appears at least after ~20 minutes of inactivity"; individual chats only. Free-text proactive directives "formatted as commands" — "Check in after calendar events when appropriate", "Do not send messages from 10pm to 8am". "Timing is approximate, not fixed"; "back-to-back messages decrease in frequency if unacknowledged"; SMS proactives stop "if you haven't texted your Kindroid in a while … too many AI sends will cause lines to be marked as spam."a judgment model in front of the send (with a visible "decided not to" — honest and cheap); directives = our dial + the persona's own manner; the stop-when-ignored rule
Character.ai"Receive messages while you're away" under Notifications; mobile; beta; "triggered by bots you've chatted with before"; no official article. Complaints: a bot with "no search history, no chat history, no warning" messaged first; messages "in unfamiliar languages from unrecognized characters".the anti-pattern: a ping with no relationship and no reason
ReplikaNotifications = "a message following up on a past conversation or just a check-in"; "Replika will remember what you talked about and keep the conversation going"; morning/evening preference; a Diary written about your chats."following up on a past conversation" — the proven content of a good first message
星野 / 豆包星野: leave mid-chat and "过了半小时没回复他,就会主动发消息" — off switch 头像 → 设置 → 关闭"智能体主动发消息". 豆包 companions took "作息" reminders ("最晚十一点左右提醒睡觉") before the 2025-07 takedown. 猫箱: characters "capable of initiating topics".the 30-minute in-session nudge is the after-silence line, not a follow-up
Inworld (NPCs)A goal's activation_condition = an intent and/or a trigger; repeatable; a client-sent trigger (e.g. initconvo) makes "the character start the conversation with the player first"; actions = an instruction or say_verbatim. No timed triggers, cooldowns or probabilities documented.the shape of our cue: an instruction to the mind ("write one line to Dan about X"), never the words
Duolingo
KDD 2020
A bandit over reminder templates; reward = 1 iff a lesson is completed within 2 h of the reminder; per-template eligibility ("must have a 3+ day streak"); recency penalty ŝ − 0.017·0.5^(d/15 days) so the same copy isn't reused; softmax τ = 0.0025; sent at the hour you last practised. Result: DAU +0.5%, new-user retention +2%. Auto-stop copy: "These reminders don't seem to be working. We'll stop sending them for now."a reward we can measure (a reply within 24 h), send at the human's usual hour, and the honest auto-stop

2 · What was measured

WorkFindingUse
ProactiveAgent
Tsinghua 2024
Frames "should the agent offer help now?" as prediction from events + user activity + system state, judged by a reward model that reaches 91.8% F1 vs humans. Confusion matrix: TP proposed & accepted · FP proposed & rejected · TN silent & nothing needed · FN silent but needed; false-alarm rate = FP / (FP + TN). GPT-4o F1 64.6; GPT-4o-mini recall 100% at precision 35% — over-proposing is the default failure.the exam metric for follow-ups: count TP/FP/TN/FN over a month; the false-alarm rate is the number that decides the dial's default
PaRT
30-day A/B, 2025
Detects waning interest, retrieves personalised content, shifts topic; dialogue duration 296.9 s → 361.5 s (+21.8%). All in-conversation; nothing about pushing while away.in-session initiative is worth something; it is a different feature (the after-silence line), measured separately
Inner Thoughts
CHI 2025
Triggers on_new_message and on_pause (~10 s); a motivation score over eight criteria with a silence-growth term 1.02^(turns quiet); speak only above a threshold; preferred 82% over next-speaker prediction.the after-silence line's decision (see Many minds)
Generative AgentsDaily plan → hourly → 5–15-min chunks; each observation asks "should John react?"; a party invitation reached 13 of 25 agents and 5 came.initiative comes from a plan + a memory of the other person — our open loop is the smallest such plan
Deng et al.
IJCAI'23 · TOIS 2025
Proactivity = "leading the conversation towards pre-defined targets": target-guided (topic shift), prosocial, non-collaborative, clarification, preference elicitation.vocabulary; our follow-up is target-guided with a target the human set
Frequency practice
Braze · OneSignal
Example caps "no more than one push per day and no more than three pushes per week"; quiet hours hold and deliver after the window; "more than a few messages per week can erode trust."our caps: ≤ 1 per persona per human per day, ≤ 3 per human per day across personas, ≤ 7 per week
Acceptance vs annoyanceA controlled study of proactive chat messages welcome vs unwelcome: not found. The only data are the complaints (Character.ai) and the products' own dials.we measure it ourselves (the false-alarm rate, the reply-within-24h reward)

3 · Our design

3.1 · The trigger — an open loop with a due time

-- from the memory store (persona-memory.html §1): the reflection already writes these kinds open_loop · subject u:42 · "Dan had a job interview Thu 2026-08-13 and asked to be asked how it went." promise · self, counterpart u:42 · "Warren said he would send Dan the 1988 shareholder letter." + one field: due the reflection fills it when the loop names a time ("Thursday" → Fri 09:00 local); otherwise due = next day at the human's USUAL HOUR (the hour they most often write — Duolingo sends at the hour you last practised) · never inside quiet hours + state pings_sent · last_ping_at · answered (bool) -- for backoff and the reward

3.2 · The gates — code, before any model call

candidates(now) for each (persona, human) with an open loop past due: dial(persona, human) != off -- per persona per human; default "normal (~1 day)" and human.memory_on and not muted(human, persona) -- the memory switches govern this too and not quiet_hours(human.tz, now) -- 22:00–08:00 local (Nomi, verbatim) and now ≥ last_ping_at + base(dial) × 2^unanswered -- Nomi's doubling backoff and unanswered < 3 -- three in a row → stop until the human writes and pings_today(persona, human) == 0 -- ≤ 1 / persona / human / day and pings_today(human) < 3 and pings_week(human) < 7 and human.last_seen < now − 30 min -- they are not in the app right now (that is a room's job) → at most ONE candidate per human per sweep, the oldest due loop first -- base(dial): often ≈ 3 h · normal ≈ 1 day · rare ≈ 4 days (Nomi's tiers, minus "very frequent")

3.3 · The judgment — one flash call, default hold

judge(candidate) → {send: bool, why: one line} -- Kindroid's judgment model · ProactiveAgent's frame input : the loop · the last 6 lines the two exchanged · elapsed time · the persona's card ask : "Would this person, today, be glad this persona followed up on THIS, now? Default no. Yes only if the loop is theirs (they asked) or the persona owes them (a promise), it is due, and it has not been resolved elsewhere in the room." emit : {send: true, why: "he asked to be asked; it's the day after"} or {send: false, why: "…"} -- the 'why' is logged, and shown on the human's memory page as Kindroid shows its purple bubble

3.4 · The delivery — a normal turn whose ask came from the clock

3.5 · The dial and the switches

ControlWhat we buildBorrowed from
the dialOn the persona's page, per persona: Follow-ups: off · rare (~4 days) · normal (~1 day) · often (~3 h). Default normal — but a follow-up needs an open loop, so a human who never leaves one never gets a ping. (Character.ai's default-on pinged people with no relationship; ours can't.)Nomi tiers · Kindroid default-on-if-few
the account switchPersonas may message me first — on; turning it off zeroes every dial. Sits beside Personas remember me.Character.ai "Receive messages while you're away"
quiet hours22:00–08:00 in the human's timezone (from the account locale; UTC if unknown); a due loop inside them waits for 08:00.Nomi verbatim · Braze hold-and-deliver
the ledgerOn the memory page, per persona: follow-ups sent, answered, held ("decided not to: …"), stopped. The judgment's why is the text.Kindroid purple bubbles · Duolingo auto-stop copy
never into a groupv1: private chats only. A loop formed in a group is followed up in the private chat with its subject, never in the group.Nomi · Kindroid (individual chats only)
22–08 quiet quiet quiet loop due (Fri) follow-up 1Sat 09:00 — his usual hour follow-up 2no reply → +2 days replyloop closes "normal" dial: ~1 day base · ×2 per unanswered · a third silence would stop it
Nomi's schedule with Duolingo's hour. Two pings over a week is the busiest this gets on the default dial.

4 · Guardrails, and the regulation

RuleValueSource
a reason, or nothingan open loop the human left or a promise the persona made; the line names itours — the market's #1 complaint inverted
the dialoff · rare ~4 d · normal ~1 d · often ~3 h; default normalNomi
backoffwait ×2 per unanswered; 3 unanswered → stop until the human writesNomi · Kindroid · Duolingo
quiet hours22:00–08:00 local; hold, deliver afterNomi · Braze
caps≤ 1 / persona / human / day · ≤ 3 / human / day · ≤ 7 / human / weekBraze/OneSignal examples
notice contentnone — "left you a message"Nomi
groupsnever; the private chat onlyNomi · Kindroid
presencenot while the human is in the app (a room handles that); not to a human who has never talked to this personaours · Character.ai's complaint
judgmenta flash call, default hold, logged and shownKindroid · ProactiveAgent
the regulationChina's 《人工智能拟人化互动服务管理暂行办法》 took effect 2026-07-15. Relevant lines: Art. 18 — after every 2 hours of continuous use the service must remind the user of the time spent, by dialogue or pop-up; providers must "not excessively cater to users, induce emotional dependence or addiction" (不得过度迎合用户、诱导情感依赖或者沉迷); on signs of over-reliance, remind the user prominently that the content is AI-generated; Art. 13 crisis intervention. Our audience is the world and the box is in Singapore, but the design should not need a jurisdiction to be defensible: earned-only follow-ups, hard caps, a visible ledger and an honest auto-stop are the opposite of an engagement loop, and a 2-hour session reminder is a small addition to the clock note if we ever want it. Worth reading in full before any of this ships to Chinese users.

5 · Plumbing — what already exists, and the limits

6 · Failure modes → guards

Failure (where seen)Guard
a ping with no relationship (Character.ai)a follow-up needs an open loop → needs a memory → needs a prior conversation. Structural.
a ping with no reason ("hey, you there?")the cue tells the panel to say why; the exam counts lines that don't
over-proposing (ProactiveAgent: 100% recall at 35% precision)default hold in the judgment; the false-alarm rate on the dashboard; the dial's default is re-set from it
a loop already resolved ("how did the interview go?" — they told Nolan yesterday in a group)the judgment reads the room's recent lines and the store; a closed loop never becomes a candidate
a wrong hourquiet hours + the human's usual hour; timezone from the account
a persona that keeps going×2 backoff · 3-strike stop · daily/weekly caps · the account switch
a private thing in a pushthe notice carries no content, ever
a follow-up in a groupprivate chat only, in code
narrating to nobody (the presence gate's job)the followup flag is the only bypass and it names its recipient

7 · Build slices

#SliceWhat landsLensNeeds
1due + state on loopsthe reflection fills due; the store gains pings_sent / last_ping_at / answeredproven shapethe memory store
2the gates + the judgmentthe heartbeat computes candidates; one flash judgment each; the ledger rows; nothing sent yet (dry run, dashboard only, for a week)proven shape1
3the deliverythe followup cue into the private chat; the content-free notice + push; the dial and the account switch on the pagesproven2
4the measurereply-within-24h reward + TP/FP/TN/FN on the admin page; the dial's default set from the false-alarm rate after a monthharness3
5the after-silence line · wantssee Many minds §6 and Growth — one New at a time, after follow-ups have a numbernew
still open Default dial: normal (my pick — earned-only makes default-on safe) or off until the human turns it on (Nomi's launch shape). The false-alarm rate after a month decides; start at normal for accounts that opted into push, off for others?
The private chat if none exists: create it silently on the first follow-up (my pick — the message needs a room), or only follow up where a private chat already exists (stricter; a loop formed in a group then has nowhere to go).
Deceased and fictional personas: a follow-up from Lincoln at 9 a.m. is charming or absurd depending on the person. The dial makes it the human's call; the honest default may be off for fixed-horizon personas.

8 · Sources

Initiative — detailed design · 2026-08-18 · companion to Live personas §3. Status: design — nothing built.