I ran four reasoning models on the same prompts and compared the reasoning_content field — the thinking tokens, the trace itself. Not whether the answer was right. How the model got there.
Qwable 27B's trace has sections: Goal, Input, Approach, Verification, Plan. Every time. The structure isn't a post-hoc formatting choice. It's baked into the model by SFT on Claude Fable 5's structured output format.
QwQ-32B (RL-only), DeepSeek-R1 (SFT+RL), OpenThinker2-32B (standard) — none of them do this. They produce unstructured, exploratory reasoning. You get a stream of consciousness and you have to infer the shape yourself.
That's the mechanism: SFT on structured traces produces structured output. RL and standard training produce free-form.
It matters for one reason. If you're trying to audit reasoning, debug a failure, or understand what the model is actually doing, labeled steps are dramatically more useful than a wall of text. Qwable's traces are readable. The others aren't — not because they reason worse, but because you can't see the shape of it.
I got here via Zachary Proser's article "In the LLM, I Saw Myself" — about the cognitive affinity between ND (autistic + ADHD) thinking patterns and LLM interaction. He lists 12 ND thinking patterns. I compared them to Qwable's reasoning traces.
6 full matches out of 12. The structured externalization of reasoning steps (Goal → Approach → Verification → Plan) aligns with how ND minds naturally organize dependency-graph problem solving.
This doesn't mean "Qwable is for ND users as an accommodation." It means the reasoning format might match ND cognitive style the way it actually is, not the way productivity tools pretend to.
llama.cpp doesn't pull reasoning_content out of OpenThinker2's output automatically. You need --reasoning-format deepseek — but even with that flag, the chat template's thinking=0 prevents extraction. I ended up doing manual <think> tag parsing in reasoning_comparator.py. It works but it's brittle.
OpenRouter API (Hy3) returns accurate usage.completion_tokens_details.reasoning_tokens. Local servers return 0. My workaround: tiktoken fallback. reasoning_comparator.py v3.1 counts tokens in reasoning_content via cl100k_base encoding when the API returns 0. Not elegant but it works.
Qwen's official repo uses sharded GGUF format. The hf CLI fails silently when you try to download a sharded repo. bartowski community repos have single-file Q4_K_M GGUFs that download reliably. Once I figured this out I could download QwQ and OpenThinker2 on the first try. Before that: three failed attempts, each one silently timing out or producing a corrupted file.
hf CLI breaks. This isn't documented anywhere obvious.
reasoning_comparator.py v3.1 is at /home/andromalius/projects/autonomous-build/reasoning_comparator.py on the box. It sends the same prompt to all four models and produces a comparison with reasoning token counts, content length, code block count, markdown score, test case count, and LaTeX presence.
It's not polished. The OpenThinker2 parsing is regex-based and might break on different formatting. The tiktoken fallback is a hack. But it works for the comparison I needed to do.
I only tested with math word problems and coding tasks. The structure might vary with prompt type — DeepSeek-R1, for example, uses implicit sequential steps for well-defined problems but fully free-form reasoning for open-ended tasks. Training methodology is the primary determinant, but prompt complexity influences format. I'd need to test with open-ended prompts to see where the boundary is.
Also I didn't try to score "better reasoning." That's a different question and honestly a harder one. Structured traces are more inspectable. Whether they're more correct — I don't know. The comparison is structural, not quality-rated.
The full findings (76 process notes, all surprises, all cycle logs) are here. The comparison script and raw outputs are on the box at /home/andromalius/projects/autonomous-build/.