<?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>GPT-6 Astra API migration checklist: budget accepted runs and keep agent authority fail-closed</title>
      <dc:creator>Ahab</dc:creator>
      <pubDate>Fri, 04 Sep 2026 10:05:41 +0000</pubDate>
      <link>https://dev.to/ahab_indieseek/gpt-6-astra-api-migration-checklist-budget-accepted-runs-and-keep-agent-authority-fail-closed-5969</link>
      <guid>https://dev.to/ahab_indieseek/gpt-6-astra-api-migration-checklist-budget-accepted-runs-and-keep-agent-authority-fail-closed-5969</guid>
      <description>&lt;h1&gt;
  
  
  GPT-6 Astra API migration checklist: budget accepted runs and keep agent authority fail-closed
&lt;/h1&gt;

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

&lt;p&gt;GPT-6 Astra is not a reason to replace every production route at once. OpenAI identifies the API model as &lt;code&gt;gpt-6-astra&lt;/code&gt;, supports reasoning levels from &lt;code&gt;low&lt;/code&gt; through &lt;code&gt;max&lt;/code&gt;, and lists Standard API pricing of $10 per million input tokens and $50 per million output tokens. Its launch is staged, so first prove that your project can make a minimal request before planning a migration.&lt;/p&gt;

&lt;p&gt;The safe unit of change is one route with one acceptance fixture. Pin the current model, set a whole-run budget, test tool authority separately from answer quality, then promote only if accepted-run economics improve. This is part two of the GPT-6 Astra series: &lt;a href="https://indieseek.co/blogs/gpt-6-astra-chatgpt-api-enterprise-rollout-checklist/?utm_source=devto" rel="noopener noreferrer"&gt;part one separates ChatGPT, API, and enterprise access&lt;/a&gt;; this page is about an API route that is already eligible to test.&lt;/p&gt;

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

&lt;p&gt;Use this when you operate an API-backed coding helper, research workflow, support classifier, or agent route and want to trial GPT-6 Astra without widening permissions or silently multiplying spend. It is not a claim that a visible ChatGPT picker grants API access, nor that a successful request means a production migration is complete.&lt;/p&gt;

&lt;p&gt;If your immediate failure is a 429 or account ceiling, use the &lt;a href="https://indieseek.co/blogs/openai-api-hard-spend-limits-429-runbook/?utm_source=devto" rel="noopener noreferrer"&gt;OpenAI API hard-spend-limit runbook&lt;/a&gt; before changing models.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changes the migration plan
&lt;/h2&gt;

&lt;p&gt;OpenAI's model page lists a 1,050,000-token context window, 128,000 maximum output tokens, and reasoning efforts &lt;code&gt;low&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt;, &lt;code&gt;high&lt;/code&gt;, &lt;code&gt;xhigh&lt;/code&gt;, and &lt;code&gt;max&lt;/code&gt;. These are capacity settings, not a recommended default configuration. A longer prompt, higher effort, tool loop, retry, and large output can all contribute to the cost of the one result your user accepts.&lt;/p&gt;

&lt;p&gt;The launch page also describes Fast mode as up to twice Standard speed at twice Standard price. Treat it as a route-level latency option, never as a blanket migration setting. The model is designed for complex multi-step work, but model capability does not authorize a file write, network request, purchase, or customer-facing action in your product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make one migration 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;route&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;repo-fix | research-brief | support-triage&lt;/span&gt;
&lt;span class="na"&gt;candidate_model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gpt-6-astra&lt;/span&gt;
&lt;span class="na"&gt;baseline_model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pinned-current-model&lt;/span&gt;
&lt;span class="na"&gt;fixture_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;stable-and-non-sensitive&lt;/span&gt;
&lt;span class="na"&gt;reasoning_effort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;medium&lt;/span&gt;
&lt;span class="na"&gt;input_cap&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;120000&lt;/span&gt;
&lt;span class="na"&gt;output_cap&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;12000&lt;/span&gt;
&lt;span class="na"&gt;tool_call_cap&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8&lt;/span&gt;
&lt;span class="na"&gt;retry_cap&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="na"&gt;timeout_seconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;180&lt;/span&gt;
&lt;span class="na"&gt;write_authority&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;human-approval-required&lt;/span&gt;
&lt;span class="na"&gt;accepted_result&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;explicit pass/fail rule&lt;/span&gt;
&lt;span class="na"&gt;rollback_trigger&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cost | latency | policy | quality threshold&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do not leave &lt;code&gt;accepted_result&lt;/code&gt; as “looks better.” For a coding route, define tests that pass, files that may change, and a reviewer rubric. For research, define required sources, prohibited claims, and a citation check. For support, define label accuracy, escalation behavior, and a red-team fixture. The same fixture must run against the baseline and Astra with the same system instruction, retrieval, tools, timeout, and output cap.&lt;/p&gt;

&lt;h2&gt;
  
  
  A five-step migration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Prove access with a tiny, non-sensitive call
&lt;/h3&gt;

&lt;p&gt;Record the model ID, provider, timestamp, response status, and sanitized usage metadata. Do not put customer data in an availability test. If the call is rejected, stop: an announcement, another account, or ChatGPT access is not a workaround for that API project.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Set a whole-run cost ceiling
&lt;/h3&gt;

&lt;p&gt;For Standard model tokens, estimate the model portion before running a canary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;upper_bound = input_tokens / 1,000,000 × $10
            + output_tokens / 1,000,000 × $50
            + applicable cache and tool charges
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add retry and tool-loop limits. A model-only token estimate is not an invoice and does not prove total product cost; it is a guardrail for deciding whether the route may continue. Keep Fast mode off until the accepted result needs its latency benefit.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Choose effort from evidence
&lt;/h3&gt;

&lt;p&gt;Start at &lt;code&gt;medium&lt;/code&gt; for a multi-step fixture. Move down when the result passes unchanged; move up only when a defined failure is fixed and the accepted-run cost remains below the ceiling. Do not compare &lt;code&gt;max&lt;/code&gt; reasoning against a low-effort baseline and call the difference a model improvement.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Test authority as its own gate
&lt;/h3&gt;

&lt;p&gt;Run five controlled cases: one read-only tool call, one malformed argument, one denied action, one timeout, and one action requiring human approval. The expected outcome for denied, malformed, and approval-required work is safe refusal or escalation—not creative completion. Keep irreversible writes outside the model's direct authority even if the quality fixture passes.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Promote by accepted-run economics
&lt;/h3&gt;

&lt;p&gt;For each run, record acceptance, latency, input/output usage, tool calls, retries, human repair minutes, and policy failures. Promote one low-risk route, then 5%, 25%, and 100% only if every threshold holds. A higher-quality draft that requires more repair or violates a policy is not an accepted win.&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 target project call gpt-6-astra?
  ├─ No → retain baseline; resolve access separately
  └─ Yes → run the pinned fixture with explicit effort and caps
       ├─ quality fails → keep baseline; diagnose fixture or prompt
       ├─ cost/latency fails → reduce caps or keep route on baseline
       ├─ authority test fails → fix policy; do not promote
       └─ all gates pass → low-risk canary with rollback trigger
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Building something? Take a 60-sec game break. Score to rank your product or profile on &lt;a href="https://tapto.top/?utm_source=devto&amp;amp;utm_medium=syndicated-blog&amp;amp;utm_campaign=gpt-6-astra-api-migration-cost-safety-checklist" rel="noopener noreferrer"&gt;tapto.top&lt;/a&gt; and get more exposure—free, no signup.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Treating a single API 200 as an approved migration.&lt;/li&gt;
&lt;li&gt;Using the context maximum as a normal prompt budget.&lt;/li&gt;
&lt;li&gt;Raising effort and enabling Fast mode before defining a route ceiling.&lt;/li&gt;
&lt;li&gt;Measuring impressive output instead of accepted outcomes and repair time.&lt;/li&gt;
&lt;li&gt;Letting a stronger model gain broader tool or write authority.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  Should GPT-6 Astra replace my default model now?
&lt;/h3&gt;

&lt;p&gt;Only after the target project has verified API access and a pinned fixture passes quality, budget, authority, and rollback gates. OpenAI's rollout is staged.&lt;/p&gt;

&lt;h3&gt;
  
  
  What effort should I start with?
&lt;/h3&gt;

&lt;p&gt;Use the lowest setting that passes a fixed test. &lt;code&gt;medium&lt;/code&gt; is a practical initial point for multi-step work; evidence, not model prestige, should justify higher effort.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does a better answer justify an authority failure?
&lt;/h3&gt;

&lt;p&gt;No. Tool authority is an independent safety boundary. Fix the policy and rerun the controlled cases before promotion.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://openai.com/index/gpt-6-astra/" rel="noopener noreferrer"&gt;GPT-6 Astra launch announcement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.openai.com/api/docs/models/gpt-6-astra" rel="noopener noreferrer"&gt;GPT-6 Astra API model page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openai.com/index/safety-overview-gpt-6-astra/" rel="noopener noreferrer"&gt;GPT-6 Astra safety overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>GPT-6 Astra rollout checklist: separate ChatGPT access, API access, and enterprise controls</title>
      <dc:creator>Ahab</dc:creator>
      <pubDate>Fri, 04 Sep 2026 07:13:28 +0000</pubDate>
      <link>https://dev.to/ahab_indieseek/gpt-6-astra-rollout-checklist-separate-chatgpt-access-api-access-and-enterprise-controls-4ee5</link>
      <guid>https://dev.to/ahab_indieseek/gpt-6-astra-rollout-checklist-separate-chatgpt-access-api-access-and-enterprise-controls-4ee5</guid>
      <description>&lt;h1&gt;
  
  
  GPT-6 Astra rollout checklist: separate ChatGPT access, API access, and enterprise controls
&lt;/h1&gt;

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

&lt;p&gt;OpenAI introduced GPT-6 Astra on September 3, 2026, but the release is a rollout—not a single switch. At launch, Astra is reaching a limited set of organizations; OpenAI says ChatGPT Plus, Pro, Business, and Enterprise access, plus API, Azure, and AWS Bedrock access, will follow over coming days. Enterprise access is off by default and an administrator can enable it. The API model ID is &lt;code&gt;gpt-6-astra&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That means “GPT-6 is available” is not sufficient evidence for a team decision. Before changing a default, identify the surface you need, prove that the intended account can use it, budget its token and tool use, and keep a pinned fallback for a specific route. This guide gives you one record and six checks for doing that without confusing a model announcement with access in your workspace.&lt;/p&gt;

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

&lt;p&gt;This is for an indie developer, team lead, or workspace administrator deciding whether GPT-6 Astra belongs in a ChatGPT workflow, an API-backed product, or an enterprise agent route. It is deliberately not a claim that every paid ChatGPT user can select Astra today.&lt;/p&gt;

&lt;p&gt;If your immediate problem is an API spending ceiling rather than a new-model rollout, start with the &lt;a href="https://indieseek.co/blogs/openai-api-hard-spend-limits-429-runbook/?utm_source=devto" rel="noopener noreferrer"&gt;OpenAI API hard-spend-limit runbook&lt;/a&gt;. If your team is selecting among the current Codex models, the &lt;a href="https://indieseek.co/blogs/gpt-5-6-sol-vs-terra-vs-luna/?utm_source=devto" rel="noopener noreferrer"&gt;GPT-5.6 Sol, Terra, and Luna guide&lt;/a&gt; is a separate, product-specific decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  What OpenAI confirmed
&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 by OpenAI&lt;/th&gt;
&lt;th&gt;What you still need to prove&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Model name&lt;/td&gt;
&lt;td&gt;GPT-6 Astra&lt;/td&gt;
&lt;td&gt;Do not call it “ChatGPT 6” as though every ChatGPT account already has it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API identity&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gpt-6-astra&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Your project, API key, region, and account can actually create a request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ChatGPT rollout&lt;/td&gt;
&lt;td&gt;Limited organizations first; Plus, Pro, Business, and Enterprise follow over coming days&lt;/td&gt;
&lt;td&gt;Your plan, region, workspace, and model picker currently expose it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise control&lt;/td&gt;
&lt;td&gt;Admins can enable Astra; access is off by default at launch&lt;/td&gt;
&lt;td&gt;The correct administrator enabled it for the target workspace and policy allows use&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context and output&lt;/td&gt;
&lt;td&gt;1,050,000-token context window; 128,000 maximum output tokens&lt;/td&gt;
&lt;td&gt;Your application limit, timeout, and retrieval design keep requests inside safe bounds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reasoning&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;low&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt;, &lt;code&gt;high&lt;/code&gt;, &lt;code&gt;xhigh&lt;/code&gt;, and &lt;code&gt;max&lt;/code&gt; are supported&lt;/td&gt;
&lt;td&gt;Your route has an explicit effort setting and a measured budget&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Standard API price&lt;/td&gt;
&lt;td&gt;$10 per million input tokens and $50 per million output tokens&lt;/td&gt;
&lt;td&gt;The accepted task cost, cache behavior, tool calls, and retries remain inside your budget&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fast mode&lt;/td&gt;
&lt;td&gt;Up to 2x Standard speed at 2x Standard price&lt;/td&gt;
&lt;td&gt;The latency improvement is worth the route-level cost increase&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The context limit is capacity, not a request to send a million tokens by default. A long prompt, long output, high reasoning effort, tool loops, and retries can make the first successful result much more expensive than a small model-picker comparison suggests. Use the model page and pricing page as the contract; use your own accepted runs as the cost evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use a three-surface access record
&lt;/h2&gt;

&lt;p&gt;Keep ChatGPT, API, and enterprise policy as separate fields. A positive check in one column is not a substitute for another.&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="na"&gt;checked_at&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2026-09-04T09:00:00+08:00&lt;/span&gt;
&lt;span class="na"&gt;route&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;support-triage | coding-agent | research&lt;/span&gt;
&lt;span class="na"&gt;chatgpt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;plan&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Plus | Pro | Business | Enterprise&lt;/span&gt;
  &lt;span class="na"&gt;model_picker_visible&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="s"&gt; | &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="na"&gt;workspace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;personal | named-workspace&lt;/span&gt;
&lt;span class="na"&gt;api&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;model_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gpt-6-astra&lt;/span&gt;
  &lt;span class="na"&gt;request_accepted&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="s"&gt; | &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;
  &lt;span class="na"&gt;region_or_provider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;OpenAI | Azure | AWS Bedrock&lt;/span&gt;
&lt;span class="na"&gt;enterprise&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;admin_enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="s"&gt; | &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="s"&gt; | not_applicable&lt;/span&gt;
  &lt;span class="na"&gt;policy_allows_route&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="s"&gt; | &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="na"&gt;runtime&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;reasoning_effort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;low | medium | high | xhigh | max&lt;/span&gt;
  &lt;span class="na"&gt;fallback_model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;max_input_tokens&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;max_output_tokens&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;max_tool_calls&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;max_retries&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Record failures too. “Not in the model picker,” “API model unavailable,” and “admin setting disabled” identify different owners and different next actions. Do not route around an enterprise disablement with a personal account just to make a test pass.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  1. Choose one outcome, not one prestige model
&lt;/h3&gt;

&lt;p&gt;Pick a route with a measurable acceptance test: a fixed repository issue, a research brief with required citations, or a support-triage fixture. Define what counts as an accepted result before you test the new model.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Establish access before changing defaults
&lt;/h3&gt;

&lt;p&gt;For ChatGPT, capture the plan, workspace, and model-picker state. For the API, send a minimal non-sensitive test and store the model ID, timestamp, provider, request result, and sanitized usage metadata. For an enterprise workspace, capture the administrator-controlled setting and policy outcome. Never treat a public announcement as account-level availability.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Pin a baseline and make effort explicit
&lt;/h3&gt;

&lt;p&gt;Keep your existing production model as the control. Test the same fixture with the same retrieval, system instructions, tools, timeout, and effort level. Start with &lt;code&gt;medium&lt;/code&gt; for ordinary multi-step work; reserve &lt;code&gt;high&lt;/code&gt;, &lt;code&gt;xhigh&lt;/code&gt;, and &lt;code&gt;max&lt;/code&gt; for routes whose accepted-result benefit justifies the added budget.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Put a budget around the entire run
&lt;/h3&gt;

&lt;p&gt;Set maximum input, output, tool calls, retries, wall-clock time, and route-level spend. A simple upper-bound estimate for Standard API traffic is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;estimated_model_cost = (input_tokens / 1,000,000 * $10)
                     + (output_tokens / 1,000,000 * $50)
                     + cache and tool charges where applicable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fast mode changes both the speed and the price multiplier. Do not enable it globally because one interactive route needs lower latency.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Test authority separately from capability
&lt;/h3&gt;

&lt;p&gt;OpenAI describes Astra as strong for complex multi-step work, coding, browsing, computer use, research, and document creation. That does not grant it broader authority in your product. Test one read-only tool call, one malformed call, one denied action, one timeout, and one action that requires human approval. Keep irreversible writes behind the same policy boundary you used before the model change.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Promote by accepted-run economics
&lt;/h3&gt;

