Methodology
Jev supplies judgment. Code keeps control.
Nothing on this site asks a model to decide a priority. It asks six narrow questions about evidence, gets constrained probability outputs back, and then does ordinary arithmetic. This page is the whole method, including the parts that would be embarrassing if they were wrong.
From evidence to action
The model reads the account. Your code makes the decision.
01 · Input
One account record
Usage, support, renewal dates and notes.
Removed before sending: id + planted archetype
02 · Jev
6 parallel questions
One request. The same evidence for every question.
- Needs attentionnoul
- Churn evidencenoul
- Expansion signalnoul
- Urgencyscore
- Primary issuechoice
- Suggested ownerchoice
03 · Typed outputs
Evidence, not a verdict
- Noul
- Probability from 0 to 1
- Score
- Urgency across an ordered rubric
- Choice
- Distribution over named options
04 · Your code
Rules → a shortlist
triage.tsapplies thresholds and weights. No more inference.Act now: urgency ≥ 3 and attention > 0.8
Act now / Review / No action, plus retention and sales lenses.
Ranking weights: attention 35 · churn 25 · expansion 15 · urgency 15 · renewal 10.
Human review: on flagged accounts, Choice confidence below 0.55 marks routing as uncertain.
Step one
One request per account, six questions
TypeSafe evaluates every question in a request against the same state in parallel, so six questions cost one round trip rather than six. The account record goes over with its planted archetype and its id stripped out — the model never sees which scenario the generator drew it from.
POST https://api.typesafe.ai/v1/systemone
{
"model": "jev-latest",
"state": { …the account record… },
"questions": { …the six below… }
}Step two
The final decision never leaves the codebase
Bands, rankings and both lenses are arithmetic over the six answers. Changing a weight re-ranks 1,000 accounts instantly and costs nothing, because the evidence and the question meanings have not changed.
band =
urgency >= 3 && needsAttention > 0.8
? "act-now"
: needsAttention > 0.55
|| churnSignal > 0.55
|| expansionSignal > 0.65
? "review"
: "healthy"
priorityScore =
needsAttention * 35
+ churnSignal * 25
+ expansionSignal * 15
+ urgency / 4 * 15
+ renewalProximity * 10
// A Choice distribution flatter than 0.55 is not routed
// automatically — it is flagged for a person.Step three
Did it actually find the right ones?
The generator knows which archetype produced each account, and Jev never sees it. That makes this table a real check rather than a demo. The generator planted 181 accounts that should need attention and 819 that should not. The triage surfaced 181, missing 1 planted problem and flagging 1 account that was meant to be quiet.
Same questions. Different signals.
Each bar shows the share of an archetype sent to each action band. Dots show mean model outputs from this synthetic run, not measured churn rates or evidence of calibration.
Healthy
n = 618
Routing outcomes
- Act now
- 0
- Review
- 0
- No action
- 618
Mean signals
0%50%100%- Attention
- 10%
- Churn
- 8%
- Expansion
- 12%
Healthy noise
n = 201
Routing outcomes
- Act now
- 0
- Review
- 1
- No action
- 200
Mean signals
0%50%100%- Attention
- 22%
- Churn
- 15%
- Expansion
- 14%
Adoption concern
n = 45
Routing outcomes
- Act now
- 2
- Review
- 43
- No action
- 0
Mean signals
0%50%100%- Attention
- 78%
- Churn
- 71%
- Expansion
- 8%
Support escalation
n = 25
Routing outcomes
- Act now
- 21
- Review
- 4
- No action
- 0
Mean signals
0%50%100%- Attention
- 87%
- Churn
- 71%
- Expansion
- 10%
Relationship risk
n = 21
Routing outcomes
- Act now
- 12
- Review
- 9
- No action
- 0
Mean signals
0%50%100%- Attention
- 84%
- Churn
- 92%
- Expansion
- 7%
Renewal risk
n = 25
Routing outcomes
- Act now
- 9
- Review
- 16
- No action
- 0
Mean signals
0%50%100%- Attention
- 77%
- Churn
- 82%
- Expansion
- 15%
Expansion opportunity
n = 34
Routing outcomes
- Act now
- 1
- Review
- 33
- No action
- 0
Mean signals
0%50%100%- Attention
- 73%
- Churn
- 6%
- Expansion
- 96%
Ambiguous
n = 31
Routing outcomes
- Act now
- 0
- Review
- 30
- No action
- 1
Mean signals
0%50%100%- Attention
- 69%
- Churn
- 38%
- Expansion
- 25%
Bars are normalized within each archetype; group sizes differ. Exact counts, signal means and urgency scores are in the table below.
Full audit data
Scroll the table horizontally to see every signal and urgency score.
| Archetype planted | n | Act now | Review | No action | Attention | Churn | Expansion | Urgency |
|---|---|---|---|---|---|---|---|---|
| Healthy | 618 | — | — | 618 | 10% | 8% | 12% | 0.63 |
| Healthy noise | 201 | — | 1 | 200 | 22% | 15% | 14% | 1.23 |
| Adoption concern | 45 | 2 | 43 | — | 78% | 71% | 8% | 2.85 |
| Support escalation | 25 | 21 | 4 | — | 87% | 71% | 10% | 3.17 |
| Relationship risk | 21 | 12 | 9 | — | 84% | 92% | 7% | 3.12 |
| Renewal risk | 25 | 9 | 16 | — | 77% | 82% | 15% | 3.02 |
| Expansion opportunity | 34 | 1 | 33 | — | 73% | 6% | 96% | 2.99 |
| Ambiguous | 31 | — | 30 | 1 | 69% | 38% | 25% | 2.49 |
Attention, churn and expansion are mean model outputs across each archetype; urgency is a mean rubric score, not a probability. The separation between a planted problem and planted noise is produced by the model reading the record, not by a rule keyed to the field the generator moved.
Caveats
What this does not show
- The accounts are synthetic. The archetypes were written to be separable, which makes them easier than real CRM data, where the notes are shorter, staler and more contradictory.
- The planted scenarios are generator intent, not observed outcomes. This is a synthetic evaluation set: nothing on this page shows whether a flagged account would actually have churned.
- Typed output guarantees the interface, not the truth. Thresholds worth trusting have to be evaluated on your own data and your own consequences — these were chosen by hand, on this portfolio.
- Cost is computed from the input tokens the API reported, at Jev's published $0.042 per million input tokens with output tokens free.