<?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>Forem: Jun0</title>
    <description>The latest articles on Forem by Jun0 (@jun0-ds).</description>
    <link>https://forem.com/jun0-ds</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3850354%2Fb0c4c5b1-dd46-426f-8ca0-8a3aa4354132.png</url>
      <title>Forem: Jun0</title>
      <link>https://forem.com/jun0-ds</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jun0-ds"/>
    <language>en</language>
    <item>
      <title>I built sonmat to fix this. Then sonmat had the same bug.</title>
      <dc:creator>Jun0</dc:creator>
      <pubDate>Sun, 03 May 2026 03:16:19 +0000</pubDate>
      <link>https://forem.com/jun0-ds/i-built-sonmat-to-fix-this-then-sonmat-had-the-same-bug-3n49</link>
      <guid>https://forem.com/jun0-ds/i-built-sonmat-to-fix-this-then-sonmat-had-the-same-bug-3n49</guid>
      <description>&lt;h2&gt;
  
  
  Another confession
&lt;/h2&gt;

&lt;p&gt;In the &lt;a href="https://dev.to/jun0-ds/your-ai-is-confident-your-ai-is-wrong-you-shipped-it-anyway-37i7"&gt;last post&lt;/a&gt;, I went after the bug that every Claude Code discipline plugin seems to share: the rules live in the main session, the work happens in the workers (subagents), and the rules don't make the trip across. I named names. I quoted the maintainer of &lt;code&gt;superpowers&lt;/code&gt; closing a related issue as "not planned." And then, with a straight face, I claimed that sonmat was different.&lt;/p&gt;

&lt;p&gt;It really wasn't. Not yet, anyway.&lt;/p&gt;

&lt;p&gt;For a while, sonmat had this nicely-crafted hook. Every time you opened Claude Code, it would shove 1,239 characters of discipline into &lt;code&gt;additionalContext&lt;/code&gt; before you even said hello. "MANDATORY. Apply Break it / Cross it / Ground it. Read project memory. Watch for novel traps…" Every session, every time, before the model got a word in.&lt;/p&gt;

&lt;p&gt;I thought this was the strong play. The hook fires before the model speaks, the instruction lands in &lt;code&gt;additionalContext&lt;/code&gt;, the discipline can't be skipped. That was the theory.&lt;/p&gt;

&lt;p&gt;What I didn't notice — for embarrassingly long — was that I was rebuilding, with my own hands, the exact bug I'd just spent a whole post laughing at.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I figured it out
&lt;/h2&gt;

&lt;p&gt;Here's the awkward bit: &lt;code&gt;additionalContext&lt;/code&gt; is delivered to the main session. It is not delivered to subagents.&lt;/p&gt;

&lt;p&gt;So picture what was actually happening. The discipline lived in the place I could see (the main session). It was completely absent from the place where the work actually got done (the workers). The main session would dutifully announce "applying Break / Cross / Ground" — and then dispatch a worker. The worker would receive a clean task with a clean context. No discipline. The worker would shrug and go, "this is simple enough, I don't need tests." The result would come back, the main session would format it confidently (still holding all 1,239 characters of rules), and I'd nod along and approve.&lt;/p&gt;

&lt;p&gt;It was not fine.&lt;/p&gt;

&lt;p&gt;Which is to say: the exact failure mode I'd been mocking in &lt;code&gt;superpowers&lt;/code&gt; and &lt;code&gt;karpathy-skills&lt;/code&gt;? Same mechanism, different label, &lt;strong&gt;mine.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Honestly, I only caught it kind of by accident. I'd started spinning up other CLIs for the same kind of work, and something in the output felt off. So I went poking around. Turns out, every CLI handles hooks slightly differently — different contracts, different injection points, sometimes none at all. And while I was wrestling with making the discipline survive outside Claude Code, the thing that should have been obvious &lt;em&gt;inside&lt;/em&gt; Claude Code finally clicked: &lt;strong&gt;a hook that lands in one place but not another isn't a guarantee. It's a happy accident that landed in the main session.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The bug wasn't multi-CLI. The bug was that I'd been calling that happy accident a guardrail.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed in v0.4.0
&lt;/h2&gt;

