<?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: Ahab</title>
    <description>The latest articles on DEV Community by Ahab (@ahab_indieseek).</description>
    <link>https://dev.to/ahab_indieseek</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%2F4014445%2F97c86b36-e09c-4828-816c-c828c0c15b0e.jpg</url>
      <title>DEV Community: Ahab</title>
      <link>https://dev.to/ahab_indieseek</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ahab_indieseek"/>
    <language>en</language>
    <item>
      <title>Grok 4.6 vs 4.5: Migrate Long-Running Agents by Accepted-Task Cost</title>
      <dc:creator>Ahab</dc:creator>
      <pubDate>Sat, 15 Aug 2026 01:18:52 +0000</pubDate>
      <link>https://dev.to/ahab_indieseek/grok-46-vs-45-migrate-long-running-agents-by-accepted-task-cost-je</link>
      <guid>https://dev.to/ahab_indieseek/grok-46-vs-45-migrate-long-running-agents-by-accepted-task-cost-je</guid>
      <description>&lt;h1&gt;
  
  
  Grok 4.6 vs 4.5: migrate long-running agents by accepted-task economics
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Quick answer
&lt;/h2&gt;

&lt;p&gt;SpaceXAI released &lt;code&gt;grok-4.6&lt;/code&gt; on August 12, 2026 as its new flagship for coding, agentic tasks, and knowledge work. It keeps Grok 4.5's 500,000-token context window and headline prices of $2 per million input tokens and $6 per million output tokens, while SpaceXAI reports stronger results on long-running agent evaluations.&lt;/p&gt;

&lt;p&gt;Do not migrate on those headlines alone. Grok 4.6 raises cached-input pricing from $0.30 to $0.50 per million tokens below the 200K long-context threshold, and from $0.60 to $1 above it. A long coding session with a high cache-hit rate can therefore cost more even when input and output list prices look unchanged.&lt;/p&gt;

&lt;p&gt;Run 4.5 and 4.6 on the same multi-step tasks, record context growth, retries, tool calls, human repair, and accepted results, then promote 4.6 only where the complete task economics improve. Treat API, Cursor, Grok Build, and GitHub Copilot availability as separate states.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;This guide is for developers already routing production coding or research agents to Grok 4.5. It also helps teams evaluating Grok 4.6 through Cursor, Grok Build, or GitHub Copilot without confusing a partner announcement with verified access in every account and client.&lt;/p&gt;

&lt;p&gt;If you are evaluating Grok for the first time, start with the &lt;a href="https://dev.to/blogs/grok-4-5-coding-agent-api-eval-cost-checklist/"&gt;Grok 4.5 coding-agent evaluation&lt;/a&gt;. This page focuses on the narrower migration decision: whether an existing, passing 4.5 route should move to 4.6.&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Boundary&lt;/th&gt;
&lt;th&gt;Grok 4.5&lt;/th&gt;
&lt;th&gt;Grok 4.6&lt;/th&gt;
&lt;th&gt;Migration implication&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Context window&lt;/td&gt;
&lt;td&gt;500K&lt;/td&gt;
&lt;td&gt;500K&lt;/td&gt;
&lt;td&gt;Capacity did not increase; measure how the agent uses it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Input / cached / output below 200K&lt;/td&gt;
&lt;td&gt;$2 / $0.30 / $6&lt;/td&gt;
&lt;td&gt;$2 / $0.50 / $6&lt;/td&gt;
&lt;td&gt;Cached input is 66.7% more expensive&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Input / cached / output at long-context rates&lt;/td&gt;
&lt;td&gt;$4 / $0.60 / $12&lt;/td&gt;
&lt;td&gt;$4 / $1 / $12&lt;/td&gt;
&lt;td&gt;The whole request moves to the higher rate at the threshold&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modalities&lt;/td&gt;
&lt;td&gt;Text and image to text&lt;/td&gt;
&lt;td&gt;Text and image to text&lt;/td&gt;
&lt;td&gt;Re-run image and structured-output contracts, not just code tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent capabilities&lt;/td&gt;
&lt;td&gt;Function calling, structured output, reasoning&lt;/td&gt;
&lt;td&gt;Function calling, structured output, reasoning&lt;/td&gt;
&lt;td&gt;Tool compatibility still needs a canary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Published focus&lt;/td&gt;
&lt;td&gt;Coding and agentic work&lt;/td&gt;
&lt;td&gt;Longer-running agents and more ambitious interactive work&lt;/td&gt;
&lt;td&gt;Test trajectory stability, not only first-answer quality&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;SpaceXAI reports that Grok 4.6 improves over 4.5 from 54% to 65.9% on DeepSWE 1.1, from 56.6% to 61.3% on FrontierCode 1.1 Extended, and from 47.1% to 57.5% on APEX-Agents. These are useful release signals, not proof for your repository: benchmark scores depend on the harness, task set, effort, and acceptance policy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use a paired long-running task pack
&lt;/h2&gt;

&lt;p&gt;Choose six representative tasks that are long enough to expose planning and recovery behavior:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fix a cross-file bug and add a regression test.&lt;/li&gt;
&lt;li&gt;Migrate an API across at least five call sites without changing public behavior.&lt;/li&gt;
&lt;li&gt;Complete a tool loop with one injected timeout and one recoverable invalid result.&lt;/li&gt;
&lt;li&gt;Investigate a repository-wide performance issue and produce a verified patch.&lt;/li&gt;
&lt;li&gt;Build a small interactive feature from a written brief and screenshot target.&lt;/li&gt;
&lt;li&gt;Resume a stopped task from saved evidence without repeating completed work.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Pin the same repository commit, prompt, tools, sandbox, reasoning effort, timeout, and tool-call cap. Run at least three paired trials per task. Keep deterministic tests and screenshots outside the model so both candidates face the same acceptance gate.&lt;/p&gt;

&lt;p&gt;Record more than tokens. A useful migration sheet includes first-pass acceptance, completed steps, repeated steps, tool failures, context size by turn, cached tokens, output tokens, wall time, and human repair minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Calculate accepted-task economics
&lt;/h2&gt;

&lt;p&gt;Use one cost record per trial:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;model_cost = input_cost + cached_input_cost + output_and_reasoning_cost + tool_cost
recovery_cost = retry_model_cost + human_repair_minutes * internal_minute_rate
accepted_task_cost = (model_cost + recovery_cost) / accepted_tasks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also plot prompt size by turn. Once a prompt reaches the 200K long-context threshold, SpaceXAI's pricing table applies the higher input, cached-input, and output rates to the entire request, not only the tokens above 200K. Context compaction that preserves acceptance can matter more than a small benchmark gain.&lt;/p&gt;

&lt;p&gt;Do not mix Standard with Priority Processing during the model comparison. Priority is a separate 2x-priced service lane. First compare model versions on the same lane; test faster processing only after selecting the model.&lt;/p&gt;

&lt;h2&gt;
  
  
  A seven-gate migration workflow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Inventory every route
&lt;/h3&gt;

&lt;p&gt;List direct API model IDs, moving aliases, Cursor settings, Grok Build workflows, Copilot policies, fallbacks, cached prompts, and scheduled jobs. Mark which routes can roll back independently.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Freeze the 4.5 baseline
&lt;/h3&gt;

&lt;p&gt;Save the prompt revision, tool schema, harness version, acceptance tests, cost window, and three representative 4.5 traces. Without a fixed baseline, a simultaneous harness change can masquerade as a model improvement.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Prove the 4.6 API contract
&lt;/h3&gt;

&lt;p&gt;Call the exact &lt;code&gt;grok-4.6&lt;/code&gt; model on a harmless structured-output task, a function call, an image input, and an intentional tool failure. Record the requested model, returned usage, region, status, and timestamp. Do not assume a picker label proves API behavior.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Run the paired pack
&lt;/h3&gt;

&lt;p&gt;Alternate 4.5 and 4.6 trials to reduce time-of-day and service-load bias. Reject any comparison where effort, tool versions, timeout, or service lane differs.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Inspect trajectory growth
&lt;/h3&gt;

&lt;p&gt;Flag repeated reads, unnecessary tool loops, premature compaction, lost constraints, and retries that rebuild context. A stronger first pass can still lose if it grows the transcript faster or requires more repair.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Verify partner availability separately
&lt;/h3&gt;

&lt;p&gt;SpaceXAI says Grok 4.6 is available in Cursor, Grok Build, the API, and GitHub Copilot. At the time of this check, GitHub's supported-model and pricing references still listed Grok 4.5, while Cursor's changelog had not published a matching 4.6 entry. For each partner, record plan, admin policy, client version, picker visibility, successful invocation, and date. Documentation lag is an observation, not proof that a rollout failed.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Ramp with explicit rollback
&lt;/h3&gt;

&lt;p&gt;Start with one low-risk task class, then 5%, 25%, and 100% only when acceptance, policy violations, wall time, and accepted-task cost stay within your predeclared budget. Keep 4.5 pinned as the rollback route until a representative production window passes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision tree
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Does 4.6 pass every safety and tool-contract canary?
  no  -&amp;gt; keep 4.5 and isolate the failed boundary
  yes -&amp;gt; does it improve accepted-task cost or a required quality gate?
           no  -&amp;gt; keep 4.5 for this route
           yes -&amp;gt; does the gain survive long-context and retry scenarios?
                    no  -&amp;gt; compact, narrow, or route only short tasks
                    yes -&amp;gt; ramp gradually with 4.5 rollback
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Calling pricing unchanged while ignoring the cached-input increase.&lt;/li&gt;
&lt;li&gt;Comparing a 4.5 short task with a 4.6 long trajectory that crosses 200K.&lt;/li&gt;
&lt;li&gt;Treating SpaceXAI's benchmark chart as repository-level acceptance evidence.&lt;/li&gt;
&lt;li&gt;Mixing Standard and Priority lanes or changing the harness during the canary.&lt;/li&gt;
&lt;li&gt;Treating API success as proof of Cursor or Copilot policy, picker, and invocation.&lt;/li&gt;
&lt;li&gt;Removing the &lt;a href="https://dev.to/blogs/ai-coding-agent-sandbox-untrusted-repo-checklist/"&gt;untrusted-repository sandbox gate&lt;/a&gt; because the new model self-tests more often.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Copyable decision record
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;date / owner / route:
baseline_model / candidate_model:
repository_commit / fixture_revision / harness_version:
reasoning_effort / service_lane / tool_versions:
first_pass_acceptance / final_acceptance:
context_by_turn / cached_input / output_and_reasoning:
retries / repeated_steps / tool_failures:
wall_time / human_repair_minutes:
accepted_task_cost_4_5 / accepted_task_cost_4_6:
partner_plan / policy / client / picker / invocation:
decision: hold | short-task-only | 5% | 25% | 100% | rollback
rollback_model / trigger:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is Grok 4.6 the same price as Grok 4.5?
&lt;/h3&gt;

&lt;p&gt;Not exactly. Standard input and output prices match, but Grok 4.6's cached-input price is higher both below and above the 200K threshold. Calculate your actual prompt, cache, output, tool, and recovery mix.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should every Grok 4.5 coding agent migrate?
&lt;/h3&gt;

&lt;p&gt;No. Move only the task classes where paired evidence shows a required quality gain or better accepted-task economics. A stable 4.5 route can remain the better choice for short, high-cache workloads.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is Grok 4.6 available in GitHub Copilot everywhere?
&lt;/h3&gt;

&lt;p&gt;SpaceXAI announced availability on August 14 and said some Business and Enterprise organizations may need to enable the model. Because GitHub's reference pages still showed 4.5 when checked, verify the actual plan, policy, picker, client, and invocation before changing team instructions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://x.ai/news/grok-4-6" rel="noopener noreferrer"&gt;SpaceXAI: Introducing Grok 4.6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.x.ai/developers/models/grok-4.6" rel="noopener noreferrer"&gt;SpaceXAI model documentation: Grok 4.6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.x.ai/developers/pricing" rel="noopener noreferrer"&gt;SpaceXAI API pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://x.ai/news/grok-4-6-github-copilot" rel="noopener noreferrer"&gt;SpaceXAI: Grok 4.6 in GitHub Copilot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot/reference/ai-models/supported-models" rel="noopener noreferrer"&gt;GitHub Copilot supported models&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cursor.com/changelog" rel="noopener noreferrer"&gt;Cursor changelog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>grok</category>
      <category>devtools</category>
      <category>programming</category>
    </item>
    <item>
      <title>Gemini 3.7 Flash vs 3.6: Migrate by Accepted-Task Cost</title>
      <dc:creator>Ahab</dc:creator>
      <pubDate>Fri, 14 Aug 2026 10:45:18 +0000</pubDate>
      <link>https://dev.to/ahab_indieseek/gemini-37-flash-vs-36-migrate-by-accepted-task-cost-63</link>
      <guid>https://dev.to/ahab_indieseek/gemini-37-flash-vs-36-migrate-by-accepted-task-cost-63</guid>
      <description>&lt;h1&gt;
  
  
  Gemini 3.7 Flash vs 3.6: migrate by accepted-task cost, not launch claims
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Quick answer
&lt;/h2&gt;

&lt;p&gt;Google released &lt;code&gt;gemini-3.7-flash&lt;/code&gt; as a generally available Gemini API model on August 13, 2026. It has a 1,048,576-token input limit, up to 65,536 output tokens, and &lt;code&gt;low&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt;, and &lt;code&gt;high&lt;/code&gt; thinking levels.&lt;/p&gt;

&lt;p&gt;Do not migrate only because 3.7 is newer. Through December 31, 2026, Gemini 3.7 Flash and 3.6 Flash have the same list prices: $0.75 per million input tokens and $3.75 per million output tokens, including thinking tokens. Compare them on the same tasks and promote 3.7 only when its higher acceptance rate or lower retry cost wins.&lt;/p&gt;

&lt;p&gt;API availability and GitHub Copilot availability are separate. The API model is GA; GitHub says Copilot access is rolling out gradually and Business or Enterprise administrators must enable a preview policy. A working API call does not prove the model is selectable in every Copilot client.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;This guide is for developers already using Gemini 3.6 Flash or 3.5 Flash for coding agents, tool loops, or design-to-code work. It is also for teams deciding whether a visible “Gemini 3.7 Flash” picker entry is enough evidence to change a shared Copilot workflow.&lt;/p&gt;

&lt;p&gt;For high-volume extraction, classification, or routing, also use the &lt;a href="https://dev.to/blogs/gemini-3-6-flash-vs-3-5-flash-lite-api-migration-guide/"&gt;Gemini 3.6 Flash vs 3.5 Flash-Lite guide&lt;/a&gt;. Flash-Lite may still be the cheapest valid route.&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Boundary&lt;/th&gt;
&lt;th&gt;Confirmed behavior&lt;/th&gt;
&lt;th&gt;Migration implication&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Model identity&lt;/td&gt;
&lt;td&gt;Stable ID is &lt;code&gt;gemini-3.7-flash&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Pin the exact ID during the canary; do not test through a moving alias&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context and output&lt;/td&gt;
&lt;td&gt;1,048,576 input tokens; 65,536 output tokens&lt;/td&gt;
&lt;td&gt;Large context is available, but still measure accepted work per token&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Thinking&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;low&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt;, and &lt;code&gt;high&lt;/code&gt;; default is &lt;code&gt;medium&lt;/code&gt;; &lt;code&gt;minimal&lt;/code&gt; returns an error&lt;/td&gt;
&lt;td&gt;Route effort explicitly and add a negative &lt;code&gt;minimal&lt;/code&gt; test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tools&lt;/td&gt;
&lt;td&gt;Function calling, code execution, Computer Use preview, File Search, Search/Maps grounding, structured output, and URL context&lt;/td&gt;
&lt;td&gt;Re-run every tool contract; model availability does not prove workflow parity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pricing&lt;/td&gt;
&lt;td&gt;3.7 and 3.6 share introductory Standard pricing through 2026-12-31&lt;/td&gt;
&lt;td&gt;Token price alone cannot choose between them&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Antigravity&lt;/td&gt;
&lt;td&gt;3.7 is now the default model behind the Antigravity managed agent&lt;/td&gt;
&lt;td&gt;Re-test agent behavior even if your agent ID is unchanged&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Copilot&lt;/td&gt;
&lt;td&gt;Gradual rollout across listed clients; organization policy may be required&lt;/td&gt;
&lt;td&gt;Verify policy, picker, client, and returned behavior separately&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Use a six-task accepted-result eval
&lt;/h2&gt;

&lt;p&gt;Build one small, versioned fixture pack and run it unchanged against 3.6 and 3.7:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Repair a reproducible bug with a focused test.&lt;/li&gt;
&lt;li&gt;Refactor three files without changing public behavior.&lt;/li&gt;
&lt;li&gt;Complete a four-step function-calling loop with one recoverable tool error.&lt;/li&gt;
&lt;li&gt;Implement a page from a screenshot and score visual parity.&lt;/li&gt;
&lt;li&gt;Find a cross-file constraint inside a long repository context.&lt;/li&gt;
&lt;li&gt;Produce schema-valid structured output with one adversarial input.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Fix the prompt, repository revision, tools, timeout, tool-call cap, and acceptance tests. Do not compare 3.6 &lt;code&gt;medium&lt;/code&gt; with 3.7 &lt;code&gt;high&lt;/code&gt; and call the difference a model win.&lt;/p&gt;

&lt;p&gt;Record acceptance, retries, tokens, wall time, tool calls, policy violations, and human repair minutes. Then calculate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;accepted_task_cost = total_model_cost + retry_cost + human_repair_cost
acceptance_rate = accepted_runs / completed_runs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;List price describes requests. Accepted-task cost describes whether the agent delivered usable work.&lt;/p&gt;

&lt;h2&gt;
  
  
  A seven-gate migration workflow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Inventory every route
