6/6 · 6/6
one question at a time: both models correct
9/18 vs 17/18
same questions bundled: MoE vs dense
0/3 vs 2/3
fully correct bundled runs
≈2.1×
decode speed, yet similar wall-clock time
Why we ran this test
We run local models inside coding-agent setups, where the model reads files with read-only tools and answers questions about a codebase. The usual way to check such a model is to ask one question and see whether the answer is right. We wanted to know whether that check is enough.
We found the gap by accident. A loop let the agent process swallow its standard input, so questions 2 to 6 reached the model as one large prompt instead of five separate ones. The results looked different enough that we turned the bundled condition into a formal test.
This post reports that test. It is a small observation about how to test, not a ranking of models.
A one-question test would never have shown the gap.
The setup
Everything ran on one machine, one model at a time.
- Machine
- One Apple Silicon Mac: M1 Max, 64 GB
- Runtime at the time
- Ollama 0.32.14, one model loaded at a time
- Model A
- A mixture-of-experts (MoE) model, 35B-A3B, about 3B active parameters (Qwen3.5 family), Q4_K_M
- Model B
- A dense 27B model (Qwen3.8 family), Q4_K_M
- Task
- Answer questions by reading our own codebase with read-only tools (read, grep, find, ls), through the same agent harness we use day to day
- Scoring
- Exact match against a human-verified answer key
Task
A question with an exact answer a person has verified
Agent harness
The same one we use day to day; read-only tools: read, grep, find, ls
Local model
MoE or dense, one loaded at a time
Scoring
A script checks exact match against the human-verified key
A mixture-of-experts model uses only part of its parameters for each token (about 3B here); a dense model uses all of them. We do not publish file names, setting names or code from the codebase, so the tasks are described in general terms.
What we asked
Six questions, each with an exact answer that a person had verified.
- 1List 15 settings that share one prefix.
- 2Follow a chain of three causes and name a check id, the function behind it and a constant.
- 3Give the exact value taken by one branch.
- 4Reason about what an “any element matches” test returns on an empty list.
- 5Give the line numbers where a string appears, leaving out comments.
- 6Count how many times one expression occurs.
Result 1: one question per run
First we asked the six questions one per run. Both models answered all six correctly.
The MoE model needed 137.3 seconds in total and the dense model 417.4 seconds, so the dense model was 3.0x slower. On quality, though, the test showed no difference at all.
Time per question, one question per run
Seconds for each of the six questions. Both models answered all six correctly; the dense model took longer on every question.
- Q117.543.9
- Q221.0135.3
- Q329.2121.0
- Q448.167.6
- Q515.731.5
- Q65.818.1
- Total · MoE
- 137.3 s
- Total · Dense
- 417.4 s
View data as table
| Question | MoE | Dense |
|---|---|---|
| Question 1 | 17.5 | 43.9 |
| Question 2 | 21.0 | 135.3 |
| Question 3 | 29.2 | 121.0 |
| Question 4 | 48.1 | 67.6 |
| Question 5 | 15.7 | 31.5 |
| Question 6 | 5.8 | 18.1 |
| Total | 137.3 | 417.4 |
| Correct | 6/6 | 6/6 |
If we had stopped here, we would have concluded that the two models are equally reliable for this work.
Result 2: bundled in one context
Then we put the same six questions into one context and ran that bundle three times per model: 18 sub-answers per model.
The gap that one-question tests hid shows up immediately.
Bundled context: every sub-answer, run by run
Three runs per model, six sub-answers per run. A tick is an exact match; a cross is wrong; the hatched row is a run that produced no output at all.
MoE
Dense
View data as table
| Run | MoE | Dense |
|---|---|---|
| Run 1 | 0/6 · 187.7 s Empty output | 6/6 · 375.5 s All correct |
| Run 2 | 4/6 · 168.9 s One item dropped, one wrong yes/no | 5/6 · 346.8 s All 15 items right, plus 2 invented names (17 items) |
| Run 3 | 5/6 · 155.5 s An expression and a local variable instead of a function name and a constant name | 6/6 · 364.4 s All correct |
| Total | 9/18 (50%) | 17/18 (94%) |
Bundled condition at a glance
Correct sub-answers out of 18, fully correct runs out of 3, and mean time per bundled run.
Correct sub-answers
Fully correct runs
Mean time per run
View data as table
| Measure | MoE | Dense |
|---|---|---|
| Correct sub-answers | 9/18 (50%) | 17/18 (94%) |
| Fully correct runs | 0/3 | 2/3 |
| Mean time per run | 170.7 s | 362.2 s |
MoE: 9 of 18 (50%), no fully correct run (0 of 3), mean time 170.7 s. Dense: 17 of 18 (94%), fully correct runs 2 of 3, mean time 362.2 s, which is 2.12x slower than the MoE model.
In the MoE model's run 1, the process exited silently after 187.7 seconds: zero bytes on standard output and standard error.
How the two models failed
A count of correct answers does not show how a run goes wrong, so we also recorded the failure modes.
What went wrong, by type
Failure modes counted in sub-answers (one question in one run). The MoE model's silent run alone accounts for six.
View data as table
| Failure mode | MoE | Dense |
|---|---|---|
| Silent empty output | 6 | 0 |
| Dropped item | 1 | 0 |
| Wrong yes/no | 1 | 0 |
| Shallow reasoning | 1 | 0 |
| Fabricated items | 0 | 1 |
MoE model, under load
- Silent empty output: in run 1 the process exited with nothing on standard output or standard error.
- Dropped items: one of the 15 list items was missing, and one yes/no answer was wrong.
- Shallow reasoning: it stopped at a surface level and did not follow the call chain to the real function and constant.
Dense model
- Fabrication: all 15 real items plus 2 names that do not exist.
For a role that delegates judgement, we consider a silent empty run the more harmful failure.
Decode speed versus wall-clock
Speed claims usually quote decode speed: how many tokens per second the model writes. A real agent run also has prefill, the model reading everything it is given, here the files the agent opens. We measured both on the dense model, with the same prompt, warm, thinking off.
Decode speed versus wall-clock time (dense model, two engines)
Three runs each. The MLX engine decoded faster, but the bundled run took about the same time.
Decode speed, tok/s (longer bar = faster)
Dense, Q4_K_M (GGUF)
9.2 / 8.7 / 7.2 tok/s
Dense, MLX (nvfp4)
18.3 / 18.2 / 17.2 tok/s
≈2.1× faster decode (MLX vs GGUF)
Wall-clock time, seconds (shorter bar = faster)
Dense, Q4_K_M (GGUF)
529.4 / 468.0 / 447.8 s · Mean 481.7
Dense, MLX (nvfp4)
639.8 / 338.5 / 498.3 s · Mean 492.2
Wall-clock: no meaningful difference
Why: most of a real agent run is prefill, the model reading the files it is given, which decode speed does not measure.
View data as table
| Variant | Run 1 | Run 2 | Run 3 | Mean |
|---|---|---|---|---|
| MoE, Q4_K_M · tok/s | 39.9 | 40.0 | 40.0 | — |
| Dense, Q4_K_M (GGUF) · tok/s | 9.2 | 8.7 | 7.2 | — |
| Dense, Q4_K_M (GGUF) · s | 529.4 | 468.0 | 447.8 | 481.7 |
| Dense, MLX (nvfp4) · tok/s | 18.3 | 18.2 | 17.2 | — |
| Dense, MLX (nvfp4) · s | 639.8 | 338.5 | 498.3 | 492.2 |
The MLX engine decoded about 2.1x faster than GGUF. On the bundled six-question run, though, wall-clock time was about the same: a mean of 481.7 s for GGUF and 492.2 s for MLX, with no meaningful difference. Most of the time in a real agent run goes to prefill (reading files), not to decode.
Both variants answered correctly on the questions not affected by a later code edit (see the limits below).
The speed ratio between the MoE and dense models also depends on the prompt: 4.8x in this test (40.0 versus 8.4 tok/s) and 7x in an earlier one. Please do not quote 7x as a general number.
What we do now
- Test agents with the load shape they will really face: long, bundled context, not only one question at a time.
- Record failure modes, not only a score: silent empty output, dropped items, shallow reasoning, fabrication.
- Treat decode tokens per second as a poor proxy for task time when prefill dominates.
- Score with a script against a human-verified key, and keep the raw logs.
- State the setup and the limits. Do not turn n=3 into a leaderboard.
Limits and caveats
- This is a small test: 6 questions x 3 runs x 2 models, one machine, one codebase, n=3 per cell. It is an observation about test design, not a model ranking.
- The software has moved on. The Ollama stack used here has since been replaced in our setup by llama.cpp. Model families are named as tested, and results may differ today. We claim nothing about current versions.
- The speed condition was run after a code edit changed the answer to one question (question 5), so that condition is compared on the other five questions only.
- The hardware is Apple Silicon, not NVIDIA. Do not mix these numbers with numbers from other people's setups.
- Scoring was exact match against a human-verified key. A first visual pass missed one fabrication in the dense model's run 2, and a script corrected it: always score with a script.
Try it on your own agents
You do not need our code to apply the same idea.
- Write tasks that have an exact answer a person has verified, so a script can score them.
- Run each task alone, then bundle them into one long context the way your real runs look.
- Repeat each condition several times and keep the per-run results.
- Record the failure type for every wrong run: empty output, dropped item, shallow reasoning, fabrication.
- Measure real wall-clock time, and measure decode speed separately.
- Score with a script and keep the raw logs.
- Write down the setup and the limits next to the results.
The raw records
run log (verbatim)
[qwen3.5:35b-a3b] C1 done 187.7s[qwen3.5:35b-a3b] C2 done 168.9s[qwen3.5:35b-a3b] C3 done 155.5s[qwen3.8:27b] C1 done 375.5s[qwen3.8:27b] C2 done 346.8s[qwen3.8:27b] C3 done 364.4s| Model | Run | Output (bytes) | Size bar | Seconds |
|---|---|---|---|---|
| MoE | Run 1 | 0 ⚠ | 187.7 | |
| MoE | Run 2 | 475 | 168.9 | |
| MoE | Run 3 | 488 | 155.5 | |
| Dense | Run 1 | 495 | 375.5 | |
| Dense | Run 2 | 533 | 346.8 | |
| Dense | Run 3 | 495 | 364.4 |
| Question | MoE Run 1 | MoE Run 2 | MoE Run 3 | Dense Run 1 | Dense Run 2 | Dense Run 3 |
|---|---|---|---|---|---|---|
| Question 1 | No output | Wrong | Correct | Correct | Wrong | Correct |
| Question 2 | No output | Correct | Wrong | Correct | Correct | Correct |
| Question 3 | No output | Correct | Correct | Correct | Correct | Correct |
| Question 4 | No output | Wrong | Correct | Correct | Correct | Correct |
| Question 5 | No output | Correct | Correct | Correct | Correct | Correct |
| Question 6 | No output | Correct | Correct | Correct | Correct | Correct |
Glossary
- MoE (mixture of experts)
- A model that uses only part of its parameters for each token.
- Dense model
- A model that uses all of its parameters for each token.
- Prefill
- The stage where the model reads everything it is given, such as the files an agent opens.
- Decode
- The stage where the model writes its answer, token by token.
- tok/s
- Tokens per second: how fast decode runs.
- Wall-clock time
- The real time from start to finish of a run, prefill and decode together.
- Exact match
- A sub-answer counts only if it equals the human-verified key exactly.
Data & methods
Download the data
The records behind this article, as plain files. Each CSV starts with a short README header.
# Source: our own run logs, measured August 17, 2026 on Apple M1 Max 64 GB with Ollama 0.32.14. Scored by script. The correct answers are not published. Licence: not yet specified.
- Bundled runs: score, seconds, output size
bundled-runs.csvDownload: bundled-runs.csv - Bundled runs: every sub-answer
bundled-per-question.csvDownload: bundled-per-question.csv - One question per run: seconds
one-question-seconds.csvDownload: one-question-seconds.csv - Decode speed and wall-clock time
speed-variants.csvDownload: speed-variants.csv - Verbatim run log
run-log.txtDownload: run-log.txt - Everything above as one JSON file
local-llm-bundled-context.jsonDownload: local-llm-bundled-context.json
References
- Run logs and answer key. Our own run logs, re-scored by exact match against a human-verified key. Kept by the team; the key is not published.
- The data files above. Every number in this article is in them.
