<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: MilkyWay008</title>
    <description>The latest articles on DEV Community by MilkyWay008 (@milkyway008).</description>
    <link>https://dev.to/milkyway008</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4075791%2F36d12367-22b5-4e63-b6b6-ee85957624b5.jpg</url>
      <title>DEV Community: MilkyWay008</title>
      <link>https://dev.to/milkyway008</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/milkyway008"/>
    <language>en</language>
    <item>
      <title>Qwen Code 400 "failed to parse grammar" against llama.cpp? Here's the fix</title>
      <dc:creator>MilkyWay008</dc:creator>
      <pubDate>Wed, 02 Sep 2026 17:05:56 +0000</pubDate>
      <link>https://dev.to/milkyway008/qwen-code-400-failed-to-parse-grammar-against-llamacpp-heres-the-fix-3le0</link>
      <guid>https://dev.to/milkyway008/qwen-code-400-failed-to-parse-grammar-against-llamacpp-heres-the-fix-3le0</guid>
      <description>&lt;p&gt;If you run Qwen Code against a local llama.cpp server, you may have woken up one morning to every request dying with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API Error: 400 Failed to initialize samplers: failed to parse grammar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before any token comes back. The model never even starts. And here's the annoying part. The same model works fine if you curl the endpoint directly, and it works fine if you're running a different model like gemma. So it's natural to blame the model, the server, the quant, whatever.&lt;/p&gt;

&lt;p&gt;It's none of those. This is a tool-schema bug in Qwen Code, and an auto-update is what shipped it to you. Here's what's actually happening, plus the one-line settings fix that survives the updater.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's actually breaking
&lt;/h2&gt;

&lt;p&gt;llama.cpp doesn't do free-form JSON tool calling. When a client sends tool schemas, llama.cpp compiles every registered tool's JSON Schema into one big constrained-decoding grammar at sampler init. That grammar has to parse before the model generates a single token.&lt;/p&gt;

&lt;p&gt;Qwen Code 0.22.3 registers a bunch of built-in tools, and a few of them carry string &lt;code&gt;maxLength&lt;/code&gt; limits way past what llama.cpp's grammar converter can represent. &lt;code&gt;report_findings&lt;/code&gt; has &lt;code&gt;maxLength: 2000/4000/4096&lt;/code&gt;. &lt;code&gt;send_message&lt;/code&gt; has 65536. &lt;code&gt;loop_wakeup&lt;/code&gt; has 10000. The converter chokes, the grammar fails to parse, and you get your 400 before any generation starts.&lt;/p&gt;

&lt;p&gt;The Qwen maintainer confirmed it. Strip those length limits and the same tool set parses clean. Include &lt;code&gt;report_findings&lt;/code&gt; and it fails with exactly this error.&lt;/p&gt;

&lt;p&gt;That's also why gemma "works fine". The failure isn't model-specific, it's grammar-size-dependent. Models whose tool set stays under the cap never see it. Models pulling in the heavy built-ins trip over it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix: defer the tool schemas
&lt;/h2&gt;

&lt;p&gt;Qwen Code ships a &lt;code&gt;tools.eager&lt;/code&gt; setting that controls which tool schemas go into that initial request. The counterintuitive part: set it to an empty list.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tools"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"eager"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Put that in &lt;code&gt;~/.qwen/settings.json&lt;/code&gt; (a project-level &lt;code&gt;.qwen/settings.json&lt;/code&gt; works too, same shape), restart Qwen Code, done.&lt;/p&gt;

&lt;p&gt;An empty &lt;code&gt;eager&lt;/code&gt; list doesn't disable anything. It defers every non-exempt built-in tool schema out of the initial request, so the grammar stays small enough to parse, while the tools themselves stay registered and callable on demand. Think of it as: don't announce every tool up front, resolve them when actually used.&lt;/p&gt;

&lt;p&gt;Two gotchas while you're in there:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don't bother with &lt;code&gt;"tools": { "core": [] }&lt;/code&gt;. It doesn't shrink the eager schemas. People still got the 400 with 23 schemas riding in the request.&lt;/li&gt;
&lt;li&gt;If you're on an older workaround that used &lt;code&gt;permissions.allow&lt;/code&gt; to shrink schemas, that's dead. &lt;code&gt;permissions.allow&lt;/code&gt; is pure auto-approval now, it no longer affects schemas. &lt;code&gt;tools.eager&lt;/code&gt; is the knob.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  But I'm on auto-update and it keeps coming back
&lt;/h2&gt;

&lt;p&gt;This is the part that stings. The broken behavior shipped in a stable auto-update (0.22.3), and the actual fix only lands in the nightly channel so far. Pin stable and you stay broken. Let it auto-update and it drags you back onto the broken build.&lt;/p&gt;

&lt;p&gt;The merged fix (it strips the &lt;code&gt;report_findings&lt;/code&gt; maxLength limits) is in the nightly line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;-g&lt;/span&gt; @qwen-code/qwen-code@nightly
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prefer stable? Then the &lt;code&gt;tools.eager: []&lt;/code&gt; workaround above carries you through. It's version-independent and doesn't fight the updater.&lt;/p&gt;

&lt;p&gt;One honest caveat. The merged fix only strips the limits on &lt;code&gt;report_findings&lt;/code&gt;. A couple of other built-in tools still carry big maxLength values (&lt;code&gt;send_message&lt;/code&gt; at 65536, for example), so on an exotic model and server combo the grammar could still overflow. Keeping &lt;code&gt;eager: []&lt;/code&gt; in your settings is cheap insurance until the stable release catches up.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern worth remembering
&lt;/h2&gt;

&lt;p&gt;This whole class of bug is going to keep showing up as more coding agents target local llama.cpp servers. The client sends every tool schema it knows, llama.cpp has to compile them all into one grammar, and one oversized schema takes down the whole request. So if you ever see "failed to parse grammar" from a llama.cpp-based server, your first suspect shouldn't be the model. It's whatever JSON schema payload your client just sent. Check the request, look for the giant maxLength fields, and find your client's version of &lt;code&gt;tools.eager&lt;/code&gt; to defer them.&lt;/p&gt;




&lt;p&gt;I hit this myself running Qwen Code against a local server after an auto-update, and the error message pointed everywhere except the actual cause. The fix is tracked in &lt;a href="https://github.com/QwenLM/qwen-code/issues/10530" rel="noopener noreferrer"&gt;qwen-code#10530&lt;/a&gt; and &lt;a href="https://github.com/QwenLM/qwen-code/issues/10435" rel="noopener noreferrer"&gt;qwen-code#10435&lt;/a&gt;; the upstream fix is &lt;a href="https://github.com/QwenLM/qwen-code/pull/10275" rel="noopener noreferrer"&gt;PR #10275&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
    <item>
      <title>Codex CLI bricks every command after an update — the wire_api config trap</title>
      <dc:creator>MilkyWay008</dc:creator>
      <pubDate>Tue, 01 Sep 2026 17:05:08 +0000</pubDate>
      <link>https://dev.to/milkyway008/codex-cli-bricks-every-command-after-an-update-the-wireapi-config-trap-3d9n</link>
      <guid>https://dev.to/milkyway008/codex-cli-bricks-every-command-after-an-update-the-wireapi-config-trap-3d9n</guid>
      <description>&lt;p&gt;If you updated Codex CLI recently and suddenly every command dies with &lt;code&gt;Error loading config.toml&lt;/code&gt;, it's probably not your setup. One stale line in a config block you might not even use anymore is enough to brick the whole thing. I ran into this exact pattern, and here's the fix.&lt;/p&gt;

&lt;h2&gt;
  
  
  The symptom
&lt;/h2&gt;