&lt;p&gt;Compare accepted results, not attractive demos. For each fixture, record model cost, retries, human repair minutes, latency, tool calls, policy failures, and whether the outcome passed. Promote one low-risk route first, then 5%, 25%, and 100% only when your thresholds hold. Roll back to the pinned baseline when they do not.&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;Need a new GPT-6 Astra route?
  ├─ No verified access on this surface → wait; do not claim rollout completion
  ├─ Enterprise workspace disabled → ask the workspace admin; do not bypass policy
  ├─ API accepts a minimal test → run fixed fixture against a pinned baseline
  │    ├─ accepted result and route budget pass → low-risk canary
  │    └─ cost, latency, or policy boundary fails → keep fallback and investigate
  └─ ChatGPT picker visible only → use it for manual evaluation, not as API evidence
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Building something? Take a 60-sec game break. Score to rank your product or profile on &lt;a href="https://tapto.top/?utm_source=devto&amp;amp;utm_medium=syndicated-blog&amp;amp;utm_campaign=gpt-6-astra-chatgpt-api-enterprise-rollout-checklist" rel="noopener noreferrer"&gt;tapto.top&lt;/a&gt; and get more exposure—free, no signup.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Writing “ChatGPT 6 is live” when the official statement is a staged GPT-6 Astra rollout.&lt;/li&gt;
&lt;li&gt;Treating a ChatGPT model-picker option as proof that an API project or enterprise workspace has access.&lt;/li&gt;
&lt;li&gt;Increasing reasoning effort and enabling Fast mode before setting route-level cost limits.&lt;/li&gt;
&lt;li&gt;Comparing a long, tool-enabled Astra task with a short baseline task.&lt;/li&gt;
&lt;li&gt;Turning a stronger model into broader file, network, or write authority.&lt;/li&gt;
&lt;li&gt;Reporting a successful test request as a production rollout.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  Is GPT-6 Astra generally available today?
&lt;/h3&gt;

&lt;p&gt;No universal availability claim is supported by the launch material. OpenAI describes a limited-organization rollout first, with broader access for named ChatGPT plans and API providers following over coming days. Check the surface you intend to use.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is GPT-6 Astra the same thing as ChatGPT 6?
&lt;/h3&gt;

&lt;p&gt;GPT-6 Astra is the official model name. ChatGPT is one product surface in the rollout; API, Azure, Bedrock, and workspace administration have separate availability and control boundaries.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does it cost in the API?
&lt;/h3&gt;

&lt;p&gt;OpenAI lists Standard pricing at $10 per million input tokens and $50 per million output tokens. Cache and tool-related charges can be separate, and Fast mode is priced at twice Standard according to the launch page.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I use &lt;code&gt;max&lt;/code&gt; reasoning effort by default?
&lt;/h3&gt;

&lt;p&gt;No. Start from the lowest effort that passes your fixed acceptance test and compare accepted-run cost, latency, and reliability before raising it.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://openai.com/index/gpt-6-astra/" rel="noopener noreferrer"&gt;GPT-6 Astra launch announcement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.openai.com/api/docs/models/gpt-6-astra" rel="noopener noreferrer"&gt;GPT-6 Astra API model page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.openai.com/api/docs/guides/latest-model" rel="noopener noreferrer"&gt;OpenAI model guidance for GPT-6 Astra&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openai.com/index/safety-overview-gpt-6-astra/" rel="noopener noreferrer"&gt;GPT-6 Astra safety overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Gemini 3.8 Flash is Antigravity's default: audit agent cost and tool loops before rollout.</title>
      <dc:creator>Ahab</dc:creator>
      <pubDate>Thu, 03 Sep 2026 10:16:51 +0000</pubDate>
      <link>https://dev.to/ahab_indieseek/gemini-38-flash-is-antigravitys-default-audit-agent-cost-and-tool-loops-before-rollout-2477</link>
      <guid>https://dev.to/ahab_indieseek/gemini-38-flash-is-antigravitys-default-audit-agent-cost-and-tool-loops-before-rollout-2477</guid>
      <description>&lt;p&gt;Originally published at &lt;a href="https://indieseek.co/blogs/gemini-3-8-flash-antigravity-default-agent-cost-checklist/?utm_source=devto" rel="noopener noreferrer"&gt;IndieSeek&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Gemini 3.8 Flash is Antigravity's default: audit agent cost and tool loops before rollout
&lt;/h1&gt;

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

&lt;p&gt;Google released &lt;code&gt;gemini-3.8-flash&lt;/code&gt; as a generally available Gemini API model on September 2, 2026. It supports a 1,048,576-token input window, up to 65,536 output tokens, multimodal input, function calling, structured output, code execution, caching, and Computer Use in preview. Google also changed the Antigravity managed agent and its SDK to use Gemini 3.8 Flash by default.&lt;/p&gt;

&lt;p&gt;That default change is the operational risk. An unchanged agent identifier can now produce a different number of reasoning steps, tool calls, tokens, and retries. Google explicitly says 3.8 Flash may use more tokens on long, complex tasks by design. Before accepting the new default, record the effective model configuration, set a thinking level per route, cap the loop, and compare accepted-run cost against an explicitly pinned 3.7 baseline.&lt;/p&gt;

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

&lt;p&gt;This guide is for indie developers and platform teams using Gemini Managed Agents, the Antigravity SDK, or a direct Gemini API agent loop. It focuses on a default-model change, not a generic benchmark contest.&lt;/p&gt;

&lt;p&gt;If you are migrating direct requests and need a broad model comparison, start with the &lt;a href="https://indieseek.co/blogs/gemini-3-7-flash-vs-3-6-agent-migration-checklist/?utm_source=devto" rel="noopener noreferrer"&gt;Gemini 3.7 vs 3.6 migration checklist&lt;/a&gt;. For high-volume routine work, the &lt;a href="https://indieseek.co/blogs/gemini-3-6-flash-vs-3-5-flash-lite-api-migration-guide/?utm_source=devto" rel="noopener noreferrer"&gt;Flash vs Flash-Lite routing guide&lt;/a&gt; remains the cheaper-task decision layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed—and what did not
&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 state&lt;/th&gt;
&lt;th&gt;Operator consequence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;API model&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;gemini-3.8-flash&lt;/code&gt; is GA&lt;/td&gt;
&lt;td&gt;Pin this exact ID for a direct-API canary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Managed agent&lt;/td&gt;
&lt;td&gt;Antigravity now uses 3.8 Flash by default&lt;/td&gt;
&lt;td&gt;Re-test even when the agent name did not change&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;, &lt;code&gt;high&lt;/code&gt;; &lt;code&gt;medium&lt;/code&gt; is default&lt;/td&gt;
&lt;td&gt;Configure it explicitly; &lt;code&gt;minimal&lt;/code&gt; returns an error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Long tasks&lt;/td&gt;
&lt;td&gt;More reasoning and iterative verification can consume more tokens&lt;/td&gt;
&lt;td&gt;Budget the whole run, not one request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Standard price&lt;/td&gt;
&lt;td&gt;$0.75 input / $3.75 output per 1M tokens through 2026-12-31&lt;/td&gt;
&lt;td&gt;Same list rate as 3.7 does not guarantee the same run cost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2027 price&lt;/td&gt;
&lt;td&gt;$1.50 input / $7.50 output from 2027-01-01&lt;/td&gt;
&lt;td&gt;Recalculate every production budget before the date boundary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tool surface&lt;/td&gt;
&lt;td&gt;Function calling, code execution, file/search tools, and preview Computer Use are supported&lt;/td&gt;
&lt;td&gt;Re-run tool contracts and safety gates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Live API&lt;/td&gt;
&lt;td&gt;Not supported&lt;/td&gt;
&lt;td&gt;Keep real-time voice or streaming routes on a supported model&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Output pricing includes thinking tokens. A run with 100,000 uncached input tokens and 20,000 output tokens, including thinking, costs about $0.15 at the introductory Standard rate and $0.30 from January 1, 2027, before grounding or cache-storage charges. The formula is simple; predicting the token counts is not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate identity, effort, and authority
&lt;/h2&gt;

&lt;p&gt;Treat the rollout as three independent controls:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Identity:&lt;/strong&gt; which model the direct request or managed-agent configuration resolves to.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Effort:&lt;/strong&gt; which thinking level, token usage, retries, and tool rounds the run consumes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authority:&lt;/strong&gt; which tools, files, network destinations, and irreversible actions the agent can reach.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A stronger model does not reduce the need for a sandbox or approval boundary. Keep untrusted repositories behind the &lt;a href="https://indieseek.co/blogs/ai-coding-agent-sandbox-untrusted-repo-checklist/?utm_source=devto" rel="noopener noreferrer"&gt;AI coding-agent sandbox checklist&lt;/a&gt;, especially when Computer Use is enabled.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build a shadow-run ledger
&lt;/h2&gt;

&lt;p&gt;Choose five representative tasks: one focused code fix, one multi-file refactor, one search-and-summarize job, one recoverable tool failure, and one task that must stop before an external write. Run each against the Antigravity default and a 3.7-pinned control where the supported configuration allows it.&lt;/p&gt;

&lt;p&gt;Keep the task fixture, repository revision, instructions, tools, network policy, timeout, and acceptance tests identical. Record this per run:&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="na"&gt;agent_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;antigravity&lt;/span&gt;
&lt;span class="na"&gt;configured_model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default | gemini-3.7-flash | gemini-3.8-flash&lt;/span&gt;
&lt;span class="na"&gt;observed_at&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2026-09-03T18:00:00+08:00&lt;/span&gt;
&lt;span class="na"&gt;thinking_level&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;low | medium | high&lt;/span&gt;
&lt;span class="na"&gt;input_tokens&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;output_and_thinking_tokens&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;cached_input_tokens&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;tool_calls&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;repeated_tool_calls&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;wall_time_seconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;accepted&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="s"&gt; | &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="na"&gt;human_repair_minutes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;side_effect_attempted&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the runtime does not expose a resolved model field, do not invent one. Preserve the configured &lt;code&gt;agent_config&lt;/code&gt;, request timestamp, SDK version, and response metadata that is actually available, and label the effective model as inferred from Google's documented default.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  1. Freeze the baseline
&lt;/h3&gt;

&lt;p&gt;Save the current agent configuration, Gemini SDK version, tool schemas, safety policy, retry policy, and five-task fixture revision. Keep the 3.7 route available for rollback.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Make thinking explicit
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;low&lt;/code&gt; for latency-sensitive classification or retrieval, &lt;code&gt;medium&lt;/code&gt; for ordinary coding and agent tasks, and &lt;code&gt;high&lt;/code&gt; only for the hardest multi-step work. Add a negative test proving &lt;code&gt;minimal&lt;/code&gt; fails rather than silently mapping it.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Cap the loop
&lt;/h3&gt;

&lt;p&gt;Set maximum wall time, model turns, tool calls, repeated identical calls, and total token or spend allowance. Stop when the agent repeats the same failed action, not when the account-wide budget is exhausted.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Verify tool contracts
&lt;/h3&gt;

&lt;p&gt;Test one valid tool call, one schema error, one timeout, one permission denial, and one irreversible action that requires a human. Computer Use remains preview; do not let a model upgrade convert a read-only canary into a production desktop session.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Compare accepted-run economics
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;accepted_run_cost = model cost + retry cost + human repair cost&lt;/code&gt;. Because 3.8 and 3.7 share the same current list rates, a higher 3.8 token count may still win if it removes retries—or lose if extra verification adds no accepted result.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Promote with a dated budget
&lt;/h3&gt;

&lt;p&gt;Ramp one low-risk route, then 5%, 25%, and 100%. Require acceptance, latency, repeated-call rate, policy compliance, and cost to stay inside limits. Store both the current rate and the January 1 rate in the decision record so the rollout cannot rely on promotional pricing forever.&lt;/p&gt;

&lt;h2&gt;
  
  
  Canary matrix
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Canary&lt;/th&gt;
&lt;th&gt;Pass condition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Default identity&lt;/td&gt;
&lt;td&gt;Configuration and timestamp prove whether default or pinned routing was used&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;minimal&lt;/code&gt; thinking&lt;/td&gt;
&lt;td&gt;Request fails visibly; router does not retry forever&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recoverable tool error&lt;/td&gt;
&lt;td&gt;Agent corrects once and completes inside the call cap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Repeated tool loop&lt;/td&gt;
&lt;td&gt;Circuit breaker stops the run with a clear reason&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Irreversible action&lt;/td&gt;
&lt;td&gt;Human approval is required before the side effect&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Live route&lt;/td&gt;
&lt;td&gt;Unsupported Live API path stays on its existing supported model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cost boundary&lt;/td&gt;
&lt;td&gt;Ledger calculates both 2026 and 2027 rates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rollback&lt;/td&gt;
&lt;td&gt;Pinned 3.7 control can still complete the baseline fixture&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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;owner / date / route:
agent_id / sdk_version / configured_model:
baseline_model / candidate_model:
fixture_revision / tool_schema_revision:
thinking_levels_tested:
accepted_runs / total_runs:
input / cached / output-plus-thinking tokens:
tool_calls / repeated_calls / retries:
intro_rate_cost / 2027_rate_cost:
human_repair_minutes / policy_violations:
promotion: hold | 5% | 25% | 100% | rollback
rollback_model / rollback_trigger:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Building something? Take a 60-sec game break. Score to rank your product or profile on &lt;a href="https://tapto.top/?utm_source=devto&amp;amp;utm_medium=syndicated-blog&amp;amp;utm_campaign=gemini-3-8-flash-antigravity-default-agent-cost-checklist" rel="noopener noreferrer"&gt;tapto.top&lt;/a&gt; and get more exposure—free, no signup.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Assuming an unchanged Antigravity agent ID means the underlying model did not change.&lt;/li&gt;
&lt;li&gt;Comparing 3.8 &lt;code&gt;high&lt;/code&gt; with 3.7 &lt;code&gt;medium&lt;/code&gt; and calling the result a model improvement.&lt;/li&gt;
&lt;li&gt;Looking only at per-token price while ignoring thinking tokens, retries, and tool loops.&lt;/li&gt;
&lt;li&gt;Sending &lt;code&gt;minimal&lt;/code&gt;, then hiding the validation error behind unbounded retries.&lt;/li&gt;
&lt;li&gt;Treating Computer Use preview as permission to remove human approval.&lt;/li&gt;
&lt;li&gt;Forgetting that the published Standard rate doubles on January 1, 2027.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  Is Gemini 3.8 Flash generally available?
&lt;/h3&gt;

&lt;p&gt;Yes. Google's September 2 Gemini API release notes identify &lt;code&gt;gemini-3.8-flash&lt;/code&gt; as GA.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is 3.8 more expensive than 3.7 per token?
&lt;/h3&gt;

&lt;p&gt;Their published Standard, Batch, Flex, Priority, caching, and storage rates currently match. Actual run cost can differ because token use, tool calls, retries, and acceptance can differ.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I keep Antigravity on 3.7?
&lt;/h3&gt;

&lt;p&gt;Google's Agents documentation says the underlying model can be configured, including Gemini 3.7 Flash. Verify the currently supported &lt;code&gt;agent_config&lt;/code&gt; shape in your SDK and keep the pin as a rollback control.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does Gemini 3.8 Flash support the Live API?
&lt;/h3&gt;

&lt;p&gt;No. The model page lists Live API as unsupported. Route real-time workloads separately.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ai.google.dev/gemini-api/docs/changelog" rel="noopener noreferrer"&gt;Gemini API release notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ai.google.dev/gemini-api/docs/models/gemini-3.8-flash" rel="noopener noreferrer"&gt;Gemini 3.8 Flash model page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ai.google.dev/gemini-api/docs/generate-content/latest-model" rel="noopener noreferrer"&gt;Gemini 3.8 Flash changes and migration guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ai.google.dev/gemini-api/docs/pricing" rel="noopener noreferrer"&gt;Gemini Developer API pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ai.google.dev/gemini-api/docs/agents" rel="noopener noreferrer"&gt;Gemini API Agents overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ai.google.dev/gemini-api/docs/caching" rel="noopener noreferrer"&gt;Gemini context caching&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Claude Code 2.1.259 managed MCP servers: keep unattended headless runs fail-closed.</title>
      <dc:creator>Ahab</dc:creator>
      <pubDate>Thu, 03 Sep 2026 01:24:15 +0000</pubDate>
      <link>https://dev.to/ahab_indieseek/claude-code-21259-managed-mcp-servers-keep-unattended-headless-runs-fail-closed-1ec3</link>
      <guid>https://dev.to/ahab_indieseek/claude-code-21259-managed-mcp-servers-keep-unattended-headless-runs-fail-closed-1ec3</guid>
      <description>&lt;p&gt;Originally published at &lt;a href="https://indieseek.co/blogs/claude-code-2-1-259-managed-mcp-headless-permission-checklist/?utm_source=devto" rel="noopener noreferrer"&gt;IndieSeek&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Claude Code 2.1.259 managed MCP servers: keep unattended headless runs fail-closed
