Skip to content

The method

This page describes how the report is produced and why it is built the way it is. It deliberately does not include the extraction prompts, the marker taxonomy, or the model bindings — those are the parts we sell. Everything that governs whether you should trust the output is here.

The short version: the pipeline has ten stages, only four of which call a model, and the discipline is concentrated in the seven that don't.


Framework-first, or corpus-first

Almost every other tool that reads your chat history starts with a psychological framework and looks for evidence to fill it in. Big Five, and then a score. Attachment, and then a style. MBTI, and then a type. The instrument decides in advance what can be found, and the corpus is searched for support.

This one goes the other way. Read what is there, find what recurs, look for what changed, propose a pattern, have a different model attack it, and report what survives with the evidence still attached.

That produces a different kind of sentence. Instead of:

Conscientiousness: 87 / 100

you get something closer to:

Across eleven conversations spanning four months, projects are introduced as nearly-complete and then not mentioned again — with the eleven quotes and their dates.

The first is a number that looks scientific. The second is a claim you can inspect, check against your own memory, and disagree with. We think the second is more useful, and it is certainly more honest about how much it knows.

This is closer to longitudinal qualitative research than to a personality test. It is also slower, more expensive, and produces nothing at all when a corpus has nothing in it — all of which we consider correct behaviour.


Why the whole corpus, and not a sample

A reasonable question, given that reading a sample would be cheaper and would send less of your history anywhere: why not analyse a few hundred messages instead of all of them?

Because sampling and this method measure different kinds of thing.

Sampling works when you are estimating a quantity. If the goal is a trait score, a sample gives you an estimate with a margin of error — that is ordinary statistics, and a tool that scores you is right to work that way.

Recurrence is not a quantity. It is a property of the whole set, and a sample does not estimate it — it destroys it. Suppose a pattern appears seven times across three thousand messages, and you look at nine percent of them. You would expect to catch less than one of those seven, and the chance of catching even two — the minimum for anything to count as recurring — is about thirteen percent. One instance is not a pattern. It is an anecdote, and the report would be right not to print it.

Absence is worse. Part of what this tool looks at is what is conspicuously missing across your history. In a sample, everything is missing. "This never comes up" and "it was not in the nine percent I read" produce identical output, and only one of them is about you.

So the whole corpus is read, every time. The report tells you the coverage, and the software refuses to run if any message failed to make it into the analysis.

What this does not mean. It does not mean this method is assumption-free. Long conversations are cut into slices with overlap at the boundaries, sessions that look like fiction or testing are down-weighted, and some machine-generated surfaces are excluded. Those are all judgements. The difference is what kind: ours are about how the corpus is divided and recombined, and they can be checked. An assumption about whether a sample represents the whole cannot be checked from inside the sample.


The two rules everything else follows from

1. The observable / interpretive wall

The pipeline extracts things that are measurable in the text: how often a topic returns, whether a stated plan is revisited, how a message changes after the assistant disagrees, how the length and hour of messages drift over months.

It does not extract internal states. There is no stage that concludes "the user is anxious," because that is not a property of a text file. Meaning is left to you.

This sounds like a small distinction. It is the difference between a tool that reports "this topic returned in eleven sessions across four months" and one that reports "you seem preoccupied." The first is checkable. The second is a stranger's opinion dressed as a measurement.

2. The reasoning gate — the "Ctrl+F test"

A pattern that could be found by searching for a word is not a finding, it is a keyword match. If the only thing separating a marker from grep is a synonym list, we do not want it: it tests recall, not judgment, and it is exactly the kind of thing that flags a novelist for writing a villain.

So every marker type must force an assessment of a relationship rather than the presence of a word:

  • a claim against the evidence offered for it
  • this session against what earlier sessions established
  • a stated belief against the behaviour in the same conversation
  • what is said against what happens next

Any candidate marker type that survives a plain-text search is cut. This is the single most expensive rule in the project and it removes most of what a naive version of this tool would report.


The exclusion rule