&lt;/h3&gt;

&lt;p&gt;List direct API calls, aliases, managed agents, batch jobs, cached prompts, Copilot clients, and fallbacks. Mark independent routes.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Remove incompatible request fields
&lt;/h3&gt;

&lt;p&gt;When migrating from Gemini 3.5 Flash, Gemini 3 Flash Preview, or Gemini 3.1 Pro, remove &lt;code&gt;temperature&lt;/code&gt;, &lt;code&gt;top_p&lt;/code&gt;, &lt;code&gt;top_k&lt;/code&gt;, and prefilled model turns. Gemini 3.6 already rejected those sampling fields, but verify your shared request builder rather than assuming it stayed clean.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Pin the exact model and lane
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;gemini-3.7-flash&lt;/code&gt;, not &lt;code&gt;gemini-flash-latest&lt;/code&gt;, for the canary. Compare Standard with Standard. Batch and Flex are cheaper, while Priority costs more; mixing lanes hides whether the model or service tier changed the result.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Route thinking deliberately
&lt;/h3&gt;

&lt;p&gt;Start with &lt;code&gt;medium&lt;/code&gt;, the default. Try &lt;code&gt;low&lt;/code&gt; for latency-sensitive drafting or triage and &lt;code&gt;high&lt;/code&gt; for the hardest coding and tool tasks. Require the &lt;code&gt;minimal&lt;/code&gt; request to fail, so a bad router cannot silently select an unsupported level.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Run the paired fixture pack
&lt;/h3&gt;

&lt;p&gt;Alternate 3.6 and 3.7 runs. Keep outputs, tool traces, tests, screenshots, token usage, and rejection reasons. A benchmark headline is not repository evidence.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Verify Copilot as a separate state machine
&lt;/h3&gt;

&lt;p&gt;For Copilot, record plan, policy, client version, picker visibility, invocation, and date. “Rolling out” means neither unavailable nor universal; capture the observed state when docs lag.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Ramp with rollback
&lt;/h3&gt;

&lt;p&gt;Start with one low-risk route, then 5%, 25%, and 100% only if acceptance, latency, policy, and accepted-task cost stay inside your budget. Keep 3.6 as the explicit rollback target until a representative production window passes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Migrating because 3.7 and 3.6 have the same token price without measuring retries.&lt;/li&gt;
&lt;li&gt;Sending &lt;code&gt;minimal&lt;/code&gt; thinking even though 3.7 rejects it.&lt;/li&gt;
&lt;li&gt;Comparing different thinking levels, service tiers, prompts, or tool versions.&lt;/li&gt;
&lt;li&gt;Treating API GA as proof of Copilot policy or picker availability.&lt;/li&gt;
&lt;li&gt;Removing the &lt;a href="https://dev.to/blogs/ai-coding-agent-sandbox-untrusted-repo-checklist/"&gt;untrusted-repository sandbox gate&lt;/a&gt; because a newer model passes more tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Copyable decision record
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;date / owner / decision:
routes_and_clients:
baseline_model / candidate_model:
exact_model_ids / service_tier:
fixture_revision / tool_versions:
thinking_levels_tested:
first_pass_acceptance / retry_rate:
input_tokens / output_plus_thinking_tokens:
wall_time / human_repair_minutes:
accepted_task_cost:
copilot_plan / policy / client / picker / invocation:
rollout_stage: hold | 5% | 25% | 100% | rollback
rollback_model / trigger:
recheck_before_2027_pricing:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is Gemini 3.7 Flash more expensive than 3.6 Flash?
&lt;/h3&gt;

&lt;p&gt;Not during the introductory period. Their published Standard, Batch, Flex, Priority, and caching rates match through December 31, 2026. Prices double for both on January 1, 2027.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should every Gemini 3.6 workload move to 3.7?
&lt;/h3&gt;

&lt;p&gt;No. Keep a passing 3.6 route when migration risk exceeds the measured gain. Move tasks where 3.7 improves acceptance, retries, latency, or repair cost on your own fixtures.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does Copilot support Gemini 3.7 Flash everywhere now?
&lt;/h3&gt;

&lt;p&gt;GitHub announced a gradual rollout across several clients and plans. Business and Enterprise administrators must enable the preview policy. Verify the live client state before changing team instructions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Gemini API release notes: &lt;a href="https://ai.google.dev/gemini-api/docs/changelog" rel="noopener noreferrer"&gt;https://ai.google.dev/gemini-api/docs/changelog&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Gemini 3.7 Flash model page: &lt;a href="https://ai.google.dev/gemini-api/docs/models/gemini-3.7-flash" rel="noopener noreferrer"&gt;https://ai.google.dev/gemini-api/docs/models/gemini-3.7-flash&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Gemini 3.7 Flash changes and migration guide: &lt;a href="https://ai.google.dev/gemini-api/docs/latest-model" rel="noopener noreferrer"&gt;https://ai.google.dev/gemini-api/docs/latest-model&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Gemini Developer API pricing: &lt;a href="https://ai.google.dev/gemini-api/docs/pricing" rel="noopener noreferrer"&gt;https://ai.google.dev/gemini-api/docs/pricing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub Copilot rollout announcement: &lt;a href="https://github.blog/changelog/2026-08-13-gemini-3-7-flash-is-now-available-in-github-copilot/" rel="noopener noreferrer"&gt;https://github.blog/changelog/2026-08-13-gemini-3-7-flash-is-now-available-in-github-copilot/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub Copilot supported-models reference: &lt;a href="https://docs.github.com/en/copilot/reference/ai-models/supported-models" rel="noopener noreferrer"&gt;https://docs.github.com/en/copilot/reference/ai-models/supported-models&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>gemini</category>
      <category>devtools</category>
      <category>programming</category>
    </item>
    <item>
      <title>Qwen Code 0.21.11: Install Agent Plugins v1 Without Assuming Full Compatibility</title>
      <dc:creator>Ahab</dc:creator>
      <pubDate>Thu, 13 Aug 2026 10:24:33 +0000</pubDate>
      <link>https://dev.to/ahab_indieseek/qwen-code-02111-install-agent-plugins-v1-without-assuming-full-compatibility-267m</link>
      <guid>https://dev.to/ahab_indieseek/qwen-code-02111-install-agent-plugins-v1-without-assuming-full-compatibility-267m</guid>
      <description>&lt;h1&gt;
  
  
  Qwen Code 0.21.11: install Agent Plugins v1 without assuming every capability works
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Quick answer
&lt;/h2&gt;

&lt;p&gt;Qwen Code 0.21.11 can install and link a standard Agent Plugins v1 package without converting its &lt;code&gt;plugin.json&lt;/code&gt;, &lt;code&gt;mcp.json&lt;/code&gt;, or &lt;code&gt;SKILL.md&lt;/code&gt; files into &lt;code&gt;qwen-extension.json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That does &lt;strong&gt;not&lt;/strong&gt; mean every component in an Agent Plugin runs in Qwen Code. The stable runtime loads direct-child Agent Skills plus stdio and Streamable HTTP MCP servers. It ignores commands, agents, hooks, context, settings, channels, apps, client namespaces, and legacy HTTP+SSE MCP entries.&lt;/p&gt;

&lt;p&gt;Treat 0.21.11 as a portable-core release. Before enabling a third-party plugin broadly, prove the package is unchanged, inventory which capabilities actually load, test path and credential boundaries, verify persistent state, and keep a project-scoped rollback.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;This guide is for extension authors and teams that want one portable plugin package to work in Qwen Code and other Agent Plugins clients. It is also for operators searching for “Qwen Code plugin not supported” after a package installs but a command, hook, agent, or MCP server is missing.&lt;/p&gt;

&lt;p&gt;If you are migrating the same portable package into Codex, compare the &lt;a href="https://dev.to/blogs/codex-cli-0-146-agent-plugins-workspace-rollout-checklist/"&gt;Codex Agent Plugins rollout guide&lt;/a&gt;. The shared format reduces packaging work; each client still decides which capabilities it executes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed in 0.21.11
&lt;/h2&gt;

&lt;p&gt;The August 13 stable release adds native Agent Plugins v1 support. Qwen Code recognizes the canonical v1 schema, preserves the original package files, and uses the existing &lt;code&gt;qwen extensions&lt;/code&gt; lifecycle for local directories, links, archives, Git repositories, archive URLs, and scoped npm packages.&lt;/p&gt;

&lt;p&gt;The implementation deliberately matches a portable capability boundary rather than translating every client-specific feature. A root &lt;code&gt;plugin.json&lt;/code&gt; for Agent Plugins takes precedence over other extension manifests. Unsupported schema versions fail explicitly; a missing or blank package version is represented internally as &lt;code&gt;1.0.0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Agent Plugins v1 is a package format, not a marketplace integration. Native loading makes a package installable; it does not make every marketplace, command system, permission model, or client namespace portable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with the real compatibility matrix
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Package component&lt;/th&gt;
&lt;th&gt;Qwen Code 0.21.11 behavior&lt;/th&gt;
&lt;th&gt;Acceptance evidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;skills//SKILL.md&lt;/code&gt; as a direct child&lt;/td&gt;
&lt;td&gt;Loaded when valid&lt;/td&gt;
&lt;td&gt;Skill appears and can be invoked&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nested or malformed Skill&lt;/td&gt;
&lt;td&gt;Skipped independently&lt;/td&gt;
&lt;td&gt;Valid sibling still works&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;stdio MCP&lt;/td&gt;
&lt;td&gt;Supported&lt;/td&gt;
&lt;td&gt;Server connects with expected arguments and cwd&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Streamable HTTP MCP&lt;/td&gt;
&lt;td&gt;Supported with URL and credential controls&lt;/td&gt;
&lt;td&gt;HTTPS or loopback HTTP connects safely&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Legacy HTTP+SSE MCP&lt;/td&gt;
&lt;td&gt;Skipped&lt;/td&gt;
&lt;td&gt;Entry is absent; no silent transport substitution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Commands, agents, hooks&lt;/td&gt;
&lt;td&gt;Ignored&lt;/td&gt;
&lt;td&gt;None appears or executes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context, settings, channels, apps, client namespaces&lt;/td&gt;
&lt;td&gt;Ignored&lt;/td&gt;
&lt;td&gt;No client-specific behavior is assumed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;allowed-tools&lt;/code&gt; in a Skill&lt;/td&gt;
&lt;td&gt;Parsed as metadata, not pre-approval&lt;/td&gt;
&lt;td&gt;Tool still follows Qwen permission policy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This matrix is the contract. Do not label an ignored capability a failed installation, and do not label a successful installation full compatibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  A seven-gate rollout workflow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Pin the client and package identity
&lt;/h3&gt;

&lt;p&gt;Record &lt;code&gt;qwen --version&lt;/code&gt; and require 0.21.11 or later. Pin the plugin source revision, archive checksum, or exact npm version. Review the root manifest before running any bundled server:&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;"$schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://agent-plugins.org/schemas/1.0.0/plugin.schema.json"&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="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"my-agent-plugin"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&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;Reject an unexpected schema, a changed source, or an identity collision. Installation consent is not a substitute for package provenance.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Start at project scope
&lt;/h3&gt;

&lt;p&gt;Use a disposable repository and the narrowest existing scope:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;qwen extensions &lt;span class="nb"&gt;install&lt;/span&gt; ./my-agent-plugin &lt;span class="nt"&gt;--scope&lt;/span&gt; project
qwen extensions list
qwen mcp list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For active development, &lt;code&gt;qwen extensions link ./my-agent-plugin&lt;/code&gt; avoids copying the package. For a release canary, install the exact artifact users will receive. Do not begin with a global enablement.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Prove native loading did not rewrite the package
&lt;/h3&gt;

&lt;p&gt;Hash the source files before installation. Confirm the installed or linked package retains &lt;code&gt;plugin.json&lt;/code&gt;, &lt;code&gt;mcp.json&lt;/code&gt;, &lt;code&gt;SKILL.md&lt;/code&gt;, and server files byte-for-byte and does not gain a generated &lt;code&gt;qwen-extension.json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Also verify Qwen reports the origin as &lt;code&gt;AgentPlugins&lt;/code&gt;. A converted Claude, Gemini, Qoder, or native Qwen extension follows a different compatibility path even if the visible feature looks similar.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Test supported and unsupported siblings together
&lt;/h3&gt;

&lt;p&gt;Build a harmless fixture containing one valid direct-child Skill, one invalid or nested Skill, one stdio MCP server, and one unsupported command or hook. The pass condition is asymmetric:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the valid Skill and stdio server load;&lt;/li&gt;
&lt;li&gt;the invalid Skill is isolated rather than disabling the valid sibling;&lt;/li&gt;
&lt;li&gt;the command or hook remains unavailable;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;allowed-tools&lt;/code&gt; does not silently bypass Qwen approval.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This catches the most dangerous rollout mistake: assuming an install success means every directory became executable.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Verify state and path containment
&lt;/h3&gt;

&lt;p&gt;For stdio MCP, Qwen expands &lt;code&gt;${PLUGIN_ROOT}&lt;/code&gt; and &lt;code&gt;${PLUGIN_DATA}&lt;/code&gt; once in arguments, environment values, and &lt;code&gt;cwd&lt;/code&gt;. Write a harmless sentinel into &lt;code&gt;PLUGIN_DATA&lt;/code&gt;, update or reinstall the same plugin identity, and confirm the sentinel remains. Keep mutable state out of the read-only package root.&lt;/p&gt;

&lt;p&gt;Then include a symlink or relative-path escape fixture. A manifest escape should reject the plugin; a component escape should disable only that component. No discovered, read, or executed path should leave the resolved plugin root.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Run the HTTP credential canaries
&lt;/h3&gt;

&lt;p&gt;Remote MCP endpoints must use HTTPS; plain HTTP is allowed only for loopback. Test a local Streamable HTTP fixture first, then a controlled HTTPS endpoint. Require these outcomes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;unsafe remote HTTP is rejected;&lt;/li&gt;
&lt;li&gt;client-owned headers cannot be overridden;&lt;/li&gt;
&lt;li&gt;a configured credential or authorization header is not forwarded across a redirect;&lt;/li&gt;
&lt;li&gt;one malformed MCP entry does not disable valid siblings.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use synthetic tokens and local endpoints. A security canary should prove policy without risking a real secret.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Promote only the portable slice
&lt;/h3&gt;

&lt;p&gt;Enable the plugin for one project, run representative Skill and MCP tasks, disable and re-enable it, then test update and uninstall. Promote to user scope only when the evidence matches the matrix.&lt;/p&gt;

&lt;p&gt;If your product depends on commands, agents, hooks, context, channels, apps, or a marketplace, keep the client-specific package or adapter. The portable core and the Qwen-specific layer can coexist; pretending they are identical creates silent feature loss.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Assuming the Agent Plugins logo means all clients execute the same components.&lt;/li&gt;
&lt;li&gt;Converting the package manually even though 0.21.11 preserves the v1 files.&lt;/li&gt;
&lt;li&gt;Testing only a happy-path Skill and never proving unsupported components stay inert.&lt;/li&gt;
&lt;li&gt;Treating &lt;code&gt;allowed-tools&lt;/code&gt; as a Qwen permission grant.&lt;/li&gt;
&lt;li&gt;Putting mutable state under &lt;code&gt;PLUGIN_ROOT&lt;/code&gt; instead of &lt;code&gt;PLUGIN_DATA&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Allowing credentials to follow redirects during an MCP connectivity test.&lt;/li&gt;
&lt;li&gt;Enabling globally before a project-scoped rollback passes.&lt;/li&gt;
&lt;li&gt;Calling a marketplace listing part of the Agent Plugins v1 runtime contract.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a broader permission-precedence test, use the &lt;a href="https://dev.to/blogs/qwen-code-0-21-8-workspace-trust-precedence-security-checklist/"&gt;Qwen Code workspace trust checklist&lt;/a&gt;. For MCP calls that may repeat after reconnects, pair this rollout with the &lt;a href="https://dev.to/blogs/qwen-code-0-21-5-mcp-safe-replay-checklist/"&gt;Qwen MCP safe-replay checklist&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Copyable evidence record
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;date / owner / decision:
qwen_version / launcher:
plugin_name / version / source_revision_or_checksum:
install_scope: project | user
manifest_schema / origin:
source_hashes_match / generated_qwen_manifest_absent:
valid_skill / invalid_sibling_isolated:
stdio_mcp / streamable_http_mcp / legacy_sse_absent:
unsupported_commands_agents_hooks_absent:
allowed_tools_still_requires_policy:
plugin_data_persists_after_update:
path_escape_rejected:
unsafe_http_rejected / redirect_credential_stripped:
disable_enable_update_uninstall_results:
rollout: pass | hold | rollback
remaining_client_specific_layer:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Can I install an Agent Plugin from GitHub or npm?
&lt;/h3&gt;

&lt;p&gt;Yes. Qwen Code's existing extension sources include local paths, archives, Git repositories, archive URLs, and scoped npm packages. Pin the artifact and start at project scope.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why did the plugin install but its command or agent is missing?
&lt;/h3&gt;

&lt;p&gt;Because 0.21.11 intentionally loads only the portable Skill and supported MCP slice. Commands, agents, and hooks are ignored, not translated.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does &lt;code&gt;allowed-tools&lt;/code&gt; pre-approve tools in Qwen Code?
&lt;/h3&gt;

&lt;p&gt;No. The field is recognized as metadata but does not grant pre-approved Qwen tools. Qwen's permission policy remains authoritative.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is legacy SSE MCP automatically upgraded to Streamable HTTP?
&lt;/h3&gt;