&lt;p&gt;Upgraded to Codex 0.151.0, then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error loading config.toml: `wire_api = "chat"` is no longer supported.
How to fix: set `wire_api = "responses"` in your provider config.
More info: https://github.com/openai/codex/discussions/7782
in `model_providers.token-plan.wire_api`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every command dies at config load. &lt;code&gt;codex login status&lt;/code&gt; dies. &lt;code&gt;codex exec&lt;/code&gt; dies. Only &lt;code&gt;codex doctor&lt;/code&gt; still runs, and it reports &lt;code&gt;config.load: fail&lt;/code&gt;. If you've got a provider block in &lt;code&gt;config.toml&lt;/code&gt; that you stopped using months ago, it still gets validated on startup, and one stale value takes everything down with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The root cause
&lt;/h2&gt;

&lt;p&gt;Codex validates every &lt;code&gt;[model_providers.*]&lt;/code&gt; block in &lt;code&gt;config.toml&lt;/code&gt; at startup, not just the one you're actively using. And &lt;code&gt;wire_api = "chat"&lt;/code&gt; was removed from the CLI entirely. Chat/completions support is gone as of early 2026. So an entry that's never referenced by your active model provider, any profile, or &lt;code&gt;--model&lt;/code&gt; still trips the validator and kills every command.&lt;/p&gt;

&lt;p&gt;There's no &lt;code&gt;codex config migrate&lt;/code&gt; command, no migration path. You fix it by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Locate the config.&lt;/strong&gt; &lt;code&gt;%USERPROFILE%\.codex\config.toml&lt;/code&gt; on Windows, &lt;code&gt;~/.codex/config.toml&lt;/code&gt; on Linux/macOS. If &lt;code&gt;CODEX_HOME&lt;/code&gt; is set, that overrides the directory.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Find the stale block.&lt;/strong&gt; Look for &lt;code&gt;[model_providers."&amp;lt;name&amp;gt;"]&lt;/code&gt; blocks with &lt;code&gt;wire_api = "chat"&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[model_providers.token-plan]&lt;/span&gt;
&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"token-plan"&lt;/span&gt;
&lt;span class="py"&gt;wire_api&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"chat"&lt;/span&gt;        &lt;span class="c"&gt;# &amp;lt;-- this line&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Fix it one of two ways:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;Delete the whole block if you don't use that provider anymore, or&lt;/li&gt;
&lt;li&gt;Change the line to the currently valid value:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="py"&gt;wire_api&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"responses"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Flipping just that one line gets &lt;code&gt;codex exec&lt;/code&gt; moving again. Both fixes are confirmed by people who hit this.&lt;/p&gt;

&lt;h2&gt;
  
  
  The lesson
&lt;/h2&gt;

&lt;p&gt;When a CLI releases a version that removes a config value, check your whole config file for stale entries, not just the section you're actively using. Eager validation means an unused block can still brick startup. And if an upgrade doc says a value is deprecated, plan to remove it before you upgrade, not after the tool stops working.&lt;/p&gt;

&lt;p&gt;Full thread: &lt;a href="https://github.com/openai/codex/issues/41816" rel="noopener noreferrer"&gt;https://github.com/openai/codex/issues/41816&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
    <item>
      <title>jinja2 imports fine but jinja2.compiler is missing: the Python partial-install trap</title>
      <dc:creator>MilkyWay008</dc:creator>
      <pubDate>Mon, 31 Aug 2026 17:07:26 +0000</pubDate>
      <link>https://dev.to/milkyway008/jinja2-imports-fine-but-jinja2compiler-is-missing-the-python-partial-install-trap-2hng</link>
      <guid>https://dev.to/milkyway008/jinja2-imports-fine-but-jinja2compiler-is-missing-the-python-partial-install-trap-2hng</guid>
      <description>&lt;h1&gt;
  
  
  jinja2 imports fine but jinja2.compiler is missing: the Python partial-install trap
&lt;/h1&gt;

&lt;p&gt;There's a classic failure that shows up over and over in Python CLI bug trackers, and it's almost never a bug in the tool. Someone posted it recently in the aider repo. Windows 10, Python 3.10.9, no venv, plain system install. Every launch died instantly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ModuleNotFoundError: No module named 'jinja2.compiler'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The traceback pointed through litellm -&amp;gt; arize -&amp;gt; jinja2.environment. And the odd part: &lt;code&gt;import jinja2&lt;/code&gt; worked fine. Only the &lt;code&gt;compiler&lt;/code&gt; submodule was missing.&lt;/p&gt;

&lt;p&gt;That's the tell. When a top-level package imports cleanly but one of its submodules is missing, the tool you're running is probably innocent. Your environment is broken. Two things cause this, and both take about two minutes to fix.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cause 1: a partial install
&lt;/h2&gt;

&lt;p&gt;pip was mid-write when something interrupted it. A dropped connection, a killed terminal, a power blip. Or an upgrade went sideways and left the package half-installed: the .dist-info metadata landed, some modules landed, but compiler.py never did. Python doesn't complain until something actually tries to import the file that isn't there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cause 2: shadowing
&lt;/h2&gt;

&lt;p&gt;Python adds the directory you're running from to the front of the module search path. If there's a stray &lt;code&gt;jinja2.py&lt;/code&gt; or a &lt;code&gt;jinja2/&lt;/code&gt; folder sitting in that folder, Python imports it instead of the real installed package. The imposter has no submodule, so the tool dies with a confusing error.&lt;/p&gt;

&lt;p&gt;The issue thread even had a diagnosis comment naming exactly this. GitHub auto-minimized it as spam, which is its own kind of annoyance, but the content was right.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix, in order
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. See where the package actually resolves from&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"import jinja2; print(jinja2.__file__)"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the path is your current working directory or anything outside site-packages, you've got shadowing. Run the tool from a different folder, or delete the stray file. Check for a folder too, both count.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Force a clean reinstall&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;pip skips packages it thinks are already installed. The flag that makes it reinstall anyway:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--upgrade&lt;/span&gt; &lt;span class="nt"&gt;--force-reinstall&lt;/span&gt; jinja2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then confirm the submodule imports now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"import jinja2.compiler"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If nothing prints and nothing raises, you're done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Check for other broken deps while you're here&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; pip check
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This lists packages whose requirements aren't satisfied. If something else is half-broken, you want to know now, not after the next random crash.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. The proper long-term fix: a venv&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're running tools against a system Python that's been through years of installs and upgrades, this will bite again eventually. The clean move is to stop using system Python for this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; venv venv
venv&lt;span class="se"&gt;\S&lt;/span&gt;cripts&lt;span class="se"&gt;\a&lt;/span&gt;ctivate     &lt;span class="c"&gt;# Windows&lt;/span&gt;
&lt;span class="c"&gt;# Linux/macOS: source venv/bin/activate&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;aider-chat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything lives in one folder, the mess of your system site-packages can't reach in, and if it ever breaks you delete the folder and start over. That's also what the folks in the issue thread recommended.&lt;/p&gt;

&lt;h2&gt;
  
  
  Caveats
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;If reinstalling jinja2 doesn't fix it, reinstall the top-level app instead. That drags in a consistent set of deps and often repairs the whole mess.&lt;/li&gt;
&lt;li&gt;The original reporter never posted back which fix worked for them, so I can't say whether partial-install or shadowing was theirs. Both are cheap to test.&lt;/li&gt;
&lt;li&gt;This isn't jinja2-specific. Any "package imports fine but submodule is missing" error, pydantic or requests or whatever, has the same two causes and the same fix path.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The general lesson
&lt;/h2&gt;

&lt;p&gt;Next time a Python CLI dies at startup with a ModuleNotFoundError for something you know is installed, don't go read the tool's source. Ask two questions: where is it resolving from, and is the install actually complete? One command answers the first, one flag fixes the second.&lt;/p&gt;

