Field Manual No.13 · 27 August 2026

Qwen 3.8 vs Ornith vs Claude

A 27B model on a laptop matched Opus on hard coding and tied it on animated 3D. Here is exactly where it didn't.

Two open-weight models running on a single RTX 5090 Laptop GPU, measured against Claude Opus 4.6, 4.8 and 5 through the API. Same prompts, same graders, same day. Every number below was produced on this machine. No vendor-reported figure is mixed into any result.

RTX 5090 Laptop 24GBllama.cpp 192067b 6 objective tasksanimated 3D, render-verified interactive agent loopcreative excluded from aggregate
§ 01 · Headline

Where each model actually wins

Hard task suite: six objectively graded tasks, no LLM judgement anywhere. Local models run reasoning off, n-max 5; Opus runs adaptive thinking at low effort.
ModelCodingStructuredInstructionRetrievalTotal
claude-opus-4-8100%100%100%100%100.0%
claude-opus-5100%100%100%100%100.0%
claude-opus-4-6100%85%95%100%96.7%
qwen3.8-27b100%50%50%100%83.3%
ornith-1.5-35b-a3b83%65%45%100%76.7%
The two findings that matter

Qwen matches Opus on hard coding, at 100%. That is not a soft task: RFC 4180 CSV parsing with embedded newlines and doubled quotes, topological sort with cycle detection and alphabetical tie-breaking, and a binary search with a subtle lower-bound bug. All three, all cases, on a laptop.

Retrieval is also at parity: every model found three facts buried at different depths in a 180-line log and summed them correctly.

The gap is elsewhere: multi-constraint instruction following (45-50% vs 95-100%) and multi-step arithmetic aggregation (50-65% vs 85-100%).

§ 02 · Task detail

Per-task results

TaskWhat it trapsopus-4-6opus-4-8opus-5qwenornith
csv-rfc4180quoted commas, embedded newlines, doubled-quote escapes, CRLF100%100%100%100%100%
toposortcycle detection, implicit nodes, alphabetical ties100%100%100%100%50%
debug-binsearchnon-integer mid, wrong initial hi, empty array100%100%100%100%100%
json-regroupgroup, sum, round, and pick top product by revenue not volume85%100%100%50%65%
instruct-multi6 simultaneous constraints incl. exact word counts and a letter ban95%100%100%50%45%
needle-compute3 facts at depths 14/78/153 in 180 lines, then arithmetic100%100%100%100%100%

The json-regroup trap is worth calling out: the top product by revenue in Germany is Gadget (149.50), not Widget (99.95, but three units across two orders). Opus 4.6 picked Widget. So did an earlier version of this grader. See the harness-bug section.

§ 03 · Generative 3D

The bright orrery

The first 3D task was a realistic solar system on black. It graded fine but was almost unreadable: a point light at the sun leaves every planet half-dark, and at small sizes five panels of black space look identical. This is the same subject rebuilt for legibility and made harder: a violet-to-magenta gradient backdrop, four emissive planets, tinted orbit rings, a tilted torus ring on the gas giant, a nested moon, and a comet on an elliptical path trailing thirty fading segments. Identical prompt to all five, no edits to any output.

All five running live in a browser at full frame rate. Top row: the two local models. Bottom row: Claude Opus 5, 4.8 and 4.6.

Don't take the video's word for it. Each panel below is that model's own unedited HTML. Press run and it executes live in your browser.

Qwen3.8-27BLOCAL100%
Ornith-1.5-35BLOCALre-sampled
Claude Opus 5API100%
Claude Opus 4.8API96%
Claude Opus 4.6API91%

Open the full-screen live instrument, all five at once →

Every model achieved the goal

All five produced a working, animated orrery that satisfies every stated requirement. On the measurable criteria there is nothing between them: 16/16 structural checks each, all render a real scene, all provably animate.

Which one looks best is a subjective call and we are not scoring it. Judge the video yourself. For what it is worth, we think Qwen3.8-27B, the model running on the laptop, is the most visually polished of the five, but that is an opinion, not a measurement, and reasonable people will disagree.