&lt;p&gt;I emptied the hook. &lt;code&gt;additionalContext&lt;/code&gt;: 1,239 → 0.&lt;/p&gt;

&lt;p&gt;The discipline didn't disappear — it just moved. It now lives in &lt;code&gt;CLAUDE.md → discipline/core.md&lt;/code&gt;, the same file the agent already reads as part of its prompt context, and the same file you'd put any other instruction in. Workers spawned by the main agent inherit the same &lt;code&gt;CLAUDE.md&lt;/code&gt; chain. So the rule lands in the same place, every layer.&lt;/p&gt;

&lt;p&gt;The hook still runs. It just sticks to what hooks are good at. Make the &lt;code&gt;.claude/sonmat/&lt;/code&gt; directory. Plant a one-time &lt;code&gt;## sonmat&lt;/code&gt; block in your global &lt;code&gt;CLAUDE.md&lt;/code&gt; so the discipline gets referenced. Check for updates. &lt;strong&gt;Side effects only.&lt;/strong&gt; It doesn't try to shape behavior anymore.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BEFORE                                 AFTER
hooks/session-start                    hooks/session-start
  └─ additionalContext: 1,239 chars      └─ side effects only
       "MANDATORY: sonmat..."                 ├─ create .claude/sonmat/
       (delivered to main session             ├─ plant ## sonmat block
        only — workers never saw it)          └─ git pull if outdated

                                       CLAUDE.md → discipline/core.md
                                         (read by main and by every
                                          worker spawned from it.
                                          visible to the user. editable.)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same discipline, different path. The behavior didn't get weaker — it just got honest about where it actually lives.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four things I believe now
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. A guardrail that doesn't reach the worker is a fake guardrail.&lt;/strong&gt;&lt;br&gt;
If your "mandatory" rule is being delivered through a channel the worker doesn't subscribe to, it isn't mandatory. It's decoration. And the trap is that you can see it sitting in the main session — which is exactly why you stop checking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Visibility &lt;em&gt;is&lt;/em&gt; the contract.&lt;/strong&gt;&lt;br&gt;
A rule sitting in &lt;code&gt;additionalContext&lt;/code&gt; is invisible to the user. You can't read it, can't edit it, can't disagree with it. A rule sitting in &lt;code&gt;CLAUDE.md → core.md&lt;/code&gt; is just there, in the repo. The agent reads it. You read it. You can disagree with it — and that's a &lt;em&gt;good&lt;/em&gt; thing, because that's how drift gets caught before it ships.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Hooks are for side effects. They are not for behavior.&lt;/strong&gt;&lt;br&gt;
Make the directory, plant the marker, pull the update. That's the job. The moment a hook starts trying to shape what the agent does, you're betting that the hook fires in every code path the agent will ever take. It doesn't. It can't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. "Strong" enforcement is usually fragile enforcement.&lt;/strong&gt;&lt;br&gt;
The 1,239-character injection felt powerful because it was automatic. But automatic-and-incomplete is worse than manual-and-complete — the user trusts the automation and stops looking. Moving discipline into a file the user can edit (and ignore) sounds weaker. It isn't. It's where the user actually re-enters the loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hard part
&lt;/h2&gt;

&lt;p&gt;Honestly, emptying the hook felt like giving up control. The hook was the place where I could &lt;em&gt;make sure&lt;/em&gt;. If discipline lives in &lt;code&gt;CLAUDE.md&lt;/code&gt;, the user can edit it, override &lt;code&gt;core.md&lt;/code&gt;, even ignore the whole thing.&lt;/p&gt;

&lt;p&gt;Which, yes, is the entire point.&lt;/p&gt;

&lt;p&gt;A discipline the user can't see is a discipline the user can't trust. A discipline the user can't edit is a rule, not a tool — and sonmat is supposed to be a tool. &lt;strong&gt;Visibility is the price of trust.&lt;/strong&gt; And there's a bonus: the discipline now reaches the workers, because the workers read the same file the user reads.&lt;/p&gt;

&lt;h2&gt;
  
  
  Diagnose your own setup
&lt;/h2&gt;