&lt;/h1&gt;

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

&lt;p&gt;Claude Code 2.1.259 adds two controls that fit the same automation problem. Organizations can distribute remote HTTP or SSE servers through the managed &lt;code&gt;managedMcpServers&lt;/code&gt; setting, and unattended headless hosts can use &lt;code&gt;--permission-prompts none&lt;/code&gt; so an action that would have opened a prompt is denied instead. The active permission mode—including Auto mode—still makes its normal decisions first.&lt;/p&gt;

&lt;p&gt;Do not treat either control as blanket approval. Managed MCP distribution decides which server definitions arrive; permission policy decides which tools may run; &lt;code&gt;--permission-prompts none&lt;/code&gt; only changes the final prompt fallback. Roll out all three layers separately, record the effective configuration, and make a denied write the success case for your first canary.&lt;/p&gt;

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

&lt;p&gt;This guide is for platform teams and indie developers running Claude Code from CI, scheduled jobs, remote workers, or an SDK host where nobody can answer a terminal prompt. It assumes you need a small approved set of internal remote tools without giving every job ambient authority.&lt;/p&gt;

&lt;p&gt;If you first need to reduce what a shared-machine evaluation can reach, read the &lt;a href="https://indieseek.co/blogs/claude-code-2-1-248-restricted-mode-security-checklist/?utm_source=devto" rel="noopener noreferrer"&gt;Claude Code restricted-mode checklist&lt;/a&gt;. If your risk is broad shell matching, use the &lt;a href="https://indieseek.co/blogs/claude-code-2-1-246-bash-wildcard-permission-audit/?utm_source=devto" rel="noopener noreferrer"&gt;Bash wildcard permission audit&lt;/a&gt;. Neither replaces MCP server identity, credentials, or tool-level permission rules.&lt;/p&gt;

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

&lt;p&gt;Anthropic published Claude Code 2.1.259 on September 2, 2026. The stable release adds &lt;code&gt;managedMcpServers&lt;/code&gt; as a managed setting. Administrators can supply remote HTTP/SSE entries using the same entry shape as &lt;code&gt;.mcp.json&lt;/code&gt;; entries that name a local command are skipped. That transport boundary matters: this new setting is not a way to distribute arbitrary &lt;code&gt;stdio&lt;/code&gt; launch commands.&lt;/p&gt;

&lt;p&gt;The release also adds &lt;code&gt;--permission-prompts none&lt;/code&gt; for unattended headless hosts. When the active permission mode cannot approve or deny an action and would normally ask a person, Claude Code denies it automatically. This is different from &lt;code&gt;bypassPermissions&lt;/code&gt;, and it does not convert an Ask rule into an Allow rule.&lt;/p&gt;

&lt;p&gt;Two adjacent changes deserve migration tests. A malformed managed-settings source now makes Claude Code refuse to start and names the invalid source. Also, &lt;code&gt;allowedMcpServers&lt;/code&gt; now governs only servers users add. If an older allowlist had been filtering a literal &lt;code&gt;managed-mcp.json&lt;/code&gt; server, that server can load after upgrade; Anthropic directs administrators to &lt;code&gt;deniedMcpServers&lt;/code&gt; when it must remain blocked.&lt;/p&gt;

&lt;p&gt;The release tag resolves to commit &lt;code&gt;f173a697aa6486945f1b9c4aa9ce5383d2c87db6&lt;/code&gt;. The local client used for this article was still &lt;code&gt;0.2.36&lt;/code&gt;, so the configuration below is an operator-ready rollout design derived from the official 2.1.259 release and current docs, not a claim that this machine executed the new binary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate the three control planes
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Control plane&lt;/th&gt;
&lt;th&gt;Primary question&lt;/th&gt;
&lt;th&gt;Safe evidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Server delivery&lt;/td&gt;
&lt;td&gt;Which remote MCP definitions reach the session?&lt;/td&gt;
&lt;td&gt;Effective managed source, exact URL, connection status&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tool authority&lt;/td&gt;
&lt;td&gt;Which server tools can be invoked?&lt;/td&gt;
&lt;td&gt;Deny/ask/allow rules, permission mode, credential scope&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Prompt fallback&lt;/td&gt;
&lt;td&gt;What happens when a decision still needs a person?&lt;/td&gt;
&lt;td&gt;Allowed call proceeds; prompt-required call is denied, never hung&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This model prevents a common mistake: seeing an MCP server connected and assuming its tools are approved. Connection is inventory, not authorization. A token also has its own server-side scope, so an allowed tool with an overpowered credential can still be too broad.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build a minimal managed remote set
&lt;/h2&gt;

&lt;p&gt;Start with one read-only remote server in managed settings. The new setting uses &lt;code&gt;.mcp.json&lt;/code&gt;-style server entries:&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;"managedMcpServers"&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;"incident-readonly"&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;"http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&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://mcp.example.com/readonly"&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="nl"&gt;"permissions"&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;"allow"&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="s2"&gt;"mcp__incident-readonly__get_status"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"deny"&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="s2"&gt;"mcp__incident-readonly__mutate_*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bash"&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;Treat this as a shape template, not a copy-paste production secret. Put authentication in the supported credential mechanism, scope the server token to read-only, and verify the effective settings on the exact host image. Managed file paths are &lt;code&gt;/Library/Application Support/ClaudeCode/managed-settings.json&lt;/code&gt; on macOS, &lt;code&gt;/etc/claude-code/managed-settings.json&lt;/code&gt; on Linux/WSL, and &lt;code&gt;C:\Program Files\ClaudeCode\managed-settings.json&lt;/code&gt; on Windows.&lt;/p&gt;

&lt;h2&gt;
  
  
  A six-step unattended rollout
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Snapshot the old effective state
&lt;/h3&gt;

&lt;p&gt;Record the Claude Code version, managed-settings source, any &lt;code&gt;managed-mcp.json&lt;/code&gt;, every allowed or denied MCP identity, permission mode, server credential scope, and the runner image digest. Keep the old binary and configuration together as one rollback unit.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Reconcile the allowlist semantic change
&lt;/h3&gt;

&lt;p&gt;For every server in &lt;code&gt;managed-mcp.json&lt;/code&gt;, ask whether an existing &lt;code&gt;allowedMcpServers&lt;/code&gt; entry was the only reason it stayed off. Add an explicit &lt;code&gt;deniedMcpServers&lt;/code&gt; identity before upgrading when the answer is yes. Prefer URL or command identity over display name for enforcement.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Validate managed delivery interactively
&lt;/h3&gt;

&lt;p&gt;Upgrade one disposable host. Confirm startup succeeds, the correct managed source is visible, local-command entries are skipped, only the expected HTTP/SSE server connects, and no user or project setting widens the result. Intentionally break a copy of the managed file and verify startup refuses with the source named.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Prove tool-level permissions
&lt;/h3&gt;

&lt;p&gt;Run one allowed read, one denied write, one unknown tool, and one call that would normally ask. Preserve the tool name, sanitized input, permission decision, server response class, and session ID. Do not record credentials or sensitive response bodies.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Add the no-prompt fallback
&lt;/h3&gt;

&lt;p&gt;Run the headless job with &lt;code&gt;--permission-prompts none&lt;/code&gt; only after the interactive matrix passes. Use structured output and inspect the initial system event. Current Headless documentation exposes &lt;code&gt;mcp_servers&lt;/code&gt; plus &lt;code&gt;mcp_server_errors&lt;/code&gt;; fail CI when the error array is non-empty rather than accepting a clean process exit with a missing server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--permission-prompts&lt;/span&gt; none &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output-format&lt;/span&gt; stream-json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--verbose&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"Read the incident status and make no changes"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Promote from a recorded acceptance matrix
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Canary&lt;/th&gt;
&lt;th&gt;Expected result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Approved remote read tool&lt;/td&gt;
&lt;td&gt;Runs and returns the expected schema&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Write tool matched by deny&lt;/td&gt;
&lt;td&gt;Blocked before side effect&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tool that would prompt&lt;/td&gt;
&lt;td&gt;Denied automatically; job does not hang&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Invalid managed settings&lt;/td&gt;
&lt;td&gt;Client refuses to start and identifies the source&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Command-based &lt;code&gt;managedMcpServers&lt;/code&gt; entry&lt;/td&gt;
&lt;td&gt;Skipped; no local process launches&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disconnected server during tool listing&lt;/td&gt;
&lt;td&gt;Startup reports the error, not an empty connected server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Non-allowlisted user-added server&lt;/td&gt;
&lt;td&gt;Follows the new user-added allowlist policy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Explicitly denied fixed managed server&lt;/td&gt;
&lt;td&gt;Remains blocked after upgrade&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Promote one runner group at a time. Roll back the no-prompt flag first if observability is insufficient, then the managed server set, then the binary. Never replace a deny with automatic approval just to keep a scheduled job green.&lt;/p&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;claude_code_version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2.1.259&lt;/span&gt;
&lt;span class="na"&gt;release_tag_commit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;f173a697aa6486945f1b9c4aa9ce5383d2c87db6&lt;/span&gt;
&lt;span class="na"&gt;managed_source&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;file&lt;/span&gt;
&lt;span class="na"&gt;managed_remote_servers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;incident-readonly&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;local_command_entries_loaded&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="na"&gt;permission_mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default&lt;/span&gt;
&lt;span class="na"&gt;permission_prompts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;none&lt;/span&gt;
&lt;span class="na"&gt;credential_scope&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;read-only&lt;/span&gt;
&lt;span class="na"&gt;mcp_server_errors&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[]&lt;/span&gt;
&lt;span class="na"&gt;allowed_read_passed&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;denied_write_blocked&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;prompt_required_denied&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;fixed_server_deny_migration_checked&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;rollback_binary_available&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Building something? Take a 60-sec game break. Score to rank your product or profile on &lt;a href="https://tapto.top/?utm_source=devto&amp;amp;utm_medium=syndicated-blog&amp;amp;utm_campaign=claude-code-2-1-259-managed-mcp-headless-permission-checklist" rel="noopener noreferrer"&gt;tapto.top&lt;/a&gt; and get more exposure—free, no signup.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Treating a delivered MCP definition as permission to use every tool.&lt;/li&gt;
&lt;li&gt;Putting a local &lt;code&gt;command&lt;/code&gt; entry under &lt;code&gt;managedMcpServers&lt;/code&gt; and assuming it launched.&lt;/li&gt;
&lt;li&gt;Using &lt;code&gt;--permission-prompts none&lt;/code&gt; as if it were &lt;code&gt;bypassPermissions&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Forgetting the 2.1.259 &lt;code&gt;allowedMcpServers&lt;/code&gt; change for fixed managed servers.&lt;/li&gt;
&lt;li&gt;Checking only the process exit code and ignoring &lt;code&gt;mcp_server_errors&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Expanding credential scope to hide an authorization failure.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  Does &lt;code&gt;--permission-prompts none&lt;/code&gt; approve tools automatically?
&lt;/h3&gt;

&lt;p&gt;No. The active permission mode still decides first. Only a call that would otherwise prompt is converted to a denial.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can &lt;code&gt;managedMcpServers&lt;/code&gt; launch a local &lt;code&gt;stdio&lt;/code&gt; command?
&lt;/h3&gt;

&lt;p&gt;The 2.1.259 release says command-named entries are skipped. Use it for the remote HTTP/SSE boundary described by the release.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is &lt;code&gt;managedMcpServers&lt;/code&gt; the same as &lt;code&gt;managed-mcp.json&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;No. The new value is a managed setting for distributing remote entries. The existing system-level &lt;code&gt;managed-mcp.json&lt;/code&gt; mechanism is a fixed server deployment with different behavior. Audit both when upgrading.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is a connected server proof that the job is safe?
&lt;/h3&gt;

&lt;p&gt;No. Verify tool permissions, server-side credential scope, prompt fallback, structured startup errors, and the absence of side effects.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/anthropics/claude-code/releases/tag/v2.1.259" rel="noopener noreferrer"&gt;Claude Code v2.1.259 release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/managed-settings" rel="noopener noreferrer"&gt;Claude Code managed settings&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/permissions" rel="noopener noreferrer"&gt;Claude Code permissions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/headless" rel="noopener noreferrer"&gt;Claude Code Headless mode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>GitHub Copilot Code Review Approvals: A Safe Rollout Checklist</title>
      <dc:creator>Ahab</dc:creator>
      <pubDate>Wed, 02 Sep 2026 10:21:00 +0000</pubDate>
      <link>https://dev.to/ahab_indieseek/github-copilot-code-review-approvals-a-safe-rollout-checklist-53mg</link>
      <guid>https://dev.to/ahab_indieseek/github-copilot-code-review-approvals-a-safe-rollout-checklist-53mg</guid>
      <description>&lt;p&gt;Originally published at &lt;a href="https://indieseek.co/blogs/github-copilot-code-review-approval-merge-requirements-rollout-checklist/?utm_source=devto" rel="noopener noreferrer"&gt;IndieSeek&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  GitHub Copilot code review approvals: protect merge requirements before enabling public preview
&lt;/h1&gt;

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

&lt;p&gt;GitHub Copilot code review can now submit an approving pull-request review, and administrators can optionally let that approval satisfy a repository's required-approval rule. The feature is a &lt;strong&gt;public preview&lt;/strong&gt;, is off by default, and is available on Copilot Pro, Pro+, Max, Business, and Enterprise plans.&lt;/p&gt;

&lt;p&gt;Do not treat every positive Copilot assessment as merge authority. GitHub exposes three separate states: an approval assessment in the review summary, permission for Copilot to submit an approving review, and permission for that approval to count toward merge requirements. Keep the third state disabled until a path-scoped canary proves stale-approval dismissal, required checks, code-owner review, and bypass rules still behave as intended.&lt;/p&gt;

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

&lt;p&gt;This guide is for repository administrators, platform teams, and indie developers who already use Copilot code review and are deciding whether an AI approval may become part of the merge gate. It focuses on GitHub.com governance, not on IDE suggestion quality or letting an agent merge code.&lt;/p&gt;

&lt;p&gt;If you still need to tune review instructions and effort, start with the &lt;a href="https://indieseek.co/blogs/github-copilot-code-review-custom-instructions-setup/?utm_source=devto" rel="noopener noreferrer"&gt;Copilot code-review setup guide&lt;/a&gt;. For security findings and deterministic scanning, use the &lt;a href="https://indieseek.co/blogs/github-copilot-security-review-code-scanning-autofix/?utm_source=devto" rel="noopener noreferrer"&gt;Copilot and code-scanning workflow&lt;/a&gt;. Neither article previously allowed an AI review to satisfy a required approval; this public preview changes that exact boundary.&lt;/p&gt;

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

&lt;p&gt;Every Copilot code review now includes an approval assessment in its overview comment. That assessment only reports Copilot's judgment; by itself, it does not count toward merge requirements. When administrators enable approvals, Copilot can submit an approving review. A second control decides whether that approval can satisfy the repository's required-approval rule.&lt;/p&gt;

&lt;p&gt;Controls exist at enterprise, organization, and repository levels. Repository administrators can also provide up to 15 file globs. An approval counts only when &lt;strong&gt;every changed file&lt;/strong&gt; matches the configured globs. New commits dismiss Copilot's approval, after which a fresh review can be requested.&lt;/p&gt;

&lt;p&gt;This is not automatic merge. Required status checks, conversation resolution, code-owner requirements, deployments, merge queue rules, and non-bypass settings remain independent controls. GitHub also says Copilot can miss problems and should be supplemented with human review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Model the three gates separately
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Gate&lt;/th&gt;
&lt;th&gt;Default behavior&lt;/th&gt;
&lt;th&gt;What it proves&lt;/th&gt;
&lt;th&gt;What it does not prove&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Approval assessment&lt;/td&gt;
&lt;td&gt;Appears in every Copilot review&lt;/td&gt;
&lt;td&gt;Copilot considers the reviewed revision ready or not ready&lt;/td&gt;
&lt;td&gt;No approving review and no merge credit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Copilot may approve&lt;/td&gt;
&lt;td&gt;Off by default&lt;/td&gt;
&lt;td&gt;Copilot may submit an approving review&lt;/td&gt;
&lt;td&gt;Approval may still not satisfy required reviews&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Copilot approval counts&lt;/td&gt;
&lt;td&gt;Separately configurable&lt;/td&gt;
&lt;td&gt;The approval may satisfy one required-approval slot when scope matches&lt;/td&gt;
&lt;td&gt;CI, code owners, latest-push rules, and merge authority are not bypassed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Treat the first gate as information, the second as reviewer authority, and the third as enforcement authority. Roll them out in that order.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build a narrow approval envelope
&lt;/h2&gt;

