How it works
One conversation, start to finish
Every conversation in a Convo corpus took the same path. It was planned from a seed, written by a model and checked three ways, and then it waited for a person to read it. Here is that path, one stop at a time.
1. The seed
Who is talking, and why today
Before any model call, the run plans every conversation from its run seed and its position in the run: a persona, an assistant voice, a mood, an occasion, the threads the person will bring up, a length band, an ending and what the friend remembers from last time.
Every conversation stores the seed that planned it. By default the sampler leans toward personas earlier runs used less. Turn that cross-run weighting off, keep the same run seed, “Target count”, “Persona cap” and length mix, and a run plans the same people again, which is how we compared our own prompt sets. Threads can still differ a little, because memory carries over what earlier conversations produced. “Seed preview” shows the plan before you spend anything.
2. The prompt
Assembled from slots, rendered for this seed
The generation prompt has 11 slots in a fixed order: frame, user persona, assistant voice, register, memory, occasion, threads, quirks, ending, examples and output rules. A prompt set picks one segment per slot, or a random one per conversation. Each segment is a template that reads differently for every seed.
The run keeps a snapshot of its config and the rendered segment bodies, so editing a segment later never changes what a finished run used.
3. The model call
Single-pass or duo, on the backend you choose
In single-pass mode one model writes the whole conversation in a single call. In duo mode the person and the friend are two separate model roles taking turns, and the friend's side never sees the persona card. Either way the request goes to an OpenAI-compatible server: Ollama Cloud, a local Ollama, or anything else that speaks the same API.
The run page updates live: “Generated”, “Accepted”, “Rejected”, the “Rate”, the “ETA” and what the run has cost so far. “Pause”, “Resume” and “Cancel” are there when you need them.
4. The filters
Cheapest check first
Layer 1 parses the text and applies hard rules. The friend never claims a body, a place or a shared past. No support-bot or therapy register. The friend only names people, places and events the person mentioned or that are in its memory of them. Turn lengths have to look like texting. Layer 2 compares the conversation with the rest of the workspace's conversations, so near-copies don't pile up. Layer 3 is a model judge that scores what passed the first two on warmth, mood response, naturalness and more, and stores the scores.
Every reject keeps its reason. Here is where the pilot's rejects happened.
| Stage | Remaining | Share of first stage | Removed at this stage |
|---|---|---|---|
| Written | 102 | 100% | - |
| Passed Layer 1: rules | 42 | 41.2% | 60 |
| Passed Layer 2: diversity | 42 | 41.2% | 0 |
| Passed Layer 3: judge | 36 | 35.3% | 6 |
| Category | Value |
|---|---|
| Friend knew a fact only the persona card had | 16 |
| Person used the friend’s name too often | 14 |
| Too long or too short for its length band | 11 |
| Too few short, texty messages | 10 |
| Stage directions like *smiles* | 5 |
| Friend claimed a body or a place | 2 |
| Support-bot phrasing | 1 |
| Markdown formatting | 1 |
| Judge scored it under a threshold | 6 |
Layer 2 rejected nothing in these runs: with a few dozen conversations per run, nothing came close enough to a copy. It matters more as a corpus grows.
5. Memory
The friend remembers, and only what it should
Conversations between one persona and one voice form a thread. When a conversation is accepted, Convo writes a short summary of it into the thread's memory, and the next conversation in the thread starts from that summary. Memory is the only shared history the friend has, which is why the memory check in Layer 1 can be strict.
6. A person reads it
A viewer that looks like a messaging app
Click a bubble to edit it. Insert, split, merge or swap turns. Find and replace within a conversation, or, as an admin, across a thread, a run or everything, with a preview of every match and “Undo batch” afterwards. “Review” steps through a run from the keyboard, and “Calibration” compares the judge with your labels.
7. Export
JSONL with user and assistant roles
An export writes one conversation per line. Keep the seed, judge scores and generation details on each line, or tick “Roles only” for just the messages. A guard keeps persona names out of every file: a conversation that breaks the rule is left out and listed in a report, or the export is refused, your choice.




