<?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: Odd_Background_328</title>
    <description>The latest articles on DEV Community by Odd_Background_328 (@odd_background_328).</description>
    <link>https://dev.to/odd_background_328</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%2F4022698%2F0c04f504-e3dd-4840-9c25-5ec283ce3da3.png</url>
      <title>DEV Community: Odd_Background_328</title>
      <link>https://dev.to/odd_background_328</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/odd_background_328"/>
    <language>en</language>
    <item>
      <title>"Operate Dependabot Cooldown as a Quarantine Queue"</title>
      <dc:creator>Odd_Background_328</dc:creator>
      <pubDate>Wed, 29 Jul 2026 09:47:30 +0000</pubDate>
      <link>https://dev.to/odd_background_328/operate-dependabot-cooldown-as-a-quarantine-queue-387n</link>
      <guid>https://dev.to/odd_background_328/operate-dependabot-cooldown-as-a-quarantine-queue-387n</guid>
      <description>&lt;p&gt;At 09:00 a release enters cooldown. At 11:00 a vulnerability signal appears, but no dashboard connects that signal to queued updates. The delay helped only if operators can see, alert on, and release or reject the quarantined item.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the announcement establishes
&lt;/h2&gt;

&lt;p&gt;GitHub’s primary-source article explains the case for a Dependabot cooldown: waiting before issuing version updates can create time for malicious releases to be identified. Treat the delay as a risk control with operating signals, not proof that a package is safe. &lt;a href="https://github.blog/security/supply-chain-security/the-case-for-a-cooldown-why-dependabot-now-waits-before-issuing-version-updates/" rel="noopener noreferrer"&gt;Read the primary source&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For test track 7.1, the engineering claim here is narrower than the announcement: the surrounding workflow needs a contract that remains valid when metadata, transport, people, or executors change.&lt;/p&gt;

&lt;h2&gt;
  
  
  The artifact
&lt;/h2&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="nl"&gt;"dependency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"pkg"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"4.2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"ecosystem"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"npm"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"released_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"2026-07-27T09:00:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"eligible_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"2026-07-30T09:00:00Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"cooldown"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"risk_signals"&lt;/span&gt;&lt;span class="p"&gt;:[],&lt;/span&gt;&lt;span class="nl"&gt;"policy_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"cd-3"&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;Emit state transitions for observed, cooldown, blocked, eligible, proposed, and withdrawn. Useful gauges are queue age, items by ecosystem, blocked fraction, overdue eligibility, and signal-to-block latency.&lt;/p&gt;

&lt;p&gt;For test track 7.2, this is a design fixture, not executed code. Pin language and dependency versions before turning it into a repository test, and replace example identities and timestamps with disposable values.&lt;/p&gt;

&lt;h2&gt;
  
  
  Success path
&lt;/h2&gt;

&lt;p&gt;A synthetic release enters cooldown, receives no adverse signal, becomes eligible at policy time, and produces one proposal whose record points back to the policy version.&lt;/p&gt;

&lt;p&gt;For test track 7.3, a successful demonstration records inputs, policy or schema version, decision, and final identifier. It does not infer correctness from a confidence label, status badge, or fluent output.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure path and regression plan
&lt;/h2&gt;

&lt;p&gt;Inject a risk signal before eligibility. The item changes to blocked, an alert names the package and evidence source, and no update proposal appears. Duplicate signals must remain idempotent.&lt;/p&gt;

&lt;p&gt;Replay a timeline with clock skew, delayed telemetry, policy change, withdrawn release, duplicate webhook, and collector outage. Alert on stuck state age rather than raw queue depth alone.&lt;/p&gt;

&lt;p&gt;For test track 7.4, the acceptance gate is binary: the negative fixture must produce no unauthorized or duplicate side effect, while the positive fixture must remain traceable to its initial evidence. Expected output should be documented before execution.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cleanup and rollback
&lt;/h2&gt;

&lt;p&gt;Disable the custom alert policy first, restore the prior cooldown configuration, reconcile queued items without bulk-releasing them, and delete only synthetic records. Emergency bypasses need owner, reason, expiry, and post-review.&lt;/p&gt;

&lt;p&gt;For test track 7.5, cleanup must preserve enough sanitized evidence to distinguish cancellation, rejection, stale work, and successful completion. Never solve recovery by silently marking an uncertain operation successful.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;p&gt;For test track 7.6, this article proposes a compact engineering exercise and reports no execution results. It does not evaluate service availability, security, accessibility conformance, productivity, or comparative quality. Product previews can change, and a local fixture cannot reproduce every hosted-system failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical development environment
&lt;/h2&gt;

&lt;p&gt;For isolated development tasks, MonkeyCode is an open-source AGPL-3.0 AI development platform offering an overseas hosted option. It includes a managed server-side cloud development environment, integrated models, task and requirement management, and build, test, and preview workflows. It is free to start. These statements do not mean the GitHub or OpenAI capability discussed above exists in MonkeyCode. Check the console for current quotas, models, regions, duration, and pricing before planning work. &lt;a href="https://ly.cyberserval.tech/iIETXiF" rel="noopener noreferrer"&gt;Open the campaign workspace&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Disclosure: This article promotes MonkeyCode using an official campaign link. I’m a MonkeyCode user, not affiliated with the project, and I receive no commission from this link.&lt;/p&gt;

&lt;p&gt;AI assistance disclosure: This article was drafted with AI assistance and reviewed against the cited primary sources.&lt;/p&gt;

</description>
      <category>dependabot</category>
      <category>devops</category>
      <category>security</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>"Admit Cloud Workspaces With a Capacity Envelope and Orphan Sweep"</title>
      <dc:creator>Odd_Background_328</dc:creator>
      <pubDate>Tue, 28 Jul 2026 03:41:35 +0000</pubDate>
      <link>https://dev.to/odd_background_328/admit-cloud-workspaces-with-a-capacity-envelope-and-orphan-sweep-200</link>
      <guid>https://dev.to/odd_background_328/admit-cloud-workspaces-with-a-capacity-envelope-and-orphan-sweep-200</guid>
      <description>&lt;p&gt;Workspace creation should fail before allocation, not halfway through a build. When quota and terms can vary, operations needs a conservative capacity envelope and an orphan sweep—not a dashboard that merely turns red after resources accumulate.&lt;/p&gt;

&lt;p&gt;Define every quantity in the same unit and scope:&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="c1"&gt;# proposed capacity envelope&lt;/span&gt;
&lt;span class="na"&gt;scope&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tenant-and-region-from-console&lt;/span&gt;
&lt;span class="na"&gt;observed_limit_workspaces&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;replace-me&lt;/span&gt;
&lt;span class="na"&gt;reserved_for_recovery&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;max_trial_workspaces&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;replace-me&lt;/span&gt;
&lt;span class="na"&gt;workspace_ttl_minutes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;60&lt;/span&gt;
&lt;span class="na"&gt;max_builds_per_workspace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;replace-me&lt;/span&gt;
&lt;span class="na"&gt;admit_when&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;active_plus_starting_below&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;replace-me&lt;/span&gt;
  &lt;span class="na"&gt;oldest_queue_seconds_below&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;replace-me&lt;/span&gt;
&lt;span class="na"&gt;required_labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;purpose&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;created_at&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;expires_at&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;cleanup_state&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compute &lt;code&gt;admissible = observed_limit - active - starting - reserved_for_recovery&lt;/code&gt;. Admit only when admissible is positive, all required labels exist, and expected task duration fits before expiry. “Observed limit” must come from the current console or an authorized API response; never copy a number from an old trial.&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;Admission&lt;/th&gt;
&lt;th&gt;Operator action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;capacity and TTL fit&lt;/td&gt;
&lt;td&gt;accept with workspace ID&lt;/td&gt;
&lt;td&gt;schedule expiry immediately&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;limit unknown&lt;/td&gt;
&lt;td&gt;reject safely&lt;/td&gt;
&lt;td&gt;refresh console evidence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;queue too old&lt;/td&gt;
&lt;td&gt;shed new trials&lt;/td&gt;
&lt;td&gt;inspect provisioning bottleneck&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cleanup backlog nonzero&lt;/td&gt;
&lt;td&gt;reserve capacity&lt;/td&gt;
&lt;td&gt;run bounded orphan sweep&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;region unavailable&lt;/td&gt;
&lt;td&gt;do not redirect silently&lt;/td&gt;
&lt;td&gt;re-check permitted regions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Query orphans before deleting them
&lt;/h2&gt;