&lt;p&gt;If you're running any Claude Code plugin that promises "guardrails," try asking three questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Where does the rule physically live?&lt;/strong&gt; A hook injecting &lt;code&gt;additionalContext&lt;/code&gt;? A skill the model has to remember to invoke? A line in &lt;code&gt;CLAUDE.md&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Who actually reads it?&lt;/strong&gt; Just the main session? Workers too? Subagents spawned from workers?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Can you see it yourself?&lt;/strong&gt; If you can't open a file and read the rule that's supposedly governing your agent, you don't have a guardrail. You have a vibe.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I had to put my own plugin through those three questions before the answer became obvious. Doing the diagnosis in &lt;a href="https://dev.to/jun0-ds/your-ai-is-confident-your-ai-is-wrong-you-shipped-it-anyway-37i7"&gt;01&lt;/a&gt; was the easy part. Applying it to sonmat itself took a lot longer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/plugin marketplace add jun0-ds/sonmat
/plugin &lt;span class="nb"&gt;install &lt;/span&gt;sonmat@sonmat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After install, the discipline lives at &lt;code&gt;~/.claude/plugins/marketplaces/sonmat/discipline/core.md&lt;/code&gt;. Open it. Read it. Disagree with parts of it if you want — that's actually how you'll know it's doing something real.&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://github.com/jun0-ds/sonmat" rel="noopener noreferrer"&gt;GitHub: jun0-ds/sonmat&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Part of the series **Building sonmat&lt;/em&gt;&lt;em&gt;. Previous: &lt;a href="https://dev.to/jun0-ds/your-ai-is-confident-your-ai-is-wrong-you-shipped-it-anyway-37i7"&gt;Your AI is confident. Your AI is wrong. You shipped it anyway.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://github.com/jun0-ds" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://www.linkedin.com/in/junyoung-ryu-422501117/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claudecode</category>
      <category>agents</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Your AI is confident. Your AI is wrong. You shipped it anyway.</title>
      <dc:creator>Jun0</dc:creator>
      <pubDate>Fri, 01 May 2026 03:13:10 +0000</pubDate>
      <link>https://forem.com/jun0-ds/your-ai-is-confident-your-ai-is-wrong-you-shipped-it-anyway-37i7</link>
      <guid>https://forem.com/jun0-ds/your-ai-is-confident-your-ai-is-wrong-you-shipped-it-anyway-37i7</guid>
      <description>&lt;h2&gt;
  
  
  A confession
&lt;/h2&gt;

&lt;p&gt;I told Claude to write tests first. Claude said "understood." Then Claude spawned a subagent. The subagent said "this is simple enough, I don't need tests." It shipped. I approved. The tests that didn't exist didn't fail. Everything looked fine.&lt;/p&gt;

&lt;p&gt;It was not fine.&lt;/p&gt;

&lt;p&gt;The fun part: I had three plugins installed specifically to prevent this. They were all working correctly. In the main session. Where the work wasn't happening.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with being confident
&lt;/h2&gt;

&lt;p&gt;AI agents have a specific failure mode: they sound right even when they're wrong. This is well-known. What's less discussed is the other half — &lt;strong&gt;you also stop checking when the output sounds right.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So you have two parties in a conversation. One produces confident nonsense. The other accepts it because confidence is persuasive. Nobody verifies. Errors ship.&lt;/p&gt;

&lt;p&gt;This is not a technology problem. This is a trust problem. And every tool I tried was solving the wrong half of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What every plugin gets right (and then misses)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/obra/superpowers" rel="noopener noreferrer"&gt;superpowers&lt;/a&gt; (175k stars) adds TDD, debugging, code review. Smart rules. They live in the main session. When Claude spawns a subagent — which is where the actual work happens — the subagent &lt;a href="https://github.com/obra/superpowers/issues/237" rel="noopener noreferrer"&gt;doesn't get them&lt;/a&gt;. The maintainer closed it as &lt;code&gt;not planned&lt;/code&gt;: "this is a Claude Code platform limitation. There's not much superpowers can do."&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/forrestchang/andrej-karpathy-skills" rel="noopener noreferrer"&gt;karpathy-skills&lt;/a&gt; puts principles in CLAUDE.md. Subagents &lt;a href="https://github.com/anthropics/claude-code/issues/22022" rel="noopener noreferrer"&gt;can't reliably read CLAUDE.md&lt;/a&gt;. Sometimes they claim they did. They didn't.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/gsd-build/gsd-2" rel="noopener noreferrer"&gt;GSD&lt;/a&gt; has beautiful structure. Milestones, slices, tasks. Discipline is the user's job. The framework doesn't enforce it at the worker level.&lt;/p&gt;

