Documentation

Risk, classification, and deception: three axes, not one score

Step-by-step guide Updated 24 August 2026

StyloBot separates three questions that most detection products fold into a single "how bot-like is this?" score.

  • What it is: classification. Categorical, and it wins the label. Googlebot is a bot at any score.
  • What it's doing: risk. Is the activity risky, not is the visitor unusual.
  • Whether those agree: deception. A claim that contradicts the observed behavior.

Each is computed independently and never averaged into the others.

Classification: categorical, sourced from evidence, not inferred from risk

Classification answers "what is this" and comes from PrimaryBotType: catalogue identity, verified DNS/IP round-trips, behavioral archetype matching. A confirmed search-engine crawler is a bot. A confirmed AI scraper is a bot. Neither classification changes because the traffic is well-behaved. Classification and behavior are different questions, and only one of them is "what is it."

Risk: is the activity risky, not is the visitor unusual

Risk asks whether the activity is risky to your site. A well-behaved, highly consistent crawler is low risk, not because it looks human, but because polite, predictable crawling is not risky activity. A visitor probing /.env or scanning admin paths is high risk, regardless of what it claims to be or how it's classified.

Unusual is not the same as risky. Traffic that looks nothing like a typical browser, federated protocol clients for example, can be entirely benign; traffic that looks exactly like a browser can still be hostile. Scoring "distance from a human norm" gets both cases wrong, because deviation and hazard are different things.

Deception: the axis a user-agent string can never give you

Deception surfaces disagreement between a claim and a behavior: "claims to be a fediverse client, behaves like a scanner." This isn't blended into the risk score or the classification. It is a distinct, surfaced signal, because a mismatch between what something says it is and what it does is information a single score throws away.

What merging these axes gets wrong

Here is what happens when you fold classification into a single behavioral score. A confirmed bot, doing something entirely routine, produces a risk label that also tries to state whether it's human. A consistent, well-behaved crawler lands in the lowest risk band, correctly, because its activity is not risky, and if that same band is read as a human/bot signal, a confirmed bot at very high bot-probability ends up under a label that claims it is "almost certainly human." Two true, correctly-computed facts, one merged label, and the label contradicts itself.

That is exactly why the axes stay separate. The moment risk (an activity judgment) is asked to also answer classification (an identity judgment), the two will eventually disagree, because they are answering different questions. StyloBot fixed this by keeping risk language strictly about activity and letting classification carry classification, with nothing in the risk description claiming humanity or bot-ness on its own.

Centroids, not user-agent strings

Classification and archetype matching are driven by YAML-declared centroids, not code-literal string switches on the user-agent. A new bot class is a declaration, not a code change, and behavior is matched by shape in vector space rather than by a substring anyone can spoof.

What this means for your policy

Three axes give you three independent levers instead of one blended one:

  • Throttle on risk. A risky activity slows down regardless of what's doing it.
  • Block when classification and risk agree: a confirmed hostile actor doing something hostile.
  • Watch deception as an escalation signal. A claim that contradicts behavior is worth a closer look before it's worth an automatic block.

The exact calibration, which risk levels trigger which actions on your traffic, is a per-site tuning decision, not something a public page can responsibly hand you as a fixed rule. Start conservative, watch the dashboard, and tighten as your own traffic shape confirms it.