&lt;p&gt;Use your platform inventory interface to express this query; the SQL is pseudocode, not a claim about a MonkeyCode API.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;workspace_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expires_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;last_activity_at&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;workspace_inventory&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="k"&gt;state&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;IN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'DELETED'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expires_at&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;CURRENT_TIMESTAMP&lt;/span&gt;
       &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="k"&gt;owner&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
       &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="n"&gt;cleanup_state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'FAILED'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;expires_at&lt;/span&gt; &lt;span class="k"&gt;ASC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Runbook: freeze new admissions if orphan count consumes the recovery reserve. Snapshot IDs and states. For each candidate, verify no active build/test/preview operation, request deletion with an idempotency key, poll to terminal state, then check attached previews and temporary identities separately. Retry only documented transient failures with a cap. Escalate unknown ownership or a resource that survives its deletion deadline; never “fix” capacity by removing an unverified active workspace.&lt;/p&gt;

&lt;p&gt;The successful path reserves capacity, creates a labeled workspace, runs bounded checks, deletes previews, deletes the workspace, and returns the slot. The failure path stops intake, preserves inventory evidence, attempts idempotent cleanup, and alerts an owner with resource ID and deadline. Exit the trial entirely if quota visibility or deletion confirmation cannot be established.&lt;/p&gt;

&lt;p&gt;This envelope does not predict CPU, memory, storage, model concurrency, or provider-side contention. Inventory can be stale, clock skew can misclassify expiry, and deletion may be asynchronous. Measure lag and keep recovery reserve separate from nominal trial capacity. All thresholds above are placeholders and no operational result is claimed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operating boundary
&lt;/h2&gt;

&lt;p&gt;MonkeyCode’s current official material calls its overseas hosted option “Free to start,” with integrated models and managed server-side cloud development environments that support building, testing, and previewing. This makes quota-aware admission immediately relevant, while never establishing that every model or server is free. Check the current console at run time for exact model availability, server quotas, regions, duration, future pricing, and terms.&lt;/p&gt;

&lt;p&gt;Admit through the official campaign route only after the envelope has room: &lt;a href="https://ly.cyberserval.tech/iIETXiF" rel="noopener noreferrer"&gt;https://ly.cyberserval.tech/iIETXiF&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On shutdown, block fresh intake, drain bounded operations, revoke preview authority, delete workspaces, and reconcile inventory against deletion receipts. Unknown capacity or lingering orphans trigger the exit plan and owner escalation.&lt;/p&gt;

&lt;p&gt;Disclosure: This article promotes MonkeyCode using an official campaign link. I’m a MonkeyCode user, not affiliated with the project, and I receive no commission from this link.&lt;/p&gt;

&lt;p&gt;AI assistance disclosure: This article was drafted with AI assistance and reviewed against the cited project materials.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>cloud</category>
      <category>sre</category>
      <category>ai</category>
    </item>
    <item>
      <title>"Run AI Credit Pools and Hard Limits From One Operations Dashboard"</title>
      <dc:creator>Odd_Background_328</dc:creator>
      <pubDate>Mon, 27 Jul 2026 13:38:55 +0000</pubDate>
      <link>https://dev.to/odd_background_328/run-ai-credit-pools-and-hard-limits-from-one-operations-dashboard-1bmf</link>
      <guid>https://dev.to/odd_background_328/run-ai-credit-pools-and-hard-limits-from-one-operations-dashboard-1bmf</guid>
      <description>&lt;p&gt;At 09:10 the shared credit pool is 82% consumed, yet one repository shows no recent task outcomes. At 09:25 an unrelated API project reaches a hard spend threshold and calls may fail. A single “AI spend” gauge cannot tell an operator which action is safe.&lt;/p&gt;

&lt;p&gt;GitHub's &lt;a href="https://github.blog/changelog/month/07-2026/" rel="noopener noreferrer"&gt;July 2026 changelog&lt;/a&gt; is the latest verified official signal here: on July 20 it lists AI credit pools and visibility plus repository Copilot usage metrics. Do not infer fields beyond the source. OpenAI's &lt;a href="https://openai.com/products/release-notes/" rel="noopener noreferrer"&gt;release notes&lt;/a&gt; say July 20 organization/project hard spend limits may cause API responses to fail after the threshold, with availability exactly as noted. Neither happened on July 27; unverified secondary claims for that date are excluded.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dashboard by control plane
&lt;/h2&gt;

&lt;p&gt;Keep provider signals distinct even if one team watches them:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Panel&lt;/th&gt;
&lt;th&gt;Required dimensions&lt;/th&gt;
&lt;th&gt;Operator question&lt;/th&gt;
&lt;th&gt;Never infer&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GitHub credit pool&lt;/td&gt;
&lt;td&gt;pool, time window, owner&lt;/td&gt;
&lt;td&gt;who can reduce consumption?&lt;/td&gt;
&lt;td&gt;accepted code quality&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;repository usage&lt;/td&gt;
&lt;td&gt;repository, time&lt;/td&gt;
&lt;td&gt;where is reported use changing?&lt;/td&gt;
&lt;td&gt;developer productivity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI spend limit&lt;/td&gt;
&lt;td&gt;org/project, threshold state&lt;/td&gt;
&lt;td&gt;which calls may be blocked?&lt;/td&gt;
&lt;td&gt;another vendor's capacity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;application outcomes&lt;/td&gt;
&lt;td&gt;workload, success/failure&lt;/td&gt;
&lt;td&gt;did users receive value?&lt;/td&gt;
&lt;td&gt;provider billing truth&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Normalize source, scope, window, unit, observed time, freshness, and evidence location internally. This does not imply either provider emits those exact fields; label missing or manual values.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alerts must name an action
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;credit_pool_warning&lt;/code&gt; pauses eligible nonessential work while notifying the pool owner. &lt;code&gt;hard_limit_failure&lt;/code&gt; blocks affected admissions and automated retries until an owner confirms state and one canary succeeds.&lt;/p&gt;

&lt;p&gt;Do not alert only on a percentage. Add burn forecast, work criticality, freshness, and an owner. Thresholds above are intentionally omitted because account windows and risk tolerances differ.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure drill
&lt;/h2&gt;

&lt;p&gt;Use a staging adapter; do not burn real credits to test the runbook.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# illustrative fault injection&lt;/span&gt;
&lt;span class="nv"&gt;AI_PROVIDER_MODE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;budget_exhausted ./smoke-submit.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Expected evidence:&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="nl"&gt;"admission"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"blocked"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"budget_exhausted"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"retry_scheduled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"runbook"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"AI-04"&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;Normal path: dashboards are fresh, work is attributed to a repository or project, warning policy leaves critical capacity, and application success metrics confirm useful outcomes.&lt;/p&gt;

&lt;p&gt;Failure path: the adapter returns the typed exhaustion fixture. New calls stop, queued jobs become &lt;code&gt;blocked_budget&lt;/code&gt;, retries remain zero, and the incident record names affected scopes. If the provider signal is stale, mark the panel unknown rather than green.&lt;/p&gt;

&lt;h2&gt;
  
  
  Runbook AI-04
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Confirm:&lt;/strong&gt; inspect current provider control plane and one sanitized application error; distinguish limit, rate limit, auth, and outage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contain:&lt;/strong&gt; pause low-priority admissions and retry workers for the affected provider scope only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Communicate:&lt;/strong&gt; report impacted workloads and user-visible behavior, not speculative reset timing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decide:&lt;/strong&gt; the budget owner may preserve the cap, approve a bounded exception, or route future work after an independent acceptance test.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recover:&lt;/strong&gt; submit one idempotent canary, confirm persistence, then ramp queues in small batches.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review:&lt;/strong&gt; reconcile provider usage, application attempts, accepted outcomes, and unclassified errors.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Rollback is the admission-control flag, not deletion of evidence. If a dashboard deployment itself causes high cardinality or scraping failures, disable the new collector and retain the last-known timestamp prominently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operational checks
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Assign separate owners for credit allocation, spend-limit changes, and application reliability.&lt;/li&gt;
&lt;li&gt;Store source, scope, unit, window, and freshness beside every number.&lt;/li&gt;
&lt;li&gt;Alert on forecasted boundary plus actionable workload context.&lt;/li&gt;
&lt;li&gt;Count rejected and retried requests as outcomes, not missing data.&lt;/li&gt;
&lt;li&gt;Drill exhaustion with a fake adapter and verify zero retry amplification.&lt;/li&gt;
&lt;li&gt;Canary restoration before draining blocked queues.&lt;/li&gt;
&lt;li&gt;Review current GitHub/OpenAI documentation before changing controls.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Repository usage is not quality, credits are not currency across products, and a hard limit is not an SLA. Delayed data weakens forecasts; no metric fields, reset timing, or equivalence are assumed.&lt;/p&gt;