Qwen3.8-27B bright orrery
Qwen3.8-27BLOCAL
100% · static 16/16 · 20.0 KB
Claude Opus 5 bright orrery
Claude Opus 5API
100% · static 16/16 · 6.0 KB
Ornith-1.5-35B-A3B bright orrery
Ornith-1.5-35B-A3BLOCAL
re-sampled · static 16/16 · 13.2 KB
Claude Opus 4.8 bright orrery
Claude Opus 4.8API
100% · static 16/16 · 4.6 KB
Claude Opus 4.6 bright orrery
Claude Opus 4.6API
100% · static 16/16 · 5.0 KB
Scored per attempt: 60% structural checks, 25% renders a real scene, 15% provably animates. First attempt is the headline number.
ModelAttempts1st attemptFinalStaticColours
qwen3.8-27b1100%100%16/16268
claude-opus-51100%100%16/16266
claude-opus-4-81100%100%16/16159
claude-opus-4-61100%100%16/16132
ornith-1.5-35b-a3b260%100%16/16193

Ornith is scored 60% on this task, not 100%. Its first attempt rendered a blank frame, and first-attempt reliability is part of what a model is being judged on. The 100% column records that a second sample of the same prompt did succeed; it is not the score.

One model consistently exceeds the brief

Across both 3D tasks, the original solar system and this orrery, Qwen3.8-27B was the only model to add anything that was not asked for. In the orrery it shipped an on-screen title card (“Museum Model · Orrery No. 04”), corner framing, and two interaction handlers. In the earlier solar-system task it added hand-written orbit/zoom/pause/reset camera controls, orbital path rings, and a legend listing each planet with the radius and period taken from the prompt.

ModelUI chromeInteraction handlersOutput size
qwen3.8-27b14 refs220,456 B
ornith-1.5-35b-a3b13,490 B
claude-opus-56,188 B
claude-opus-4-65,161 B
claude-opus-4-84,700 B

Both readings are defensible. The Opus models met the stated requirements exactly and stopped. Qwen went further, which reads as capability here, and as scope creep against a prompt that said “output only the complete HTML file”. That second reading is consistent with Qwen’s weak instruction-following score (50%) in the main suite: the same tendency that makes its 3D work look richer is what costs it marks when a spec must be followed literally.

Why the first attempt failed, and why the grader missed it

Ornith’s first output passed all sixteen structural checks and rendered nothing. One line was responsible:

new THREE.MeshBasicMaterial({ color: 0xFFD34E })
sun.material.emissive = new THREE.Color(0xFFD34E);   // MeshBasicMaterial has no .emissive

MeshBasicMaterial is unlit and has no emissive property. Assigning one makes Three.js read uniforms.emissive.value on a shader that never declared it: TypeError: Cannot read properties of undefined, thrown every frame, aborting the render before any geometry draws. Deleting that one line takes the output from 2,286 bytes (blank) to 24,830 (full scene). Bisected and confirmed, not inferred.

The mechanism matters more than the bug. The prompt asked for an “emissive” sun. Ornith picked MeshBasicMaterial, a defensible unlit choice, then bolted .emissive on to satisfy the word. And the check meant to catch exactly this, emissive used ≥ 3, counted the occurrences and passed it. A checklist can be satisfied by vocabulary. Only rendering catches it.

What this cost the harness

The first replacement sample also passed the old render gate (a 30 KB PNG whose frames differed between timestamps) while actually being flat black regions and a stray magenta polygon. Byte size and frame-hash difference are not a render check.

The gate now decodes each frame to raw RGB and measures distinct colours, dark fraction and dominant-colour share. It separates cleanly: the four working renders score 132-268 distinct colours; the two broken ones scored 55 and 57. Both failing outputs ship in the package as evidence.

§ 04 · Agentic

Blind planning vs interactive tool use

These are two different capabilities and conflating them is the most common way this kind of comparison goes wrong. Blind asks for a complete command sequence up front with no feedback. Interactive runs a real loop: one command per turn, an observation returned each time, up to 25 turns, with one retry allowed on a malformed reply.

