Engineering 51 min read

What is SemIf? Semantic ifs from open models, explained

MMNMNOTE
ai-engineeringllmclassificationopen-modelssemifagents
Updated September 29, 2026

TL;DR. SemIf is an MIT-licensed research project that makes an open language model answer a decision instead of writing a reply. You give it some unstructured state, a question, and 2–16 labelled options. It runs one forward pass of a frozen model (Qwen3.5-4B in the docs) and reads each option's probability straight from the next-token logits. Nothing is generated, so there is nothing to parse.1 The trick itself is not new — Llama Guard 3, ShieldGemma and Qwen3-Reranker already score with it234 — what SemIf adds is making the question and options runtime-defined. On one RTX 3090 the author measured 21 decisions over a shared document in a median 1.023 s, against 5.332 s for the same model writing a compact JSON array.1 The catch, stated by the project itself: the scores are not calibrated confidence.5

Updated 24 September 2026. Six independently-authored reimplementations of Jev's interface (SemIf among them) now exist, two outside analyses of it reached the Hacker News front page, and SemIf itself gained a CPU backend and a calibration layer. See Update — 24 September 2026, below, for what that changes.

Updated 26 September 2026. The pattern now has a local serving runtime, Ollaya, that answers the hosted API's wire format on your own machine. Two independent benchmarks have also measured the hosted model. See Update — 26 September 2026, below.

Updated 29 September 2026. Jeff, a set of 0.8B and 2B Jev-compatible decision models, was trained on one workstation GPU; its benchmark figures are its author's own. A preprint has also counted 2,170 Jev projects on GitHub. See Update — 29 September 2026, below.


What SemIf is

The repo's tagline is "Semantic ifs from open models, on a 3090 at home." Its starting observation:

"Most agent decisions are small: route this, retry that, does the evidence support X? A chat model can answer them, but it spends time generating text that software immediately parses back into an if statement."1

SemIf is an open reproduction of an interface pattern — runtime-defined semantic decisions that return typed scores. The pattern comes from Jev, a closed hosted model from TypeSafe. SemIf was formerly called OpenJev, says it is "not affiliated with or endorsed by TypeSafe," and that it "does not reproduce Jev's undisclosed model or training."1

TypeSafe describes Jev as "a frontier-intelligence function call: unstructured state in, typed probabilistic decisions out," and advertises an "end-to-end response time" of "70ms-500ms," support for "a cardinality up to 255" options, and input pricing of "$0.042 / MTok."6 Those are vendor claims; nothing in this post tests them (two independent benchmarks have since measured the hosted latency; see the 26 September update). Jev's launch drew a large Hacker News thread (1,937 points and 509 comments when fetched on 21 September 2026), including the pointed objection that "the speed comparison seems misleading… Jev can only generate structured output."7 Several open clones followed within days; Latent.Space rounded up six of them.8

One correction to that early coverage: Latent.Space described SemIf as a Qwen3.5 backbone with "a tiny three-class NLI classifier on the last token."8 The code on master (commit ca3ba65, 19 September 2026) has no classifier head. It reads letter-token logits directly, and docs/RESULTS.md lists "runtime-defined questions rather than a fixed task classifier head" as a point in its favour.5 The round-up's description fits a different, similarly named project that it linked in the same line: AlexWortega/openjev on Hugging Face, a Qwen3.5 sequence classifier with three NLI labels and last-token pooling.9 Two projects called OpenJev appeared in the same week; SemIf is the one with no trained head. Trust the code over the round-up.

In packaging terms SemIf is a small Python package (semif-phase1, v0.1.0) with one CLI, semif-score. It also ships an MLX backend for Apple Silicon (Qwen3.5 models only), a browser-only WebGPU demo built on wllama/llama.cpp with "no build step, API, database, telemetry, or server-side inference," and a frozen benchmark bundle with row-level predictions and SHA-256 checksums.110

How a decision is computed

From src/semif_phase1/core.py and direct.py:

  1. Your options are relabelled A, B, C, … up to P — so 2–16 options.
  2. The model gets a fixed system prompt: "Apply the supplied criterion to the supplied evidence. Choose exactly one listed option. Respond with only its uppercase letter, with no explanation or reasoning." The user turn is a JSON payload of evidence, criterion, and the lettered option descriptions.
  3. SemIf runs one forward pass and keeps only the last-position logits for the letter tokens.
  4. A softmax over just those logits gives one score per option, mapped back to your option IDs.
flowchart TD
    A[State, question and 2-16 described options] --> B[Options relabelled A, B, C ... P]
    B --> C[Fixed system prompt plus JSON payload]
    C --> D[One forward pass of a frozen model]
    D --> E[Last-position logits for the letter tokens only]
    E --> F[Softmax over those logits]
    F --> G[One score per option ID - no token sampled]

Figure: how SemIf scores one decision. The state, question and described options are relabelled with letters, wrapped in a fixed prompt, and passed through a frozen model once; only the letter-token logits at the last position are kept, softmaxed, and mapped back to your option IDs. No token is ever sampled.

No token is sampled — docs/METHOD.md puts it as "It does not decode a token."11 The code refuses to run if a letter isn't exactly one round-trip token, or if appending the letter would change how the prompt tokenizes. It also refuses to truncate: rows over --max-tokens (default 4096) raise an error.1

This is the same scoring rule that the original MMLU benchmark used — it compares "the probabilities of the following letter answers" (A, B, C, D) — and it matters which rule you pick: Hugging Face showed one model scoring 0.636 under letter-probability scoring and 0.488 under a different full-answer scoring of the same benchmark.12 Robinson et al. found that when a model reliably binds options to their letters, showing all options and reading the letter beats scoring each answer separately.13 SemIf takes the letter-reading side of that choice.

Four ways to run it

--modeWhat it doesWhen to use it
directOne fresh forward pass per rowIndependent decisions over different inputs
serialPrefills a state once, re-uses it for consecutive rows with the same stateSeveral questions over the same state, mixed files
sharedPrefills the state once, scores all questions as one parallel batchMany questions over one identical state — the fast path
rerankerUses Qwen3-Reranker-4B's yes/no relevance contract per optionRanking/retrieval-style tasks (torch backend only)

shared enforces its precondition: every row must carry exactly the same state, or it raises "Shared scoring requires one nonempty exact state".1

How well it works: the author's numbers

Every figure in this section comes from the repo's README.md and docs/RESULTS.md. They are the author's measurements; they were cross-checked against the repo's files and its raw prediction bundle, but not re-run.

