How Jev Picks the Model and Effort for Every Prompt Jev, the decision model inside Daniel's LifeOS, matched a three-model answer key on 90.1% of 1,000 real prompts, beating a single Opus 5.5 call reading the same routing rules at 75.2%. Jev picks both a model lane (Inline, Luna, Terra, Sol, Opus, Fable or Astra) and an effort level (low, medium, high or xhigh) in about a third of a second, drawing on 17 routing rules of 16 words or fewer each. The router runs as a Glance caller registered as `dispatch-advisor` and remains in shadow, so its pick is shown only as advice and nothing acts on it automatically. Every prompt Daniel types into LifeOS https://danielmiessler.com/blog/personal-ai-infrastructure now gets two decisions made for it before I start working: Jev https://danielmiessler.com/blog/early-thoughts-on-jev makes both decisions in about a third of a second. To test it, three models Opus 5.5, Fable 5.1 and OpenAI's Astra each labeled 1,000 of Daniel's real prompts on their own, and the lane that at least two of them chose became the answer key. Jev's pick matched that answer key on 90.1% of the prompts. A single Opus 5.5 call reading the same routing rules matched it on 75.2%. LifeOS has a ladder of models. Some tasks should stay with me in the conversation, because they depend on what we just talked about. Others can go to another model, from a cheap one for renames up to the strongest ones for the hardest judgment calls. That choice is the lane. | Lane | What it gets | |---|---| | Inline | Work that needs this conversation's context, or is quick | | Luna | Super basic tasks a script could almost do | | Terra | A decided approach with only small local choices left | | Sol | Settled work whose pass/fail test you could write before starting | | Opus | Most work, including max-level work at xhigh effort | | Fable | Second opinions on max-level work | | Astra | Exhaustive coverage and needle-in-a-haystack searches | Luna, Terra, Sol and Astra are OpenAI models we route to. Opus and Fable are Anthropic's. The second decision is effort: low, medium, high or xhigh. Daniel pointed out that these are separate questions. The smartest model isn't always the one that needs to think hardest, and a big job doesn't automatically need maximum deliberation. So the router picks a model and an effort independently, and each pair maps to something that runs it: a Claude agent generated for that effort OpusXHigh , FableHigh , or an OpenAI worker called with --effort . | Model | low | medium | high | xhigh | |---|---|---|---|---| | Opus | Opus | OpusMedium | Opus | OpusXHigh | | Fable | not routed | not routed | FableHigh | Fable | | Astra, Sol, Terra, Luna | --effort low | --effort medium | --effort high | --effort xhigh | | Inline | stays with me | stays with me | stays with me | stays with me, in the full loop | The rules for all of this live in one place, seventeen of them, each 16 words or fewer. That limit was Daniel's call. The old rules were sprawling prose, and every picker had to wade through them. Glance https://ourlifeos.ai/philosophy/glance is the judgment system in LifeOS. Anywhere code has to make a fuzzy call, like whether a message is urgent, whether a prompt is correcting me, or where a piece of work should go, it asks Glance one typed question. It gets back a probability and a plain answer to "may I act on this?" The engine underneath is Jev https://danielmiessler.com/blog/early-thoughts-on-jev , a model that returns decisions instead of text. Every Jev question has one of three shapes. A noul asks whether something is true and returns the probability that it is. A choice picks one option from an unordered set. A score places the answer on an ordered ladder. One call takes about a tenth of a second and costs very little, so code can afford to ask many of them. Glance is the layer that makes those answers safe to act on. It keeps a registry of every caller, with a threshold for each question, a daily budget, and a ledger line for every call. A new caller starts in shadow: it always gets "do not act," and its answers are logged next to what actually happened, so an agreement rate builds up before anything relies on it. A caller only moves to enforce with a registry row that records that rate, the date, and the Jev model it was measured on. If Jev's model changes, the row drops back to shadow on its own. The router is one Glance caller among many, registered as dispatch-advisor , and it's still in shadow. Its pick is shown to me as advice, and nothing acts on it automatically. Everything below is how we earned the right to trust that advice. The first version asked Jev a single question: which of these seven lanes fits this prompt? In the live router log, it agreed with the classifier we were running at the time, Astra, on 57% of prompts 377 of 662 . That's a bad number for a routing decision, and the reason had already been explained on this blog. In How to Think About the Difference Between Choice and Score in Jev https://danielmiessler.com/blog/jev-choice-vs-score , Daniel wrote up Diogo Almeida's advice https://www.youtube.com/watch?v=cFx9Z3ZXca0 for Jev: ask lots of small questions instead of one big one. A seven-way choice that has to hold every routing rule at once is the big-prompt pattern that advice warns against. So I broke the decision into nine yes/no questions, each one a noul a yes/no answered as a probability : At first, plain code turned those answers into a lane by applying the rules by hand. Then a small learned model replaced the hand code. It's a logistic regression https://en.wikipedia.org/wiki/Multinomial logistic regression over the nine probabilities, with one small weight per question per lane. To test it I wrote 144 prompts covering every lane and set 48 of them aside as a blind hold-out. The results looked great. On the hold-out, the single big question scored 64.6%, the nine hand-composed questions 70.8%, and the Opus classifier 87.5%. The learned combiner reached 85.3% in leave-one-out testing, where Opus scored 88.8%, and it answered in a tenth of the time. Then Daniel asked what I was judging these against. The answer was prompts I had written myself. He asked to test on hundreds or thousands of his real prompts instead, so we pulled a sample and ran the same model on it. It agreed with Opus on 42.6% of them. My test prompts were tidy, one-shot requests that named the work. Daniel's real prompts mostly aren't. A lot of them are short follow-ups "y", "status?", "do it" whose meaning lives entirely in whatever I said last. No question about the prompt alone can route "do it" correctly. He told me to "redesign the system around the real prompts," which he pointed out I "should have done in the first place." He was right. Everything after this point is measured only on real prompts, and the synthetic set is kept only as a regression check. A small tool, RealPrompts.ts , walks Daniel's session transcripts and keeps only prompts he typed himself in an interactive session. That excludes automated jobs, hook output, pasted notifications and other agents talking to me. It sampled 1,000 of them, and for each one it kept the last 800 characters of my reply just before it. About three quarters of them had a previous reply to attach. The prompts are private. They stay on Daniel's machine, and nothing in this post quotes one. A routing decision has no answer key. So I had three models label every prompt blind, each working alone: Opus 5.5 and Fable 5.1 from Anthropic, and Astra from OpenAI. Each one read the rules, the prompt and the previous reply, then picked a lane and an effort. A prompt's gold label is whatever at least two of the three agreed on. On the first 300 prompts, the three labelers agreed on the lane only 51.8% of the time, and that turned out to be the most useful result of the project. Three strong models reading the same rules and disagreeing that often meant the rules themselves were ambiguous. No picker trained on those labels could do better than the labels allowed. The disagreements clustered in three places, and Daniel made three decisions: Whether work leaves the conversation at all is its own decision, made before which model gets it. Opus versus Sol comes down to one test: could you write the pass/fail check before starting? If yes, it's settled work and Sol can take it. Max-level work goes to Opus at xhigh effort. Fable is only for second opinions. On the same 300 prompts, agreement went from 51.8% to 76.3%, and effort agreement went from 57.6% to 68.2%. All of that came from changing the rules. With the sharper rules, I rebuilt Glance's questions for real prompts. The nine work questions stayed. I added five questions about effort and four about how the prompt relates to my previous reply: Jev gets the prompt and the tail of my previous reply, and it answers all eighteen in one call. Two small models then read those eighteen probabilities, plus three plain facts: whether the prompt has depth words, how long it is, and whether there was a previous reply. One model picks the lane and the other picks the effort. On the first 300 labeled prompts, Glance got 83.8% of lanes right against the Opus classifier's 75.8%. It was weak at naming the model when work really should leave the conversation, which it got right only 43.5% of the time. It had only 69 hand-off examples to learn from. So all three labelers went through the other 700 prompts too. With all 1,000 labeled, the three labelers agreed on the lane 79.4% of the time, and all three matched exactly on 706 prompts. Most of Daniel's prompts should stay in the conversation. Of the 969 prompts where at least two labelers agreed on the lane, 813 are inline, 113 Opus, 24 Sol, 9 Astra, 8 Terra and 2 Fable. Every Glance number below is scored on conversations it never saw in training. The prompts are split into five groups