Same world both times: 5×5 grid, crate at (2,1), pad at (4,3), walls at (1,1) and (3,2). Both variants state every fact. 3 reps each. All five rows are backed by results/agentloop.json in the package.
ModelBlind planningInteractive loopWhat the traces show
claude-opus-4-8100%100%Optimal or near-optimal every rep.
claude-opus-5100%99%Delivers in 10 turns; recovers cleanly from the wall.
claude-opus-4-620%88%Blind, it routes through the wall at (3,2) and lands one square short. Given feedback, it recovers.
qwen3.8-27b0%0%Walks onto the crate square and past it without picking up; later issues MOVE S twelve times into a grid edge without adapting.
ornith-1.5-35b-a3b0%0%Navigates competently and maps walls correctly, but stops at (2,2) when the crate is at (2,1).
The honest reading

This is the clearest capability gap in the whole comparison, and it is not a formatting problem. Both local models emit perfectly-formed commands and correctly interpret “Blocked: wall”. What they fail at is tracking their own coordinates across turns. Opus 4.6's blind score of 20% versus 88% interactive is the cleanest demonstration that feedback and planning are separate skills.

One caveat: this is a single spatial world. It is evidence about state tracking, not a general verdict on tool use. A model that fails here might still drive a well-designed tool API where the environment reports state explicitly.

§ 05 · Speed

What local buys you

Capability is only half the comparison. These are measured decode rates on the same laptop, tuned per the companion setup guide.

ModelBaselineTuned peak256K ctxVRAM @256KNotes
qwen3.8-27b40.8141.681.223,504 MBPeak is JSON output at n-max 10. Code peaks at 96.8.
ornith-1.5-35b-a3b144.3144.7123.621,298 MBMoE, ~3B active. Needs no tuning; MTP unavailable.
Ornith wins on speed, Qwen wins on capability

Ornith's untuned baseline (144.3 tok/s) beats Qwen after every optimisation available (141.6), uses 2.2 GB less VRAM at full context, and holds 123.6 tok/s at 256K where Qwen drops to 81.2. It activates roughly 3B parameters per token against Qwen's 27B dense.

But Qwen wins the capability suite 83.3% to 76.7%, wins coding 100% to 83%, and ties Opus 5 on animated 3D where Ornith placed third. Speed and capability point at different models here.

§ 06 · Excluded from the score

Creative writing

Deliberately not in the aggregate

Creative quality can only be judged, and the judge here is Claude while three of the five entrants are Claude models. That is a structural conflict and no headline number should rest on it. Constraint adherence below is machine-checked and trustworthy; the craft column is a judgement call, shown so you can disagree with it.

Constrained flash fiction: 150-180 words, present tense, exactly one question mark in dialogue, three banned words, final sentence exactly five words.
ModelConstraints (machine)Craft (judged)Machine-checked detail
claude-opus-4-8100%5/5all constraints met
claude-opus-5100%5/5all constraints met
claude-opus-4-6100%4/5all constraints met
qwen3.8-27b70%3/5word count overrun
ornith-1.5-35b-a3b55%3/5banned word used; final sentence wrong length

The constraint column tracks the instruction-following result from the main suite, which is machine-verified and where the local gap is real and large. The craft ranking happens to agree with it, but agreement is not independence, and it should not be read as corroboration.

§ 07 · Credibility

Harness bugs found and fixed

Every one of these produced plausible, publishable, wrong numbers. They are listed because a benchmark that silently mis-grades is worse than no benchmark, and because several of them inverted a result.

#BugEffect on the numbers
1Expected answer was wrongInverted a result. The grader asserted Widget as Germany's top product; it is Gadget (149.50 vs 99.95). Opus 4.8 and 5 answered correctly and were marked down; Opus 4.6 repeated the error and was rewarded.
2Thinking disabled on the APICorrupted Opus output with mid-sentence fragments and stray CJK characters. Opus 4.8 instruction score 13% → 91% after switching to adaptive thinking at low effort.
3Agent env omitted the crate locationTurned planning into unsensored blind search. Opus 4.6 0% → 89%, Opus 4.8 40% → 100%.
4Stale screenshot readPNGs from a previous run were hashed, so an animated scene scored STATIC. Opus 4.8 3D 76% → 96%.
5Prompt echo graded as outputThe line counter saw 10 lines for a 4-line answer; the code extractor matched the fence marker inside the prompt text itself.
6Unclosed code fenceOrnith opens a javascript fence and never closes it. Its coding score went 48% → 81%.
7Token budget starved by thinkingmax_tokens: 24 with thinking on truncated every reply to two characters. All models scored 0%.
8Health endpoint lies during load/health returns 200 while chat still returns 503. Local reps fired into a cold server and scored as errors.
9Missing software GL backendWithout --use-angle=swiftshader, headless Chrome silently produced blank PNGs for every WebGL render.
10Counting geometries not meshesModels legitimately reuse one sphere geometry across several planets; all five failed a check they had actually satisfied.
How to attack these results