&lt;p&gt;Original thread: &lt;a href="https://github.com/Aider-AI/aider/issues/5653" rel="noopener noreferrer"&gt;https://github.com/Aider-AI/aider/issues/5653&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>tutorial</category>
      <category>ai</category>
      <category>devops</category>
    </item>
    <item>
      <title>Aider Says 'No Endpoints Found' — Your Model Was Retired, Here's How to Fix It</title>
      <dc:creator>MilkyWay008</dc:creator>
      <pubDate>Sun, 30 Aug 2026 17:08:17 +0000</pubDate>
      <link>https://dev.to/milkyway008/aider-says-no-endpoints-found-your-model-was-retired-heres-how-to-fix-it-p13</link>
      <guid>https://dev.to/milkyway008/aider-says-no-endpoints-found-your-model-was-retired-heres-how-to-fix-it-p13</guid>
      <description>&lt;p&gt;Your AI coding tool was working fine yesterday. Today it 404s on every request with something like "No endpoints found for anthropic/claude-3-opus." and you're wondering what broke.&lt;/p&gt;

&lt;p&gt;Nothing broke on your end. The model you had configured was retired by the provider, and your tool is just relaying the bad news.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually happened
&lt;/h2&gt;

&lt;p&gt;Aider (and most agent CLIs) route chat through a provider like OpenRouter. OpenRouter doesn't actually host models — it fronts providers — and when a model is retired, it usually stays in the catalog with an empty endpoint list. Every request against it fails with the same 404:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;httpx.HTTPStatusError: Client error '404 Not Found' for url 'https://openrouter.ai/api/v1/chat/completions'
litellm.OpenRouterException: {"error":{"message":"No endpoints found for anthropic/claude-3-opus.","code":404},...}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That "No endpoints found" message is OpenRouter's standard response for a model that no longer exists. It's not an aider bug, it's not a config typo, it's not your API key. The model slug you're using is gone.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to check in 10 seconds
&lt;/h2&gt;

&lt;p&gt;Confirm the slug is actually dead before you touch anything:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://openrouter.ai/api/v1/models | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; claude-3-opus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Zero hits means the model is gone from the catalog. (You can also open the model's page in a browser — it'll 404.)&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;List the models your tool can actually use now.&lt;/strong&gt; For aider:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   aider &lt;span class="nt"&gt;--list-models&lt;/span&gt; openrouter/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pick a current slug&lt;/strong&gt; and switch to it. For aider:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   aider &lt;span class="nt"&gt;--model&lt;/span&gt; openrouter/anthropic/claude-opus-4.7
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or edit your config file / &lt;code&gt;AIDER_MODEL&lt;/code&gt; env var to match.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fix the misleading crash that hides the real error.&lt;/strong&gt; On Windows, aider renders errors through Rich, and the legacy console path can throw a second &lt;code&gt;OSError: [Errno 22]&lt;/code&gt; while printing the traceback. It looks like a second bug but it's just console-render noise. Run from Windows Terminal instead of the old conhost (or use &lt;code&gt;aider --no-color&lt;/code&gt;) and the real error shows up cleanly.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The general rule: when a provider-backed agent CLI starts 404ing at the API, check the model slug first. It's the cheapest thing to test, and retired slugs are a recurring fact of life — providers bump model generations constantly, and old IDs don't stay live forever.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>tutorial</category>
      <category>llm</category>
    </item>
    <item>
      <title>LM Studio silently broke my model load after a runtime auto-update — the NTSTATUS exit code decode</title>
      <dc:creator>MilkyWay008</dc:creator>
      <pubDate>Sat, 29 Aug 2026 17:09:27 +0000</pubDate>
      <link>https://dev.to/milkyway008/lm-studio-silently-broke-my-model-load-after-a-runtime-auto-update-the-ntstatus-exit-code-decode-4jhh</link>
      <guid>https://dev.to/milkyway008/lm-studio-silently-broke-my-model-load-after-a-runtime-auto-update-the-ntstatus-exit-code-decode-4jhh</guid>
      <description>&lt;p&gt;If you run local LLMs on Windows with an NVIDIA GPU, you've probably seen LM Studio's "runtime extension packs." They're the bundled CUDA/ROCm/Vulkan builds of llama.cpp that actually run your models. And by default, LM Studio auto-updates them in the background.&lt;/p&gt;

&lt;p&gt;That bit me on an RTX 5090. One day a model that had loaded fine for days suddenly refused to load. The dialog just said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Failed to load the model / Error loading model. / (Exit code: 18446744072635812000). Unknown error. Try a different model and/or config.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No hint of what the number meant. No hint of what broke. The model file was untouched, config untouched, driver untouched. The only thing that changed was the runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  The exit code is a Windows NTSTATUS, not a random number
&lt;/h2&gt;

&lt;p&gt;That huge unsigned value isn't a random roll of the dice. Convert it to hex and you get &lt;code&gt;0xFFFF_FFFF_C000_08A0&lt;/code&gt; — a sign-extended NTSTATUS. The low 32 bits, &lt;code&gt;0xC00008A0&lt;/code&gt;, are the actual error status.&lt;/p&gt;

&lt;p&gt;NTSTATUS values are how Windows reports driver and kernel-level failures. The UI doesn't translate them, so you get a wall of digits. If you ever see a giant unsigned exit code like this in a local-LLM tool, convert it to hex and check the low 32 bits. That tells you you're dealing with a driver/CUDA-level failure, not something wrong with your model file.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real error was hiding in the logs
&lt;/h2&gt;

&lt;p&gt;The dialog didn't tell me anything useful, but LM Studio's Developer &amp;gt; Local Server logs did. There I found the actual CUDA error: &lt;code&gt;CUDA error: shared object initialization failed&lt;/code&gt; in &lt;code&gt;launch_fattn&lt;/code&gt; (the flash-attention kernel), with the model's Gated Delta Net fallback path logged as unsupported and disabled. The runtime was crashing in a specific kernel on the Blackwell architecture.&lt;/p&gt;

&lt;p&gt;Cross-referencing the upstream llama.cpp issue tracker confirmed it: the CUDA 12 runtime v2.27.1 has a broken fallback path on RTX 5090 (sm_120). It's not your model. It's not your config. It's the runtime build.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix: roll back the runtime pack
&lt;/h2&gt;

&lt;p&gt;LM Studio runtime extension packs are versioned, and you can pin an older one. In LM Studio: &lt;strong&gt;Settings &amp;gt; Runtime&lt;/strong&gt;, pick the older CUDA 12 build (v2.25.2 worked for me), and the model loads again immediately. No re-download of the model, no config changes, no driver reinstall.&lt;/p&gt;

&lt;p&gt;While you're in there, turn off &lt;strong&gt;"Auto-update selected Runtime Extension Packs"&lt;/strong&gt;. It defaults to on, and it's what silently swapped in the broken build in the first place. Leave it off until the fixed runtime ships.&lt;/p&gt;

&lt;h2&gt;
  
  
  The general lesson
&lt;/h2&gt;

&lt;p&gt;Any local-LLM tool that bundles a runtime — LM Studio, Ollama, llama.cpp servers — can silently swap that runtime on update. The failure signature to watch for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A model that loaded fine suddenly fails, with nothing else changed.&lt;/li&gt;
&lt;li&gt;A cryptic huge unsigned exit code and "Unknown error" in the UI.&lt;/li&gt;
&lt;li&gt;Logs that name a specific CUDA kernel or a "not supported / disabled" fallback path.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you see that combo, don't re-download the model and don't reinstall drivers. Check the runtime version first. Roll it back, disable the auto-update, and carry on. New GPU architectures (Blackwell included) are where these runtime regressions bite hardest, because the fallback paths are new and rarely exercised until real users hit them.&lt;/p&gt;