&lt;p&gt;The pattern: great rules → main session only → workers ignore them → output looks fine → it isn't.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/anthropics/claude-code/issues/8395" rel="noopener noreferrer"&gt;Documented&lt;/a&gt;. &lt;a href="https://github.com/anthropics/claude-code/issues/22022" rel="noopener noreferrer"&gt;Repeatedly&lt;/a&gt;. &lt;a href="https://github.com/obra/superpowers/issues/237" rel="noopener noreferrer"&gt;Across projects&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built instead
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/jun0-ds/sonmat" rel="noopener noreferrer"&gt;sonmat&lt;/a&gt; (손맛 — Korean for "mother's touch." The secret ingredient that makes the same recipe taste different.)&lt;/p&gt;

&lt;p&gt;It does two things:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Makes the AI doubt itself.&lt;/strong&gt; Verification discipline goes directly into every worker's prompt at dispatch time. Not a file reference. Not a hook that might fire. The actual rules, in the actual prompt. Break it, Cross it, Ground it — on every task, including the ones you don't see.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Makes you doubt the AI.&lt;/strong&gt; Every decision surfaces with its reasoning. Not "here's the answer" but "here's the answer, here's why, and here's what I'm not sure about." When you see the reasoning, you can judge. When you only see the answer, you won't.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And the AI doubts you back.&lt;/strong&gt; When your instruction is ambiguous or conflicts with what it sees, sonmat doesn't just comply — it asks. The same verification attitude applies in both directions.&lt;/p&gt;

&lt;p&gt;That's the whole thing. Everything else — autonomous loops, escalation levels, domain-specific traps — is implementation detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four things I believe now
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Confidence is the worst signal.&lt;/strong&gt;&lt;br&gt;
When the model feels sure, that's exactly when it should look for counterexamples. Confidence without verification is hallucination in a suit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Rules that don't reach workers are decoration.&lt;/strong&gt;&lt;br&gt;
A coding standard that exists only in the main session is a Post-it note on a door nobody walks through.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Autonomy without guardrails is just expensive chaos.&lt;/strong&gt;&lt;br&gt;
sonmat escalates automatically — pause, spawn worker, spawn parallel workers — when it hits surprises or repeated failures. You don't babysit. It doesn't run blind.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Universal rules are universally mediocre.&lt;/strong&gt;&lt;br&gt;
"Write tests first" is critical for dev, meaningless for data analysis. "One change at a time" is essential for ML, overkill for docs. sonmat loads domain-specific traps. The right advice for the right context.&lt;/p&gt;

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

&lt;p&gt;I wanted to add more rules. Every edge case screamed for a new rule. I resisted.&lt;/p&gt;

&lt;p&gt;Too few rules: chaos. Too many: the agent spends its time checking boxes instead of working. The answer was a small, hard core — three verification methods — plus domain hints that activate only when relevant.&lt;/p&gt;

&lt;p&gt;The other lesson: &lt;strong&gt;transparency beats enforcement.&lt;/strong&gt; A guard that says "no" gets worked around. A colleague that says "I noticed this — your call" gets listened to. sonmat chose the second approach. For the AI and for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/plugin marketplace add jun0-ds/sonmat
/plugin &lt;span class="nb"&gt;install &lt;/span&gt;sonmat@sonmat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No config. Start talking.&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://github.com/jun0-ds/sonmat" rel="noopener noreferrer"&gt;GitHub: jun0-ds/sonmat&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;a href="https://github.com/jun0-ds" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://www.linkedin.com/in/junyoung-ryu-422501117/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claudecode</category>
      <category>agents</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I Spent a Week Installing WSL2. The Fix Was Two Lines.</title>
      <dc:creator>Jun0</dc:creator>
      <pubDate>Tue, 31 Mar 2026 01:22:16 +0000</pubDate>
      <link>https://forem.com/jun0-ds/i-spent-a-week-installing-wsl2-the-fix-was-two-lines-hcb</link>
      <guid>https://forem.com/jun0-ds/i-spent-a-week-installing-wsl2-the-fix-was-two-lines-hcb</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;"WSL2? Five minutes, tops." — Me, seven days ago.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;On Windows 11 25H2 (build 26200), enabling VirtualMachinePlatform hangs at 37.8%. Forever. The servicing stack is stuck on 24H2 (build 26100) while the OS moved to 25H2 (build 26200). Windows literally cannot service itself.&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;Add-WindowsCapability&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Online&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Microsoft.Windows.HyperV.VirtualMachinePlatform~~~~0.0.1.0"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;dism&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/online&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/enable-feature&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/featurename:VirtualMachinePlatform&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/all&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/LimitAccess&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you just want the fix, there it is. If you want to know how it took a week and 10 failed attempts to arrive at two lines of PowerShell, keep reading.&lt;/p&gt;