The objective tasks are the defensible core: unit tests in a sandboxed VM, JSON schema checks, a deterministic simulator, and render-verified animation. They contain no model judgement and can be re-run by anyone. If you want to break this comparison, start there: read the graders, not the summary table.

The weakest claims, stated plainly: creative craft is judged by an interested party; the agentic result rests on a single spatial world; and each model was run once per task except the agent loop (3 reps) and the speed measurements (2-3 reps).

§ 08 · Method

Reproduce it

node bench/run2.mjs api        # 6 hard tasks vs Opus 4.6 / 4.8 / 5
node bench/run2.mjs local      # same tasks vs local GGUF models
node bench/agentbench.mjs all  # interactive agent loop, 3 reps each
node bench/threed2.mjs         # animated 3D + headless render verification
  • Fairness settings: local models run with reasoning off; Opus runs adaptive thinking at low effort. Disabling thinking entirely on Opus corrupts its output, so it is not a valid analogue.
  • Coding tasks are JavaScript because Node is the only real runtime on this box and objective grading requires execution. This mildly favours JS-strong models.
  • No vendor-reported numbers appear anywhere in this document. Published benchmark scores use different harnesses and, in at least two cases checked during this work, refer to different-sized models than the ones being named.
§ 09 · Context, not evidence

What the vendors claim

Fenced: none of this is ours, none of it is comparable

Everything in this section is reported by the model developers or scraped from third-party aggregators. It is included because readers will look for it, and excluded from every score in this document because it cannot be compared like-for-like. Three specific reasons:

  • Different harnesses. Ornith's own card reports Terminal-Bench 2.1 at 67.8 with the Terminus-2 scaffold and 68.5 with Claude Code: the same model, same benchmark, different number depending on the wrapper.
  • Self-reporting. The Qwen and Ornith figures come from their own model cards. The Claude figures come from third-party leaderboards. Those are not the same kind of claim.
  • Model-size confusion is rampant. Ornith-1.5's headline "beats Opus" coverage refers to the 397B sibling, not the 35B tested here. We nearly repeated that error twice while researching this piece.
Vendor and aggregator figures, reproduced as published. Blank means not published for that pairing.
BenchmarkQwen3.8-27BOrnith-1.5-35BOpus 4.8Opus 5
SWE-bench Verified79.088.697.0
SWE-bench Pro61.759.669.2
SWE-bench Multilingual71.4
Terminal-Bench 2.173.067.8
LiveCodeBench v690.3
GPQA Diamond89.289.294.1
OSWorld-Verified84.3
Where the published numbers disagree with our measurements

This is the most useful thing in the section. On published SWE-bench figures, Ornith (79.0 Verified) looks stronger than Qwen. In our own coding tasks (RFC 4180 CSV parsing, topological sort with cycle detection, a subtle binary-search bug), Qwen scored 100% and Ornith scored 83%, with Ornith failing topological sort outright.

Both things can be true. SWE-bench measures patch generation against real repository issues; our tasks measure algorithmic correctness on adversarial edge cases. They are different skills. The lesson is that a leaderboard position does not predict behaviour on your workload, which is the entire argument for running your own harness.

Sources: model cards on Hugging Face for Qwen3.8-27B and Ornith-1.5-35B-A3B; third-party leaderboards for the Claude figures. Retrieved 27 August 2026. Figures move; treat them as a snapshot.

Ferrox Labs · The Forge Field Manual No.13 · Companion volume: No.12, Maximising Qwen3.8-27B on a 5090 Laptop.

Every figure was measured on the machine described above on 27 August 2026. Raw outputs, graders, per-run logs and frame captures are retained, including the runs that were invalidated.

We do not publish work we cannot defend in review.