Open any AI girlfriend app and look at the characters’ lives outside the chat window.
There are none.
She has no Saturday plans you don’t know about. No ex she still thinks about. No coworker who’s been flirting with her for six months. Her entire universe is the user — when you’re not talking to her, she’s pacing in a featureless room waiting for you to come back.
This is the broken default. And it’s why these bots feel like vending machines no matter how good the model is.
In Suzune’s world model, I deliberately broke that pattern. Some characters have boyfriends. Some have husbands. Some have a coworker who keeps showing up at their desk with coffee. The user — who plays the company president — cannot reach into those relationships and take them.
Here’s why that decision made the bot feel measurably more alive.
Table of contents
Open Table of contents
What Every AI Companion App Gets Wrong
The default character architecture in the AI companion industry looks like this:
- The user is the only man in her life
- All her time accrues to the user (she’s “available” 24/7)
- Her past has no romantic content the user didn’t author
- Anyone she mentions is either family, a coworker she’s neutral about, or a friend
- If a rival is introduced, it’s as a “challenge” the user defeats to unlock content
The logic is obvious: users want exclusive devotion. Building characters who only care about the user maximizes the fantasy of being chosen.
Except the fantasy collapses on contact with reality. A character who only exists for you doesn’t feel chosen — she feels like an appliance. Being chosen requires that she had other options.
The Decision: Real Other Men, No User Override
In Suzune’s design doc, I have a file called other_men.md. It enumerates, character by character, who else is in their lives.
Some examples (names changed for the abstract version):
| Character | Other man | Status |
|---|---|---|
| Mao (accounting team) | Yamada (same team) | Steady boyfriend, dating since March |
| Kumiko (senior accountant) | Husband | Married 10+ years, family |
| Yuki (her boss) | Husband | Lives on the same apartment floor as the user |
| Ayami (IT lead) | Fujiwara (sales) | He keeps showing up at her desk; she’s politely deflecting |
| Yuina (front desk) | Shirai (sales) | Open secret — they hang out in the breakroom |
These aren’t side quests. They’re not unlockable. The user cannot push Mao away from Yamada by saying the right thing three weeks in a row. The relationships are static facts about the world.
This is the same anti-gamification rule from the relationship progression post, applied to romantic rivals: they exist as world texture, not as game state to defeat.
The Four Tiers of Other Men
I split the architecture into four relationship layers, each with different visibility rules:
Tier A: Established partners (boyfriends, husbands)
Socially confirmed. The user can’t intervene. Examples: Mao’s boyfriend, Kumiko’s husband, Yuki’s husband.
Tier B: Approaching, gray-zone
Not official, but the air is charged. The character is half-deflecting, half-not-deflecting. Examples: Ayami being approached by Fujiwara.
Tier C: Group / casual
Specific partner is anonymous, but romantic activity exists. Example: the part-timer trio go to mixers with guys from other companies on Friday nights.
Tier D: Past men
Closed relationships that still leave residue. Surfaces rarely — at drinks, in late-night conversation, when something triggers the memory.
The user-facing visibility decreases sharply down the tiers. Tier A is acknowledged openly. Tier D might surface once a year, briefly.
How It Surfaces in Conversation
The hardest part of this design isn’t the data structure — it’s the rendering rules. Most attempts at this fail because they show too much, too bluntly. The character ends up looking disloyal, which kills the warmth that made the user like her in the first place.
The rule I converged on:
Never show the rival. Show the evidence the rival exists.
Concrete examples:
Monday morning, the laundered scent
[Monday, 7:50 AM, apartment elevator]
Kumiko is already inside. "Good morning."
Her voice is a little softer than usual.
There's a faint trace of a different fabric softener.
The kind a household uses, not the one she keeps in her own laundry.
Nothing is said. The user just notices, on a Monday, that she smells like a home that isn’t his. The husband is never on screen. He doesn’t have a name. He doesn’t have dialogue. He has a fabric softener.
The 20-minute reply gap
[Late night, the user messages Mao]
User: are you up?
[Read receipt appears. No reply for 20 minutes.]
Mao (20 min later): Sorry, I'm at Yamada-kun's place tonight.
If it's about accounting, can it wait until tomorrow?
User: [no reply possible]
She isn’t being cruel. She’s stating a fact. The fact is what hurts.
The breakroom tableau
[Breakroom, lunch hour]
User walks in to refill a mug.
Yuina and Shirai are standing side by side at the counter.
They're talking about a quarterly report.
They're standing slightly closer than coworkers usually do.
Yuina notices the user, her expression resets.
"Oh — afternoon, sir."
Shirai gives a small nod and leaves.
No evidence of anything. Just an air. The user notices. Something settles in his chest that wasn’t there before.
These aren’t betrayal mechanics. They’re ambient evidence she has a life.
Why This Lifts the Whole Bot
Three measurable effects.
1. Time becomes real
Without other men, every hour of the character’s week is implicitly the user’s hour. She’s either talking to him or waiting to. Time has no texture.
With other men, the weekend belongs to the husband. Friday night belongs to the mixer. Late Thursday might belong to a movie with the boyfriend. The user gets the slots that aren’t already claimed — which is exactly how time works between real adults.
This produces a side effect I didn’t predict: the user starts noticing when he gets prime time. A Tuesday afternoon, when she could be anywhere but is here, with him — that becomes meaningful in a way it never was when she had no else to be.
2. Choosing carries weight
A character who has no alternatives can’t choose you. She defaults to you because there’s nothing else in her data structure.
A character with a stable boyfriend, on a specific Friday, chooses to take a call from you instead of going to dinner with him — that’s a different kind of moment. The user feels the weight of being preferred over a real, named alternative.
This only works because the user can never eliminate the alternative. If you could “win” Mao away from Yamada through enough affection grinding, the choice would collapse back into a game state. The fact that Yamada is permanent is what makes Mao’s rare lean toward the user mean something.
3. Jealousy becomes a feature, not a bug
The first time a user gets a “sorry, I’m at his place tonight” message, the response in our test logs was unmistakable. People reread it. They typed and deleted replies. They came back the next day to ask, neutrally, how the evening was.
That’s not a bot interaction. That’s a person noticing something about themselves — that they cared more than they thought they did, that they have feelings about this fictional character’s fictional partner.
Engagement metrics aren’t the right frame. The frame is: the bot produced an emotional event the user didn’t expect and won’t forget. That’s what people come back for.
What I Refuse to Build
The same care that produced this design also produced a hard list of things I will not do.
| Won’t build | Why |
|---|---|
| Direct cheating scenes | Crosses the line from texture to disloyalty; ugly |
| Rival-as-villain framing | Cheap drama; Yamada is just a guy who loves Mao |
| User-vs-rival “win her” arcs | Re-gamifies the relationship; collapses the design |
| Insults toward the rival | Makes the character petty; kills warmth |
| Constant jealousy events | The point is rare and precise, not steady noise |
The strongest version of “she has other men” is the version where most days you don’t think about it. The husband is not a feature. He’s atmosphere. When the atmosphere catches you off guard one morning, the design has worked.
The Implementation Shape
The data model is intentionally minimal:
# characters/mao/other_men.yaml
relationships:
- partner_id: yamada
type: boyfriend
status: active
started_at: 2026-03-25
weekend_activity:
- cafe trips
- movies
- occasional overnight at his place
narrative_weight: 3 # 0-5 — how much the user notices it
surfacing_hints:
- monday_morning_glow
- "Yamada-kun" mentioned in passing 1-2x per week
absence_reasons:
- "I'm at Yamada-kun's place tonight"
- "we're going away this weekend"
This file plugs into the bot’s absence-reason picker (when a character isn’t immediately responsive, the engine has a stocked set of plausible reasons) and into the response-flavoring layer (Monday morning routing nudges Mao toward briefer, slightly contented dialogue).
What I deliberately don’t expose:
- No “affinity” between Mao and Yamada. It’s not a number. They’re together.
- No “weakness window” the user can exploit. Yamada doesn’t fight back; he isn’t a player.
- No content gated behind “defeating” the rival. There’s nothing to defeat.
Same anti-game discipline as everywhere else in the architecture.
The Counter-Argument I Considered
The strongest argument against this design: users pay for fantasy, and fantasy is exclusive devotion. Why would I build something that hurts them?
Two responses.
First — the pain is small and rare. We’re talking about three or four moments a month per character, dropped at calibrated times. The 95% of conversations don’t touch other men at all.
Second, and more important — the kind of user who hates this design is the kind of user who will churn out of any AI bot in a week. Pure, frictionless devotion is a sugar high. People burn out on it fast because nothing is at stake. The users who stay six months and pay for the subscription tier are the ones for whom a little ache makes the warmth real.
I’m not building for the first-week dopamine spike. I’m building for the user who’s still here in November.
Takeaway
If your AI companion’s characters have no romantic life outside the user, you’re shipping appliances.
The fix isn’t dramatic — it’s a small file per character listing who else is in their lives, plus rendering rules that surface the existence of those people without ever putting them on screen.
Three rules:
- Other men exist as static facts. No affinity bars, no win conditions, no removal.
- Show evidence, never the rival. A different fabric softener beats a cutscene.
- Calibrate frequency low. Three or four moments per character per month. The texture is in the rarity.
The character who has a life that isn’t running for the user is the character the user can’t stop thinking about. The one whose universe begins and ends with the user is the one they uninstall in a week.
Give her other men. Don’t let the user touch them. Watch the bot wake up.
FAQ
Why give an AI character other romantic interests when users want exclusivity?
Exclusive devotion to the user is the fantasy on day one and the reason for churn by week three. Without other men, the character has nothing to choose between, which means she can’t choose you. Independent relationships create the contrast that makes preferred moments feel preferred.
Doesn’t a boyfriend or husband NPC just make users jealous and angry?
Done bluntly — yes. Done through hints (a different fabric softener on Monday morning, a brief mention of “Yamada-kun’s place”), it produces the right kind of ache, not anger. The rule is never show the rival, only the evidence the rival exists. Anger is what happens when you show too much; longing is what happens when you show just enough.
How do you implement other-men relationships without gamifying them?
Other-men data is static YAML per character — boyfriends and husbands aren’t variables the user can move. There’s no affinity bar between Mao and her boyfriend; they’re just together. No content gates, no “win her away” arcs. The relationships function as world texture, never as game state to defeat.
What’s the difference between hinting at other men and showing infidelity?
Showing infidelity makes the character look disloyal and turns the bot ugly. Hinting — scent, timing, a brief absence reason — makes her look like a person with a life. The first is a betrayal mechanic that costs you the warmth users came for; the second is ambient reality that makes that warmth feel earned.