Open-source decision engine

Turn judgments
into decisions

Models tell you what is going on. Ordo decides what to do about it, and shows who a change affects first.

Ordo Studio running the refund-routing ruleset on four recorded refund requests, step by step
1🚀1µs
STARTChargeback or legal threatDecision
jev.chargeback.noul ...
Default
2✓1µs
Is it a refund requestDecision
jev.intent.choice !=...
Default
3✓1µs
PriorityDecision
jev.urgency.score >=...
Default
4✓2µs
Route by confidence and orderDecision
customer.refunds_90d...
order.days_since_del...
jev.intent.choice ==...
jev.intent.choice ==...
jev.intent.choice ==...
Default
5✓0µs
DispatchDecision
$decision == "AUTO_R...
$decision == "LLM_DR...
Default
EscalateTerminal
ESCALATE
priority="high"
jev_chargeback=jev.chargeback....
Other teamTerminal
ROUTE_TEAM
team=jev.intent.choi...
jev_confidence=jev.intent.conf...
6🏁0µsAUTO_REFUND
Auto refundTerminal
AUTO_REFUND
amount=order.amount
priority=$priority
jev_confidence=jev.intent.conf...
LLM draftTerminal
LLM_DRAFT
reason=$reason
priority=$priority
jev_confidence=jev.intent.conf...
Human reviewTerminal
HUMAN_REVIEW
reason=$reason
priority=$priority
jev_confidence=jev.intent.conf...
1🚀1µs
STARTChargeback or legal threatDecision
jev.chargeback.noul ...
Default
2✓1µs
Is it a refund requestDecision
jev.intent.choice !=...
Default
3✓1µs
PriorityDecision
jev.urgency.score >=...
Default
4✓2µs
Route by confidence and orderDecision
customer.refunds_90d...
order.days_since_del...
jev.intent.choice ==...
jev.intent.choice ==...
jev.intent.choice ==...
Default
5✓0µs
DispatchDecision
$decision == "AUTO_R...
$decision == "LLM_DR...
Default
EscalateTerminal
ESCALATE
priority="high"
jev_chargeback=jev.chargeback....
Other teamTerminal
ROUTE_TEAM
team=jev.intent.choi...
jev_confidence=jev.intent.conf...
6🏁0µsAUTO_REFUND
Auto refundTerminal
AUTO_REFUND
amount=order.amount
priority=$priority
jev_confidence=jev.intent.conf...
LLM draftTerminal
LLM_DRAFT
reason=$reason
priority=$priority
jev_confidence=jev.intent.conf...
Human reviewTerminal
HUMAN_REVIEW
reason=$reason
priority=$priority
jev_confidence=jev.intent.conf...
Flow ReplayBlender
Input snapshot
{
  "jev": {
    "intent": {
      "choice": "refund",
      "confidence": 0.97
    },
    "urgency": {
      "score": 0.43
    },
    "chargeback": {
      "noul": 0.04
    }
  },
  "order": {
    "amount": "129.00",
    "days_since_delivery": 1
  },
  "customer": {
    "refunds_90d": 0
  }
}
{"jev":{"intent":{"choice":"refund","confidence":0.97},"urgency":{"score":0.43},"chargeback":{"noul":0.04}},"order":{"amount":"129.00","days_since_delivery":1},"customer":{"refunds_90d":0}}
CodeAUTO_REFUND
Output
{"amount":129,"jev_confidence":0.97,"priority":"normal"}

What Ordo does for you

01

Models judge, rules decide

Models like Jev read what a customer wrote. Whether to refund, and whether a person looks first, is written in rules anyone on the team can read.

02

See the impact first

Before you move a threshold, see which decisions change and what they change to.

03

Live without a release

Updated rules take effect right away. Your application code stays the same, with no redeploy.

An example

A 0.85 hard-coded in the app

A customer writes in, Jev decides it is a refund request, and anything above 0.85 is refunded automatically. That 0.85 usually sits in code nobody has looked at, and after a model update it means something else.

Once it lives in Ordo, someone proposes 0.80. Every test still passes. Ordo runs the old and new rules side by side and finds 18 cases that move from "agent checks" to "refund now". You decide before the change goes in.

You can swap the model or upgrade it. The refund threshold stays in Ordo, with tests and a version history.

Auto refund threshold0.85→0.80

21 of 309 cases change

  • Wants a refund, 0.84 sure, order of 129, delivered yesterday

    Agent checks→Refund nowLLM_DRAFT → AUTO_REFUND

  • Wants a refund, 0.80 sure, order of 39.90, delivered 2 days ago

    Agent checks→Refund nowLLM_DRAFT → AUTO_REFUND

The other 288 cases stay the same

Studio

Rules your whole team can read

See the same rules as a flow or as a table. Business teams read the logic, run tests and request releases there. Engineers keep working in the code repository.

About Studio
The route step of the refund-routing ruleset as a decision table in Ordo Studio, matching one input at a time
Add RowAdd Input ColumnAdd Output Column
Blender sample
Hit PolicyFirst Match
TraceConditionsOutputs
#Trace
INchoicestring
$.jev.intent.choice
INconfidencenumber
$.jev.intent.confidence
INamountnumber
$.order.amount
INdays_since_deliverynumber
$.order.days_since_delivery
INrefunds_90dnumber
$.customer.refunds_90d
OUTdecisionstring
decision
OUTreasonstring
reason
InputActual
refund
0.97
129.00
1
0
AUTO_REFUND
1
Skipped
0 in [3, ∞)
*Actual: refund
*Actual: 0.97
*Actual: 129.00
*Actual: 1
[3, ∞)Actual: 0
HUMAN_REVIEW
repeat_refunds
2
Skipped
1 in (30, ∞)
*Actual: refund
*Actual: 0.97
*Actual: 129.00
(30, ∞)Actual: 1
*Actual: 0
HUMAN_REVIEW
outside_window
3
Matched
All conditions matched
refundActual: refund
[0.85, ∞)Actual: 0.97
(-∞, 200]Actual: 129.00
*Actual: 1
*Actual: 0
AUTO_REFUND
4
Skipped
All conditions matched
refundActual: refund
[0.85, ∞)Actual: 0.97
*Actual: 129.00
*Actual: 1
*Actual: 0
HUMAN_REVIEW
amount
5
Skipped
All conditions matched
refundActual: refund
[0.6, ∞)Actual: 0.97
*Actual: 129.00
*Actual: 1
*Actual: 0
LLM_DRAFT
medium_confidence
6
Skipped
All conditions matched
*Actual: refund
*Actual: 0.97
*Actual: 129.00
*Actual: 1
*Actual: 0
HUMAN_REVIEW
low_confidence

Start from a ready-made example

Jev refund routing, credit approval, promo stacking and fraud scoring, already written. Copy one and change it to your own policy.