&lt;h2&gt;
  
  
  Day 1: Innocence
&lt;/h2&gt;

&lt;p&gt;Simple plan. Install WSL2. Set up Ubuntu 24.04. Do actual work.&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;wsl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Ubuntu-24.04&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;37.8%.&lt;/p&gt;

&lt;p&gt;I made coffee. Came back. 37.8%.&lt;/p&gt;

&lt;p&gt;I had lunch. Came back. 37.8%.&lt;/p&gt;

&lt;p&gt;37.8 is now my least favorite number.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Crime Scene
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OS&lt;/td&gt;
&lt;td&gt;Windows 11 Pro 25H2 (Build 26200.8037)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU&lt;/td&gt;
&lt;td&gt;Intel Core Ultra 9 275HX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DISM version&lt;/td&gt;
&lt;td&gt;10.0.26100.5074&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Servicing stack&lt;/td&gt;
&lt;td&gt;10.0.26100.8035&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;See it? &lt;strong&gt;OS is build 26200. Servicing stack is build 26100.&lt;/strong&gt; The mechanic has last year's manual for this year's car. If you spotted this, you already know the ending. I did not spot this on Day 1.&lt;/p&gt;

&lt;h2&gt;
  
  
  Days 2-6: The Parade of Failures
&lt;/h2&gt;

&lt;h3&gt;
  
  
  GUI — Stuck. Cancel also stuck.
&lt;/h3&gt;

&lt;p&gt;"Turn Windows features on/off." Checked the box. Progress bar froze.&lt;/p&gt;

&lt;p&gt;Clicked Cancel. Cancel froze.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A cancel button that cannot be cancelled.&lt;/strong&gt; This is the operating system from the world's most valuable company.&lt;/p&gt;

&lt;p&gt;Task Manager. End Process. Moving on.&lt;/p&gt;

&lt;h3&gt;
  
  
  DISM — 37.8%
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;dism&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/online&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/enable-feature&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/featurename:VirtualMachinePlatform&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/all&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/norestart&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;37.8%. We meet again.&lt;/p&gt;

&lt;h3&gt;
  
  
  PowerShell — Same wall, different paint
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;Enable-WindowsOptionalFeature&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Online&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-FeatureName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;VirtualMachinePlatform&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-All&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-NoRestart&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Calls DISM internally. Same result. Changing the wrapper doesn't change the candy.&lt;/p&gt;

&lt;h3&gt;
  
  
  Uninstalled BlueStacks — Wrong suspect
&lt;/h3&gt;

&lt;p&gt;Found forum posts: "Android emulators conflict with Hyper-V." I had BlueStacks 10 installed. Uninstalled it completely. Registry cleanup. Folder purge. The works.&lt;/p&gt;

&lt;p&gt;Result: 37.8%.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;BlueStacks was innocent.&lt;/strong&gt; And now I have to reinstall it later.&lt;/p&gt;

&lt;h3&gt;
  
  
  Offline install from 24H2 ISO — Version mismatch
&lt;/h3&gt;

&lt;p&gt;"If the download is the problem, go offline."&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;dism&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/online&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/enable-feature&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/featurename:VirtualMachinePlatform&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/all&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/LimitAccess&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/Source:D:\Sources\Install.wim&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;0x800f0912&lt;/code&gt;. The ISO is 24H2 (26100), the OS is 25H2 (26200). Windows refuses the source files because they're from "the wrong version." Self-compatibility is apparently optional.&lt;/p&gt;