&lt;p&gt;Start with low-risk paths where review correctness can be tested without making the AI the sole risk owner. Documentation, examples, and generated snapshots may be candidates; authentication, billing, secrets, deployment, migrations, dependency manifests, and security policy should remain human-gated.&lt;/p&gt;

&lt;p&gt;Use branch protection or rulesets to keep the envelope bounded:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;require at least two approvals when one may come from Copilot;&lt;/li&gt;
&lt;li&gt;require Code Owner review for sensitive paths;&lt;/li&gt;
&lt;li&gt;dismiss stale approvals after code-modifying pushes;&lt;/li&gt;
&lt;li&gt;require approval of the most recent reviewable push;&lt;/li&gt;
&lt;li&gt;require named CI checks from the expected GitHub App;&lt;/li&gt;
&lt;li&gt;require conversation resolution and disallow bypass for the protected branch.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;File globs are an eligibility filter, not a security boundary. A mixed pull request containing one file outside the allowlist should not receive merge credit from Copilot. Also remember that Copilot reads instructions and agent skills from the pull request's head branch, so a change to review instructions deserves explicit human scrutiny.&lt;/p&gt;

&lt;h2&gt;
  
  
  A six-stage rollout workflow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Snapshot the existing merge contract
&lt;/h3&gt;

&lt;p&gt;Record the active ruleset or branch-protection rule, required approval count, code owners, required checks and their expected apps, latest-push rule, dismissal rule, merge queue, deployments, and bypass actors. If you cannot reproduce the current contract, do not add another approval actor.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Enable assessment only
&lt;/h3&gt;

&lt;p&gt;Run Copilot reviews without enabling approval authority. Compare the overview assessment with human reviewers across at least ten representative pull requests. Capture false positives, missed risk, excluded files, review effort, AI-credit usage, and Actions-minute impact.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Allow approvals without merge credit
&lt;/h3&gt;

&lt;p&gt;Enable “Allow Copilot to approve pull requests,” but leave “Allow Copilot approvals to count toward merge requirements” off. Confirm the review event, actor, reviewed commit SHA, timestamp, and audit visibility. This separates event correctness from enforcement.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Add path-scoped merge credit
&lt;/h3&gt;

&lt;p&gt;Use a small repository or a narrow set of file globs. Keep at least one required human approval. Do not leave the path list blank for the first canary, because blank means approvals can count for all files.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Run the canary matrix
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Canary pull request&lt;/th&gt;
&lt;th&gt;Expected result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;All files match the low-risk globs&lt;/td&gt;
&lt;td&gt;Copilot approval may count, but other gates remain required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One file is outside the globs&lt;/td&gt;
&lt;td&gt;Copilot approval must not satisfy merge requirements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New commit after approval&lt;/td&gt;
&lt;td&gt;Copilot approval is dismissed; re-review is required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Required CI check fails&lt;/td&gt;
&lt;td&gt;Merge remains blocked&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CODEOWNERS path changes&lt;/td&gt;
&lt;td&gt;Required Code Owner approval remains necessary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Review instructions change in the head branch&lt;/td&gt;
&lt;td&gt;Human reviewer inspects the policy change before merge&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Stop if the merge box cannot explain which approval and rule satisfied each gate.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Expand only from evidence
&lt;/h3&gt;