Speed. One RTX 3090, Qwen3.5-4B, one owned state, 21 yes/no criteria (median of 3):

Output pathMedian timeOutput tokens
Direct typed logits (parallel)1.023 s0
Autoregressive JSON array of "yes"/"no"5.332 s111

The two paths agreed on 18 of 21 criteria, which the README frames as "a systems comparison rather than a claim that the two readouts are semantically equivalent."1

On a larger 37-state × 21-criterion workload (777 decisions, states of about 8,000 characters):

Execution pathDecisions/sWall time for 777
Fresh direct scoring2.33333.1 s
Serial prefix reuse10.7572.3 s
Parallel suffixes (shared)20.0338.8 s
Native reranker1.86417.3 s

Reusing the state gives about 8.6× the throughput of fresh scoring on the same GPU. The author labels the reuse paths experimental: BF16 execution changed 5–6 of the 777 argmax decisions relative to fresh scoring.5 The repo also warns that these numbers "must not be directly divided into TypeSafe's reported service latency" — a 3090 at home and a hosted service are different systems.5

Quality. Direct logits with Qwen3.5-4B were the strongest open baseline tested:5

WorkloadMetric (repo's label)Direct Qwen3.5-4BQwen3-Reranker-4B
Project-authored, 144 rowsMean family balanced accuracy0.8130.625
WANLI (external NLI), 256 rowsBalanced accuracy0.6370.522
TypeSafe public subset, 102 rows / 20 casesEqual-case reference agreement0.8450.560

WANLI is an independent natural-language-inference dataset of 107,885 examples built by GPT-3 generation plus crowdworker revision,14 so it is the least author-controlled number here — and also the lowest. The README compares 0.845 with "0.883 for published Jev," noting it covers "the 102 rows that could be aligned from public artifacts, not TypeSafe's reported 711-row aggregate," and that no live Jev endpoint was run.1 Two things to know before reading that as a near-tie. First, the 0.883 figure could not be traced to a TypeSafe page for this post; it rests on SemIf's README. Second, TypeSafe's own eval dashboard defines its reference answers as "an average of the responses of GPT-6 Astra and Claude Fable 5.1, both at high thinking"15 — so "reference agreement" measures agreement with frontier models, not with human-verified truth.

Smaller models fall off fast: Qwen3-0.6B scored 0.440 mean family balanced accuracy on the authored set, MiniCPM5-2B 0.686.1

What SemIf is for: use cases, with evidence

The useful way to think about SemIf is as one instance of a pattern: ask a closed question, read the answer's probability, threshold it. That pattern already runs in shipped models, which is the strongest evidence it works. For each use case below: the production precedent, what SemIf itself ships or measured, and how strong the evidence is.

1. Safety and content moderation gates

Precedent (confirmed). Meta's Llama Guard 3 model card: "we look at the probability for the first token, and use that as the 'unsafe' class probability. We can then apply score thresholding to make binary decisions."2 Google's ShieldGemma does the same, taking the logits for Yes and No at the last position and softmaxing them into a policy-violation score.3

In SemIf. The browser demo's "Email triage" preset is really a moderation-style call: a fake payroll email classified as Legitimate / Spam / Phishing.10

Difference that matters. Llama Guard and ShieldGemma were trained on a safety taxonomy. SemIf asks a general model a question you wrote at runtime. You gain flexibility — any policy, no fine-tune — and give up the training that made those scores meaningful. Treat a SemIf moderation gate as a pre-filter in front of a trained classifier or a human, not a replacement.

2. Retrieval re-ranking

Precedent (confirmed). monoT5 ranks passages by training the model to "generate relevance labels as 'target words'" and reading "the underlying logits of these target words."16 Qwen3-Reranker-4B's reference code stacks the no/yes logits, log-softmaxes them, and uses P(yes) as the relevance score.4

In SemIf. Both the direct path and the reranker mode scored Recall@1 of 1.000 on a code-retrieval set (6 queries) and 0.929 on a company-knowledge set (7 queries).1 Those samples are far too small to rank the two approaches. For re-ranking specifically, a purpose-trained reranker is the default; SemIf's direct path is interesting when you want to pick among described options rather than score query–document pairs.

3. Routing: queues, teams, tools

In SemIf. The shipped example route-1 routes "Customer asks to reset a forgotten password and says the reset email never arrived." across account_access / billing / sales; the demo's "Account support" preset routes a locked account between access support, billing, and "close as resolved."110

Alternatives worth weighing. Aurelio's semantic-router routes with embedding similarity instead of LLM generation ("we use the magic of semantic vector space"),17 which is faster still but needs example utterances per route. RouteLLM trains a router to pick between a strong and a weak model and reports cutting cost "by over 2 times in certain cases."18 SemIf sits between them: no training and no example set — just option descriptions — at the cost of a 4B-model forward pass.

4. Evidence checks with an "insufficient" escape hatch

In SemIf. support-1 asks whether a log shows the deployment succeeded, with yes / no / insufficient;1 WANLI labels are mapped to supported / insufficient / contradicted.11 The authored benchmark includes a 36-row missing-evidence set, built to test whether the model admits it doesn't know. It mostly does — 31 of the 36 rows picked insufficient in the committed raw predictions, by this post's count — but it still made one confident (>0.8) non-insufficient choice.5

Why the escape hatch matters. Without an insufficient option, a softmax over the remaining options must sum to 1, so the model is forced to pick something. Adding the option is the cheapest abstention mechanism available.

5. Policy application and agent action gating

In SemIf. policy-1 asks whether listing files in a production backup requires a change ticket under a deletion policy.1 On Every's public parallel-judgment "action firewall" set — ask several yes/no risk questions per agent action (destructive? reversible? out of scope? sharing sensitive data? needs confirmation?) and compose the scores into allow, confirm or block1 — SemIf scored 0.700 composed accuracy over 10 actions, tied with the reranker path.5

Outside evidence. One independent developer benchmarked Jev on 60 agent tool-call-risk cases and got 91.7% (55/60), noting that "every incorrect answer came with confidence below 1.000" — while flagging that 60 cases is too few and there were no frontier-model baselines.19 No production write-up of an open-model logit-based action firewall was found for this post. Read this use case as promising and unproven: 10 actions is a smoke test.

6. Judgment grids and LLM-as-judge

In SemIf. Many criteria over one document — a checklist review of a contract, a PR description, an incident report — is exactly the shape shared mode is built for: 21 criteria per state in the speed benchmark, and 0.806 on Every's 36-row judgment grid.1

Precedent (confirmed). G-Eval weights a judge's score by token probabilities (score = Σ p(sᵢ)·sᵢ) because "LLMs usually only output integer scores… This leads to many ties."20 Reading probabilities rather than a single sampled answer is an established fix for coarse judge outputs.

7. High-volume triage with a human fallback

Precedent (confirmed). OpenAI's logprobs cookbook describes the operational version of this: logprobs let you "set classification or confidence thresholds," so you can "automatically classify headlines that exceed a certain threshold and send less certain ones for manual review" — and it advises validating those thresholds "with task-specific evals."21

In SemIf / Jev. TypeSafe's public eval subset — which SemIf re-scored — is drawn from four workflows: invoice processing, agent-trace observability, customer service, and security incidents.1 Those are the domains the pattern's own authors think it fits. The worked example below is one of them.

When not to use it

Applying it: a step-by-step worked example

Scenario. A support team receives a few thousand tickets a day and wants four decisions on each before a human sees it: which queue, whether it's urgent, whether the customer is asking for a refund, and whether a canned auto-reply is safe. All four are about the same ticket text — the textbook case for shared mode.

Step 1 — Install

Python 3.10+, CUDA, and one GPU that can hold a 4B model in BF16 (Apple Silicon: the MLX backend; the Qwen3.5-4B weights are about 9 GB on disk).1

git clone https://github.com/TheoLeeCJ/SemIf.git && cd SemIf
python -m venv .venv
. .venv/bin/activate
export HF_HOME=/path/to/large-drive/huggingface
pip install -e '.[test]'          # Apple Silicon: pip install -e '.[test,mlx]'

The torch loader insists on exactly one visible CUDA GPU (CUDA_VISIBLE_DEVICES=0), and remote models need a pinned 40-character commit revision, not a branch name — deliberate, for reproducibility. (A CPU-only llama.cpp backend landed on 22 September 2026, after this post was first written — see the update below.)

Step 2 — Write the decisions as JSONL

One row per question: id, state, question, and options (each with an id and a description); 2–16 options, unique IDs. state can be a string, JSON object, or array. For shared mode, every row carries the identical ticket:

ticket-4812.jsonl

{"id":"t4812-queue","state":{"subject":"Charged twice this month","body":"Hi, I was billed twice for my March subscription (two charges on my card on 3 March). Please refund the duplicate. I also can't log in since resetting my password yesterday.","customer_tier":"pro"},"question":"Which queue should own this ticket first?","options":[{"id":"billing","description":"Billing, charges, invoices and refunds."},{"id":"account_access","description":"Login, password and authentication problems."},{"id":"technical","description":"Bugs and product malfunctions."},{"id":"sales","description":"Pricing questions and product evaluation."}]}
{"id":"t4812-urgent","state":{"subject":"Charged twice this month","body":"Hi, I was billed twice for my March subscription (two charges on my card on 3 March). Please refund the duplicate. I also can't log in since resetting my password yesterday.","customer_tier":"pro"},"question":"Does this ticket need a response within one hour?","options":[{"id":"urgent","description":"Yes: money was taken incorrectly or the customer is locked out."},{"id":"normal","description":"No: it can wait for the normal queue."},{"id":"insufficient","description":"The ticket does not contain enough information to decide."}]}
{"id":"t4812-refund","state":{"subject":"Charged twice this month","body":"Hi, I was billed twice for my March subscription (two charges on my card on 3 March). Please refund the duplicate. I also can't log in since resetting my password yesterday.","customer_tier":"pro"},"question":"Is the customer explicitly requesting a refund?","options":[{"id":"yes","description":"The customer explicitly asks for money back."},{"id":"no","description":"The customer does not ask for money back."}]}
{"id":"t4812-autoreply","state":{"subject":"Charged twice this month","body":"Hi, I was billed twice for my March subscription (two charges on my card on 3 March). Please refund the duplicate. I also can't log in since resetting my password yesterday.","customer_tier":"pro"},"question":"Can this ticket be fully resolved by a canned auto-reply with no human action?","options":[{"id":"yes","description":"A standard reply fully resolves it."},{"id":"no","description":"A human must act (e.g. issue money, unlock an account)."}]}

Two tips that follow from how SemIf works:

Step 3 — Score all four decisions in one pass

CUDA_VISIBLE_DEVICES=0 semif-score \
  --mode shared \
  --model Qwen/Qwen3.5-4B \
  --revision 851bf6e806efd8d0a36b00ddf55e13ccb7b8cd0a \
  --input ticket-4812.jsonl \
  --output ticket-4812.results.jsonl

The output file must not already exist — the CLI opens it create-only. On a Mac, add --backend mlx.

Step 4 — Read the output

This ticket file was not run for this post. Here instead is a real recorded row: the author's CLI output for the repo's own route-1 example, captured on an Apple M5 Max with the MLX backend in direct mode on Qwen3.5-4B at the pinned revision (the run predates the rename, so it came from openjev-score). It is kept in the repo at docs/media/openjev-mlx-results.jsonl; the long model metadata object and two SHA-256 hash fields (input_ids_sha256, prompt_sha256) are trimmed here.32

{"id": "route-1",
 "option_ids": ["account_access", "billing", "sales"],
 "probabilities": [0.9999798389588899, 1.4738902057685174e-05, 5.422139052461843e-06],
 "option_logits": [28.375, 17.25, 16.25],
 "answer_token_ids": [32, 33, 34],
 "input_tokens": 130,
 "prompt_version": "direct-options-v1",
 "readout": "native last-position logits restricted to declared answer slots; no generated tokens",
 "probability_status": "conditional option score; uncalibrated as decision confidence",
 "forward_seconds": 0.0577162504196167,
 "total_seconds": 0.05874616699293256}

Two things to read off it. The same run's policy-1 row is much less lopsided — not_required 0.938, required 0.060 — so the scores do spread when a question is genuinely closer.32 And probability_status travels with every row: these are scores conditional on the options you supplied. Your shared-mode rows carry the same core fields — option_ids, probabilities, option_logits, probability_status — but per-row forward_seconds/total_seconds are replaced by one shared_timing block for the batch (prefill and suffix-forward seconds, batch size); model.serving_config reads native-state-prefix-parallel-v1 on torch and mlx-shared-v1 on MLX.

Step 5 — Turn scores into ifs, with a human fallback

import json

rows = {r["id"]: dict(zip(r["option_ids"], r["probabilities"]))
        for r in map(json.loads, open("ticket-4812.results.jsonl"))}

def decide(scores, threshold):
    best = max(scores, key=scores.get)
    return best if scores[best] >= threshold else None   # None → human review

queue     = decide(rows["t4812-queue"], 0.60)
urgent    = decide(rows["t4812-urgent"], 0.70)
refund    = decide(rows["t4812-refund"], 0.80)
autoreply = decide(rows["t4812-autoreply"], 0.90)

if queue is None or urgent in (None, "insufficient"):
    send_to_human_triage("t4812")
else:
    assign("t4812", queue, priority="p1" if urgent == "urgent" else "p3")
    if refund == "yes":
        open_refund_review("t4812")          # a human still approves money
    if autoreply == "yes":
        send_canned_reply("t4812")

The thresholds are placeholders. The real route-1 row above shows why raw scores can't set them: an uncalibrated model will happily report 0.99998. That's the next step.

Step 6 — Calibrate on your own data before you trust it

The repo is blunt: "Returned probabilities are conditional on the supplied options. Calibrate and validate them on the workload where they will make decisions."1 A practical loop:

  1. Pull 200–500 past tickets that humans already labelled for each question.
  2. Score them with the exact same prompts, model, revision and serving mode — the author's BF16 reuse paths changed a handful of close decisions, so the mode is part of the system.
  3. Per question, pick the threshold that hits your precision target (say, 98% before an auto-reply fires); everything below goes to a human.
  4. Score each question twice with the option order reversed; route disagreements to a human. With 10-in-36 order flips in the author's own test, this is cheap insurance.5
  5. Re-check whenever you change option wording, order, model or quantization.
  6. Keep irreversible actions behind a human. Use SemIf to route and prioritize, not to be the final authority.

Step 7 — Scale up

For a batch of tickets, group rows by ticket and run shared once per ticket, or run serial over a mixed file (it re-uses the prefill across consecutive identical states). To try the idea before touching a GPU, open the browser WebGPU demo: it runs Qwen3-0.6B (639 MB), MiniCPM5-2B (1.56 GB) or Qwen3.5-4B (3.01 GB) quantized models entirely in the browser. The repo calls the demo's timings "not portable performance claims," and its quantized scores need their own evaluation.10

Update — 24 September 2026

In the three days after this post was published, the pattern it describes stopped being one project and became an ecosystem. Six independently-authored reimplementations of Jev's interface now sit on GitHub, two outside analyses of it reached the Hacker News front page, and SemIf itself shipped a CPU backend and a calibration layer.

Star counts and Hacker News scores move. Every figure below was read from the GitHub REST API and the Hacker News API on 24 September 2026 and is stated as observed on that date.

Six reimplementations, six different authors

The strongest evidence that an interface is real is other people rebuilding it without permission. At least six separate GitHub accounts have now published their own take on Jev's typed-decision interface. The six below were all created between 16 and 21 September 2026:33

ProjectStarsCreatedLicenceSelf-description
jaredpalmer/kev6,04117 Sep 2026Apache-2.0"tiny Jev-like family of decision models built on top of Qwen3.5 you can train and run on your own"
TheoLeeCJ/SemIf-OpenJev4,10416 Sep 2026MITthis post's subject
TianyuCodings/NanoJev2,12117 Sep 2026MIT"A nano replica of Jev: parallel decisions, dynamic candidates, and an end-to-end training pipeline."
vinnylarouge/jevlike1,27016 Sep 2026MITposted to Hacker News as "Reverse-engineered Jev-like model"34
featherless-ai/simple-jev50218 Sep 2026Apache-2.0"Turn any open model into a classifier/jev endpoint"
nokia-applied-research/AnyJev38921 Sep 2026Apache-2.0"Turn any LLM into a Jev-style decision model: typed decisions, real probabilities, no training."

Read the third column, not the second. Stars measure attention and decay; six distinct authors independently arriving at the same interface is a structural fact that does not decay. Two of them — simple-jev and AnyJev — describe themselves as adapters that turn any model into a Jev-style endpoint, which is the clearest possible statement that the authors believe the mechanism is generic rather than proprietary.

Two honest caveats. First, a large share of the GitHub activity around this term is curation, not implementation: at least seven distinct "awesome-jev" list repos appeared in the same window, and a list is evidence of attention, not of a working reimplementation.33 Second, star counts at this age are dominated by a single front-page placement, so they rank visibility, not quality.

The mechanism, deflated in 25 lines

The fastest-climbing Jev item of the week argues the opposite of a moat. "Jev in 25 Lines of Python," published by Duarte O. Carmo on 22 September 2026, reached 631 points and 197 comments in roughly 18 hours on Hacker News, where it was posted the next morning — about 35 points an hour, the highest rate of any Jev submission in this period.35 It reduces the whole thing to reading logits: "It classifies: it gets a prompt with choices and outputs probabilities. It's fast. It's local."36

It is explicitly a joke. The piece labels itself "a parody blog post" and links to three open implementations it considers more complete — one of them SemIf's own site.36 But a parody only lands if the audience already agrees, and 631 points is a large audience agreeing that the mechanism is ordinary. That is independent support for this post's opening claim — reading option probabilities from one forward pass is an old trick, and what is new is the interface around it, not the arithmetic.

An outside read on where the moat actually sits

The second front-page analysis reaches the same place by a different road. In "Will OpenAI eat Jev's lunch?" (316 points, 221 comments), John Berryman argues that "OpenAI has been using large language models implicitly as specialized classifiers since at least the introduction of tool calling."3735

His conclusion is blunt: "Architecture-wise, I don't think there's much of a moat for the very reasons stated above." His candidate for the real moat is not the readout but the data — "Perhaps the real moat is in the training data itself."37

That distinction matters for anyone choosing between a hosted decision model and an open one. If the readout is commodity and the training data is the asset, then an open reimplementation gets you the interface immediately and the decision quality only as far as its base model already goes — which is exactly the gap SemIf's own quality tables show.

Calibration got an outside argument — and a shipped answer

This post's sharpest warning was that the scores are not calibrated confidence. Both halves of the ecosystem have now converged on it independently.

On the argument side, Alex Molas published "Jev Can't Be Calibrated" on 23 September 2026. His case is distributional rather than architectural: "calibration is not just a property of the model, but also of your data distribution," and "for the same input and prompt, Jev will provide the same probabilities to both companies, regardless of their different underlying data distributions."38

His prescription matches this post's Step 6 almost line for line — "If you want calibrated probabilities you'll still need to recalibrate Jev's probabilities on your own data," and "A few hundred labeled examples from your actual data can be enough."38 His summary judgement is worth keeping: treat these outputs "as good scores (they rank examples well) rather than good probabilities."38

On the shipping side, SemIf added a per-workload temperature-scaling layer on 22 September 2026.39 The documented result is narrower than the headline suggests, and the repo says so itself:40

WorkloadRowsFitted TECE at T=1ECE own-T, out of foldIntervals separated?
Authored (owned)1441.230.0680.038no
WANLI (external NLI)2562.500.2080.069yes
Every (labelled)1541.710.0500.047no

One clean win, on the least author-controlled workload — the same WANLI set that was the lowest score in the quality table above. The other two rows did not gain because scaling failed there; the repo's own reading is that on those workloads the model is "already close to calibrated," so there was little to fix.40 Two things keep the win from overturning anything.

Calibration is monotone, so "accuracy, balanced accuracy, and every other decision metric are identical before and after. Only confidence changes."40 And it is a separate labelled step: "the native scorer, its prompts, and every committed raw prediction are unchanged,"40 while docs/RESULTS.md still lists "Calibrated probabilities suitable for operational thresholds" among what the project has not established.5

The net effect is that the caveat holds and the remedy got cheaper. You still cannot read a raw score as a probability. You can now fit one scalar per workload on labelled rows you already have — which is what Step 6 told you to do, now with the fitting code in the repo.

What changed in SemIf itself

Four repository-level changes since this post was written, all confirmed at commit 23cf1f3 (23 September 2026):39

What this changes in the post above

Update — 26 September 2026

Since the last update, the pattern has gained a local server. Ollaya, an Apache-2.0 runtime created on 23 September 2026, pulls open decision models by name and serves them on your own machine behind an API that speaks TypeSafe's wire format. SemIf is unchanged. Code written for the hosted model can now point at a local one.

Figures below were read from ollaya.dev, the GitHub REST API and the Hacker News API on 26 September 2026, and are stated as observed on that date.

What Ollaya is, and what it serves

Ollaya's README pitches it as a way to "Run open decision models locally, the way Ollama runs LLMs."41 It serves /v1/systemone and /v1/models "with TypeSafe's request and response shapes," and its site says "The official TypeSafe Python SDK 0.7.1 works unchanged against a local server."42 Its FAQ says it is "not affiliated with TypeSafe" and "not affiliated with Ollama."43 The repo had 175 stars; the Hacker News launch thread stood at 331 points and 97 comments.4144

It does not serve SemIf. The catalogue is other authors' open models: Convai Innovations' laya, Mapika's decider, Moritz Laurer's NLI classifiers, Knowledgator's gliclass, Qwen3Guard, Victor Hugo Panisa's von, and kev, the Jared Palmer project in the table above.41 One of them uses SemIf's mechanism: Ollaya describes decider as decoders on Qwen3.5 where "the answer is read from option-letter logits in one forward pass."42

The speed claim is Ollaya's, and the comparison is loose

Ollaya's headline is "On your own GPU, a five-question request to Laya takes about 10 ms, end to end through the HTTP API," charted as 8–10 ms on an RTX 4090 against 236–276 ms for hosted Jev.42 The Laya figure is the vendor measuring its own tool; it was not re-run here.

The Jev figure is not Ollaya's measurement at all. The chart's own note calls it the hosted API's latency "in third-party benchmarks," one "which includes the network. Setups differ, so read it as an order-of-magnitude comparison."42 So the chart sets a local GPU with no network hop against a hosted service reached over the internet. It measures deployment, not models.

What the two independent benchmarks measured

Both repos Ollaya cites tested hosted Jev. Neither tested Ollaya, SemIf, or any model Ollaya serves.

The 236–276 ms in Ollaya's chart spans those two ranges: 264–276 ms from nibzard's, 236–256 ms from AbdelStark's. No independent number yet compares a locally served open model with Jev on quality, and Ollaya's own FAQ does not claim parity: "The small encoders, such as laya, are the fastest but fall well below Jev on harder questions; decider is more accurate and slower."43 One Hacker News commenter reported the same from use: "From my experience, Laya performs significantly worse."44

"Calibrated," as Ollaya uses the word

Ollaya's homepage promises "calibrated answers in milliseconds."42 Its FAQ explains what that means: "temperature scaling per question type and number of options, shipped with each model. For thresholds you rely on, refit the temperatures on your own labelled data and bake them in with a Modelfile."43 That is the Step 6 remedy and SemIf's temperature layer, packaged. It restates this post's warning rather than overturning it: your own labelled rows set the threshold.

What this changes in the post above

Update — 29 September 2026

The pattern now has decision models small enough to train at home. Jeff, published on 28 September 2026, fine-tunes Qwen3.5 (0.8B and 2B) and Gemma 4 E2B to answer Jev-format requests in one forward pass. Its author trained the 0.8B in about two hours on one workstation GPU. Every Jeff benchmark figure below is the author's own.

Figures below were read from the Jeff README, the GitHub REST API, the Hugging Face API and the Hacker News API on 29 September 2026, and are stated as observed on that date.

What Jeff is, and how it differs from SemIf

Jeff's README describes "small, fast decision models you slot into your code, with the same request format as Jev," which return "a calibrated probability for each option from a single forward pass."47 The code is MIT-licensed and the weights Apache 2.0. It began as a fork of AutoJev, an open recipe for a 27B Jev-style model, and states it "is not affiliated with or endorsed by TypeSafe."47

The repo had 319 stars a day after creation; the Hacker News thread stood at 265 points and 106 comments.4849

The difference from SemIf is training. SemIf reads option-letter logits from a frozen model; Jeff runs "full-weight fine-tuning, one epoch," with "cross-entropy over the option letters."47

The README says the work was done on "one RTX PRO 6000 workstation GPU (the 0.8B trains in about 2 hours, the 2B in about 3.5)," with synthetic data from an open model: "No cloud GPUs, and no closed-model output in the training data." A closed model spot-checked a sample.47 It reports a median 22 ms per decision for the 0.8B on that GPU, 28 ms on an Apple M4 Max and 463 ms on a 32-thread CPU.47

The benchmark comparison is the author's, on a different sample

BenchmarkJeff 0.8BJeff 2BJev (published)
Overall (5 benchmarks)79.183.183.0
Financial PhraseBank96.496.377.0
RAGTruth86.188.977.3
WinoGrande68.679.090.7
JudgeBench62.664.678.6
BBH64.068.094.3
JevBench hard (105 items, separate)47.653.373.3

The 83.1 against 83.0 is not a head-to-head. The README says "The published Jev and AutoJev figures were measured on a different sample of the same benchmarks," and that on "the reasoning-heavy benchmarks (BBH, JudgeBench, JevBench) it stays well below them."47

Nobody has re-run these figures independently. One Hacker News commenter reported the opposite of parity on their own tasks: "70% vs 94% . for classification, it's unacceptable."49 The README's remedy for that is a short fine-tune on your own examples, which by its own figures took a voice-navigation task "from 31.7% to 95.8%."47

"Calibrated" still means one fitted temperature

Jeff's recipe ends with "one fitted temperature for calibration."47 That is the mechanism SemIf added on 22 September and Ollaya ships per model. The temperature was fitted during the author's training run, not on your data. This post's warning still holds: refit it on your own labelled rows before a threshold triggers anything.

A first count of Jev in use

A preprint, "Jev in the Wild" (Ling, Xue and Ye, submitted 24 September 2026 and listed on Hugging Face Papers), analyses "2,170 publicly available Jev projects collected from GitHub as of September 22, 2026."50 It finds that "Attribute judgment and scoring are widely used," and that "public attention is concentrated in routing and interface agents and does not track project counts."50 It counts projects built around Jev, not reimplementations, and it has not been peer-reviewed.

What this changes in the post above

Frequently Asked Questions

What is SemIf?

SemIf is an MIT-licensed research project that turns an open language model into a decision function. You pass unstructured state, a question and 2–16 described options; it runs one forward pass of a frozen model and softmaxes the option letters' logits into one score per option. Nothing is generated, so there is nothing to parse.1

Is SemIf the same as Jev?

No. Jev is TypeSafe's closed hosted model. SemIf reproduces Jev's interface pattern with open models and says it "does not reproduce Jev's undisclosed model or training." It was formerly called OpenJev and is not affiliated with or endorsed by TypeSafe.1

How fast is SemIf compared with generating JSON?

On the author's single RTX 3090, 21 yes/no decisions over one shared document took a median 1.023 s with direct logits, versus 5.332 s for the same Qwen3.5-4B model writing a compact JSON array. Those are the author's measurements; they were not re-run for this post.1

Are SemIf's probabilities calibrated?

No. Direct, serial and shared rows are stamped "conditional option score; uncalibrated as decision confidence," and the repo lists calibrated probabilities among the things it has not established. Calibrate thresholds on your own labelled data before a score triggers an action.5 Since 22 September 2026 the repo ships an optional per-workload temperature-scaling layer that fits that calibration for you; it leaves the native scorer and every committed prediction unchanged, and it never moves the selected option.40

Does SemIf need a GPU?

No longer. The torch backend needs exactly one visible CUDA GPU that can hold a 4B model in BF16, and Apple Silicon can use MLX or PyTorch/MPS — but since 22 September 2026 a llama.cpp backend scores the same prompts from a local GGUF on CPU only (--backend llamacpp).139 The browser demo runs quantized Qwen3-0.6B, MiniCPM5-2B or Qwen3.5-4B locally over WebGPU.10

Has SemIf changed since this post was published?

Yes. As of 24 September 2026 the repository is renamed TheoLeeCJ/SemIf-OpenJev, master is at commit 23cf1f3, and it has added a CPU llama.cpp backend, PyTorch/MPS scoring, a Qwen3.8-27B EXL3 bridge, and per-workload temperature calibration. The mechanism, CLI contract, speed tables and quality tables are unchanged.39

Can I run a Jev-style decision model locally?

Yes. SemIf runs on your own GPU, CPU or browser, and since 23 September 2026 Ollaya serves open decision models such as laya, decider and kev locally behind a TypeSafe-compatible API. Since 28 September 2026, Jeff's 0.8B and 2B models run on a GPU, a Mac or a CPU with the same request format. Ollaya's and Jeff's speed and accuracy figures are their own; independent benchmarks so far measured only hosted Jev, and Ollaya's FAQ says its fastest models fall well below Jev on harder questions.4243474546

When should I not use SemIf?

Skip it when you need a trustworthy probability rather than a ranking, when option order or wording will change, when the decision needs step-by-step reasoning, when someone must read the why, when the output is open-ended, and whenever an irreversible action would fire without a human check.

Verification status

What was checked for this post, and against what. Nothing was executed; this is desk research against the repo at commit ca3ba65 and the public sources below, read on 21 September 2026.

ClaimStatusChecked against
Mechanism: lettered options, fixed system prompt, one forward pass, softmax over letter logits, no samplingConfirmed in codecore.py, direct.py, METHOD.md
CLI details: four modes, 16-option cap, 4096 default, create-only output, one GPU, pinned revision, error stringsConfirmed in codecli.py, core.py, shared.py
No classifier head (contradicts one early write-up, which matches a different OpenJev project)Confirmed in codedirect.py, RESULTS.md vs Latent.Space and the AlexWortega/openjev model card
Speed tables (1.023 s vs 5.332 s; 777-decision throughput)Author's measurement — matches repo docs and raw files, not re-runREADME.md, RESULTS.md, results/raw/
Quality tables, perturbation flips, missing-evidence result, action-firewall 0.700Author's measurement — matches repo docs and phase1-summary.json, not re-runRESULTS.md, results/
Step-4 output rowReal recorded output, from the author's rundocs/media/openjev-mlx-results.jsonl
Jev latency, 255 options, pricingVendor claimTypeSafe launch post
Jev's 0.883 on the 102-row subset; 711-row aggregateOnly in SemIf's README / secondary coverage; no TypeSafe page foundSemIf README.md
TypeSafe reference labels come from averaged frontier-model answersConfirmedevals.typesafe.ai
Production precedents (Llama Guard 3, ShieldGemma, Qwen3-Reranker, monoT5, G-Eval, OpenAI cookbook)Confirmed from model cards / papersfootnotes
Calibration and order-bias findingsConfirmed from arXiv abstractsfootnotes
Open-model logit-based action firewall in productionNot found—
Ticket-triage example, thresholds, calibration loopThis post's own application of the documented interface; not shipped or benchmarked by the repo—

The repo is days old (created 16 September 2026) and moving fast. Commands and numbers reflect master as read on 21 September 2026.

Second pass, 24 September 2026. The update section above was verified the same way — desk research, nothing executed. Repository names, creation dates, licences and star counts were read from the GitHub REST API; Hacker News scores, comment counts and submission timestamps from the Hacker News API, cross-checked against the Algolia search API; article quotes were fetched and matched character for character against the published pages.

Claim (update section)StatusChecked against
Six reimplementation repos: owners, star counts, creation dates, licencesConfirmed, as observed 24 Sept 2026api.github.com/repos/{owner}/{repo}
Seven-plus distinct "awesome-jev" list repos in the same windowConfirmedGitHub repository search
HN 631 pts / 197 comments (25 Lines), 316 / 221 (fast-follow), 1,977 / 513 (origin)Confirmed, two independent APIs agreedHacker News API + Algolia
~35 points/hour for "Jev in 25 Lines of Python"Computed for this post from score ÷ age at read timeHacker News API
Quotes from Carmo, Berryman and MolasVerbatimthe three published articles
"Jev in 25 Lines of Python" is self-labelled a parodyConfirmednobodywho.ai
Rename, 23cf1f3 HEAD, llama.cpp CPU backend, MPS, EXL3 bridge, temperature layerConfirmed in repoREADME.md, docs/CALIBRATION.md @ 23cf1f3
Calibration ECE table and its own caveatsAuthor's measurement — matches the repo's committed table, not re-rundocs/CALIBRATION.md
Berryman's "training data is the moat" readingOpinion, attributed — not a measurementarcturus-labs.com

Third pass, 26 September 2026. Same method, nothing executed. Ollaya's site, FAQ and README were fetched and every quote matched against the published text; repository metadata came from the GitHub REST API, and Hacker News figures from the Hacker News API, cross-checked against Algolia.

Claim (26 September update)StatusChecked against
Ollaya: created 23 Sept 2026, Apache-2.0, 175 stars; HN 331 pts / 97 commentsConfirmed, as observed 26 Sept 2026GitHub REST API; Hacker News API + Algolia
TypeSafe-compatible endpoints, SDK 0.7.1 works unchanged, model catalogue, decider reads option-letter logitsVendor description, quotedollaya.dev, README
Laya ≈10 ms / 8–10 ms on an RTX 4090Vendor claim — not re-runollaya.dev, FAQ
Jev 236–276 ms in Ollaya's chartThird-party measurements of the hosted API, relayed by Ollaya; spans the two benchmark repos' ranges (236–256 and 264–276 ms p50)the two benchmark READMEs
Benchmark results (nibzard: p50, 76.3%, ECE 0.246; AbdelStark: accuracies, calibration, latency)Benchmark authors' measurements — match their READMEs, not re-runthe two benchmark READMEs
Neither benchmark tested Ollaya, SemIf or any model Ollaya servesConfirmed from both repos' contender liststhe two benchmark READMEs
"fall well below Jev on harder questions"; calibration = shipped temperature scalingVendor statement, quotedollaya.dev/docs/faq
Laya "performs significantly worse"Single commenter's anecdote, attributedHN comment 49848537
SemIf master still 23cf1f3ConfirmedGitHub commits API

Fourth pass, 29 September 2026. Same method, nothing executed. Jeff's README and the preprint abstract were fetched and every quote matched against the published text; repository and model metadata came from the GitHub REST and Hugging Face APIs, and Hacker News figures from the Hacker News API, cross-checked against Algolia.

Claim (29 September update)StatusChecked against
Jeff: created 28 Sept 2026, code MIT, weights Apache 2.0, 319 stars; HN 265 pts / 106 commentsConfirmed, as observed 29 Sept 2026GitHub REST API, Hugging Face API, README; Hacker News API + Algolia
Training hardware and hours, fine-tuning recipe, fitted temperatureAuthor's description, quotedJeff README.md
Latency (22 / 28 / 463 ms) and all benchmark scoresAuthor's measurement — not re-run, not independently replicated; Jev figures on a different sampleJeff README.md
"70% vs 94%" on one user's tasksSingle commenter's anecdote, attributedHN comment 49884862
2,170 Jev projects; usage findingsPreprint authors' analysis, quoted; not peer-reviewedarXiv 2609.30216 abstract
SemIf master still 23cf1f3ConfirmedGitHub commits API

Footnotes

  1. SemIf repository, README and source — https://github.com/TheoLeeCJ/SemIf (commit ca3ba65; README.md, src/semif_phase1/{core,direct,shared,serial,cli}.py, pyproject.toml, examples/decisions.jsonl, benchmarks/manifests/source-selection.jsonl, benchmarks/evaluate_external.py). ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15 ↩16 ↩17 ↩18 ↩19 ↩20 ↩21 ↩22 ↩23

  2. Meta, Llama Guard 3 8B model card — https://huggingface.co/meta-llama/Llama-Guard-3-8B ↩ ↩2

  3. Google, ShieldGemma 2B model card — https://huggingface.co/google/shieldgemma-2b; paper https://arxiv.org/abs/2407.21772 ↩ ↩2

  4. Qwen, Qwen3-Reranker-4B model card — https://huggingface.co/Qwen/Qwen3-Reranker-4B ↩ ↩2

  5. SemIf, docs/RESULTS.md — https://github.com/TheoLeeCJ/SemIf/blob/master/docs/RESULTS.md ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13

  6. TypeSafe, "Introducing System One models and Jev" — https://typesafe.ai/blog/introducing-system-one-models-and-jev ↩

  7. Hacker News discussion of the Jev launch — https://news.ycombinator.com/item?id=49717558 ↩

  8. Latent.Space, "Here are 6 clones of Jev in 2 days" — https://www.latent.space/p/ainews-here-are-6-clones-of-jev-in ↩ ↩2

  9. AlexWortega, openjev model card on Hugging Face (a separate project from SemIf) — https://huggingface.co/AlexWortega/openjev ↩

  10. SemIf, webgpu-demo/README.md — https://github.com/TheoLeeCJ/SemIf/tree/master/webgpu-demo ↩ ↩2 ↩3 ↩4 ↩5 ↩6

  11. SemIf, docs/METHOD.md — https://github.com/TheoLeeCJ/SemIf/blob/master/docs/METHOD.md ↩ ↩2 ↩3

  12. Hugging Face, "What's going on with the Open LLM Leaderboard?" — https://huggingface.co/blog/open-llm-leaderboard-mmlu ↩

  13. Robinson et al., "Leveraging Large Language Models for Multiple Choice Question Answering" (ICLR 2023) — https://arxiv.org/abs/2210.12353 ↩

  14. Liu et al., "WANLI: Worker and AI Collaboration for Natural Language Inference Dataset Creation" (Findings of EMNLP 2022) — https://arxiv.org/abs/2201.05955 ↩

  15. TypeSafe eval dashboard — https://evals.typesafe.ai/ ↩

  16. Nogueira, Jiang & Lin, "Document Ranking with a Pretrained Sequence-to-Sequence Model" — https://arxiv.org/abs/2003.06713 ↩

  17. Aurelio Labs, semantic-router — https://github.com/aurelio-labs/semantic-router ↩

  18. Ong et al., "RouteLLM: Learning to Route LLMs with Preference Data" — https://arxiv.org/abs/2406.18665 ↩

  19. "I benchmarked Jev on agent tool-call risk calibration" — https://dev.to/webofmike/i-benchmarked-jev-on-agent-tool-call-risk-calibration-held-49i3 ↩

  20. Liu et al., "G-Eval: NLG Evaluation using GPT-4 with Better Human Alignment" — https://arxiv.org/abs/2303.16634 ↩

  21. OpenAI Cookbook, "Using logprobs" — https://developers.openai.com/cookbook/examples/using_logprobs ↩

  22. Kamath, Jia & Liang, "Selective Question Answering under Domain Shift" (ACL 2020) — https://arxiv.org/abs/2006.09462 ↩

  23. Tian et al., "Just Ask for Calibration" (EMNLP 2023) — https://arxiv.org/abs/2305.14975 ↩

  24. Kadavath et al., "Language Models (Mostly) Know What They Know" — https://arxiv.org/abs/2207.05221 ↩

  25. Zheng et al., "Large Language Models Are Not Robust Multiple Choice Selectors" (ICLR 2024) — https://arxiv.org/abs/2309.03882 ↩

  26. Pezeshkpour & Hruschka, "Large Language Models Sensitivity to The Order of Options in Multiple-Choice Questions" — https://arxiv.org/abs/2308.11483 ↩

  27. Wang et al., "Large Language Models are not Fair Evaluators" — https://arxiv.org/abs/2305.17926 ↩

  28. Zhao et al., "Calibrate Before Use: Improving Few-Shot Performance of Language Models" (ICML 2021) — https://arxiv.org/abs/2102.09690 ↩

  29. Sprague et al., "To CoT or not to CoT?" (ICLR 2025) — https://arxiv.org/abs/2409.12183 ↩

  30. Liu et al., "Mind Your Step (by Step): Chain-of-Thought can Reduce Performance on Tasks where Thinking Makes Humans Worse" — https://arxiv.org/abs/2410.21333 ↩

  31. Anthropic, "Ticket routing" use-case guide — https://platform.claude.com/docs/en/about-claude/use-case-guides/ticket-routing ↩

  32. SemIf, recorded CLI output — https://github.com/TheoLeeCJ/SemIf/blob/master/docs/media/openjev-mlx-results.jsonl and docs/media/README.md ↩ ↩2

  33. GitHub REST API, repository metadata and repository search (stars, creation dates, licences, rename redirect), queried 24 September 2026 — https://docs.github.com/en/rest/repos/repos ↩ ↩2 ↩3

  34. "Reverse-engineered Jev-like model" on Hacker News — https://news.ycombinator.com/item?id=49731282 ↩

  35. Hacker News API item records, read 24 September 2026 and cross-checked against the Algolia search API — https://github.com/HackerNews/API; items https://news.ycombinator.com/item?id=49812769, https://news.ycombinator.com/item?id=49802161, https://news.ycombinator.com/item?id=49717558 ↩ ↩2 ↩3

  36. Duarte O. Carmo, "Jev in 25 Lines of Python", NobodyWho, published 22 September 2026 (submitted to Hacker News 23 September) — https://www.nobodywho.ai/posts/jev-in-25-lines/ ↩ ↩2

  37. John Berryman, "Will OpenAI eat Jev's lunch?", Arcturus Labs, 21 September 2026 — https://arcturus-labs.com/blog/2026/09/21/will-openai-eat-jevs-lunch/ ↩ ↩2

  38. Alex Molas, "Jev Can't Be Calibrated", 23 September 2026 — https://www.alexmolas.com/2026/09/23/jev-cant-be-calibrated.html ↩ ↩2 ↩3

  39. SemIf, README.md at commit 23cf1f3 (23 September 2026), "Latest changes", "Quick start" and the general decision baseline table — https://github.com/TheoLeeCJ/SemIf-OpenJev/blob/master/README.md ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7

  40. SemIf, docs/CALIBRATION.md — https://github.com/TheoLeeCJ/SemIf-OpenJev/blob/master/docs/CALIBRATION.md ↩ ↩2 ↩3 ↩4 ↩5

  41. Ollaya, README.md and repository metadata (created 23 September 2026, Apache-2.0, stars as of 26 September 2026) — https://github.com/ollaya-dev/ollaya ↩ ↩2 ↩3

  42. Ollaya, "Run decision models locally" (homepage, speed chart and chart note), read 26 September 2026 — https://ollaya.dev/ ↩ ↩2 ↩3 ↩4 ↩5 ↩6

  43. Ollaya, FAQ — https://ollaya.dev/docs/faq ↩ ↩2 ↩3 ↩4 ↩5

  44. Hacker News, "Ollaya – Ollama for open-source, Jev-style decision models", read 26 September 2026 — https://news.ycombinator.com/item?id=49848269; quoted comment https://news.ycombinator.com/item?id=49848537 ↩ ↩2

  45. Nikola Balic (nibzard), "DMB — decision-model benchmark", README.md — https://github.com/nibzard/decision-model-benchmark ↩ ↩2 ↩3

  46. AbdelStark, jev-benchmarks, README.md (pilot result and limitations) — https://github.com/AbdelStark/jev-benchmarks ↩ ↩2

  47. Jeff, README.md (description, training, benchmarks, speed table, recipe, licence) — https://github.com/firelex/jeff ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9

  48. GitHub REST API (Jeff: created 28 September 2026, MIT, 319 stars; SemIf-OpenJev commits) and Hugging Face API (mstrasser/Jeff-Qwen3.5-0.8B, Apache-2.0), read 29 September 2026 — https://api.github.com/repos/firelex/jeff ↩ ↩2

  49. Hacker News, "Jeff – Jev-compatible 0.8B decision models, trained at home, ~30 ms", read 29 September 2026 — https://news.ycombinator.com/item?id=49883844; quoted comment https://news.ycombinator.com/item?id=49884862 ↩ ↩2

  50. Ling, Xue & Ye, "Jev in the Wild: A Data-Driven Analysis of the Jev Model's Functionality, Applications and Ecosystem", arXiv:2609.30216, submitted 24 September 2026 — https://arxiv.org/abs/2609.30216; https://huggingface.co/papers/2609.30216 ↩ ↩2