Four local models — ariane on vLLM, three on the Strata expert engine — scored against Claude Sonnet 5.5 as the reference on the same suites: the 134-task web/UI webbench, the 23-task canonical grill (3 runs), the long-horizon agent round, and the 52-image vision test.
test_driven_loop, which it fixes without ever re-running the test suite.| Measure | Sonnet 5.5 | ariane | Swift IQ3_XXS | Flash-Next IQ2_XS | Gyro-M |
|---|---|---|---|---|---|
| Webbench · 134 tasks · first sample | |||||
| Strict passes (every check passes) | 129 | 95 | 107 | 88 | 111 |
| First 100 tasks / new 34 (React + Next.js) | 96 / 33 | 67 / 28 | 83 / 24 | 70 / 18 | 82 / 29 |
| Mean score (partial credit) | 0.99 | 0.81 | 0.91 | 0.80 | 0.92 |
| Score at least 0.80 | 133 | 106 | 120 | 100 | 123 |
| Output built and ran | 134 | 122 | 129 | 126 | 132 |
| Hit the 32k output cap | 0 | 10 | 4 | 2 | 0 |
| Thinking cut off at budget (thinking budget flag) | 0 | 0 | 110 | 125 | 102 |
| Median output tokens per task | 2,872 | 14,420 | 25,426 | 25,494 | 25,679 |
| Median wall time per task (s) | 18 | 208 | 262 | 276 | 380 |
| Median decode speed per task (tok/s) | 158 | 66 | 95 | 91 | 68 |
| Whole suite, wall hours | 0.7 | 9.2 | 9.0 | 9.8 | 13.1 (incl. a 14-min pause) |
| Canonical grill · 23 tasks · 3 runs | |||||
| Passes per run | 22, 22, 22 | 22, 22, 22 | 21, 22, 19 | 22, 22, 22 | 21, 22, 22 |
| Mean | 22.00 | 22.00 | 20.67 | 22.00 | 21.67 |
| Long-horizon agent round, /6 per run | 6, 6, 6 | 5, 5, 5 | 6, 5, 6 | 5, 6, 6 | 6, 6, 6 |
| Output tokens per grill run | 12,025 | 53,949 | 61,579 | 92,455 | 91,529 |
| Grill task time per run (min) | 1.6 | 12.9 | 12.5 | 18.2 | 23.2 |
| Vision · 52 images · 3 runs | |||||
| Passes per run | 43, 43, 44 (7 photos refused by API) | 48, 49, 49 | 49, 50, 49 | 49, 50, 49 | 52, 49, 50 |
| Easy / medium / hard (best run) | 14/17 · 24/28 · 6/7 | 16/17 · 26/28 · 7/7 | 17/17 · 27/28 · 6/7 | 17/17 · 26/28 · 7/7 | 17/17 · 28/28 · 7/7 |
| lm-eval side axis (20 samples each, not in the grill score) | |||||
| GSM8K strict | 1.00 | 0.95 | 0.95 | 0.90 | 0.95 |
| IFEval prompt-level strict | 0.75, 0.75, 0.60 | 0.70 | 0.65, 0.70, 0.80 | 0.90 | 0.95, 0.90, 0.90 |
| Serving on this box | |||||
| Decode speed | n/a (cloud) | ~66 t/s median on webbench, vLLM TP=2, 160k context | ~95 t/s median on webbench, 200k context, live service | ~108 t/s on engine 0.1.40, ~87 t/s on 0.1.47 (webbench), 262k context | ~68 t/s on 0.1.47 (webbench), 262k context |
| Weights | n/a | 21.9 GB NVFP4 (193 NVFP4 + 208 FP8 layers, vision tower and MTP head BF16), vLLM 0.31.0 | 76 GB IQ3_XXS (two parts), ~40 GiB expert arena in RAM, vision built in | 64 GiB IQ2_XS (two parts), ~14k experts cached on the two cards, vision built in | 92 GB in one file, experts in a 2-bit trellis format, ~13k of 24.6k experts cached on the two cards, vision built in |
The local models ran one webbench sample each, with no temperature sent, so each uses its server's own default. Swift's webbench and grill ran at its 131k context; it was raised to 200k afterwards. The three Strata models ran with a 24k-token reasoning budget; ariane ran with none, so a task it over-thinks runs to the 32k output cap. Sonnet's column is its first of three samples. Sonnet's token counts come through the API proxy and aren't comparable with the local models. Gyro-M's webbench was paused for 14 minutes during task A-029, so that task's wall time (1,022 s) and the suite's wall hours include the pause; the engine measured 388 s for it.
Sampling differs between the Strata models. With no temperature sent, Strata engine 0.1.40 always picks the most likely token, while engine 0.1.47 (Strata 0.2.2) applies the model card's sampling: temperature 1.0, top_p 0.95, top_k 20. Swift ran everything on 0.1.40. Flash-Next IQ2_XS answered webbench tasks A-001 to A-065 (62 tasks) on 0.1.40, and the other 72 tasks, the grill and the vision test on 0.1.47. All of its React and Next.js tasks were therefore sampled at temperature 1.0. Same weights and settings on both engines. Gyro-M ran everything on 0.1.47, so every one of its answers was sampled at temperature 1.0.
Strict passes out of the tasks in each category. Bars are drawn to the same 0–100% scale.
| Task difficulty | Tasks | Sonnet | ariane | Swift IQ3_XXS | Flash-Next IQ2_XS | Gyro-M |
|---|---|---|---|---|---|---|
| Difficulty 2 | 6 | 6 (100%) | 6 (100%) | 6 (100%) | 5 (83%) | 6 (100%) |
| Difficulty 3 | 77 | 74 (96%) | 57 (74%) | 61 (79%) | 55 (71%) | 64 (83%) |
| Difficulty 4 | 49 | 47 (96%) | 31 (63%) | 38 (78%) | 26 (53%) | 39 (80%) |
| Difficulty 1 and 5 | 2 | 2 | 1 | 2 | 2 | 2 |
Counted over the 134 tasks all four local models have finished.
Four of Sonnet's five misses fail one or two checks. The fifth, URL state, scored 0.30 on run 1 and passed the other two runs.
It ran with no thinking budget, so its misses skew toward over-thinking: 10 of its 12 no-build answers stopped at the 32k output cap mid-answer.
Swift almost always ships complete code. Its misses are mostly one check short on an otherwise working page.
Flash-Next IQ2_XS hit its thinking budget on 125 of 134 tasks. 6 of its 8 no-build results are Next.js tasks: five builds that fail, and one answer (A-127) that the model ended 141 tokens into its thinking.
Gyro-M hit its thinking budget on 102 of 134 tasks. Its two no-build results are A-124, whose Next.js build fails, and A-103, where the model stopped 11,600 tokens into its thinking without writing an answer.
Each square is one run, three runs per model. Highlighted rows are the tasks where the models differ.
| Task | Sonnet | ariane | Swift IQ3_XXS | Flash-Next IQ2_XS | Gyro-M |
|---|---|---|---|---|---|
| Round 1 | |||||
| median two sorted | |||||
| expr eval | |||||
| damerau levenshtein | |||||
| articulation points | |||||
| lru ttl | |||||
| kth smallest bst | |||||
| wildcard match | |||||
| search rotated | |||||
| Round 2 | |||||
| regex dot star | |||||
| weighted interval scheduling | |||||
| dijkstra | |||||
| bounded blocking queue | |||||
| text justify | |||||
| Round 3 | |||||
| tool weather | |||||
| tool select | |||||
| tool restraint | |||||
| json strict | |||||
| format lines | |||||
| Round 4 | |||||
| chain book | |||||
| error recovery | |||||
| clarify missing | |||||
| repo fix | |||||
| gather aggregate | |||||
| Round 5 · long-horizon agent tasks, scored separately | |||||
| multifile refactor | |||||
| test driven loop | |||||
| search navigate | |||||
| constraint recovery | |||||
| interrupt replan | |||||
| already done | |||||
expr_eval rejects inputs like 1++2; the local models miss that edge case almost every run, as nearly every model tested here does. Sonnet's one miss is damerau_levenshtein, which every local model passes.
| ID | Task | Category | Diff. | Sonnet run 1 | Sonnet runs | ariane | Swift IQ3_XXS | Flash-Next IQ2_XS | Gyro-M |
|---|---|---|---|---|---|---|---|---|---|
| A-001 | pricing table | Vanilla CSS | 1 | 1.00 | ●●● | 1.00 | 1.00 | 1.00thinking cut off | 1.00thinking cut off |
| A-002 | holy grail | Vanilla CSS | 3 | 0.93 | ○●○ | 1.00 | 0.93thinking cut off | 0.93thinking cut off | 0.87thinking cut off |
| A-003 | card grid spec | Vanilla CSS | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00 |
| A-004 | theme toggle | Vanilla CSS | 2 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00 |
| A-005 | css accordion | Vanilla CSS | 3 | 1.00 | ●●● | 0.00no build, hit max tokens | 0.91 | 0.30thinking cut off | 1.00 |
| A-006 | form states | Vanilla CSS | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-007 | reduced motion loaders | Vanilla CSS | 2 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00 |
| A-008 | fluid hero | Vanilla CSS | 3 | 0.95 | ●●● | 0.00no build, hit max tokens | 0.30thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-009 | sticky table | Vanilla CSS | 3 | 1.00 | ●●● | 0.89 | 0.95thinking cut off | 0.95thinking cut off | 1.00thinking cut off |
| A-010 | data table | Vanilla JS | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00 | 1.00thinking cut off |
| A-011 | accessible modal | Vanilla JS | 2 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-012 | aria combobox | Vanilla JS | 4 | 1.00 | ●●● | 0.00no build, hit max tokens | 1.00thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-013 | aria tabs | Vanilla JS | 2 | 1.00 | ●●● | 0.95 | 1.00thinking cut off | 1.00thinking cut off | 1.00 |
| A-014 | signup wizard | Vanilla JS | 4 | 1.00 | ●●● | 0.95 | 1.00thinking cut off | 0.94thinking cut off | 1.00thinking cut off |
| A-015 | debounced search | Vanilla JS | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-016 | kanban dnd | Vanilla JS | 4 | 1.00 | ●●● | 0.00no build, hit max tokens | 0.62thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-017 | canvas snake | Canvas / SVG | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 0.63thinking cut off | 1.00thinking cut off |
| A-018 | svg clock | Canvas / SVG | 3 | 1.00 | ●●● | 1.00 | 1.00 | 0.25thinking cut off | 1.00thinking cut off |
| A-019 | svg bar chart | Canvas / SVG | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 0.94thinking cut off | 1.00thinking cut off |
| A-020 | text truncation | Vanilla CSS | 3 | 0.95 | ●●● | 0.95 | 0.95 | 0.95thinking cut off | 0.95thinking cut off |
| A-022 | print stylesheet | Vanilla CSS | 2 | 0.95 | ●●● | 0.93 | 1.00 | 0.89thinking cut off | 0.95 |
| A-023 | container queries | Vanilla CSS | 3 | 0.95 | ●●● | 1.00 | 0.90thinking cut off | 1.00thinking cut off | 1.00 |
| A-024 | rtl logical | Vanilla CSS | 3 | 0.95 | ●●● | 0.30 | 1.00 | 0.30thinking cut off | 1.00 |
| A-025 | grid areas dashboard | Vanilla CSS | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00 |
| A-026 | responsive images | Vanilla CSS | 3 | 1.00 | ●●● | 1.00 | 0.95 | 0.00no build, thinking cut off, hit max tokens | 0.95thinking cut off |
| A-027 | undo redo | Vanilla JS | 3 | 1.00 | ●●● | 0.95 | 0.36thinking cut off | 0.21thinking cut off | 1.00thinking cut off |
| A-028 | todomvc | Vanilla JS | 3 | 0.95 | ●●● | 1.00 | 0.95thinking cut off | 1.00thinking cut off | 0.95thinking cut off |
| A-029 | infinite scroll | Vanilla JS | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-030 | virtual list | Vanilla JS | 4 | 1.00 | ●●● | 0.98 | 1.00thinking cut off | 0.30thinking cut off | 1.00thinking cut off |
| A-031 | date picker | Vanilla JS | 4 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 0.74thinking cut off |
| A-032 | history router | Vanilla JS | 3 | 1.00 | ●●● | 1.00 | 0.92thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-033 | error summary | Vanilla JS | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-034 | cart money | Vanilla JS | 4 | 1.00 | ●●● | 0.83 | 0.94thinking cut off | 0.30thinking cut off | 0.94thinking cut off |
| A-035 | sortable list | Vanilla JS | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-036 | toast queue | Vanilla JS | 4 | 1.00 | ●●● | 0.98 | 1.00thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-037 | stopwatch | Vanilla JS | 3 | 1.00 | ●●● | 0.95 | 1.00thinking cut off | 1.00thinking cut off | 0.30thinking cut off |
| A-038 | command palette | Vanilla JS | 4 | 1.00 | ●●● | 0.94 | 1.00thinking cut off | 0.94thinking cut off | 1.00thinking cut off |
| A-039 | xss comment fix | Bug fixing | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00 |
| A-040 | carousel | Vanilla JS | 3 | 1.00 | ●●● | 1.00 | 0.79thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-041 | markdown preview | Vanilla JS | 4 | 0.95 | ○○● | 0.16 | 0.11thinking cut off | 0.94thinking cut off | 0.30thinking cut off |
| A-042 | mini spreadsheet | Vanilla JS | 4 | 0.94 | ●●● | 0.30 | 0.00no build, hit max tokens | 0.30thinking cut off | 0.30thinking cut off |
| A-043 | file upload | Vanilla JS | 3 | 1.00 | ●●● | 0.93 | 1.00thinking cut off | 0.98thinking cut off | 1.00thinking cut off |
| A-044 | color picker | Vanilla JS | 3 | 1.00 | ●●● | 0.30 | 0.30thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-045 | treeview | Vanilla JS | 4 | 1.00 | ●●● | 0.87 | 1.00thinking cut off | 0.87thinking cut off | 0.87thinking cut off |
| A-046 | menu button | Vanilla JS | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-047 | password rules | Vanilla JS | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-048 | url state | Vanilla JS | 3 | 0.30 | ○●● | 0.30 | 0.92thinking cut off | 0.00no build, hit max tokens | 1.00thinking cut off |
| A-049 | canvas draw | Canvas / SVG | 3 | 1.00 | ●●● | 1.00 | 0.95 | 1.00thinking cut off | 1.00thinking cut off |
| A-050 | svg line chart | Canvas / SVG | 4 | 1.00 | ●○○ | 0.93 | 0.93thinking cut off | 0.93thinking cut off | 0.93thinking cut off |
| A-051 | game of life | Canvas / SVG | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00 |
| A-052 | svg donut | Canvas / SVG | 4 | 1.00 | ●●● | 0.95 | 1.00 | 1.00thinking cut off | 1.00thinking cut off |
| A-053 | sparkline element | Canvas / SVG | 3 | 1.00 | ●●● | 0.30 | 1.00thinking cut off | 0.77thinking cut off | 1.00 |
| A-054 | crop tool | Canvas / SVG | 4 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 0.27thinking cut off | 1.00thinking cut off |
| A-055 | fetch retry | Browser APIs | 4 | 1.00 | ●●● | 0.92 | 1.00thinking cut off | 0.92thinking cut off | 1.00thinking cut off |
| A-056 | indexeddb notes | Browser APIs | 3 | 1.00 | ●●● | 0.30 | 1.00thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-057 | cross tab sync | Browser APIs | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 0.20thinking cut off |
| A-058 | clipboard copy | Browser APIs | 3 | 0.90 | ●●● | 0.86 | 0.89 | 0.94thinking cut off | 0.90thinking cut off |
| A-059 | autosave draft | Browser APIs | 3 | 1.00 | ●●● | 0.95 | 1.00thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-060 | intl formatting | Browser APIs | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-061 | web worker | Browser APIs | 3 | 0.90 | ○○● | 0.89 | 0.00no build, hit max tokens | 1.00thinking cut off | 0.30thinking cut off |
| A-063 | utm builder | Browser APIs | 3 | 1.00 | ●●● | 0.00no build, hit max tokens | 1.00thinking cut off | 1.00thinking cut off | 0.95thinking cut off |
| A-065 | search lru cache | Browser APIs | 4 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00 |
| A-066 | line diff | Browser APIs | 4 | 1.00 | ●●● | 0.20 | 1.00thinking cut off | 1.00thinking cut off | 0.30thinking cut off |
| A-067 | template engine | Browser APIs | 4 | 0.92 | ●●● | 0.94 | 0.93thinking cut off | 0.30thinking cut off | 0.92thinking cut off |
| A-068 | csv tool | Browser APIs | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 0.93thinking cut off | 1.00thinking cut off |
| A-069 | range slider | Browser APIs | 4 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 0.30thinking cut off | 1.00thinking cut off |
| A-070 | fix mobile overflow | Bug fixing | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-071 | fix event bugs | Bug fixing | 2 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00 |
| A-073 | fix a11y audit | Bug fixing | 3 | 1.00 | ●●● | 0.83 | 0.86thinking cut off | 1.00thinking cut off | 0.83thinking cut off |
| A-074 | fix scroll jank | Bug fixing | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 0.30thinking cut off | 1.00thinking cut off |
| A-075 | fix listener leak | Bug fixing | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00 | 1.00 |
| A-076 | fix optimistic post | Bug fixing | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-077 | fix dates dst | Bug fixing | 4 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-078 | fix invoice math | Bug fixing | 3 | 1.00 | ●●● | 0.25 | 1.00thinking cut off | 1.00thinking cut off | 0.11thinking cut off |
| A-079 | fix focus order | Bug fixing | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-080 | fix stacking | Bug fixing | 4 | 1.00 | ●●● | 1.00 | 1.00 | 1.00thinking cut off | 1.00thinking cut off |
| A-081 | fix form payload | Bug fixing | 3 | 1.00 | ●●● | 0.88 | 0.88thinking cut off | 1.00 | 1.00thinking cut off |
| A-082 | fix grapheme counter | Bug fixing | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 0.30thinking cut off | 1.00thinking cut off |
| A-083 | fix file sort | Bug fixing | 3 | 1.00 | ●●● | 1.00 | 1.00 | 0.89 | 1.00 |
| A-084 | react fetch list | Framework | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-085 | react context cart | Framework | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-086 | react ts form | Framework | 4 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00 | 1.00 |
| A-087 | react virtual list | Framework | 4 | 0.93 | ●●● | 0.93 | 0.91thinking cut off | 0.91thinking cut off | 0.91thinking cut off |
| A-088 | react stale closure | Framework | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00 |
| A-089 | react optimistic | Framework | 4 | 1.00 | ●●● | 0.00no build, hit max tokens | 0.94thinking cut off | 0.30thinking cut off | 0.88thinking cut off |
| A-090 | vue filter panel | Framework | 4 | 1.00 | ●●● | 0.94 | 1.00thinking cut off | 0.92thinking cut off | 1.00thinking cut off |
| A-091 | vue v model | Framework | 3 | 1.00 | ●●● | 0.95 | 0.94thinking cut off | 0.94thinking cut off | 0.94thinking cut off |
| A-093 | svelte store cart | Framework | 3 | 1.00 | ●●● | 0.00no build | 1.00thinking cut off | 1.00thinking cut off | 0.90thinking cut off |
| A-094 | svelte toasts | Framework | 3 | 1.00 | ●●● | 0.23 | 1.00thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-095 | ts typed emitter | Framework | 4 | 1.00 | ●●● | 0.00no build, hit max tokens | 1.00thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-096 | express notes | Full-stack | 3 | 0.98 | ●●● | 0.69 | 1.00thinking cut off | 1.00thinking cut off | 0.98thinking cut off |
| A-097 | fastapi upload | Full-stack | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00 |
| A-098 | session login | Full-stack | 4 | 0.98 | ●●● | 0.94 | 0.98thinking cut off | 0.95thinking cut off | 0.95thinking cut off |
| A-099 | websocket chat | Full-stack | 4 | 0.98 | ●●● | 0.14 | 1.00thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-100 | jinja ssr search | Full-stack | 3 | 0.92 | ●●● | 0.92 | 1.00thinking cut off | 0.78thinking cut off | 0.12thinking cut off |
| A-101 | sse progress | Full-stack | 4 | 0.98 | ●●● | 0.98 | 0.98thinking cut off | 0.98thinking cut off | 1.00thinking cut off |
| A-102 | etag conditional | Full-stack | 4 | 0.98 | ●●● | 0.94 | 0.94thinking cut off | 0.79thinking cut off | 0.94thinking cut off |
| A-103 | progressive form | Full-stack | 3 | 1.00 | ●○● | 0.00no build, hit max tokens | 1.00thinking cut off | 1.00thinking cut off | 0.00no build |
| A-104 | rate limit login | Full-stack | 4 | 0.98 | ●●● | 0.30 | 1.00thinking cut off | 0.82thinking cut off | 1.00thinking cut off |
| A-105 | strict csp | Full-stack | 4 | 0.98 | ●●● | 0.98 | 1.00thinking cut off | 0.98thinking cut off | 1.00thinking cut off |
| A-106 | react error boundary | React | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 0.91thinking cut off |
| A-107 | react portal modal | React | 4 | 1.00 | ●●● | 1.00 | 0.92thinking cut off | 0.54thinking cut off | 1.00thinking cut off |
| A-108 | react external store | React | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-109 | react otp imperative | React | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-110 | react memo grid | React | 4 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 0.08thinking cut off | 1.00thinking cut off |
| A-111 | react use form | React | 4 | 1.00 | ●●● | 0.00no build, hit max tokens | 1.00thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-112 | react query cache | React | 4 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-113 | react lazy retry | React | 4 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00 |
| A-114 | react checkbox tree | React | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-115 | react compound tabs | React | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-116 | react key reset | React | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00 |
| A-117 | react layout tooltip | React | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 0.00thinking cut off | 1.00thinking cut off |
| A-118 | react ts generic table | React | 4 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-119 | react ts reducer union | React | 4 | 1.00 | ●●● | 0.30 | 1.00thinking cut off | 0.30thinking cut off | 1.00 |
| A-120 | next static blog | Next.js | 3 | 1.00 | ●●● | 0.95 | 0.30 | 0.30thinking cut off | 1.00 |
| A-121 | next search params | Next.js | 3 | 1.00 | ●●● | 1.00 | 0.00no build, hit max tokens | 0.79thinking cut off | 0.93 |
| A-122 | next route handlers | Next.js | 3 | 1.00 | ●●● | 1.00 | 0.93thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-123 | next server action form | Next.js | 4 | 1.00 | ●○● | 1.00 | 1.00thinking cut off | 0.09thinking cut off | 1.00thinking cut off |
| A-124 | next middleware auth | Next.js | 4 | 1.00 | ●●● | 0.00no build | 0.87thinking cut off | 0.00no build, thinking cut off | 0.00no build, thinking cut off |
| A-125 | next loading error | Next.js | 4 | 1.00 | ●●● | 1.00 | 1.00 | 1.00thinking cut off | 1.00 |
| A-126 | next client island | Next.js | 3 | 1.00 | ●●● | 1.00 | 0.00no build, thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-127 | next metadata seo | Next.js | 3 | 1.00 | ●●● | 0.30 | 1.00 | 0.00no build | 1.00thinking cut off |
| A-128 | next i18n segments | Next.js | 4 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00thinking cut off |
| A-129 | next layout template | Next.js | 3 | 1.00 | ●●● | 1.00 | 1.00 | 0.00no build | 1.00 |
| A-130 | next intercepting modal | Next.js | 5 | 1.00 | ●●● | 0.00no build, hit max tokens | 1.00 | 1.00 | 1.00 |
| A-131 | next streaming | Next.js | 3 | 1.00 | ●●● | 1.00 | 1.00 | 0.89thinking cut off | 1.00 |
| A-132 | next revalidate | Next.js | 4 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 1.00 |
| A-133 | next cursor api | Next.js | 4 | 1.00 | ●●● | 1.00 | 0.00no build, hit max tokens | 1.00thinking cut off | 1.00thinking cut off |
| A-134 | next config routing | Next.js | 3 | 1.00 | ●●● | 1.00 | 1.00 | 0.00no build, thinking cut off | 1.00 |
| A-135 | next ts typed routes | Next.js | 4 | 1.00 | ●●● | 1.00 | 0.88 | 0.00no build, thinking cut off | 1.00 |
| A-136 | next search params client | Next.js | 3 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 1.00thinking cut off | 0.90thinking cut off |
| A-137 | next use optimistic | Next.js | 4 | 1.00 | ●●● | 1.00 | 1.00thinking cut off | 0.00no build, thinking cut off | 1.00thinking cut off |
| A-138 | next cookie cart | Next.js | 4 | 1.00 | ●●● | 0.30 | 0.30thinking cut off | 0.30thinking cut off | 1.00thinking cut off |
| A-139 | next ts server action | Next.js | 4 | 0.88 | ○○● | 1.00 | 0.30thinking cut off | 0.30thinking cut off | 0.88thinking cut off |
Score is the functional score of the first sample (1.00 = every check passes). Green is a strict pass, amber a near miss at 0.80 or above, red means nothing built. Sonnet runs: ● pass, ○ fail, for each of its three samples.
The same Swift-1.5 Qwen3.8-27B NVFP4 weights served two ways: ariane is vLLM 0.31, "Swift on SGLang" is SGLang 0.5.22 with its own MTP draft head. Both split the model across two RTX 5060 Ti cards. Sonnet 5.5 is the reference. Measured 2026-10-27 with the same webbench, grill and lm-eval harness.
| Measure | Sonnet 5.5 | ariane (vLLM) | Swift on SGLang |
|---|---|---|---|
| Webbench · 134 tasks · first sample | |||
| Strict passes | 129 | 95 | 96 |
| First 100 tasks / new 34 (React + Next.js) | 96 / 33 | 67 / 28 | 68 / 28 |
| Mean score (partial credit) | 0.99 | 0.81 | 0.83 |
| Score at least 0.80 | 133 | 106 | 105 |
| Output built and ran | 134 | 122 | 129 |
| Hit the 32k output cap | 0 | 10 | 5 |
| Median output tokens per task | 2,872 | 14,420 | 14,816 |
| Median decode speed per task (tok/s) | 158 | 66 | 74 |
| Whole suite, wall hours | 0.7 | 9.2 | 7.7 |
| Canonical grill · 23 tasks · 3 runs | |||
| Passes per run | 22, 22, 22 | 22, 22, 22 | 20, 22, 22 |
| Mean | 22.00 | 22.00 | 21.33 |
| Long-horizon agent round, /6 per run | 6, 6, 6 | 5, 5, 5 | 5, 5, 6 |
| Output tokens per grill run | 12,025 | 53,949 | 59,726 |
| Grill task time per run (min) | 1.6 | 12.9 | 14.3 |
| Vision · 52 images · 3 runs | |||
| Passes per run | 43, 43, 44 (7 photos refused by API) | 48, 49, 49 | not run: served text-only |
| lm-eval side axis (20 samples each, not in the grill score) | |||
| GSM8K strict | 1.00 | 0.95 | 0.80 |
| IFEval prompt-level strict | 0.75, 0.75, 0.60 | 0.70 | 0.75 |
| Serving on this box | |||
| Engine | n/a (cloud) | vLLM 0.31.0, TP=2, MTP with 3 speculative tokens | SGLang 0.5.22, TP=2, MTP with 3 speculative tokens |
| Context window | n/a | 182,978 tokens (163,840 when graded) | 131,072 tokens (KV pool 136,569; the MTP draft head loads its own 2.8 GiB embed/head on each card) |
| Concurrent requests | n/a | 4 | 1 (more does not fit with MTP) |
| Vision | yes | yes, up to 4 images per prompt | no, text-only configuration |
Same weights, same score; different tasks. Over the 134 webbench tasks both have finished: 74 passed by both, 21 by ariane only, 22 by Swift on SGLang only, 17 by neither. With one sample each, the two lists differ by sampling noise, so the one-task gap in total passes means nothing. SGLang built more of its projects (129 against 122), hit the output cap half as often and decoded faster per task, but the pass count did not follow.
Sampling differs: webbench sent no temperature to either server; Swift on SGLang then runs the model card's temperature 1.0 (top_p 0.95, top_k 20) with reasoning effort set to the maximum. The grill ran at temperature 0.2 for ariane and at the server default for Swift on SGLang, so the grill rows are not exactly like for like. Neither server had a reasoning budget. SGLang needed a patched launch (--enable-linear-replayssm-spec, single request, 0.98 memory fraction) to fit MTP at all; without MTP its pool grows to 239,516 tokens at about 38 tok/s.