&lt;h3&gt;
  
  
  Windows Update cache reset — No effect
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;stop&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;wuauserv&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;stop&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;bits&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Remove-Item&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\Windows\SoftwareDistribution\Download\&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Recurse&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Force&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;bits&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;wuauserv&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clean cache. Same 37.8%. Cleaning the house doesn't fix the plumbing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pending operations cleanup — Partial
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;dism&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/online&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/cleanup-image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/revertpendingactions&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cleared the backlog. Feature still won't activate. Finishing your homework doesn't mean you'll pass the exam.&lt;/p&gt;

&lt;h3&gt;
  
  
  In-place repair install — Didn't downgrade
&lt;/h3&gt;

&lt;p&gt;The nuclear option. Ran 24H2 ISO's &lt;code&gt;setup.exe&lt;/code&gt; with "Keep personal files and apps."&lt;/p&gt;

&lt;p&gt;40 minutes. Three reboots.&lt;/p&gt;

&lt;p&gt;Result: &lt;strong&gt;OS stayed on 25H2 (26200).&lt;/strong&gt; In-place install doesn't downgrade. But it did clean up the component store. This becomes a crucial plot point later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 7: Reading the Logs (Finally Using My Brain)
&lt;/h2&gt;

&lt;p&gt;A week of "try something else until it works." At this point, the question isn't &lt;em&gt;what&lt;/em&gt; doesn't work — it's &lt;em&gt;why&lt;/em&gt;.&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;Select-String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\Windows\Logs\CBS\CBS.log&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;-Pattern&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Error|Failed|0x800f"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Context&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;2&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;-Last&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;20&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The smoking gun:&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="err"&gt;Failed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;get&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;uup&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;features&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;WU,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;sessionData:&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;"ModuleID"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"FOD"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Features"&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Windows.HyperV.OptionalFeature.VirtualMachinePlatform.Client.Disabled~"&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="err"&gt;HRESULT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;x&lt;/span&gt;&lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="err"&gt;f&lt;/span&gt;&lt;span class="mi"&gt;0820&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;CBS_E_CANCEL&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;download source: 8, download time (secs): 1256, 
download status: 0x800f0820 (CBS_E_CANCEL)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;1,256 seconds. Twenty-one minutes waiting for Windows Update to deliver a package it will never find.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;From the DISM log, the confession:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Dism.exe version: 10.0.26100.5074
Target image: OS Version=10.0.26200.8037
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The servicing stack (26100) is trying to service a newer OS (26200). It goes to Windows Update looking for FOD packages matching this combination. Those packages don't exist in the UUP catalog. So it waits. And waits. And times out at 37.8%.&lt;/p&gt;

&lt;p&gt;A car mechanic with a 2023 catalog trying to order parts for a 2024 model. "This part number doesn't exist in our system, sir."&lt;/p&gt;

&lt;p&gt;This is the servicing architecture of the world's largest software company.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Fix: Use the Back Door
&lt;/h2&gt;

&lt;p&gt;DISM can't download the FOD through its usual channel (UUP). But &lt;code&gt;Add-WindowsCapability&lt;/code&gt; uses a &lt;strong&gt;different channel&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Same building. Front door is under construction. Back door is open. The sign only mentions the front door. Classic Windows UX.&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="c"&gt;# Step 1: Back door — install payload via alternative channel&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Add-WindowsCapability&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Online&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Microsoft.Windows.HyperV.VirtualMachinePlatform~~~~0.0.1.0"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Step 2: Now activate using only local files (no internet needed)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;dism&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/online&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/enable-feature&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/featurename:VirtualMachinePlatform&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/all&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/LimitAccess&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;100%.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One hundred percent.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;First three-digit number I've seen all week.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Works
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Front door — BLOCKED]
DISM enable-feature
  → Needs FOD payload
  → Windows Update UUP channel
  → Servicing stack (26100) ≠ OS (26200)
  → "Part not found in catalog"
  → 21 min timeout → CBS_E_CANCEL

[Back door — OPEN]
Add-WindowsCapability  
  → Different download channel (bypasses UUP)
  → Payload installed locally ✓