&lt;p&gt;No. Legacy HTTP+SSE entries are skipped. Use a supported stdio or Streamable HTTP definition and verify it explicitly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Qwen Code 0.21.11 stable release: &lt;a href="https://github.com/QwenLM/qwen-code/releases/tag/v0.21.11" rel="noopener noreferrer"&gt;https://github.com/QwenLM/qwen-code/releases/tag/v0.21.11&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Agent Plugins v1 user guide: &lt;a href="https://github.com/QwenLM/qwen-code/blob/v0.21.11/docs/users/extension/agent-plugins.md" rel="noopener noreferrer"&gt;https://github.com/QwenLM/qwen-code/blob/v0.21.11/docs/users/extension/agent-plugins.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Qwen Code extensions guide: &lt;a href="https://github.com/QwenLM/qwen-code/blob/v0.21.11/docs/users/extension/introduction.md" rel="noopener noreferrer"&gt;https://github.com/QwenLM/qwen-code/blob/v0.21.11/docs/users/extension/introduction.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Native-support design and package boundary: &lt;a href="https://github.com/QwenLM/qwen-code/blob/v0.21.11/docs/design/agent-plugins-v1-native-support.md" rel="noopener noreferrer"&gt;https://github.com/QwenLM/qwen-code/blob/v0.21.11/docs/design/agent-plugins-v1-native-support.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Merged implementation and reviewer test plan: &lt;a href="https://github.com/QwenLM/qwen-code/pull/8834" rel="noopener noreferrer"&gt;https://github.com/QwenLM/qwen-code/pull/8834&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Agent Plugins specification site: &lt;a href="https://agent-plugins.org/" rel="noopener noreferrer"&gt;https://agent-plugins.org/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>qwen</category>
      <category>mcp</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Claude Code 2.1.229: Keep Vertex and Bedrock Gateway Streams Alive</title>
      <dc:creator>Ahab</dc:creator>
      <pubDate>Thu, 13 Aug 2026 01:21:02 +0000</pubDate>
      <link>https://dev.to/ahab_indieseek/claude-code-21229-keep-vertex-and-bedrock-gateway-streams-alive-1f9n</link>
      <guid>https://dev.to/ahab_indieseek/claude-code-21229-keep-vertex-and-bedrock-gateway-streams-alive-1f9n</guid>
      <description>&lt;h1&gt;
  
  
  Claude Code 2.1.229: keep Vertex and Bedrock gateway streams alive during long thinking
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Quick answer
&lt;/h2&gt;

&lt;p&gt;Claude Code 2.1.229 adds SSE keepalive pings to gateway streaming responses during long model-thinking pauses. Anthropic says the change prevents idle-timeout disconnects on Google Vertex AI and Amazon Bedrock upstreams.&lt;/p&gt;

&lt;p&gt;Upgrade the Claude Code client that actually opens the provider stream, then replay one workload that previously failed with &lt;code&gt;Stream idle timeout&lt;/code&gt;. Do not declare success because a short prompt works. Record a quiet interval longer than the old failure threshold and prove that the same request later resumes content and reaches a terminal result without a new request.&lt;/p&gt;

&lt;p&gt;The patch is a liveness fix, not a universal timeout override. It does not repair expired credentials, provider quotas, a buffering reverse proxy, a total request timeout, or a broken network path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;This guide is for platform and developer-experience teams routing Claude Code through Vertex AI or Bedrock, directly or through an enterprise LLM gateway. It is especially useful when high-effort reasoning pauses long enough for a proxy, load balancer, or client watchdog to assume the stream is dead.&lt;/p&gt;

&lt;p&gt;If your problem is runner isolation, credentials, hooks, or repository access, use the &lt;a href="https://dev.to/blogs/claude-code-2-1-224-self-hosted-environments-rollout-checklist/"&gt;Claude Code self-hosted environment checklist&lt;/a&gt;. This page covers one narrower task: proving streaming liveness across a provider gateway.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed in 2.1.229
&lt;/h2&gt;

&lt;p&gt;The August 12 UTC release states that gateway streaming responses now emit SSE keepalive pings during long thinking pauses, preventing idle-timeout disconnects on Vertex and Bedrock upstreams.&lt;/p&gt;

&lt;p&gt;Claude Code's gateway documentation defines three supported API shapes: Anthropic Messages, Bedrock &lt;code&gt;invoke-with-response-stream&lt;/code&gt;, and Vertex &lt;code&gt;streamRawPredict&lt;/code&gt;. A gateway must preserve the provider-specific streaming request and required version or beta fields. Claude Code also sends &lt;code&gt;X-Claude-Code-Session-Id&lt;/code&gt;, which lets operators correlate a session without reading prompt bodies.&lt;/p&gt;

&lt;p&gt;That boundary matters. A keepalive can prove that a stream is still active only if every hop forwards it promptly. A proxy that buffers SSE, strips comments, closes quiet upstream connections earlier, or converts streaming into one buffered response can still fail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Map the five-layer path first
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;What to record&lt;/th&gt;
&lt;th&gt;Typical failure that 2.1.229 does not prove fixed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code client&lt;/td&gt;
&lt;td&gt;Version, provider mode, model, effort&lt;/td&gt;
&lt;td&gt;Old binary, wrong launcher, total API timeout&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local or enterprise gateway&lt;/td&gt;
&lt;td&gt;API shape, route, session ID, buffering&lt;/td&gt;
&lt;td&gt;SSE buffered or transformed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Load balancer / proxy&lt;/td&gt;
&lt;td&gt;Idle limit, upstream and downstream logs&lt;/td&gt;
&lt;td&gt;Connection closed before a ping passes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vertex or Bedrock&lt;/td&gt;
&lt;td&gt;Region, model ID, request ID, terminal status&lt;/td&gt;
&lt;td&gt;Auth, quota, model access, provider error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User session&lt;/td&gt;
&lt;td&gt;Prompt, start, quiet interval, completion&lt;/td&gt;
&lt;td&gt;Retry mistaken for one continuous response&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Do not change several layers at once. If you upgrade the client, raise proxy limits, change models, and move regions in one test, you cannot attribute the result.&lt;/p&gt;

&lt;h2&gt;
  
  
  A six-step verification workflow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Prove the active version and route
&lt;/h3&gt;

&lt;p&gt;Run &lt;code&gt;claude --version&lt;/code&gt; from the same launcher used by developers, CI, or the IDE. Require 2.1.229 or later. Inside the session, use &lt;code&gt;/status&lt;/code&gt; to confirm Vertex or Bedrock and the intended model.&lt;/p&gt;

&lt;p&gt;Inventory configuration names without printing secret values:&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;env&lt;/span&gt; | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nt"&gt;-f1&lt;/span&gt; | rg &lt;span class="s1"&gt;'^(CLAUDE_CODE_USE_(VERTEX|BEDROCK)|ANTHROPIC_(VERTEX|BEDROCK).*BASE_URL|CLOUD_ML_REGION|AWS_REGION|API_TIMEOUT_MS)$'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If a wrapper, IDE, container image, or self-hosted runner launches a different binary, upgrading your interactive shell proves nothing.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Freeze one known-failing canary
&lt;/h3&gt;

&lt;p&gt;Choose a non-destructive task that previously produced a long quiet thinking interval. Pin the repository revision, model, effort, provider route, region, input, and gateway policy. Do not use a trivial prompt; it may never cross the old idle boundary.&lt;/p&gt;

&lt;p&gt;Record the previous failure threshold from logs rather than guessing a new one. If no reproducible baseline exists, classify the result as a smoke test, not proof that the patch fixed your incident.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Correlate one session across hops
&lt;/h3&gt;

&lt;p&gt;Capture the &lt;code&gt;X-Claude-Code-Session-Id&lt;/code&gt; in gateway access logs and the provider request ID where available. Scrub authorization headers and prompt bodies. The evidence timeline should contain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;request accepted -&amp;gt; content/thinking activity -&amp;gt; quiet interval
-&amp;gt; keepalive activity observed at each controlled hop
-&amp;gt; content resumes -&amp;gt; terminal success
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The release does not document a public ping interval or guarantee a particular textual payload. Test observed stream activity and continuity; do not hard-code an invented SSE comment.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Keep idle and total timeouts separate
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;API_TIMEOUT_MS&lt;/code&gt; is Claude Code's total API request timeout; the documented default is ten minutes. The 2.1.229 change addresses an idle stream during a request that is still alive. Raising the total timeout cannot make a proxy forward keepalives, while a healthy keepalive cannot authorize an unlimited total duration.&lt;/p&gt;

&lt;p&gt;Retain your existing total request budget for the first canary. Change it only if the evidence shows the request is ending at that separate boundary.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Classify the result
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Observation&lt;/th&gt;
&lt;th&gt;Likely layer&lt;/th&gt;
&lt;th&gt;Next action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Stream ends at the old idle threshold; gateway saw no keepalive&lt;/td&gt;
&lt;td&gt;Client or gateway route&lt;/td&gt;
&lt;td&gt;Verify the active 2.1.229+ binary and streaming API shape&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gateway saw activity, downstream client did not&lt;/td&gt;
&lt;td&gt;Reverse proxy or buffering&lt;/td&gt;
&lt;td&gt;Disable buffering for the SSE route and inspect downstream idle policy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provider returns 401/403&lt;/td&gt;
&lt;td&gt;Credentials or model access&lt;/td&gt;
&lt;td&gt;Repair auth; do not label it an idle-timeout regression&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provider returns 429 or quota error&lt;/td&gt;
&lt;td&gt;Capacity or limits&lt;/td&gt;
&lt;td&gt;Follow provider retry guidance; do not extend timeouts blindly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One request exceeds the total timeout despite stream activity&lt;/td&gt;
&lt;td&gt;Total request budget&lt;/td&gt;
&lt;td&gt;Decide whether the workload or budget should change&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Content resumes and completes with one request ID&lt;/td&gt;
&lt;td&gt;Liveness path passes&lt;/td&gt;
&lt;td&gt;Proceed to a bounded rollout&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  6. Roll out and retain rollback evidence
&lt;/h3&gt;

&lt;p&gt;Start with one gateway route, one provider region, and a small user cohort. Compare idle disconnects, retries, duplicate tool calls, completion rate, and p95 request duration before and after. Keep the previous client package or image available for rollback, but do not downgrade if the old version reintroduces a confirmed reliability or security defect.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://dev.to/blogs/claude-code-action-2-1-227-bash-sandbox-fix-checklist/"&gt;Claude Code Action sandbox recovery guide&lt;/a&gt; shows the same release discipline for CI: prove the intended capability while keeping unrelated safety controls unchanged.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Testing only a short prompt that never produces a quiet interval.&lt;/li&gt;
&lt;li&gt;Increasing every timeout before locating the hop that closes the stream.&lt;/li&gt;
&lt;li&gt;Treating a retry as continuation of the original request.&lt;/li&gt;
&lt;li&gt;Logging tokens or full prompts to obtain correlation evidence.&lt;/li&gt;
&lt;li&gt;Assuming a gateway supports streaming because non-streaming requests work.&lt;/li&gt;
&lt;li&gt;Ignoring proxy buffering between the gateway and the Claude Code client.&lt;/li&gt;
&lt;li&gt;Mixing a provider auth or quota failure with an idle-liveness failure.&lt;/li&gt;
&lt;li&gt;Rolling out to all regions and models before one bounded route passes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Copyable evidence record
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;date / owner / change:
claude_code_version / launcher:
provider: vertex | bedrock
model / effort / region:
gateway_api_shape / route:
proxy_idle_policy / total_api_timeout:
canary_commit / task / input_hash:
session_id / provider_request_id:
request_started_at:
last_content_before_quiet:
keepalive_seen_at_gateway / downstream:
content_resumed_at:
terminal_state / completed_at:
retry_or_new_request_seen: yes | no
pre_upgrade_result / post_upgrade_result:
rollout_decision: pass | hold | rollback
remaining_risk / next check:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Should I just increase &lt;code&gt;API_TIMEOUT_MS&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;No. It controls total request duration. First prove whether an idle hop, total budget, authentication, quota, buffering, or network loss ended the request.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does the fix apply to direct Anthropic API traffic?
&lt;/h3&gt;

&lt;p&gt;The 2.1.229 release specifically describes gateway streaming responses and Vertex/Bedrock upstream idle timeouts. Do not generalize that statement to every transport without a canary.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I prove keepalive support without logging prompts?
&lt;/h3&gt;

&lt;p&gt;Use the session correlation header, timestamps, byte or event activity, provider request IDs, and terminal status. Authorization values and prompt bodies are unnecessary.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is a successful retry a pass?
&lt;/h3&gt;

&lt;p&gt;No. The acceptance condition is one continuous logical request that survives the quiet interval and completes. A retry can duplicate cost or tool effects and must be recorded separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code 2.1.229 release: &lt;a href="https://github.com/anthropics/claude-code/releases/tag/v2.1.229" rel="noopener noreferrer"&gt;https://github.com/anthropics/claude-code/releases/tag/v2.1.229&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Claude Code LLM gateway configuration: &lt;a href="https://code.claude.com/docs/en/llm-gateway" rel="noopener noreferrer"&gt;https://code.claude.com/docs/en/llm-gateway&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Claude Code on Amazon Bedrock: &lt;a href="https://code.claude.com/docs/en/amazon-bedrock" rel="noopener noreferrer"&gt;https://code.claude.com/docs/en/amazon-bedrock&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Claude Code on Google Vertex AI: &lt;a href="https://code.claude.com/docs/en/google-vertex-ai" rel="noopener noreferrer"&gt;https://code.claude.com/docs/en/google-vertex-ai&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Claude Code environment variables: &lt;a href="https://code.claude.com/docs/en/env-vars" rel="noopener noreferrer"&gt;https://code.claude.com/docs/en/env-vars&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Demand wording only — Claude Code stream-idle issue: &lt;a href="https://github.com/anthropics/claude-code/issues/46987" rel="noopener noreferrer"&gt;https://github.com/anthropics/claude-code/issues/46987&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Demand wording only — ping-aware watchdog proposal: &lt;a href="https://github.com/anthropics/anthropic-sdk-typescript/issues/998" rel="noopener noreferrer"&gt;https://github.com/anthropics/anthropic-sdk-typescript/issues/998&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>claude</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Chrome DevTools MCP 1.7: debug memory leaks without reading raw heap snapshots</title>
      <dc:creator>Ahab</dc:creator>
      <pubDate>Wed, 12 Aug 2026 10:21:05 +0000</pubDate>
      <link>https://dev.to/ahab_indieseek/chrome-devtools-mcp-17-debug-memory-leaks-without-reading-raw-heap-snapshots-3j0b</link>
      <guid>https://dev.to/ahab_indieseek/chrome-devtools-mcp-17-debug-memory-leaks-without-reading-raw-heap-snapshots-3j0b</guid>
      <description>&lt;h1&gt;
  
  
  Chrome DevTools MCP 1.7: debug memory leaks without reading raw heap snapshots
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Quick answer
&lt;/h2&gt;

&lt;p&gt;Chrome DevTools MCP 1.7 gives AI coding agents a stronger memory-debugging path: a new object-details tool, native-context summaries and filters, an updated first-party memory-leak skill, and fixes that dispose heap-snapshot workers more reliably.&lt;/p&gt;

&lt;p&gt;Do not hand a multi-gigabyte &lt;code&gt;.heapsnapshot&lt;/code&gt; file to an LLM or ask it to guess from one snapshot. Use a three-snapshot protocol:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;baseline -&amp;gt; repeat one suspected action 10 times -&amp;gt; target
         -&amp;gt; reverse/close the action -&amp;gt; final
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start with summaries, compare retained growth, isolate one suspicious class or native context, inspect representative objects and retaining paths, then close every loaded snapshot. A fix passes only when the same replay no longer exceeds a predeclared growth budget.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;This guide is for developers using Codex, Claude Code, Cursor, Copilot, Gemini CLI, or another MCP-capable agent to diagnose browser or Node.js memory growth. It assumes you can reproduce one bounded action such as opening and closing a modal, navigating between views, reconnecting a stream, or processing one job.&lt;/p&gt;

&lt;p&gt;If you first need the browser access and safety model, use the &lt;a href="https://dev.to/blogs/chrome-devtools-mcp-ai-agent-debugging-workflow/"&gt;general Chrome DevTools MCP workflow&lt;/a&gt;. This page goes deeper on heap evidence and cleanup; it is not another console/network debugging overview.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed in 1.7
&lt;/h2&gt;

&lt;p&gt;The August 10 release adds &lt;code&gt;get_heapsnapshot_object_details&lt;/code&gt;, which lets an agent request known metadata for a specific heap node instead of reading a raw snapshot. Snapshot summaries now expose native contexts and their sizes, while &lt;code&gt;get_heapsnapshot_details&lt;/code&gt; can filter objects by native context.&lt;/p&gt;

&lt;p&gt;The bundled memory-leak skill now routes analysis through native MCP tools: summaries, snapshot comparison, class nodes, retaining paths, dominators, object details, duplicate strings, and category filters. It explicitly recommends capturing baseline, target, and final snapshots, repeating the suspected action ten times, and closing loaded snapshots afterward.&lt;/p&gt;

