brianletort.ai
All Posts
Local AIQwenReasoningHarnessRTX 5090M5

Same Weights, Different Product: How the Harness Made Qwen3.8 Useful.

An independent lab investigation. The same open-weight model, served two ways, produced either an empty afternoon or a daily driver. What changed was the harness, not the weights. A newcomer-friendly entry to a four-part series.

Qwen3.8: Same Weights, Different Product / Start HereAugust 17, 202617 min read

TL;DR

  • The API flag that is supposed to disable thinking did not disable it. Left on, the model sat silent for 301.4 seconds and returned nothing. Default behavior is not capability.
  • Same weights, two serving postures. Human-reviewed at a sendable standard, raw local Qwen3.8-27B completed 2 of 8 real workday tasks. Harnessed local Qwen completed 8 of 8. The weights never changed.
  • Against GPT-5.2 on those same eight tasks, harnessed local tied seven and edged one, a tighter executive email. One edge, seven ties. Not eight wins.
  • Timing, measured on two machines I own: a six-word prompt ran 112.3s at default on an Apple laptop, 15.3s once the thinking channel was closed, and 1.2s on a consumer NVIDIA GPU with the same intervention.
  • Judgment: own the substrate for private, high-volume, repeatable work. Rent the frontier for polish and the hardest agent and SWE loops. The model is the substrate. The harness is the product.

The failure that started this

Set the flag that is supposed to turn thinking off. On my laptop, the model went quiet for 301.4 seconds and returned an empty response. No answer, no error, nothing. The flag reads like an off switch. It is not.

That single non-result is the whole investigation in miniature. The weights were fine. The serving posture spent the entire budget before one useful token came out.

So here is the thesis, stated plainly. Default model behavior is not capability. The same weights can produce a five-minute empty stare or a one-second daily driver, depending on how you serve them and what you wrap around them. The model is the substrate. The harness is the product.

This is an independent lab investigation. One operator, two machines I own, one week, every run logged. What follows is the intervention that turned an unusable default into a working local assistant, and the measured evidence behind it.

Raw versus harnessed local Qwen on an eight-task offline workday: 2 of 8 versus 8 of 8
Same weights, two serving postures. Two of eight, then eight of eight. That gap is the entire point.

What the words mean (for readers new to local AI)

Before the numbers, the vocabulary. Skip if you already live here.

  • Qwen is Alibaba’s family of open-weight language models. Open weights means the model file is downloadable and you can run it on hardware you own.
  • 27B refers to roughly twenty-seven billion parameters, the adjustable numbers that hold what the model has learned. Mid-size by 2026 standards. Not tiny, not frontier. This is Qwen3.8-27B, not the far larger Qwen3.8-Max.
  • Quantization is a compression trick. Store each of those billions of numbers at lower precision (four bits instead of sixteen) and the whole model shrinks by roughly four times. A little accuracy is traded for a lot less memory. Q4_K_S is one common flavor. This series ran a Q4_K_S copy on the desk.
  • Reasoning channel and reasoning tokens. Modern models can think out loud inside a private channel before they answer. Those internal steps consume the same completion budget as the visible answer. Let thinking run wild and the answer can arrive empty, because the budget is already spent. That is the 301.4-second failure above.
  • M5 vs RTX 5090. The two hosts here. M5 is a current Apple Silicon laptop class, portable and quiet. RTX 5090 is a consumer NVIDIA card, roughly in the $4K class on its own at street prices, and near $6K once the rest of a disciplined desk is added. Different memory bandwidth, very different feel.
  • Harness. The scaffolding around the raw model. System prompt, output format, guardrails, and, critically, how you constrain the thinking channel. Raw model is capability. Harnessed model is a product.
  • Think-close. A one-line intervention. After the user’s message, prefill the assistant turn with an already-closed <think></think> block. The model reads that as “I already thought, get to the answer,” and stops burning tokens on preamble.
  • One-shot HTML. A single prompt asking the model to produce a complete web page, HTML, CSS, and JavaScript in one file, that runs in your browser without installing anything.

That is enough vocabulary to read the rest.

The intervention: same weights, different posture

The controlled test is simple. Hold the weights fixed and change only how the model is served.

A six-word probe makes the effect visible: “draw an svg of a circle.” At default reasoning on the laptop, Qwen spent 112.3 seconds and 1,440 reasoning tokens turning that into an animated, glowing, orbiting composition. Attractive. Not what was asked.