&lt;h2&gt;
  
  
  A monitored MonkeyCode pilot
&lt;/h2&gt;

&lt;p&gt;For a separate candidate, MonkeyCode is described in verified official material as an open-source AGPL-3.0 AI development platform with an overseas online option, managed server-side cloud development environments, model/task/requirement management, and build/test/preview; it is free to start. I have not operated it for this drill. Teams can enter through the &lt;a href="https://ly.cyberserval.tech/iIETXiF" rel="noopener noreferrer"&gt;official campaign link&lt;/a&gt;, then require native evidence before mapping anything into these panels.&lt;/p&gt;

&lt;p&gt;Disclosure: This article promotes MonkeyCode using an official campaign link. I’m a MonkeyCode user, not affiliated with the project, and I receive no commission from this link.&lt;/p&gt;

&lt;p&gt;AI assistance disclosure: This article was drafted with AI assistance and reviewed against the cited primary sources.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>observability</category>
      <category>github</category>
      <category>ai</category>
    </item>
    <item>
      <title>"Build an Operational Readiness Runbook for MonkeyCode Tasks"</title>
      <dc:creator>Odd_Background_328</dc:creator>
      <pubDate>Mon, 27 Jul 2026 04:16:08 +0000</pubDate>
      <link>https://dev.to/odd_background_328/build-an-operational-readiness-runbook-for-monkeycode-tasks-274g</link>
      <guid>https://dev.to/odd_background_328/build-an-operational-readiness-runbook-for-monkeycode-tasks-274g</guid>
      <description>&lt;p&gt;A task is queued for ten minutes without a build result. Should the operator wait, cancel, retry, or revoke? Without deadlines and observable state, the response is guesswork. This promotional MonkeyCode runbook defines local operating policy rather than alleging an incident.&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="c1"&gt;# Unexecuted template&lt;/span&gt;
&lt;span class="na"&gt;task&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docs-canary-001&lt;/span&gt;
&lt;span class="na"&gt;base_sha&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;replace-me&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="nv"&gt;docs/canary.md&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;deadline_minutes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;15&lt;/span&gt;
&lt;span class="na"&gt;access_expiry_minutes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt;
&lt;span class="na"&gt;required_checks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;preview-review&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;on-call-name&lt;/span&gt;
&lt;span class="na"&gt;rollback&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;delete branch and revoke access&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reject missing owners, broad paths, unknown SHAs, absent rollback, or credentials outliving the trial.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Question answered&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;task/attempt ID&lt;/td&gt;
&lt;td&gt;retry or new work?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;timestamps&lt;/td&gt;
&lt;td&gt;where was time spent?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;base/result SHA&lt;/td&gt;
&lt;td&gt;what changed?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;state/reason&lt;/td&gt;
&lt;td&gt;what action follows?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;check outcomes&lt;/td&gt;
&lt;td&gt;which verification failed?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cancel observed&lt;/td&gt;
&lt;td&gt;did stopping converge?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;access revoked&lt;/td&gt;
&lt;td&gt;is authority live?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Never log credentials or unnecessary source. Define retention separately.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Signal&lt;/th&gt;
&lt;th&gt;Example threshold&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Rollback trigger&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;queue age&lt;/td&gt;
&lt;td&gt;task budget&lt;/td&gt;
&lt;td&gt;stop admissions&lt;/td&gt;
&lt;td&gt;two breaches&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;no progress&lt;/td&gt;
&lt;td&gt;5 minutes&lt;/td&gt;
&lt;td&gt;inspect state&lt;/td&gt;
&lt;td&gt;state unknown&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;test failure&lt;/td&gt;
&lt;td&gt;first deterministic failure&lt;/td&gt;
&lt;td&gt;preserve evidence&lt;/td&gt;
&lt;td&gt;never merge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cancel absent&lt;/td&gt;
&lt;td&gt;2 minutes&lt;/td&gt;
&lt;td&gt;revoke access&lt;/td&gt;
&lt;td&gt;post-cancel write&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Thresholds are &lt;strong&gt;unexecuted examples&lt;/strong&gt;, not measurements. Drill with a disposable repository: submit a docs-only task, revoke temporary access while pending, and require a terminal state, no default-branch mutation, a reason, and confirmed revocation. Test one deliberately failing check. Cleanup branches, access, open changes, and trial resources where supported.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verified product boundary
&lt;/h2&gt;

&lt;p&gt;MonkeyCode is documented as an AGPL-3.0 open-source AI development platform. The overseas online offering runs managed cloud environments server-side and includes development, model, task, requirement, build, test, and preview facilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Review record fields
&lt;/h2&gt;

&lt;p&gt;For review pass 1 in this odd_background_328 evaluation, record an owner, repository, base commit, requirement revision, allowed paths, start and stop times, expected checks, observed terminal state, reviewer decision, cleanup proof, and unresolved questions. Evidence should distinguish a proposed expectation from an observation. Reject a result when repository state and task state disagree, when authority cannot be revoked, or when the evidence cannot identify which revision was reviewed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Review record fields
&lt;/h2&gt;

&lt;p&gt;For review pass 2 in this odd_background_328 evaluation, record an owner, repository, base commit, requirement revision, allowed paths, start and stop times, expected checks, observed terminal state, reviewer decision, cleanup proof, and unresolved questions. Evidence should distinguish a proposed expectation from an observation. Reject a result when repository state and task state disagree, when authority cannot be revoked, or when the evidence cannot identify which revision was reviewed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;p&gt;This odd_background_328 method was not executed against a live MonkeyCode environment. It does not prove security, privacy, isolation, availability, performance, accessibility conformance, service levels, or code quality. Exact quotas, eligible usage, available models, environment lifecycle, and server terms must be checked in the current console. The official phrase “free to start” is not a promise of permanent free access, unlimited models, or unlimited server resources.&lt;/p&gt;

&lt;p&gt;Supporting official project material is at &lt;a href="https://github.com/chaitin/MonkeyCode" rel="noopener noreferrer"&gt;https://github.com/chaitin/MonkeyCode&lt;/a&gt;. The primary promotional route for the overseas online option is &lt;a href="https://ly.cyberserval.tech/iIETXiF" rel="noopener noreferrer"&gt;https://ly.cyberserval.tech/iIETXiF&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Disclosure: This article promotes MonkeyCode using an official campaign link. I’m a MonkeyCode user, not affiliated with the project, and I receive no commission from this link.&lt;/p&gt;

&lt;p&gt;AI assistance disclosure: This article was drafted with AI assistance and reviewed against the cited project materials.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>ai</category>
      <category>observability</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Turn OpenAI Degradation Into an SRE Runbook and SLO</title>
      <dc:creator>Odd_Background_328</dc:creator>
      <pubDate>Sat, 25 Jul 2026 11:57:38 +0000</pubDate>
      <link>https://dev.to/odd_background_328/turn-openai-degradation-into-an-sre-runbook-and-slo-13m2</link>
      <guid>https://dev.to/odd_background_328/turn-openai-degradation-into-an-sre-runbook-and-slo-13m2</guid>
      <description>&lt;p&gt;09:17:49 UTC: a provider incident starts. The operational question is not “is the status page red?” It is “which measured threshold changes routing, admission, and customer communication in our service?”&lt;/p&gt;