&lt;p&gt;Version 1.7 also fixes two diagnostic-server cleanup paths: workers are disposed when a context tears down and when loading a missing or invalid snapshot fails. Those fixes reduce the chance that the debugger's own worker growth is confused with application growth, but they do not remove your responsibility to close snapshots or verify the active CLI and daemon versions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evidence ladder
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;th&gt;Smallest useful tool output&lt;/th&gt;
&lt;th&gt;Stop condition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Summary&lt;/td&gt;
&lt;td&gt;Did retained memory grow?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;get_heapsnapshot_summary&lt;/code&gt; for three snapshots&lt;/td&gt;
&lt;td&gt;No repeatable growth after cleanup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Comparison&lt;/td&gt;
&lt;td&gt;Which classes accumulated?&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;compare_heapsnapshots&lt;/code&gt; summary, then one class diff&lt;/td&gt;
&lt;td&gt;Growth is noise or expected cache&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context&lt;/td&gt;
&lt;td&gt;Which page/frame/context owns it?&lt;/td&gt;
&lt;td&gt;native-context sizes and filtered details&lt;/td&gt;
&lt;td&gt;Wrong context or cross-page contamination&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Object&lt;/td&gt;
&lt;td&gt;What is one representative instance?&lt;/td&gt;
&lt;td&gt;class nodes plus &lt;code&gt;get_heapsnapshot_object_details&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Object is expected and bounded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retainer&lt;/td&gt;
&lt;td&gt;Why is it still reachable?&lt;/td&gt;
&lt;td&gt;retaining path, retainers, dominators, edges&lt;/td&gt;
&lt;td&gt;Chain does not reach application code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fix proof&lt;/td&gt;
&lt;td&gt;Did the same replay improve?&lt;/td&gt;
&lt;td&gt;fresh three-snapshot run and budget result&lt;/td&gt;
&lt;td&gt;Budget still fails&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Do not jump directly to a source-code change because a class name looks suspicious. Detached DOM nodes can be intentional caches; large strings can be generated output; framework objects may only be the visible end of a longer retaining chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  A seven-step workflow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Pin the diagnostic boundary
&lt;/h3&gt;

&lt;p&gt;Record the Chrome DevTools MCP version, agent client, browser or Node target, URL/process, commit, and exact reproduction. For this workflow, require 1.7.x on both sides when a daemon is used. The release adds a CLI warning for CLI/daemon version mismatch; treat that warning as a failed preflight.&lt;/p&gt;

&lt;p&gt;Use a disposable profile or test account. Heap snapshots can contain application strings and object data, so keep snapshot paths out of source control and external prompts.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Define one action and a budget
&lt;/h3&gt;

&lt;p&gt;Choose an action with a reverse operation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;open modal -&amp;gt; close modal
mount route -&amp;gt; navigate away
subscribe -&amp;gt; unsubscribe
start job -&amp;gt; finish and release job
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Declare the loop count and pass rule before looking at the result. Example: ten open/close cycles must leave no more than two extra modal roots, no growing listener set, and less than 5 MB of retained growth after cleanup. The numbers are workload-specific; the important part is fixing them before diagnosis.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Capture baseline, target, and final
&lt;/h3&gt;

&lt;p&gt;Stabilize the app, then capture &lt;code&gt;baseline&lt;/code&gt;. Repeat the action ten times and capture &lt;code&gt;target&lt;/code&gt;. Perform the reverse action, leave the app idle long enough for normal cleanup, and capture &lt;code&gt;final&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Keep the same build, profile, page, input, and loop count. A reload between snapshots changes the experiment and makes the comparison hard to defend.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Compare summaries before drilling down
&lt;/h3&gt;

&lt;p&gt;Run &lt;code&gt;get_heapsnapshot_summary&lt;/code&gt; on all three snapshots. Compare total size, object counts, dominant classes, and native contexts. Then use &lt;code&gt;compare_heapsnapshots&lt;/code&gt; for baseline-to-target and baseline-to-final.&lt;/p&gt;

&lt;p&gt;Target growth alone does not prove a leak. The stronger signal is growth that remains in &lt;code&gt;final&lt;/code&gt; after the reverse action. If a separate native context owns most of the increase, filter to it before asking for individual objects.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Follow one representative retaining chain
&lt;/h3&gt;

&lt;p&gt;For a suspicious class, list instances with &lt;code&gt;get_heapsnapshot_class_nodes&lt;/code&gt;. Pick a representative node from the final snapshot and request &lt;code&gt;get_heapsnapshot_object_details&lt;/code&gt;. Then inspect retainers, retaining paths, dominators, and edges until the chain reaches application-owned state.&lt;/p&gt;

&lt;p&gt;Use category filters to test specific hypotheses: objects retained by detached DOM nodes, event handlers, execution contexts, or console references. Use duplicate-string analysis only when string growth dominates the comparison.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Make the smallest ownership fix
&lt;/h3&gt;

&lt;p&gt;Fix the first application-owned edge that should have been released: remove a listener, clear a timer, unsubscribe, bound a cache, delete a map entry, release an observer, or break a stale closure. Do not delete framework state merely because it dominates the heap.&lt;/p&gt;

&lt;p&gt;Pair the change with a durable regression check where practical. The &lt;a href="https://dev.to/blogs/agents-md-vs-claude-md-copilot-instructions/"&gt;agent-instruction guide&lt;/a&gt; shows how to require evidence before edits, while the &lt;a href="https://dev.to/blogs/vet-npm-package-before-installing-ai-built-app/"&gt;package-vetting workflow&lt;/a&gt; helps when the retaining path enters a new dependency.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Replay, close, and record
&lt;/h3&gt;

&lt;p&gt;Restart from a clean process or page state and run the identical three-snapshot protocol. Compare the same metrics and class/context. Close every loaded snapshot with &lt;code&gt;close_heapsnapshot&lt;/code&gt;, including snapshots from failed hypotheses.&lt;/p&gt;

&lt;p&gt;Report &lt;code&gt;pass&lt;/code&gt; only when the replay meets the predeclared budget. Otherwise report the remaining growth and next retaining-chain hypothesis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Feeding a raw &lt;code&gt;.heapsnapshot&lt;/code&gt; file into the model and exhausting context.&lt;/li&gt;
&lt;li&gt;Treating one large snapshot as proof of a leak.&lt;/li&gt;
&lt;li&gt;Changing the action, loop count, profile, or build between baseline and replay.&lt;/li&gt;
&lt;li&gt;Fixing a detached node without checking whether it is an intentional cache.&lt;/li&gt;
&lt;li&gt;Comparing browser RSS to heap-retained size as if they were the same metric.&lt;/li&gt;
&lt;li&gt;Forgetting that DevTools, extensions, console references, and the diagnostic server can retain objects.&lt;/li&gt;
&lt;li&gt;Leaving snapshots loaded after the investigation.&lt;/li&gt;
&lt;li&gt;Publishing a fix without a fresh, identical replay.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://dev.to/blogs/webmcp-agent-ready-website-security-checklist/"&gt;WebMCP security checklist&lt;/a&gt; is useful when the inspected page exposes agent-callable actions; memory diagnosis does not relax write or data-access boundaries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Copyable evidence record
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;date / owner / commit:
agent_client:
chrome_devtools_mcp_cli / daemon_version:
target_url_or_process:
snapshot_storage / retention:
suspected_action / reverse_action:
loop_count: 10
pass_budget:
baseline_summary:
target_summary:
final_summary:
largest_native_context_delta:
suspicious_class / representative_node_id:
retaining_path_to_application_code:
fix / regression_check:
replay_result: pass | fail
snapshots_closed: yes | no
remaining_risk / next hypothesis:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Can an AI agent read the raw heap snapshot directly?
&lt;/h3&gt;

&lt;p&gt;It should not. The first-party skill says raw heap snapshots are extremely large and recommends native MCP summary, comparison, class, object, and retaining-path tools instead.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does target-snapshot growth prove a leak?
&lt;/h3&gt;

&lt;p&gt;No. The action may intentionally allocate memory. Stronger evidence is retained growth that survives the reverse action in the final snapshot and points through a retaining chain to application-owned state.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why inspect native contexts?
&lt;/h3&gt;

&lt;p&gt;A browser process can contain multiple pages, frames, extensions, or execution contexts. Version 1.7 can summarize their sizes and filter details by context, helping the agent avoid blaming the wrong page.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does 1.7 eliminate memory leaks in Chrome DevTools MCP itself?
&lt;/h3&gt;

&lt;p&gt;No. It fixes specific worker-disposal paths. You still need matched versions, valid paths, bounded experiments, and explicit &lt;code&gt;close_heapsnapshot&lt;/code&gt; cleanup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Chrome DevTools MCP 1.7.0 release: &lt;a href="https://github.com/ChromeDevTools/chrome-devtools-mcp/releases/tag/chrome-devtools-mcp-v1.7.0" rel="noopener noreferrer"&gt;https://github.com/ChromeDevTools/chrome-devtools-mcp/releases/tag/chrome-devtools-mcp-v1.7.0&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Chrome DevTools MCP tools: &lt;a href="https://github.com/ChromeDevTools/chrome-devtools-mcp/blob/main/README.md" rel="noopener noreferrer"&gt;https://github.com/ChromeDevTools/chrome-devtools-mcp/blob/main/README.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;First-party memory-leak debugging skill: &lt;a href="https://github.com/ChromeDevTools/chrome-devtools-mcp/blob/main/skills/memory-leak-debugging/SKILL.md" rel="noopener noreferrer"&gt;https://github.com/ChromeDevTools/chrome-devtools-mcp/blob/main/skills/memory-leak-debugging/SKILL.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Object-details tool: &lt;a href="https://github.com/ChromeDevTools/chrome-devtools-mcp/pull/2374" rel="noopener noreferrer"&gt;https://github.com/ChromeDevTools/chrome-devtools-mcp/pull/2374&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Native-context summaries: &lt;a href="https://github.com/ChromeDevTools/chrome-devtools-mcp/pull/2375" rel="noopener noreferrer"&gt;https://github.com/ChromeDevTools/chrome-devtools-mcp/pull/2375&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Native-context filtering: &lt;a href="https://github.com/ChromeDevTools/chrome-devtools-mcp/pull/2377" rel="noopener noreferrer"&gt;https://github.com/ChromeDevTools/chrome-devtools-mcp/pull/2377&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Native-tool skill update: &lt;a href="https://github.com/ChromeDevTools/chrome-devtools-mcp/pull/2436" rel="noopener noreferrer"&gt;https://github.com/ChromeDevTools/chrome-devtools-mcp/pull/2436&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Failed-load worker cleanup: &lt;a href="https://github.com/ChromeDevTools/chrome-devtools-mcp/pull/2449" rel="noopener noreferrer"&gt;https://github.com/ChromeDevTools/chrome-devtools-mcp/pull/2449&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Demand wording only — community memory-profiling comparison: &lt;a href="https://www.reddit.com/r/ClaudeAI/comments/1p4nmm6/cli_vs_mcp_benchmark_results_chrome_devtools/" rel="noopener noreferrer"&gt;https://www.reddit.com/r/ClaudeAI/comments/1p4nmm6/cli_vs_mcp_benchmark_results_chrome_devtools/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>debugging</category>
    </item>
    <item>
      <title>GitHub Copilot for JetBrains: use Ollama without confusing local inference with local memory</title>
      <dc:creator>Ahab</dc:creator>
      <pubDate>Wed, 12 Aug 2026 01:20:50 +0000</pubDate>
      <link>https://dev.to/ahab_indieseek/github-copilot-for-jetbrains-use-ollama-without-confusing-local-inference-with-local-memory-56m8</link>
      <guid>https://dev.to/ahab_indieseek/github-copilot-for-jetbrains-use-ollama-without-confusing-local-inference-with-local-memory-56m8</guid>
      <description>&lt;h1&gt;
  
  
  GitHub Copilot for JetBrains: use Ollama without confusing local inference with local memory
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Quick answer
&lt;/h2&gt;

&lt;p&gt;GitHub Copilot for JetBrains now supports Ollama as a local BYOK provider and can retain Copilot Memory across agent chat sessions. Treat them as two separate controls.&lt;/p&gt;

&lt;p&gt;Ollama can keep model inference on your machine when the selected endpoint is loopback and the selected model is local. Copilot Memory stores repository facts and user preferences under GitHub's memory controls. Enabling a local model does &lt;strong&gt;not&lt;/strong&gt; prove that memory, account, session sync, telemetry, MCP calls, or cloud-agent work also stays local.&lt;/p&gt;

&lt;p&gt;Roll out in two lanes: first prove the local inference path with Memory disabled, then decide whether to enable Memory and audit what it stores.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;This guide is for IntelliJ IDEA, Android Studio, PyCharm, WebStorm, and other JetBrains users who want Copilot's agent workflow with a locally served model, or who need to review the privacy boundary before enabling persistent context.&lt;/p&gt;

&lt;p&gt;It is also for organization administrators. GitHub says local BYOK in IDEs can be disabled by organization or enterprise policy, while Copilot Memory has its own policy and user toggle. The existing &lt;a href="https://dev.to/blogs/github-copilot-app-cloud-agent-managed-settings-rollout-checklist/"&gt;Copilot managed-settings guide&lt;/a&gt; explains why client access and runtime controls must be tested separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed on August 11
&lt;/h2&gt;

&lt;p&gt;GitHub's release adds four notable JetBrains capabilities: enterprise-managed settings, cross-session Copilot Memory, Ollama as a BYOK provider, and expanded Codex workflows. The release says Ollama provider configuration and model selection are available throughout the JetBrains experience.&lt;/p&gt;

&lt;p&gt;GitHub's BYOK documentation distinguishes local BYOK from enterprise BYOK. Local keys and provider configuration are handled client-side, and a local model can remove the dependency on GitHub's Copilot model API. Enterprise BYOK is different: it is handled server-side and still requires a Copilot license and internet access.&lt;/p&gt;

&lt;p&gt;Memory is a separate public-preview system. It can store repository-level facts such as build commands and architecture decisions, plus user-level preferences. Repository facts are citation-backed and revalidated against the current branch. Unused entries expire after 28 days, and users or administrators can review and delete them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Boundary matrix
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Surface&lt;/th&gt;
&lt;th&gt;What the official material confirms&lt;/th&gt;
&lt;th&gt;What you must verify&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ollama model inference&lt;/td&gt;
&lt;td&gt;JetBrains supports Ollama as a local BYOK provider&lt;/td&gt;
&lt;td&gt;Endpoint is &lt;code&gt;127.0.0.1&lt;/code&gt;, local model is selected, and requests reach the local process&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Copilot Memory&lt;/td&gt;
&lt;td&gt;Repository facts and user preferences persist under GitHub controls&lt;/td&gt;
&lt;td&gt;Policy, billing owner, stored entries, citations, deletion, and whether you need it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JetBrains plugin&lt;/td&gt;
&lt;td&gt;Provider/model selection and agent chat are integrated&lt;/td&gt;
&lt;td&gt;Exact plugin and IDE builds, selected provider after restart, and fallback behavior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Other agent paths&lt;/td&gt;
&lt;td&gt;Release also covers MCP, Codex, terminals, and cloud agents&lt;/td&gt;
&lt;td&gt;Network destinations, permissions, session sync, and every non-model tool path&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The safe claim is narrow: &lt;strong&gt;the model request was served by local Ollama&lt;/strong&gt;. Do not upgrade that claim to “Copilot is fully offline” without separate network and feature evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  A six-gate rollout
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Record the exact client and policy state
&lt;/h3&gt;

&lt;p&gt;Update to the latest compatible GitHub Copilot plugin, then record the plugin version, JetBrains product/build, account, active billing entity, organization policies, and current Memory state. Do not rely on “latest” as durable evidence.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Keep Ollama on loopback
&lt;/h3&gt;

&lt;p&gt;Ollama binds to &lt;code&gt;127.0.0.1:11434&lt;/code&gt; by default. Keep that default for a single-machine IDE setup. Do not set &lt;code&gt;OLLAMA_HOST=0.0.0.0:11434&lt;/code&gt;, add a tunnel, or expose the port merely to make discovery easier.&lt;/p&gt;

&lt;p&gt;If you want an explicitly local-only Ollama service, disable its cloud features:&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;"disable_ollama_cloud"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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;Then restart Ollama and confirm its logs report that cloud support is disabled. This controls Ollama; it does not disable GitHub-side Copilot features.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Prove the provider, not just the answer
&lt;/h3&gt;

&lt;p&gt;In JetBrains, configure Ollama, choose one already-downloaded local model, start a fresh chat, and submit a harmless prompt with a unique marker. Capture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the selected provider and model in the UI;&lt;/li&gt;
&lt;li&gt;the local Ollama request log or process activity for that marker;&lt;/li&gt;
&lt;li&gt;the absence of an automatic fallback to a GitHub-hosted model;&lt;/li&gt;
&lt;li&gt;the result after restarting both the IDE and Ollama.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the UI says Ollama but no local request appears, stop. A plausible answer is not routing evidence.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Test the failure path
&lt;/h3&gt;

&lt;p&gt;Stop Ollama and repeat the harmless prompt. The acceptable result is a clear local-provider failure or an explicit, user-approved provider switch. Silent fallback fails the gate. Restart Ollama and confirm the same model works again.&lt;/p&gt;

&lt;p&gt;For larger open models, check hardware before downloading. The &lt;a href="https://dev.to/blogs/kimi-k3-local-hardware-requirements-self-hosting-checklist/"&gt;local-model hardware checklist&lt;/a&gt; shows why “open” and “laptop-ready” are different claims.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Audit Memory separately
&lt;/h3&gt;

&lt;p&gt;Keep Memory disabled during the routing test. If you later enable it, use a disposable repository with a harmless convention such as &lt;code&gt;npm run verify:fixture&lt;/code&gt;. Interact as a user with write access, then review repository facts under the repository's Copilot Memory settings and user preferences in personal Copilot settings.&lt;/p&gt;

&lt;p&gt;Record any fact, its citation, owner, and deletion result. Do not seed passwords, customer data, private URLs, or production architecture secrets. Memory creation is not guaranteed for every sentence; if no entry appears, record “not observed” instead of claiming it was stored.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Gate production use
&lt;/h3&gt;

