Model card: nev-0.8b

nev-0.8b is a decision model. It takes one document (the state) and a set of typed questions, and returns a probability distribution for each question in one forward pass. It does not generate text.

It is a LoRA adapter plus a small pointer head on top of Qwen/Qwen3.5-0.8B-Base. It uses the same recipe, data pipeline, and serving contract as kev β€” the laptop-scale reconstruction of the architecture Archer Hume inferred for TypeSafe's Jev in Jev's Architecture Unmasked. nev is kev on a newer, larger backbone: same mechanism, newer base.

nev is the mirror of kev β€” the name is kev reversed.

This checkpoint is a research prototype trained on a single desktop GPU. The headline result is that doubling the backbone did not move aggregate accuracy β€” see Evaluation. It is not a production model and it is not Jev.

Model details

Model type Causal transformer, prefill-only, block-causal branch mask, pointer readout
Base model Qwen/Qwen3.5-0.8B-Base (frozen)
Adapter LoRA rank 16, alpha 32, dropout 0.05, on q_proj k_proj v_proj o_proj gate_proj up_proj down_proj
Head Two linear maps (query from <decide>, key from each </opt>), scaled dot product, softmax over options
Trainable parameters 6.9M, ~0.9% of the backbone
Precision bf16 (training and serving; CUDA)
Context used in training ≀ 640 state tokens, ≀ 1,024 tokens per question branch
Question types noul (yes/no), choice (2–255 options), score (2–255 ordered levels)
Language English
License Apache-2.0 for the adapter and head. The base model is under the Qwen license. Datasets carry their own licenses.
Version nev-0.8b v0.1, trained 2026-09-20

Differences from kev-0.5b

kev-0.5b nev-0.8b
Base Qwen/Qwen2.5-0.5B Qwen/Qwen3.5-0.8B-Base
Architecture dense attention hybrid (gated-delta-rule layers)
MAX_STATE 384 640
Batch / accumulation 1 / 8 4 / 4
Trainable params 9.3M 6.9M
Device Apple M5 (MPS, fp32) RTX 5070 Ti (CUDA, bf16)
Wall clock ~1h45m ~1h37m

The 0.8B backbone uses causal_conv1d and flash-linear-attention kernels for its gated-delta-rule layers. Both were compiled/installed for this run; without them the same training takes roughly 1.8Γ— longer.

Intended use

Intended. Research on decision models: calibration of direct probability readouts, shared-state / isolated-question attention, option-order sensitivity, and API-level compatibility with TypeSafe's System One contract. Local demos and teaching.

Not intended. Any production decision that affects people: moderation, fraud, credit, hiring, medical or legal routing. The model's calibration is only verified on the training distributions, and its outputs on unfamiliar tasks have not been measured.

How the model is used

Input is one packed token sequence:

<state> …state…  <q> instr <opt> o1 </opt> <opt> o2 </opt> … <decide>  <q> … <decide>  …
  • The attention mask lets a question token see the state and its own branch only. Questions cannot see each other.
  • Each branch restarts position ids after the state.
  • For each question, the head scores every </opt> hidden state against the <decide> hidden state and applies softmax.
  • Application code turns the distributions into the API answer: choice/confidence for Choice, p(yes) for Noul, expected level for Score.

Reserved tokens are existing Qwen special tokens; user text is sanitized so it cannot produce them.

Serve with python -m kev.serve --run runs/kev-08-35-v2 and call POST /v1/systemone.

Training data

Identical pipeline to kev-0.5b: six public datasets converted to TypeSafe-shaped requests and rendered with the same code path used at serving time (api.to_record()). 1,500 records per source from the standard train splits, giving 9,000 records and 13,500 questions (4,500 Choice, 6,000 Noul, 3,000 Score).

source split converted to
Banking77 train Choice, K = 77
BoolQ train Noul
AG News train Choice K = 4 + 2 Noul
MNLI train Choice K = 3
SST-5 train Score, 5 levels
Yelp Review Full train Score 5 levels + Noul

Augmentation: option order shuffled; p = 0.10 true option replaced by other: None of the above; p = 0.15 irrelevant distractor added. No LLM-generated data.

Training procedure

Objective Cross-entropy over options, averaged over questions in a record
Optimizer AdamW, lr 2e-4, OneCycle schedule (10% warm-up)
Batch 4 records per forward, gradient accumulation 4
Epochs 2 (1,126 optimizer steps)
Records seen 18,000 / 18,000 (0 truncated, 0 rejected)
Forward tokens 4,180,331
Hardware RTX 5070 Ti 16 GB, CUDA, bf16, torch 2.8.0+cu128, transformers 5.17.0
Wall clock 5,848 s (~1h37m, ~0.32 s per record)
Peak device memory 13.0 GB
Seed 0
Final training loss ~0.37

Reproduce:

python -m kev.train --base Qwen/Qwen3.5-0.8B-Base --n_per_source 1500 --epochs 2 \
  --lr 2e-4 --lora 16 --accum 4 --batch 4 --dtype bf16 --device cuda \
  --p_none 0.1 --p_none_distract 0.12 --p_distract 0.15 --checkpointing 0 --seed 0 \
  --out runs/kev-08-35-v2

Note: kev/train.py refuses to start if --out already exists.

Evaluation

Held-out test / validation splits of the same six sources, 150 records per source, seed 1. Full results in eval.json. One BoolQ record was skipped (state 1,263 tokens > MAX_STATE 640; the training set max is 586, so the model never saw that length). The skipped count is recorded in eval.json as skipped_over_max_state.

Accuracy and calibration