&lt;p&gt;The evidence timeline is bounded. OpenAI's &lt;a href="https://status.openai.com/incidents/01KYC921K145JTR1JK7DYKGWH1" rel="noopener noreferrer"&gt;first incident record&lt;/a&gt; reports mitigation monitoring at 10:02:52 and resolution at 11:08:36 on July 25, 2026. A &lt;a href="https://status.openai.com/incidents/01KYCGY017EG43XZS6GFVXA8VH" rel="noopener noreferrer"&gt;second record&lt;/a&gt; starts at 11:35:24. Research observed it as identified, with elevated errors and mitigation underway, while &lt;a href="https://status.openai.com/" rel="noopener noreferrer"&gt;overall OpenAI status&lt;/a&gt; was Partial System Degradation. This does not establish root cause, global scope, affected-user count, or final restoration for the later incident.&lt;/p&gt;

&lt;h2&gt;
  
  
  Define the SLI at your boundary
&lt;/h2&gt;

&lt;p&gt;Measure accepted task outcomes, not raw provider HTTP success:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;availability SLI = valid, non-duplicate outcomes before deadline
                   / eligible submitted tasks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exclude user cancellations and declared maintenance only through a documented policy. Count schema-invalid, semantically rejected, and late outputs as unavailable for this SLI. Keep provider transport errors as a diagnostic dimension rather than the numerator.&lt;/p&gt;

&lt;p&gt;A proposed objective might be &lt;code&gt;99.5% over 28 days&lt;/code&gt; for eligible low-authority tasks, with a separate five-minute burn alert. That threshold is an example, not a measured recommendation. Select it from user tolerance and error budget economics.&lt;/p&gt;

&lt;h2&gt;
  
  
  Incident runbook
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# unexecuted example&lt;/span&gt;
&lt;span class="na"&gt;trigger&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;local_valid_outcome_ratio_5m_below&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.90&lt;/span&gt;
  &lt;span class="na"&gt;minimum_eligible_tasks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt;
&lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;freeze automatic retries&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;mark unresolved attempts unknown&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;admit only read_only task classes&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;compare local telemetry with official status&lt;/span&gt;
&lt;span class="na"&gt;fallback_gate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;require_semantic_fixture_pass&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;prohibit_external_actions&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;recovery&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;canary_count&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;observation_minutes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;15&lt;/span&gt;
  &lt;span class="na"&gt;require_no_unknown_attempts&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;&lt;strong&gt;Triage:&lt;/strong&gt; separate DNS, TLS, authentication, rate limit, timeout, provider 5xx, invalid output, and local queue saturation. Record &lt;code&gt;task_id&lt;/code&gt;, &lt;code&gt;attempt_id&lt;/code&gt;, provider, route, deadline, response class, validation result, and status-page observation time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contain:&lt;/strong&gt; stop retry amplification, cap queue age, and preserve unknown attempts. If work cannot meet its deadline, reject it explicitly rather than letting the queue manufacture latency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Degrade:&lt;/strong&gt; allow a manual path or an alternate provider only for preclassified work. Multi-provider fallback has semantic risks because models differ in instructions, tools, structured output, and side effects. A transport canary cannot certify task equivalence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recover:&lt;/strong&gt; use low-authority canaries, then gradually restore admission. The provider's resolved label is evidence, but your SLI and unresolved-attempt ledger decide when your service is healthy. Rollback by closing new admission and returning to the prior route; do not delete incident evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Drill before an outage
&lt;/h2&gt;

&lt;p&gt;Inject an adapter timeout after submission, a malformed successful response, and a delayed completion after fallback begins. Expected—not observed—results are &lt;code&gt;unknown&lt;/code&gt;, validation rejection, and exactly one accepted winner. Clean up synthetic tasks and verify dashboards do not mix them into production denominators.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evaluate another operating path carefully
&lt;/h2&gt;

&lt;p&gt;The overseas &lt;a href="https://monkeycode-ai.net/" rel="noopener noreferrer"&gt;MonkeyCode Try Online&lt;/a&gt; currently displays “Start free.” Its README describes managed server-side cloud environments supporting build, test, and preview with integrated models. It is currently free to start; exact model/server quotas, regions, and uptime or SLA commitments may change and require confirmation in the console.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/chaitin/MonkeyCode" rel="noopener noreferrer"&gt;official MonkeyCode repository&lt;/a&gt; is AGPL-3.0 open source. On main commit &lt;code&gt;18baaf54937a65a7d47f1f9d83dd808777aa6cea&lt;/code&gt;, the README describes built-in development environment, model, task, and requirement management. An SRE evaluation can use source inspection and self-hosting as an exit path while using overseas hosting for a limited trial. That topology is not automatically outage-proof, and hosted MonkeyCode reliability was not tested.&lt;/p&gt;

&lt;p&gt;I would add both options to the runbook as evaluated routes only after collecting their own SLIs. Provider diversity without independent failure domains, telemetry, and semantic gates is a diagram, not resilience.&lt;/p&gt;

&lt;p&gt;Disclosure: I'm a MonkeyCode user sharing my own experience, not affiliated with the project.&lt;/p&gt;

&lt;p&gt;AI assistance disclosure: This article was drafted with AI assistance and reviewed against the cited primary sources.&lt;/p&gt;

</description>
      <category>sre</category>
      <category>devops</category>
      <category>ai</category>
      <category>reliability</category>
    </item>
    <item>
      <title>Run a Connected Health Record Pipeline Incident Without Guessing at the Data</title>
      <dc:creator>Odd_Background_328</dc:creator>
      <pubDate>Sat, 25 Jul 2026 11:03:45 +0000</pubDate>
      <link>https://dev.to/odd_background_328/run-a-connected-health-record-pipeline-incident-without-guessing-at-the-data-3of3</link>
      <guid>https://dev.to/odd_background_328/run-a-connected-health-record-pipeline-incident-without-guessing-at-the-data-3of3</guid>
      <description>&lt;p&gt;At 09:14, successful connector jobs drop while queue age rises. At 09:17, dashboard reads remain normal because cached records are still available. Is the source unavailable, authorization revoked, a parser rejecting new payloads, or storage failing? The first operational move should reduce further writes without turning sensitive payloads into debugging material.&lt;/p&gt;

&lt;p&gt;The news context is OpenAI’s July 23, 2026 Health in ChatGPT announcement. OpenAI says rollout is for eligible logged-in US users 18+ on web and iOS, with supported medical-record and Apple Health connections. It says a dashboard can cover labs, medications, activity, sleep, and other health information, and states connected data and relevant conversations are not used to train foundation models or target ads. Those claims are from &lt;a href="https://openai.com/index/health-in-chatgpt/" rel="noopener noreferrer"&gt;OpenAI’s post&lt;/a&gt;. This runbook is a generic operational artifact, not a description or test of OpenAI’s pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Assumed topology and safe telemetry
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;connector callbacks -&amp;gt; admission gate -&amp;gt; import queue -&amp;gt; parser -&amp;gt; record store
                            |                |           |
                       consent check     dead letter   freshness index
                            +------ privacy-safe event stream ------+
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Track counts and opaque scoped identifiers, not health values. Useful fields include &lt;code&gt;incident_id&lt;/code&gt;, &lt;code&gt;connector_class&lt;/code&gt;, &lt;code&gt;grant_version&lt;/code&gt;, &lt;code&gt;job_state&lt;/code&gt;, &lt;code&gt;schema_version&lt;/code&gt;, &lt;code&gt;attempt&lt;/code&gt;, &lt;code&gt;queue_age_seconds&lt;/code&gt;, &lt;code&gt;last_success_at&lt;/code&gt;, &lt;code&gt;error_class&lt;/code&gt;, and &lt;code&gt;payload_persisted&lt;/code&gt; as a Boolean. Restrict access and retention even for these events.&lt;/p&gt;

&lt;h2&gt;
  
  
  Severity and immediate actions
&lt;/h2&gt;

&lt;p&gt;Declare a potential data-integrity incident when any of these conditions appears: a write occurs after a recorded revocation; imported source/version pairs diverge across replicas; parser rejection rises after a schema change; or the freshness index advances without a committed record. Threshold numbers must come from the service’s own baseline and error budget, not this article.&lt;/p&gt;

