Concepts
The core idea: every prediction returns a type that tells you what to do — not just what the model thinks the answer is.
The three output types
CLASS
The model has decisive evidence for exactly one class. The evidence margin between the top class and the runner-up is large enough to commit. Action: auto-decide.
{
"type": "CLASS",
"class_": "approve",
"alternatives": [],
"margin": 7,
"action": "commit"
}When the model returns CLASS, it's correct 99.2% of the time (across benchmark datasets). This is the prediction you can act on without human review.
POSSIBILITIES
Evidence supports 2–3 classes but can't decisively separate them. The model narrows the options. Action: human picks from a shortlist.
{
"type": "POSSIBILITIES",
"class_": null,
"alternatives": ["approve", "deny"],
"margin": 0,
"action": "narrow"
}POSSIBILITIES is not a failure — it's a precise statement: "I can rule out most classes, but not all." A human reviewing 2 options is faster than reviewing 10.
UNDETERMINED
Not enough evidence to support any class. The model abstains rather than guessing. Action: route to a specialist.
{
"type": "UNDETERMINED",
"class_": null,
"alternatives": [],
"margin": 0,
"action": "abstain"
}This is the prediction that traditional classifiers get dangerously wrong — they'd return 60% confidence and let you decide what to do with it. The model tells you before you waste time.
How it works
The engine evaluates evidence for and against each class independently using two separate streams. This is different from a confidence score, which collapses everything into a single number.
| Aspect | Confidence score | Typed uncertainty |
|---|---|---|
| Output | Single number (0–1) | Type + evidence breakdown |
| Evidence model | One value (overloaded) | Two streams (support / against) |
| Conflict handling | Averaged away | Detected and resolved |
| Actionable? | You decide the threshold | The system tells you what to do |
Evidence breakdown
Every prediction includes per-class evidence counts showing how many rules supported or opposed each class:
"evidence": {
"approve": {"support": 7, "against": 0},
"deny": {"support": 3, "against": 4},
"review": {"support": 1, "against": 6}
}support = number of rules with evidence for this class. against = number with evidence against. The gap between support and against for the top class is the margin.
Cost-aware actions
Pass a cost parameter to get an explicit action recommendation. The cost represents how many correct auto-decisions are worth one wrong auto-decision.
# cost=10 means: a wrong commit is 10x worse than a missed auto-decision
result = predict(sample, cost=10)
result["action"] # "commit", "narrow", or "abstain"| Type | Action | Meaning |
|---|---|---|
CLASS | commit | Safe to auto-decide |
POSSIBILITIES | narrow | Human picks from shortlist |
UNDETERMINED | abstain | Route to specialist |
Margin and support
margin is the difference in evidence between the top class and the runner-up. Higher margin = more decisive. support is the raw evidence count for the committed class. total_evidence is the total number of rules that fired.
A high margin with low total evidence means the model is decisive but working with limited data. A low margin with high total evidence means the model has seen a lot but the evidence is split.