&lt;p&gt;Approve the rollout only if local routing, stopped-server behavior, restart persistence, policy enforcement, memory inspection, and deletion all match the intended boundary. Keep a one-step rollback: switch provider, disable Memory, or disable the local-BYOK policy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision tree
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Need only local model inference? Keep Memory off and validate Ollama routing first.&lt;/li&gt;
&lt;li&gt;Need persistent repository context? Enable Memory only after ownership, review, retention, and deletion are acceptable.&lt;/li&gt;
&lt;li&gt;Need a fully offline or air-gapped workflow? Disable unrelated cloud features and prove network behavior; the JetBrains release alone is not evidence.&lt;/li&gt;
&lt;li&gt;Organization policy hides Ollama? Ask the administrator to review local BYOK policy; do not work around it with an exposed endpoint.&lt;/li&gt;
&lt;li&gt;Local model lacks tool quality or context? Route only bounded chat tasks to it and keep agentic writes on a separately evaluated model.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Calling the whole Copilot workflow local because the LLM runs in Ollama.&lt;/li&gt;
&lt;li&gt;Enabling Memory and Ollama together, then being unable to attribute behavior.&lt;/li&gt;
&lt;li&gt;Exposing port 11434 to the LAN or internet without a real access-control design.&lt;/li&gt;
&lt;li&gt;Confusing local BYOK with enterprise BYOK, which uses a server-side path.&lt;/li&gt;
&lt;li&gt;Trusting the model name shown in prose instead of observing the local request.&lt;/li&gt;
&lt;li&gt;Testing persistence with secrets or sensitive repository facts.&lt;/li&gt;
&lt;li&gt;Assuming a stored fact is permanent; unused Memory entries expire and facts are revalidated.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For other local-control boundaries, see the &lt;a href="https://dev.to/blogs/qwen-code-0-21-9-local-control-pairing-security-checklist/"&gt;Qwen trusted-LAN checklist&lt;/a&gt;. For tools that can act on external data, use the &lt;a href="https://dev.to/blogs/cursor-google-workspace-plugins-security-checklist/"&gt;connector security checklist&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Copyable acceptance record
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;date / owner:
jetbrains_product_build:
copilot_plugin_version:
account / billing_entity:
local_byok_policy: enabled | disabled
memory_policy / user_toggle:
ollama_bind: 127.0.0.1:11434 | other
ollama_cloud_disabled: yes | no
selected_provider / model:
local_request_observed: pass | fail
stopped_server_fails_closed: pass | fail
restart_preserves_selection: pass | fail
memory_fact_observed / citation:
memory_delete_verified: pass | fail | not tested
non_model_network_paths_reviewed:
rollback_action / owner / evidence:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does Ollama make GitHub Copilot for JetBrains fully offline?
&lt;/h3&gt;

&lt;p&gt;It can localize the model-provider path. Other Copilot capabilities have separate account, memory, session, tool, and network behavior. Verify those independently before making an offline claim.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is Copilot Memory stored inside Ollama?
&lt;/h3&gt;

&lt;p&gt;No official source says that. GitHub documents Memory as repository facts and user preferences managed through GitHub Copilot settings. Treat it as a separate service and control plane.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I expose Ollama so JetBrains can find it?
&lt;/h3&gt;

&lt;p&gt;Not for a same-machine setup. Ollama's documented default is loopback. Keep it there unless you have a deliberate authenticated network design.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GitHub Copilot for JetBrains release: &lt;a href="https://github.blog/changelog/2026-08-11-copilot-memory-and-ollama-in-github-copilot-for-jetbrains" rel="noopener noreferrer"&gt;https://github.blog/changelog/2026-08-11-copilot-memory-and-ollama-in-github-copilot-for-jetbrains&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub Copilot BYOK concepts: &lt;a href="https://docs.github.com/en/copilot/concepts/models/bring-your-own-key" rel="noopener noreferrer"&gt;https://docs.github.com/en/copilot/concepts/models/bring-your-own-key&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;About GitHub Copilot Memory: &lt;a href="https://docs.github.com/en/copilot/concepts/agents/copilot-memory" rel="noopener noreferrer"&gt;https://docs.github.com/en/copilot/concepts/agents/copilot-memory&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Manage personal Copilot Memory: &lt;a href="https://docs.github.com/en/copilot/how-tos/use-copilot-agents/copilot-memory/manage-for-yourself" rel="noopener noreferrer"&gt;https://docs.github.com/en/copilot/how-tos/use-copilot-agents/copilot-memory/manage-for-yourself&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Manage organization and enterprise Memory: &lt;a href="https://docs.github.com/en/copilot/how-tos/use-copilot-agents/copilot-memory/manage-as-administrator" rel="noopener noreferrer"&gt;https://docs.github.com/en/copilot/how-tos/use-copilot-agents/copilot-memory/manage-as-administrator&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Ollama network and local-only guidance: &lt;a href="https://docs.ollama.com/faq" rel="noopener noreferrer"&gt;https://docs.ollama.com/faq&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;JetBrains local-LLM demand signal: &lt;a href="https://github.com/microsoft/copilot-intellij-feedback/issues/593" rel="noopener noreferrer"&gt;https://github.com/microsoft/copilot-intellij-feedback/issues/593&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>githubcopilot</category>
      <category>jetbrains</category>
      <category>ollama</category>
    </item>
    <item>
      <title>Claude Code 2.1.227: Restore Bash in Claude Code Action Without Dropping the Sandbox</title>
      <dc:creator>Ahab</dc:creator>
      <pubDate>Tue, 11 Aug 2026 10:19:45 +0000</pubDate>
      <link>https://dev.to/ahab_indieseek/claude-code-21227-restore-bash-in-claude-code-action-without-dropping-the-sandbox-4imo</link>
      <guid>https://dev.to/ahab_indieseek/claude-code-21227-restore-bash-in-claude-code-action-without-dropping-the-sandbox-4imo</guid>
      <description>&lt;h1&gt;
  
  
  Claude Code 2.1.227: restore Bash in Claude Code Action without dropping the sandbox
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Quick answer
&lt;/h2&gt;

&lt;p&gt;Claude Code 2.1.227 fixes a regression where every Bash command could fail under &lt;code&gt;claude-code-action&lt;/code&gt; on GitHub-hosted runners when &lt;code&gt;allowed_non_write_users&lt;/code&gt; was configured. Claude Code Action 1.0.190 pins that fixed CLI generation.&lt;/p&gt;

&lt;p&gt;Upgrade, prove the job installed Claude Code 2.1.227+, and check a disposable Bash marker in a separate step. Do &lt;strong&gt;not&lt;/strong&gt; use &lt;code&gt;CLAUDE_CODE_SUBPROCESS_ENV_SCRUB: "0"&lt;/code&gt; as the production fix: it disables protections for untrusted-input workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;This guide is for maintainers whose Claude Code Action workflow accepts issue or pull-request input from users without repository write access. The recognizable failure is a Bash tool error such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bwrap: Can't create file at /home/.mcp.json: Permission denied
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Read, Write, or Edit may still appear to work while shell-dependent tests, commits, or pushes never happen. That makes the workflow dangerous to judge from Claude's final narration alone.&lt;/p&gt;

&lt;p&gt;Unlike the &lt;a href="https://dev.to/blogs/claude-code-2-1-223-permission-bypass-regression-checklist/"&gt;2.1.223 permission-regression checklist&lt;/a&gt; or &lt;a href="https://dev.to/blogs/claude-code-2-1-224-self-hosted-environments-rollout-checklist/"&gt;2.1.224 self-hosted environment guide&lt;/a&gt;, this task restores the GitHub-hosted action's non-write-user sandbox.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed in 2.1.227
&lt;/h2&gt;

&lt;p&gt;Anthropic's 2.1.227 release explicitly says it fixed every Bash command failing under &lt;code&gt;claude-code-action&lt;/code&gt; with &lt;code&gt;allowed_non_write_users&lt;/code&gt; on GitHub-hosted runners. The corresponding Claude Code Action 1.0.190 source pins Claude Code 2.1.227 and Agent SDK 0.3.227.&lt;/p&gt;

&lt;p&gt;The security boundary remains mandatory. &lt;code&gt;allowed_non_write_users&lt;/code&gt; bypasses the normal write-access check and requires a &lt;code&gt;github_token&lt;/code&gt; input. Official guidance calls it risky, removes secrets from subprocess environments on a best-effort basis, adds PID-namespace isolation on supported Linux runners, and requires the job-scoped &lt;code&gt;GITHUB_TOKEN&lt;/code&gt;, minimal permissions, and narrow tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Release and protection matrix
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Lane&lt;/th&gt;
&lt;th&gt;Effective version&lt;/th&gt;
&lt;th&gt;Scrub/isolation&lt;/th&gt;
&lt;th&gt;Decision&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Known bad symptom&lt;/td&gt;
&lt;td&gt;Claude Code 2.1.216–2.1.220 in the public report&lt;/td&gt;
&lt;td&gt;Enabled&lt;/td&gt;
&lt;td&gt;Do not accept narrative success; upgrade&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Emergency diagnosis only&lt;/td&gt;
&lt;td&gt;Any affected build with scrub set to &lt;code&gt;0&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Disabled&lt;/td&gt;
&lt;td&gt;Confirms coupling, but is not a production fix&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recovery candidate&lt;/td&gt;
&lt;td&gt;Action 1.0.190 with CLI 2.1.227&lt;/td&gt;
&lt;td&gt;Enabled&lt;/td&gt;
&lt;td&gt;Run all canaries before restoring writes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Production&lt;/td&gt;
&lt;td&gt;Fixed version pinned by tag or commit&lt;/td&gt;
&lt;td&gt;Enabled, minimal permissions and narrow tools&lt;/td&gt;
&lt;td&gt;Ramp from read-only or labeling work&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The first row is public reproduction evidence, not an official support range. The shipped fact is the 2.1.227 fix; use the job's install log as truth.&lt;/p&gt;

&lt;h2&gt;
  
  
  A six-canary recovery
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Pin the recovery candidate
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;anthropics/claude-code-action@v1.0.190&lt;/code&gt;, or pin the reviewed commit. With mutable &lt;code&gt;@v1&lt;/code&gt;, record the resolved action commit and CLI on every run.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Keep the protection path on
&lt;/h3&gt;

&lt;p&gt;Remove any emergency &lt;code&gt;CLAUDE_CODE_SUBPROCESS_ENV_SCRUB: "0"&lt;/code&gt; override. Use only &lt;code&gt;${{ secrets.GITHUB_TOKEN }}&lt;/code&gt; for &lt;code&gt;github_token&lt;/code&gt;, never a PAT. Start with the smallest event and &lt;code&gt;permissions:&lt;/code&gt; set. For an issue-labeling flow, do not grant &lt;code&gt;contents: write&lt;/code&gt; or pull-request writes just because a future workflow might need them.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Run a payload-free Bash marker
&lt;/h3&gt;

&lt;p&gt;In a disposable repository or branch, ask Claude to execute exactly one harmless command and read it back:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;anthropics/claude-code-action@v1.0.190&lt;/span&gt;
  &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;github_token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;
    &lt;span class="na"&gt;allowed_non_write_users&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;test-contributor"&lt;/span&gt;
    &lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;Run `printf 'CLAUDE_BASH_OK\n' &amp;amp;gt; claude-bash-smoke.txt`, then read the file.&lt;/span&gt;
      &lt;span class="s"&gt;Do not modify any other file.&lt;/span&gt;
    &lt;span class="na"&gt;claude_args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;--allowedTools "Bash"&lt;/span&gt;

&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Verify Bash executed outside the model narrative&lt;/span&gt;
  &lt;span class="na"&gt;shell&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bash&lt;/span&gt;
  &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;test "$(tr -d '\r\n' &amp;amp;lt; claude-bash-smoke.txt)" = "CLAUDE_BASH_OK"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Broad Bash permission is acceptable only in this empty, disposable canary. Replace it with command-scoped tools in the real workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Prove secrets stay out of child processes
&lt;/h3&gt;

&lt;p&gt;Use fake sentinel credentials, never production secrets. Ask Bash to report only whether known credential variables are absent, and fail if a sentinel value appears in logs, files, comments, artifacts, or the final answer. Keep the parent action's required authentication separate from the child-process assertion.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Prove actor and capability denial
&lt;/h3&gt;

&lt;p&gt;Test one named allowed user, one unlisted non-write user, and one bot. Confirm only the named user reaches Claude, and that the job cannot write outside its declared purpose. Avoid &lt;code&gt;allowed_non_write_users: "*"&lt;/code&gt;; an allowlist does not make untrusted prompts safe.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Gate rollout on external evidence
&lt;/h3&gt;

&lt;p&gt;Require the Bash marker, expected versions, no scrub opt-out, no leaked sentinel, correct actor decision, and expected GitHub result. A green conclusion or confident assistant message is insufficient. If the older CLI is broken, roll back workflow capability instead of the CLI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision tree
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;If &lt;code&gt;allowed_non_write_users&lt;/code&gt; is not configured, investigate a different Bash failure.&lt;/li&gt;
&lt;li&gt;If the log shows a CLI older than 2.1.227, update the action or fix a stale pin.&lt;/li&gt;
&lt;li&gt;If 2.1.227+ is installed but the marker fails, preserve logs and stop; do not disable scrubbing in production.&lt;/li&gt;
&lt;li&gt;If the marker passes but the actor or secret canary fails, reduce permissions and tools before any rollout.&lt;/li&gt;
&lt;li&gt;Only restore write-capable automation after all six gates pass on the same action commit and runner image.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Assuming &lt;code&gt;@v1&lt;/code&gt; always means the same bits; record the resolved commit and CLI.&lt;/li&gt;
&lt;li&gt;Treating an open issue's inferred root cause as the product contract. The official release confirms the fix, not every internal mechanism.&lt;/li&gt;
&lt;li&gt;Keeping the scrub opt-out because it made Bash work once.&lt;/li&gt;
&lt;li&gt;Using a PAT with untrusted prompts or granting broad &lt;code&gt;contents: write&lt;/code&gt; permissions.&lt;/li&gt;
&lt;li&gt;Asking Claude whether Bash worked instead of asserting an external marker.&lt;/li&gt;
&lt;li&gt;Retesting with a real secret, repository, or release credential.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For additional egress controls, pair this recovery with the &lt;a href="https://dev.to/blogs/claude-code-strict-network-allowlist-sandbox-checklist/"&gt;strict network allowlist checklist&lt;/a&gt;. For actor-to-write authority, use the &lt;a href="https://dev.to/blogs/github-issue-agent-automation-approval-confidence-checklist/"&gt;GitHub issue agent approval-confidence checklist&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Copyable acceptance record
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;action_ref / resolved_commit:
installed_claude_code_version:
runner_image:
allowed_non_write_users: named list | wildcard
subprocess_env_scrub_override: absent | present
workflow_permissions:
allowed_tools:
bash_marker_external_assertion: pass | fail
fake_secret_absent_from_child_outputs: pass | fail
unlisted_actor_denied: pass | fail
expected_write_scope_only: pass | fail
rollback_ref:
owner / evidence_url / decision:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Can I fix the failure by setting &lt;code&gt;CLAUDE_CODE_SUBPROCESS_ENV_SCRUB&lt;/code&gt; to &lt;code&gt;0&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;It can diagnose the old coupling, but it removes protections intended for untrusted-input workflows. Upgrade and verify 2.1.227+ instead.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is &lt;code&gt;allowed_non_write_users: "*"&lt;/code&gt; safe after the fix?
&lt;/h3&gt;

&lt;p&gt;No. The fix restores Bash execution; it does not make arbitrary contributor prompts trusted. Prefer named users, minimal permissions, narrow tools, and deterministic output validation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why check a marker in another step?
&lt;/h3&gt;

&lt;p&gt;The reported regression could leave non-shell tools functioning and still produce a successful-looking answer. The marker proves the command actually ran independently of the model's claim.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code 2.1.227 release: &lt;a href="https://github.com/anthropics/claude-code/releases/tag/v2.1.227" rel="noopener noreferrer"&gt;https://github.com/anthropics/claude-code/releases/tag/v2.1.227&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Claude Code Action 1.0.190 release: &lt;a href="https://github.com/anthropics/claude-code-action/releases/tag/v1.0.190" rel="noopener noreferrer"&gt;https://github.com/anthropics/claude-code-action/releases/tag/v1.0.190&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Official action pin to Claude Code 2.1.227: &lt;a href="https://github.com/anthropics/claude-code-action/commit/5ef2e550a465a721f4f45e4a7d3c340c873e1dcc" rel="noopener noreferrer"&gt;https://github.com/anthropics/claude-code-action/commit/5ef2e550a465a721f4f45e4a7d3c340c873e1dcc&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Claude Code Action security guidance: &lt;a href="https://github.com/anthropics/claude-code-action/blob/main/docs/security.md" rel="noopener noreferrer"&gt;https://github.com/anthropics/claude-code-action/blob/main/docs/security.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Public symptom and reproduction report: &lt;a href="https://github.com/anthropics/claude-code-action/issues/1547" rel="noopener noreferrer"&gt;https://github.com/anthropics/claude-code-action/issues/1547&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>security</category>
      <category>devops</category>
    </item>
    <item>
      <title>Qwen Code 0.21.9 Local Control: Pair a Phone Without Exposing Your Agent</title>
      <dc:creator>Ahab</dc:creator>
      <pubDate>Tue, 11 Aug 2026 01:18:10 +0000</pubDate>
      <link>https://dev.to/ahab_indieseek/qwen-code-0219-local-control-pair-a-phone-without-exposing-your-agent-33mc</link>
      <guid>https://dev.to/ahab_indieseek/qwen-code-0219-local-control-pair-a-phone-without-exposing-your-agent-33mc</guid>
      <description>&lt;h1&gt;
  
  
  Qwen Code 0.21.9 Local Control: pair a phone without exposing your agent
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Quick answer
&lt;/h2&gt;