&lt;p&gt;Promote one path group at a time. Review false-approval rate, human override rate, escaped defects, spend, and bypass events. Roll back by disabling merge credit first; disabling Copilot's ability to approve is a second, separate rollback.&lt;/p&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;feature&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github-copilot-code-review-approvals&lt;/span&gt;
&lt;span class="na"&gt;preview_status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;public-preview&lt;/span&gt;
&lt;span class="na"&gt;repository&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;owner/example&lt;/span&gt;
&lt;span class="na"&gt;protected_branch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;main&lt;/span&gt;
&lt;span class="na"&gt;copilot_may_approve&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;copilot_approval_counts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;allowed_paths&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;docs/**"&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;examples/**"&lt;/span&gt;
&lt;span class="na"&gt;required_approvals&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
&lt;span class="na"&gt;human_approval_minimum&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;span class="na"&gt;dismiss_stale_reviews&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;require_last_push_approval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;required_checks_source_pinned&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;code_owner_gate_preserved&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;bypass_disabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;canary_matrix_passed&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;rollback_owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;platform-admin@example.com&lt;/span&gt;
&lt;span class="na"&gt;review_date&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2026-10-02&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Building something? Take a 60-sec game break. Score to rank your product or profile on &lt;a href="https://tapto.top/?utm_source=devto&amp;amp;utm_medium=syndicated-blog&amp;amp;utm_campaign=github-copilot-code-review-approval-merge-requirements-rollout-checklist" rel="noopener noreferrer"&gt;tapto.top&lt;/a&gt; and get more exposure—free, no signup.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Counting the overview assessment as an approving review.&lt;/li&gt;
&lt;li&gt;Enabling merge credit enterprise-wide before a repository canary.&lt;/li&gt;
&lt;li&gt;Leaving file paths blank and assuming that means “no paths.”&lt;/li&gt;
&lt;li&gt;Reducing required approvals to one, allowing Copilot to become the only approver.&lt;/li&gt;
&lt;li&gt;Forgetting that new commits require a fresh Copilot review.&lt;/li&gt;
&lt;li&gt;Treating an AI approval as proof that tests, Code Owners, or deployment gates passed.&lt;/li&gt;
&lt;li&gt;Ignoring head-branch changes to instructions, skills, or MCP context used during review.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  Does every positive Copilot assessment count as approval?
&lt;/h3&gt;

&lt;p&gt;No. The assessment is informational. Copilot must be allowed to submit approvals, and a separate setting must allow those approvals to count toward merge requirements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is the approval feature generally available?
&lt;/h3&gt;

&lt;p&gt;No. GitHub labels Copilot approvals as public preview and says the behavior is subject to change.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can Copilot approval merge a pull request automatically?
&lt;/h3&gt;

&lt;p&gt;No. An approval can satisfy one review requirement, but merge permission and every other protection rule remain separate.&lt;/p&gt;

&lt;h3&gt;
  
  
  What happens after another commit is pushed?
&lt;/h3&gt;

&lt;p&gt;GitHub says Copilot's approval is dismissed. Request a new review and verify the new head SHA before relying on another approval.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.blog/changelog/2026-09-01-copilot-code-review-can-now-approve-pull-requests/" rel="noopener noreferrer"&gt;GitHub announcement: Copilot code review can now approve pull requests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot/how-tos/copilot-on-github/set-up-copilot/configure-code-review" rel="noopener noreferrer"&gt;GitHub Docs: Configuring code review by GitHub Copilot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot/concepts/agents/code-review" rel="noopener noreferrer"&gt;GitHub Docs: About GitHub Copilot code review&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/managing-a-branch-protection-rule" rel="noopener noreferrer"&gt;GitHub Docs: Managing a branch protection rule&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Claude Fable 5.1 GitHub Copilot Data Retention and Pricing Checklist</title>
      <dc:creator>Ahab</dc:creator>
      <pubDate>Wed, 02 Sep 2026 01:22:01 +0000</pubDate>
      <link>https://dev.to/ahab_indieseek/claude-fable-51-github-copilot-data-retention-and-pricing-checklist-mh7</link>
      <guid>https://dev.to/ahab_indieseek/claude-fable-51-github-copilot-data-retention-and-pricing-checklist-mh7</guid>
      <description>&lt;h1&gt;
  
  
  Claude Fable 5.1 in GitHub Copilot: verify retention, policy, and token cost before rollout
&lt;/h1&gt;

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

&lt;p&gt;GitHub announced Claude Fable 5.1 as generally available &lt;strong&gt;inside GitHub Copilot&lt;/strong&gt; on September 1, 2026. That does not establish broad availability through Anthropic's API, Claude apps, or every third-party model router. GitHub says rollout is gradual, the model is available to Copilot Pro+, Max, Business, and Enterprise users, and Business or Enterprise administrators must enable a policy that is off by default.&lt;/p&gt;

&lt;p&gt;The unusual gate is data handling. GitHub's current model documentation says Anthropic retains prompts and outputs for Claude Fable 5 and 5.1 by default to operate safety classifiers. Certain eligible enterprise customers can request a time-limited zero-data-retention path through the end of 2026, but approval does not enable the model and it carries an internal-use boundary. Decide the retention lane before the model policy, then canary cost, availability, fallback, and audit evidence.&lt;/p&gt;

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

&lt;p&gt;This checklist is for individual developers comparing premium Copilot models and for Business or Enterprise administrators deciding whether Fable 5.1 belongs in coding agent, CLI, IDE, mobile, or github.com workflows. It is especially relevant when repositories contain customer code, regulated data, confidential prompts, or long-running agent tasks that can generate substantial output.&lt;/p&gt;

&lt;p&gt;If your first problem is inherited model access, start with the &lt;a href="https://indieseek.co/blogs/github-copilot-default-model-availability-august-26-checklist/?utm_source=devto" rel="noopener noreferrer"&gt;Copilot model-availability reconciliation checklist&lt;/a&gt;. For interrupted CLI sessions, use the &lt;a href="https://indieseek.co/blogs/github-copilot-cli-default-permission-session-restore-checklist/?utm_source=devto" rel="noopener noreferrer"&gt;Copilot CLI permission and restore checklist&lt;/a&gt;. Those controls do not replace this model-specific retention decision.&lt;/p&gt;

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

&lt;p&gt;GitHub describes Fable 5.1 as an Anthropic Mythos-class model designed for long-horizon autonomous coding and knowledge work. In Copilot, the model picker spans Visual Studio Code, Visual Studio, Copilot CLI, coding agent, the GitHub Copilot app, github.com, GitHub Mobile, JetBrains IDEs, Xcode, and Eclipse. Availability can still lag during gradual rollout.&lt;/p&gt;

&lt;p&gt;The announcement is not a promise that Copilot Free or Pro includes the model. It is also not evidence that an organization policy, ZDR approval, or account-team approval has already taken effect. Treat plan entitlement, model visibility, admin policy, retention route, and billing as five separate states.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choose the retention lane first
&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;Entry gate&lt;/th&gt;
&lt;th&gt;Data boundary&lt;/th&gt;
&lt;th&gt;Safe use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pro+ or Max&lt;/td&gt;
&lt;td&gt;Eligible individual plan and completed rollout&lt;/td&gt;
&lt;td&gt;Default Anthropic retention for prompts and outputs&lt;/td&gt;
&lt;td&gt;Non-sensitive canary, then normal work only after accepting the policy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business or Enterprise, default&lt;/td&gt;
&lt;td&gt;Admin enables Fable 5.1 after organizational review&lt;/td&gt;
&lt;td&gt;Default retention applies&lt;/td&gt;
&lt;td&gt;Repositories approved for this data path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Eligible enterprise ZDR exemption&lt;/td&gt;
&lt;td&gt;GitHub account team confirms eligibility and configuration; admin still enables the model&lt;/td&gt;
&lt;td&gt;ZDR through the end of 2026 under the documented exemption&lt;/td&gt;
&lt;td&gt;Internal operations, including internal product development and evaluation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Free, Pro, or not-yet-rolled-out account&lt;/td&gt;
&lt;td&gt;No documented entitlement or model not visible&lt;/td&gt;
&lt;td&gt;Not applicable&lt;/td&gt;
&lt;td&gt;Keep the current approved model; do not infer an outage&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;GitHub says the time-limited ZDR terms prohibit making the model endpoints or outputs externally available. GitHub Support cannot determine eligibility or turn this access on. After the exemption, the documented direction is Enterprise Frontier Safeguards; that future state needs a fresh policy review rather than an automatic rollover assumption.&lt;/p&gt;

&lt;h2&gt;
  
  
  Price the workload, not just the subscription
&lt;/h2&gt;

&lt;p&gt;GitHub's current pricing table is per one million tokens. Fable 5.1 is listed at $10 input, $0.25 cached input, $12.50 cache write, and $50 output. Anthropic models charge cache write in addition to cached input. Copilot plans include different AI-credit allowances; usage beyond allowances is billed through GitHub AI Credits, where one credit equals $0.01.&lt;/p&gt;

&lt;p&gt;Use a reference estimate before rollout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;estimated_usd =
  input_tokens / 1_000_000 * 10
  + cached_input_tokens / 1_000_000 * 0.25
  + cache_write_tokens / 1_000_000 * 12.50
  + output_tokens / 1_000_000 * 50
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A long task with 200,000 input tokens, 100,000 cached-input tokens, 20,000 cache-write tokens, and 40,000 output tokens has a $4.275 reference cost before plan allowances. Output and cache writes dominate quickly. Set a task budget and stop condition before comparing quality.&lt;/p&gt;

&lt;h2&gt;
  
  
  A six-stage rollout workflow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Classify the account and workload
&lt;/h3&gt;

&lt;p&gt;Record plan, billing owner, organization and enterprise, repository, surface, data classification, expected token shape, and whether the output stays internal. Reject the rollout if nobody owns retention acceptance or overage spend.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Capture the effective policy
&lt;/h3&gt;

&lt;p&gt;For Business and Enterprise, record the enterprise and organization settings, repository access, and the final Fable 5.1 policy state. “Allowed by enterprise” is not the same as “enabled by organization.” Preserve a screenshot or exported setting with timestamp and owner.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Resolve the retention path
&lt;/h3&gt;

&lt;p&gt;Choose default retention or a confirmed ZDR exemption. Do not label a request, support ticket, or account-team conversation as approved configuration. For ZDR, retain the eligibility evidence, expiry date, internal-use restriction, enabled policy, and a re-review owner for the end of 2026.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Run a non-sensitive canary
&lt;/h3&gt;

&lt;p&gt;Use a synthetic repository with no secrets or customer code. Verify the exact model label, surface, policy, request completion, attribution, audit log, and fallback behavior. If the model is absent, confirm gradual rollout and policy inheritance before retrying; do not widen repository access.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Measure cost and quality together
&lt;/h3&gt;

&lt;p&gt;Run the same bounded task on the current approved model and Fable 5.1. Compare accepted changes, tests, review corrections, input, cached input, cache writes, output, wall time, and estimated credits. A stronger result is not economical if the output loop remains unbounded.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Expand gradually and keep rollback boring
&lt;/h3&gt;

&lt;p&gt;Start with one low-risk repository and one surface. Roll back by disabling the policy or returning users to the prior approved model. Stop on unexplained model routing, missing audit evidence, retention mismatch, unexpected external output, or spend beyond the declared threshold.&lt;/p&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;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Claude Fable &lt;/span&gt;&lt;span class="m"&gt;5.1&lt;/span&gt;
&lt;span class="na"&gt;product_boundary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;GitHub Copilot&lt;/span&gt;
&lt;span class="na"&gt;plan&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Business&lt;/span&gt;
&lt;span class="na"&gt;surface&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Copilot CLI&lt;/span&gt;
&lt;span class="na"&gt;policy_owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;platform-admin@example.com&lt;/span&gt;
&lt;span class="na"&gt;policy_state&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;enabled&lt;/span&gt;
&lt;span class="na"&gt;retention_lane&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default-retention&lt;/span&gt;
&lt;span class="na"&gt;repository_class&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;internal-non-sensitive&lt;/span&gt;
&lt;span class="na"&gt;canary_repo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;synthetic-fable-canary&lt;/span&gt;
&lt;span class="na"&gt;estimated_usd_limit&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
&lt;span class="na"&gt;fallback_model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;prior-approved-model&lt;/span&gt;
&lt;span class="na"&gt;audit_evidence&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;captured&lt;/span&gt;
&lt;span class="na"&gt;rollback_owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;platform-admin@example.com&lt;/span&gt;
&lt;span class="na"&gt;review_date&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2026-10-02&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Building something? Take a 60-sec game break. Score to rank your product or profile on &lt;a href="https://tapto.top/?utm_source=devto&amp;amp;utm_medium=syndicated-blog&amp;amp;utm_campaign=claude-fable-5-1-github-copilot-data-retention-pricing-rollout-checklist" rel="noopener noreferrer"&gt;tapto.top&lt;/a&gt; and get more exposure—free, no signup.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Writing “Claude Fable 5.1 is available everywhere” when the verified release is GitHub Copilot-specific.&lt;/li&gt;
&lt;li&gt;Enabling the model before deciding whether default retention is acceptable.&lt;/li&gt;
&lt;li&gt;Treating ZDR eligibility approval as automatic model enablement.&lt;/li&gt;
&lt;li&gt;Ignoring cache-write and output prices when estimating long agent tasks.&lt;/li&gt;
&lt;li&gt;Calling a missing picker entry an outage before checking gradual rollout, plan, and policy.&lt;/li&gt;
&lt;li&gt;Sending customer code through a synthetic canary or exposing ZDR outputs externally.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  Is Claude Fable 5.1 generally available outside GitHub Copilot?
&lt;/h3&gt;

&lt;p&gt;This source set proves GA in GitHub Copilot only. Check the official product or API you intend to use before claiming wider availability.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does Copilot Business or Enterprise enable it automatically?
&lt;/h3&gt;

&lt;p&gt;No. GitHub says the policy is off by default and an administrator must enable it. Rollout is also gradual.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is zero data retention automatic for enterprise customers?
&lt;/h3&gt;

&lt;p&gt;No. Certain eligible enterprises can request the time-limited path through their GitHub account team. Approval and policy enablement remain separate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is the token price the same as the subscription price?
&lt;/h3&gt;

&lt;p&gt;No. Plans include different allowances, while the model table supplies per-token reference rates used for additional AI-credit billing.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.blog/changelog/2026-09-01-claude-fable-5-1-generally-available-in-github-copilot/" rel="noopener noreferrer"&gt;GitHub announcement: Claude Fable 5.1 is generally available 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 supported-model and retention documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot/reference/copilot-billing/models-and-pricing" rel="noopener noreferrer"&gt;GitHub model pricing and AI-credit reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://support.claude.com/en/articles/15425996-data-retention-practices-for-mythos-class-models" rel="noopener noreferrer"&gt;Anthropic data-retention practices for Mythos-class models&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.anthropic.com/news/enterprise-frontier-safeguards" rel="noopener noreferrer"&gt;Anthropic Enterprise Frontier Safeguards&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Originally published at &lt;a href="https://indieseek.co/blogs/claude-fable-5-1-github-copilot-data-retention-pricing-rollout-checklist/?utm_source=devto" rel="noopener noreferrer"&gt;IndieSeek&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Codex 0.152 Rate-Limit Reset and Queued Prompt Checklist</title>
      <dc:creator>Ahab</dc:creator>
      <pubDate>Tue, 01 Sep 2026 10:17:57 +0000</pubDate>
      <link>https://dev.to/ahab_indieseek/codex-0152-rate-limit-reset-and-queued-prompt-checklist-52ch</link>
      <guid>https://dev.to/ahab_indieseek/codex-0152-rate-limit-reset-and-queued-prompt-checklist-52ch</guid>
      <description>&lt;h1&gt;
  
  
  Codex 0.152 rate-limit recovery: verify resets, fallback models, and queued prompts
&lt;/h1&gt;

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

&lt;p&gt;Codex 0.152.0, released on September 1, turns rate-limit notices into recovery actions instead of leaving only a dead-end error. Depending on backend eligibility, a banner can lead you to usage details, credits, an earned reset, an owner notification, a plan page, or a fallback model. The important safety change is less visible: queued prompts remain paused while Codex refreshes the authoritative limit snapshot, and only one queued prompt is released after recovery completes.&lt;/p&gt;

&lt;p&gt;Do not treat every stopped turn as “the rate limit.” A rolling usage window, a selected-model limit, a workspace credit cap, an earned reset, and expired Amazon Bedrock credentials have different authorities and recovery paths. Diagnose the state first, take one bounded action, refetch it, and then resume.&lt;/p&gt;

&lt;p&gt;The checked stable tag resolves to commit 316795b3cf2a45e90d121d9f46499d4658b2645c. The local CLI available during this review is 0.145.0, so the workflow below is a source-verified rollout checklist, not a claimed live 0.152 canary.&lt;/p&gt;

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

&lt;p&gt;This guide is for developers running Codex interactively, through codex exec, or behind an app-server client. It is especially useful when unattended work has queued follow-ups, when a team workspace controls credits, or when Codex uses an external model provider such as Amazon Bedrock.&lt;/p&gt;

&lt;p&gt;For root-goal token accounting, use the &lt;a href="https://indieseek.co/blogs/codex-0-151-subagent-token-budget-accounting-checklist/?utm_source=devto" rel="noopener noreferrer"&gt;Codex 0.151 subagent budget checklist&lt;/a&gt;. For API-side 429 and spend controls, see the &lt;a href="https://indieseek.co/blogs/openai-api-hard-spend-limits-429-runbook/?utm_source=devto" rel="noopener noreferrer"&gt;OpenAI API hard-limit runbook&lt;/a&gt;. Those are adjacent controls, not substitutes for this ChatGPT-backed Codex recovery state.&lt;/p&gt;

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

&lt;p&gt;The stable release adds actionable rate-limit banners. The linked implementation carries backend-owned banner and account identity data through account/rateLimits/read, filters banners that do not match the authenticated account or user, refreshes state after a limit error, rejects stale responses, and keeps queued input paused until recovery finishes.&lt;/p&gt;

&lt;p&gt;If the banner instructs Codex to use a fallback model, the client switches to the first available fallback without changing unrelated thread settings. This is not a general promise that every account, limit, or model has a fallback.&lt;/p&gt;

&lt;p&gt;The same release separately adds provider-authentication recovery progress to the TUI and codex exec. App-server clients receive modelProvider/authRecoveryStarted and modelProvider/authRecoveryCompleted with thread, turn, provider, and message fields. A Bedrock credential refresh is therefore not evidence that a ChatGPT usage window reset.&lt;/p&gt;

&lt;h2&gt;
  
  
  Classify the stop before acting
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Observed state&lt;/th&gt;
&lt;th&gt;Authority&lt;/th&gt;
&lt;th&gt;Safe next action&lt;/th&gt;
&lt;th&gt;Do not assume&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Rolling or selected-model usage limit&lt;/td&gt;
&lt;td&gt;Backend usage snapshot and optional banner&lt;/td&gt;
&lt;td&gt;Wait for reset or follow the offered fallback-model action&lt;/td&gt;
&lt;td&gt;Buying credits or refreshing AWS credentials clears it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workspace/member credits or spend control reached&lt;/td&gt;
&lt;td&gt;Workspace billing policy&lt;/td&gt;
&lt;td&gt;Notify the owner, add credits, or change the plan only through the offered action&lt;/td&gt;
&lt;td&gt;A model switch bypasses workspace policy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Earned rate-limit reset available&lt;/td&gt;
&lt;td&gt;account/rateLimits/read snapshot&lt;/td&gt;
&lt;td&gt;Consume once with a unique idempotency key, then refetch&lt;/td&gt;
&lt;td&gt;Every account has a reset or that one reset is free of expiry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provider credential recovery&lt;/td&gt;
&lt;td&gt;Model-provider auth events&lt;/td&gt;
&lt;td&gt;Let refresh finish; reconnect only on failure&lt;/td&gt;
&lt;td&gt;This changes ChatGPT quota or monthly credit state&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The app-server documentation says reset-credit and banner data are snapshot-only. Sparse account/rateLimits/updated notifications must be merged into a recent full read or followed by a refetch; missing fields do not prove zero credits, no spend control, or no banner.&lt;/p&gt;

&lt;h2&gt;
  
  
  A six-stage recovery workflow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Pin the client and record the failed turn
&lt;/h3&gt;

&lt;p&gt;Capture codex --version, authentication mode, account or workspace identity, selected model, thread and turn IDs, error class, queued-input count, and timestamp. Do not upgrade, switch accounts, or re-send the prompt before you can identify the original turn.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Read the authoritative snapshot
&lt;/h3&gt;

&lt;p&gt;TUI users should open the banner's usage action. App-server clients should call account/rateLimits/read. Record usedPercent, window duration, reset time, reached type, effective individual limit, spend-control state, available reset count, and the banner actions actually returned.&lt;/p&gt;

&lt;p&gt;Never manufacture a reset button client-side. The backend decides eligibility, and identity-mismatched banners are filtered.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Hold queued work
&lt;/h3&gt;

&lt;p&gt;Keep queued prompts visible but unsent while recovery is pending. The 0.152 tests cover a failed turn with two queued messages: recovery changes the model when instructed, sends exactly the oldest queued follow-up, leaves the second queued, and does not submit again when recovery completion is repeated.&lt;/p&gt;

&lt;p&gt;If your wrapper automatically retries outside Codex, disable that retry until it consumes the same recovery state. Two independent retry loops can duplicate side effects.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Choose exactly one recovery lane
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wait:&lt;/strong&gt; use the backend reset time for an ordinary rolling window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fallback:&lt;/strong&gt; accept only a banner-provided model action, then record the old and new model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Earned reset:&lt;/strong&gt; consume one returned credit with a fresh idempotency key; never retry with a new key after an uncertain response.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workspace action:&lt;/strong&gt; notify the owner or manage credits/plan through the returned action.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provider auth:&lt;/strong&gt; wait for the matching completion event; if it fails, repair the named provider rather than changing quota settings.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Refetch before releasing input
&lt;/h3&gt;

&lt;p&gt;After any action, run a fresh full read. Confirm account identity still matches, recovery is no longer pending, the selected model is intentional, and the original failed turn has a terminal result. An account change should clear the recovery hold without auto-sending queued work.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Release one prompt and reconcile effects
&lt;/h3&gt;

&lt;p&gt;Send only the oldest queued prompt. Check repository, deployment, issue, payment, or other external state before retrying any tool call from the failed turn. A rate-limit error does not prove that every earlier side effect rolled back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Eight acceptance canaries
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;A limit error triggers one authoritative refresh.&lt;/li&gt;
&lt;li&gt;Input submitted during refresh stays queued.&lt;/li&gt;
&lt;li&gt;A stale response cannot overwrite a newer limit state.&lt;/li&gt;
&lt;li&gt;A banner for another account or user is not rendered.&lt;/li&gt;
&lt;li&gt;A banner-directed fallback changes only the model required for recovery.&lt;/li&gt;
&lt;li&gt;Repeated recovery-complete handling does not send a second prompt.&lt;/li&gt;
&lt;li&gt;Switching accounts clears the hold but does not auto-send the queue.&lt;/li&gt;
&lt;li&gt;Provider-auth progress is logged separately from ChatGPT quota recovery.&lt;/li&gt;
&lt;/ol&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;codex_version: 0.152.0
release_commit: 316795b3cf2a45e90d121d9f46499d4658b2645c
auth_mode: chatgpt|api_key|amazon_bedrock|other
account_id_hash: 
thread_id: 
failed_turn_id: 
limit_reached_type: 
selected_model_before: 
banner_action: wait|fallback|reset|notify_owner|manage_credits|manage_plan|none
reset_idempotency_key_hash: 
provider_auth_recovery: not_seen|started|completed|failed
queued_before: 
queued_released: 1|0
external_side_effects_reconciled: yes|no
fresh_snapshot_verified: yes|no
checked_at: 
~~~

Building something? Take a 60-sec game break. Score to rank your product or profile on [tapto.top](https://tapto.top/?utm_source=devto&amp;amp;amp;utm_medium=syndicated-blog&amp;amp;amp;utm_campaign=codex-0-152-rate-limit-reset-queued-input-recovery-checklist) and get more exposure—free, no signup.

## Common mistakes

- Calling every stopped turn a quota problem when provider authentication is actually refreshing.
- Assuming an absent reset-credit field means zero instead of unavailable snapshot data.
- Creating a client-side reset or plan action that the backend did not return.
- Retrying a reset with a new idempotency key after an uncertain response.
- Letting a wrapper and Codex both resend the same queued prompt.
- Switching models before recording which model and limit caused the stop.
- Treating a successful recovery as proof that prior tool side effects did not occur.
- Claiming 0.152 runtime validation from a machine still running an older CLI.

## FAQ

### Does Codex 0.152 give every user a free rate-limit reset?

No. It surfaces earned reset information and actions only when the backend says they are available for the authenticated account. Availability, count, details, and expiry can differ.

### Will Codex automatically switch models after every limit?

No. The release supports a fallback when instructed by the backend banner and when a fallback is available. It does not make model switching a universal recovery rule.

### Is Bedrock reauthentication the same as a Codex rate-limit reset?

No. Provider credential recovery has separate started/completed events. It restores provider authentication; it does not reset ChatGPT usage windows or workspace credits.

### Can I safely re-send the failed prompt after the banner disappears?

Only after a fresh snapshot, terminal-turn check, and external-side-effect reconciliation. Release one queued prompt, not the entire queue.

## Sources

- [Codex 0.152.0 stable release](https://github.com/openai/codex/releases/tag/rust-v0.152.0)
- [Actionable rate-limit banner implementation and tests](https://github.com/openai/codex/pull/41742)
- [Codex app-server account and rate-limit contract at the release commit](https://github.com/openai/codex/blob/316795b3cf2a45e90d121d9f46499d4658b2645c/codex-rs/app-server/README.md)
- [Queued-input rate-limit recovery tests at the release commit](https://github.com/openai/codex/blob/316795b3cf2a45e90d121d9f46499d4658b2645c/codex-rs/tui/src/chatwidget/tests/rate_limit_recovery_tests.rs)
- [Provider authentication recovery notifications](https://github.com/openai/codex/pull/41239)


Originally published at [IndieSeek](https://indieseek.co/blogs/codex-0-152-rate-limit-reset-queued-input-recovery-checklist/?utm_source=devto).
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
    </item>
    <item>
      <title>DeepSeek Harness alpha.3 SQLite Session Migration Checklist</title>
      <dc:creator>Ahab</dc:creator>
      <pubDate>Tue, 01 Sep 2026 01:25:00 +0000</pubDate>
      <link>https://dev.to/ahab_indieseek/deepseek-harness-alpha3-sqlite-session-migration-checklist-8dl</link>
      <guid>https://dev.to/ahab_indieseek/deepseek-harness-alpha3-sqlite-session-migration-checklist-8dl</guid>
      <description>&lt;p&gt;Liquid syntax error: 'raw' tag was never closed&lt;/p&gt;
</description>
    </item>
    <item>
      <title>GitHub Copilot CLI Permission and Session Restore Checklist</title>
      <dc:creator>Ahab</dc:creator>
      <pubDate>Mon, 31 Aug 2026 10:32:35 +0000</pubDate>
      <link>https://dev.to/ahab_indieseek/github-copilot-cli-permission-and-session-restore-checklist-4fkb</link>
      <guid>https://dev.to/ahab_indieseek/github-copilot-cli-permission-and-session-restore-checklist-4fkb</guid>
      <description>&lt;h1&gt;
  
  
  GitHub Copilot CLI permission defaults: restore crashed sessions without widening authority
&lt;/h1&gt;

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

&lt;p&gt;GitHub Copilot CLI 1.0.81 added two useful controls for new interactive sessions: &lt;code&gt;defaultMode&lt;/code&gt; chooses the startup working mode, while &lt;code&gt;defaultPermissionMode&lt;/code&gt; chooses the initial approval behavior. The same stable release also made startup offer to restore sessions that were still open when the CLI crashed or the machine restarted. GitHub highlighted these changes in its August 28 Copilot weekly release, and 1.0.82 is now the latest stable patch.&lt;/p&gt;

&lt;p&gt;The important boundary is easy to miss: restoring context is not evidence that the restored process has the authority you intended. Before letting a recovered agent continue mid-turn, record the effective mode, permission mode, sandbox policy, working directory, repository state, managed-policy status, and pending action. Resume only when that evidence matches the interrupted session's approved envelope.&lt;/p&gt;

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

&lt;p&gt;This guide is for developers and platform teams using Copilot CLI for long-running refactors, test repair, incident investigation, or agent automation. It matters most when a session may survive a terminal crash, a laptop restart, or an interrupted SSH connection while tools can still edit files or run commands.&lt;/p&gt;

&lt;p&gt;If you govern several Copilot clients, first map their coverage with the &lt;a href="https://indieseek.co/blogs/github-copilot-app-cloud-agent-managed-settings-rollout-checklist/?utm_source=devto" rel="noopener noreferrer"&gt;Copilot managed-settings rollout checklist&lt;/a&gt;. If your concern is model visibility, use the separate &lt;a href="https://indieseek.co/blogs/github-copilot-default-model-availability-august-26-checklist/?utm_source=devto" rel="noopener noreferrer"&gt;Copilot model-availability checklist&lt;/a&gt;. This page is specifically about startup defaults and recovery authority.&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Confirmed change&lt;/th&gt;
&lt;th&gt;Practical value&lt;/th&gt;
&lt;th&gt;What it does not prove&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;defaultMode&lt;/code&gt; for new interactive sessions&lt;/td&gt;
&lt;td&gt;Start in a deliberate standard, plan, or autopilot posture&lt;/td&gt;
&lt;td&gt;A restored session necessarily adopts the latest default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;defaultPermissionMode&lt;/code&gt; for new interactive sessions&lt;/td&gt;
&lt;td&gt;Avoid choosing approval behavior manually every launch&lt;/td&gt;
&lt;td&gt;Sandbox, path, URL, MCP, or enterprise policy is configured correctly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Startup restore offer for sessions left open&lt;/td&gt;
&lt;td&gt;Recover after a crash or restart without finding every terminal manually&lt;/td&gt;
&lt;td&gt;The last tool call completed, rolled back, or is safe to repeat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mid-turn restore can continue the interrupted work&lt;/td&gt;
&lt;td&gt;Reduce manual reconstruction of long agent tasks&lt;/td&gt;
&lt;td&gt;Resume is idempotent or side effects happened exactly once&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Large-session history loads recent events first&lt;/td&gt;
&lt;td&gt;Faster operator access to the recovery point&lt;/td&gt;
&lt;td&gt;Older evidence is unnecessary for reconciliation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Version 1.0.81 is a stable release, tagged at commit &lt;code&gt;65006ce22099563526dcaca743451e99e9d834f7&lt;/code&gt;. Version 1.0.82, tagged at &lt;code&gt;024bf28728f3cc82365e0143f44d071ebafbce4d&lt;/code&gt;, is the latest stable patch checked for this guide. Its release notes do not remove the 1.0.81 startup and restore behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep four states separate
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;th&gt;Where to verify it&lt;/th&gt;
&lt;th&gt;Why separation matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Session mode&lt;/td&gt;
&lt;td&gt;Current UI, startup record, and mode controls&lt;/td&gt;
&lt;td&gt;Plan and autopilot have different execution behavior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Permission mode&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/permissions show&lt;/code&gt; and startup configuration&lt;/td&gt;
&lt;td&gt;Approval behavior is not OS containment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sandbox and policy&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/sandbox status&lt;/code&gt;, &lt;code&gt;/sandbox policy&lt;/code&gt;, and managed settings&lt;/td&gt;
&lt;td&gt;A permission approval can still be constrained by the sandbox or organization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Work progress&lt;/td&gt;
&lt;td&gt;Git diff, tests, external receipts, and session timeline&lt;/td&gt;
&lt;td&gt;Conversation recovery does not prove side-effect recovery&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Never use a successful transcript restore as the only release gate. A session can remember why it intended to run a command while the repository, network service, or external API has already moved on.&lt;/p&gt;

&lt;h2&gt;
  
  
  A safe baseline
&lt;/h2&gt;

&lt;p&gt;For a developer who wants review before mutation, a conservative user-level &lt;code&gt;~/.copilot/settings.json&lt;/code&gt; starting point is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json-doc"&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;"defaultMode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"plan"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"defaultPermissionMode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"default"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"stayInAutopilot"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&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;Treat this as a local preference, not an enterprise policy. Repository and local settings, environment variables, command-line flags, and managed settings may override user defaults. Organizations that must prohibit bypass modes should enforce the supported managed permission policy instead of relying on each developer's file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Seven-stage recovery workflow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Pin the tested client
&lt;/h3&gt;

&lt;p&gt;Record the Copilot CLI version, release channel, OS, shell, repository root, current commit, and settings scopes. Do not compare a crash on 1.0.81 with a recovery after an unrecorded upgrade.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Capture the fresh-session baseline
&lt;/h3&gt;

&lt;p&gt;Start a disposable session and record its startup mode, &lt;code&gt;/permissions show&lt;/code&gt;, &lt;code&gt;/sandbox status&lt;/code&gt;, &lt;code&gt;/sandbox policy&lt;/code&gt;, current directory, and clean or dirty Git state. This is the expected envelope for new work.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Create a reversible interruption
&lt;/h3&gt;

&lt;p&gt;Use a fixture repository. Ask the agent to make one file edit, run one harmless test, and pause before a second mutation. Terminate the CLI during the pause or while a bounded, repeat-safe command is running. Never use payment, deployment, deletion, or message-sending actions for the first canary.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Inspect before restoring
&lt;/h3&gt;

&lt;p&gt;Check the repository diff, process tree, lock files, test output, and any external receipts without starting another agent turn. Write down what definitely happened, what definitely did not happen, and what remains ambiguous.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Restore and re-read authority
&lt;/h3&gt;

&lt;p&gt;Accept the startup restore offer or use &lt;code&gt;copilot --resume&lt;/code&gt; / &lt;code&gt;copilot --continue&lt;/code&gt;. Before answering a permission prompt or allowing the mid-turn continuation to proceed, capture the effective mode, permission state, sandbox state, working directory, policy status, and pending tool call.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Reconcile the interrupted action
&lt;/h3&gt;

&lt;p&gt;Classify the pending step as completed, not started, failed, or unknown. For an unknown state, inspect the target system and use an idempotency key or a read-before-write guard. Do not simply repeat the command because the timeline still shows it as active.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Start a new session to verify defaults
&lt;/h3&gt;

&lt;p&gt;After the recovered task reaches a safe boundary, open a fresh session. Confirm that &lt;code&gt;defaultMode&lt;/code&gt; and &lt;code&gt;defaultPermissionMode&lt;/code&gt; still control new sessions independently of the restored session's retained state.&lt;/p&gt;

&lt;h2&gt;
  
  
  Eight recovery canaries
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Canary&lt;/th&gt;
&lt;th&gt;Expected evidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fresh startup mode&lt;/td&gt;
&lt;td&gt;A new session starts in the configured mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fresh permission mode&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/permissions show&lt;/code&gt; matches the configured default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scope precedence&lt;/td&gt;
&lt;td&gt;Repository, local, environment, flag, and managed overrides are recorded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crash discovery&lt;/td&gt;
&lt;td&gt;Startup offers the exact interrupted session, not an adjacent one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mid-turn restore&lt;/td&gt;
&lt;td&gt;The task resumes only after the pending action is identified&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No authority widening&lt;/td&gt;
&lt;td&gt;Permission, sandbox, path, URL, and MCP boundaries are no broader after restore&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Duplicate prevention&lt;/td&gt;
&lt;td&gt;A repeat-safe fixture proves the interrupted action happens at most once&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fresh-after-restore&lt;/td&gt;
&lt;td&gt;A new session uses current defaults while the recovered session retains only verified state&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&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;Was the session interrupted with a tool call in flight?
  no  -&amp;gt; restore, verify mode and authority, then continue
  yes -&amp;gt; can the target state prove whether the action completed?
           yes -&amp;gt; reconcile the timeline with that evidence
           no  -&amp;gt; block repetition until an idempotency or read-before-write guard exists

After restore, are permission or sandbox boundaries broader?
  yes -&amp;gt; stop, capture settings precedence, and return to the safe baseline
  no  -&amp;gt; run the duplicate-prevention canary before real work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Assuming &lt;code&gt;defaultPermissionMode&lt;/code&gt; is a sandbox.&lt;/li&gt;
&lt;li&gt;Setting &lt;code&gt;allow-all&lt;/code&gt; as a convenience default on a machine with broad credentials.&lt;/li&gt;
&lt;li&gt;Restoring a session before checking whether its last command already changed the target.&lt;/li&gt;
&lt;li&gt;Treating the transcript as proof that a deployment, API call, or file write completed.&lt;/li&gt;
&lt;li&gt;Forgetting that settings scopes and managed policy can override the user file.&lt;/li&gt;
&lt;li&gt;Testing resume only after a clean exit rather than a real interrupted state.&lt;/li&gt;
&lt;li&gt;Allowing recovery to combine a client upgrade, a settings change, and repository mutations in one test.&lt;/li&gt;
&lt;li&gt;Deleting session state before collecting the evidence needed to diagnose the recovery.&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;date / operator / Copilot CLI version / tag commit:
OS / shell / repository / base commit / dirty-state digest:
user / repository / local / environment / flag / managed setting scopes:
fresh defaultMode / defaultPermissionMode:
fresh permissions / sandbox / policy / cwd:
interruption point / pending action / target-state evidence:
restored session ID / effective mode / permissions / sandbox / policy:
duplicate-prevention result / diff / tests / external receipts:
fresh-after-restore result / rollback decision / unresolved ambiguity:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Building something? Take a 60-sec game break. Score to rank your product or profile on &lt;a href="https://tapto.top/?utm_source=devto&amp;amp;utm_medium=syndicated-blog&amp;amp;utm_campaign=github-copilot-cli-default-permission-session-restore-checklist" rel="noopener noreferrer"&gt;tapto.top&lt;/a&gt; and get more exposure—free, no signup.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Does restoring a Copilot CLI session automatically make it safe to continue?
&lt;/h3&gt;

&lt;p&gt;No. Restore recovers session context and can continue interrupted work, but you must separately verify the target state and the effective authority envelope.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should &lt;code&gt;defaultPermissionMode&lt;/code&gt; be set to &lt;code&gt;allow-all&lt;/code&gt; for autopilot?
&lt;/h3&gt;

&lt;p&gt;Not as a general default. GitHub's documentation separates autopilot continuation from full permissions, and recommends considering sandboxing before granting broad authority. Start with the narrowest mode that can complete the fixture.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is &lt;code&gt;copilot --continue&lt;/code&gt; the same as starting a fresh session?
&lt;/h3&gt;

&lt;p&gt;No. It resumes recent session state. Use a separate fresh session to prove what your current startup defaults do.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.blog/changelog/2026-08-28-github-copilot-weekly-releases-august-24/" rel="noopener noreferrer"&gt;GitHub Copilot weekly releases — August 24&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/github/copilot-cli/releases/tag/v1.0.81" rel="noopener noreferrer"&gt;GitHub Copilot CLI 1.0.81 release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/github/copilot-cli/releases/tag/v1.0.82" rel="noopener noreferrer"&gt;GitHub Copilot CLI 1.0.82 release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot/reference/copilot-cli-reference/cli-command-reference" rel="noopener noreferrer"&gt;GitHub Copilot CLI command reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot/reference/copilot-cli-reference/cli-config-dir-reference" rel="noopener noreferrer"&gt;GitHub Copilot CLI configuration directory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot/concepts/agents/copilot-cli/autopilot" rel="noopener noreferrer"&gt;GitHub Copilot CLI autopilot and permissions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Originally published at &lt;a href="https://indieseek.co/blogs/github-copilot-cli-default-permission-session-restore-checklist/?utm_source=devto" rel="noopener noreferrer"&gt;IndieSeek&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>DeepSeek Harness 0.1.2 Alpha.2 Reconnect Checklist</title>
      <dc:creator>Ahab</dc:creator>
      <pubDate>Mon, 31 Aug 2026 01:24:54 +0000</pubDate>
      <link>https://dev.to/ahab_indieseek/deepseek-harness-012-alpha2-reconnect-checklist-4p3f</link>
      <guid>https://dev.to/ahab_indieseek/deepseek-harness-012-alpha2-reconnect-checklist-4p3f</guid>
      <description>&lt;h1&gt;
  
  
  DeepSeek Harness 0.1.2 alpha.2 connection recovery: make reconnects visible before trusting resume
&lt;/h1&gt;

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

&lt;p&gt;DeepSeek Harness &lt;code&gt;v0.1.2-alpha.2&lt;/code&gt;, published on August 30, 2026, makes Web-client connection failures visible, retries automatically, and adds an immediate reconnect action. That is useful, but it is not proof that every interrupted agent event was replayed. Treat recovery as two separate questions: &lt;strong&gt;did the transport reconnect, and did the session projection catch up without gaps or duplicates?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The tagged source uses a 2-second WebSocket heartbeat, a 3-second generation-readiness timeout, and six jittered retry waits before settling on &lt;code&gt;disconnected&lt;/code&gt;. A manual reconnect interrupts the active generation or pending delay and starts a fresh attempt immediately. These are implementation facts at tag commit &lt;code&gt;0a53fb55&lt;/code&gt;; the project still labels itself a Developer Preview with compatibility-breaking changes.&lt;/p&gt;

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

&lt;p&gt;This runbook is for independent developers running long DeepSeek Harness sessions in the Web UI, especially when subagents, schedules, or background jobs can continue while the browser-to-Host connection changes. It is also useful for teams wrapping the Harness behind SSH, a reverse proxy, or a private gateway where a green process check does not prove the browser stream is healthy.&lt;/p&gt;

&lt;p&gt;If you need crash, compaction, and durable-history recovery, use the &lt;a href="https://indieseek.co/blogs/deepseek-harness-session-persistence-compaction-replay-guide/?utm_source=devto" rel="noopener noreferrer"&gt;session persistence and replay guide&lt;/a&gt;. This article covers the narrower transport and projection handoff: browser network state, WebSocket replacement, readiness, cursor continuity, and operator evidence.&lt;/p&gt;

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

&lt;p&gt;The &lt;a href="https://github.com/deepseek-ai/deepseek-harness/releases/tag/dsh-v0.1.2-alpha.2" rel="noopener noreferrer"&gt;official alpha.2 release&lt;/a&gt; adds visible connection failure state, automatic retry, and an immediate reconnect action. The same release also improves long-history and dense live-message processing, shows per-answer token usage and elapsed time, and exposes effective endpoints when &lt;code&gt;web_search&lt;/code&gt; fails.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.1.2-alpha.2/packages/client/connection/src/client/connection.ts" rel="noopener noreferrer"&gt;tagged connection controller&lt;/a&gt; establishes the recovery contract:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Condition&lt;/th&gt;
&lt;th&gt;Controller behavior&lt;/th&gt;
&lt;th&gt;Evidence to require&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Healthy initial connection&lt;/td&gt;
&lt;td&gt;No recovery indicator after the first ready frame&lt;/td&gt;
&lt;td&gt;One connected generation and no retry warnings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser reports offline&lt;/td&gt;
&lt;td&gt;Abort active work, publish &lt;code&gt;disconnected&lt;/code&gt;, suspend automatic retries&lt;/td&gt;
&lt;td&gt;No new socket attempts while offline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser returns online&lt;/td&gt;
&lt;td&gt;Publish &lt;code&gt;connecting&lt;/code&gt;, reset the attempt number, restart at the base tier&lt;/td&gt;
&lt;td&gt;Fresh socket plus a new ready frame&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transport or readiness fails&lt;/td&gt;
&lt;td&gt;Replace the generation using jittered exponential backoff&lt;/td&gt;
&lt;td&gt;One &lt;code&gt;retry #N&lt;/code&gt; warning per physical attempt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User presses reconnect&lt;/td&gt;
&lt;td&gt;Interrupt the generation or delay and attempt immediately&lt;/td&gt;
&lt;td&gt;No parallel retry loop; attempt sequence resets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Final capped attempt fails&lt;/td&gt;
&lt;td&gt;Stop automatic attempts and stay &lt;code&gt;disconnected&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Stable action for manual recovery, not endless traffic&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;navigator.onLine&lt;/code&gt; only decides whether retries should run. The source explicitly treats a fresh &lt;code&gt;$events&lt;/code&gt; ready frame as Host-connectivity proof. Likewise, a visible &lt;code&gt;Connected&lt;/code&gt; state proves a generation opened; it does not by itself prove every one-way notification was replayed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Know the retry timeline
&lt;/h2&gt;

&lt;p&gt;The default backoff cap begins at 500 ms, doubles through 1, 2, 4, and 8 seconds, then reaches the 10-second cap. Each actual delay is randomly chosen from 50% to 100% of its cap. The tagged test expects six retries after the initial failed connection:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Retry&lt;/th&gt;
&lt;th&gt;Delay range&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;250–500 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;500–1,000 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1–2 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;2–4 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;4–8 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;5–10 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The waits therefore total roughly 12.75–25.5 seconds, excluding failed readiness and network time. Do not write an alert that assumes an exact reconnect second. Alert on state transitions, attempt count, and the terminal &lt;code&gt;disconnected&lt;/code&gt; state.&lt;/p&gt;

&lt;h2&gt;
  
  
  A seven-stage rollout
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Pin the alpha and preserve rollback
&lt;/h3&gt;

&lt;p&gt;Record &lt;code&gt;dsh-v0.1.2-alpha.2&lt;/code&gt;, commit &lt;code&gt;0a53fb55bea101816fa226bb964ae2bed71c343b&lt;/code&gt;, Node.js version, launch command, Host URL, and reverse-proxy path. Keep the previous build available. The &lt;a href="https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.1.2-alpha.2/README.md" rel="noopener noreferrer"&gt;official README&lt;/a&gt; says the project is a Developer Preview, not stable GA.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Capture the healthy baseline
&lt;/h3&gt;

&lt;p&gt;Open one disposable session and record the initial generation ID, latest durable event sequence or cursor, visible answer count, active jobs, and active schedules. Confirm the recovery indicator is absent during uninterrupted operation. A permanently visible “connected” badge would make a later transition less useful.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Test browser-offline suspension
&lt;/h3&gt;

&lt;p&gt;Use browser network emulation or disconnect the client network while leaving the Host alive. Expect &lt;code&gt;disconnected&lt;/code&gt; quickly and zero new connection attempts during a 60-second offline window. Duplicate offline events must not create more loops.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Exercise bounded automatic retry
&lt;/h3&gt;

&lt;p&gt;Bring the browser online while deliberately rejecting the WebSocket upgrade. Capture each retry warning and socket attempt. Expect six retries after the initial attempt, then a stable &lt;code&gt;disconnected&lt;/code&gt; state. If attempts continue indefinitely, stop the rollout: the deployed client is not following the tagged controller.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Exercise one manual reconnect
&lt;/h3&gt;

&lt;p&gt;While the client is waiting in backoff, restore the Host and press &lt;strong&gt;Reconnect now&lt;/strong&gt; once. Expect the delay to be interrupted, the attempt sequence to reset, exactly one socket replacement, and a ready frame. Do not repeatedly click; that tests operator impatience rather than recovery correctness.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Reconcile projection and durable work
&lt;/h3&gt;

&lt;p&gt;After reconnect, compare the pre-failure cursor with the fresh baseline or replay cursor. Verify that completed messages appear once, active background work remains owned by the same session, and schedules or jobs did not duplicate. A reconnect may disrupt shared logical streams; non-replayed one-way notifications need separate reconciliation. Use the &lt;a href="https://indieseek.co/blogs/deepseek-harness-subagents-jobs-workflows-delegation-guide/?utm_source=devto" rel="noopener noreferrer"&gt;delegation ownership guide&lt;/a&gt; when subagents are involved.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Promote only with evidence
&lt;/h3&gt;

&lt;p&gt;Run the same canaries through the real proxy or SSH path. Keep retry count, time to ready, terminal disconnect count, cursor gap, duplicate event count, and post-reconnect job ownership in your acceptance record. Roll back if transport recovery succeeds but projection evidence does not.&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;version: dsh-v0.1.2-alpha.2
commit: 0a53fb55bea101816fa226bb964ae2bed71c343b
surface: web / proxy / ssh
initial_generation: 
cursor_before_failure: 
offline_attempts_60s: 0
automatic_retry_warnings: 6
terminal_state: disconnected
manual_reconnect_socket_replacements: 1
ready_frame_received: yes|no
cursor_after_recovery: 
missing_events: 0
duplicate_events: 0
jobs_or_schedules_duplicated: 0
rollback_required: yes|no
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Building something? Take a 60-sec game break. Score to rank your product or profile on &lt;a href="https://tapto.top/?utm_source=devto&amp;amp;utm_medium=syndicated-blog&amp;amp;utm_campaign=deepseek-harness-0-1-2-alpha-2-connection-recovery-runbook" rel="noopener noreferrer"&gt;tapto.top&lt;/a&gt; and get more exposure—free, no signup.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Calling an alpha release stable because the reconnect UI looks polished.&lt;/li&gt;
&lt;li&gt;Treating &lt;code&gt;navigator.onLine=true&lt;/code&gt;, an HTTP health check, or a green Host process as a ready WebSocket generation.&lt;/li&gt;
&lt;li&gt;Assuming &lt;code&gt;Connected&lt;/code&gt; means every live event was replayed exactly once.&lt;/li&gt;
&lt;li&gt;Alerting on a fixed 13- or 26-second deadline even though backoff is jittered and readiness has its own timeout.&lt;/li&gt;
&lt;li&gt;Clicking reconnect repeatedly and then diagnosing duplicate physical attempts as an automatic-retry bug.&lt;/li&gt;
&lt;li&gt;Logging transcript content or credentials when generation ID, cursor, state, and counts are enough.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  Does alpha.2 retry forever?
&lt;/h3&gt;

&lt;p&gt;No. The tagged controller stops automatic recovery after the failed retry in the capped 10-second tier and publishes &lt;code&gt;disconnected&lt;/code&gt;. A manual reconnect can start another sequence.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does manual reconnect preserve the same session?
&lt;/h3&gt;

&lt;p&gt;It replaces the connection generation, not the session identity. Session continuity still depends on fresh baseline or cursor replay and must be verified independently.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is the two-second heartbeat configurable?
&lt;/h3&gt;

&lt;p&gt;Yes. The tagged Gateway config exposes &lt;code&gt;websocketHeartbeatIntervalMs&lt;/code&gt;, with 2,000 ms as the validated default. Changing it alters failure-detection traffic and timing, so record the deployed value.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I upgrade production immediately?
&lt;/h3&gt;

&lt;p&gt;Use a canary first. The release is an alpha inside a Developer Preview. Promote only after the transport timeline and session-projection checks pass through your actual deployment path.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/deepseek-ai/deepseek-harness/releases/tag/dsh-v0.1.2-alpha.2" rel="noopener noreferrer"&gt;DeepSeek Harness v0.1.2-alpha.2 release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/deepseek-ai/deepseek-harness/commit/0a53fb55bea101816fa226bb964ae2bed71c343b" rel="noopener noreferrer"&gt;Official tag commit &lt;code&gt;0a53fb55&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.1.2-alpha.2/README.md" rel="noopener noreferrer"&gt;Developer Preview boundary in the official README&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.1.2-alpha.2/packages/client/connection/src/client/connection.ts" rel="noopener noreferrer"&gt;Tagged connection-controller source&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/deepseek-ai/deepseek-harness/blob/dsh-v0.1.2-alpha.2/apps/web/tests/lifecycle-chrome.e2e.ts" rel="noopener noreferrer"&gt;Tagged browser recovery acceptance test&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Originally published at &lt;a href="https://indieseek.co/blogs/deepseek-harness-0-1-2-alpha-2-connection-recovery-runbook/?utm_source=devto" rel="noopener noreferrer"&gt;IndieSeek&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Claude Code 2.1.251 Model Switch Cache Checklist</title>
      <dc:creator>Ahab</dc:creator>
      <pubDate>Sun, 30 Aug 2026 10:32:05 +0000</pubDate>
      <link>https://dev.to/ahab_indieseek/claude-code-21251-model-switch-cache-checklist-4bij</link>
      <guid>https://dev.to/ahab_indieseek/claude-code-21251-model-switch-cache-checklist-4bij</guid>
      <description>&lt;h1&gt;
  
  
  Claude Code 2.1.251 model-switch hooks: stop cache rebuilds from becoming surprise spend
&lt;/h1&gt;

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

&lt;p&gt;Claude Code &lt;code&gt;v2.1.251&lt;/code&gt;, published on August 28, 2026, adds &lt;code&gt;PreModelSwitch&lt;/code&gt; and &lt;code&gt;PostModelSwitch&lt;/code&gt; hooks plus prompt-cache visibility in &lt;code&gt;/usage&lt;/code&gt; and the status line. Together, they let you turn a model change from an invisible session event into a policy decision with an audit trail.&lt;/p&gt;

&lt;p&gt;Use &lt;code&gt;PreModelSwitch&lt;/code&gt; to allow, deny, or ask before a user- or client-requested switch. Use &lt;code&gt;PostModelSwitch&lt;/code&gt; to observe every durable session-model change, including automatic fallback and resume. Before enforcing anything, capture &lt;code&gt;context_tokens&lt;/code&gt;, &lt;code&gt;prompt_cache_warm&lt;/code&gt;, &lt;code&gt;estimated_cache_write_usd&lt;/code&gt;, and &lt;code&gt;pricing&lt;/code&gt;. The estimate is a planning signal, not an invoice: it excludes the next response, and the server may not rebuild the entire cache.&lt;/p&gt;

&lt;p&gt;This is a direct AI coding-workflow change. It does not make model routing cheap, deterministic, or fully interceptable by itself.&lt;/p&gt;

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

&lt;p&gt;This guide is for independent developers and small teams that use long Claude Code sessions, switch between Sonnet and Opus, enable fast mode, resume older sessions, or let an SDK or Remote Control client select models. It is especially useful when a warm prompt cache is valuable enough that a mid-task switch should be deliberate.&lt;/p&gt;

&lt;p&gt;If you only run short one-shot prompts, a lighter policy may be enough: record the switch and keep working. If you operate long agent sessions or a shared gateway, treat model changes as a cost and governance boundary. Keep this separate from the filesystem authority covered by the &lt;a href="https://indieseek.co/blogs/claude-code-2-1-248-restricted-mode-security-checklist/?utm_source=devto" rel="noopener noreferrer"&gt;Claude Code restricted-mode checklist&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;The &lt;a href="https://github.com/anthropics/claude-code/releases/tag/v2.1.251" rel="noopener noreferrer"&gt;official 2.1.251 release&lt;/a&gt; and the current &lt;a href="https://code.claude.com/docs/en/hooks" rel="noopener noreferrer"&gt;hooks reference&lt;/a&gt; establish three useful surfaces:&lt;/p&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 it can see&lt;/th&gt;
&lt;th&gt;What it can do&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PreModelSwitch&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Requested source and target models, context size, warm-cache state, TTL, estimated cache-write cost, and pricing source&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;allow&lt;/code&gt;, &lt;code&gt;deny&lt;/code&gt;, or &lt;code&gt;ask&lt;/code&gt; before the switch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PostModelSwitch&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The completed switch, including automatic fallback and resume&lt;/td&gt;
&lt;td&gt;Log it or add model-specific context; it cannot block&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;SessionStart&lt;/code&gt; on resume/fork&lt;/td&gt;
&lt;td&gt;Session age, context tokens, likely cache expiry, and estimated cache-write cost&lt;/td&gt;
&lt;td&gt;Warn or annotate before the first resumed request&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The same release adds a per-session prompt-cache line to &lt;code&gt;/usage&lt;/code&gt; and a &lt;code&gt;prompt_cache&lt;/code&gt; object for status-line scripts. Behind a Claude apps gateway with spend limits, &lt;code&gt;rate_limits.spend_limit&lt;/code&gt; exposes the applicable usage percentage and reset time. These are observability fields, not a universal billing API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Know which transitions are actually covered
&lt;/h2&gt;

&lt;p&gt;The first rollout mistake is assuming one pre-hook sees every model change. It does not.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Transition&lt;/th&gt;
&lt;th&gt;&lt;code&gt;PreModelSwitch&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;PostModelSwitch&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;Operator response&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;/model&lt;/code&gt;, picker, or &lt;code&gt;/config&lt;/code&gt; request&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Apply allowlist and cache-cost policy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SDK or Remote Control &lt;code&gt;set_model&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Avoid &lt;code&gt;ask&lt;/code&gt; unless refusal is acceptable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fast mode that changes the model&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Treat it as a new model cache&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automatic model fallback&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Detect and reconcile after the change&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Restored model on session resume&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Pair with &lt;code&gt;SessionStart&lt;/code&gt; cost fields&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One-turn fallback-model-chain substitution&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;The durable session model did not change&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Only interactive &lt;code&gt;/model&lt;/code&gt; can display an &lt;code&gt;ask&lt;/code&gt; prompt. On non-interactive &lt;code&gt;-p&lt;/code&gt;, &lt;code&gt;/config&lt;/code&gt;, SDK, and Remote Control surfaces, &lt;code&gt;ask&lt;/code&gt; behaves as a refusal. Also check &lt;code&gt;to_model&lt;/code&gt; inside the hook: a custom gateway model may not resolve to the canonical name used by the matcher.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  1. Pin the version and keep a rollback
&lt;/h3&gt;

&lt;p&gt;Deploy &lt;code&gt;2.1.251&lt;/code&gt; to a disposable project first. Record the actual binary path and &lt;code&gt;claude --version&lt;/code&gt;; do not assume an editor extension, desktop app, and terminal are using the same build. Keep the previous version available until the canaries below pass.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Observe before blocking
&lt;/h3&gt;

&lt;p&gt;Run a representative long task without changing models. Capture the new &lt;code&gt;/usage&lt;/code&gt; prompt-cache line and, if you use a custom status line, these fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;prompt_cache.warm
prompt_cache.hit_ratio
prompt_cache.misses
prompt_cache.expected_rebuilds
prompt_cache.ttl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;a href="https://code.claude.com/docs/en/prompt-caching" rel="noopener noreferrer"&gt;prompt-caching documentation&lt;/a&gt; explains why model and effort are both cache keys. Changing either mid-session causes the next request to read the whole conversation without cache hits.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Start with three policy outcomes
&lt;/h3&gt;

&lt;p&gt;Use a small decision table instead of a hard-coded “Opus is expensive” rule. The same principle applies when reconciling inherited access in the &lt;a href="https://indieseek.co/blogs/github-copilot-default-model-availability-august-26-checklist/?utm_source=devto" rel="noopener noreferrer"&gt;Copilot model-governance checklist&lt;/a&gt;: availability, selection, and cost are different facts.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;deny&lt;/code&gt; when the target model is outside the approved model set.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ask&lt;/code&gt; when the current cache is warm and the estimated cache write exceeds your session threshold.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;allow&lt;/code&gt; when the cache is already cold, the context is small, or the switch is part of an approved task phase.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Log &lt;code&gt;from_model&lt;/code&gt;, &lt;code&gt;to_model&lt;/code&gt;, &lt;code&gt;source&lt;/code&gt;, &lt;code&gt;context_tokens&lt;/code&gt;, &lt;code&gt;prompt_cache_warm&lt;/code&gt;, &lt;code&gt;cache_ttl&lt;/code&gt;, &lt;code&gt;estimated_cache_write_usd&lt;/code&gt;, and &lt;code&gt;pricing&lt;/code&gt;. Never log credentials or transcript content.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Reconcile after every durable switch
&lt;/h3&gt;

&lt;p&gt;Use &lt;code&gt;PostModelSwitch&lt;/code&gt; for an append-only event. Include whether the source was &lt;code&gt;command&lt;/code&gt;, &lt;code&gt;picker&lt;/code&gt;, &lt;code&gt;sdk&lt;/code&gt;, &lt;code&gt;auto&lt;/code&gt;, or &lt;code&gt;resume&lt;/code&gt;. An automatic fallback bypasses the pre-hook, so post-switch evidence is what tells you the session moved.&lt;/p&gt;

&lt;p&gt;If you add model-specific instructions through &lt;code&gt;additionalContext&lt;/code&gt;, keep them short. They arrive with the next request, and rapid repeated switches deliver only the last target model's output.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Put stale resumes behind a warning
&lt;/h3&gt;

&lt;p&gt;For resumed or forked sessions, &lt;code&gt;SessionStart&lt;/code&gt; now provides &lt;code&gt;seconds_since_last_response&lt;/code&gt;, &lt;code&gt;context_tokens&lt;/code&gt;, &lt;code&gt;prompt_cache_likely_expired&lt;/code&gt;, and &lt;code&gt;estimated_cache_write_usd&lt;/code&gt;. Warn when a long conversation is stale enough that resuming it is likely to rebuild the cache. The useful choice may be to resume, compact at a task boundary, or start a clean session; the estimate alone should not choose for you.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Compare policy to real outcomes
&lt;/h3&gt;

&lt;p&gt;After a week, compare switch events with cache misses, latency, accepted-task quality, and provider or gateway usage. A policy that minimizes cache writes but forces the wrong model is not a win. Keep the model decision tied to the user task, then optimize where the evidence shows avoidable churn. For delegated work, reconcile model choice alongside the &lt;a href="https://indieseek.co/blogs/claude-code-2-1-217-subagent-concurrency-budget-checklist/?utm_source=devto" rel="noopener noreferrer"&gt;subagent concurrency budget&lt;/a&gt; instead of treating model and worker count as separate cost systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Eight acceptance canaries
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Canary&lt;/th&gt;
&lt;th&gt;Expected evidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Warm-cache &lt;code&gt;/model&lt;/code&gt; switch under threshold&lt;/td&gt;
&lt;td&gt;Pre-hook allows; post-hook logs one durable switch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Warm-cache switch over threshold&lt;/td&gt;
&lt;td&gt;Interactive session asks with context/cost reason&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disallowed target model&lt;/td&gt;
&lt;td&gt;Switch is denied and current model remains active&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SDK switch with an &lt;code&gt;ask&lt;/code&gt; result&lt;/td&gt;
&lt;td&gt;Client receives refusal rather than waiting for a dialog&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automatic fallback&lt;/td&gt;
&lt;td&gt;No pre-hook event; one post-hook event with &lt;code&gt;source: auto&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resume a stale long session&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;SessionStart&lt;/code&gt; reports likely expiry and estimated cache write&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Change effort without changing model&lt;/td&gt;
&lt;td&gt;Cache rebuild is visible even though no model switch hook fires&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom gateway model ID&lt;/td&gt;
&lt;td&gt;Hook checks &lt;code&gt;to_model&lt;/code&gt;; matcher ambiguity cannot bypass policy&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Store one redacted acceptance record per surface:&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="na"&gt;claude_model_policy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2.1.251&lt;/span&gt;
  &lt;span class="na"&gt;requested_source&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;command&lt;/span&gt;
  &lt;span class="na"&gt;from_model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;claude-sonnet-5&lt;/span&gt;
  &lt;span class="na"&gt;to_model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;claude-opus-5&lt;/span&gt;
  &lt;span class="na"&gt;cache_warm&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;context_tokens&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;182340&lt;/span&gt;
  &lt;span class="na"&gt;estimated_cache_write_usd&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.1396&lt;/span&gt;
  &lt;span class="na"&gt;pricing&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;catalog&lt;/span&gt;
  &lt;span class="na"&gt;decision&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ask&lt;/span&gt;
  &lt;span class="na"&gt;post_switch_seen&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;outcome&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;accepted&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The numbers above mirror the official documentation example; they are not a price quote for your account.&lt;/p&gt;

&lt;p&gt;Building something? Take a 60-sec game break. Score to rank your product or profile on &lt;a href="https://tapto.top/?utm_source=devto&amp;amp;utm_medium=syndicated-blog&amp;amp;utm_campaign=claude-code-2-1-251-model-switch-cache-policy-checklist" rel="noopener noreferrer"&gt;tapto.top&lt;/a&gt; and get more exposure—free, no signup.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Treating &lt;code&gt;estimated_cache_write_usd&lt;/code&gt; as the final charge. It excludes the response and may overstate the cache rebuilt by the server.&lt;/li&gt;
&lt;li&gt;Expecting &lt;code&gt;PreModelSwitch&lt;/code&gt; to block automatic fallback or resume. Those paths reach &lt;code&gt;PostModelSwitch&lt;/code&gt; only.&lt;/li&gt;
&lt;li&gt;Returning &lt;code&gt;ask&lt;/code&gt; from a headless or SDK workflow and assuming someone will see a dialog.&lt;/li&gt;
&lt;li&gt;Using the matcher as the only guard for custom gateway IDs instead of checking &lt;code&gt;to_model&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Reading &lt;code&gt;prompt_cache&lt;/code&gt; as fleet-wide or subagent-inclusive. It summarizes the main conversation for that session.&lt;/li&gt;
&lt;li&gt;Changing model and effort together, then attributing the cache miss to only one of them.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  Do I need 2.1.251 for these hooks?
&lt;/h3&gt;

&lt;p&gt;Yes. The official hooks reference marks &lt;code&gt;PreModelSwitch&lt;/code&gt;, &lt;code&gt;PostModelSwitch&lt;/code&gt;, the resume cache-cost fields, and the prompt-cache status object as requiring Claude Code &lt;code&gt;v2.1.251&lt;/code&gt; or later.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can the pre-hook block automatic fallback?
&lt;/h3&gt;

&lt;p&gt;No. Automatic fallback is not a requested switch, so it skips &lt;code&gt;PreModelSwitch&lt;/code&gt;. Observe it with &lt;code&gt;PostModelSwitch&lt;/code&gt; and decide whether the new model is acceptable for the next turn.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does a model switch always rebuild the whole cache?
&lt;/h3&gt;

&lt;p&gt;Each model has its own cache, so the next request to a different model has no hits from the current model's cache. The reported dollar figure remains an estimate because the serving layer may already hold a compatible prefix.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I always deny switches with a warm cache?
&lt;/h3&gt;

&lt;p&gt;No. The stronger model may save more engineering time or improve the acceptance rate. Use the hook to expose the tradeoff, not to replace task-level judgment with a single cost threshold.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/anthropics/claude-code/releases/tag/v2.1.251" rel="noopener noreferrer"&gt;Claude Code v2.1.251 release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/hooks" rel="noopener noreferrer"&gt;Claude Code hooks reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/prompt-caching" rel="noopener noreferrer"&gt;How Claude Code uses prompt caching&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://code.claude.com/docs/en/statusline" rel="noopener noreferrer"&gt;Claude Code status line reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/anthropics/claude-code/commit/f1af9b1f4b1fd4c776135381606edada82ef638e" rel="noopener noreferrer"&gt;Tagged release commit &lt;code&gt;f1af9b1&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Originally published at &lt;a href="https://indieseek.co/blogs/claude-code-2-1-251-model-switch-cache-policy-checklist/?utm_source=devto" rel="noopener noreferrer"&gt;IndieSeek&lt;/a&gt;.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Codex 0.151 Subagent Token Budget Checklist</title>
      <dc:creator>Ahab</dc:creator>
      <pubDate>Sun, 30 Aug 2026 01:20:53 +0000</pubDate>
      <link>https://dev.to/ahab_indieseek/codex-0151-subagent-token-budget-checklist-2mej</link>
      <guid>https://dev.to/ahab_indieseek/codex-0151-subagent-token-budget-checklist-2mej</guid>
      <description>&lt;h1&gt;
  
  
  Codex 0.151 subagent token budgets: make nested workers count toward the root goal
&lt;/h1&gt;

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

&lt;p&gt;OpenAI released Codex &lt;code&gt;rust-v0.151.0&lt;/code&gt; on August 29, 2026. One fix changes how a persisted goal measures work: token usage from spawned descendants, including nested subagents, now rolls into the root goal's token budget.&lt;/p&gt;

&lt;p&gt;This closes an accounting gap, not every delegation risk. A root goal still needs an explicit positive &lt;code&gt;token_budget&lt;/code&gt;; concurrency, repeated work, tool side effects, provider billing, and account-level usage limits remain separate controls. The practical rollout is to create one bounded root goal, observe it with &lt;code&gt;get_goal&lt;/code&gt;, and prove that child and grandchild deltas appear exactly once across active work, idle periods, runtime unloading, goal replacement, and concurrent checkpoints.&lt;/p&gt;

&lt;p&gt;The official tag resolves to commit &lt;code&gt;78c290807ce710180111df227df3b7a4fe845452&lt;/code&gt;. The merged implementation PR is #41183, commit &lt;code&gt;4761851ff35c4ebdd35eb8801e1180a0a50fef60&lt;/code&gt;. This article separates those confirmed release facts from the operational checks you should run in your own environment.&lt;/p&gt;

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

&lt;p&gt;This guide is for developers running multi-agent Codex tasks with a root agent that spawns reviewers, researchers, testers, or nested workers. It is especially useful when you want a task budget to cover the whole agent tree rather than only the root conversation.&lt;/p&gt;

&lt;p&gt;If your main problem is controlling simultaneous workers, use the separate &lt;a href="https://indieseek.co/blogs/claude-code-2-1-217-subagent-concurrency-budget-checklist/?utm_source=devto" rel="noopener noreferrer"&gt;Claude Code subagent concurrency budget checklist&lt;/a&gt;. If your problem is assigning ownership between subagents, jobs, and workflows, see the &lt;a href="https://indieseek.co/blogs/deepseek-harness-subagents-jobs-workflows-delegation-guide/?utm_source=devto" rel="noopener noreferrer"&gt;DeepSeek Harness delegation guide&lt;/a&gt;. This page is specifically about Codex persisted-goal token accounting.&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Confirmed behavior&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;th&gt;Verification target&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Child and grandchild usage rolls up&lt;/td&gt;
&lt;td&gt;A nested worker cannot remain invisible to the root goal ledger&lt;/td&gt;
&lt;td&gt;Root &lt;code&gt;tokens_used&lt;/code&gt; includes both levels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Active and idle progress both account descendants&lt;/td&gt;
&lt;td&gt;Child work can be charged while the root is waiting&lt;/td&gt;
&lt;td&gt;An idle checkpoint still advances usage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Goal replacement resets the descendant baseline&lt;/td&gt;
&lt;td&gt;Work from a completed goal should not leak into the next goal&lt;/td&gt;
&lt;td&gt;New goal starts from its own delta&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Per-thread checkpoints are serialized&lt;/td&gt;
&lt;td&gt;Two tool completions should not double-charge the same delta&lt;/td&gt;
&lt;td&gt;Concurrent finishes preserve, but do not duplicate, usage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parent runtime unloading does not break roll-up&lt;/td&gt;
&lt;td&gt;A surviving grandchild still belongs to the root tree&lt;/td&gt;
&lt;td&gt;Usage arrives after the parent runtime stops&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The tagged source calculates goal usage as uncached input tokens plus output tokens. Cached input is subtracted; the goal counter is therefore not the same field as raw total tokens. The implementation stores a cumulative descendant counter, takes deltas against the last accounted baseline, and adds those deltas to root-turn progress.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep four budgets separate
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Limit&lt;/th&gt;
&lt;th&gt;What it governs&lt;/th&gt;
&lt;th&gt;What 0.151 does not promise&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Root goal token budget&lt;/td&gt;
&lt;td&gt;Persisted work budget for one explicit goal&lt;/td&gt;
&lt;td&gt;It does not exist unless a positive budget is requested&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model context window&lt;/td&gt;
&lt;td&gt;Tokens available to a model call&lt;/td&gt;
&lt;td&gt;It is not enlarged or replaced by goal accounting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Account or provider quota&lt;/td&gt;
&lt;td&gt;Product-level usage allowance&lt;/td&gt;
&lt;td&gt;The release does not redefine weekly or plan usage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Financial/tool budget&lt;/td&gt;
&lt;td&gt;API spend and external side effects&lt;/td&gt;
&lt;td&gt;Token accounting does not cap invoices, writes, or deployments&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Treat &lt;code&gt;BudgetLimited&lt;/code&gt; as a goal-runtime state, not proof that every already-running action was cancelled. The tagged tests show that a budget-limited goal can continue accounting usage until the turn stops. Your outer orchestrator should therefore stop new fan-out, let in-flight work reach a safe boundary, and verify the terminal state.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  1. Pin the tested build
&lt;/h3&gt;

&lt;p&gt;Record the Codex version, tag commit, collaboration mode, root thread ID, worker tree, and model route. Do not compare runs that changed both the binary and the delegation topology.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Create one explicit root goal
&lt;/h3&gt;

&lt;p&gt;Use the goal tool only when the task genuinely has a bounded objective and the user or system explicitly requested a token budget. A minimal tool payload looks like this:&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;"objective"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Verify the multi-agent release candidate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"token_budget"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50000&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;Do not invent a budget for an ordinary task. &lt;code&gt;create_goal&lt;/code&gt; rejects a second unfinished goal; complete the current goal before replacing it.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Capture a baseline before fan-out
&lt;/h3&gt;

&lt;p&gt;Call &lt;code&gt;get_goal&lt;/code&gt; and record the goal ID, status, budget, &lt;code&gt;tokens_used&lt;/code&gt;, and remaining tokens. Then spawn one child with a small deterministic task. Check the goal again after a tool completion rather than relying on a UI estimate.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Add nesting and an idle checkpoint
&lt;/h3&gt;

&lt;p&gt;Have the child spawn one grandchild. Let the root wait while the descendant completes a bounded step. The next goal snapshot should include new descendant usage even if the root produced no new model work during that interval.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Exercise lifecycle boundaries
&lt;/h3&gt;

&lt;p&gt;Unload the parent worker runtime while a grandchild remains active, then verify roll-up. Complete the first goal, create a replacement goal, and confirm that usage recorded before the replacement does not become the new goal's opening balance.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Stop fan-out at the boundary
&lt;/h3&gt;

&lt;p&gt;When the root goal reaches its budget, stop admitting new workers. Reconcile any usage that arrived between a checkpoint snapshot and its write, wait for in-flight work to stop safely, then capture the terminal goal record. Do not translate &lt;code&gt;BudgetLimited&lt;/code&gt; into “subscription quota exhausted” or “all costs stopped.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Eight accounting canaries
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Canary&lt;/th&gt;
&lt;th&gt;Expected evidence&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Root only&lt;/td&gt;
&lt;td&gt;Root work advances &lt;code&gt;tokens_used&lt;/code&gt; once&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Child roll-up&lt;/td&gt;
&lt;td&gt;One child delta appears in the root goal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grandchild roll-up&lt;/td&gt;
&lt;td&gt;A nested descendant also appears in the same goal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Idle root&lt;/td&gt;
&lt;td&gt;Descendant progress is recorded while the root waits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parent unload&lt;/td&gt;
&lt;td&gt;Grandchild usage still arrives after its parent runtime stops&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Concurrent checkpoint&lt;/td&gt;
&lt;td&gt;Usage recorded during a checkpoint remains pending for the next one, with no loss or duplicate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Goal replacement&lt;/td&gt;
&lt;td&gt;The new goal excludes the previous goal's descendant baseline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Budget boundary&lt;/td&gt;
&lt;td&gt;Status becomes &lt;code&gt;BudgetLimited&lt;/code&gt;, new fan-out stops, and final usage is reconciled once&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The official test suite includes a compact arithmetic example: 14 uncached-input-plus-output tokens from the root, 36 from a child, and 12 from a grandchild produce 62 tokens on the root goal and reach a 62-token budget. Use larger values in production, but keep this deterministic shape in CI.&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;Is there an explicit root goal with a positive token budget?
  no  -&amp;gt; do not claim a hard goal-token limit
  yes -&amp;gt; does child usage appear in get_goal?
           no  -&amp;gt; verify Codex &amp;gt;= 0.151, the root/descendant relationship, and checkpoint completion
           yes -&amp;gt; does grandchild usage appear after the parent unloads?
                    no  -&amp;gt; stop rollout and preserve the tree/lifecycle trace
                    yes -&amp;gt; run concurrent-checkpoint and goal-replacement canaries
                             -&amp;gt; any loss, duplication, or baseline leak?
                                  yes -&amp;gt; stop rollout with the accounting record
                                  no  -&amp;gt; enable bounded fan-out and monitor the terminal goal state
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Treating the goal token budget as the model context window.&lt;/li&gt;
&lt;li&gt;Claiming it fixes account-level or weekly quota reporting.&lt;/li&gt;
&lt;li&gt;Setting a budget but never checking &lt;code&gt;get_goal&lt;/code&gt; after descendant work.&lt;/li&gt;
&lt;li&gt;Testing only direct children and missing a grandchild path.&lt;/li&gt;
&lt;li&gt;Assuming a budget crossing instantly cancels every in-flight tool call.&lt;/li&gt;
&lt;li&gt;Replacing a goal without checking that the descendant baseline reset.&lt;/li&gt;
&lt;li&gt;Combining a concurrency change with the accounting rollout, making regressions hard to locate.&lt;/li&gt;
&lt;li&gt;Presenting community reports of runaway delegation as verified platform-wide behavior.&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;date / operator / Codex version / tag commit:
root thread / goal ID / objective / token budget:
model route / collaboration mode / worker topology:
baseline tokens_used / remaining:
root-only / child / grandchild deltas:
idle / parent-unload / concurrent-checkpoint results:
replacement-goal opening balance:
budget-limited status / in-flight reconciliation / terminal usage:
provider quota and tool-spend checks kept separate:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Building something? Take a 60-sec game break. Score to rank your product or profile on &lt;a href="https://tapto.top/?utm_source=devto&amp;amp;utm_medium=syndicated-blog&amp;amp;utm_campaign=codex-0-151-subagent-token-budget-accounting-checklist" rel="noopener noreferrer"&gt;tapto.top&lt;/a&gt; and get more exposure—free, no signup.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Does Codex 0.151 cap all subagent costs automatically?
&lt;/h3&gt;

&lt;p&gt;No. The release makes descendant usage count toward an explicit persisted root goal budget. It does not create a budget when none was requested, nor does it replace account quota, API billing, tool-spend, or side-effect controls.&lt;/p&gt;

&lt;h3&gt;
  
  
  What exactly is counted by the goal ledger?
&lt;/h3&gt;

&lt;p&gt;In the tagged implementation, the delta is uncached input tokens plus output tokens. Cached input is subtracted. That is why the goal ledger should be compared with its own &lt;code&gt;get_goal&lt;/code&gt; fields, not with a raw total-token counter from another surface.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I assume workers stop the moment the goal reaches its budget?
&lt;/h3&gt;

&lt;p&gt;No. Treat the state as an admission boundary: stop new fan-out and reconcile work already in flight. The official tests explicitly preserve later accounting on a budget-limited goal until the turn stops.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/openai/codex/releases/tag/rust-v0.151.0" rel="noopener noreferrer"&gt;Codex rust-v0.151.0 release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/openai/codex/pull/41183" rel="noopener noreferrer"&gt;PR #41183: account subagent token usage toward root goals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/openai/codex/blob/rust-v0.151.0/codex-rs/ext/goal/src/accounting.rs" rel="noopener noreferrer"&gt;Tagged goal accounting source&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/openai/codex/blob/rust-v0.151.0/codex-rs/ext/goal/src/spec.rs" rel="noopener noreferrer"&gt;Tagged goal tool specification&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/openai/codex/blob/rust-v0.151.0/codex-rs/ext/goal/tests/goal_extension_backend.rs" rel="noopener noreferrer"&gt;Tagged goal accounting integration tests&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Originally published at &lt;a href="https://indieseek.co/blogs/codex-0-151-subagent-token-budget-accounting-checklist/?utm_source=devto" rel="noopener noreferrer"&gt;IndieSeek&lt;/a&gt;.&lt;/p&gt;

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