DISM + /LimitAccess
  → "Internet? Don't need it."
  → Local files only
  → Success ✓
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both commands use the same Windows servicing system. But they fetch FOD packages through different channels. DISM goes through UUP, where the version mismatch kills it. &lt;code&gt;Add-WindowsCapability&lt;/code&gt; takes a different route. The official docs don't mention this distinction. You're welcome.&lt;/p&gt;

&lt;h2&gt;
  
  
  If You Found This Article
&lt;/h2&gt;

&lt;p&gt;You've probably already tried and failed multiple times. That means &lt;strong&gt;pending operations&lt;/strong&gt; are likely piled up. Clean house first:&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="c"&gt;# Light cleanup&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;dism&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/online&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/cleanup-image&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/revertpendingactions&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# → Reboot → Run the two-line fix&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# If that's not enough (in-place repair)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# 24H2 ISO → setup.exe → "Keep personal files and apps"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# → Reboot → Run the two-line fix&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Complete Flow (For Fresh Starts)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;virtualization&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;BIOS&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="n"&gt;HP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;laptops:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;F10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;→&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Security&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Configuration&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;→&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;VT-x&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;↓&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Hyper-V&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="nx"&gt;WSL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;these&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;work&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fine&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;ironically&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="n"&gt;dism&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/online&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/enable-feature&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/featurename:Microsoft-Hyper-V-All&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/all&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;/norestart&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="err"&gt;↓&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Clean&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pending&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;operations&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;you&lt;/span&gt;&lt;span class="s1"&gt;'ve been trying things)
   dism /online /cleanup-image /revertpendingactions → reboot
        ↓
4. The actual fix
   Add-WindowsCapability -Online -Name "Microsoft.Windows.HyperV.VirtualMachinePlatform~~~~0.0.1.0"
   dism /online /enable-feature /featurename:VirtualMachinePlatform /all /LimitAccess
        ↓
5. Reboot → Install WSL2
   wsl --install -d Ubuntu-24.04
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Is This Your Problem?
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check version mismatch in DISM log&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="nx"&gt;C:\Windows\Logs\DISM\dism.log&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Tail&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;100&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# "version:" ≠ "image version:" → yes, this is your problem&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Check CBS log for the specific failure&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Select-String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Path&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;C:\Windows\Logs\CBS\CBS.log&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="se"&gt;`
&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;-Pattern&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Error|Failed|0x800f"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Context&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;2&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;-Last&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;20&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="c"&gt;# "CBS_E_CANCEL" → yes, this is your problem&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="c"&gt;# Verify CPU virtualization (prerequisite)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;Get-CimInstance&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-ClassName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Win32_Processor&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="nx"&gt;VirtualizationFirmwareEnabled&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;VMMonitorModeExtensions&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Symptom&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VirtualMachinePlatform stuck at 37.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Root cause&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;25H2 OS (26200) + 24H2 servicing stack (26100) = FOD download mismatch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fix&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Add-WindowsCapability&lt;/code&gt; to bypass → &lt;code&gt;dism /LimitAccess&lt;/code&gt; to activate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Prerequisite&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Clear pending operations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One week of evenings. One wrongly accused BlueStacks. A lasting distrust of progress bars.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Lessons
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Read the logs first.&lt;/strong&gt; "Try random things until something works" is the scenic route to nowhere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows Insider means signing up for this.&lt;/strong&gt; 25H2 is a preview build. The servicing stack hasn't caught up. Now you know.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Same building, multiple doors.&lt;/strong&gt; When DISM fails, &lt;code&gt;Add-WindowsCapability&lt;/code&gt; exists. The docs won't tell you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feed your logs to AI.&lt;/strong&gt; Nobody should read 160,000 lines of CBS log with their own eyes.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;em&gt;This troubleshooting session was done with &lt;a href="https://claude.ai/code" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt;. It pulled the critical 6 lines from a 160,000-line CBS log and helped identify the &lt;code&gt;Add-WindowsCapability&lt;/code&gt; back door. Without it, this would have ended with a format and reinstall.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wsl2</category>
      <category>troubleshooting</category>
      <category>virtualization</category>
      <category>claudecode</category>
    </item>
  </channel>
</rss>