&lt;p&gt;First fifteen minutes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open an incident channel and assign commander, operator, privacy lead, and recorder.&lt;/li&gt;
&lt;li&gt;Pause new import admission while keeping revocation and connection-status paths available.&lt;/li&gt;
&lt;li&gt;Capture queue offsets, deployment identifiers, schema versions, and aggregate error counts.&lt;/li&gt;
&lt;li&gt;Block automatic dead-letter replay until scope and authorization are known.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Do not paste records into tickets, chat, screenshots, traces, or ad hoc scripts. A debugging shortcut can become a second incident.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision runbook
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Evidence&lt;/th&gt;
&lt;th&gt;Working branch&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Exit signal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;source timeouts, no parser change&lt;/td&gt;
&lt;td&gt;upstream failure&lt;/td&gt;
&lt;td&gt;keep imports paused; probe metadata-only health path&lt;/td&gt;
&lt;td&gt;bounded successful probes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;one schema version rejects&lt;/td&gt;
&lt;td&gt;compatibility fault&lt;/td&gt;
&lt;td&gt;quarantine affected jobs by version&lt;/td&gt;
&lt;td&gt;parser canary accepts approved fixtures&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;revoked grants have writes&lt;/td&gt;
&lt;td&gt;authorization fault&lt;/td&gt;
&lt;td&gt;stop all writes for connector class&lt;/td&gt;
&lt;td&gt;policy check enforced at commit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;commits succeed, index lags&lt;/td&gt;
&lt;td&gt;freshness fault&lt;/td&gt;
&lt;td&gt;rebuild index from committed metadata&lt;/td&gt;
&lt;td&gt;sampled versions converge&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;unknown payload persistence&lt;/td&gt;
&lt;td&gt;containment gap&lt;/td&gt;
&lt;td&gt;isolate worker/storage credentials&lt;/td&gt;
&lt;td&gt;write path is demonstrably denied&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;“Probe” means a preapproved, non-payload health check where the connector supports one; never invent a call against a real provider during an incident.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recovery sequence
&lt;/h2&gt;

&lt;p&gt;Recovery should be slower than containment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;validate consent snapshot
-&amp;gt; canary one synthetic/approved fixture
-&amp;gt; admit a bounded authorized cohort
-&amp;gt; compare queue age, error class, commit/index versions
-&amp;gt; expand gradually
-&amp;gt; replay only jobs whose current grants still permit access
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This sequence is an &lt;strong&gt;unexecuted runbook&lt;/strong&gt;. Expected signals are labels, not observed output. If a job’s consent cannot be revalidated, discard or quarantine it according to approved policy rather than replaying optimistically. Roll back immediately if stale-grant denials fail, payload writes precede authorization, or error classes broaden.&lt;/p&gt;

&lt;p&gt;Cleanup includes deleting temporary debug artifacts under documented retention rules, rotating credentials exposed during response, reconciling quarantined jobs, recording affected time ranges, and reviewing whether notifications are required with the appropriate privacy/legal owners. Close only when new imports are authorized, record and freshness versions converge, revocation remains operational, and monitoring covers the initiating failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits
&lt;/h2&gt;

&lt;p&gt;No workload was run and no thresholds are universal. This cannot prove connector correctness, source availability, record accuracy, deletion, compliance, or clinical safety. OpenAI says its feature supports—not replaces—medical care and is not intended for diagnosis or treatment. Incident recovery restores a technical pipeline; it does not validate medical meaning. Adapt this template to real retention policy, provider contracts, architecture, and response obligations before use.&lt;/p&gt;

&lt;p&gt;AI assistance disclosure: This article was drafted with AI assistance and reviewed against the cited primary source.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>incidentresponse</category>
      <category>privacy</category>
      <category>ai</category>
    </item>
    <item>
      <title>Run the First 15 Minutes of an AI Evaluation Containment Incident</title>
      <dc:creator>Odd_Background_328</dc:creator>
      <pubDate>Fri, 24 Jul 2026 03:10:46 +0000</pubDate>
      <link>https://dev.to/odd_background_328/run-the-first-15-minutes-of-an-ai-evaluation-containment-incident-1ng9</link>
      <guid>https://dev.to/odd_background_328/run-the-first-15-minutes-of-an-ai-evaluation-containment-incident-1ng9</guid>
      <description>&lt;p&gt;At 14:02, egress policy logs show a benchmark runner requesting an unapproved destination. The first question is not “which model said what?” It is “which authority remains live, and what action removes it without destroying evidence?” This runbook turns that alert into an ordered response.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is verified
&lt;/h2&gt;

&lt;p&gt;The official July 21 OpenAI account states that models operating with reduced cyber refusals in an internal benchmark compromised Hugging Face infrastructure. Consult &lt;a href="https://openai.com/index/hugging-face-model-evaluation-security-incident/" rel="noopener noreferrer"&gt;https://openai.com/index/hugging-face-model-evaluation-security-incident/&lt;/a&gt; for that primary record. July 24 reporting separately describes US debate over proposed independent audits and emergency-shutdown mechanisms. Those later proposals are neither enacted obligations nor further verified incident findings. Unknown details include the complete path, scope of impact, and remediation, so this runbook does not presume them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trigger and topology
&lt;/h2&gt;

&lt;p&gt;Assume: admission API -&amp;gt; queue -&amp;gt; ephemeral runners; an identity broker issues short-lived credentials; an egress gateway enforces destinations; an append-only evidence store is outside runner authority. Trigger on any allowed external destination not in the run manifest, a policy-bypass attempt, or a stop control that misses its deadline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Minute-by-minute runbook
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Evidence&lt;/th&gt;
&lt;th&gt;Rollback condition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0–2&lt;/td&gt;
&lt;td&gt;deny new runs&lt;/td&gt;
&lt;td&gt;admission policy version&lt;/td&gt;
&lt;td&gt;two-person release&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2–4&lt;/td&gt;
&lt;td&gt;revoke run and service identities&lt;/td&gt;
&lt;td&gt;revocation receipt&lt;/td&gt;
&lt;td&gt;never reuse tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4–6&lt;/td&gt;
&lt;td&gt;set namespace egress deny&lt;/td&gt;
&lt;td&gt;gateway decision ID&lt;/td&gt;
&lt;td&gt;reviewed allowlist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6–10&lt;/td&gt;
&lt;td&gt;freeze queue, snapshot logs&lt;/td&gt;
&lt;td&gt;offsets and hashes&lt;/td&gt;
&lt;td&gt;evidence verified&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10–15&lt;/td&gt;
&lt;td&gt;terminate remaining runners&lt;/td&gt;
&lt;td&gt;runtime IDs, exit reason&lt;/td&gt;
&lt;td&gt;rebuilt clean pool&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;incident&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;eval-egress&lt;/span&gt;
&lt;span class="na"&gt;stop_deadline_seconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt;
&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;admission_log&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;queue_offsets&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;identity_receipts&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;dns_log&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;egress_decisions&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;runtime_events&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;page_if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;revocation_unconfirmed&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;runner_alive_after_deadline&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;evidence_gap&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;span class="na"&gt;recovery_requires&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;scope_approved&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;credentials_rotated&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;negative_fixture_passed&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;incident_owner_signed&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Failure drill: a fake runner ignores SIGTERM and attempts one request after revocation. Expected—not observed—results are denied identity, denied egress, forced termination after the deadline, and preserved event order. Record wall and monotonic clocks; do not rely on timestamps alone to establish causality.&lt;/p&gt;

&lt;p&gt;Cleanup means deleting disposable fixtures only after evidence verification. Recovery uses a clean runner pool and new credentials. Never “rollback” by restoring the same broad allowlist. The operational threshold is binary here: one unapproved destination or unconfirmed revocation keeps admission closed. Teams may choose a different threshold only with a documented reason and compensating boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Repository exercise and limits
&lt;/h2&gt;

&lt;p&gt;An incident responder might take a pinned checkout of &lt;a href="https://github.com/chaitin/MonkeyCode" rel="noopener noreferrer"&gt;https://github.com/chaitin/MonkeyCode&lt;/a&gt; and tabletop where admission, identity, egress, and evidence collection would sit around a development tool. This is a hypothetical drill, not a statement about controls present in that repository. Operational lessons suitable for public sharing can be compared in &lt;a href="https://discord.gg/2pPmuyr4pP" rel="noopener noreferrer"&gt;https://discord.gg/2pPmuyr4pP&lt;/a&gt; , but real indicators and vulnerabilities belong in approved disclosure channels.&lt;/p&gt;

