Research note · Architecture

A language model with no language model in it

ChatJEVs assembles English one word at a time out of nothing but bounded decisions — multiple choice, ratings, and yes/no probabilities. No component of the system can generate text. We describe six architectures spanning 10 to 521 decision units, what each one adds, and where the whole approach stops working.

Abstract

TypeSafe's Jev is a decision model. You give it state and a set of questions; it returns calibrated probabilities over the answers. It has exactly three question types — a Choice over at most 255 labelled options, a Score on a scale you define, and a Noul, one statement with one probability. It cannot emit a token.

We ask whether a sufficiently large network of such units develops useful language behaviour anyway. The answer word is sampled from a Choice over candidate words; everything else in the architecture exists to make that one Choice a good one. Nothing is trained — Jev is frozen. What varies between V0 and V5 is only the software around it.

Can a network of calibrated decision models produce language when every unit only makes a bounded decision?

The three primitives

Choice
One of up to 255 labelled options, with a probability for every one. The 255 ceiling is what shapes the whole decoder.
Score
A position on a scale you define, two to ten levels. Used for reply length, formality, how complete a clause is.
Noul
One statement, one probability that it holds. Used for every judgment: is this grammatical, does it repeat, is it done.
Batching
All questions in one request are answered independently and in parallel — documented at ~12× cheaper and 10× faster than asking separately. This is why 521 units cost six requests, not 521.

One word

A single word is produced by a short pipeline of batched requests. Only the last stage picks a word; everything before it decides what kind of word belongs there and what the reply so far means.

plan      speech act and length            once per reply
route     which banks are worth running    V3+
banks     meaning · grammar · memory · concepts
memory    slots updated in ordinary code, outside Jev
decode    form → bucket → word             + an <end> option
critics   judge the top candidates         V4+
sample    a word falls out of the distribution
Figure 1 — the network, firing. Each dot is one decision unit that version actually runs, grouped by bank and lit in the real order the engine consults them. The white node on the right is the emitted word. Select a version to compare; V0 is ten units, V5 is 521.

The six versions

Each is the same engine with more units, more state, and more second-guessing. Every version names the specific weakness the next one attacks.

VersionUnitsPer word VocabWhat it addsWhat it still cannot do

V0 — V3: better inputs

The first four versions all improve the state the decoder sees. V1 adds working-memory slots and feeds the previous step's most confident answers back in, making it recurrent. V2 adds 46 concept units — small questions about animacy, size, motion, polarity — so meaning is represented as a pattern across units rather than in any one of them. V3 adds routing units that decide which banks run at all, which memory slot the decoder attends to, and how much context is relevant: attention, decided rather than computed.

All four share one flaw. Every word is a single 255-way guess, committed instantly, with no lookahead and no way back. A bad word at position two poisons everything after it, permanently.

V4 — judgment

The decoder stops deciding and starts proposing. Its six best candidates go to a panel of eight critics, all forty-eight questions in one request: is this grammatical here, would a fluent writer really write it, is it relevant, does it advance the reply, does it assert anything false, is there still a way to finish the sentence after it, does it repeat, does it match the tone. The panel's verdict is blended with the decoder's own probability (p0.4 × critics0.6) and the word is sampled from the result.

The bet: asking "is cat right here?" is what a decision model is built for. "Pick one of 255" is not.

V5 — deliberation

Three drafts at rising temperature, each written quickly by the V1 architecture. A panel scores all three on eight whole-reply dimensions and votes head to head. The winner goes through a repair pass: every position is marked keep, replace or cut in a single batched request, and replaced positions are decoded again with the full critic panel. Cheap drafts, expensive judgment — and the only version that can fix its own second word.

How a word is chosen

The decoder gets 255 slots and fills them in priority order: words matching the role and inflection the syntax units settled on; then words copied from the conversation, which with a small vocabulary is most of what keeps a reply on topic; then frequent words filling the remaining budget so a wrong guess upstream is recoverable; then <end>, so the decoder can decide the reply is finished rather than being told.

A detail that dominates quality

Each option is described by naming it — "The next English word is 'cat' (noun, singular)". An earlier build described options by part of speech instead, which made all 34 nouns in a candidate list read identically. The decoder was choosing blind, and output quality was correspondingly random.

Measured results

Two instruments, because forced choice alone cannot see what V4 and V5 do.

Cloze is 90 minimal pairs across nine categories: agreement, attraction, binding, case, tense, quantifier, recall, selection and plausibility. Every distractor fills the same syntactic slot as the answer, so no item can be won by picking the only auxiliary or the only noun. In the recall items, every option appears somewhere in the passage, so copying a word from the prompt decides nothing. Option counts differ by category, so results are reported against each item's own chance level and with a 95% interval — at ten items per category, one flip moves a score ten points, and the interval says so.

Generation writes replies to eight probes and grades them in ordinary Python — no Jev in the scoring loop. Eight checks: did it produce anything, does it stutter, does it repeat, does the number on the verb match the noun, is the article right before a vowel, is there a verb at all, did it merely echo the prompt, did it stop by itself rather than hit the cap. This is the half that measures what the architecture is actually for.

The previous suite was broken

It had 40 items, and 23 of them could be answered by picking the only option of the right part of speech — including every single item in the category it claimed was the hardest. It measured lazy distractors. The new suite ships with a self-audit (chatjevs audit) that fails the build if any item is solvable that way.

Figure 2 — accuracy by version, read live from this machine's chatjevs.db. Nothing here is estimated; if no benchmark has been run, the chart says so.
Figure 3 — accuracy by category. Chance differs by category: the two-option minimal pairs sit at 50%, the four-option items at 25%.

Projected performance on public benchmarks

Projection, not measurement

None of the figures in this section have been run. They are reasoned estimates from the architecture's known constraints, and should be read as a prediction of what would happen, not a result. An earlier draft of this note put ARC and MMLU at 40–60%. That was wrong, for the reason in the next paragraph.

Jev is a System One model: it decides over state you supply, it does not store facts. That single property sets the ceiling. A benchmark whose answer is not present in the prompt gives it nothing to decide between, so the result is chance — not "somewhat below a real LLM", but chance. Assuming otherwise was the mistake in the earlier draft.

From there the picture is structural. Public LLM benchmarks split cleanly into two groups, and neither group measures ChatJEVs:

Expect every bar below to end on its own dashed chance tick. That gap is exactly why the internal benchmark exists: it is the only instrument that isolates what the architecture contributes.

Figure 4 — projected scores against chance. The dashed tick on each bar is random-guess performance for that format; a bar that stops at its tick means no measurable ability. Grey bars are tasks the architecture cannot attempt at all.
BenchmarkFormatChance ProjectedLiftBinding constraint

Cost

A word here is not a token — it is a whole round of the network. Every word costs two to six HTTP requests and between ten and several hundred answered questions. This is the dominant practical constraint on the project and the reason the UI exposes a word cap.

Figure 5 — decision units consulted per word. A fact of each architecture, not a measurement. V5 additionally writes three complete drafts per reply before judging and repairing them.

Limitations

Reproducing

python -m chatjevs serve                  # the app, at 127.0.0.1:8000
python -m chatjevs audit                  # check the benchmark itself
python -m chatjevs bench --arch v2        # fills the charts above
python -m chatjevs compare --archs v0,v1,v2,v3,v4,v5 --limit 2

Benchmark results are written to chatjevs.db on this machine, and Figures 2 and 3 read from it directly. Responses are cached by (model, state, questions), so re-running a benchmark is free.