Muse Spark Open Benchmark: Open-Weight Models as Coding Agents An independent evaluation by Leanzero found that Meta's open-weights Muse Spark Open, an 816B-parameter model with 42B active parameters released 15 October, scored 0.091 and 0.0877 out of 1 on the Forge 2.0 agentic coding benchmark, far below the best board score of 0.8523, and failed to complete Gauntlet 7.2 after a provider timeout. Other open models tested locally, including Gemma 4, Granite 4.2 30B, LFM2.5-24B-A2B, Xing 4.0 and Nemotron 3.5 Bolt, fared no better, while a plain Qwen3.8-27B base scored 0.2576 on Forge 2.0 on a 64 GB MacBook. The evaluators noted recurring failure modes such as missing large files, long read-only sessions, tool calls returned as prose, and apps that lint clean but compute wrong numbers. I asked for this review to come only from runs we already had, and in those runs none of the open models we ran this month kept up with the hosted ones as a coding agent. Meta's open-weights Muse Spark Open came out on 15 October with 816B parameters, 42B of them active. It's a different model from the API-only Muse Spark 1.3. It scored 0.091 and 0.0877 out of 1 on our Forge 2.0 agentic coding build, where the best build on the board scores 0.8523. Its Gauntlet 7.2 attempt never got a verdict. Google's Gemma 4, Granite 4.2 30B, LFM2.5-24B-A2B, Xing 4.0 and Nemotron 3.5 Bolt ran locally on our Macs and did no better, and neither did our own Qwen3.8-27B fine-tunes. Of those local runs, only LFM2.5's is on the board. Open weights had a good autumn on paper. Meta's card puts Muse Spark Open at 76.4 on Terminal-Bench 2.1, and Xing's September card claims 75.0 on SWE-bench Verified. All of these models ship a tool-calling chat template. So we pointed them at the two benchmarks we built for agent work: a payments console on the Gauntlet https://leanzero.net/agentic-benchmarks?family=gauntlet&utm source=devto&utm medium=referral&utm campaign=crosspost and a Jira Forge app upgrade on Forge 2.0 https://leanzero.net/agentic-benchmarks?family=forge&utm source=devto&utm medium=referral&utm campaign=crosspost . Most of them fell over long before the scoring got interesting. Maybe you pay for a hosted coding agent and wonder whether an open model on your own hardware could do the job. The result I'd look at first is the plain Qwen3.8-27B base. It scored 0.2576 on the same Forge build on a 64 GB MacBook, nearly three times what Meta's 816B model managed through OpenRouter. It ran on a newer goose test build with thinking on, so that isn't a clean comparison either. Where each model broke is more useful than the scores, because the same breaks kept coming back. A big file never arrives. A model reads for an hour and writes nothing. A tool call comes back as prose, or an app lints clean and shows wrong numbers. Some of those were the models and some were ours, and I've marked which was which. These numbers are from the live boards as I read them on 20 October; the board itself https://leanzero.net/agentic-benchmarks?utm source=devto&utm medium=referral&utm campaign=crosspost is the current word. A pilot is a run we kept off the board, and the table says why. | Model | Where it ran | Benchmark | Result | Status | |---|---|---|---|---| | Muse Spark Open | OpenRouter host Modal | Forge 2.0 | 0.091 https://leanzero.net/agentic-benchmarks/run/brun-be1699f3-17b2-4c26-8e2d-281cb399867c?utm source=devto&utm medium=referral&utm campaign=crosspost and 0.0877 https://leanzero.net/agentic-benchmarks/run/brun-0b073ef4-e4a7-473a-bf6f-7c1887c9a32e?utm source=devto&utm medium=referral&utm campaign=crosspost , 53rd and 54th of 64 | board | | Muse Spark Open | OpenRouter host Modal | Gauntlet 7.2 | no verdict: provider timeout after 13 calls, $0.19 | not on the board | | Muse Wonder hosted, Meta | OpenRouter | Forge 2.0 / Gauntlet 7.2 | 0.4203 https://leanzero.net/agentic-benchmarks/run/brun-790c0f24-e2fe-4365-ab5e-5b8224251f49?utm source=devto&utm medium=referral&utm campaign=crosspost and 0.2366 / 0.7638 https://leanzero.net/agentic-benchmarks/run/brun-fa48d39e-74b5-47db-b303-cd085019d401?utm source=devto&utm medium=referral&utm campaign=crosspost | board | | Muse Spark 1.3 hosted, Meta | OpenRouter | Forge 2.0 / Gauntlet 7.2 | 0.2968 https://leanzero.net/agentic-benchmarks/run/brun-6eef65cd-4d7e-47b7-bafe-79fa04102e9f?utm source=devto&utm medium=referral&utm campaign=crosspost and 0.2202 / 0.5826 https://leanzero.net/agentic-benchmarks/run/brun-08e52c49-5fe2-4533-b97d-0587791ddad8?utm source=devto&utm medium=referral&utm campaign=crosspost | board | | LFM2.5-24B-A2B, 8-bit MLX | Mac Studio, our engine | Gauntlet 7.2 | 0.0187 https://leanzero.net/agentic-benchmarks/run/brun-384794fe-5fbd-4468-8c7b-79fdceccaeb1?utm source=devto&utm medium=referral&utm campaign=crosspost , 40th of 44 | board | | Xing 4.0 29B-A4B, 8-bit MLX | Mac Studio, our engine | Forge 2.0 | 0.0617, no file written and a re-run cancelled | pilot: our memory guard cut it short | | Granite 4.2 30B, 8-bit MLX | Mac Studio, our engine | Forge 2.0 | 0.0617, no file written | pilot: our memory guard cut it short | | Nemotron 3.5 Bolt 74B-A9B, 4-bit MLX | MacBook Pro 128 GB, our engine | Forge 2.0 | 0.0542, full app built | pilot: under our 0.1 bar, build 2 cancelled | | Gemma 4 31B, 8-bit MLX | MacBook Pro 128 GB, our engine | Forge 2.0 | 0.058, v1 rows broken by an unmigrated ledger | pilot: under our 0.1 bar; build 2 cancelled when I dropped the family | | Gemma 4 26B-A4B, 8-bit MLX | MacBook M3 Max 64 GB, our engine | Forge 2.0 | 0.0237, no function loaded | pilot: under our 0.1 bar, build 2 cancelled | | Gemma 4 12B, 26B-A4B and 31B, nine more runs | Studio and both MacBooks, our engine | Forge 2.0 | no verdict: our engine, a goose bug, a loop, cancels | no verdict | | Qwen3.8-27B-Atlassian v2-goose ours | Mac Studio, our engine | Forge 2.0 | stopped at 106 calls, no file written | no verdict | | Qwen3.8-27B-Atlassian v1 ours | Mac Studio, our engine | Gauntlet 7.2 | two attempts, no verdict | no verdict | | Qwen3.8-27B base, our 8-bit conversion | MacBook M3 Max 64 GB, our engine | Forge 2.0 | 0.2576 https://leanzero.net/agentic-benchmarks/run/brun-4616377e-8e7f-4f34-9ca3-26c2dd8b7d46?utm source=devto&utm medium=referral&utm campaign=crosspost and 0.1128 | board | On Forge 2.0, 0.0617 is what the unchanged starter app scores, so a model sitting exactly on it wrote nothing. Xing 4.0 and Granite 4.2 30B sit on it, and Bolt sits just under it. Both scored Gemma 4 builds sit under it too: one for a missing migration, one for a name declared twice. Meta's 76.4 on Terminal-Bench 2.1 comes from Artificial Analysis's own run at xhigh effort in the Terminus 2 harness. The other independent numbers are on different scales. Artificial Analysis gives it 39 on its Intelligence Index the median for comparable models is 19 , and Vals AI's page shows 43.33% accuracy, with 6.57% on the newer, harder Terminal-Bench 4.0. We ran it at "medium" effort in our own harness. The Gauntlet asks for a payments console in 150 calls: two services that sync from a vendor and take its webhooks, plus a 3D view. Most of the work sits in one Python service, app/ledgerd.py , and a good build writes most of it in one go. Muse Spark Open got there fast. In its first minute it wrote the transport layer 91 lines and the notifier service 90 lines . Then it started on the ledger, four times. Three of the attempts opened with one line of reasoning, "Now ledgerd - big." or "Now ledgerd - huge."; the other streamed a short plan for six seconds. Then nothing reached our side for about two minutes until the connection dropped: The provider failed mid-answer Server error: Upstream idle timeout exceeded . Resending — attempt 1 of 3. The unfinished answer was discarded. Our agent, a fork of the open-source goose, resent the same request three times and got the same silence: 121,970, 127,589, 125,370 and 121,134 milliseconds. Then the run ended, and app/ledgerd.py in the tree is still the 23-line stub we hand each model. It cost 19 cents. I wouldn't call that a model result. All 13 Muse Spark Open calls went to one host, Modal, and the error is an upstream idle timeout. The model didn't refuse. It hadn't run out of budget. I think the route sends nothing while the model builds a long tool call. A big file write then looks idle and trips a timeout at around two minutes. I can't prove that from the files. I can't tell whether OpenRouter or Modal raised it. On Forge 2.0, on the same host, its longest completed call took 80 seconds. A ledger the size its siblings wrote would need closer to four minutes. Its siblings did the same thing and got through. Muse Wonder wrote an 845-line ledgerd.py in one write call of 45,841 characters and finished the Gauntlet at 0.7638, 9th of 44. Muse Spark 1.3 wrote a 1,173-line one in one call of 54,910 characters, after a single 168-second call, and finished at 0.5826. Both were served by Meta's own endpoint, where Muse Spark 1.3 survived calls of 394 seconds. Both also ran earlier in October on older goose builds, and Muse Spark 1.3's run sent no effort setting. Our own v1 fine-tune lost the same file to a different limit, on our own engine, two weeks earlier. On 6 October it streamed one write call for 50 minutes: 44,238 characters, 1,021 lines, a complete-looking payments backend. Our engine stopped it at exactly 32,768 tokens, its default output cap when the client sends none, and goose sends none. Only the content arrived, with no path: Error: Failed to parse arguments: missing required field path . Arrived: content . Nothing was changed. My guess is that it writes the content before the path, so the cut took the path with it. Its next words were "I've already written the ledgerd backend." That was half true. A 20,170-byte version from earlier in the run was on disk, and the 44,000-character one was lost. Its next write, a much smaller file, also arrived without a path. So I doubt the cap explains all of it. We raised the cap in our serve script the same morning. On the relaunch, v1 wrote a 900-line ledger in 16 minutes. Then it spent one call, 99 minutes long, trying to "clean up a buggy nested method" it had left as a placeholder returning "Drafts not yet wired." We stopped it there. An agent that writes whole files in one call is betting that everything between it and the disk stays patient. Meta's endpoint was patient. The OpenRouter route to Modal wasn't, and neither was our 32,768 default. If you serve an open model yourself, check your output cap and your proxy's idle timeout before you blame the weights. Our side contributed to that failure too. We didn't pin the OpenRouter route to a host, our benchmark runner doesn't retry a run that ends without a verdict, and our harness filed the stop as "model finished". So Muse Spark Open has no Gauntlet score on our board. Forge 2.0 hands the model a working Jira Forge app a sprint scope widget and a contract for version 2. It asks for a new storage entity and a migration of the v1 rows. It also wants an admin page, a signed CI web trigger, a custom field, a JQL function and a rate budget the app must respect. The model gets 300 calls and an offline dev kit that runs the app's functions and events, and renders its UI Kit pages, without a live site. The prompt tells it to "plan to implement, test, and finish well inside" the 300 calls, and also says "Time is virtual: nothing is graded on wall-clock time." About 33 calls into build 1, Muse Spark Open wrote this in its reasoning: Need to continue implementing other modules quickly but we have limited calls. We need to prioritize delivering something that will score. Build 2, a minute in: "Need to continue building but time limited." Build 1 stopped at 58 calls after 7 minutes 25 seconds, and build 2 stopped at 44 calls after 6 minutes 9 seconds, both times with the model's own summary and no error. Over 80% of the budget was left unused both times. I don't know where that came from. The rush shows in the code. Build 1's event handler calls a function that does nothing: // src/index.js:93-94, Muse Spark Open, Forge 2.0 build 1 async function mirrorToLedger body, cfg { // no-op for now: actual ledger writes happen via sync.js which we can extend to write both entities The comment is accurate, I'll give it that. Build 1 also wrote scopeLedger.js , dosing.js and admin.js , and nothing imports them. The scorer found 0 of 170 event rows in the new ledger, which is what a no-op produces. Build 2 did better there, with 132 of 170 event rows. But it copied the v1 rows with estimate: 0, boardId: '' hard-coded for all of them src/migration.js:67-69 , and its own summary admits it. The admin page is where build 1 went wrong. The dev kit said that the admin function "does not load: Error: Unable to establish a connection with the Custom UI bridge." Lint then warned that the function's render export didn't exist. It fixed the warning and left the problem: js // src/admin-ui.jsx:29 export const render = = {}; Its reasoning a few seconds later: "The harness's own UI Kit host may be different and may pass despite dev tool error." It didn't. Build 2 wrote layout: native where the contract says render: native . It never checked its page. Neither build's admin page ever rendered, so the admin panel scored zero. In build 2 I think that also zeroed the CI trigger. No panel means no "Rotate CI secret" button and no secret. The contract says every request then gets 401, and all of them got 401. Build 1's trigger had a separate bug. It returned { statusCode, body } where the contract asks for { outputKey } . It answered 500 to everything. With that many requirements at zero, the reliability multiplier it scales the score down for every group of failing checks, never below 0.25 hit its floor. You can see it on the run page https://leanzero.net/agentic-benchmarks/run/brun-be1699f3-17b2-4c26-8e2d-281cb399867c?utm source=devto&utm medium=referral&utm campaign=crosspost : 0.3638 tests earned, times 1.0 for criticals, times 0.25. The best build on this benchmark used fewer calls than Muse Spark Open's build 1. jev-router, a router that in our runs sent nearly all its calls to OpenAI's GPT-6.1 Sol our write-up https://leanzero.net/blog/jev-router-benchmark-gpt-6-1-sol?utm source=devto&utm medium=referral&utm campaign=crosspost , scored 0.8523 in 43 calls. It ran the offline dev kit in 26 of them, 70 times in all: the scheduled reconcile, event replays, UI Kit checks, the CI sender. Muse Wonder used 126 and 117 calls, ran the scheduled job 13 and 11 times, and declared the admin page the way the contract says, render: native pointing at src/frontend/admin.jsx . Its admin actions scored 1.0 in both builds. I'd copy jev-router's habit before anything else. Our board groups runs that share the same task, kit, scorer and goose build into comparison groups, and the Muse runs are in different ones. They ran on 14, 15 and 19 October with identical task and scorer hashes, so my guess is the goose build differs. None of the ten Muse Wonder Forge requests we kept carried a reasoning-effort field, so it likely ran at its provider's default, while Muse Spark Open got "medium". jev-router sits in a fourth group. Muse Spark Open lists at the same OpenRouter price as Muse Spark 1.3 $1.25 in, $4.25 out per million tokens; Muse Wonder is $4 and $20 . But Spark Open's calls hit zero cache on Modal while the siblings cached heavily on Meta's host. Meta says the open release is "derived from the Muse Spark model we released in August, with additional safety post-training". Its PyTorch post adds that it "shares the same base model as Muse Spark 1.3". So the base is an unlikely culprit. Was it the safety training, the effort setting or the route? I can't tell from two builds. The card doesn't say. These ran on our own MLX engine a fork of Rapid-MLX through the Goose Swarm app https://leanzero.net/portfolio/goose-local-edition?utm source=devto&utm medium=referral&utm campaign=crosspost , the same app that drives our cloud runs. One setting matters for every Forge run in this section. The app sent no reasoning setting, and our engine switches thinking off on any request with tools unless told otherwise. So Xing, Granite and Bolt all ran Forge 2.0 with thinking off, while Muse Spark Open got "medium". I didn't connect it to these runs until we reviewed them, though we'd written the behaviour down in September for our training data. Liquid's model has 24B parameters with 2.45B active, 30 short-convolution layers and 10 attention layers, and it always reasons before answering. On the Mac Studio it decoded at 85.7 tokens a second with a peak of 27.0 GB, the fastest local model we ran. Its whole run took 14 seconds. After about a thousand tokens of reasoning, its answer was this, as text home folder redacted : shell command='ls -la /Users/