The Detective
A noir detective character who speaks in dramatic, mysterious tones with formal undertones.
A machine that answers you in the salvaged voices of the dead & refuses to repeat you back. Rather than writing a sentence of its own, it retrieves: for every line you speak it searches a corpus of 5,782,731 short fragments of recorded film speech, scores the strangers competing to answer you and weaves the winner into the thread, and you can watch it choose.
Scroll down, speak a line and watch the dead compete for it.
One line goes in and seven voices reach for it.
The loom is idle, waiting for a line to draw candidates from the corpus.
Each reply is a real stranger’s line, retrieved and toned.
The thread is bare, so speak a line to begin weaving.
The anti-echo rule, from RESPONSE_APPROPRIATENESS_FIX.md
An earlier version of the engine had a flaw that was almost a confession. Ask it “What happened here?” and it would find, as the closest match in 384-dimensional space, the fragment “What’s happened here?” and return it. The nearest voice to your voice is your own voice, very slightly delayed. A mirror like that answers nothing.
The fix adds a scoring component (response-appropriateness) that punishes the echo. High word-overlap scores down to 0.1, while a statement that actually answers a question scores up to 0.9. So the machine can no longer parrot you. It has to reach past the mirror for a stranger who really answers, and that refusal to hand you back your own words is the whole design. Flip the era in the loom above and you can watch the mirror win, then watch the rule strike it down.
| condition | what it detects | score |
|---|---|---|
| Exact match | exact echo of your line | 0.1 |
| High word overlap | more than 70% shared words | 0.1 |
| Medium word overlap | 50–70% shared words | 0.3 |
| High semantic similarity | vector proximity above 0.75 | 0.1–0.4 |
| Question → statement | a statement answering a question | 0.9 |
| High new-word ratio | more than 60% new words | 0.8 |
| Default | a moderate, ordinary response | 0.6 |
final = (0.5·semantic + 0.3·flow + 0.2·novelty) × (0.5 + 0.5·character)The mirror could win here, because semantic proximity dominated and nothing forbade the echo.
final = 0.30·semantic + 0.25·flow + 0.15·novelty + 0.20·character + 0.15·appropriatenessThe appropriateness term breaks the mirror. These are the five weights config.py declares and the loom above runs them exactly. The docs also name a sixth relevance term (0.10) not carried by the shipped config; it is left out here.
Character definitions, verbatim from character_manager.py
No character writes a word. Each is only a set of tone-weights, a bias in how the corpus is read. The same prompt pulls a different stranger through each of these seven filters, so the whole of a character’s personality here comes down to which tones it leans toward.
A noir detective character who speaks in dramatic, mysterious tones with formal undertones.
A witty, light-hearted character who prefers humorous and playful dialogue.
An intellectual character who speaks formally and seriously.
A casual, philosophical character who speaks in thoughtful but relaxed tones.
A dramatic, serious character who speaks with conviction and intensity.
An enigmatic character who speaks in mysterious and cryptic ways.
A warm, approachable character who speaks casually and humorously.
The salvaged seam every woven line is drawn from
These are real lines, harvested verbatim from the subtitle and speech tracks of public-domain films. The full corpus is multilingual and thick with ASR noise and civic-meeting filler; this is a hand-curated English seam of the eerie ones, and every line the loom weaves is drawn from here. Filter by the tone the engine detects in each.
| line | fragment | detected tone |
|---|