Same prompt, same laptop, with the think-close prefill: 15.3 seconds, zero reasoning tokens, a clean circle.

Same prompt, same prefill, on the RTX 5090 desk: 1.2 seconds.

The intervention did not make the model smarter. It stopped the serving path from spending the answer budget on preamble. The manual’s suggested fix, chat_template_kwargs.enable_thinking=false, is the one that produced the 301.4-second empty response. On this serving path the flag did not disable thinking. The assistant prefill did.

The same circle prompt across postures: default 112.3s, effort-low, think-close 15.3s on the laptop, and 1.2s on the RTX 5090
Same six words, different serving posture. Default overbuilds and stalls. Think-close returns a clean circle in 1.2 seconds on the desk.
M5 default circle output: animated, overbuilt geometric composition
M5 default: 112.3s, 1,440 reasoning tokens, overbuilt.
M5 circle output with the think-close harness: a plain clean circle
M5 think-close: 15.3s, 0 reasoning tokens.
RTX 5090 circle output with the think-close harness: a plain clean circle
RTX 5090 think-close: 1.2s.

These are actual output files, unedited. The circle is a probe, not the argument. The argument is that identical weights delivered radically different outcomes, and the only variable that moved was the harness.

Same weights, different delivered work

A circle is a toy. Real work is the test that matters.

I ran an eight-task offline workday against the same qwen3.8-27b@q4_k_s weights, in two postures. Raw meant default chat with no system message and thinking on. Harnessed meant a small task-specific system card plus think-close. Same GPU, same quant, same prompts. The tasks were ordinary knowledge work: an executive email, slide bullets, a LinkedIn draft, inbox triage, a meeting-notes extract, an off-by-one code fix, a fractions homework question I was helping my daughter Coraline work through, and a carry-on packing list for a weekend trip.

Human-reviewed at the “would send with at most one minor edit” bar:

ArmUsable / 8
Raw local (thinking on, no system)2
Harnessed local (think-close + small system card)8

The raw arm did not fail because the model was weak. It failed because thinking ate the completion budget. Half the outputs came back empty or truncated, the same failure mode as the 301.4-second circle.

Two things to separate carefully.

First, this is a same-weights comparison. It says the harness matters. It does not say local Qwen is stronger than any cloud model.

Second, a different table. On those same eight tasks, I ran GPT-5.2 in the cloud as a control. Harnessed local Qwen tied it seven times and edged it once, on a shorter, tighter executive email. That is one local edge and seven ties. It is not eight wins over GPT-5.2, and I will not describe it that way. It is evidence that on a class of ordinary knowledge work, this local setup is already good enough that the internet connection stops mattering.

For a sense of scale, I put the same eight tasks to GPT-4o, a model about two years old. It handled most of them cleanly, the email, the bullets, the inbox triage, the code fix, the fractions explainer. It also showed its age in two places: it defaulted to hype voice on the LinkedIn draft, and on the meeting-notes extract it returned owners and a risk but left the decisions themselves blank. Useful, but a notch below the harnessed local run on exactly the structure-sensitive task you would most want to trust. The point is not that local beat GPT-4o. It is that the bar for ordinary work was cleared years ago, which is why the argument is now about where the work should run, not whether a given model can do it.

What the work actually looks like

The claim only travels if the specific output does.

Private clinic note. A synthetic patient summary with a next-steps bullet and an explicit “verify with clinician” flag, produced by harnessed local Qwen in 5.7 seconds. The output is fine. The ownership residual is the point. That document never left the machine.

Meeting-notes tool. A one-shot HTML tool: paste messy meeting notes, get decisions, owners, and risks. Harnessed on the desk in 31 seconds. Raw, on the same weights, returned an empty page after 53 seconds. Same class of failure as the empty circle.

Meeting-notes extractor: paste messy notes, get decisions, owners, and risks
Click through to open the one-shot tool. The model produced a complete, self-contained page in a single prompt.

Python utility. A small jsonl → markdown command-line script in 3.6 seconds, harnessed on the desk. Not spectacular. Repeatable, private, and free at the margin.