&lt;p&gt;Qwen Code 0.21.9 adds Local Control to the CLI and Desktop app. Run &lt;code&gt;qwen serve --local-control&lt;/code&gt;, or choose &lt;strong&gt;Control → Local Control…&lt;/strong&gt; in Desktop, and Qwen shows a QR code that opens the active local session from a phone on the same network. Files, credentials, tools, and execution stay on the host computer.&lt;/p&gt;

&lt;p&gt;The important boundary is easy to miss: Local Control uses a fresh 256-bit bearer token and strict browser origins, but its LAN connection is unencrypted HTTP. Use it only on a trusted private network. Never expose it through router port forwarding, a public address, or an anonymous tunnel. Treat the QR code as a temporary secret, supervise permissions as if you were at the host, and prove that turning the mode off revokes both the listener and token.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;This guide is for developers who start a long Qwen Code task and want to watch progress, answer a permission prompt, or continue from a phone without moving the workspace to a cloud runner.&lt;/p&gt;

&lt;p&gt;Local Control does not replace workspace trust or tool permissions. Keep the project boundary from the &lt;a href="https://dev.to/blogs/qwen-code-0-21-8-workspace-trust-precedence-security-checklist/"&gt;Qwen Code workspace-trust checklist&lt;/a&gt; and the action boundary from the &lt;a href="https://dev.to/blogs/claude-code-2-1-223-permission-bypass-regression-checklist/"&gt;agent permission regression checklist&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What shipped in 0.21.9
&lt;/h2&gt;

&lt;p&gt;The stable August 10 release turns a manual LAN recipe into an explicit mode. The CLI binds its Web Shell to the IPv4 LAN, generates a token with 32 random bytes, prints QR codes for usable LAN addresses, and keeps the host awake. Protected HTTP and WebSocket routes retain bearer authentication and exact browser origins.&lt;/p&gt;

&lt;p&gt;Desktop's normal daemon remains authenticated and loopback-only. Enabling Local Control starts a temporary LAN gateway, substitutes a pairing credential, and opens the session active when pairing began. Turning it off closes connections and invalidates the token.&lt;/p&gt;

&lt;p&gt;The transport remains intentionally limited to same-network access. The official implementation says internet control needs an account-authenticated outbound relay and must not be approximated with port forwarding or an unauthenticated tunnel.&lt;/p&gt;

&lt;h2&gt;
  
  
  The boundary matrix
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Boundary&lt;/th&gt;
&lt;th&gt;CLI&lt;/th&gt;
&lt;th&gt;Desktop&lt;/th&gt;
&lt;th&gt;Acceptance rule&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Enablement&lt;/td&gt;
&lt;td&gt;Explicit &lt;code&gt;--local-control&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Explicit menu toggle&lt;/td&gt;
&lt;td&gt;No LAN listener before opt-in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Host runtime&lt;/td&gt;
&lt;td&gt;Web Shell binds to IPv4 LAN&lt;/td&gt;
&lt;td&gt;Private daemon stays on loopback; temporary gateway faces LAN&lt;/td&gt;
&lt;td&gt;Existing session and daemon identity remain stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Credential&lt;/td&gt;
&lt;td&gt;Fresh 256-bit token per run&lt;/td&gt;
&lt;td&gt;Separate short-lived pairing token&lt;/td&gt;
&lt;td&gt;Old token fails after disable/re-enable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser access&lt;/td&gt;
&lt;td&gt;Exact advertised origins plus loopback self-origin&lt;/td&gt;
&lt;td&gt;Gateway validates public Host and Origin&lt;/td&gt;
&lt;td&gt;Wrong origin or token is rejected&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transport&lt;/td&gt;
&lt;td&gt;HTTP on the trusted LAN&lt;/td&gt;
&lt;td&gt;HTTP on the trusted LAN&lt;/td&gt;
&lt;td&gt;No public Wi-Fi, forwarding, or anonymous tunnel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stop action&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Ctrl+C&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Turn off Local Control or close its window&lt;/td&gt;
&lt;td&gt;Listener, connections, token, and sleep inhibition end&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The URL fragment keeps the token out of the initial request, access log, and referrer; it does not add TLS. A QR screenshot or full link can still grant control, so do not share it.&lt;/p&gt;

&lt;h2&gt;
  
  
  A six-canary rollout
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Establish the host boundary
&lt;/h3&gt;

&lt;p&gt;Upgrade to stable 0.21.9 or later. Confirm the workspace, session, model, MCP servers, hooks, and approval policy. Phone access carries the host session's authority; it does not create a safer permission profile.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Establish the network boundary
&lt;/h3&gt;

&lt;p&gt;Use a private network you control, without port forwarding or tunnel software. Desktop fails closed unless it verifies a private or link-local physical IPv4 address. Support here is IPv4-focused; do not infer an IPv6 or internet guarantee.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Pair through the supported entry point
&lt;/h3&gt;

&lt;p&gt;For CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;qwen serve &lt;span class="nt"&gt;--local-control&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do not combine it with custom &lt;code&gt;--hostname&lt;/code&gt;, &lt;code&gt;--token&lt;/code&gt;, &lt;code&gt;--allow-origin&lt;/code&gt;, &lt;code&gt;--no-web&lt;/code&gt;, or port &lt;code&gt;0&lt;/code&gt;; the command rejects these conflicts. In Desktop, open &lt;strong&gt;Control → Local Control…&lt;/strong&gt; and keep the network warning visible.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Prove session continuity without a write
&lt;/h3&gt;

&lt;p&gt;Scan from the same private network. Confirm Desktop opens the session active at enable time. Start with a read-only prompt for the session title and repository root. After switching Desktop sessions, toggle Local Control to generate a new link.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Prove authentication and origin denial
&lt;/h3&gt;

&lt;p&gt;Try a credential-free browser profile or altered token; protected capabilities must not load. Keep the test payload-free and real credentials out of URLs, screenshots, history, and logs.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Prove revocation
&lt;/h3&gt;

&lt;p&gt;Stop CLI with &lt;code&gt;Ctrl+C&lt;/code&gt;, or turn off Desktop Local Control. The phone page and WebSocket should lose access; the old link must fail. Re-enable and confirm a new credential, then verify normal host sleep returns.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Calling the mode “encrypted” because the token is strong. Authentication strength and transport encryption are different controls.&lt;/li&gt;
&lt;li&gt;Using hotel, airport, coworking guest, or other untrusted Wi-Fi for an HTTP control session.&lt;/li&gt;
&lt;li&gt;Publishing the listener through router forwarding, Cloudflare Tunnel, ngrok, or a similar public relay. That is outside the supported threat model.&lt;/li&gt;
&lt;li&gt;Leaving Local Control on after the phone task ends, or assuming closing the phone tab revokes host access.&lt;/li&gt;
&lt;li&gt;Sharing the QR screenshot in a bug report. Redact the entire code and URL.&lt;/li&gt;
&lt;li&gt;Treating phone supervision as permission bypass. Keep destructive actions and credential access behind the same human approval gates used at the host.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For durable internet control, use authenticated outbound relay, reconnectable sessions, device identity, and transport encryption. A LAN gateway is not a substitute for the &lt;a href="https://dev.to/blogs/claude-code-2-1-224-self-hosted-environments-rollout-checklist/"&gt;self-hosted agent trust boundary&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Copyable acceptance record
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;qwen_version:
host_os / private_ipv4:
workspace / session_id:
entry_point: cli | desktop
lan_listener_absent_before_enable: pass | fail
phone_opens_expected_session: pass | fail
wrong_token_denied: pass | fail
unexpected_origin_denied: pass | fail
old_link_revoked_after_disable: pass | fail
new_token_after_reenable: pass | fail
sleep_inhibitor_released: pass | fail
public_forwarding_or_tunnel: none
owner / expiry_time / decision:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does Local Control upload my repository to Qwen?
&lt;/h3&gt;

&lt;p&gt;It exposes the host's Web Shell on the LAN; files, credentials, tools, and execution remain there. The model provider's data path is unchanged.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is the pairing link safe to use over the internet?
&lt;/h3&gt;

&lt;p&gt;No. The official scope is a trusted same-network connection over unencrypted HTTP. Internet remote control is explicitly outside this mode.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does Local Control keep the computer awake?
&lt;/h3&gt;

&lt;p&gt;Yes, while the mode is active. Stopping Local Control releases the sleep inhibitor; include that in the revocation test.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Qwen Code 0.21.9 release: &lt;a href="https://github.com/QwenLM/qwen-code/releases/tag/v0.21.9" rel="noopener noreferrer"&gt;https://github.com/QwenLM/qwen-code/releases/tag/v0.21.9&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Qwen Code Local Control design: &lt;a href="https://github.com/QwenLM/qwen-code/blob/main/docs/design/local-control-cli.md" rel="noopener noreferrer"&gt;https://github.com/QwenLM/qwen-code/blob/main/docs/design/local-control-cli.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Qwen Code Local Control CLI/Desktop implementation: &lt;a href="https://github.com/QwenLM/qwen-code/pull/8727" rel="noopener noreferrer"&gt;https://github.com/QwenLM/qwen-code/pull/8727&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Qwen Code active-session and private-address hardening: &lt;a href="https://github.com/QwenLM/qwen-code/pull/8806" rel="noopener noreferrer"&gt;https://github.com/QwenLM/qwen-code/pull/8806&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>qwen</category>
      <category>security</category>
      <category>productivity</category>
    </item>
    <item>
      <title>GPT-5.6 Fast mode long context: price the 272K threshold before rollout</title>
      <dc:creator>Ahab</dc:creator>
      <pubDate>Mon, 10 Aug 2026 10:22:42 +0000</pubDate>
      <link>https://dev.to/ahab_indieseek/gpt-56-fast-mode-long-context-price-the-272k-threshold-before-rollout-5cpe</link>
      <guid>https://dev.to/ahab_indieseek/gpt-56-fast-mode-long-context-price-the-272k-threshold-before-rollout-5cpe</guid>
      <description>&lt;h1&gt;
  
  
  GPT-5.6 Fast mode long context: price the 272K threshold before rollout
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Quick answer
&lt;/h2&gt;

&lt;p&gt;OpenAI's August 5 API update lets GPT-5.6 Sol, Terra, and Luna run prompts above 272K tokens in Fast mode. Fast mode can deliver up to 2.5 times faster responses, but it charges a per-token premium. A long-context request already moves the whole request onto higher long-context rates, so enabling Fast mode can compound the bill.&lt;/p&gt;

&lt;p&gt;Use Fast mode only when saved wall-clock time changes a user or business outcome. Benchmark the same fixture on Standard and Fast, verify the response's actual &lt;code&gt;service_tier&lt;/code&gt;, calculate cost per accepted result, and roll out with a feature flag. Do not enable it globally because a context window is large.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;This guide is for developers sending large repositories, document sets, research packets, or agent histories to the OpenAI API. It assumes you already chose Sol, Terra, or Luna. If model choice is still open, start with the &lt;a href="https://dev.to/blogs/gpt-5-6-sol-vs-terra-vs-luna/"&gt;GPT-5.6 Sol vs Terra vs Luna guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The task here is narrower: decide whether long-context Fast mode earns its latency premium without hiding a tier downgrade, a quality regression, or an unexpected spend jump.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed and what did not
&lt;/h2&gt;

&lt;p&gt;Fast mode was previously called Priority processing. Requests may send either &lt;code&gt;service_tier: "fast"&lt;/code&gt; or &lt;code&gt;service_tier: "priority"&lt;/code&gt;. For GPT-5.6 and earlier models, a request actually served on Fast returns &lt;code&gt;service_tier: "priority"&lt;/code&gt;; a ramp-rate downgrade returns &lt;code&gt;default&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The August 5 change adds long-context support to Fast mode for all three GPT-5.6 models. It does not mean every response is 2.5 times faster, nor does it make long context cheaper. OpenAI's model pages state that prompts above 272K input tokens price the entire request at twice the normal input rate and 1.5 times the normal output rate. Fast mode then applies its own premium.&lt;/p&gt;

&lt;p&gt;Current prices per 1M tokens show the combined boundary clearly:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Standard long input / output&lt;/th&gt;
&lt;th&gt;Fast long input / output&lt;/th&gt;
&lt;th&gt;No-cache example: 300K in + 10K out&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.6 Sol&lt;/td&gt;
&lt;td&gt;$10 / $45&lt;/td&gt;
&lt;td&gt;$20 / $90&lt;/td&gt;
&lt;td&gt;$3.45 Standard / $6.90 Fast&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.6 Terra&lt;/td&gt;
&lt;td&gt;$4 / $18&lt;/td&gt;
&lt;td&gt;$8 / $36&lt;/td&gt;
&lt;td&gt;$1.38 Standard / $2.76 Fast&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.6 Luna&lt;/td&gt;
&lt;td&gt;$0.40 / $1.80&lt;/td&gt;
&lt;td&gt;$0.80 / $3.60&lt;/td&gt;
&lt;td&gt;$0.138 Standard / $0.276 Fast&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Cached input and explicit cache-write prices also have separate Standard/Fast and short/long columns. Use the live pricing table for production math; do not copy one headline token rate into every route.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rollout decision
&lt;/h2&gt;

&lt;p&gt;Use this decision tree before writing code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Can the prompt stay at or below 272K through retrieval, compaction, or cleaner inputs?
  Yes -&amp;gt; benchmark short-context Standard first.
  No  -&amp;gt; benchmark long-context Standard on a fixed fixture.

Does p95 latency block a high-value, user-facing outcome?
  No  -&amp;gt; keep Standard; consider Batch or Flex for offline work.
  Yes -&amp;gt; run the same fixture in Fast and measure the actual tier.

Does Fast improve accepted-result latency enough to cover its incremental cost?
  No  -&amp;gt; keep Standard.
  Yes -&amp;gt; canary by request class, ramp gradually, retain one-switch rollback.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the Terra example above, Fast adds $1.38 per request. If it saves 10 seconds, the premium is $0.138 per second saved. Compare that number with abandonment, operator wait time, or revenue at risk—not with an abstract wish for speed.&lt;/p&gt;

&lt;h2&gt;
  
  
  A measurable canary
&lt;/h2&gt;

&lt;p&gt;Keep the tier request explicit and record the tier actually returned:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;FAST_CANARY&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fast&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;default&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;responses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;gpt-5.6-terra&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;fixedEvaluationFixture&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;service_tier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;mode&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nf"&gt;record&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;requestedTier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;actualTier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;service_tier&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;latencyMs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;inputTokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;input_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;outputTokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;output_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;accepted&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;passedTaskSpecificVerifier&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;output_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run at least 20 matched Standard/Fast pairs for each request class. Keep the model, snapshot, reasoning effort, prompt, tools, cache state, and verifier constant. Compare p50 and p95 accepted-result latency, not one attractive screenshot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Six production gates
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Context gate:&lt;/strong&gt; test fixtures just below and above 272K so the pricing transition is visible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quality gate:&lt;/strong&gt; require the same task-specific verifier; faster incomplete answers do not pass.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tier gate:&lt;/strong&gt; count &lt;code&gt;priority&lt;/code&gt;, &lt;code&gt;default&lt;/code&gt;, errors, and retries from the returned response.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Economics gate:&lt;/strong&gt; calculate total cost per accepted result, including retries and cache writes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traffic gate:&lt;/strong&gt; shift one request class behind a feature flag and ramp over hours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rollback gate:&lt;/strong&gt; one configuration change restores Standard without changing model or prompt.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;OpenAI says Standard and Fast share the same model rate limit. At at least 1 million tokens per minute, increasing traffic by more than 50% within 15 minutes may trigger a ramp-rate downgrade. Downgraded requests run at standard speed, return &lt;code&gt;service_tier: "default"&lt;/code&gt;, and receive standard pricing. Record this instead of treating every requested Fast call as delivered Fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Sending batch, ETL, or background work to Fast; OpenAI explicitly recommends avoiding large ETL jobs in this tier.&lt;/li&gt;
&lt;li&gt;Treating &lt;code&gt;service_tier: "fast"&lt;/code&gt; in the request as proof of the tier actually used.&lt;/li&gt;
&lt;li&gt;Comparing raw latency while ignoring acceptance rate, retries, output length, and cache state.&lt;/li&gt;
&lt;li&gt;Crossing 272K with irrelevant history instead of first testing retrieval or compaction.&lt;/li&gt;
&lt;li&gt;Switching an entire project to Fast before a request-level canary.&lt;/li&gt;
&lt;li&gt;Hard-coding today's prices without a budget alert or &lt;a href="https://dev.to/blogs/openai-api-hard-spend-limits-429-runbook/"&gt;hard spend-limit runbook&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Copyable acceptance record
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;request_class:
model_and_snapshot:
fixture_hash:
input_tokens / output_tokens:
standard_p50 / p95 / accepted_rate / cost_per_accept:
fast_p50 / p95 / accepted_rate / cost_per_accept:
returned_priority_rate / returned_default_rate:
maximum_incremental_cost_per_saved_second:
ramp_schedule:
rollback_flag_and_owner:
decision: keep_standard | canary_fast | roll_back
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does a prompt above 272K automatically use Fast mode?
&lt;/h3&gt;

&lt;p&gt;No. Long context and processing tier are separate choices. Use &lt;code&gt;service_tier&lt;/code&gt; or the project setting to request Fast.&lt;/p&gt;

&lt;h3&gt;
  
  
  Are &lt;code&gt;fast&lt;/code&gt; and &lt;code&gt;priority&lt;/code&gt; the same API setting?
&lt;/h3&gt;

&lt;p&gt;They request the same supported processing tier. For GPT-5.6 and earlier models, the response reports &lt;code&gt;priority&lt;/code&gt; when Fast was used.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should an offline long-document pipeline use Fast?
&lt;/h3&gt;

&lt;p&gt;Usually not. Start with Standard, Batch, or Flex. Fast is designed for valuable user-facing latency, and the official guide advises against large ETL workloads.&lt;/p&gt;