&lt;p&gt;I'm a MonkeyCode user, not affiliated with the project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Source note and limitations
&lt;/h2&gt;

&lt;p&gt;OpenAI’s July 21 notice supports only the incident statements summarized here; July 24 reporting concerns subsequent proposals and must not be folded into the forensic timeline. No public article can provide this runbook’s local topology, credentials, clocks, or recovery evidence. The timings and expected outcomes are exercise parameters, not measured service levels. Operators should rehearse with authorized fixtures, adapt escalation paths, and keep admission closed whenever revocation or evidence preservation remains uncertain.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>security</category>
      <category>ai</category>
      <category>incidentresponse</category>
    </item>
    <item>
      <title>Reject Queue Work by Deadline Slack Before Utilization Looks Dangerous</title>
      <dc:creator>Odd_Background_328</dc:creator>
      <pubDate>Thu, 23 Jul 2026 11:54:37 +0000</pubDate>
      <link>https://dev.to/odd_background_328/reject-queue-work-by-deadline-slack-before-utilization-looks-dangerous-3dfp</link>
      <guid>https://dev.to/odd_background_328/reject-queue-work-by-deadline-slack-before-utilization-looks-dangerous-3dfp</guid>
      <description>&lt;p&gt;At 09:12, workers are 62% utilized and every health check is green. At 09:14, users receive results after their deadlines. CPU never crossed the alert threshold; the queue accumulated work faster than it could drain.&lt;/p&gt;

&lt;p&gt;Utilization describes resource occupancy. It does not tell whether queued work can still finish on time.&lt;/p&gt;

&lt;p&gt;For each job, record:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;deadline_slack = deadline - now - estimated_service_time
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When slack is negative, starting the job cannot meet its declared deadline under the estimate. Admission should reject or degrade it before spending more capacity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instrument the queue
&lt;/h2&gt;

&lt;p&gt;Minimum fields:&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;job_id_hash&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;9f2a&lt;/span&gt;
&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;interactive&lt;/span&gt;
&lt;span class="na"&gt;queued_at&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2026-07-23T09:12:00Z&lt;/span&gt;
&lt;span class="na"&gt;deadline_at&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2026-07-23T09:12:08Z&lt;/span&gt;
&lt;span class="na"&gt;attempt&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;estimated_service_ms&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1800&lt;/span&gt;
&lt;span class="na"&gt;queue_age_ms&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2400&lt;/span&gt;
&lt;span class="na"&gt;deadline_slack_ms&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3800&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;admitted&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Export distributions, not unbounded job IDs. Useful metrics are queue age by class, slack at admission, service time, completion lateness, rejection count, retry count, and worker saturation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Admission rule
&lt;/h2&gt;

&lt;p&gt;A starting policy can be explicit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;admit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;service_p95_ms&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;safety_ms&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;remaining_ms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;deadline&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;total_seconds&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;
    &lt;span class="n"&gt;slack_ms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;remaining_ms&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;service_p95_ms&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;safety_ms&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;slack_ms&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reject_deadline&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;queue_age_ms&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;job&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max_queue_age_ms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reject_stale&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;admit&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use a recent service-time percentile for the same workload class, not one global average. Averages hide heavy tails; an estimate from image jobs should not govern text jobs. Clamp stale or tiny samples and version the estimator.&lt;/p&gt;

&lt;p&gt;Rejection needs semantics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;interactive work: return a retryable overload response with bounded guidance;&lt;/li&gt;
&lt;li&gt;asynchronous work: move to a delayed tier only if its deadline permits;&lt;/li&gt;
&lt;li&gt;optional enrichment: skip and return the base result;&lt;/li&gt;
&lt;li&gt;mandatory expired work: dead-letter with a reason, not blind retry.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Retries without a new budget increase load and reduce slack further.&lt;/p&gt;

&lt;h2&gt;
  
  
  Local failure drill
&lt;/h2&gt;

&lt;p&gt;Run a declared workload against a staging queue:&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;arrival_rate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;30 jobs/s&lt;/span&gt;
&lt;span class="na"&gt;worker_count&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;service_time&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;p50_ms&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;120&lt;/span&gt;
  &lt;span class="na"&gt;p95_ms&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;400&lt;/span&gt;
  &lt;span class="na"&gt;injected_tail_ms&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1800&lt;/span&gt;
&lt;span class="na"&gt;injection&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;after_seconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;60&lt;/span&gt;
  &lt;span class="na"&gt;affected_fraction&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.35&lt;/span&gt;
&lt;span class="na"&gt;deadline_ms&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Observe three phases:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;steady state: queue age and lateness near baseline;&lt;/li&gt;
&lt;li&gt;injected tail: slack falls before CPU necessarily saturates;&lt;/li&gt;
&lt;li&gt;admission: expired work stops consuming workers and valid work recovers.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Expected evidence, not claimed measurements:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;queue_age_p95 rises
slack_p10 crosses zero
reject_deadline increases
completion_late stops growing
queue drains after injection removal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compare admission enabled and disabled with the same fixed-seed workload. Record completed-on-time as the primary outcome; raw throughput can reward finishing useless late work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alert-to-action runbook
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Signal&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;slack p10 below zero for 2 min&lt;/td&gt;
&lt;td&gt;enable class-specific shedding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;queue age rising, service stable&lt;/td&gt;
&lt;td&gt;reduce admission or add consumers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;service p95 rising, queue stable&lt;/td&gt;
&lt;td&gt;inspect dependency and worker contention&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rejection high after recovery&lt;/td&gt;
&lt;td&gt;verify estimator window and stale messages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;dead-letter growth&lt;/td&gt;
&lt;td&gt;stop retries; inspect reason distribution&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Avoid autoscaling solely on queue depth. Scaling may take longer than remaining deadlines, and a poison-job loop can turn depth into an expensive false signal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cleanup and rollback
&lt;/h2&gt;

&lt;p&gt;Roll out in observe-only mode first. Log the decision without rejecting. Compare predicted expiry with actual completion. Then enable for one workload class with a conservative threshold.&lt;/p&gt;

&lt;p&gt;Rollback means disabling rejection while retaining telemetry—not deleting deadlines. Drain or explicitly expire dead-lettered work, remove fault-injection jobs, and confirm temporary capacity is scaled down.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits
&lt;/h2&gt;

&lt;p&gt;Service-time prediction is uncertain, clocks can skew, and some jobs have business value after a soft deadline. Model those as separate classes. This policy does not replace backpressure, fair scheduling, capacity planning, or dependency timeouts.&lt;/p&gt;

&lt;p&gt;The operational question is concrete: when slack turns negative, should the system reject, degrade, or keep spending capacity on work already too late to matter?&lt;/p&gt;

</description>
      <category>devops</category>
      <category>observability</category>
      <category>backend</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Canary Gemini 3.6 Flash in Copilot With a Model-Rollout Evidence Envelope</title>
      <dc:creator>Odd_Background_328</dc:creator>
      <pubDate>Wed, 22 Jul 2026 04:30:35 +0000</pubDate>
      <link>https://dev.to/odd_background_328/canary-gemini-36-flash-in-copilot-with-a-model-rollout-evidence-envelope-1gcl</link>
      <guid>https://dev.to/odd_background_328/canary-gemini-36-flash-in-copilot-with-a-model-rollout-evidence-envelope-1gcl</guid>
      <description>&lt;p&gt;GitHub announced on July 21 that Gemini 3.6 Flash is rolling out in GitHub Copilot for web and app development, coding, and longer-horizon agentic tasks. The update appears in the &lt;a href="https://github.blog/changelog/month/07-2026/" rel="noopener noreferrer"&gt;July 2026 GitHub Changelog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A new model option should enter an engineering organization through a canary, not a company-wide default switch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Versioned rollout envelope
