How we reviewed this: we ran one real exploration end to end, with every LLM seat on the
cheapest model that could drive it (qwen/qwen3.7-flash on OpenRouter) and a stand-in in place of
Jev that logged each request and answered in TypeSafe’s published shape. To keep the bill small we
cut the configuration down: three seats instead of eight, one decomposition round instead of three,
two divergence rounds instead of five. We then drove its Jev gateway directly through eight
success and failure cases. We made no Jev calls, so nothing here measures how well Jev judges
duplicates.
What it is
Varina (the repository was called Aha-Engine until October) is for design problems with a large solution space and an
obvious, disappointing answer: a cooperative game whose late rounds are solved, an economy that
inflates, an incentive that gets gamed. You describe the problem and point it at a workspace folder
of rules or code. A main agent writes a baseline answer, using ReAct to read the workspace. Then a
deep exploration runs: several “seats” split the problem into sub-questions, answer them, and
diverge from a shared board under different “cognitive operator” task cards. The agent fact-checks
what they claim and edits the board between rounds, and finally writes comparable proposals. It
runs as a local web app, a CLI and an MCP server, in Chinese, with DeepSeek, GLM and Gemini as
default seats and any OpenAI-compatible endpoint configurable.
The exploration only starts when you ask for it, with /varina or the toggle in the UI. Our first
run, without the command, produced a good baseline answer and made no Jev calls at all.
What Jev does here
Three narrow jobs, all yes/no or pick-one:
- The gate. After the baseline answer, should deeper exploration start? It is a choice between
START and ASK, with START defined to include uncertainty. Varina only skips exploration when ASK
has probability ≥ 0.9 and confidence ≥ 0.8. On a two-way choice those are the same condition
under TypeSafe’s published formula, so the second check is a safety net.
- Idea deduplication. For each new idea, is it already covered by the active ideas on the board?
It is a noul with a long, careful definition: shared wording is not duplication, opposite
conclusions stay separate, “if uncertain, return False”. Duplicates go at ≥ 0.85.
- Sub-question deduplication. The same idea for the decomposition, under a written policy with
four conditions for “duplicate” and eight for “keep”.
The failure handling leans the same way:
| case |
result |
| gate: ASK at 0.95, confidence 0.9 |
skip exploration |
| gate: ASK at 0.85 |
explore anyway |
| gate: an answer outside START/ASK |
refused with an error |
a 529, then an answer |
answered on the second try |
three 529s |
error after three attempts; the key is redacted from the message |
a 401 |
error at once, no retry |
| an idea-dedup request that fails |
that one idea is kept |
One leniency matters only off TypeSafe: if a compatible server answers a noul with the string "yes"
instead of a probability, the gateway reads it as certainty and drops the idea, skipping the 0.85
threshold. Jev always returns a number.
What one exploration costs, and sends
Our reduced run made 27 LLM calls and 38 Jev requests: one gate, three sub-question checks and
34 idea checks. The Jev requests came to 237 KB in all, the largest 9 KB. Four LLM calls failed, all
because we had capped output at 8,192 tokens or because qwen omitted a field. Those were our
settings, not the project’s. The default configuration runs eight seats over five divergence rounds
after three decomposition rounds, so expect several times both numbers. Budget for the LLM seats;
the Jev side is the small part.
What reaches Jev is the problem statement, the full baseline answer — 2,100 characters in our run —
and the board’s ideas with their failure conditions. Workspace files go out only as far as the agent
quotes them. The rules file it read did; a notes file with a planted marker that it never opened did
not, and neither did a planted .env. Directory listings hide dotfiles by default.
Running it
npm start serves the UI on 127.0.0.1:27333, and it is careful about it. It binds loopback only,
refuses any request whose Host is not 127.0.0.1 or localhost, which blocks DNS rebinding, and
refuses cross-origin writes, so a web page cannot start a paid run in the background. Keys entered in
the UI are written to config.local.json, which is git-ignored and stored in plaintext.
Two things a contributor will notice. The README says to run the tests with npm test, but the
repository has no tests/ directory, so the command passes with zero tests. We reported it, along with the noul leniency above. And the licence is
Business Source License 1.1. Production use is allowed while related revenue stays under CNY 5
million over twelve months, and each version becomes Apache-2.0 three years after its release.
Verdict
A thoughtful use of Jev: it does the cheap, repetitive judgement inside an expensive multi-model
loop, with every threshold set so that doubt means “keep exploring” and “keep this idea”. The LLM
seats did real work on our solved-game problem. The final proposals were specific, and they named
what still needed testing. 581 stars.
Know what you are buying into. Every exploration is dozens of LLM calls, the code ships without a
test suite, and the licence is source-available rather than open source. For a lighter way to put
Jev inside an agent’s own decisions, see OpenMuse.
See how it compares with other tools in Best Jev tools, tested hands-on.
Review updated Oct 10, 2026. Numbers quoted from the project are its author's own; we don't publish our own measurements of Jev.