Six one-shot HTML demos from these runs are acceptance-tested and playable, including the meeting-notes tool above, a narrative game, an arcade snake, Breakout, a minimal Tetris loop, and an animated duck on a bicycle. Part 2 walks through all six. Play them here: the one-shot demo gallery.

Method probes

A few borrowed prompts helped map the model’s edges. They are probes, not the story.

Car wash. The reasoning trap that anchors Part 1: “I want to wash my car. The car wash is 50 meters away. Should I walk or drive?” This part ran it inside a frozen prompt matrix: four prompt variants, five repetitions each, twenty trials per subject. Pooled across all four variants, harnessed and raw local Qwen both drove 20 of 20. GPT-5.2 drove 5 of 20, and a roughly two-year-older GPT-4o drove the same 5 of 20. GPT-5.5 and a cheap-tier Luna both drove 20 of 20. Read the GPT-5.2 and GPT-4o figures as aggregate rates across the four variants, not as a score on any single wording. Model-family variance is real, and default posture is not capability. Part 1 breaks the same trap down posture by posture on a separate N=5 per posture design, which is where the naive wording and the intent-ablation that makes local walk are reported individually. The two denominators are deliberately different lenses. Do not merge them.

Car-wash split card: local Qwen drives; GPT-5.2 walks on the naive wording
The Part 1 per-posture result: on the naive wording local drives and frontier chat walks. Anchor the frontier to the goal and it also drives. That reversal is the subject of Part 1.

Circle and pelican SVG. Beyond the circle above, harnessed local returned a recognizable pelican-on-a-bicycle on the desk in about 26 seconds at zero reasoning tokens, measured on one harnessed lab run. Part 1 reports a separate, tighter under-80-elements variant of the same probe that completed in 15.5 seconds. Different runs on different constraints, not a correction of this one. Less polished than a frontier model. It completes, which was the failure mode before the harness landed. Cloud still wins the beauty contest, and that is fine. This was never a beauty contest.

Local Qwen3.8 pelican-on-a-bicycle SVG produced with the think-close harness on the RTX 5090
Harnessed local pelican on the desk. Not gallery-polished. It completes.
Frozen matrix scoreboard: rates across models, blocks, and postures on the labeled prompt pack
The publication-grade view of the probe matrix. Rates on a frozen pack with labeled arms, not a claim of overall superiority.

Two machines, one dial

Hardware set the interaction. Harness set the reliability.

The M5 laptop proves the model runs privately and quietly on hardware someone might already own. With the harness on, useful answers arrive in the tens of seconds. That is enough to treat it as your machine.

The RTX 5090 changes the interaction model. In this first phase, the Q4_K_S serving stack measured 53.9 tok/s with thinking closed (roughly 54), versus something closer to nine on the laptop (8.7). A work email arrived in about a second. The meeting-notes tool that took 272 seconds on the laptop landed in 31 on the desk. That is the difference between a batch job and a conversation. The later serving-stack bakeoff pushed the same desk to roughly 138–145 wall tok/s on HTML/SVG while allocating the native 262K window; Part 4 explains what changed.

Two machines, same prompts: the M5 laptop proves the model runs; the RTX 5090 desk makes it iterative
The M5 makes the model portable. The desk makes it iterative.

Limitations

The runs that did not work matter as much as the ones that did.

  • The enable_thinking=false template flag did not disable thinking on this serving path. On the laptop it sat silent for 301.4 seconds and returned an empty answer.
  • Default circle and default pelican on the desk both filled the completion budget with reasoning tokens and returned empty SVGs. The fix was the harness, not more compute.
  • The one-shot meeting-notes tool returned an empty page in the raw posture. The fix was the harness, not more prompt engineering.
  • The laptop can produce the meeting-notes tool. It takes 272 seconds. Memory bandwidth is a real physical constraint.

