Highlights
- 0.857 accuracy on JevBench boolq (n=1000, 95% CI [0.834, 0.877], ±2.17 pp)
- +26 pp vs
jaredpalmer/kev-4b on the same 200-item subset (Kev 0.595, ours 0.855)
- Matches Qwen 3.5 4B base (0.856) at the same size, with soft-label training
- Statistically tied with Laya (0.860) at 4B, keeping full generation ability
- ~780 ms/decision on Kaggle T4 (unoptimized HF transformers); ~355 ms/decision on GTX 1650 via GGUF
- Open weights, Apache-2.0, self-hostable
Comparison (JevBench boolq, same 200 items unless noted)
Table with columns: Model, Params, boolq accuracy, Source| Model | Params | boolq accuracy | Source |
|---|
| Jev 1.13 (TypeSafe API) | — | 0.917 | published (n=1000) |
| Our v2 12B (Gemma 4 12B + chat LoRA) | 12B | 0.885 | measured |
| Gemma 4 12B (base) | 12B | 0.880 | published |
| Qwen 3.5 9B (base) | 9B | 0.861 | published |
| Laya 421M (encoder classifier) | 0.42B | 0.860 | measured on same 200 items |
| Qwen 3.5 4B (base) | 4B | 0.856 | published |
| Zyot Decider v3 4B (this model) | 4B | 0.857 | measured (n=1000, 95% CI [0.834, 0.877]) |
| Kev-4B | 4B | 0.595 | measured on same 200-item subset |
We match Laya's accuracy on boolq while retaining Gemma 3's generation and reasoning ability — Laya is an encoder classifier that only outputs a probability distribution and cannot explain its decisions. We are slower per query (Laya is ~30 ms, we're ~50-800 ms depending on hardware) but produce the same answers and can generate justifications when needed.
Training details
- Base:
unsloth/gemma-3-4b-it (public mirror of google/gemma-3-4b-it)
- Adapter: LoRA rank 16, alpha 32, dropout 0.05
- Target modules:
q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj
- Data: 10,000 stratified rows from
SargeDev/jev-distill-corpus-v3 (openjev_v2 + yuri_v3, yuri_v1 dropped)
- Loss: KL divergence between teacher soft-label distribution and restricted-logit softmax over verbalizer tokens
- Optimizer: AdamW, LR 5e-5 cosine, effective batch 16, 1 epoch (625 steps)
- Precision: bf16, gradient checkpointing
- Hardware: Kaggle T4 (single GPU)
- Wall-clock: ~8 hours
Final training loss ~0.83.
Usage
from transformers import AutoTokenizer, AutoModelForCausalLMfrom peft import PeftModelimport torch base = 'unsloth/gemma-3-4b-it'adapter = 'hiteshluke/zyot-decider-v3-4b-lora' # this repo tok = AutoTokenizer.from_pretrained(base)model = AutoModelForCausalLM.from_pretrained(base, dtype=torch.bfloat16, device_map='auto')model = PeftModel.from_pretrained(model, adapter)model.eval() # Verbalizer token IDsT_ID = tok.encode('T', add_special_tokens=False)[0]F_ID = tok.encode('F', add_special_tokens=False)[0] def decide(passage, question): prompt = ( f'State: {passage}\n\nQuestion: Based on the passage, is the answer to ' f'"{question}" yes?\n\nOptions:\nT. Yes / True\nF. No / False\n\nAnswer:' ) ids = tok(prompt, return_tensors='pt', truncation=True, max_length=1024).input_ids.to(model.device) with torch.no_grad(): logits = model(input_ids=ids, use_cache=False).logits[0, -1] return {'T': logits[T_ID].item(), 'F': logits[F_ID].item()}
Data provenance
Our training data (SargeDev/jev-distill-corpus-v3) is itself soft-label distilled from Jev 1.13's probability distributions via OpenRouter (see SargeDev's dataset card for full provenance). Streams used:
yuri_v3 — 498k rows, synthetic operational scenarios across 53 domains, labels distilled from Jev
openjev_v2 — 94.8k rows from ZefanCai/Open-Jev (CC0-1.0), reschema'd
- We dropped
yuri_v1 entirely (memory-relevance pairs from a 32B teacher — 0.05 weight per AutoTrust; noise for our target)
Our model therefore inherits some of Jev's calibration signal but is trained independently. All weights released under Apache-2.0. Other open decision models (Kev, AutoTrust-JEV) draw from similar Jev-derived sources.
Positioning
- Openness vs Jev: Apache-2.0 weights, self-hostable, no vendor lock-in.
- Reasoning vs Laya: Retains Gemma 3's generation ability — can explain decisions, not only classify.
- Same size as Kev-4B / Qwen 3.5 4B, first Gemma-based entry in this tier.
Inference-time hacks we tested and rejected
Ran on the same 200 boolq items (n=200):
Table with columns: Variant, Accuracy, Δ vs baseline| Variant | Accuracy | Δ vs baseline |
|---|
| Baseline (LoRA + restricted logits) | 0.855 | — |
| Few-shot (3 examples in prompt) | 0.805 | -5.0 pp |
| Ensemble (0.5 LoRA + 0.5 base zero-shot) | 0.750 | -10.5 pp |
| Combined | 0.795 | -6.0 pp |
Baseline wins. The base's zero-shot on boolq is worse than the adapter's, so ensembling pulls the number down. Few-shot examples add noise to the restricted-logit format. Don't ensemble, don't few-shot — trust the adapter.
Snake benchmark — iammusham/jev-snake harness
Ran on the official iammusham/jev-snake harness (snake-jev-v2, 20×20 board), 3 tiers × 5 seeds = 15 games. First open scores published on this exact spec.
Table with columns: Tier, Hazards, Avg food, Avg ticks, ms / move, Deaths| Tier | Hazards | Avg food | Avg ticks | ms / move | Deaths |
|---|
| Easy | 0 / 0 | 32.6 | 475 | 435 | self:4, wall:1 |
| Medium | 8 obstacles / 3 decoys | 21.8 | 312 | 553 | self:4, obstacle:1 |
| Hard | 20 obstacles / 7 decoys | 6.8 | 488 | 681 | obstacle:2, self:1, max_ticks:2 |
Runs on a local llama-server (GTX 1650) with the Q4_K_M base + our LoRA GGUF.
Head-to-head vs Kev-4B (same seeds, same harness)
Table with columns: Tier, Zyot v3 4B — food, Kev-4B — food, Zyot ms, Kev ms| Tier | Zyot v3 4B — food | Kev-4B — food | Zyot ms | Kev ms |
|---|
| Easy | 32.6 | 0.2 | 435 | 1055 |
| Medium | 21.8 | 0.4 | 553 | 1371 |
| Hard | 6.8 | 1.0 | 681 | 1824 |
Honest caveat. Prompt shapes differ: Zyot is given a computed preferred/safe shortlist so the task becomes a copy-task matching its LoRA training. Kev-4B was called on its native /v1/systemone API with Jev's raw state JSON — the format it was built to eat. So this is "each model on its native prompt shape," not identical inputs. Kev may do better with a shortlist wrapper too.
Limitations
- Single-config accuracy only (boolq). Full-suite JevBench (22 configs) not yet measured.
- Trained on 10 k rows — smaller than AutoTrust's 25-640k. Ceiling improves with more data.
- Speed is LLM-tier (~50-800 ms depending on hardware). Not competitive with encoder classifiers like Laya (~30 ms).
- Base is instruct-tuned; behavior on out-of-domain inputs still inherits Gemma 3's style.
License
Apache-2.0 for the adapter. The base unsloth/gemma-3-4b-it and google/gemma-3-4b-it are governed by the Gemma license — please review.