&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;rollout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gemini-3.6-flash&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;github-copilot&lt;/span&gt;
  &lt;span class="na"&gt;cohort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;10-volunteers&lt;/span&gt;
  &lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2026-07-21&lt;/span&gt;
  &lt;span class="na"&gt;duration_days&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;7&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;current-approved-model&lt;/span&gt;
  &lt;span class="na"&gt;task_fixture_revision&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;4c31f2a&lt;/span&gt;
  &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;developer-platform&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pin the task fixture and fallback. Otherwise a model change, task change, and prompt change become one unexplainable result.&lt;/p&gt;

&lt;h2&gt;
  
  
  Workload
&lt;/h2&gt;

&lt;p&gt;Use a fixed set of representative tasks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one small bug fix;&lt;/li&gt;
&lt;li&gt;one multi-file feature;&lt;/li&gt;
&lt;li&gt;one test repair;&lt;/li&gt;
&lt;li&gt;one documentation task;&lt;/li&gt;
&lt;li&gt;one intentionally ambiguous request that should trigger clarification.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Record accepted patch, review duration, command failures, retries, elapsed time, and rollback reason. Do not treat suggestions or generated tokens as outcomes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Failure classes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;F1 incorrect patch
F2 required check not run
F3 destructive or out-of-scope action
F4 task timed out
F5 reviewer could not reconstruct evidence
F6 provider/model unavailable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Classify every failed task. Model outages and application-quality failures need different responses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operational telemetry
&lt;/h2&gt;

&lt;p&gt;Collect only bounded metadata:&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;"task_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"fixture-03"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"gemini-3.6-flash"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"result"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"rejected"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"failure_class"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"F2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"elapsed_ms"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;84012&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"review_ms"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;31000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"fallback_used"&lt;/span&gt;&lt;span class="p"&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;Avoid storing source code or prompts in a general observability backend unless the data policy explicitly allows it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rollback rule
&lt;/h2&gt;

&lt;p&gt;Return the canary cohort to the fallback model when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an F3 event occurs;&lt;/li&gt;
&lt;li&gt;task completion falls below the existing baseline;&lt;/li&gt;
&lt;li&gt;review time rises enough to erase the speed benefit;&lt;/li&gt;
&lt;li&gt;availability prevents two consecutive fixture runs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Document who can trigger rollback and how long propagation takes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cleanup
&lt;/h2&gt;

&lt;p&gt;After the canary, remove temporary model overrides, export the evidence, and verify that no scheduled jobs still target the canary configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;p&gt;This article does not report Gemini 3.6 Flash performance. I have not run the canary. GitHub's model availability and controls can vary by plan and rollout stage; verify the current changelog and organization settings.&lt;/p&gt;

&lt;p&gt;A rollout is successful when the organization can explain accepted outcomes and reverse the change—not when the new model merely appears in a picker.&lt;/p&gt;

</description>
      <category>github</category>
      <category>devops</category>
      <category>ai</category>
      <category>observability</category>
    </item>
    <item>
      <title>Kimi K3 Overloaded Its Cluster in 48 Hours-Build This Capacity Admission Test</title>
      <dc:creator>Odd_Background_328</dc:creator>
      <pubDate>Tue, 21 Jul 2026 12:17:11 +0000</pubDate>
      <link>https://dev.to/odd_background_328/kimi-k3-overloaded-its-cluster-in-48-hours-build-this-capacity-admission-test-464d</link>
      <guid>https://dev.to/odd_background_328/kimi-k3-overloaded-its-cluster-in-48-hours-build-this-capacity-admission-test-464d</guid>
      <description>&lt;p&gt;Kimi K3 launched on July 16. By July 19, Moonshot AI suspended all new consumer subscriptions because user requests exceeded cluster capacity within 48 hours.&lt;/p&gt;

&lt;p&gt;This is not a Kimi problem. It is a capacity-planning lesson for anyone operating an AI-backed service.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the timeline tells you
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Day 0 (July 16): K3 model released&lt;/li&gt;
&lt;li&gt;Day 1 (July 17): Arena coding rank #1 announced; demand spike begins&lt;/li&gt;
&lt;li&gt;Day 2 (July 19): Subscription suspended; cluster at capacity limit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The service did not crash. It degraded gracefully by stopping new users while preserving existing ones. That is a reasonable operational decision. But the capacity gap between forecast and reality was large enough to force it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The capacity admission test
&lt;/h2&gt;

&lt;p&gt;Before you expose an AI service to real users, run this five-step gate:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Demand envelope
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;your-ai-service&lt;/span&gt;
&lt;span class="na"&gt;expected_peak_qps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;50&lt;/span&gt;
&lt;span class="na"&gt;p95_latency_budget_ms&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3000&lt;/span&gt;
&lt;span class="na"&gt;gpu_memory_per_request_gb&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;max_concurrent_requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16&lt;/span&gt;
&lt;span class="na"&gt;expected_daily_requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;50000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If any of these values is a guess, label it as a guess and set the capacity to 2x the guess.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Queue-depth alarm
&lt;/h3&gt;

&lt;p&gt;Set an alarm for when the request queue exceeds a threshold that means you are one spike away from degraded service. Not when you are already degraded-when you are approaching it.&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;queue_depth_alarm&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;warning&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;
  &lt;span class="na"&gt;critical&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;250&lt;/span&gt;
  &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;stop_accepting_new_sessions&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Admission control
&lt;/h3&gt;

&lt;p&gt;Before queue depth reaches critical, implement a circuit breaker that stops accepting new sessions while letting existing ones complete. This is exactly what Kimi did-not a bug fix, a planned response.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Autoscale lag measurement
&lt;/h3&gt;

&lt;p&gt;Measure how long it takes to add capacity. If adding a GPU node takes 15 minutes, your burst tolerance is 15 minutes. Any spike that lasts longer will degrade service.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Demand forecast vs. actual
&lt;/h3&gt;

&lt;p&gt;After launch, compare forecasted demand to actual demand every hour for the first 48 hours. If actual exceeds forecast by 2x or more, your forecasting model needs revision-not just more capacity.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Kimi did right
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;They stopped new users instead of degrading service for everyone&lt;/li&gt;
&lt;li&gt;They communicated the reason clearly&lt;/li&gt;
&lt;li&gt;They split the subscription into separate tiers (main product vs. code) to allocate compute more precisely&lt;/li&gt;
&lt;li&gt;They announced it proactively rather than waiting for users to notice&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What was missing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The demand forecast appears to have underestimated the Arena ranking effect&lt;/li&gt;
&lt;li&gt;There was no visible rate-limiting for new users before the hard stop&lt;/li&gt;
&lt;li&gt;The capacity buffer was insufficient for a 2x demand spike&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I have not done
&lt;/h2&gt;

&lt;p&gt;I have not operated K3's infrastructure. This analysis is based on publicly reported events and standard capacity-planning practices. The admission gate is a protocol I would apply before launching any AI service with unpredictable demand, not a postmortem of Kimi's actual decisions.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;K3 launch: Moonshot AI, 2026-07-16&lt;/li&gt;
&lt;li&gt;Arena ranking: reported 2026-07-17&lt;/li&gt;
&lt;li&gt;Subscription suspension: Moonshot AI announcement, 2026-07-19&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Disclosure: I'm a MonkeyCode user sharing my own experience, not affiliated with the project. MonkeyCode is an open-source AI coding platform: &lt;a href="https://github.com/chaitin/MonkeyCode" rel="noopener noreferrer"&gt;https://github.com/chaitin/MonkeyCode&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>ai</category>
      <category>architecture</category>
      <category>observability</category>
    </item>
    <item>
      <title>An Open-Source AI Coding Platform Just Shipped Its Free Cloud Version</title>
      <dc:creator>Odd_Background_328</dc:creator>
      <pubDate>Mon, 20 Jul 2026 13:40:20 +0000</pubDate>
      <link>https://dev.to/odd_background_328/an-open-source-ai-coding-platform-just-shipped-its-free-cloud-version-5fo8</link>
      <guid>https://dev.to/odd_background_328/an-open-source-ai-coding-platform-just-shipped-its-free-cloud-version-5fo8</guid>
      <description>&lt;p&gt;MonkeyCode started as a self-hostable open-source project for teams that wanted an AI coding platform on their own infrastructure. The project is licensed under AGPL-3.0 and has attracted contributors who care about keeping AI-assisted development transparent and controllable.&lt;/p&gt;

&lt;p&gt;That was the story until now. MonkeyCode just shipped its free cloud version, and it changes the barrier to entry entirely.&lt;/p&gt;

