Every chat is a conversation.
Almost nobody measures it.
We evaluate what the model said.
Thumbs up. Thumbs down. A preference score. None of it tells you who did the talking, who was kept waiting, who took initiative, or where the exchange quietly broke down and had to be repaired.
Measure the exchange, not the content.
Language production. Timing. Initiative and response. Repair. Semantic contribution. Influence between human and artificial participants — treated as properties of an interaction rather than of an answer.
One completed turn.
A turn is the unit — who spoke, when the first token appeared, when the last one landed, what the provider actually spent. Post it once when the message finishes, and everything else is derived.
Layer 1 · deterministic
Runs for every thread with no external calls and returns inside the ingest response. Production ratios, lexical measures, five timing measures, speech-act structure, participation, trajectory.
Layer 2 · optional
Never enabled implicitly. Two semantic engines over a shared kernel, queued and streamed back as they complete.
LCC is not ICCC.
One designated learner
Measured against a versioned reference model of expectations and misconceptions, across four quadrants of relevance and novelty.
Every participant
Measured against the evolving discussion itself — six curves, including a Social Impact value that later turns can revise.
They share a semantic kernel and stay computationally separate. There is no merged score anywhere in the system.
Synchronous where it must be. Queued where it should be.
Ingest
Your app posts one finished message with its streaming timings.
Layer 1
Deterministic measures computed in-request and returned.
Queue
Classification and semantic work enqueued — never blocking the chat.
Worker
Engines run; versioned envelopes persist with full provenance.
Stream
Results arrive as live events, resumable after a dropped connection.
It would rather say nothing than guess.
null is not zero
A missing measure returns null with a quality flag explaining why — never a fabricated zero that would corrupt every average downstream.
Preconditions enforced
An interaction that does not qualify for an engine returns not_applicable with reasons, rather than a plausible curve.
Prohibited interpretations
Every metric ships with what it explicitly does not establish — published alongside the formula, not buried in a caveat.
Instruments, counted.
Read from the codebase, not estimated — alongside 285 passing tests and 17 pages of reference documentation.
An API, not a dashboard.
Real-time ingestion
Idempotent on your own message id, so at-least-once delivery is safe.
Live event stream
Sixteen event types with replay after a dropped connection.
Scoped research access
Fifteen scopes on revocable, audited grants with pseudonymised projections.
A vocabulary for conversation quality
that doesn't depend on asking.
Product teams get interaction shape instead of ratings. Researchers get provenance that survives the pipeline. Participants get ownership enforced in the token rather than promised in a policy.
Measure the conversation.
Content-agnostic interaction analytics, and two semantic engines that know when to stay silent.