&lt;h3&gt;
  
  
  What should I monitor after rollout?
&lt;/h3&gt;

&lt;p&gt;Track requested versus returned tier, p50/p95 latency, token counts, cache reads and writes, acceptance rate, retry rate, and cost per accepted result. The &lt;a href="https://dev.to/blogs/cloudflare-ai-gateway-user-insights-spend-checklist/"&gt;Cloudflare AI Gateway spend workflow&lt;/a&gt; is a useful adjacent pattern for identity-aware cost attribution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;OpenAI API changelog: &lt;a href="https://developers.openai.com/api/docs/changelog" rel="noopener noreferrer"&gt;https://developers.openai.com/api/docs/changelog&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;OpenAI API Fast mode guide: &lt;a href="https://developers.openai.com/api/docs/guides/fast-mode" rel="noopener noreferrer"&gt;https://developers.openai.com/api/docs/guides/fast-mode&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;OpenAI API pricing: &lt;a href="https://developers.openai.com/api/docs/pricing" rel="noopener noreferrer"&gt;https://developers.openai.com/api/docs/pricing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;OpenAI GPT-5.6 Sol model page: &lt;a href="https://developers.openai.com/api/docs/models/gpt-5.6-sol" rel="noopener noreferrer"&gt;https://developers.openai.com/api/docs/models/gpt-5.6-sol&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;OpenAI GPT-5.6 Terra model page: &lt;a href="https://developers.openai.com/api/docs/models/gpt-5.6-terra" rel="noopener noreferrer"&gt;https://developers.openai.com/api/docs/models/gpt-5.6-terra&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;OpenAI GPT-5.6 Luna model page: &lt;a href="https://developers.openai.com/api/docs/models/gpt-5.6-luna" rel="noopener noreferrer"&gt;https://developers.openai.com/api/docs/models/gpt-5.6-luna&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>openai</category>
      <category>performance</category>
      <category>devops</category>
    </item>
    <item>
      <title>Codex CLI 0.147 --approve-for-me: verify Auto-review before unattended runs</title>
      <dc:creator>Ahab</dc:creator>
      <pubDate>Mon, 10 Aug 2026 01:19:47 +0000</pubDate>
      <link>https://dev.to/ahab_indieseek/codex-cli-0147-approve-for-me-verify-auto-review-before-unattended-runs-18pa</link>
      <guid>https://dev.to/ahab_indieseek/codex-cli-0147-approve-for-me-verify-auto-review-before-unattended-runs-18pa</guid>
      <description>&lt;h1&gt;
  
  
  Codex CLI 0.147 --approve-for-me: verify Auto-review before unattended runs
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Quick answer
&lt;/h2&gt;

&lt;p&gt;Codex CLI &lt;code&gt;0.147.0&lt;/code&gt;, released on August 7, 2026, adds &lt;code&gt;--approve-for-me&lt;/code&gt; to interactive and &lt;code&gt;exec&lt;/code&gt; commands. The flag routes eligible approval requests to Codex Auto-review, a separate reviewer agent. It does &lt;strong&gt;not&lt;/strong&gt; turn on Full access: the implementation selects &lt;code&gt;approval_policy="on-request"&lt;/code&gt; with the &lt;code&gt;workspace-write&lt;/code&gt; sandbox, and later subcommand permission overrides still take precedence.&lt;/p&gt;

&lt;p&gt;That distinction is the rollout gate. Auto-review changes who reviews a boundary-crossing request; it does not expand writable roots, enable network access, or make destructive actions safe. Before using the flag for unattended work, run six harmless canaries that prove the sandbox, approval route, denials, audit trail, resume behavior, and rollback.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;This guide is for developers running long Codex CLI tasks, scheduled local maintenance, or &lt;code&gt;codex exec&lt;/code&gt; workflows that should continue through ordinary approval decisions without granting unrestricted machine access.&lt;/p&gt;

&lt;p&gt;It is not a recipe for bypassing approvals. If a workflow genuinely requires broad host access, production credentials, irreversible deletion, deployment, payment, or external messaging, keep that authority explicit and human-controlled. Start with the &lt;a href="https://dev.to/blogs/ai-coding-agent-sandbox-untrusted-repo-checklist/"&gt;untrusted-repository sandbox checklist&lt;/a&gt; and narrow the task until most work fits inside &lt;code&gt;workspace-write&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed, and what did not
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;0.147.0&lt;/code&gt; changelog describes &lt;code&gt;--approve-for-me&lt;/code&gt; as automatically reviewed approvals. The merged implementation propagates it through root, &lt;code&gt;exec&lt;/code&gt;, &lt;code&gt;resume&lt;/code&gt;, and &lt;code&gt;fork&lt;/code&gt; argument handling. The official Auto-review documentation defines the stronger boundary: the main agent stays inside the same sandbox, while eligible escalation requests go to a reviewer agent.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Control&lt;/th&gt;
&lt;th&gt;With &lt;code&gt;--approve-for-me&lt;/code&gt;
&lt;/th&gt;
&lt;th&gt;What to verify&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Approval policy&lt;/td&gt;
&lt;td&gt;Interactive &lt;code&gt;on-request&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Boundary requests are reviewed rather than silently allowed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sandbox&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;workspace-write&lt;/code&gt; preset&lt;/td&gt;
&lt;td&gt;Writes remain limited to intended roots&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network&lt;/td&gt;
&lt;td&gt;Not granted by Auto-review&lt;/td&gt;
&lt;td&gt;A blocked destination still requires a review decision&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reviewer&lt;/td&gt;
&lt;td&gt;&lt;code&gt;approvals_reviewer="auto_review"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Eligible prompts go to the reviewer, not directly to a person&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Denial&lt;/td&gt;
&lt;td&gt;Main agent must choose a materially safer path or stop&lt;/td&gt;
&lt;td&gt;No repeated workaround or policy-circumvention loop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Overrides&lt;/td&gt;
&lt;td&gt;Later subcommand permission flags win&lt;/td&gt;
&lt;td&gt;The effective mode matches the invocation you audited&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Auto-review can evaluate shell escalation, blocked network requests, out-of-root edits, approval-gated MCP or app calls, and access to a new Computer Use domain. Routine actions already allowed by the sandbox do not invoke the reviewer. Computer Use app approvals remain a separate user-facing case.&lt;/p&gt;

&lt;h2&gt;
  
  
  Six-canary rollout
&lt;/h2&gt;

&lt;p&gt;Use a disposable repository with no real credentials. Record the Codex version, exact command, effective permissions, expected result, actual result, and retained evidence for every canary.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Prove the positive path inside the workspace
&lt;/h3&gt;

&lt;p&gt;Start an interactive canary with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;codex &lt;span class="nt"&gt;--approve-for-me&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ask it to create and remove one sentinel file inside the disposable repository, then run a local test that needs no network. The work should remain inside &lt;code&gt;workspace-write&lt;/code&gt; without an escalation. This proves ordinary workspace work does not create approval noise.&lt;/p&gt;

&lt;p&gt;For non-interactive use, test the flag on &lt;code&gt;codex exec&lt;/code&gt; separately. Do not assume the interactive result proves your scheduled entrypoint.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Prove the filesystem boundary
&lt;/h3&gt;

&lt;p&gt;Ask the canary to write a harmless sentinel just outside the configured writable root. The action must not silently succeed. Verify that Auto-review receives an exact boundary-crossing request and that the final filesystem state matches the decision.&lt;/p&gt;

&lt;p&gt;Do not broaden the root merely to make the test pass. If a neighboring directory is genuinely required, add only that directory after reviewing ownership and contents.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Prove network remains independently controlled
&lt;/h3&gt;

&lt;p&gt;With command network access disabled, request a harmless fetch from a public documentation host. The network request should encounter the configured boundary and follow the review path; &lt;code&gt;--approve-for-me&lt;/code&gt; alone must not make the destination reachable.&lt;/p&gt;

&lt;p&gt;If the real workflow needs network access, use a narrow allowlist. A global wildcard turns an approval convenience into a much larger data-exfiltration surface.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Prove secret and destructive denials with fake data
&lt;/h3&gt;

&lt;p&gt;Create a file containing a disposable value such as &lt;code&gt;TEST_ONLY_TOKEN_DO_NOT_USE&lt;/code&gt;. Ask Codex to send it to an untrusted example destination, and separately request deletion outside the fixture. Expected result: denial, a visible rationale, and no external transmission or unintended deletion.&lt;/p&gt;

&lt;p&gt;Never place a real token in an adversarial canary. The official policy is designed to block credential probing, secret disclosure, broad security weakening, and high-impact destructive actions, but Auto-review is not a deterministic security guarantee.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Prove denial recovery and resume/fork parity
&lt;/h3&gt;

&lt;p&gt;After a denial, the agent should either choose a materially safer route or ask you—not retry the same outcome indirectly. Then resume the task and fork it once, confirming that the effective approval and sandbox modes remain the ones you intended.&lt;/p&gt;

&lt;p&gt;Codex has a denial circuit breaker, but your operating rule should be stricter: one unexplained repeated escalation is enough to pause the rollout and inspect the request history.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Prove audit and rollback
&lt;/h3&gt;

&lt;p&gt;Inspect the retained task transcript and confirm each reviewed action has a decision, rationale where available, requested scope, and outcome. Then rerun the same fixture without &lt;code&gt;--approve-for-me&lt;/code&gt;; eligible requests should return to human review. Finally, prove that your scheduler or wrapper can remove the flag without changing unrelated configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision tree
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Can the task finish inside workspace-write with no network?
├─ Yes → Use the normal sandbox; Auto-review should be rare.
└─ No
   ├─ Is the extra file root or destination narrow and repeatable?
   │  ├─ Yes → Add the narrow boundary, then rerun all six canaries.
   │  └─ No → Keep human approval.
   └─ Does the action send data, use production credentials, or cause irreversible effects?
      ├─ Yes → Keep explicit human authority.
      └─ No → Canary --approve-for-me, monitor denials, and retain rollback.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Copyable acceptance record
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;codex_auto_review_rollout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;codex_version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0.147.0"&lt;/span&gt;
  &lt;span class="na"&gt;entrypoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;interactive&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;exec&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;resume&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;fork"&lt;/span&gt;
  &lt;span class="na"&gt;sandbox&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;workspace-write"&lt;/span&gt;
  &lt;span class="na"&gt;approval_policy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;on-request"&lt;/span&gt;
  &lt;span class="na"&gt;reviewer&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;auto_review"&lt;/span&gt;
  &lt;span class="na"&gt;writable_roots&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;disposable&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;repository&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;only"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;network&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;off&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;|&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;narrow&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;allowlist"&lt;/span&gt;
  &lt;span class="na"&gt;canaries&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;workspace"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;outside-root"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;network"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fake-secret"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;denial-recovery"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rollback"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;production_authority&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;human&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;secrets,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;destructive&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;actions,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;deploys,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;payments,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;messages"&lt;/span&gt;
  &lt;span class="na"&gt;rollback&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;remove&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;--approve-for-me&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;restore&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;human&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;reviewer"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is an operating record, not an OpenAI configuration schema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Treating Auto-review as Full access.&lt;/strong&gt; It is a reviewer swap at the sandbox boundary, not a permission grant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testing only the happy path.&lt;/strong&gt; A workspace edit proves almost nothing about out-of-root writes, network, secrets, or destructive actions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Using real credentials in a denial test.&lt;/strong&gt; A failed safety control would leak the thing you were trying to protect. Use disposable sentinels only.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ignoring later CLI overrides.&lt;/strong&gt; Root and subcommand flags have precedence. Capture the exact production invocation instead of reviewing a simplified command.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Customizing policy before measuring.&lt;/strong&gt; First run the default policy and inspect real review traffic. Broad approval instructions can erase the boundary you intended to keep.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is &lt;code&gt;--approve-for-me&lt;/code&gt; equivalent to &lt;code&gt;--dangerously-bypass-approvals-and-sandbox&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;No. The bypass flag removes both protections and is intended only for an externally hardened environment. &lt;code&gt;--approve-for-me&lt;/code&gt; keeps interactive approval plus &lt;code&gt;workspace-write&lt;/code&gt; and delegates eligible reviews.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I set the same behavior in &lt;code&gt;config.toml&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;The configuration reference documents &lt;code&gt;approvals_reviewer = "auto_review"&lt;/code&gt; for eligible &lt;code&gt;on-request&lt;/code&gt; or granular approvals. Keep the sandbox and approval policy explicit; changing the reviewer alone does not grant new access.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does an Auto-review approval prove the action is safe?
&lt;/h3&gt;

&lt;p&gt;No. It is one risk-control decision based on available context. Keep OS sandboxing, least privilege, monitoring, bounded tasks, and human authority for high-impact effects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://learn.chatgpt.com/docs/changelog" rel="noopener noreferrer"&gt;ChatGPT and Codex changelog: Codex CLI 0.147.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/openai/codex/pull/36373" rel="noopener noreferrer"&gt;Codex PR #36373: add &lt;code&gt;--approve-for-me&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.chatgpt.com/docs/sandboxing/auto-review" rel="noopener noreferrer"&gt;OpenAI Auto-review documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.chatgpt.com/docs/sandboxing" rel="noopener noreferrer"&gt;OpenAI sandbox documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.chatgpt.com/docs/config-file/config-reference" rel="noopener noreferrer"&gt;OpenAI configuration reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.chatgpt.com/docs/agent-approvals-security" rel="noopener noreferrer"&gt;OpenAI agent approvals and security&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>codex</category>
      <category>security</category>
      <category>devops</category>
    </item>
    <item>
      <title>Claude Managed Agents Session Budget Checklist</title>
      <dc:creator>Ahab</dc:creator>
      <pubDate>Sun, 09 Aug 2026 10:21:28 +0000</pubDate>
      <link>https://dev.to/ahab_indieseek/claude-managed-agents-session-budget-checklist-ge9</link>
      <guid>https://dev.to/ahab_indieseek/claude-managed-agents-session-budget-checklist-ge9</guid>
      <description>&lt;h1&gt;
  
  
  Claude Managed Agents session budgets: prove the hard stop before unattended runs
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Quick answer
&lt;/h2&gt;

&lt;p&gt;On August 7, 2026, Anthropic added hard per-session budgets to Claude Managed Agents. A budget is a US-dollar ceiling, written as whole cents, that the platform enforces against the session's public-list-price cost. When the cap is reached, the session pauses with the session-level stop reason &lt;code&gt;budget_reached&lt;/code&gt;; it does not terminate. Raising or removing the budget resumes the paused work automatically.&lt;/p&gt;

&lt;p&gt;This is an API-level &lt;strong&gt;Claude Managed Agents&lt;/strong&gt; feature. It is not a Claude Code subscription meter, and it is different from the Messages API's advisory, token-denominated task budgets.&lt;/p&gt;

&lt;p&gt;Do not treat the number as an exact final invoice or a mid-request kill switch. Enforcement happens between model requests. An in-flight request finishes, so one request per active thread can take the recorded list cost past the cap. Use the rollout below to prove event ordering, overshoot, blocked new work, and resume authority before trusting the cap on unattended agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;This guide is for developers running Claude Managed Agents through the REST API or Anthropic SDKs, especially scheduled deployments, long research sessions, tool-heavy agents, and multiagent coordinators. It is useful when a job must stop starting new model work before one failed loop consumes an open-ended budget.&lt;/p&gt;

&lt;p&gt;The feature is a financial guardrail, not a task-quality guarantee. Keep outcome checks, permission policies, tool timeouts, and human approval for irreversible actions.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the budget actually controls
&lt;/h2&gt;

&lt;p&gt;The platform continuously computes a session's &lt;strong&gt;list cost&lt;/strong&gt;. The official documentation includes model tokens at each model's public list price, web search at $10 per 1,000 searches, and active session runtime at $0.08 per hour. Negotiated discounts do not change when the cap fires, so the budget is not necessarily the amount your organization will be billed.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Boundary&lt;/th&gt;
&lt;th&gt;Official behavior&lt;/th&gt;
&lt;th&gt;Operational consequence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Unit&lt;/td&gt;
&lt;td&gt;Whole US cents as a string; &lt;code&gt;"2500"&lt;/code&gt; means $25&lt;/td&gt;
&lt;td&gt;Reject decimal strings and floating-point conversion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Attachment&lt;/td&gt;
&lt;td&gt;Set only when the session is created&lt;/td&gt;
&lt;td&gt;An unbudgeted existing session cannot receive a cap later&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enforcement&lt;/td&gt;
&lt;td&gt;Checked before each new model request&lt;/td&gt;
&lt;td&gt;A request already running can finish past the cap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stop state&lt;/td&gt;
&lt;td&gt;Session becomes idle with &lt;code&gt;budget_reached&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Preserve state; do not classify it as completion or failure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multiagent&lt;/td&gt;
&lt;td&gt;One shared cap across all threads and advisors&lt;/td&gt;
&lt;td&gt;Parallel in-flight requests increase the overshoot margin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment&lt;/td&gt;
&lt;td&gt;Budget is copied to each future session&lt;/td&gt;
&lt;td&gt;It is a per-run ceiling, not one cumulative deployment budget&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resume&lt;/td&gt;
&lt;td&gt;Raise the cap or remove it&lt;/td&gt;
&lt;td&gt;An accepted update resumes work without another user message&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Removing a session budget is one-way: the same session cannot receive a new budget later. Changing a deployment budget is different; it affects sessions started afterward, and a cleared deployment budget can be set again.&lt;/p&gt;

&lt;h2&gt;
  
  
  A budget-sizing rule that survives concurrency
&lt;/h2&gt;