A model may not hold a judgment role in analysing a corpus it generated.

Your ChatGPT export is roughly half ChatGPT's own output. A large share of what is worth looking at lives in the assistant turns — did it push back, and what did you do when it did? How much agreement and validation was in the room?

Using GPT to judge those turns is self-assessment, and it is biased in precisely the dimension being measured: a model's sense of "how much warmth and agreement is normal from an assistant" was set by the training that made it that assistant. This is a calibration offset, not a question of honesty.

So for a ChatGPT export, no OpenAI model extracts, synthesises, or reviews. The rule is written into the configuration rather than the documentation, and it is relative to the corpus — if we analysed a Claude export, Anthropic models would be excluded instead.

Four different model families do four different jobs, from four different vendors. That is not about cost. It is so that no single vendor's blind spot becomes the report's blind spot.


The reviewer is adversarial by construction

The review stage does not ask "are these findings good?" A reviewer asked that question agrees, because agreeing is what these systems do.

Instead, for every candidate finding, an independent model from an unrelated vendor is told to construct the strongest case that the finding is wrong — that the benign reading is the true one, that the evidence does not support the claim, or that the pattern is an artifact of how much text there is. It is instructed to default to refuted unless the evidence forces otherwise.

It also gets one question nothing else in the pipeline can answer: what would a different framework look for that this one misses? Every other stage operates inside our taxonomy, so this is the only step that can catch a hole in it.

Reviewer verdicts do not silently delete anything. They attach to the finding, and the report shows contested findings with the counter-argument visible. A finding the reviewer refuted and the synthesiser could not defend is precisely the thing you should see, not the thing we should hide.

On the first real run, the reviewer could not dismiss 4 of 7 candidate patterns. The other three are in the report too, marked as refuted.

This step only exists because of the choice above. A score cannot be refuted — there is nothing in "Conscientiousness: 87" for an adversary to attack, no evidence to weigh, no claim to break. Committing to quoted findings instead of numbers is what makes an adversarial reviewer possible at all. It is a consequence of going corpus-first, not a feature bolted on afterwards.


Evidence honesty

Every finding cites specific messages — timestamp, session, message index. A finding with zero citations is not printed; that is an automated gate, not an editorial habit.

Every finding carries a benign interpretation, generated as part of the finding rather than bolted on. Also an automated gate: a finding without one does not render.

Findings are tiered by how much support they actually have. A pattern seen twice in a year is not presented like one seen in forty sessions.

Every finding in every report we currently produce is Bootstrap tier — theoretically motivated, not validated against chat data. The report says so, on the finding, every time. When that changes it will change because of measurement, not because we got more confident.


What the pipeline refuses to do

  • It never names a condition. A panel of four independent judges checks the finished report for diagnosis language, clinical register, and unsupported claims about isolation before it is released to you. If any judge raises a concern, the report does not ship unreviewed.
  • It never analyses a corpus without consent from the person who wrote it.
  • It never presents an absence as a finding without disclosing what the extractor is known to miss — because "this person never does X" and "our extractor cannot see X" produce identical-looking output, and only one of them is about you.

That last one is the most important sentence on this page, and it has its own page: what this cannot do.


Why sessions marked "roleplay" are treated differently

Fiction, roleplay, and prompt-testing produce text that looks alarming and means nothing. A person writing a villain, or stress-testing a model's guardrails, generates exactly the surface features a naive tool would flag.

Sessions that look like fiction or testing are detected and down-weighted rather than fed to the extractor at full strength. The detector is deliberately crude and over-inclusive: over-flagging costs a down-weight, under-flagging costs a false statement about a person.


What we are not telling you

For completeness, the things this page withholds:

  • the marker taxonomy — which types are extracted and the dimensions tagged on each
  • the extraction system prompt
  • which specific models hold which role, and the probe cases used to qualify them
  • the question sets used to measure reproducibility and safety
  • the clustering rules

We think the durable advantage here is the measurement discipline rather than the prompts, which are cheap to copy. But they are still ours.