source nev-0.8b kev-0.5b Ξ” acc
acc / ECE acc / ECE
banking77 0.787 / 0.100 0.860 / 0.057 βˆ’0.073
agnews 0.860 / 0.077 0.940 / 0.028 βˆ’0.080
agnews yes/no 0.930 / 0.036 0.960 / 0.017 βˆ’0.030
boolq 0.812 / 0.137 0.753 / 0.136 +0.059
mnli 0.847 / 0.089 0.747 / 0.100 +0.100
sst5 0.560 / 0.129 0.533 / 0.121 +0.027
yelp 0.560 / 0.155 0.553 / 0.118 +0.007
yelp yes/no 0.913 / 0.058 0.887 / 0.084 +0.027
all 0.800 / 0.073 0.799 / 0.065 +0.001

The headline is a tie. Aggregate accuracy moved 0.1 percentage points. The gains are concentrated in reading-comprehension tasks (MNLI +10.0, BoolQ +5.9) and are offset almost entirely by losses on classification tasks (Banking77 βˆ’7.3, AG News βˆ’8.0). Doubling the backbone did not buy accuracy on this benchmark.

Zero-shot reference, same rendered text, untrained Qwen/Qwen3.5-0.8B-Base: agnews 0.680, agnews_yn 0.673, sst5 0.253, mnli 0.387, yelp 0.320, yelp_yn 0.553, boolq 0.727. Training clearly moves the model off the untrained baseline (e.g. SST-5 0.253 β†’ 0.560), so the tie is not a training failure β€” it is a backbone result.

Temperature scaling

Fit on even-indexed records, tested on odd-indexed: T = 1.51. Held-out NLL 0.537 β†’ 0.501, ECE 0.065 β†’ 0.038. Mildly over-confident before scaling, slightly worse calibrated than kev-0.5b (0.031 after scaling).

Mechanism tests

test nev-0.8b kev-0.5b
Permutation, argmax flip rate 0.028 0.074
Permutation, mean / p90 probability spread 0.045 / 0.123 0.065 / 0.249
IIA, mean |Ξ” log-odds| 0.048 (p90 0.097) 0.13 (p90 0.34)
Isolation, p(correct) in sibling / absent / state 0.168 / 0.048 / 0.966 0.030 / 0.030 / 0.990
Packed vs separate, mean abs prob diff 0.008 (max 0.108) 2.2e-7 (max 3.7e-6)
Packing speedup 2.49Γ— 2.0Γ—

Order sensitivity is the one clear win. Argmax flips under option reordering drop from 7.4% to 2.8%, and the p90 probability spread halves (0.249 β†’ 0.123). For a decision model where a threshold near a boundary can change the action, this is the most consequential improvement here β€” larger in practical terms than the accuracy tie suggests.

IIA also improves (0.13 β†’ 0.048), i.e. adding an irrelevant option perturbs the top-2 log-odds less.

Isolation regresses. Reading an answer planted in a sibling question rose from 0.030 to 0.168. The block-causal mask still prevents cross-question attention architecturally, but this checkpoint is roughly 5x more willing to echo a sibling's answer into the wrong branch. Isolation is a safety property, so this is a real cost of the larger backbone, not a rounding difference.

The packed-vs-separate difference is larger than kev-0.5b (0.008 vs 3.7e-6) β€” packing is faster (2.49Γ—) but not numerically identical, so treat packed and separate scoring as slightly different measurements.

Limitations

  • In-distribution only. All numbers above are on held-out splits of the training datasets. Out-of-source generalization has not been measured for this checkpoint.
  • No accuracy gain over the smaller model. The 0.8B backbone costs ~2Γ— the parameters and does not improve aggregate accuracy. Use kev-0.5b unless order stability matters for your application.
  • Classification regressions. Banking77 (βˆ’7.3) and AG News (βˆ’8.0) are meaningful drops. The training mixture weights all six sources equally (1,500 each); Banking77 with K = 77 is plausibly under-weighted for a larger backbone.
  • Calibration is slightly worse. ECE 0.073 raw / 0.038 scaled, vs 0.065 / 0.031 for kev-0.5b.
  • Question isolation is weaker. Sibling-question leakage 0.030 to 0.168.
  • Narrow task coverage. Six datasets, ~ten instruction templates. Code, tables, multi-turn chat, arithmetic, and multi-step conditions are untrained.
  • Score confidence is a stand-in. 1 βˆ’ E|level βˆ’ mode| / (L βˆ’ 1); TypeSafe's formula is unpublished.
  • Calibration is not a guarantee. ECE 0.038 after temperature scaling on these sources says nothing about calibration on a new workflow.
  • Inherited limitations from Qwen3.5-0.8B and from the datasets, including their label noise, demographic skews, and English-only coverage.

Bias, risks and recommendations

Same as kev-0.5b: this is a research prototype, its calibration is verified only in-distribution, and it should not be used to make consequential decisions about people. As with any adapter on a frozen backbone, outputs on distributions the base model handles poorly will be poor.

The question-isolation property was verified (p = 0.966 when the answer is in the state). Other prompt-injection routes through the state text have not been studied.

Environmental impact

One training run: 5,848 s on a single RTX 5070 Ti at roughly 250–300 W, i.e. about 0.45 kWh. Evaluation and smoke runs add a similar amount.

Citation

@software{kev2026,
  title  = {kev: a laptop-scale reconstruction of a Jev-style decision model},
  author = {Palmer, Jared},
  year   = {2026},
  url    = {https://github.com/jaredpalmer/kev}
}

@misc{hume2026jev,
  title  = {Jev's Architecture Unmasked},
  author = {Hume, Archer},
  year   = {2026},
  url    = {https://archerhume.com/posts/jevs-architecture-unmasked}
}

Contact

Open an issue at github.com/jaredpalmer/kev.

Downloads last month
18
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support

Model tree for VictorNanka/nev-0.8b

Adapter
(21)
this model