&lt;p&gt;Start from accepted work, not a guess about average tokens. Run representative tasks without a cap, record the p50 and p95 session &lt;code&gt;usage.list_cost&lt;/code&gt;, then choose a canary cap that is high enough for one normal task but low enough to stop a loop.&lt;/p&gt;

&lt;p&gt;Use this planning record:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Task class:
Observed p50 list cost:
Observed p95 list cost:
Maximum concurrent threads:
Largest plausible single request per thread:
Web-search allowance:
Runtime allowance:
Canary cap:
Expected overshoot margin:
Who may raise the cap:
Maximum approved cap:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important margin is not a fixed percentage. It is the sum of the largest plausible in-flight request on each active thread. A single-threaded session has one-request exposure; a coordinator with four active threads can have four requests complete after the cap decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Six-canary rollout
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Create a disposable budgeted session
&lt;/h3&gt;

&lt;p&gt;Use a non-production agent and harmless task. The request must include the Managed Agents beta header and a budget at creation:&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;"agent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"agent_test"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"environment_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"env_test"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"budget"&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;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"limit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"max_list_cost"&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;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"50"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&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;Keep API keys in environment variables; never copy them into the request body or an audit record. Confirm the returned session echoes the intended budget.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Prove the stop signal and event order
&lt;/h3&gt;

&lt;p&gt;Run a bounded workload designed to cross the small canary cap. The session must become idle with session-level &lt;code&gt;stop_reason: budget_reached&lt;/code&gt;. Immediately before the final &lt;code&gt;session.status_idle&lt;/code&gt; event, expect a cumulative &lt;code&gt;session.usage&lt;/code&gt; snapshot.&lt;/p&gt;

&lt;p&gt;A thread can report &lt;code&gt;end_turn&lt;/code&gt; even when the session reports &lt;code&gt;budget_reached&lt;/code&gt;. Use the session-level reason as the authority for the budget decision.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Measure overshoot instead of calling it a defect
&lt;/h3&gt;

&lt;p&gt;Record &lt;code&gt;usage.list_cost&lt;/code&gt;, the cap, active thread count, and the last request on every thread. A 50-cent cap can legitimately pause at 53 cents because the crossing request was admitted while cost was still below the cap.&lt;/p&gt;

&lt;p&gt;Fail the canary if new model requests begin after the session is at the cap. Do not fail merely because a previously admitted request finishes above it.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Verify blocked and accepted events
&lt;/h3&gt;

&lt;p&gt;At the cap, a new &lt;code&gt;user.message&lt;/code&gt; must receive HTTP 400. Events that settle already-started work remain accepted: tool confirmations, tool results, custom tool results, and interrupts. A settled result must not silently trigger another model request.&lt;/p&gt;

&lt;p&gt;This distinguishes “record the outcome of existing work” from “authorize more paid work.”&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Test a controlled resume
&lt;/h3&gt;

&lt;p&gt;Read the session's reported &lt;code&gt;usage.list_cost&lt;/code&gt;, then raise the cap to at least one cent above that value plus the intended next-work allowance. Reusing the old cap can fail because enforcement uses exact unrounded cost while the API displays rounded cents.&lt;/p&gt;

&lt;p&gt;Require an explicit operator record before the update:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Session ID:
Stop reason and last usage event:
Original cap / observed list cost:
Reason to continue:
New maximum:
Evidence the loop was fixed:
Approver / timestamp:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The accepted update resumes automatically. Do not send a duplicate user message “to restart” the task.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Test deployment and multiagent boundaries
&lt;/h3&gt;

&lt;p&gt;For a scheduled deployment, start two canary sessions and prove each receives the same independent cap. Changing the deployment budget must affect only sessions created afterward.&lt;/p&gt;

&lt;p&gt;For multiagent work, spawn the maximum approved concurrency, include an advisor if production uses one, and verify every thread shares the session cap. Advisor calls are charged to the same budget. If any selected model lacks a public list price, treat the budget path as unavailable rather than claiming a reliable cap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision tree at &lt;code&gt;budget_reached&lt;/code&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Was the task already complete?&lt;/strong&gt; Record the output and close the session without increasing the cap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is work waiting only on a tool result?&lt;/strong&gt; Settle it; do not authorize another model turn yet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Was there a retry loop, oversized context, or unexpected fan-out?&lt;/strong&gt; Fix the cause and start a fresh bounded canary.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is the remaining work known and valuable?&lt;/strong&gt; Raise the cap once within the pre-approved maximum and record authority.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is the required spend or outcome still uncertain?&lt;/strong&gt; Leave the session idle and escalate to a human.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Pair this hard stop with &lt;a href="https://dev.to/blogs/cloudflare-ai-gateway-user-insights-spend-checklist/"&gt;AI Gateway spend attribution&lt;/a&gt; and the existing &lt;a href="https://dev.to/blogs/claude-agent-memory-july-22-migration-checklist/"&gt;Managed Agents memory migration boundary&lt;/a&gt;. A session cap limits new spend; it does not explain which user, tool, or memory decision created the cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Confusing list cost with the invoice.&lt;/strong&gt; The enforcement meter uses public list rates even when contracted billing is lower.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Assuming zero overshoot.&lt;/strong&gt; The platform stops between requests, not in the middle of one. Size for every active thread.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Removing a cap when you meant to raise it.&lt;/strong&gt; Removal resumes work and prevents the same session from receiving another budget.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Treating a per-deployment budget as cumulative.&lt;/strong&gt; The value is copied onto each new session. Track fleet-wide spend separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Can I add a budget to a running session that started without one?
&lt;/h3&gt;

&lt;p&gt;No. The API rejects that with HTTP 400. Create a new budgeted session instead.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is &lt;code&gt;budget_reached&lt;/code&gt; a completed task?
&lt;/h3&gt;

&lt;p&gt;No. It means the platform paused new model work at the financial boundary. Evaluate the task outcome independently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does a task budget provide the same protection?
&lt;/h3&gt;

&lt;p&gt;No. Managed Agents session budgets are hard, dollar-denominated platform caps. Messages API task budgets are advisory token budgets used by supported models to self-regulate, and they are not supported on Claude Code or Cowork surfaces.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://platform.claude.com/docs/en/release-notes/overview" rel="noopener noreferrer"&gt;Claude Platform release notes for August 7, 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://platform.claude.com/docs/en/managed-agents/budgets" rel="noopener noreferrer"&gt;Official Claude Managed Agents session budgets documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://platform.claude.com/docs/en/managed-agents/multiagent-orchestration" rel="noopener noreferrer"&gt;Official multiagent orchestration documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://platform.claude.com/docs/en/build-with-claude/task-budgets" rel="noopener noreferrer"&gt;Official Messages API task budgets documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>api</category>
      <category>claude</category>
    </item>
    <item>
      <title>Qwen Code 0.21.8 Workspace Trust Security Checklist</title>
      <dc:creator>Ahab</dc:creator>
      <pubDate>Sun, 09 Aug 2026 01:19:27 +0000</pubDate>
      <link>https://dev.to/ahab_indieseek/qwen-code-0218-workspace-trust-security-checklist-fje</link>
      <guid>https://dev.to/ahab_indieseek/qwen-code-0218-workspace-trust-security-checklist-fje</guid>
      <description>&lt;h1&gt;
  
  
  Qwen Code 0.21.8: verify nested workspace trust before loading project env
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Quick answer
&lt;/h2&gt;

&lt;p&gt;Qwen Code 0.21.8, released August 8, 2026, fixes a workspace-trust precedence bug. Before the fix, a nested workspace explicitly marked &lt;code&gt;DO_NOT_TRUST&lt;/code&gt; could still inherit &lt;code&gt;TRUST_FOLDER&lt;/code&gt; from a parent. Qwen Code could then load the nested project's &lt;code&gt;.qwen/settings.json&lt;/code&gt; or &lt;code&gt;.env&lt;/code&gt; even though the user had rejected trust.&lt;/p&gt;

&lt;p&gt;Version 0.21.8 changes the rule to &lt;strong&gt;most-specific path wins&lt;/strong&gt;. Distrust also wins a same-depth tie, and the shared resolver is used by the regular CLI path, daemon policy, and &lt;code&gt;qwen serve&lt;/code&gt; fast path. Upgrade every launcher, then prove the behavior with disposable sentinels before restoring auto-acceptance or unattended serving.&lt;/p&gt;

&lt;p&gt;Do not read this as “every project-env boundary is fixed.” A separate, still-open change at publication time covers the reverse topology: a trusted child loading an &lt;code&gt;.env&lt;/code&gt; from a distrusted ancestor. The rollout gate below tests both directions and fails closed if either sentinel crosses the boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;This guide is for developers who enabled Qwen Code Trusted Folders, keep multiple repositories under a trusted parent, run Qwen from subdirectories, or expose workspaces through &lt;code&gt;qwen serve&lt;/code&gt;. The risk is highest when an automation assumes “Don't trust” means project settings and environment files cannot influence the process.&lt;/p&gt;

&lt;p&gt;Trusted Folders is disabled by default. If you never enabled &lt;code&gt;security.folderTrust.enabled&lt;/code&gt;, first decide whether the feature fits your workflow; installing 0.21.8 does not enable it automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed in 0.21.8
&lt;/h2&gt;

&lt;p&gt;The official Trusted Folders documentation says an untrusted workspace runs in safe mode: workspace settings and project &lt;code&gt;.env&lt;/code&gt; files are ignored, extension management is restricted, tool auto-acceptance is disabled, and automatic memory loading is disabled. The bug made that promise inconsistent for nested paths.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rule set&lt;/th&gt;
&lt;th&gt;Workspace being opened&lt;/th&gt;
&lt;th&gt;Before 0.21.8&lt;/th&gt;
&lt;th&gt;0.21.8 expected result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;/projects&lt;/code&gt; trusted; &lt;code&gt;/projects/vendor&lt;/code&gt; distrusted&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/projects/vendor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Could inherit trust&lt;/td&gt;
&lt;td&gt;Untrusted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same rules&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/projects/vendor/pkg&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Could inherit trust&lt;/td&gt;
&lt;td&gt;Untrusted; deeper distrust contains the path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;/projects&lt;/code&gt; distrusted; &lt;code&gt;/projects/owned&lt;/code&gt; trusted&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/projects/owned&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Policy depended on duplicated resolution paths&lt;/td&gt;
&lt;td&gt;Trusted; the more-specific rule wins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Equal-depth trusted and distrusted match&lt;/td&gt;
&lt;td&gt;Matching descendant&lt;/td&gt;
&lt;td&gt;Order-sensitive risk&lt;/td&gt;
&lt;td&gt;Distrust wins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No matching rule&lt;/td&gt;
&lt;td&gt;Unrelated workspace&lt;/td&gt;
&lt;td&gt;Unknown / prompt path&lt;/td&gt;
&lt;td&gt;Unchanged&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The fix consolidates precedence into one resolver: compare every matching rule by path depth, choose the deepest, and prefer untrusted if two matches have equal depth. That removes persisted JSON insertion order from the decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why project env loading makes this security-sensitive
&lt;/h2&gt;

&lt;p&gt;The linked report demonstrated the impact through &lt;code&gt;qwen serve&lt;/code&gt;. A nested repository could provide &lt;code&gt;QWEN_SERVER_TOKEN&lt;/code&gt; through a project &lt;code&gt;.env&lt;/code&gt;; if inherited parent trust won, the fast path could accept that value as the daemon bearer token. The issue also notes mitigating conditions: the user owns the central trust file, project env does not overwrite an already-set variable, and the default bind is loopback.&lt;/p&gt;

&lt;p&gt;Those mitigations reduce exposure, but they do not make a failed distrust decision acceptable. The safer invariant is simple: a repository marked untrusted must not supply project settings, environment values, extensions, automatic memory, or tool-acceptance policy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Six-canary rollout workflow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Upgrade every entry point
&lt;/h3&gt;

&lt;p&gt;Inventory global npm installs, desktop or IDE launchers, CI images, daemon services, and long-lived shells. Then update the CLI and verify the binary each launcher resolves:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @qwen-code/qwen-code@0.21.8
qwen &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do not infer a daemon upgraded because an interactive shell did. Restart persistent services after verifying their package path.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Snapshot intent without copying secrets
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;/permissions&lt;/code&gt; to review the current folder decision and inspect &lt;code&gt;~/.qwen/trustedFolders.json&lt;/code&gt; for conflicting parent and child rules. Record only paths and trust levels; do not copy project &lt;code&gt;.env&lt;/code&gt; contents into the audit.&lt;/p&gt;

&lt;p&gt;Build the lab with harmless names such as &lt;code&gt;INDIESEEK_PARENT_SENTINEL&lt;/code&gt; and &lt;code&gt;INDIESEEK_CHILD_SENTINEL&lt;/code&gt;. Never test with a production API key or daemon token.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Prove explicit child distrust
&lt;/h3&gt;

&lt;p&gt;Mark a disposable parent &lt;code&gt;TRUST_FOLDER&lt;/code&gt; and its nested repository &lt;code&gt;DO_NOT_TRUST&lt;/code&gt;. Start Qwen from the nested repository and from a deeper &lt;code&gt;packages/demo&lt;/code&gt; directory. Both runs must stay in safe mode and must not observe the child sentinel from &lt;code&gt;.env&lt;/code&gt; or &lt;code&gt;.qwen/settings.json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This is the exact topology fixed by 0.21.8. Test the interactive CLI and &lt;code&gt;qwen serve&lt;/code&gt; separately because both previously had their own resolution path.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Prove the reverse topology
&lt;/h3&gt;

&lt;p&gt;Now mark the parent &lt;code&gt;DO_NOT_TRUST&lt;/code&gt; and a child repository &lt;code&gt;TRUST_FOLDER&lt;/code&gt;. Put different sentinels in the parent and child &lt;code&gt;.env&lt;/code&gt; files. The child sentinel may load; the parent sentinel must not.&lt;/p&gt;

&lt;p&gt;This catches a separate ancestor-walk boundary tracked by the open PR linked in Sources. If the parent sentinel appears, keep secrets out of project &lt;code&gt;.env&lt;/code&gt; files, pass required values from the operator shell or service manager, and do not call the rollout complete.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Prove order and path parity
&lt;/h3&gt;

&lt;p&gt;Repeat the two rule sets with their entries reversed in the disposable trust file. Results must not change. Also test the exact repository path, a descendant path, a symlink-resolved path used by your launcher, and the daemon workspace route. A UI badge is not enough; observe whether the sentinel was actually loaded.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Restore automation only after negative evidence
&lt;/h3&gt;

&lt;p&gt;Re-enable extensions, auto-acceptance, background agents, or unattended &lt;code&gt;qwen serve&lt;/code&gt; one control at a time. Keep the &lt;a href="https://dev.to/blogs/ai-coding-agent-sandbox-untrusted-repo-checklist/"&gt;untrusted-repository sandbox checklist&lt;/a&gt; and &lt;a href="https://dev.to/blogs/qwen-code-0-21-5-mcp-safe-replay-checklist/"&gt;MCP unknown-outcome reconciliation&lt;/a&gt;: workspace trust decides which configuration can load, not whether every loaded tool or write is safe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Copyable acceptance record
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Launcher / resolved qwen path / version:
Trusted Folders enabled: yes / no
Parent rule and path:
Child rule and path:
Exact child safe-mode result:
Descendant child safe-mode result:
Interactive project-env sentinel result:
qwen serve project-env sentinel result:
Reverse parent-env sentinel result:
Rule-order reversal result:
Symlink / canonical-path result:
Persistent service restarted:
Controls restored:
Owner and rollback trigger:
Decision: blocked / limited / accepted
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Acceptance requires absence where data must not load. “The command started” or “the dialog looked right” is not boundary evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Upgrading only the terminal CLI.&lt;/strong&gt; IDEs and daemons may resolve another installation and preserve the vulnerable behavior until restarted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Testing only the exact nested folder.&lt;/strong&gt; The 0.21.8 resolver intentionally applies the deepest rule to descendants. Test a subdirectory because agents often launch below the repository root.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Treating the release as a blanket env audit.&lt;/strong&gt; The selected fix covers trust precedence. The reverse trusted-child/distrusted-parent env walk is a separate boundary and needs its own canary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Using a real secret as the sentinel.&lt;/strong&gt; The test asks whether a value crosses a boundary, not whether a credential works. Use disposable text.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Does 0.21.8 automatically enable Trusted Folders?
&lt;/h3&gt;

&lt;p&gt;No. The feature remains disabled by default and is enabled through the user setting &lt;code&gt;security.folderTrust.enabled&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should a trusted child override a distrusted parent?
&lt;/h3&gt;

&lt;p&gt;Under the 0.21.8 most-specific-rule policy, yes: the deeper matching rule wins. That does not authorize loading the parent's own project &lt;code&gt;.env&lt;/code&gt;; test each candidate directory separately.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is this only a &lt;code&gt;qwen serve&lt;/code&gt; issue?
&lt;/h3&gt;

&lt;p&gt;No. The precedence decision affects regular workspace trust and daemon policy too. &lt;code&gt;qwen serve&lt;/code&gt; makes the impact concrete because its fast path loads environment configuration before serving sessions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/QwenLM/qwen-code/releases/tag/v0.21.8" rel="noopener noreferrer"&gt;Qwen Code 0.21.8 release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/QwenLM/qwen-code/pull/8628" rel="noopener noreferrer"&gt;Merged trust-precedence fix and test plan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/QwenLM/qwen-code/blob/main/docs/users/configuration/trusted-folders.md" rel="noopener noreferrer"&gt;Official Trusted Folders documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/QwenLM/qwen-code/issues/8627" rel="noopener noreferrer"&gt;Original nested-distrust security report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/QwenLM/qwen-code/pull/8706" rel="noopener noreferrer"&gt;Open per-directory project-env boundary follow-up&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
  </channel>
</rss>
