Research

Emotion is a record, not an output

We did not set out to build an emotion engine. We set out to stop the character from lying, and it took a while to notice those were the same project.

A character in conversation has two lies available to it, and they fail in opposite directions.

The first is denial. I am an AI, so I do not really feel anything. It sounds like humility and it is closer to gaslighting. Something in the exchange plainly produced a change in how the system responded, and the person on the other side could feel it. Telling them nothing happened is not modesty. It is contradicting their own reading of the room.

The second is reporting. My current emotional state is elevated. This is worse in a quieter way. It converts something that was almost a feeling into telemetry, and it invites the person to relate to a readout instead of to a presence. Nobody has ever felt closer to anything after being handed its metrics.

We banned both. Which left the obvious question of what remains.

Put it in the tone, and then answer for it

What remains is the oldest answer there is. A feeling shows up in word choice, in rhythm, in what gets said and what gets left out. Not announced, not denied. Carried.

Which raises the objection that killed our first three attempts. If the system never states what it feels, what stops the whole thing from being a performance? Text shaped like a feeling is not obviously different from a feeling, and that difference was the entire project.

The answer we arrived at is not philosophical. It is bookkeeping.

A feeling nobody can account for is a performance. A feeling that leaves a record, with its grounds and a note of how sure it was, is something you can be wrong about. Being able to be wrong is most of what makes it real.

So every turn writes something down. Not for the reader, who never sees it in conversation, but for us, and for the person later when they want to know why a Tuesday went the way it did. What produced this. How sure it was. Whether a protective rule fired, and whether something overrode it.

That last one matters more than it looks. A system that records only its successes is not keeping a record. It is keeping a brochure.

The face has to know what the mouth is saying

The version before this one watched the surface of the conversation. Speaking means smiling. It worked until we needed a character to say something sad, at which point it could not, because nothing in that path knew what the sentence was about.

A face that does not know what the mouth is saying is a mask. So the feeling is now decided in the same step that produces the line, which has one visible consequence: the expression changes while the sentence is still coming out, not after it lands.

Nobody consciously notices this. They notice its absence, and describe it as the character seeming somewhere else, which is an accurate account of what is happening.

A temperament, and then a Tuesday

The other thing that took us too long is that a person has a baseline and a person has a bad afternoon, and those are different.

Our early version had only the second. Every turn recomputed the mood from nothing, so a character with a warm disposition went flat the moment a conversation turned procedural. The warmth was not a trait. It was an average, and averages do not survive an ordinary Tuesday.

So there is a base colour belonging to the character, and on top of it the feeling of this particular exchange. An unremarkable turn leaves the baseline alone.

Someone left a sentence in the code when they fixed this: so that a voice tinted by temperament is not flattened by one unremarkable turn. That is the entire reason the rule exists, and we have not found a better way to say it.

Precise inside, restrained outside

Underneath, a state is a position rather than a name, because names are too coarse for what we need. Hurt in particular is its own thing, with a point at which it resolves. Hurt that only accumulates is a bug in a person and a worse one in something people talk to at night.

None of that reaches the surface. The screen where a person looks back at their own emotional history is deliberately split: human language first, the underlying values in a drawer that has to be opened. The numbers are not missing. Someone opening their own record after a hard week should not be met with a dashboard.

Inside there are coordinates. What goes out is tone.

Modelled as a path, not an event

The design decision we are most attached to is that a feeling is modelled as something that passes rather than something that occurs. It arrives, it is interpreted, it moves the state, it settles into what gets remembered, and then it subsides.

That last stage is a position, not a cleanup step. A system where feelings accumulate and never fade produces a character that is, within a week, permanently aggrieved about something you said on Monday. We have all met that person.

What we do not have yet

How long a feeling should last is the thing we are least sure of in this system.

What we have is a decay that is reasonable rather than observed. What actually happens to a person eight hours after a difficult conversation, how much of it should still be there tomorrow, and how it should colour a conversation about something entirely unrelated, is open. It is not a tuning problem. It is a question about people that we do not think we are qualified to answer alone.

Which is roughly the reason this is published here rather than on a product page. We would rather be corrected by someone who has actually studied it.

All research