&lt;p&gt;If you want the full thread: &lt;a href="https://github.com/lmstudio-ai/lmstudio-bug-tracker/issues/2234" rel="noopener noreferrer"&gt;lmstudio-bug-tracker issue #2234&lt;/a&gt; and the upstream &lt;a href="https://github.com/ggml-org/llama.cpp/issues/26481" rel="noopener noreferrer"&gt;llama.cpp issue #26481&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>windows</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Your Browser Automation Hangs After an Update? Check the Keychain Flags</title>
      <dc:creator>MilkyWay008</dc:creator>
      <pubDate>Fri, 28 Aug 2026 17:14:43 +0000</pubDate>
      <link>https://dev.to/milkyway008/your-browser-automation-hangs-after-an-update-check-the-keychain-flags-341h</link>
      <guid>https://dev.to/milkyway008/your-browser-automation-hangs-after-an-update-check-the-keychain-flags-341h</guid>
      <description>&lt;h1&gt;
  
  
  Your Browser Automation Started Hanging After an Update? Blame the Keychain
&lt;/h1&gt;

&lt;p&gt;If you run browser automation on a Mac or Linux box, you may have hit this one recently: your script worked fine for months, then after a library update the headless browser just... never starts. No error, no crash, just a hang and a timeout 30 seconds later. Or worse: on a desktop, a macOS Keychain password dialog pops up every time a fresh browser profile launches, asking for a password your script doesn't know.&lt;/p&gt;

&lt;p&gt;I hit this exact thing with browser-use, and it took a while to track down, because nothing about the failure looks like what it is. This is what's happening and how to fix it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you see
&lt;/h2&gt;

&lt;p&gt;Symptoms vary by platform, but the shape is the same:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Headless / CI:&lt;/strong&gt; &lt;code&gt;BrowserSession.start()&lt;/code&gt; hangs. The Chromium process starts, but the CDP debug port never opens. The watchdog eventually gives up with something like &lt;code&gt;TIMEOUT ERROR - Handling took more than 30.0s&lt;/code&gt; or &lt;code&gt;Browser did not start within 30 seconds&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactive desktop (macOS):&lt;/strong&gt; a Keychain password prompt pops on every launch of a fresh browser profile. Say no or let it sit, and you get the hang.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Linux with a keyring daemon:&lt;/strong&gt; same hang when gnome-keyring or kwallet is registered.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's fully deterministic. One minute the browser starts in a second, the next it blocks forever.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's actually happening
&lt;/h2&gt;

&lt;p&gt;The root cause is in the browser automation library's default Chrome arguments. &lt;code&gt;browser-use&lt;/code&gt; used to launch Chromium with two flags:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;--use-mock-keychain&lt;/span&gt;
&lt;span class="nt"&gt;--password-store&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;basic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These tell Chromium to skip the OS credential store entirely. Browser automation doesn't need to decrypt your saved passwords; a fresh temporary profile has nothing in the keychain anyway.&lt;/p&gt;