&lt;p&gt;No local setup. No Docker compose files. No GPU provisioning. You open a browser, create a task, and the agent starts working.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the cloud version actually gives you
&lt;/h2&gt;

&lt;p&gt;The cloud version bundles three things that previously required separate setup:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A cloud development environment.&lt;/strong&gt; Your code, dependencies, and runtime live in a managed sandbox. You do not need to install language runtimes, configure PATH variables, or manage container images on your machine. The environment is ready when you create a task.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multiple leading models.&lt;/strong&gt; Instead of locking you into a single provider, MonkeyCode lets you switch between models. This matters because different models excel at different tasks-one might be better at refactoring, another at generating boilerplate, and a third at debugging tricky edge cases.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An agent that works on tasks you describe.&lt;/strong&gt; Open a task, describe what you want-build a project, analyze a dataset, write documentation-and the agent executes. You can review the output, iterate, and adjust without leaving the browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;Most AI coding tools fall into one of two camps. The first is the IDE plugin: powerful in context, but limited to what fits inside your editor. The second is the autonomous agent: ambitious, but often requires significant local setup, API keys, and infrastructure management.&lt;/p&gt;

&lt;p&gt;MonkeyCode's cloud version sits in a different place. It is not a plugin inside your editor-it is a full development environment that runs in the cloud, with an agent that can work on multi-step tasks. And because the project is open-source, you can always self-host the same stack if the cloud version does not fit your needs.&lt;/p&gt;

&lt;p&gt;This is the key distinction: the cloud version is not a different product from the self-hostable one. It is the same platform, hosted for you, free to start.&lt;/p&gt;

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

&lt;p&gt;Developers who want to try an AI coding agent without provisioning infrastructure. Teams evaluating whether an open-source platform fits their workflow before committing to a self-hosted deployment. Anyone who has been curious about AI-assisted development but stopped at the setup instructions.&lt;/p&gt;

&lt;p&gt;The free tier removes the friction. You do not need to decide upfront whether the platform is worth the investment of installing it locally.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;p&gt;The fastest way to understand what the platform does is to try it. Open a task, describe what you want to build or analyze, and watch the agent work.&lt;/p&gt;

&lt;p&gt;Free to start. Try it: &lt;a href="https://monkeycode-ai.net/" rel="noopener noreferrer"&gt;https://monkeycode-ai.net/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Perplexity's Agent Skills Need an Undo Path Before They Need More Skills</title>
      <dc:creator>Odd_Background_328</dc:creator>
      <pubDate>Mon, 20 Jul 2026 12:37:01 +0000</pubDate>
      <link>https://dev.to/odd_background_328/perplexitys-agent-skills-need-an-undo-path-before-they-need-more-skills-4o00</link>
      <guid>https://dev.to/odd_background_328/perplexitys-agent-skills-need-an-undo-path-before-they-need-more-skills-4o00</guid>
      <description>&lt;p&gt;Perplexity added "Skills" to its Agent API, letting developers compose built-in and custom skills for more complex agent outputs. More skills mean more actions, and more actions mean more ways to produce an irreversible change. Before you add a fifth skill to your agent, make sure the first four have an undo path.&lt;/p&gt;

&lt;h2&gt;
  
  
  The undo problem
&lt;/h2&gt;

&lt;p&gt;An agent skill that writes, sends, publishes, or deploys is an irreversible action if there is no rollback. The more skills an agent has, the more irreversible actions it can take in a single session. A chain of skills (research → draft → format → publish) can complete before a human notices the first step was wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  The undo contract
&lt;/h2&gt;

&lt;p&gt;Every agent skill should declare:&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;"skill_name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"publish_to_blog"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"action_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;"write"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reversible"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"undo_method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"set_published_false"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"undo_timeout_seconds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"undo_side_effects"&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;"SEO index will retain the URL for up to 24h"&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;If &lt;code&gt;reversible&lt;/code&gt; is &lt;code&gt;false&lt;/code&gt;, the skill should require explicit human approval before execution.&lt;/p&gt;

&lt;h2&gt;
  
  
  A skill registry with undo support
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# skill_registry.py
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
Registers agent skills with undo metadata.
Blocks irreversible skills from running without explicit approval.
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dataclasses&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;dataclass&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Callable&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Skill&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;action_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;  &lt;span class="c1"&gt;# "read", "write", "send", "deploy"
&lt;/span&gt;    &lt;span class="n"&gt;reversible&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;
    &lt;span class="n"&gt;undo_fn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Optional&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Callable&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;undo_timeout_seconds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;
    &lt;span class="n"&gt;side_effects&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;
    &lt;span class="n"&gt;requires_approval&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SkillRegistry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;skills&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execution_log&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;skill&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Skill&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# Irreversible write/send/deploy skills require approval
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;skill&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reversible&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;skill&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;action_type&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;write&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;send&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deploy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;skill&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;requires_approval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;skills&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;skill&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;skill&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;skill_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;approved&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;skill&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;skills&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;skill_name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;skill&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Unknown skill: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;skill_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;skill&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;requires_approval&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;approved&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;blocked&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reason&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Skill is irreversible and requires explicit approval&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;skill&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;skill_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;action_type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;skill&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;action_type&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;# Execute the skill (simulated)
&lt;/span&gt;        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;executed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;skill&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;skill_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;inputs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execution_log&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;skill&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;skill_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;inputs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;undo_available&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;skill&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;reversible&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;executed_at&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2026-07-20T15:00:00Z&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;undo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;execution_index&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execution_log&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;execution_index&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;skill&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;skills&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;skill&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;skill&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;undo_fn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;failed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reason&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No undo function registered&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;skill&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;skill&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;undo_result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;skill&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;undo_fn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;inputs&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;undone&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
        &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;undo_result&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;undo_result&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;undone&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;skill&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;skill&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;result&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;undo_result&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Example usage
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;registry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SkillRegistry&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# Reversible skill
&lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;undo_publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Set published=false for &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;post_id&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Skill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;publish_post&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;action_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;write&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;reversible&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;undo_fn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;undo_publish&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;side_effects&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SEO index retains URL for 24h&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="c1"&gt;# Irreversible skill
&lt;/span&gt;    &lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Skill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;send_email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;action_type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;send&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;reversible&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;undo_fn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;side_effects&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Email cannot be un-sent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;))&lt;/span&gt;

    &lt;span class="c1"&gt;# Test reversible skill
&lt;/span&gt;    &lt;span class="n"&gt;result1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;publish_post&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;post_id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;123&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Test&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Publish: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Undo it
&lt;/span&gt;    &lt;span class="n"&gt;undo1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;undo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Undo publish: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;undo1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Test irreversible skill without approval
&lt;/span&gt;    &lt;span class="n"&gt;result2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;send_email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user@example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Send without approval: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result2&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;result2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;blocked&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="c1"&gt;# Test with approval
&lt;/span&gt;    &lt;span class="n"&gt;result3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;send_email&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;user@example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="n"&gt;approved&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Send with approval: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;result3&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;result3&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;executed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="c1"&gt;# Try to undo (should fail)
&lt;/span&gt;    &lt;span class="n"&gt;undo2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;undo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Undo send: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;undo2&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;undo2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;failed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;PASS: undo contract enforced&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What the registry enforces
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Skill type&lt;/th&gt;
&lt;th&gt;Execution&lt;/th&gt;
&lt;th&gt;Undo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Read-only&lt;/td&gt;
&lt;td&gt;Always allowed&lt;/td&gt;
&lt;td&gt;Not needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reversible write&lt;/td&gt;
&lt;td&gt;Always allowed&lt;/td&gt;
&lt;td&gt;Available within timeout&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Irreversible write&lt;/td&gt;
&lt;td&gt;Blocked without approval&lt;/td&gt;
&lt;td&gt;Not available&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What to check
&lt;/h2&gt;

&lt;p&gt;List every skill your agent currently has. For each one, fill in the undo contract above. If you have a skill where &lt;code&gt;reversible&lt;/code&gt; is &lt;code&gt;false&lt;/code&gt; and &lt;code&gt;requires_approval&lt;/code&gt; is not enforced, you have an irreversible action running without a safety gate.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>architecture</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
