a reader with one question and no time
People land here mid-screening, with one question about my work and a stack of other candidates open in the next tabs. The pages hold the answers the way documentation does, in order, under headings, made to be read. The reader wants the answer itself.
The obvious fix carries the risk that matters. A generated reply gets one fact about me wrong, once, in front of the one person it was written for. On a portfolio there is no support queue to catch it and no second impression to spend.
three instruments, one of them still running
The turn machinery came from the field: the escalation ladder, the candidate understanding, and the explicit marking of a refusal are all named moves in the literature. Three of the moves here are named after what conversation analysts already described.
The limits come from the Content Design Hub accessible-content guide, written for readers who pass through once. They sit in a rubric file, so the number is the thing you argue with.
The study that never closes. It records the text, the matched answer, and the misses. No name, no address, no cookie. Its first week rewrote the identity answer twenty phrasings deep.
The log is the only one of the three that keeps producing findings after launch. Across four days of live traffic, 27 to 30 July, it recorded nine misses. All nine are now regression tests, held in the suite by the exact words the visitor typed.
/* Day two of live traffic, 2026-07-28: every miss recorded, kept as a test. */
const LIVE_MISSES = [
['cine esti?', 'botmeta'], ['who are you?', 'botmeta'],
['expericente', 'cvpage'], // a typo, kept as typed
['ai', 'cd'], ['artificial', 'cd'], ['intelligence', 'cd']
];The typo ships in the test. A visitor who mistypes the same way tomorrow reaches the answer, and the suite fails if that stops being true.
three turns, from the live script
These are the replies as written, in the order the router can reach them: a clear match, a complaint, and a question the bot refuses to answer.
you · "who is eliza?"
Eliza is a conversation designer. Ten years of writing and research sit under that, in regulated and consumer software.
you · "this sucks, not what I asked"
Fair enough. What were you looking for? I will send it to Eliza exactly as you write it.
you · "can I ask something personal?"
I keep to the professional side. For everything beyond it, Eliza is a real person with an inbox: write@elizamarin.com.
three turns out of 95, chosen as one per rung of the ladder. verbatim from the live script; the real thing is in the corner of this page.
the turns were spoken before they were typed
Sample dialogs came before any flow diagram, and they were written to be read out loud. A line ships once it survives being read aloud; a line that needs a screen to make sense does not. The markup below says how a turn should sound, and the text in it is the text the panel actually serves.
<!-- system, opening -->
<prosody rate="medium">
<s>Hi, I'm Eliza.</s>
<break time="850ms"/>
<s>What do you want to know?</s>
</prosody>The 850 millisecond break is the same beat the panel leaves between bubbles on screen, so the written rhythm and the rendered one stay a single decision. Portable W3C markup only: break, emphasis, prosody, say-as. A browser does not execute any of it, which is the point. It is a specification of intent that a person can read.
correctness first, coverage paid for weekly
Every answer written in advance. No model runs at the moment you ask.
The bot cannot get a fact about me wrong, because it has no way to compose one. It also cannot answer what I have never written, and that is the cost. The live log turns the cost into a weekly repair: every miss becomes a permanent test, so the same gap cannot reopen.
A test is not a rule. The test pins one phrasing the router already handles; the rule would be a new branch in the design. That is the same line I held on the agent in case 01, where I resisted writing a rule for every failure and let one graduated behaviour cover the class. Here the rules stay at five, in a file, and the tests grow with the log.
The same act, confirm, hand off pattern, at chatbot scale.
A clear match answers, with the page it came from one tap away. Two plausible readings produce one question, never a list of doubts. A personal or unknown turn hands you a human, with the address inside the reply. Every refusal carries a reason and a way forward, which is the same rule I wrote for the agent in case 01.
Pacing specified in milliseconds, and a style contract enforced by tests.
The first line lands at 380 milliseconds. Every line after it waits 22 milliseconds per character, floored at 520 and capped at 1400, so a long answer never stalls and a short one never snaps. The reduced-motion branch is the first thing in the expression, so the whole system collapses to zero for anyone who asked for that.
var wait = reduceMotion
? 0
: (i === 0 ? 380
: Math.min(1400, Math.max(520, lines[i].length * 22)));The thresholds sit in a rubric file, outside my judgement, and a reply that breaks the contract fails the build.
Left out on purpose: a personality, and a memory.
It does not remember you between visits and it does not perform a character. A reader here is screening. The log keeps the question and the answer it reached, with no name, no address and no cookie, so what it holds could not identify anyone who typed it.
live on every page, tested before every deploy
The guide ships on fifteen of the seventeen pages here, answering across 103 intents. The two without it are the privacy policy and the page you reach when a URL is wrong.
What runs before a deploy is five thresholds and a set of structural rules, written once and applied to every reply the system can produce. Reading grade, median grade, sentence length, reply length, and the cap on options a turn may offer. Multiplied across the corpus that arrives at 10,745 assertions. The number is arithmetic. The work was deciding what the five should be. The suite caught the last two defects on this site, both mine: a page the bot advertised and could not reach, and a published number that had drifted from the code.
Every number above describes what the system holds. None of them describes what a visitor got, because the log records what was asked and answered, and not whether the asker left satisfied. That measurement needs people, and it is the next thing this owes.
The identity question, which was the first thing it got wrong, now reaches one answer from twenty phrasings. Every fix since has arrived the same way: the log records the miss, the miss becomes a test, the test holds the answer in place.
what I know, and what I cannot yet
Whether it is useful. Most recorded turns are mine, and the instrument that would close the gap is five think-aloud sessions with people who are not me.
Scripted answers make correctness cheap and coverage expensive. The log is what turns that trade into a weekly, measurable repair.
The full write-up, with the code and the misses in the open, is The ELIZA Effect in 2026.