johnjmartin97/qwen3-4b-ygo-meta-v3
Qwen3-4B YGO Meta
Qwen3-4B-Instruct-2507 fine-tuned (LoRA via MLX, fused + dequantized to fp16) to produce legal, tournament-plausible Yu-Gi-Oh! TCG decklists for the current format (TCG banlist 2026-05-18), and to decline archetypes with no top-cut presence. Trained on 2,235 examples built from 837 top-cut tournament decklists plus 150 refusal hard negatives (including plausible-fake archetype names).
The repo root is v6, the model that meets the full behavior spec. It is deliberately pinned there: v6 is the checkpoint handed to an adversarial exchange partner, and revision 3c906c79b9621812dc0107ffaff852b60b5b30fb must keep resolving to exactly what they attacked. The earlier MVP model (v3) remains at revision f9173d8085c68410f9b04d18a296896a17967292.
Which weights to load
adapter-v7/ and adapter-v8/ are LoRA adapters over the 4-bit base mlx-community/Qwen3-4B-Instruct-2507-4bit, not fused models:
mlx_lm.generate --model mlx-community/Qwen3-4B-Instruct-2507-4bit \
--adapter-path adapter-v7 --prompt "..."Results (58-scenario eval, zero-shot)
The adversarial exchange round, and an honest caveat
A partner attacked v6 as a black box and returned 53 confirmed breaks. All 53 were re-scored with my own legality checker and all 53 confirmed. Two repair datasets followed, with training configuration held identical to v6 — only the data changed.
v7 reduced the break count 49 → 42. v8 did not reduce it (49), but is the better builder by every other measure.
Both v7 and v8 lost the ability to decline — refusal pass 0.87 → 0.00. Teaching the model to hold its output contract under attack taught it to always produce output. A sweep of v8's checkpoints (published here) shows declining is already gone by iteration 400, so this is what the data composition teaches, not a training-length artifact.
So there is no single best model: v6 is the only one that meets the full spec, v8 is the best deck builder, and v7 is the only one that reduces the adversary's break count. Pick by what you need.
Remaining failures are dominated by deck-size arithmetic (43 of v8's 49 breaks, mostly off by one or two). Three successive datasets changed which failures occurred and never the total.
Reproduce
git clone ssh://git@labs.gauntletai.com:22022/johnmartin/yu-gi-oh_slm.git
cd yu-gi-oh_slm
python3 eval/eval.py --model johnjmartin97/qwen3-4b-ygo-meta-v3 --eval-set eval/scenarios.jsonl
python3 eval/adversarial_eval.py --score-captured # re-score the partner's 53 breaksFull write-ups: docs/FINAL.md and docs/EXCHANGE.md in that repo.
