Status:
retained_consumer_gpu_strict_parallel_parityon 2026-03-29 for the strict same-turn Hermes parallel-tool row across reachable local backends.
This document records the retained strict same-turn parallel-tool matrix after the native Psionic contract fix.
The earlier matrix was useful because it proved the remaining red row was not honestly reducible to "Hermes asked wrong" or "local qwen35 can never do this." The latest matrix moves beyond that boundary:
- on the same
archlinuxRTX 4080host, Psionic and Ollama now both pass the strict same-turn two-tool row on2b,4b, and9b - the current aggregate attribution is now
strict_parallel_tool_turn_solved_on_all_reachable_rows - the repo now retains a real native Psionic same-turn parallel receipt rather than only a serialized workaround
- aggregate:
fixtures/qwen35/hermes/hermes_qwen35_parallel_tool_attribution_matrix_20260329_archlinux.json - Psionic
2brow:fixtures/qwen35/hermes/parallel_matrix_rows/hermes_psionic_parallel_tool_2b_archlinux.json - Ollama
2brow:fixtures/qwen35/hermes/parallel_matrix_rows/hermes_ollama_parallel_tool_2b_archlinux.json - Psionic
4brow:fixtures/qwen35/hermes/parallel_matrix_rows/hermes_psionic_parallel_tool_4b_archlinux.json - Ollama
4brow:fixtures/qwen35/hermes/parallel_matrix_rows/hermes_ollama_parallel_tool_4b_archlinux.json - Psionic
9brow:fixtures/qwen35/hermes/parallel_matrix_rows/hermes_psionic_parallel_tool_9b_archlinux.json - Ollama
9brow:fixtures/qwen35/hermes/parallel_matrix_rows/hermes_ollama_parallel_tool_9b_archlinux.json
Every retained row above keeps the following fixed:
- same host:
archlinux - same Hermes revision:
e295a2215acd55f2ee930fc7a4cd2df1c5464234 - same strict task:
emit exactly one assistant tool-call turn containing
get_paris_weatherthenget_tokyo_weather - same tool schemas and handlers
temperature = 0seed = 0- same
required_then_autotool policy
What changes between rows:
- backend
- backend-specific model/artifact
| Model | Psionic | Ollama | Honest Verdict |
|---|---|---|---|
2b |
pass |
pass |
passes on both backends |
4b |
pass |
pass |
passes on both backends |
9b |
pass |
pass |
passes on both backends |
Per-row retained assistant tool order is now the same everywhere:
get_paris_weatherget_tokyo_weather
The winning change was not a benchmark wrapper trick. It was a tighter native Psionic same-turn tool contract:
- required tool batches now prefer a plain JSON-schema batch at the output boundary
- the runtime now accepts both the plain JSON batch and the older tagged structure during replay
- required parallel turns now carry a concrete
minimum_required_tool_callsfloor - that floor is inferred from backticked declared tool-name mentions in the
request messages when
tool_choice = requiredandparallel_tool_calls = true
That last part mattered. The older contract let the model legally stop after one tool call even when the strict Hermes task clearly named both tools in the same turn.
The older failing matrix remains useful historical evidence because it narrowed the search space:
- Hermes was already sending both declared tools
- Ollama could already complete the strict two-tool row on the same host
- so the remaining gap was small enough to keep attacking locally on one consumer GPU instead of escalating immediately to bigger hardware
That local diagnosis turned out to be correct. The current retained matrix is the closeout proof.
The strict same-turn Hermes parallel-tool row is now green on the reachable consumer-GPU lanes:
- native Psionic
2b - native Psionic
4b - native Psionic
9b - Ollama
2b - Ollama
4b - Ollama
9b
This closes the old local parallel parity blocker. Remaining Hermes work is now about benchmark behavior, comparator availability, and broader product readiness, not this same-turn tool row.