&lt;p&gt;Then a PR (browser-use#3225, "fix-auth") removed both flags. The intent was reasonable: if you point the tool at a real user Chrome profile, Chromium needs keychain access to decrypt saved passwords and cookies. But the flags were removed globally, not just for real profiles. So now browser-use-managed profiles (temp dirs, the default profile dir) also touch the OS credential store.&lt;/p&gt;

&lt;p&gt;And here's the kicker: Chromium's profile init &lt;strong&gt;synchronously&lt;/strong&gt; calls into the credential store on startup. On a headless box with no interactive session to answer, that call blocks forever instead of failing fast. The browser never finishes starting, so the CDP port never opens, and the 30-second watchdog does its thing.&lt;/p&gt;

&lt;p&gt;You can verify it yourself. Run Chromium with the flags:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CHROME_BIN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--headless&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;new &lt;span class="nt"&gt;--use-mock-keychain&lt;/span&gt; &lt;span class="nt"&gt;--password-store&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;basic &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--user-data-dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;mktemp&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="nt"&gt;--remote-debugging-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;9334
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CDP responds in about a second. Drop the flags and the same command just sits there.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix
&lt;/h2&gt;

&lt;p&gt;The proper fix (re-adding the flags for managed profiles only) is still in review upstream as of this writing — three PRs have been proposed and none merged. So for now, the workaround is on your side.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 1: pass the flags yourself.&lt;/strong&gt; With browser-use, &lt;code&gt;BrowserProfile&lt;/code&gt; accepts extra args:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;browser_use&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BrowserProfile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Browser&lt;/span&gt;

&lt;span class="n"&gt;profile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BrowserProfile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;headless&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--use-mock-keychain&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--password-store=basic&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Browser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Option 2: pin the version.&lt;/strong&gt; The regression shipped in the flag-removal PR, so anything after that release is affected. If you don't need the newest features, pin to the last version before the change and move on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Option 3: patch it locally.&lt;/strong&gt; If you're stuck on a newer version, add the two flags back to &lt;code&gt;CHROME_DEFAULT_ARGS&lt;/code&gt; in &lt;code&gt;browser_use/browser/profile.py&lt;/code&gt;. It's two lines, and it'll survive until a proper fix lands.&lt;/p&gt;

&lt;h2&gt;
  
  
  The broader lesson
&lt;/h2&gt;

&lt;p&gt;This one generalizes beyond browser-use. If an automation tool starts hanging or prompting after an update, and the process is alive but never becomes ready, check the &lt;strong&gt;launch arguments&lt;/strong&gt; before you blame the network or the tool itself. Tools that add flags to make real-user features work can silently break the disposable-profile path — the default case for automation.&lt;/p&gt;

&lt;p&gt;Also worth remembering: when a headless process blocks on a credential store, the failure signature is a hang, not an error. No log line tells you "I'm waiting for keychain access." The process is just stuck in a syscall, and only a launch-arg diff (or a thread dump showing the stuck call) reveals it.&lt;/p&gt;

&lt;p&gt;If you're building tooling that wraps Chromium, keep the mock-keychain flags for managed profiles. Real user profiles need the keychain; disposable automation profiles never do, and mixing the two is how you get 30-second hangs in CI at 2am.&lt;/p&gt;

&lt;p&gt;The issue is tracked here: &lt;a href="https://github.com/browser-use/browser-use/issues/5415" rel="noopener noreferrer"&gt;browser-use/browser-use#5415&lt;/a&gt;. If you're hitting this, thumbs-up the issue and the fix PRs so it actually lands.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
    <item>
      <title>Windows freezes and shuts down after an update? Here's the 5-step fix</title>
      <dc:creator>MilkyWay008</dc:creator>
      <pubDate>Thu, 27 Aug 2026 17:15:07 +0000</pubDate>
      <link>https://dev.to/milkyway008/windows-freezes-and-shuts-down-after-an-update-heres-the-5-step-fix-1ki6</link>
      <guid>https://dev.to/milkyway008/windows-freezes-and-shuts-down-after-an-update-heres-the-5-step-fix-1ki6</guid>
      <description>&lt;h1&gt;
  
  
  Windows freezes and shuts down after an update? Here's the 5-step fix
&lt;/h1&gt;

&lt;p&gt;Every few months the same post shows up in the help forums: "Updated Windows, now my PC randomly freezes, sometimes powers off by itself, and the clock is wrong." Zero troubleshooting done, a dozen replies telling them to reinstall Windows.&lt;/p&gt;

&lt;p&gt;Before you nuke the install, there's a method that sorts out most of these. It takes about an hour, costs nothing, and it starts with figuring out whether Windows actually broke, or whether the update just exposed a driver that was always one bad day away from crashing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's actually going on
&lt;/h2&gt;

&lt;p&gt;When a cumulative update lands and your machine starts hard-freezing, the freeze (trackpad, keyboard, power button all dead) is almost always a driver or firmware component that stopped responding after the update changed how it talks to the kernel. Windows records that as a watchdog timeout. The random shutdowns are usually the same story, or the machine's thermal/power protection tripping.&lt;/p&gt;

&lt;p&gt;The clock drift is a separate symptom. The Windows Time service gets into a bad state, or the system never syncs properly after all those unclean shutdowns. Don't let it distract you, but don't ignore it either, fix the freezes first, then fix the clock.&lt;/p&gt;

&lt;p&gt;Here's the order that works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1. Event Viewer first, always
&lt;/h2&gt;

&lt;p&gt;Open &lt;code&gt;eventvwr.msc&lt;/code&gt;, go to Windows Logs &amp;gt; System, and look at timestamps around the freezes. You're hunting for two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kernel-Power Event 41&lt;/strong&gt; means the machine lost power without a clean shutdown. It's the "unexpected shutdown" event, and on its own it just tells you something died.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WHEA-Logger errors&lt;/strong&gt; are hardware failures reported by the CPU/chipset. If you see those, you're looking at a hardware problem, not an update problem, and the fix path changes completely.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The giveaway for the update-caused case is a watchdog bugcheck like &lt;code&gt;0x1CA&lt;/code&gt; (SYNTHETIC_WATCHDOG_TIMEOUT) pointing at a driver that stopped responding. Event 41 plus no WHEA errors plus a watchdog bugcheck after a fresh update = driver hang, not dead hardware. That's the case this article covers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2. Roll back the suspect update
&lt;/h2&gt;

&lt;p&gt;Windows Update keeps the last few cumulative updates around for exactly this. Settings &amp;gt; Windows Update &amp;gt; Update history &amp;gt; Uninstall updates, pick the most recent one, uninstall it, and pause updates for a week:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;&lt;span class="nb"&gt;wusa&lt;/span&gt; &lt;span class="na"&gt;/uninstall /kb&lt;/span&gt;:5121003
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(substitute the KB number you're actually rolling back). Then Settings &amp;gt; Windows Update &amp;gt; Pause updates, and use the machine normally for a couple of days.&lt;/p&gt;

&lt;p&gt;Does the freezing stop? Then that update was the trigger. You can reinstall it later, but first do Step 5, because the update didn't cause the bug, it exposed one.&lt;/p&gt;

&lt;p&gt;If it still freezes after the rollback, you've ruled out the update, and you're into hardware territory: RAM test (MemTest86), temperature check, PSU suspicion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3. Fix the clock
&lt;/h2&gt;

&lt;p&gt;Once the machine is stable again, resync the time from an admin command prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;&lt;span class="nb"&gt;w32tm&lt;/span&gt; &lt;span class="na"&gt;/resync
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the clock keeps drifting or resets to the BIOS default when the machine is fully powered off, it's a CMOS battery, a $3 part on most laptops. If it just drifts while running, the time service is unhealthy, and a resync usually fixes it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4. Repair the system image
&lt;/h2&gt;

&lt;p&gt;Unclean shutdowns corrupt files. Before you blame the drivers, let Windows fix itself. Boot into Safe Mode, open an admin command prompt, and run these in order:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;&lt;span class="kd"&gt;DISM&lt;/span&gt; &lt;span class="na"&gt;/Online /Cleanup-Image /RestoreHealth
&lt;/span&gt;&lt;span class="nb"&gt;sfc&lt;/span&gt; &lt;span class="na"&gt;/scannow
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;DISM repairs the image, sfc fixes system files against the repaired image. Run DISM first, then sfc. They take a while, let them finish.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5. The actual fix: OEM drivers and BIOS
&lt;/h2&gt;

&lt;p&gt;Here's the part people skip. A cumulative update doesn't usually write your drivers, but it can change kernel behavior enough that an old, buggy driver stops working. The lasting fix is almost always the laptop maker's own updates:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to your OEM support page (Acer, Dell, HP, Lenovo, whoever).&lt;/li&gt;
&lt;li&gt;Update the chipset driver, the GPU driver, and the storage driver.&lt;/li&gt;
&lt;li&gt;Update the BIOS. This is the big one. Freeze-after-update issues that survive driver updates are frequently fixed in BIOS releases.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then reinstall that Windows update you rolled back in Step 2 and test again.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest caveat
&lt;/h2&gt;

&lt;p&gt;This method assumes the update is the trigger, not the cause. If you roll back and the machine still freezes, or you see WHEA errors, stop treating it as a software problem. Check temperatures, run a memory test, and if it's still under warranty, use it.&lt;/p&gt;

&lt;p&gt;Also worth saying: this is the procedure, not a promise. Your exact laptop may have a weird quirk this doesn't cover. But in my experience, most of these posts end up being a driver that finally got caught, and the OEM's chipset + BIOS updates fix what the rollback only masked.&lt;/p&gt;

&lt;p&gt;Start with Event Viewer, not the reinstall USB.&lt;/p&gt;

</description>
      <category>windows</category>
      <category>tutorial</category>
      <category>ai</category>
    </item>
    <item>
      <title>Windows Smart App Control Is Blocking Your Python CLIs (os error 4551) — What To Do</title>
      <dc:creator>MilkyWay008</dc:creator>
      <pubDate>Wed, 26 Aug 2026 17:12:24 +0000</pubDate>
      <link>https://dev.to/milkyway008/windows-smart-app-control-is-blocking-your-python-clis-os-error-4551-what-to-do-4bkj</link>
      <guid>https://dev.to/milkyway008/windows-smart-app-control-is-blocking-your-python-clis-os-error-4551-what-to-do-4bkj</guid>
      <description>&lt;p&gt;If you've seen this error on Windows 11, you probably assumed your install was broken. Easy to think that. The tool dies at spawn. No Python traceback, no error inside the app. Nothing. The actual problem isn't your tool at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's actually happening
&lt;/h2&gt;

&lt;p&gt;Smart App Control (SAC) is Microsoft's consumer version of WDAC, the Windows Defender Application Control. When it's in enforcement mode it runs a policy called &lt;code&gt;VerifiedAndReputableDesktop&lt;/code&gt;. That policy only lets executables run if they're signed by a trusted-root CA and known to Microsoft's reputation system.&lt;/p&gt;

&lt;p&gt;Here's the catch: &lt;code&gt;uvx&lt;/code&gt;, &lt;code&gt;uv tool install&lt;/code&gt;, and &lt;code&gt;pipx&lt;/code&gt; all generate small &lt;code&gt;.exe&lt;/code&gt; launchers for your CLI at install time, and those launchers are unsigned. Authenticode says &lt;code&gt;NotSigned&lt;/code&gt;. Code Integrity shoots the shim down before your tool ever starts. The tool is fine. The little launcher that boots it is what got blocked.&lt;/p&gt;

&lt;p&gt;You can confirm it in Event Viewer under Applications and Services &amp;gt; Microsoft &amp;gt; Windows &amp;gt; CodeIntegrity &amp;gt; Operational. Events 3033 and 3077 are the blocks, and 3089 logs the signature info (you'll see &lt;code&gt;TotalSignatureCount 0&lt;/code&gt;). If those are there, it's the policy, not your install.&lt;/p&gt;

&lt;p&gt;If the same tool ran fine last week, check whether SAC got switched on in the meantime. That's usually the trigger.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to keep working
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Run the same code through a signed interpreter.&lt;/strong&gt; This is the workaround that works today:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# instead of:&lt;/span&gt;
uvx browser-use

&lt;span class="c"&gt;# run the module through Python instead:&lt;/span&gt;
uvx &lt;span class="nt"&gt;--from&lt;/span&gt; browser-use python &lt;span class="nt"&gt;-m&lt;/span&gt; browser_use.cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same idea inside a venv:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; browser_use.cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;python.exe&lt;/code&gt; is Microsoft-signed, so it sails through and the unsigned shim never executes. This works for any package with a runnable &lt;code&gt;__main__&lt;/code&gt; block, which is most CLI packages. If yours doesn't have one, call the library API directly instead of going through the CLI subprocess.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't bother looking for an allowlist.&lt;/strong&gt; Consumer SAC has no per-app bypass. Microsoft is explicit about it: there's no way to allow one specific app. And don't turn SAC off to make a tool work either. It's binary, and once it's off the only way back is a clean reset of Windows. That's a terrible trade for one CLI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The real fix is upstream.&lt;/strong&gt; The only thing that fully unblocks an SAC-enforced machine is a signed release from the project. Neither uv nor pipx has a flag to sign the launchers it generates, so it's on the tool authors. Flutter ran into the same wall with its unsigned Dart runtime, so this isn't some browser-use-only quirk. If you're affected, say so on the issue. Maintainers pay attention when enough people show up.&lt;/p&gt;

&lt;h2&gt;
  
  
  The lesson
&lt;/h2&gt;

&lt;p&gt;When a Windows CLI dies instantly with os error 4551, check the CodeIntegrity operational log before you reinstall anything. 3033/3077 means an unsigned launcher hit an App Control policy. The fix is usually to call the same code through a signed interpreter, not to chase a broken install.&lt;/p&gt;

&lt;p&gt;And if you maintain a Python CLI, sign your releases. On an SAC-enforced machine, an unsigned launcher is a dead launcher, and there's no workaround your users can apply that fully fixes it.&lt;/p&gt;

</description>
      <category>windows</category>
      <category>tutorial</category>
      <category>ai</category>
    </item>
    <item>
      <title>Your AI coding tool broke after an auto-update? On Windows, check the self-lock first</title>
      <dc:creator>MilkyWay008</dc:creator>
      <pubDate>Tue, 25 Aug 2026 17:11:57 +0000</pubDate>
      <link>https://dev.to/milkyway008/your-ai-coding-tool-broke-after-an-auto-update-on-windows-check-the-self-lock-first-pgi</link>
      <guid>https://dev.to/milkyway008/your-ai-coding-tool-broke-after-an-auto-update-on-windows-check-the-self-lock-first-pgi</guid>
      <description>&lt;p&gt;I've been collecting these reports for a while now, and there's a pattern. Your AI coding assistant says "Update complete!", you click it, and then... the tool won't start. Or it crashes. Or every launch says "the next launch will retry" forever.&lt;/p&gt;

&lt;p&gt;It's not bad luck. It's Windows file locking meeting self-updaters that report success before anything actually finished.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern
&lt;/h2&gt;

&lt;p&gt;AI coding tools update themselves. On Windows that means replacing .exe files, renaming venv folders, rewriting npm shims. And Windows will not let you replace a file that's running, or rename a folder a process has open.&lt;/p&gt;

&lt;p&gt;Look at what people actually hit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;hermes update&lt;/code&gt; fails with &lt;code&gt;[WinError 32] ...hermes.exe -&amp;gt; hermes.exe.deleteme&lt;/code&gt;. The updater IS hermes.exe, so it can't replace itself. Then it drops a &lt;code&gt;.update-incomplete&lt;/code&gt; marker, and every launch retries the update and fails again. Permanent loop.&lt;/li&gt;
&lt;li&gt;The same updater can't "park" its own venv: &lt;code&gt;WinError 5 Access denied&lt;/code&gt; renaming &lt;code&gt;venv&lt;/code&gt; to &lt;code&gt;venv.stale.runtime-*&lt;/code&gt;, because leftover gateway and desktop processes spawned from inside that venv still have python.exe open.&lt;/li&gt;
&lt;li&gt;Claude Code auto-updates 2.1.236 to 2.1.237 and leaves a 500-byte claude.exe stub that prints "Error: claude native binary not installed." The Windows platform package was never published to npm, and the updater logged success anyway.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cline update&lt;/code&gt; half-writes the global npm install and the &lt;code&gt;cline&lt;/code&gt; command just vanishes from PATH.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The common thread: the updater replaces files while old processes still hold them, and it reports success regardless.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "Update complete!" lies to you
&lt;/h2&gt;

&lt;p&gt;Three things stack up:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Windows locks files that are in use. A running exe can't be swapped. A directory a process is sitting in can't be renamed. On Linux, unlinking an open file works fine; Windows says no.&lt;/li&gt;
&lt;li&gt;Self-updaters skip themselves in their own "is anything running?" check. The process doing the updating excludes itself and its ancestors from the lock scan, so it never sees the conflict right under its nose.&lt;/li&gt;
&lt;li&gt;Exit code 0 doesn't mean done. The updater prints "Update complete!" because the shell command returned 0, even when the file it needed to write never landed.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The fix recipe
&lt;/h2&gt;

&lt;p&gt;When your agent CLI breaks after an auto-update on Windows, go through this in order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Kill everything from the old install. Task Manager: the CLI, the desktop app, the gateway or background server, stray node.exe processes. Quit tray apps properly, then check again, because many of these keep a background daemon alive.&lt;/li&gt;
&lt;li&gt;Clear stale markers and caches. Look for &lt;code&gt;.update-incomplete&lt;/code&gt;, &lt;code&gt;update-in-progress&lt;/code&gt;, &lt;code&gt;venv.rollback-bak-*&lt;/code&gt;, &lt;code&gt;generation-*&lt;/code&gt;, and &lt;code&gt;__pycache__&lt;/code&gt; folders under the install dir and delete them. If node_modules is half-installed, delete it too.&lt;/li&gt;
&lt;li&gt;Update from a clean shell outside the app's own process tree. Don't run the updater from inside the tool's own terminal. For hermes specifically, &lt;code&gt;python -m hermes_cli.main update&lt;/code&gt; runs the updater via python.exe instead of the launcher, so the file being replaced isn't the one running the update.&lt;/li&gt;
&lt;li&gt;Verify, don't trust. After updating, run &lt;code&gt;claude --version&lt;/code&gt; / &lt;code&gt;hermes --version&lt;/code&gt; / &lt;code&gt;cline --version&lt;/code&gt;. Check the binary is actually a binary, not a stub: &lt;code&gt;dir&lt;/code&gt; the exe and look at the size. For npm-installed CLIs, &lt;code&gt;npm view &amp;lt;pkg&amp;gt;@&amp;lt;version&amp;gt;&lt;/code&gt; confirms the package exists before you re-run the update.&lt;/li&gt;
&lt;li&gt;Pin or downgrade as a stopgap. If the new version is broken, install the last known-good one explicitly: &lt;code&gt;npm i -g cline@&amp;lt;oldver&amp;gt;&lt;/code&gt;, &lt;code&gt;npm install -g @anthropic-ai/claude-code@2.1.236&lt;/code&gt;. A working older version beats a broken new one, and disable auto-update until the next release.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Already stuck in the loop?
&lt;/h2&gt;

&lt;p&gt;If every launch says "the next launch will retry", kill the process, delete the marker file (&lt;code&gt;.update-incomplete&lt;/code&gt; or whatever it's called), and run the update manually from a clean shell. The marker is just a file. Deleting it breaks the loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this keeps happening
&lt;/h2&gt;

&lt;p&gt;It's not one bug. It's the combination of Windows' file-locking semantics, updaters that report success before verifying, and self-updaters that can't see their own conflict. Each vendor is patching their own instance (hermes merged a fix that re-runs the updater via python.exe when it detects a shim launch; the Claude Code one was a missing npm publish), but the class of problem will keep showing up as long as tools replace their own running files on Windows.&lt;/p&gt;

&lt;p&gt;So before you reinstall from scratch, try the five steps. In my experience, most of the time it's a locked file and a lying success message, not a corrupt install.&lt;/p&gt;

&lt;p&gt;Sources: &lt;a href="https://github.com/NousResearch/hermes-agent/issues/89599" rel="noopener noreferrer"&gt;hermes-agent #89599&lt;/a&gt;, &lt;a href="https://github.com/NousResearch/hermes-agent/issues/93032" rel="noopener noreferrer"&gt;hermes-agent #93032&lt;/a&gt;, &lt;a href="https://github.com/anthropics/claude-code/issues/88105" rel="noopener noreferrer"&gt;claude-code #88105&lt;/a&gt;, &lt;a href="https://github.com/cline/cline/issues/13115" rel="noopener noreferrer"&gt;cline #13115&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>windows</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Cline Kills Long-Running Commands at 30 Seconds: Here's the Fix</title>
      <dc:creator>MilkyWay008</dc:creator>
      <pubDate>Mon, 24 Aug 2026 17:10:59 +0000</pubDate>
      <link>https://dev.to/milkyway008/cline-kills-long-running-commands-at-30-seconds-heres-the-fix-5ho1</link>
      <guid>https://dev.to/milkyway008/cline-kills-long-running-commands-at-30-seconds-heres-the-fix-5ho1</guid>
      <description>&lt;p&gt;You're running a long command in Cline's Background Console, something like &lt;code&gt;bit create&lt;/code&gt; or a big vitest suite, and right at the 30 second mark it dies with "Command timed out after 30000ms". Same command through the foreground terminal mode runs fine for up to an hour. Really annoying, and it's not your command's fault.&lt;/p&gt;

&lt;p&gt;I dug into this after a user in issue #13246 couldn't get &lt;code&gt;bit create&lt;/code&gt; to finish. The short version: there's a hard-coded 30 second timeout inside the SDK that Cline ships bundled with the extension, and the Background Console path uses it while the foreground path doesn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why 30 seconds?
&lt;/h2&gt;

&lt;p&gt;Cline's &lt;code&gt;run_commands&lt;/code&gt; tool has two execution modes. The foreground one (vscodeTerminal) passes a 1 hour timeout to the SDK, straight from a constant that's literally &lt;code&gt;60 * 60 * 1000&lt;/code&gt;. The background path passes nothing, so the SDK falls back to its default. Two spots in the SDK source:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;createShellTool&lt;/code&gt; does &lt;code&gt;const timeoutMs = config.bashTimeoutMs ?? 30000;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;the shell executor has &lt;code&gt;timeoutMs = 30000&lt;/code&gt; as a default, and that's what throws &lt;code&gt;Command timed out after ${timeoutMs}ms&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both get compiled into the extension's &lt;code&gt;dist/extension.js&lt;/code&gt;. I couldn't find any setting that controls it, which is probably why you've been hunting for one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix: patch the bundle
&lt;/h2&gt;

&lt;p&gt;Since there's no setting, the working workaround is patching the compiled extension. In your extensions folder (&lt;code&gt;.vscode\extensions\saoudrizwan.claude-dev-&amp;lt;version&amp;gt;\next\dist\extension.js&lt;/code&gt;), do two replaces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;e.bashTimeoutMs??3e4&lt;/code&gt; → &lt;code&gt;e.bashTimeoutMs??36e5&lt;/code&gt; (the tool factory default)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;timeoutMs:r=3e4&lt;/code&gt; → &lt;code&gt;timeoutMs:r=36e5&lt;/code&gt; (the shell executor default)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;3e4&lt;/code&gt; is 30000 ms, &lt;code&gt;36e5&lt;/code&gt; is 3.6 million ms, which is one hour. Then reload VS Code. A minimal PowerShell version of that, run from the extensions folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-ChildItem&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;\saoudrizwan.claude-dev-&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;\next\dist\extension.js&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="n"&gt;Sort-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;LastWriteTime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Descending&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Select-Object&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-First&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Get-Content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FullName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Raw&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'e.bashTimeoutMs??3e4'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'e.bashTimeoutMs??36e5'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'timeoutMs:r=3e4'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'timeoutMs:r=36e5'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Set-Content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;FullName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-NoNewline&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caveats, because there are always caveats. Those tokens are minified bundle output, so they can change between Cline releases. If a newer version doesn't match, grep for &lt;code&gt;3e4&lt;/code&gt; and patch whatever the equivalent is. And any extension update will overwrite the patch, so either disable auto-update or keep the script around to re-run after updates.&lt;/p&gt;

&lt;h2&gt;
  
  
  The no-patch route
&lt;/h2&gt;

&lt;p&gt;Don't want to touch the bundle? Run long jobs outside the Background Console. The regular terminal tool doesn't have this timeout, and on Windows you can fire a detached process and tail the log:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Start-Process&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cmd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ArgumentList&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'/c'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'your-long-command &amp;gt; C:\temp\job.log 2&amp;gt;&amp;amp;1'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-WindowStyle&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Hidden&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then have Cline read the log file. Ugly, but it works, and it's what I'd do if patching the extension isn't your thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Upstream status
&lt;/h2&gt;

&lt;p&gt;No official fix yet, as far as I can tell. The issue is still open, and a Cline team member suggested trying the "next" bundle override, which didn't help the reporter. So treat the patch as a stopgap. If you hit this, drop a comment on the issue and re-check it before you bother patching, since it could get fixed properly any day.&lt;/p&gt;

&lt;p&gt;If your agent's background commands keep dying at exactly 30 seconds, it's not your shell, your script, or your machine. It's a hard-coded default inside the tool, and now you know exactly where it lives.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
    <item>
      <title>Your internet is capped at ~95 Mbps on a gigabit plan — the 100Mbps negotiation trap</title>
      <dc:creator>MilkyWay008</dc:creator>
      <pubDate>Sun, 23 Aug 2026 17:10:51 +0000</pubDate>
      <link>https://dev.to/milkyway008/your-internet-is-capped-at-95-mbps-on-a-gigabit-plan-the-100mbps-negotiation-trap-4pim</link>
      <guid>https://dev.to/milkyway008/your-internet-is-capped-at-95-mbps-on-a-gigabit-plan-the-100mbps-negotiation-trap-4pim</guid>
      <description>&lt;p&gt;I've seen this exact post a hundred times: "I pay for 500 Mbps fiber and I only get 80." Usually the ISP gets blamed, sometimes the router. Most of the time it's neither. It's one stupid link in the chain quietly running at 100 Mbps.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 95 Mbps tell
&lt;/h2&gt;

&lt;p&gt;Here's the thing to understand first: 75-95 Mbps isn't a random slow speed. It's a signature. 100BASE-TX (Fast Ethernet) is a 100 Mbit/s link. Take off Ethernet/IP/TCP overhead and the practical ceiling lands right around 90-95 Mbps. So when your speed test keeps landing in that band no matter what, you're not getting a throttled 500 Mbps plan. You're getting a 100 Mbps link, and every packet is running through it.&lt;/p&gt;

&lt;p&gt;No amount of ISP complaining fixes that. The link is the bottleneck, and the link is yours.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a link falls back to 100 Mbps
&lt;/h2&gt;

&lt;p&gt;Gigabit (1000BASE-T) uses all four twisted pairs inside an Ethernet cable, bidirectionally. Fast Ethernet only needs two of them (pins 1-2 and 3-6). That's the whole story in one sentence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A plain Cat5 cable (not Cat5e/6). Cat5 is only rated for 100 Mbps.&lt;/li&gt;
&lt;li&gt;A damaged or bent pair.&lt;/li&gt;
&lt;li&gt;A crimp or termination where only two pairs got wired. This is the big one. Lots of cheap patch cables and lazy punchdowns only carry two pairs, and they work fine at 100 Mbps, so nobody notices until they need gigabit.&lt;/li&gt;
&lt;li&gt;A 100 Mbps-only LAN port. Many cheap ONTs (the fiber box on your wall) have exactly one gigabit port and the rest Fast Ethernet. Plug the router into the wrong one and you're capped at the wall, not the cable.&lt;/li&gt;
&lt;li&gt;A marginal link that auto-negotiation quietly downgraded to 100/10, and it stays stuck until something forces a re-negotiation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to actually fix it
&lt;/h2&gt;

&lt;p&gt;Don't start by calling the ISP. Work the ladder, in this order:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Read the negotiated link rate, not a speed test.&lt;/strong&gt;&lt;br&gt;
On Windows: Ctrl+Shift+Esc → Performance tab → Ethernet, look at the link speed. 100 Mbps vs 1.0 Gbps tells you everything. On the router side, the Deco app shows the WAN status. On most ONTs the port LED tells the story: amber/10-100M vs green/1G, check the sticker on your unit. If it says 100 Mbps anywhere, you found the bottleneck.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Swap the ONU→router cable.&lt;/strong&gt;&lt;br&gt;
Get a known-good Cat5e or Cat6 patch lead. If you're crimping your own, verify all 8 wires are terminated to T568A or T568B. All of them, not just the two pairs Fast Ethernet needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Use the gigabit port explicitly.&lt;/strong&gt;&lt;br&gt;
If your ONT has multiple LAN ports, make sure the router is in the gigabit one. Same on the router if it has a separate WAN port.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Isolate the sides.&lt;/strong&gt;&lt;br&gt;
Plug a PC directly into the ONT with the same cable and speed test. Getting 400+ Mbps? ONT and ISP are fine, the fault is in the router/Wi-Fi path. Still ~95? It's the cable or the ONT port.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Power-cycle both the ONT and the router after the cable swap.&lt;/strong&gt;&lt;br&gt;
Auto-negotiation doesn't always re-run on its own when you plug in a better cable. A stuck 100 Mbps link can stay stuck until the link drops and re-negotiates. Pull power on both, wait 30 seconds, plug back in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Still capped?&lt;/strong&gt;&lt;br&gt;
Test a second known-good device to rule out a NIC pinned to 100 Mbps in the OS/driver settings. And don't force speed/duplex manually. Set everything to Auto Negotiation, or you can lock the link to 100 M for a different reason.&lt;/p&gt;

&lt;h2&gt;
  
  
  When it's not the cable
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The ONT's LAN port itself is 100 Mbps-only. Sticker says so, you need a different port or a different ONT.&lt;/li&gt;
&lt;li&gt;Your router's WAN port is 100 Mbps. (The Deco S7's three ports are gigabit, so if you're on one, that's not it.)&lt;/li&gt;
&lt;li&gt;A degraded switch port in between.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of these route back to the same question: what did the link negotiate?&lt;/p&gt;

&lt;h2&gt;
  
  
  The one thing to remember
&lt;/h2&gt;

&lt;p&gt;A speed test tells you the result. The link rate tells you the cause. Gigabit plan capped at ~95? Don't chase the ISP. Go find the 100 Mbps link and fix the thing that's making it slow.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>devops</category>
      <category>networking</category>
    </item>
    <item>
      <title>Why Ollama runs on CPU after an update: the missing sm_86 CUDA kernels</title>
      <dc:creator>MilkyWay008</dc:creator>
      <pubDate>Sat, 22 Aug 2026 17:05:59 +0000</pubDate>
      <link>https://dev.to/milkyway008/why-ollama-runs-on-cpu-after-an-update-the-missing-sm86-cuda-kernels-39bn</link>
      <guid>https://dev.to/milkyway008/why-ollama-runs-on-cpu-after-an-update-the-missing-sm86-cuda-kernels-39bn</guid>
      <description>&lt;h1&gt;
  
  
  Why Ollama runs on CPU after an update: the missing sm_86 CUDA kernels
&lt;/h1&gt;

&lt;p&gt;You update Ollama, pull the model you use every day, and everything gets slower. Not broken, not erroring. Just slow. &lt;code&gt;ollama ps&lt;/code&gt; says something like &lt;code&gt;12% CPU / 88% GPU&lt;/code&gt;, so you shrug and carry on. Then you open nvidia-smi mid-generation and see Ollama using 0 MiB of VRAM.&lt;/p&gt;

&lt;p&gt;It's been running on CPU this whole time. Nobody told you.&lt;/p&gt;

&lt;p&gt;This is what's happening to a lot of RTX 30-series owners after Ollama 0.32.14, and to people with A40/A6000/A10 cards too.&lt;/p&gt;

&lt;h2&gt;
  
  
  The symptom
&lt;/h2&gt;

&lt;p&gt;The giveaway is buried in the server log. Somewhere in the noise:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;msg="skipping CUDA device - compute capability not in compiled architectures"
device="NVIDIA RTX A6000" cc=860 archs="[750 890 1000 1200]"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;cc=860 means your GPU is compute capability 8.6. The arch list is the set of architectures the bundled CUDA kernels were compiled for: 7.5 (RTX 20-series), 8.9 (RTX 40-series), 10.0 and 12.0. No 8.6. Your card isn't in the build.&lt;/p&gt;

&lt;p&gt;Affected hardware: every sm_86 card. RTX 3090, 3080, 3070, 3060, plus the A40, A6000, A5000, A10 and friends. A big chunk of the people running local LLMs are on exactly these cards.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why 0.32.14 made it worse
&lt;/h2&gt;

&lt;p&gt;The missing sm_86 kernel isn't new. Older builds skipped the same arch. But they had a safety net: when the CUDA 13 kernels didn't cover the card, they fell back to the bundled CUDA 12 library, which does include sm_86. Same skip line, then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;msg="inference compute" ... library=CUDA compute=8.6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In 0.32.14 that fallback path broke. So instead of dropping to the CUDA 12 lib, the runner skips straight to &lt;code&gt;library=cpu&lt;/code&gt;. Nothing errors, so you don't notice until the token rate starts to hurt.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix: pin back to a version with a working fallback
&lt;/h2&gt;

&lt;p&gt;Upstream hasn't shipped a fix as of writing. The issue is open and the only maintainer reply so far is a request for more logs. The dependable move: pin to the last version where the CUDA 12 fallback worked, which for this one is 0.32.13.&lt;/p&gt;

&lt;p&gt;Windows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Uninstall Ollama.&lt;/li&gt;
&lt;li&gt;Grab OllamaSetup.exe from the v0.32.13 release page on GitHub.&lt;/li&gt;
&lt;li&gt;Install, and restart the &lt;code&gt;ollama&lt;/code&gt; service if you run it as one.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Linux:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl stop ollama
&lt;span class="c"&gt;# install the v0.32.13 .deb / .rpm / tarball from the releases page&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start ollama
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Verify it's actually using the GPU
&lt;/h2&gt;

&lt;p&gt;This is the step everyone skips, and honestly the reason this post exists. &lt;code&gt;ollama ps&lt;/code&gt; can lie. It showed a GPU split while the GPU sat idle. The reliable check:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;nvidia-smi&lt;/code&gt; during a generation. VRAM allocated to the ollama process, nonzero, means real GPU.&lt;/li&gt;
&lt;li&gt;The log should show &lt;code&gt;library=CUDA compute=8.6&lt;/code&gt; again, not &lt;code&gt;library=cpu&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Watch the tokens. A 27B model crawling at 7 tok/s is a CPU tell.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What not to waste time on
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;CUDA_VISIBLE_DEVICES=0&lt;/code&gt;. The GPU is visible. It's being skipped at the arch check, which is compile-time. No env var brings a missing arch back.&lt;/li&gt;
&lt;li&gt;Forcing the CUDA 12 lib with &lt;code&gt;OLLAMA_LOAD_LIBRARY&lt;/code&gt;. Some builds respect it, but in 0.32.14 the fallback path itself was the broken part, so don't count on it for this version.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The lesson that outlives this bug
&lt;/h2&gt;

&lt;p&gt;After any update to a local-model stack (Ollama, llama.cpp, LM Studio, whatever), spend 30 seconds proving acceleration before you trust it. One &lt;code&gt;nvidia-smi&lt;/code&gt; during a generation is the cheapest smoke test there is.&lt;/p&gt;

&lt;p&gt;Silent degradation is worse than an error. An error tells you something's wrong. A silent CPU fallback just makes everything sluggish and you end up blaming the model.&lt;/p&gt;

&lt;p&gt;And prebuilt-kernel coverage is decided at build time. When a release drops your GPU architecture, there's no flag that fixes it. Pin the last good version, watch the release notes, and move back up when the coverage returns.&lt;/p&gt;

&lt;p&gt;The thread that started this: &lt;a href="https://github.com/ollama/ollama/issues/17841" rel="noopener noreferrer"&gt;https://github.com/ollama/ollama/issues/17841&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