Disclosures a reader has a right to expect.

  1. Small, hand-curated practical suite. Not a broad public benchmark, and not a substitute for one. The privacy documents are synthetic.
  2. One operator, one lab, one week. No blinded review panel. Judge labels are qualitative; “usable with at most one minor edit” is a working standard, not a metric.
  3. Selected quant and runtime. This phase used Q4_K_S on the desk and a different serving artifact on the laptop. It is a practical setup comparison, not a hardware-matched benchmark, and hardware and serving stack are confounded on purpose. Part 4 separately tests engine, quant, KV precision, context allocation, and MTP.
  4. The cloud comparison was OpenAI only by design: GPT-5.2 and GPT-4.1 as the primary controls, GPT-5.5 and a cheap-tier Luna in the car-wash matrix, and GPT-4o as a two-year-older reference point. This is a local-versus-OpenAI read on the pack tested, not a cross-vendor leaderboard.
  5. Some one-shot demos were regenerated when a raw generation truncated, then acceptance-tested before publication. They are honest artifacts, not literal single-prompt captures in every case.
  6. No claim of overall superiority to any frontier model. The claim is narrower: a harnessed local Qwen is good enough for a large slice of real work, on the pack tested. Think-close is a serving-path workaround, not a portable API standard.

The daily-driver recipe

The intervention is smaller than the payoff.

[
  { "role": "user", "content": "YOUR PROMPT" },
  { "role": "assistant", "content": "<think>\nok\n</think>\n" }
]

Three practical rules turn this from a party trick into a routine.

  1. Prefer the desk for daily work. The Phase 1 stack measured 53.9 tok/s (roughly 54) with thinking closed, already enough to change iteration. The optimized daily stack in Part 4 later measured roughly 138–145 wall tok/s on HTML/SVG.
  2. Use the assistant prefill for chat, SVG, and tools you need now. It is the reliable kill switch, where the template flag was not.
  3. Allow thinking only when you can raise the completion budget and afford to wait. Multi-step planning, hard debugging, and long structured extraction sometimes benefit. Circle prompts do not.

Two supporting habits. Give the model enough context that reasoning cannot silently consume the output budget, and size the allocation to the architecture rather than a generic rule. On this hybrid model, Part 4 shows that the native 262,144-token allocation fits on the 32 GB desk with q4 KV; the longest prompt actually tested was approximately 48K. Add a short system card (“bottom line first, short lines, match the requested format”) for work tasks.

One warning worth stating plainly. The assistant-prefill trick is a serving-path workaround for models that emit a <think>...</think> reasoning block. It is not an OpenAI-standard parameter, and it is not portable across every provider or every open-source server. Verify on your stack before you build it into a pipeline.

Judgment

The useful question is no longer local or cloud. It is which substrate you own, which you rent, and how well you harness either one.

Own the substrate for private, high-volume, and repeatable work. Emails, extraction, summarization, offline copilots, internal drafts, anything you would not paste into a vendor transcript. When the GPU is on your desk, marginal token cost is zero, iteration is cheap, and the data never leaves. The clearest case is automated agents: multi-step tool loops that plan, retry, and rewrite generate and consume tokens far faster than any human chatting, and that is exactly the regime where a metered API bill compounds and an owned desk does not.

Rent the frontier for polish and the hardest agent and SWE loops. Beauty contests, brand-facing copy, deep debugging across unfamiliar code, and anything where uptime and vendor operations are worth paying for. Frontier is where new behavior appears first. That is where I would keep paying.

Two mental models thread the whole investigation.

Default posture is not capability. When a model fails your prompt at the vendor default, you have learned something about the prompt at least as often as something about the model.

The model is the substrate. The harness is the product. Raw weights are latent. Posture, system cards, output contracts, and the way you constrain thinking are what convert that latency into delivered work.

Part 1 is the car-wash trap, and the moment default posture stops looking like capability.

Method notes

  • Reasoning ladder: five arms (default, effort-low, effort-medium, template “off” flag, and think-close prefill) across four prompts, on two machines. Full table lives in the lab notebook.
  • Workday: eight tasks, human-reviewed at the “would send with at most one minor edit” bar. GPT-5.2 as the cloud control on the same prompts.
  • Car wash: four frozen prompts × five repetitions = twenty trials per subject in this part’s matrix. Part 1 uses a separate N=5 per posture design. Do not merge the two denominators.
  • Local model: Qwen3.8-27B at Q4_K_S quantization on the desk, with a matching copy on the laptop. Deliberately different serving artifacts to map practical breaking points.
  • Cloud controls: GPT-5.2, GPT-4.1, GPT-5.5, a cheap-tier Luna, and a two-year-older GPT-4o, all OpenAI, at provider defaults, same prompts. GPT-4o was run on the four frozen car-wash variants and the eight-task workday.

Sources

Qwen3.8: Same Weights, Different Product

Start Here

View Series Overview →