A checkout session is evidence. Most systems throw it away.
Straja computes fifteen behavioral features from the session itself, sends them for a tier decision, and — only when the pattern warrants it — asks the person four questions a scam script doesn't survive.
From signal to verdict.
The model receives only the signal vector and session context — never account identity, never anything beyond what's needed for this one decision.
Three tiers, not two.
A binary allow/block forces every borderline session into one of two wrong answers. The middle tier is where most real ambiguity lives.
No additional screens. The user never knows Straja was there. Roughly 98% of checkouts resolve here.
One context screen. The user acknowledges and proceeds. No block, no delay.
A short probe, then a pattern reflected back in the user's own words. A 24-hour hold — never a hard block.
Four questions that a scam script doesn't survive.
On INTERVENE, Straja asks rather than warns. Warnings don't work on someone who has been coached to expect them and told exactly how to dismiss them — a question has no script to match against.
A legitimate buyer answers question four with confusion. A coached victim recognizes an instruction they were actually given — and that recognition is the moment the pattern becomes visible to them, not just to the system.
Fifteen features, computed before the model sees anything.
Every one is deterministic — derived from the session and the account, never from the model. The model's job is to read the pattern they form, not to invent the evidence.
Every verdict is already an audit record.
Not a log line written alongside the decision — the decision itself, in the structure a reviewer or a regulator would ask for.
{
"decision_id": "d_a619893f",
"created_at": "2026-09-12T09:41:22.104Z",
"tier": "INTERVENE",
"signals": { /* the full fifteen-field vector */ },
"key_signals": ["idle_gaps + pasted address"],
"reasoning": "Coached-session pattern: repeated idle gaps...",
"probe_transcript": [...], // if any
"pattern_summary": "...", // what the user was shown
"user_outcome": "held",
"model": "claude-opus-5",
"prompt_fingerprint": "pf_3c1e" // which prompt version decided
}What a compliance team does with this is its own page — see Compliance.