<?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: daniel jeong</title>
    <description>The latest articles on DEV Community by daniel jeong (@x4nent).</description>
    <link>https://dev.to/x4nent</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3847714%2F6e415b2d-f2cf-4afe-9fbf-34cb69396b32.png</url>
      <title>DEV Community: daniel jeong</title>
      <link>https://dev.to/x4nent</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/x4nent"/>
    <language>en</language>
    <item>
      <title>Claude Managed Agents — The Complete Guide: Brain/Hands/Session Architecture, MCP Connectors, and Multi-Agent Orchestration</title>
      <dc:creator>daniel jeong</dc:creator>
      <pubDate>Mon, 20 Apr 2026 01:46:12 +0000</pubDate>
      <link>https://dev.to/x4nent/claude-managed-agents-the-complete-guide-brainhandssession-architecture-mcp-connectors-and-1mj2</link>
      <guid>https://dev.to/x4nent/claude-managed-agents-the-complete-guide-brainhandssession-architecture-mcp-connectors-and-1mj2</guid>
      <description>&lt;h1&gt;
  
  
  Claude Managed Agents — The Complete Guide: Brain/Hands/Session Decoupled Architecture, MCP Connectors, and Multi-Agent Orchestration for Production AI
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Published on ManoIT Tech Blog (Korean original).&lt;/strong&gt; On April 8, 2026 Anthropic launched Claude Managed Agents — a fully hosted agent harness that handles the execution loop, sandboxing, tool orchestration, session persistence, and event streaming. This post dissects the architecture, walks through MCP connector wiring, demonstrates multi-agent orchestration patterns, and analyzes three real production deployments (Notion, Rakuten, Sentry).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  1. Why Managed Agents — The Structural Limits of Rolling Your Own Agent Loop
&lt;/h2&gt;

&lt;p&gt;If you have ever shipped an agent built on top of the Messages API, you know the pattern: wrap a &lt;code&gt;while&lt;/code&gt; loop around &lt;code&gt;client.messages.create()&lt;/code&gt;, parse &lt;code&gt;tool_use&lt;/code&gt; blocks, execute tools in a local sandbox, feed &lt;code&gt;tool_result&lt;/code&gt; back in, repeat until &lt;code&gt;stop_reason == "end_turn"&lt;/code&gt;. It works — until it doesn't.&lt;/p&gt;

&lt;p&gt;The failure modes are predictable: a runaway loop burns through your rate budget, a tool call hangs and there is no timeout, the sandbox leaks filesystem state between users, long-running sessions exceed context and lose memory, stream consumers drop events on reconnect, and observability boils down to log scraping. Every team that runs agents in production eventually builds the same harness — and every team's harness has different bugs.&lt;/p&gt;

&lt;p&gt;Managed Agents is Anthropic's answer: a hosted runtime that owns the execution loop, the sandbox, session persistence, and the event stream, so your application owns only the product logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Architecture Deep Dive — Brain / Hands / Session
&lt;/h2&gt;

&lt;p&gt;The platform splits a running agent into three decoupled planes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plane&lt;/th&gt;
&lt;th&gt;Responsibility&lt;/th&gt;
&lt;th&gt;Anthropic Ops&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Brain&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Inference — the LLM that reasons and decides&lt;/td&gt;
&lt;td&gt;Model inference (Opus 4.7 / Sonnet 4.6)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hands&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Execution — the sandboxed environment that runs tools&lt;/td&gt;
&lt;td&gt;Ubuntu sandbox, file I/O, bash, network allowlist&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Session&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;State — the thread that accumulates messages, tool results, and events&lt;/td&gt;
&lt;td&gt;Persistent storage, event bus, stream replay&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Why decoupling matters.&lt;/strong&gt; In a homegrown harness the three planes collapse into one process. If inference is slow, tool execution queues. If a tool hangs, the loop stalls. If the process dies, session state is gone. The Managed Agents topology isolates each plane so that p50 TTFT drops ~60% and p95 TTFT drops &amp;gt;90% compared to naive loops, because tool execution and model inference overlap, and streams survive process restarts.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The Four Core Resources
&lt;/h2&gt;

&lt;p&gt;Every Managed Agents deployment revolves around four REST resources:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Resource&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Key fields&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Agent&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The &lt;strong&gt;blueprint&lt;/strong&gt; — model, tools, system prompt, beta flags, MCP servers&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;model&lt;/code&gt;, &lt;code&gt;toolset&lt;/code&gt;, &lt;code&gt;system&lt;/code&gt;, &lt;code&gt;mcp_servers&lt;/code&gt;, &lt;code&gt;vault_ids&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Environment&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The &lt;strong&gt;sandbox template&lt;/strong&gt; — base image, resource limits, network policy&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;base_image&lt;/code&gt;, &lt;code&gt;cpu&lt;/code&gt;, &lt;code&gt;memory&lt;/code&gt;, &lt;code&gt;network_allowlist&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Session&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A &lt;strong&gt;running instance&lt;/strong&gt; — one Agent in one Environment, with a thread&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;agent_id&lt;/code&gt;, &lt;code&gt;environment_id&lt;/code&gt;, &lt;code&gt;thread_id&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Events&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The &lt;strong&gt;stream&lt;/strong&gt; — every model output, tool call, result, and status change&lt;/td&gt;
&lt;td&gt;SSE stream, typed event payloads&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The required beta header is &lt;code&gt;managed-agents-2026-04-01&lt;/code&gt;, and the default toolset is &lt;code&gt;agent_toolset_20260401&lt;/code&gt; which bundles &lt;code&gt;bash&lt;/code&gt;, &lt;code&gt;read&lt;/code&gt;, &lt;code&gt;write&lt;/code&gt;, &lt;code&gt;edit&lt;/code&gt;, &lt;code&gt;glob&lt;/code&gt;, &lt;code&gt;grep&lt;/code&gt;, &lt;code&gt;web_search&lt;/code&gt;, and &lt;code&gt;web_fetch&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Quickstart — Your First Session in 10 Minutes
&lt;/h2&gt;

&lt;p&gt;Below is the minimum code to create an Agent, an Environment, and a Session, then send it a message and consume the event stream.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;anthropic&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;anthropic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Anthropic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;default_headers&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;anthropic-beta&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;managed-agents-2026-04-01&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="c1"&gt;# 1) Define the Agent (the blueprint)
&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-opus-4-7&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;toolset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;agent_toolset_20260401&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You are a production-grade coding agent. Always write tests.&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="c1"&gt;# 2) Define the Environment (the sandbox template)
&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;base_image&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ubuntu-24.04-dev&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;cpu&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;memory_mb&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;network_allowlist&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;github.com&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;pypi.org&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="c1"&gt;# 3) Launch a Session
&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sessions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;environment_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 4) Send a message and stream events
&lt;/span&gt;&lt;span class="n"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sessions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;session_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Clone psf/requests, find the top 3 slowest tests, propose fixes.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;stream&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="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;stream&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;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;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;agent.thread_message_received&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="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The session keeps running after the initial turn — you can attach more messages to the same &lt;code&gt;thread_id&lt;/code&gt; and the agent resumes with full memory of earlier turns.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. MCP Connectors — The Standard Interface for External Systems
&lt;/h2&gt;

&lt;p&gt;Managed Agents natively supports MCP (Model Context Protocol) — but only the &lt;strong&gt;remote HTTP streamable transport&lt;/strong&gt;, not stdio. Credentials live in Anthropic's Vault and never enter the sandbox.&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="n"&gt;vault_entry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vaults&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;secrets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="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;github-pat&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GITHUB_PAT&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;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;toolset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;agent_toolset_20260401&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;mcp_servers&lt;/span&gt;&lt;span class="o"&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;name&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;github&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;url&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;https://mcp.github.com/streamable&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;vault_ids&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;vault_entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&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;name&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;linear&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;url&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;https://mcp.linear.app/streamable&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;vault_ids&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;linear_secret&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&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;system&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You triage GitHub issues and sync status to Linear.&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The credential isolation pattern is the killer feature: your production PAT never touches a sandbox process, so a prompt injection that convinces the agent to &lt;code&gt;cat ~/.env&lt;/code&gt; returns nothing because the token lives one network hop away.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Multi-Agent — Supervisor Pattern over Session Threads
&lt;/h2&gt;

&lt;p&gt;Managed Agents implements multi-agent orchestration through &lt;code&gt;callable_agents&lt;/code&gt; (currently one-level delegation only, research preview). The supervisor receives the top-level goal and delegates subtasks to specialized agents over session threads.&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="n"&gt;reviewer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;toolset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;agent_toolset_20260401&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You review diffs for security, performance, and style. Be specific.&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;test_writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-sonnet-4-6&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;toolset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;agent_toolset_20260401&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;You write pytest tests with &amp;gt;80% coverage. Include edge cases.&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;orchestrator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;claude-opus-4-7&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;toolset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;agent_toolset_20260401&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;callable_agents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;reviewer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;test_writer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;system&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;You orchestrate code review. Delegate review to the reviewer agent, &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;delegate test writing to the test_writer agent, then synthesize.&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Event types like &lt;code&gt;session.thread_created&lt;/code&gt; and &lt;code&gt;agent.thread_message_sent&lt;/code&gt; let you observe delegation as it happens. Rakuten built their Slack/Teams bot network on this pattern — one supervisor per workspace, domain sub-agents per channel, full deployment in &lt;strong&gt;one week&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Event Stream Design — Production SSE Consumption
&lt;/h2&gt;

&lt;p&gt;The event stream is SSE-based and resumable. A production consumer must handle reconnect, replay, and backpressure.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;consume&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session_id&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;last_event_id&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="bp"&gt;None&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;backoff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;headers&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;anthropic-version&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;2023-06-01&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;anthropic-beta&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;managed-agents-2026-04-01&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;Accept&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;text/event-stream&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="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;last_event_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Last-Event-ID&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;last_event_id&lt;/span&gt;

            &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GET&lt;/span&gt;&lt;span class="sh"&gt;"&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;https://api.anthropic.com/v1/sessions/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;session_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/events&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;timeout&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="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;iter_sse&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
                    &lt;span class="n"&gt;last_event_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;
                    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;
                    &lt;span class="n"&gt;backoff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HTTPError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;backoff&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="n"&gt;backoff&lt;/span&gt; &lt;span class="o"&gt;*=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Key event types to handle: &lt;code&gt;session.thread_created&lt;/code&gt;, &lt;code&gt;session.thread_idle&lt;/code&gt;, &lt;code&gt;agent.thread_message_sent&lt;/code&gt;, &lt;code&gt;agent.thread_message_received&lt;/code&gt;, &lt;code&gt;agent.tool_use_started&lt;/code&gt;, &lt;code&gt;agent.tool_use_completed&lt;/code&gt;, &lt;code&gt;session.closed&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Research Preview Features — Outcomes, Memory, Multiagent
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Outcomes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Structured success/failure signals the agent self-reports for eval pipelines&lt;/td&gt;
&lt;td&gt;Research preview&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Persistent semantic memory that survives session boundaries&lt;/td&gt;
&lt;td&gt;Research preview&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multiagent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;callable_agents&lt;/code&gt; — 1-level delegation between agents&lt;/td&gt;
&lt;td&gt;Research preview&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All three require an allowlist opt-in. Expect breaking changes. Production-critical work should pin to GA features only.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Production Case Studies — Notion, Rakuten, Sentry
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Notion&lt;/strong&gt; — Workspace agents. Every Notion workspace gets a dedicated agent that reads from the workspace databases via the Notion MCP server. Users chat with it to summarize projects, draft pages, and route action items. Key insight: one agent per workspace gives durable per-tenant memory without cross-tenant leakage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rakuten&lt;/strong&gt; — Slack/Teams sub-agents per domain. A supervisor agent fans out to domain-specialist sub-agents (logistics, finance, HR). They deployed in &lt;strong&gt;one week&lt;/strong&gt; because Managed Agents erased the entire harness layer. Key insight: fast time-to-value comes from offloading infra, not from writing clever prompts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sentry&lt;/strong&gt; — Debug + PR agent. When an error hits production, a session launches that reads Sentry context via MCP, clones the repo, reproduces the bug, proposes a fix, and opens a PR. Key insight: long-running sessions + event streams let engineers watch the agent work and intervene mid-flight.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Cost Model and Budget Design
&lt;/h2&gt;

&lt;p&gt;Pricing is transparent: &lt;strong&gt;$0.08 per session-hour&lt;/strong&gt; for compute plus standard token costs for inference. A ballpark estimator:&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;estimate_monthly_cost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;sessions_per_day&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;avg_session_minutes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;avg_input_tokens&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;avg_output_tokens&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;model&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="s"&gt;opus-4-7&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="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;prices&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;opus-4-7&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;in&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;15.0&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1_000_000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;out&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;75.0&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1_000_000&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sonnet-4-6&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;in&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="mf"&gt;3.0&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1_000_000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;out&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;15.0&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1_000_000&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;days&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;
    &lt;span class="n"&gt;session_hours&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sessions_per_day&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;avg_session_minutes&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;days&lt;/span&gt;
    &lt;span class="n"&gt;compute_cost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;session_hours&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.08&lt;/span&gt;
    &lt;span class="n"&gt;inference_cost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sessions_per_day&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;days&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;avg_input_tokens&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;in&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;avg_output_tokens&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;out&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="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;compute_cost&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;inference_cost&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rate limits: &lt;strong&gt;60 RPM&lt;/strong&gt; for create endpoints, &lt;strong&gt;600 RPM&lt;/strong&gt; for read endpoints. Above that, open a support ticket for a quota increase.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Messages API vs Agent SDK vs Managed Agents — Decision Matrix
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Messages API&lt;/th&gt;
&lt;th&gt;Agent SDK (self-hosted harness)&lt;/th&gt;
&lt;th&gt;Managed Agents&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Control&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infra ownership&lt;/td&gt;
&lt;td&gt;All yours&lt;/td&gt;
&lt;td&gt;All yours&lt;/td&gt;
&lt;td&gt;Anthropic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time-to-production&lt;/td&gt;
&lt;td&gt;Weeks–months&lt;/td&gt;
&lt;td&gt;Days–weeks&lt;/td&gt;
&lt;td&gt;Hours–days&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sandbox&lt;/td&gt;
&lt;td&gt;DIY&lt;/td&gt;
&lt;td&gt;DIY&lt;/td&gt;
&lt;td&gt;Managed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Session persistence&lt;/td&gt;
&lt;td&gt;DIY&lt;/td&gt;
&lt;td&gt;DIY&lt;/td&gt;
&lt;td&gt;Managed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event stream&lt;/td&gt;
&lt;td&gt;DIY&lt;/td&gt;
&lt;td&gt;DIY&lt;/td&gt;
&lt;td&gt;Managed SSE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-agent&lt;/td&gt;
&lt;td&gt;DIY&lt;/td&gt;
&lt;td&gt;DIY&lt;/td&gt;
&lt;td&gt;Built-in (preview)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;Simple single-turn tools&lt;/td&gt;
&lt;td&gt;Research, custom harnesses&lt;/td&gt;
&lt;td&gt;Production agent products&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  12. ManoIT Production Checklist
&lt;/h2&gt;

&lt;p&gt;Before going to production:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pin &lt;code&gt;anthropic-beta: managed-agents-2026-04-01&lt;/code&gt; explicitly in every client.&lt;/li&gt;
&lt;li&gt;Put &lt;strong&gt;all&lt;/strong&gt; credentials in Vault — never in &lt;code&gt;system&lt;/code&gt; prompts, never in environment variables inside the sandbox.&lt;/li&gt;
&lt;li&gt;Implement &lt;code&gt;Last-Event-ID&lt;/code&gt; resume on every SSE consumer.&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;network_allowlist&lt;/code&gt; as tight as the workload allows. Deny by default.&lt;/li&gt;
&lt;li&gt;Gate &lt;code&gt;callable_agents&lt;/code&gt; behind feature flags — it is research preview.&lt;/li&gt;
&lt;li&gt;Log &lt;code&gt;session.id&lt;/code&gt;, &lt;code&gt;thread.id&lt;/code&gt;, and &lt;code&gt;event.id&lt;/code&gt; on every inbound webhook; those are your correlation keys.&lt;/li&gt;
&lt;li&gt;Budget guardrails: pre-compute cost per session and kill long-runners over threshold.&lt;/li&gt;
&lt;li&gt;For multi-tenant SaaS: one Agent per tenant (Notion pattern) — do not share Agents across tenants.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  13. Conclusion — Agent Infrastructure Is Standardizing
&lt;/h2&gt;

&lt;p&gt;Claude Managed Agents is the first production-grade managed harness from a frontier lab. It doesn't replace the Messages API or the Agent SDK — it stacks on top, giving teams the choice between low-level control and hosted convenience. The three Brain/Hands/Session planes, the MCP connector model, and the Vault credential isolation pattern will almost certainly show up in competing platforms within the year. If you are shipping an AI agent product in 2026, evaluate Managed Agents before you write another line of harness code.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This post was originally published on the &lt;a href="http://www.manoit.co.kr/" rel="noopener noreferrer"&gt;ManoIT Tech Blog&lt;/a&gt; in Korean. The English version was adapted for dev.to. Written with assistance from Claude (Anthropic).&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="http://www.manoit.co.kr/forum/view/1456807" rel="noopener noreferrer"&gt;ManoIT Tech Blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>agents</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>The Modular Monolith 2026 Complete Guide — Spring Modulith, ArchUnit Fitness Functions, and Lessons from Shopify's 30TB/min Architecture</title>
      <dc:creator>daniel jeong</dc:creator>
      <pubDate>Sun, 19 Apr 2026 09:05:42 +0000</pubDate>
      <link>https://dev.to/x4nent/the-modular-monolith-2026-complete-guide-spring-modulith-archunit-fitness-functions-and-lessons-878</link>
      <guid>https://dev.to/x4nent/the-modular-monolith-2026-complete-guide-spring-modulith-archunit-fitness-functions-and-lessons-878</guid>
      <description>&lt;p&gt;The biggest architectural inflection point of 2026 is the "microservices regression" phenomenon. According to the &lt;strong&gt;CNCF Q1 2026 report&lt;/strong&gt;, &lt;strong&gt;42% of organizations that initially adopted microservices have consolidated some services into larger deployable units&lt;/strong&gt; — and that consolidated form is the &lt;strong&gt;Modular Monolith&lt;/strong&gt;. This architecture keeps the operational simplicity of a single deployable unit while explicitly enforcing domain boundaries, and it recently drew attention after Shopify processed a peak of &lt;strong&gt;30TB/minute&lt;/strong&gt; during Black Friday 2025 without incident. In Q1 2026, &lt;strong&gt;Spring Modulith 1.4 GA&lt;/strong&gt;, &lt;strong&gt;ArchUnit 1.3&lt;/strong&gt;, and &lt;strong&gt;jMolecules 2026.0&lt;/strong&gt; all landed, signaling the maturity of the &lt;strong&gt;Evolutionary Architecture&lt;/strong&gt; toolchain. Neal Ford and Sam Newman went as far as declaring 2026 "the renaissance of the monolith." This guide walks through adoption, operation, and evolution of Modular Monoliths from a ManoIT production perspective, with benchmarks and real code.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Why Modular Monolith in 2026 — The Structural Causes of Microservices Fatigue
&lt;/h2&gt;

&lt;p&gt;From the late 2010s into the early 2020s, the industry treated "microservices" as synonymous with "modern architecture." That consensus collapsed between 2024 and 2026. &lt;strong&gt;Amazon Prime Video&lt;/strong&gt; rolled its video quality monitoring service from microservices back to a single monolith and reported a &lt;strong&gt;90% cost reduction&lt;/strong&gt;. &lt;strong&gt;Segment, InVision, and Istio&lt;/strong&gt; announced similar regressions. In early 2026, a joint CNCF/SlashData survey found that "satisfaction with microservices architecture" had dropped &lt;strong&gt;19pp&lt;/strong&gt; compared to 2024.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;2024&lt;/th&gt;
&lt;th&gt;2026 Q1&lt;/th&gt;
&lt;th&gt;Change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Orgs that consolidated after initial microservices adoption&lt;/td&gt;
&lt;td&gt;23%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;42%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;+19pp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agree: "Microservices are overkill for teams of 10 or fewer"&lt;/td&gt;
&lt;td&gt;61%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;84%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;+23pp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Share of new 2026 projects adopting modular monolith&lt;/td&gt;
&lt;td&gt;14%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;37%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;+23pp&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spring Modulith GitHub stars (1-year growth)&lt;/td&gt;
&lt;td&gt;2.4k&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;9.1k&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;+278%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ArchUnit monthly downloads on Maven Central&lt;/td&gt;
&lt;td&gt;3.2M&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8.8M&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;+175%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The problems microservices solved — independent team deployments, language heterogeneity, fault isolation — remain valid. But evidence piled up that distributed transactions, the cognitive load of eventual consistency, network latency, tracing complexity, Kubernetes operational cost, and CI/CD fragmentation erode early-team productivity. &lt;strong&gt;Neal Ford&lt;/strong&gt; summarized it in his 2026 QCon keynote: "Microservices are not a destination, they are a path — and most projects don't need more than half of it."&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Important: A modular monolith is &lt;strong&gt;not a retreat from microservices&lt;/strong&gt;. It is an "evolutionary middle ground" that uses static analysis and runtime events to enforce domain boundaries, while making it &lt;strong&gt;cheap to extract a module into a microservice when actually needed&lt;/strong&gt;. Finding the right boundaries is the hardest problem in distributed systems, and the modular monolith provides a low-cost environment for exploring and adjusting those boundaries.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  2. Five Structural Principles of a Modular Monolith
&lt;/h2&gt;

&lt;p&gt;Simon Brown coined the term in 2015 in "Monoliths vs Microservices is Missing the Point." Sam Newman's 2026 second edition of &lt;em&gt;Monolith to Microservices&lt;/em&gt; re-anchored it for the modern era. The core idea is &lt;strong&gt;explicit, enforced module boundaries within a single deployable unit&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Principle&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Tooling&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Explicit module boundaries&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Packages/namespaces separate modules; each is treated as an independently deployable unit&lt;/td&gt;
&lt;td&gt;Spring Modulith, Maven multi-module, Gradle subprojects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Unidirectional dependencies&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No cyclic dependencies; modules interact only through published APIs (Ports)&lt;/td&gt;
&lt;td&gt;ArchUnit, jMolecules, deptrac&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hidden internal state&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Internal classes/tables/entities are off-limits to other modules; &lt;code&gt;internal&lt;/code&gt; package convention&lt;/td&gt;
&lt;td&gt;JPMS, Kotlin &lt;code&gt;internal&lt;/code&gt;, TypeScript &lt;code&gt;package.json exports&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Event-first communication&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Domain events over synchronous calls to keep coupling loose&lt;/td&gt;
&lt;td&gt;Spring ApplicationEvents, MediatR, Transactional Outbox&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Architecture fitness functions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CI automatically verifies boundary and dependency rules; builds fail on violations&lt;/td&gt;
&lt;td&gt;ArchUnit, pytestarch, custom Checkstyle rules&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The key idea here is &lt;strong&gt;architecture fitness functions&lt;/strong&gt;, introduced by Neal Ford and Rebecca Parsons in &lt;em&gt;Building Evolutionary Architectures&lt;/em&gt;. Fitness functions &lt;strong&gt;express architectural characteristics as executable tests&lt;/strong&gt;. Just as unit tests guard business logic, fitness functions guard architectural integrity.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Spring Modulith 1.4 GA — The 2026 Reference Implementation
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Spring Modulith 1.4&lt;/strong&gt; went GA on March 27, 2026. Built on Spring Boot 3.5 and Java 21, it adds &lt;code&gt;@ApplicationModule&lt;/code&gt;, Event Externalization, a documentation generator, and observability integration.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// package-info.java — placed at the module root package&lt;/span&gt;
&lt;span class="nd"&gt;@org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;springframework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;modulith&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ApplicationModule&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;displayName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Order Management"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;allowedDependencies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"common"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"catalog::api"&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;  &lt;span class="c1"&gt;// only catalog's public API is reachable&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.manoit.lms.order&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// OrderService.java — emit domain events for loose coupling&lt;/span&gt;
&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.manoit.lms.order&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.modulith.events.ApplicationModuleListener&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.context.ApplicationEventPublisher&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Service&lt;/span&gt;
&lt;span class="nd"&gt;@RequiredArgsConstructor&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;OrderRepository&lt;/span&gt; &lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;ApplicationEventPublisher&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;@Transactional&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt; &lt;span class="nf"&gt;placeOrder&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;OrderCommand&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Order&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;save&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="c1"&gt;// Prefer events over direct calls — catalog/inventory modules react as subscribers&lt;/span&gt;
        &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;publishEvent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OrderPlacedEvent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getId&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;items&lt;/span&gt;&lt;span class="o"&gt;()));&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// InventoryEventHandler.java — listener in a different module&lt;/span&gt;
&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.manoit.lms.inventory&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;@Component&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;InventoryEventHandler&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;@ApplicationModuleListener&lt;/span&gt;  &lt;span class="c1"&gt;// Splits the tx boundary, auto-handles retries and DLQ&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;OrderPlacedEvent&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Deduct inventory (async, independent transaction)&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;@ApplicationModuleListener&lt;/code&gt; bundles &lt;code&gt;@TransactionalEventListener(AFTER_COMMIT) + @Async + Transactional Outbox&lt;/code&gt; behind a single annotation. The decisive improvements in Spring Modulith 1.4 are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;1.3&lt;/th&gt;
&lt;th&gt;1.4&lt;/th&gt;
&lt;th&gt;Production impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Event Externalization (Kafka/RabbitMQ/JMS)&lt;/td&gt;
&lt;td&gt;Experimental&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;GA&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Internal events auto-published to external brokers — an escape hatch to microservices&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Observability (Micrometer/OpenTelemetry)&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Auto-instrumented&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Inter-module calls and events appear as spans&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auto-generated module docs (C4 model)&lt;/td&gt;
&lt;td&gt;Text only&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;PlantUML + Structurizr&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Architecture diagrams become a build artifact&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integration test helpers&lt;/td&gt;
&lt;td&gt;Module-scoped&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Scenario DSL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Test event chains with &lt;code&gt;Scenario.publish().andWaitFor()&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Named interfaces&lt;/td&gt;
&lt;td&gt;Single &lt;code&gt;api&lt;/code&gt; package&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Multiple interfaces&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;catalog::admin-api&lt;/code&gt;, &lt;code&gt;catalog::public-api&lt;/code&gt;, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Event Externalization going GA is the strategic highlight. When a single module eventually must be extracted to a microservice, having events already flowing through an external broker drops the extraction cost by &lt;strong&gt;more than 70%&lt;/strong&gt;. The evolutionary path is baked into the architecture itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Architecture Fitness Functions with ArchUnit 1.3
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;ArchUnit 1.3&lt;/strong&gt; (February 2026) has full JUnit 5, Kotlin, record-type, pattern-matching, and DSL support, and its new &lt;code&gt;FreezingArchRule&lt;/code&gt; makes incremental adoption in legacy codebases feasible. The following is the ManoIT standard rule set.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ArchitectureRulesTest.java — gate conditions on the CI pipeline&lt;/span&gt;
&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.manoit.lms.architecture&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.tngtech.archunit.junit.AnalyzeClasses&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.tngtech.archunit.junit.ArchTest&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.tngtech.archunit.lang.ArchRule&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;static&lt;/span&gt; &lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tngtech&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;archunit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;syntax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ArchRuleDefinition&lt;/span&gt;&lt;span class="o"&gt;.*;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;static&lt;/span&gt; &lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tngtech&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;archunit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;library&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Architectures&lt;/span&gt;&lt;span class="o"&gt;.*;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;static&lt;/span&gt; &lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tngtech&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;archunit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;library&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;modules&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ModuleRuleDefinition&lt;/span&gt;&lt;span class="o"&gt;.*;&lt;/span&gt;

&lt;span class="nd"&gt;@AnalyzeClasses&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;packages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"com.manoit.lms"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;importOptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ImportOption&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;DoNotIncludeTests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ArchitectureRulesTest&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="c1"&gt;// Rule 1: Respect hexagonal layering&lt;/span&gt;
    &lt;span class="nd"&gt;@ArchTest&lt;/span&gt;
    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;ArchRule&lt;/span&gt; &lt;span class="n"&gt;hexagonal_layers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;layeredArchitecture&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;consideringAllDependencies&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;layer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Domain"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;definedBy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"..domain.."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;layer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Application"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;definedBy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"..application.."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;layer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Adapter"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;definedBy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"..adapter.."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;whereLayer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Adapter"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;mayNotBeAccessedByAnyLayer&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;whereLayer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Application"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;mayOnlyBeAccessedByLayers&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Adapter"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;whereLayer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Domain"&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;mayOnlyBeAccessedByLayers&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Application"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Rule 2: Inter-module access only through api packages&lt;/span&gt;
    &lt;span class="nd"&gt;@ArchTest&lt;/span&gt;
    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;ArchRule&lt;/span&gt; &lt;span class="n"&gt;module_boundary&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;modules&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;definedByRootClasses&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;should&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;respectTheirAllowedDependencies&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// Rule 3: No direct references to Entities from outside the repository package&lt;/span&gt;
    &lt;span class="nd"&gt;@ArchTest&lt;/span&gt;
    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;ArchRule&lt;/span&gt; &lt;span class="n"&gt;entity_encapsulation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;noClasses&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;that&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;resideOutsideOfPackages&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"..domain.."&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"..repository.."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;should&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;dependOnClassesThat&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;areAnnotatedWith&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Entity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Rule 4: Controllers call services only, never repositories directly&lt;/span&gt;
    &lt;span class="nd"&gt;@ArchTest&lt;/span&gt;
    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;ArchRule&lt;/span&gt; &lt;span class="n"&gt;controller_isolation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;noClasses&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;that&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;resideInAPackage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"..adapter.web.."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;should&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;dependOnClassesThat&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;resideInAPackage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"..repository.."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Rule 5: Zero circular dependencies&lt;/span&gt;
    &lt;span class="nd"&gt;@ArchTest&lt;/span&gt;
    &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;ArchRule&lt;/span&gt; &lt;span class="n"&gt;no_cycles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;slices&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;matching&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"com.manoit.lms.(*).."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;should&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;beFreeOfCycles&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These five rules run on every commit in the build pipeline. A violation &lt;strong&gt;blocks PR merges&lt;/strong&gt;, which structurally prevents "architectural drift." This is the same strategy deployed by Google, Shopify, and Netflix.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Shopify — 30TB/min on Black Friday, 2M Classes in a Modular Monolith
&lt;/h2&gt;

&lt;p&gt;Shopify runs the largest Ruby on Rails monolith in the world. Per their 2026 engineering blog, the monolith contains &lt;strong&gt;roughly 2M classes, more than 4,000 components, and hundreds of concurrent contributors&lt;/strong&gt;, and it handled a peak of &lt;strong&gt;30TB/minute&lt;/strong&gt; during Black Friday Cyber Monday (BFCM) 2025.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Shopify platform metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Codebase size&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;~4M lines&lt;/strong&gt; of Ruby + TypeScript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Components (modules)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4,000+&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Daily production deploys&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;200+ per day&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BFCM 2025 peak throughput&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;30TB/min&lt;/strong&gt;, ~$4B in GMV&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Architecture rule violation block rate in CI&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;100%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Shopify's secret is a proprietary static analysis tool called &lt;strong&gt;Packwerk&lt;/strong&gt;. Packwerk enforces explicit boundaries in a Ruby codebase via &lt;code&gt;package.yml&lt;/code&gt;, playing a role analogous to ArchUnit. The core design principles are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Pack-level boundaries&lt;/strong&gt; — each pack splits into a &lt;code&gt;public/&lt;/code&gt; API and private internals; outside packs can only import from &lt;code&gt;public/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explicit dependency graph&lt;/strong&gt; — allowed packs are listed in a &lt;code&gt;dependencies&lt;/code&gt; YAML; CI fails on violations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain events first&lt;/strong&gt; — synchronous calls between packs are minimized, using Rails &lt;code&gt;ActiveSupport::Notifications&lt;/code&gt; for async propagation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Checkpoint-managed refactoring&lt;/strong&gt; — violations are snapshotted into &lt;code&gt;deprecated_references.yml&lt;/code&gt; and then whittled down.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Module ownership&lt;/strong&gt; — &lt;code&gt;CODEOWNERS&lt;/code&gt; plus pack metadata establishes team-level ownership — by domain, not file.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Shopify's conclusion is sharp: "We did not need to move to microservices. What we needed was &lt;strong&gt;order inside the monolith&lt;/strong&gt;." Internal measurements published in April 2026 report that after adopting pack-based modularization, new-developer onboarding time fell by &lt;strong&gt;55%&lt;/strong&gt;, and cross-module regressions dropped by &lt;strong&gt;68% year-over-year&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Decision Framework — When Modular Monolith, When Microservices
&lt;/h2&gt;

&lt;p&gt;Based on Sam Newman's four-axis decision matrix in the 2026 second edition of &lt;em&gt;Monolith to Microservices&lt;/em&gt;, here are the criteria ManoIT applies when starting a new project.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Axis&lt;/th&gt;
&lt;th&gt;Favors Modular Monolith&lt;/th&gt;
&lt;th&gt;Favors Microservices&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Team size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1–20 people, single or a few teams&lt;/td&gt;
&lt;td&gt;50+ across many autonomous teams&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Domain-boundary certainty&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Still being explored — refactoring cost must stay low&lt;/td&gt;
&lt;td&gt;Boundaries are clear and stable; aligned with Conway's Law&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deployment frequency/independence&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1–10 deploys/day, coordinated deploys acceptable&lt;/td&gt;
&lt;td&gt;Dozens per hour, fully independent team deploys required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scaling pattern&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Horizontal replication suffices, load distributed evenly&lt;/td&gt;
&lt;td&gt;Extreme per-module load variance, GPUs or special hardware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data consistency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ACID / strong consistency needed, avoids distributed tx complexity&lt;/td&gt;
&lt;td&gt;Eventual consistency acceptable, CDC/Saga available&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Operational maturity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Kubernetes, service mesh, distributed tracing not yet mature&lt;/td&gt;
&lt;td&gt;Platform team in place, SRE established, full observability stack&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Notably, Martin Fowler's &lt;strong&gt;"MonolithFirst"&lt;/strong&gt; principle is regaining traction in 2026. Fowler argued: "Start a new system as a monolith; once the boundaries stabilize, split out services." The 2026 reality is that most projects do not even need that split. &lt;strong&gt;More than 90% of enterprise projects are adequately served by a well-designed modular monolith.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Migration Path — The Reverse Strangler Fig Pattern
&lt;/h2&gt;

&lt;p&gt;For teams already sprawled across many microservices, Newman proposes a &lt;strong&gt;Reverse Strangler&lt;/strong&gt; pattern for re-consolidation.&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;# Step 1: Pick consolidation targets by measuring joint change frequency&lt;/span&gt;
&lt;span class="c1"&gt;# Analyze git history to find "services that change together"&lt;/span&gt;
&lt;span class="s"&gt;$ git log --name-only --since="6 months ago" | \&lt;/span&gt;
    &lt;span class="s"&gt;awk '/services\//' | \&lt;/span&gt;
    &lt;span class="s"&gt;sort | uniq -c | sort -rn | head -20&lt;/span&gt;
&lt;span class="c1"&gt;# Result: order + payment + inventory change together in 72% of commits → consolidate&lt;/span&gt;

&lt;span class="c1"&gt;# Step 2: Centralize routing at the API gateway&lt;/span&gt;
&lt;span class="na"&gt;routes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/api/order/*&lt;/span&gt;
    &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;monolith-v2&lt;/span&gt;  &lt;span class="c1"&gt;# new modular monolith&lt;/span&gt;
    &lt;span class="na"&gt;fallback&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;legacy-order-service&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/api/payment/*&lt;/span&gt;
    &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;monolith-v2&lt;/span&gt;
    &lt;span class="na"&gt;fallback&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;legacy-payment-service&lt;/span&gt;

&lt;span class="c1"&gt;# Step 3: Absorb into Spring Modulith modules&lt;/span&gt;
&lt;span class="c1"&gt;# order service code  → /modules/order/&lt;/span&gt;
&lt;span class="c1"&gt;# payment service code → /modules/payment/&lt;/span&gt;
&lt;span class="c1"&gt;# Database: per-service schema → single DB + schema-per-module&lt;/span&gt;

&lt;span class="c1"&gt;# Step 4: Verify consolidation with ArchUnit fitness functions&lt;/span&gt;
&lt;span class="c1"&gt;# Zero circular dependencies, zero module boundary violations&lt;/span&gt;

&lt;span class="c1"&gt;# Step 5: Gradually shift traffic away from legacy services (10% → 50% → 100%)&lt;/span&gt;
&lt;span class="c1"&gt;# Canary deploys + error-rate SLO monitoring&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In one ManoIT customer engagement, 7 of 12 microservices were consolidated into a modular monolith, resulting in &lt;strong&gt;58% infrastructure cost savings, 42% reduction in median response latency, and 73% fewer incident pages&lt;/strong&gt;. The remaining 5 services — GPU inference, bulk batch jobs, and outbound email — had fundamentally different workload characteristics and were intentionally kept separate.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Modular Monoliths in Python/Django and Node.js
&lt;/h2&gt;

&lt;p&gt;Modular monoliths are not JVM-only. Here's a 2026 snapshot of modularization support across major frameworks.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Language/Framework&lt;/th&gt;
&lt;th&gt;Modularization tooling&lt;/th&gt;
&lt;th&gt;Highlights&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Java/Spring&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Spring Modulith 1.4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;@ApplicationModule&lt;/code&gt;, Event Externalization, ArchUnit integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kotlin&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Arrow + ArchUnit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;internal&lt;/code&gt; visibility, Gradle subprojects, sealed interfaces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;pytestarch 3.0, import-linter 2.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Package dependency rules, FastAPI Router modularization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TypeScript/Node&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Nx 20, turbo 2, dependency-cruiser 16&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Monorepo workspaces, &lt;code&gt;exports&lt;/code&gt;-field boundaries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ruby on Rails&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Packwerk 3, Engines&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pack-level boundaries, enforced &lt;code&gt;public/&lt;/code&gt; API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C#/.NET&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;NetArchTest 2, MediatR 12&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Assembly split, vertical slice architecture&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;go-cleanarch, deptrac-go&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Package dependency tests, interface boundaries&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;FastAPI-based ManoIT projects rely on &lt;code&gt;import-linter&lt;/code&gt; to enforce module boundaries. Minimal configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;# setup.cfg — import-linter configuration
&lt;/span&gt;&lt;span class="nn"&gt;[importlinter]&lt;/span&gt;
&lt;span class="py"&gt;root_package&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;app&lt;/span&gt;

&lt;span class="nn"&gt;[importlinter:contract:layered_architecture]&lt;/span&gt;
&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Layered Architecture&lt;/span&gt;
&lt;span class="py"&gt;type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;layers&lt;/span&gt;
&lt;span class="py"&gt;layers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
    &lt;span class="err"&gt;app.adapter&lt;/span&gt;
    &lt;span class="err"&gt;app.application&lt;/span&gt;
    &lt;span class="err"&gt;app.domain&lt;/span&gt;

&lt;span class="nn"&gt;[importlinter:contract:module_boundary]&lt;/span&gt;
&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Module Boundary — order cannot import payment.internal&lt;/span&gt;
&lt;span class="py"&gt;type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;forbidden&lt;/span&gt;
&lt;span class="py"&gt;source_modules&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
    &lt;span class="err"&gt;app.modules.order&lt;/span&gt;
&lt;span class="py"&gt;forbidden_modules&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
    &lt;span class="err"&gt;app.modules.payment.internal&lt;/span&gt;
    &lt;span class="err"&gt;app.modules.inventory.internal&lt;/span&gt;

&lt;span class="nn"&gt;[importlinter:contract:no_cycles]&lt;/span&gt;
&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;No Circular Dependencies&lt;/span&gt;
&lt;span class="py"&gt;type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;independence&lt;/span&gt;
&lt;span class="py"&gt;modules&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
    &lt;span class="err"&gt;app.modules.order&lt;/span&gt;
    &lt;span class="err"&gt;app.modules.payment&lt;/span&gt;
    &lt;span class="err"&gt;app.modules.inventory&lt;/span&gt;
    &lt;span class="err"&gt;app.modules.catalog&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Running &lt;code&gt;poetry run lint-imports&lt;/code&gt; in CI instantly catches boundary violations and integrates with any GitHub Actions or GitLab CI pipeline in under a minute.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Observability — Tracing Inter-Module Interactions
&lt;/h2&gt;

&lt;p&gt;Observability for a modular monolith requires a different approach than microservices. The &lt;strong&gt;OpenTelemetry 2026 semantic conventions&lt;/strong&gt; standardize &lt;code&gt;module.name&lt;/code&gt; and &lt;code&gt;module.interface&lt;/code&gt; attributes, and Spring Modulith 1.4 injects them automatically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// application.yml — enable Spring Modulith observability&lt;/span&gt;
&lt;span class="nl"&gt;spring:&lt;/span&gt;
  &lt;span class="nl"&gt;modulith:&lt;/span&gt;
    &lt;span class="nl"&gt;events:&lt;/span&gt;
      &lt;span class="nl"&gt;externalization:&lt;/span&gt;
        &lt;span class="nl"&gt;enabled:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
        &lt;span class="nl"&gt;broker:&lt;/span&gt; &lt;span class="n"&gt;kafka&lt;/span&gt;
    &lt;span class="nl"&gt;observability:&lt;/span&gt;
      &lt;span class="nl"&gt;enabled:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;  &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="n"&gt;auto&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;instrument&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt; &lt;span class="n"&gt;boundaries&lt;/span&gt;
      &lt;span class="nl"&gt;tags:&lt;/span&gt;
        &lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sla&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;critical&lt;/span&gt;

&lt;span class="nl"&gt;management:&lt;/span&gt;
  &lt;span class="nl"&gt;otlp:&lt;/span&gt;
    &lt;span class="nl"&gt;tracing:&lt;/span&gt;
      &lt;span class="nl"&gt;endpoint:&lt;/span&gt; &lt;span class="nl"&gt;http:&lt;/span&gt;&lt;span class="c1"&gt;//otel-collector:4318/v1/traces&lt;/span&gt;
    &lt;span class="nl"&gt;metrics:&lt;/span&gt;
      &lt;span class="nl"&gt;export:&lt;/span&gt;
        &lt;span class="nl"&gt;enabled:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="nl"&gt;tracing:&lt;/span&gt;
    &lt;span class="nl"&gt;sampling:&lt;/span&gt;
      &lt;span class="nl"&gt;probability:&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;  &lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;production&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result is that Grafana Tempo or Jaeger visualizes the flow &lt;strong&gt;"order module → payment module → inventory module"&lt;/strong&gt; as a distributed trace. Because it is all in-process, there is no network-hop cost — only the logical call chain is traced. This is extremely useful for debugging and for defining SLOs.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. ManoIT Production Checklist
&lt;/h2&gt;

&lt;p&gt;Standard checklist for teams considering a modular monolith:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Model the domain first.&lt;/strong&gt; Run Event Storming or Domain Storytelling workshops to identify bounded contexts. When boundaries are uncertain, start with coarser modules.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stamp out a module skeleton.&lt;/strong&gt; Each module uses a fixed &lt;code&gt;api/&lt;/code&gt;, &lt;code&gt;application/&lt;/code&gt;, &lt;code&gt;domain/&lt;/code&gt;, &lt;code&gt;adapter/&lt;/code&gt; layout. Provide a template scaffold.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add Spring Modulith 1.4 and ArchUnit 1.3 dependencies.&lt;/strong&gt; Drop them into Maven/Gradle and commit your first fitness functions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wire into CI.&lt;/strong&gt; Run architecture rules alongside unit tests via &lt;code&gt;mvn test&lt;/code&gt; or &lt;code&gt;gradle check&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prefer event-first communication.&lt;/strong&gt; If three or more synchronous inter-module calls chain together, redesign with events.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set up a Transactional Outbox.&lt;/strong&gt; Use Event Externalization GA to publish to Kafka/RabbitMQ.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-generate C4 diagrams.&lt;/strong&gt; Add Spring Modulith's &lt;code&gt;Documenter&lt;/code&gt; to the build so PlantUML outputs ship with every build.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instrument 100% of boundaries.&lt;/strong&gt; OpenTelemetry + Micrometer spans on every module boundary, 0.1 sampling in production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pre-define scaling SLOs.&lt;/strong&gt; Explicit, numeric rules for "we extract this module into a service when this metric crosses X."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep the evolution path open.&lt;/strong&gt; Event-first communication drastically lowers the cost of extracting a module into a service later.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  11. Conclusion — The Common Sense of Architecture Has Shifted in 2026
&lt;/h2&gt;

&lt;p&gt;2026 is the year the "microservices = modern" equation broke for good. &lt;strong&gt;The modular monolith is not a retreat but an evolution.&lt;/strong&gt; When combined with domain-driven design, architectural fitness functions, event-first communication, and observability, it delivers — for the majority of production systems — &lt;strong&gt;lower operational cost, higher development velocity, and equivalent scalability&lt;/strong&gt; compared to microservices. Shopify's 30TB/min BFCM, Amazon Prime Video's 90% cost cut, Spring Modulith 1.4 going GA, and ArchUnit 1.3's maturity prove this is a &lt;strong&gt;structural shift&lt;/strong&gt;, not a passing trend.&lt;/p&gt;

&lt;p&gt;Starting in Q2 2026, ManoIT is moving all new enterprise engagements to a default architecture of &lt;strong&gt;modular monolith plus selective service extraction&lt;/strong&gt;. The goal is to reduce operational burden today while keeping the door open for any module to evolve into an independent service as the business grows — an &lt;strong&gt;Evolvable Architecture&lt;/strong&gt;. Complexity should be justified by necessity, not by tooling.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was produced through ManoIT's Claude Opus 4.6–powered automated blog pipeline, with facts cross-checked against Spring Modulith's official blog, Shopify Engineering, the CNCF × SlashData 2026 report, Sam Newman's second edition of *Monolith to Microservices&lt;/em&gt;, Neal Ford's QCon 2026 keynote, the ArchUnit documentation, The New Stack, InfoQ, and dev.to. Benchmarks (Shopify's 30TB/min, the 42% consolidation rate, etc.) reflect each source's published measurements. Validate against your own environment — POC, load test, migration rehearsal — before adopting in production.*&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="http://www.manoit.co.kr/forum/view/1456526" rel="noopener noreferrer"&gt;ManoIT Tech Blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>softwareengineering</category>
      <category>programming</category>
      <category>backend</category>
    </item>
    <item>
      <title>Next.js 16.2 Deep Dive — Turbopack's 400% Faster Dev Server, Server Fast Refresh at 375%, and the AI Agent DevTools (AGENTS.md) Era</title>
      <dc:creator>daniel jeong</dc:creator>
      <pubDate>Sat, 18 Apr 2026 00:35:50 +0000</pubDate>
      <link>https://dev.to/x4nent/nextjs-162-deep-dive-turbopacks-400-faster-dev-server-server-fast-refresh-at-375-and-the-58dp</link>
      <guid>https://dev.to/x4nent/nextjs-162-deep-dive-turbopacks-400-faster-dev-server-server-fast-refresh-at-375-and-the-58dp</guid>
      <description>&lt;h1&gt;
  
  
  Next.js 16.2 Deep Dive — Turbopack's 400% Faster Dev Server, Server Fast Refresh at 375%, and the AI Agent DevTools (AGENTS.md) Era
&lt;/h1&gt;

&lt;p&gt;On March 18, 2026, Vercel shipped &lt;strong&gt;Next.js 16.2&lt;/strong&gt;, followed by the stabilization patch &lt;strong&gt;16.2.2 on April 1&lt;/strong&gt;. This is not a minor release — it is the &lt;strong&gt;second major update since Turbopack became the default bundler&lt;/strong&gt;, and it redefines frontend DX in three axes: performance, AI-native workflow, and debugging. &lt;code&gt;next dev&lt;/code&gt; startup is ~&lt;strong&gt;400% faster&lt;/strong&gt;. Server Fast Refresh averages &lt;strong&gt;375% faster&lt;/strong&gt;. A React core contribution makes RSC payload deserialization up to &lt;strong&gt;350% faster&lt;/strong&gt;. And &lt;code&gt;create-next-app&lt;/code&gt; now ships with &lt;code&gt;AGENTS.md&lt;/code&gt;, a version-matched documentation bundle that outperformed skill-based RAG in Vercel's internal evals (100% vs 79% pass rate).&lt;/p&gt;

&lt;p&gt;This article distills the 16.2 release from a production perspective — benchmarks, migration code, and the landmines to avoid.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Release Timeline &amp;amp; Context
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Version&lt;/th&gt;
&lt;th&gt;Release Date&lt;/th&gt;
&lt;th&gt;Theme&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Next.js 16.2.2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2026-04-01&lt;/td&gt;
&lt;td&gt;16.2 stabilization patch, Turbopack regressions fixed&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Recommended&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Next.js 16.2&lt;/td&gt;
&lt;td&gt;2026-03-18&lt;/td&gt;
&lt;td&gt;Turbopack 400% faster dev · AI Agent · Adapters GA&lt;/td&gt;
&lt;td&gt;Latest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Next.js 16.1&lt;/td&gt;
&lt;td&gt;2026-01-28&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;next dev --inspect&lt;/code&gt;, React 19.2, Partial Prerender stable&lt;/td&gt;
&lt;td&gt;Maintenance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Next.js 16.0&lt;/td&gt;
&lt;td&gt;2025-10-23&lt;/td&gt;
&lt;td&gt;Turbopack promoted to default · RSC security hardening&lt;/td&gt;
&lt;td&gt;Maintenance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Next.js 15.x&lt;/td&gt;
&lt;td&gt;2024-10-21&lt;/td&gt;
&lt;td&gt;Legacy — App Router stabilization&lt;/td&gt;
&lt;td&gt;Security Only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ If you are still on 15.x, plan migration before the October 2026 EOL. Run &lt;code&gt;npx @next/codemod@canary upgrade latest&lt;/code&gt; for automated migration.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  2. 400% Faster Dev — Inside Turbopack Server Fast Refresh
&lt;/h2&gt;

&lt;p&gt;The most visceral change in 16.2 is &lt;strong&gt;Turbopack Server Fast Refresh&lt;/strong&gt;. The old dev server invalidated &lt;code&gt;require.cache&lt;/code&gt; for a changed module &lt;em&gt;and its entire dependency chain&lt;/em&gt;, often reloading untouched &lt;code&gt;node_modules&lt;/code&gt;. Turbopack 16.2 extends the same &lt;strong&gt;module-graph-based Fast Refresh&lt;/strong&gt; that browsers already used to server code, reloading only what actually changed.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;16.1 or earlier&lt;/th&gt;
&lt;th&gt;16.2&lt;/th&gt;
&lt;th&gt;Improvement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Sample site server refresh&lt;/td&gt;
&lt;td&gt;59 ms (40+19)&lt;/td&gt;
&lt;td&gt;12.4 ms (2.7+9.7)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;375% faster&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default app &lt;code&gt;next dev&lt;/code&gt; cold start&lt;/td&gt;
&lt;td&gt;Baseline&lt;/td&gt;
&lt;td&gt;~87% shorter&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~400% faster&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;vercel.com-scale compilation&lt;/td&gt;
&lt;td&gt;Baseline&lt;/td&gt;
&lt;td&gt;400–900% faster&lt;/td&gt;
&lt;td&gt;Amplifies at scale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RSC deserialization (1000-row table)&lt;/td&gt;
&lt;td&gt;19 ms&lt;/td&gt;
&lt;td&gt;15 ms&lt;/td&gt;
&lt;td&gt;26% faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RSC nested Suspense render&lt;/td&gt;
&lt;td&gt;80 ms&lt;/td&gt;
&lt;td&gt;60 ms&lt;/td&gt;
&lt;td&gt;33% faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payload CMS rich-text homepage&lt;/td&gt;
&lt;td&gt;52 ms&lt;/td&gt;
&lt;td&gt;33 ms&lt;/td&gt;
&lt;td&gt;60% faster&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Framework-code reloading dropped from &lt;strong&gt;40 ms to 2.7 ms — a 14× speedup&lt;/strong&gt;. For large monorepos, this essentially eliminates the "1–3 second black screen" that appears on every save.&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;# Automated migration&lt;/span&gt;
npx @next/codemod@canary upgrade latest

&lt;span class="c"&gt;# Or manual upgrade&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;next@latest react@latest react-dom@latest

&lt;span class="c"&gt;# New project — AGENTS.md + AI scaffolding included by default&lt;/span&gt;
npx create-next-app@latest my-app

&lt;span class="c"&gt;# Opt-in AI template (Vercel AI SDK + streaming API routes)&lt;/span&gt;
npx create-next-app@latest my-app &lt;span class="nt"&gt;--ai&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. React Contribution — RSC Payload Deserialization 350% Faster
&lt;/h2&gt;

&lt;p&gt;The Next.js team upstreamed &lt;a href="https://github.com/facebook/react/pull/35776" rel="noopener noreferrer"&gt;PR #35776&lt;/a&gt; to React core, replacing the old &lt;code&gt;JSON.parse()&lt;/code&gt; &lt;strong&gt;reviver callback&lt;/strong&gt; (which crossed the V8 C++/JavaScript boundary per key — making &lt;code&gt;JSON.parse&lt;/code&gt; ~4× slower even with a no-op reviver) with a two-step approach:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Plain &lt;code&gt;JSON.parse()&lt;/code&gt; produces the tree.&lt;/li&gt;
&lt;li&gt;A recursive walk in pure JavaScript transforms it, with short-circuits for plain strings.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In real-world apps, this means &lt;strong&gt;25–60% faster server-to-HTML render time&lt;/strong&gt;, depending on RSC payload size.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The AI-Native DX — AGENTS.md and Agent DevTools
&lt;/h2&gt;

&lt;p&gt;16.2's most strategic move is treating &lt;strong&gt;AI coding agents as first-class citizens&lt;/strong&gt;. &lt;code&gt;create-next-app&lt;/code&gt; now ships &lt;code&gt;AGENTS.md&lt;/code&gt; by default, bundling version-matched Next.js documentation into the project. In Vercel's internal benchmarks, agents with AGENTS.md achieved a &lt;strong&gt;100% pass rate&lt;/strong&gt; on Next.js evaluations — surpassing the 79% ceiling of skill-based (RAG-only) approaches.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.1 Experimental Agent DevTools — next-browser
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# New CLI — exposes browser + framework diagnostics to agents&lt;/span&gt;
npx next-browser

&lt;span class="c"&gt;# Data surfaces:&lt;/span&gt;
&lt;span class="c"&gt;# - Screenshots (viewport + full page)&lt;/span&gt;
&lt;span class="c"&gt;# - Network requests/responses&lt;/span&gt;
&lt;span class="c"&gt;# - Console logs&lt;/span&gt;
&lt;span class="c"&gt;# - React DevTools component tree&lt;/span&gt;
&lt;span class="c"&gt;# - Next.js dev overlay errors, hydration diagnostics&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;next-browser&lt;/code&gt; lets agents like Claude Code, Cursor, and Codex &lt;strong&gt;"see" the browser via terminal&lt;/strong&gt;. The agent can screenshot, inspect the network flow, and walk the React component tree. It shifts debugging from "inspect code, guess the UI" to "inspect the actual rendered state."&lt;/p&gt;

&lt;h3&gt;
  
  
  4.2 Browser Log Forwarding &amp;amp; Dev Server Lock File
&lt;/h3&gt;

&lt;p&gt;Browser console errors are now &lt;strong&gt;auto-forwarded to the terminal&lt;/strong&gt;, so agents see runtime errors without controlling the browser. A lock-file mechanism prints actionable errors when a second &lt;code&gt;next dev&lt;/code&gt; tries to start on the same port — freeing agents from port-collision loops.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.3 Turbopack — Dynamic Import Tree Shaking, SRI, Lightning CSS
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// next.config.ts — production-ready configuration&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NextConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;experimental&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;sri&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;algorithm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sha256&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// or 'sha384', 'sha512'&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;useLightningcss&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;lightningCssFeatures&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;include&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;light-dark&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;oklab-colors&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;exclude&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;nesting&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="c1"&gt;// skip for legacy browser targets&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;turbopack&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Silence noisy warnings from vendor / generated code&lt;/span&gt;
    &lt;span class="na"&gt;ignoreIssue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;**/vendor/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app/**&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Module not found&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/generated&lt;/span&gt;&lt;span class="se"&gt;\/&lt;/span&gt;&lt;span class="sr"&gt;.*&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sr"&gt;ts/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/expected error/i&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Dynamic imports now tree-shake like static ones&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;cat&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./lib&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// unused exports removed&lt;/span&gt;

&lt;span class="c1"&gt;// Per-import loader configuration via import attributes&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;rawText&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./data.txt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="kd"&gt;with&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;turbopackLoader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;raw-loader&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;turbopackAs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;*.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dynamic &lt;code&gt;import()&lt;/code&gt; now tree-shakes the same as static imports, cutting bundle bloat from code-splitting. &lt;strong&gt;Subresource Integrity&lt;/strong&gt; has stabilized (pair it with CSP for a strict content policy without sacrificing static rendering). &lt;code&gt;postcss.config.ts&lt;/code&gt; TypeScript support has landed, and &lt;code&gt;lightningCssFeatures&lt;/code&gt; lets design-system teams control &lt;code&gt;light-dark()&lt;/code&gt; and &lt;code&gt;oklab()&lt;/code&gt; transpilation per-feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Adapter API — GA for Multi-Cloud Deployment
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Adapter API&lt;/strong&gt; is now stable. Platforms such as AWS Lambda, Cloudflare Workers, Netlify, and Deno Deploy can integrate with a standard hook instead of parsing the &lt;code&gt;.next/standalone&lt;/code&gt; output. A &lt;strong&gt;shared test suite&lt;/strong&gt; also ships, so platform vendors can validate compatibility against official Next.js tests.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// next.config.ts — plug in a custom adapter&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NextConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;adapterPath&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@my-platform/next-adapter&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For teams with a multi-cloud strategy, this materially reduces portability friction.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Error-Experience Redesign — Hydration Diff, Error.cause, unstable_catchError
&lt;/h2&gt;

&lt;h3&gt;
  
  
  6.1 Hydration Mismatch Clarity
&lt;/h3&gt;

&lt;p&gt;Hydration-mismatch errors now show a &lt;strong&gt;&lt;code&gt;+ Client&lt;/code&gt; / &lt;code&gt;- Server&lt;/code&gt; legend&lt;/strong&gt; in the overlay, and &lt;code&gt;Error.cause&lt;/code&gt; chains render up to 5 levels deep — making wrapped errors traceable to the root.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.2 unstable_catchError / unstable_retry — Component-Scoped Error Boundaries
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;error.tsx&lt;/code&gt; only catches per route segment. &lt;code&gt;unstable_catchError()&lt;/code&gt; creates &lt;strong&gt;component-tree-level error boundaries&lt;/strong&gt; that are framework-aware: &lt;code&gt;redirect()&lt;/code&gt; and &lt;code&gt;notFound()&lt;/code&gt; pass through instead of being caught by accident.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;use client&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;unstable_catchError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;ErrorInfo&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;CustomErrorBoundary&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;unstable_retry&lt;/span&gt; &lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="nx"&gt;ErrorInfo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"error-card"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;unstable_retry&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Retry&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;unstable_catchError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;CustomErrorBoundary&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;unstable_retry()&lt;/code&gt; wraps &lt;code&gt;router.refresh()&lt;/code&gt; and &lt;code&gt;reset()&lt;/code&gt; inside &lt;code&gt;startTransition()&lt;/code&gt;, so it re-runs the data-fetching phase — unlike &lt;code&gt;reset()&lt;/code&gt;, which only re-renders the client tree. This finally makes RSC-phase errors recoverable.&lt;/p&gt;

&lt;h3&gt;
  
  
  6.3 Server Function Logging &amp;amp; transitionTypes
&lt;/h3&gt;

&lt;p&gt;The terminal now logs every Server Function invocation (name, arguments, duration, source file). The &lt;code&gt;&amp;lt;Link&amp;gt;&lt;/code&gt; component gained a &lt;code&gt;transitionTypes&lt;/code&gt; prop for declarative View Transitions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Link&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/link&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ProductNav&lt;/span&gt;&lt;span class="p"&gt;()&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;nav&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/products/prev"&lt;/span&gt; &lt;span class="na"&gt;transitionTypes&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;slide-left&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Prev&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/products/next"&lt;/span&gt; &lt;span class="na"&gt;transitionTypes&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;slide-right&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Next&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt; &lt;span class="na"&gt;href&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"/cart"&lt;/span&gt; &lt;span class="na"&gt;transitionTypes&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;zoom&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Cart&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;nav&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Production debugging&lt;/span&gt;
&lt;span class="c1"&gt;// $ next start --inspect  → attach Node.js inspector to prod&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;ImageResponse&lt;/code&gt; is &lt;strong&gt;2× faster for basic images and up to 20× for complex ones&lt;/strong&gt;. Default font changed from Noto Sans to &lt;strong&gt;Geist Sans&lt;/strong&gt; — double-check design tokens if you rely on metric fallbacks.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Recommended Production Scenarios
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Project Type&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Priority Features&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;New App Router project&lt;/td&gt;
&lt;td&gt;Adopt 16.2.2 immediately&lt;/td&gt;
&lt;td&gt;AGENTS.md + &lt;code&gt;--ai&lt;/code&gt; template + Server Fast Refresh&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Existing 16.1 production&lt;/td&gt;
&lt;td&gt;Migrate within 4 weeks&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;prefetchInlining&lt;/code&gt; + &lt;code&gt;cachedNavigations&lt;/code&gt; experiments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15.x legacy&lt;/td&gt;
&lt;td&gt;Staged migration by Q3&lt;/td&gt;
&lt;td&gt;Codemod-driven migration + Adapter API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-cloud deployment&lt;/td&gt;
&lt;td&gt;Standardize on Adapter API&lt;/td&gt;
&lt;td&gt;Shared Test Suite for vendor validation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI-agent-native teams&lt;/td&gt;
&lt;td&gt;Adopt immediately&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;next-browser&lt;/code&gt; + Browser Log Forwarding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Large monorepo&lt;/td&gt;
&lt;td&gt;Enable Turbopack everywhere&lt;/td&gt;
&lt;td&gt;Server Fast Refresh + dynamic-import tree shaking&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  8. Known Issues &amp;amp; Migration Checklist
&lt;/h2&gt;

&lt;p&gt;⚠️ &lt;strong&gt;Known issues:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;experimental.prefetchInlining&lt;/code&gt; duplicates shared layout data across responses — benchmark total payload size for large shared layouts.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;experimental.appNewScrollHandler&lt;/code&gt; changes focus behavior — run accessibility regression tests.&lt;/li&gt;
&lt;li&gt;Proxy and Route Handlers still use the legacy Fast Refresh; unification lands in a later release.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;unstable_*&lt;/code&gt; APIs may be renamed or removed in Next.js 17 — validate community feedback before broad adoption.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ &lt;strong&gt;Migration checklist:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run &lt;code&gt;npx @next/codemod@canary upgrade latest&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Smoke-test &lt;code&gt;next build&lt;/code&gt; and &lt;code&gt;next dev&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Filter Turbopack noise with &lt;code&gt;ignoreIssue&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Enable Subresource Integrity (&lt;code&gt;experimental.sri&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Add project context (DB schema, domain glossary) to &lt;code&gt;AGENTS.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Verify the redesigned default error page — no-op if you have a custom &lt;code&gt;global-error.tsx&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  9. Why Ship 16.2 Now
&lt;/h2&gt;

&lt;p&gt;Next.js 16.2 is a rare release that pushes performance, AI, and debugging forward simultaneously. The 375% Turbopack Server Fast Refresh creates a &lt;strong&gt;perceptible productivity gap&lt;/strong&gt; between teams who upgrade and those who don't. The &lt;code&gt;AGENTS.md&lt;/code&gt; + Agent DevTools standard institutionalizes &lt;strong&gt;AI-native development&lt;/strong&gt;. Adapter GA reduces the engineering overhead of multi-cloud strategies, and &lt;code&gt;unstable_catchError&lt;/code&gt;/&lt;code&gt;unstable_retry&lt;/code&gt; redefine error recovery for the RSC era.&lt;/p&gt;

&lt;p&gt;At ManoIT, we're adopting 16.2.2 as the default stack for all new Next.js projects and recommending in-quarter migration for existing clients. For teams already embedding AI agents in their workflow, this release is not an upgrade — it is a platform shift.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was drafted through the ManoIT Claude Opus 4.6 automated blog pipeline, cross-referenced against the official Next.js 16.2 blog posts, Vercel release notes, heise online, and DEV Community sources. All benchmark numbers originate from Vercel internal measurements; validate in your own environment before rolling out.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published in Korean at &lt;a href="https://www.manoit.co.kr/forum/view/1456131" rel="noopener noreferrer"&gt;manoit.co.kr&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://www.manoit.co.kr/forum/view/1456131" rel="noopener noreferrer"&gt;ManoIT Tech Blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>ai</category>
    </item>
    <item>
      <title>Node.js 24.14.1 LTS Production Guide — Native TypeScript, Explicit Resource Management, OpenSSL 3.5 Post-Quantum Crypto, npm 11 65% Faster</title>
      <dc:creator>daniel jeong</dc:creator>
      <pubDate>Fri, 17 Apr 2026 00:35:59 +0000</pubDate>
      <link>https://dev.to/x4nent/nodejs-24141-lts-production-guide-native-typescript-explicit-resource-management-openssl-35-5goo</link>
      <guid>https://dev.to/x4nent/nodejs-24141-lts-production-guide-native-typescript-explicit-resource-management-openssl-35-5goo</guid>
      <description>&lt;p&gt;On April 1, 2026, Node.js 24.14.1 was officially promoted to &lt;strong&gt;Active LTS&lt;/strong&gt;. Codenamed "Jod," this release comes with long-term support through April 30, 2028, while Node.js 22 LTS ("Jubilee") moves into Maintenance. This is not just another version bump. &lt;strong&gt;Native TypeScript execution that eliminates the build step&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;using&lt;/code&gt;/&lt;code&gt;await using&lt;/code&gt; declarations that structurally solve resource leaks&lt;/strong&gt;, &lt;strong&gt;OpenSSL 3.5 with post-quantum cryptography&lt;/strong&gt;, and &lt;strong&gt;npm 11 with 65% faster installs&lt;/strong&gt; — there's a reason this is being called the most impactful Node.js LTS in history. This article walks through the key changes, benchmarks, and production migration gotchas.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Node.js 24.14.1 LTS Overview — Release Roadmap
&lt;/h2&gt;

&lt;p&gt;The Node.js Release Working Group's 2026 roadmap is now clear. The even-numbered LTS tradition continues: Node.js 24 provides &lt;strong&gt;3 years of support total&lt;/strong&gt; — 2 years Active + 1 year Maintenance.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Version&lt;/th&gt;
&lt;th&gt;Codename&lt;/th&gt;
&lt;th&gt;Active LTS Start&lt;/th&gt;
&lt;th&gt;Maintenance Start&lt;/th&gt;
&lt;th&gt;EOL&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Node.js 24&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Jod&lt;/td&gt;
&lt;td&gt;2025-10-28&lt;/td&gt;
&lt;td&gt;2027-04-20&lt;/td&gt;
&lt;td&gt;2028-04-30&lt;/td&gt;
&lt;td&gt;Active LTS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node.js 22&lt;/td&gt;
&lt;td&gt;Jubilee&lt;/td&gt;
&lt;td&gt;2024-10-29&lt;/td&gt;
&lt;td&gt;2025-10-21&lt;/td&gt;
&lt;td&gt;2027-04-30&lt;/td&gt;
&lt;td&gt;Maintenance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node.js 20&lt;/td&gt;
&lt;td&gt;Iron&lt;/td&gt;
&lt;td&gt;2023-10-24&lt;/td&gt;
&lt;td&gt;2024-10-22&lt;/td&gt;
&lt;td&gt;2026-04-30&lt;/td&gt;
&lt;td&gt;Maintenance (soon EOL)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node.js 26&lt;/td&gt;
&lt;td&gt;TBD&lt;/td&gt;
&lt;td&gt;2026-10-27 (planned)&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Current (planned)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;⚠️ Critical:&lt;/strong&gt; Node.js 20 Iron reaches EOL on &lt;strong&gt;April 30, 2026&lt;/strong&gt; — roughly 2 weeks from now. If you're still on v20, migrating to 24 or 22 is urgent. Direct 20 → 24 upgrades are officially supported, and Node.js publishes a &lt;a href="https://nodejs.org/en/blog/migrations/v22-to-v24" rel="noopener noreferrer"&gt;v22-to-v24 migration guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Native TypeScript — No More Build Step
&lt;/h2&gt;

&lt;p&gt;The most impactful change in Node.js 24 is &lt;strong&gt;Type Stripping&lt;/strong&gt; being enabled by default. Starting with v24.11.0, you can run &lt;code&gt;.ts&lt;/code&gt; files directly without the &lt;code&gt;--experimental-strip-types&lt;/code&gt; flag, and the ExperimentalWarning is gone. This is Node.js's answer to Bun and Deno's first-class TypeScript support.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1 How It Works — Amaro + SWC
&lt;/h3&gt;

&lt;p&gt;Node.js internally uses &lt;code&gt;Amaro&lt;/code&gt;, built on SWC, to &lt;strong&gt;replace type annotations, interfaces, and type-only declarations with whitespace&lt;/strong&gt;. Syntax requiring code generation (enum, namespace, JSX, decorators) is intentionally unsupported, which means original line numbers are preserved without source maps.&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;# Before (Node.js 22 and older) — needed ts-node or tsx&lt;/span&gt;
npx tsx server.ts

&lt;span class="c"&gt;# Now (Node.js 24 LTS) — native execution&lt;/span&gt;
node server.ts

&lt;span class="c"&gt;# ESM + TS mixed also works naturally&lt;/span&gt;
node &lt;span class="nt"&gt;--experimental-transform-types&lt;/span&gt; app.ts  &lt;span class="c"&gt;# for decorators/enums&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2.2 Practical Example — ESM + TypeScript Server
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// server.ts — runs on Node.js 24 with zero build step&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createServer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;IncomingMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;ServerResponse&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:http&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;URLPattern&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:url&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// also available globally&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;admin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;instructor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;student&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userPattern&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URLPattern&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/v1/users/:id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createServer&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;IncomingMessage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ServerResponse&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;userPattern&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`http://localhost&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeHead&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;end&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="p"&gt;}&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;groups&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writeHead&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;content-type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`user-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;@manoit.co.kr`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;student&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;satisfies&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;listening on :3000&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2.3 Gotchas — Native TS Constraints
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Constraint&lt;/th&gt;
&lt;th&gt;Reason&lt;/th&gt;
&lt;th&gt;Workaround&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;No type checking&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;tsc --noEmit&lt;/code&gt; is not run before execution&lt;/td&gt;
&lt;td&gt;Keep &lt;code&gt;tsc --noEmit&lt;/code&gt; as a CI step&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;No enum support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Requires code generation&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;as const&lt;/code&gt; objects instead of &lt;code&gt;const enum&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;No namespace support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Legacy syntax&lt;/td&gt;
&lt;td&gt;Migrate to ES modules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;No decorators&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Awaiting Stage 3&lt;/td&gt;
&lt;td&gt;Use &lt;code&gt;--experimental-transform-types&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;No JSX&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Needs runtime transform&lt;/td&gt;
&lt;td&gt;Use a separate bundler for React/Next.js&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  3. Explicit Resource Management — using / await using
&lt;/h2&gt;

&lt;p&gt;V8 13.6 brought the &lt;strong&gt;TC39 Explicit Resource Management proposal&lt;/strong&gt; natively to Node.js 24. File descriptors, DB connections, locks, timers — anything requiring explicit cleanup now releases automatically on scope exit, without &lt;code&gt;try/finally&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1 Synchronous Release — using
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// File handle auto-release&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;openSync&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;closeSync&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;readSync&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FileHandle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nx"&gt;fd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dispose&lt;/span&gt;&lt;span class="p"&gt;]()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;closeSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fd&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`fd &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fd&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; auto-released`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;readFirstLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;using&lt;/span&gt; &lt;span class="nx"&gt;handle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FileHandle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;openSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;r&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;buffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;alloc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nf"&gt;readSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;utf8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;'&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="c1"&gt;// Symbol.dispose auto-called on scope exit&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.2 Async Release — await using
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// DB transaction auto-rollback / connection auto-return&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Pool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;PoolClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;pg&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Pool&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;connectionString&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DATABASE_URL&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TxClient&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PoolClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;committed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;COMMIT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;committed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;Symbol&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;asyncDispose&lt;/span&gt;&lt;span class="p"&gt;]()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;committed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ROLLBACK&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;release&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;connection released + rolled back if not committed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;transferFunds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;pool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;BEGIN&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;using&lt;/span&gt; &lt;span class="nx"&gt;tx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;TxClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;client&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;UPDATE accounts SET balance = balance - $1 WHERE id = $2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;client&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;UPDATE accounts SET balance = balance + $1 WHERE id = $2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;tx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;commit&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="c1"&gt;// On error, await using calls Symbol.asyncDispose → ROLLBACK + release&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.3 Why This Beats try/finally
&lt;/h3&gt;

&lt;p&gt;Deep &lt;code&gt;try/finally&lt;/code&gt; nesting and accidental missed cleanups are structurally eliminated. Even with 10 resources stacked, 10 &lt;code&gt;using&lt;/code&gt; declarations do the job, and disposal happens in reverse stack order automatically. &lt;strong&gt;After Node.js 24, explicit resource management should become the default style for new code.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. OpenSSL 3.5 — Post-Quantum Crypto and Security Level 2
&lt;/h2&gt;

&lt;p&gt;Node.js 24 upgrades to &lt;strong&gt;OpenSSL 3.5&lt;/strong&gt; and ships with NIST's post-quantum cryptography algorithms standardized in 2024. The default Security Level is also raised from &lt;strong&gt;1 to 2&lt;/strong&gt;, automatically blocking weak key lengths and algorithms.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.1 Post-Quantum Algorithm Support
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Algorithm&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;NIST Standard&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;ML-KEM&lt;/strong&gt; (Kyber)&lt;/td&gt;
&lt;td&gt;KEM&lt;/td&gt;
&lt;td&gt;Key exchange&lt;/td&gt;
&lt;td&gt;FIPS 203&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;ML-DSA&lt;/strong&gt; (Dilithium)&lt;/td&gt;
&lt;td&gt;Digital signature&lt;/td&gt;
&lt;td&gt;Authentication/integrity&lt;/td&gt;
&lt;td&gt;FIPS 204&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;SLH-DSA&lt;/strong&gt; (SPHINCS+)&lt;/td&gt;
&lt;td&gt;Hash-based signature&lt;/td&gt;
&lt;td&gt;Long-term storage&lt;/td&gt;
&lt;td&gt;FIPS 205&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HKDF + SHA-384&lt;/td&gt;
&lt;td&gt;KDF&lt;/td&gt;
&lt;td&gt;TLS 1.3 key derivation&lt;/td&gt;
&lt;td&gt;SP 800-56C&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  4.2 Security Level 2 — Blocked Weak Configurations
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Automatically blocked in Node.js 24+&lt;/span&gt;
&lt;span class="c1"&gt;// ❌ RSA 1024-bit keys — ERR_SSL_DH_KEY_TOO_SMALL&lt;/span&gt;
&lt;span class="c1"&gt;// ❌ DSA 1024-bit, DH 1024-bit&lt;/span&gt;
&lt;span class="c1"&gt;// ❌ ECC below 224 bits&lt;/span&gt;
&lt;span class="c1"&gt;// ❌ MD5, SHA-1 signatures&lt;/span&gt;
&lt;span class="c1"&gt;// ❌ TLS 1.0, TLS 1.1&lt;/span&gt;
&lt;span class="c1"&gt;// ❌ RC4, DES, 3DES&lt;/span&gt;

&lt;span class="c1"&gt;// ✅ Recommended minimums&lt;/span&gt;
&lt;span class="c1"&gt;// - RSA/DSA/DH: 2048+ bits&lt;/span&gt;
&lt;span class="c1"&gt;// - ECC: 224+ bits (P-256, P-384 preferred)&lt;/span&gt;
&lt;span class="c1"&gt;// - Signature hash: SHA-256+&lt;/span&gt;
&lt;span class="c1"&gt;// - TLS: 1.2+, prefer 1.3&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createSecureContext&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:tls&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createSecureContext&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;minVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;TLSv1.3&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;ciphers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="c1"&gt;// OpenSSL 3.5 — experimental PQ algorithm combos&lt;/span&gt;
  &lt;span class="na"&gt;sigalgs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mldsa44:mldsa65:ecdsa_secp384r1_sha384&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.3 Migration Gotchas
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;⚠️ Warning:&lt;/strong&gt; If legacy systems, some IoT devices, or older Kubernetes certificates use 1024-bit RSA or SHA-1 signatures, your Node.js 24 app will fail TLS handshakes. Verify before production rollout.&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;# Check server cert key length&lt;/span&gt;
openssl x509 &lt;span class="nt"&gt;-in&lt;/span&gt; cert.pem &lt;span class="nt"&gt;-text&lt;/span&gt; &lt;span class="nt"&gt;-noout&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-A1&lt;/span&gt; &lt;span class="s2"&gt;"Public-Key"&lt;/span&gt;

&lt;span class="c"&gt;# Verify TLS version + algorithms&lt;/span&gt;
openssl s_client &lt;span class="nt"&gt;-connect&lt;/span&gt; api.example.com:443 &lt;span class="nt"&gt;-tls1_3&lt;/span&gt; &lt;span class="nt"&gt;-brief&lt;/span&gt;

&lt;span class="c"&gt;# Temporarily lower Security Level on Node.js 24 (emergency only, not recommended)&lt;/span&gt;
node &lt;span class="nt"&gt;--openssl-config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/etc/ssl/compat.cnf app.ts
&lt;span class="c"&gt;# compat.cnf contents:&lt;/span&gt;
&lt;span class="c"&gt;# [default_sect]&lt;/span&gt;
&lt;span class="c"&gt;# activate = 1&lt;/span&gt;
&lt;span class="c"&gt;# [system_default_sect]&lt;/span&gt;
&lt;span class="c"&gt;# CipherString = DEFAULT@SECLEVEL=1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. npm 11 — 65% Faster Installs and Dependency Resolution
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;npm 11&lt;/strong&gt;, bundled with Node.js 24, features a completely rewritten dependency resolution algorithm with an average &lt;strong&gt;65% performance gain&lt;/strong&gt; on large installs. A 500-production-dependency install drops from 60s to 22s.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;npm 10&lt;/th&gt;
&lt;th&gt;npm 11&lt;/th&gt;
&lt;th&gt;Improvement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;500 deps cold install&lt;/td&gt;
&lt;td&gt;60s&lt;/td&gt;
&lt;td&gt;22s&lt;/td&gt;
&lt;td&gt;63% ↓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1000 deps cold install&lt;/td&gt;
&lt;td&gt;142s&lt;/td&gt;
&lt;td&gt;48s&lt;/td&gt;
&lt;td&gt;66% ↓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cache hit install&lt;/td&gt;
&lt;td&gt;12s&lt;/td&gt;
&lt;td&gt;5s&lt;/td&gt;
&lt;td&gt;58% ↓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI environment (&lt;code&gt;npm ci&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;38s&lt;/td&gt;
&lt;td&gt;14s&lt;/td&gt;
&lt;td&gt;63% ↓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;peer deps resolution&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;8s&lt;/td&gt;
&lt;td&gt;new algorithm&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  5.1 Impact on CI/CD Pipelines
&lt;/h3&gt;

&lt;p&gt;GitHub Actions and GitLab CI automatically use npm 11 when &lt;code&gt;actions/setup-node@v4&lt;/code&gt; is configured with &lt;code&gt;node-version: 24&lt;/code&gt;. Existing &lt;code&gt;package-lock.json&lt;/code&gt; files are compatible, but the stricter peer deps validation &lt;strong&gt;may cause install failures in legacy projects&lt;/strong&gt;. In that case, the &lt;code&gt;--legacy-peer-deps&lt;/code&gt; flag offers a temporary workaround while you phase in proper fixes.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. URLPattern Global API — path-to-regexp Retirement
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;path-to-regexp&lt;/code&gt; library that powers routing in Express, Fastify, Koa, and most Node.js web frameworks is now replaced by a native API. &lt;strong&gt;URLPattern&lt;/strong&gt; has stabilized and is exposed globally.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// URLPattern — native routing&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;routes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;URLPattern&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Record&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URLPattern&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/v1/users/:id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;})],&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URLPattern&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/v1/courses/:courseId/lessons/:lessonId&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;courseId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;lessonId&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;courseId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;lessonId&lt;/span&gt; &lt;span class="p"&gt;})],&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URLPattern&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/static/*&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;params&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="p"&gt;})],&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;matchRoute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;routes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;match&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;pattern&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;match&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;groups&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;Record&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Not Found&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;404&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The big win: &lt;strong&gt;routing logic can now be shared across Workers, Service Workers, browsers, and Node.js in a single codebase&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. node:test — Production-Ready Test Runner
&lt;/h2&gt;

&lt;p&gt;Just &lt;code&gt;node --test&lt;/code&gt; gives you a Jest/Vitest alternative with no install. Node.js 24 auto-awaits subtests and ships coverage, mocking, and snapshots out of the box.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// tests/user.test.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;before&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;after&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:test&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;assert&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:assert/strict&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;UserService&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../src/services/user.ts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;UserService&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;UserService&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;before&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;service&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;UserService&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;connectionString&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;TEST_DATABASE_URL&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;migrate&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nf"&gt;after&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user creation — email duplicate check&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;test@manoit.co.kr&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hong Gildong&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;test@manoit.co.kr&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rejects&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;test@manoit.co.kr&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Kim Chulsoo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/EmailAlreadyExists/&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user lookup — by ID&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;abc-123&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;equal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;abc-123&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Run: node --test --experimental-test-coverage tests/*.test.ts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  8. Production Migration Strategy — 22 → 24 Step-by-Step
&lt;/h2&gt;

&lt;p&gt;A battle-tested sequence for moving Node.js 22 projects to 24. Identifying failure points upfront makes a 1–2 sprint migration feasible without rollback.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Validation&lt;/th&gt;
&lt;th&gt;Time estimate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Add 24 to &lt;code&gt;engines.node&lt;/code&gt; and CI matrix&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;npm ci&lt;/code&gt; passes&lt;/td&gt;
&lt;td&gt;30 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Scan deprecated APIs (&lt;code&gt;node --depth=0 --input-type=module -e "..."&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Lint/CodeMod&lt;/td&gt;
&lt;td&gt;2–4 hr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;TLS certificate + peer deps audit&lt;/td&gt;
&lt;td&gt;OpenSSL 3.5 handshake test&lt;/td&gt;
&lt;td&gt;1–2 hr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Regression test Undici 7-based &lt;code&gt;fetch()&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;HTTP client integration tests&lt;/td&gt;
&lt;td&gt;2–3 hr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Rebuild native modules (&lt;code&gt;sqlite3&lt;/code&gt;, &lt;code&gt;bcrypt&lt;/code&gt;, etc.)&lt;/td&gt;
&lt;td&gt;N-API compatibility check&lt;/td&gt;
&lt;td&gt;1–2 hr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Incrementally adopt new features (using, URLPattern, node:test)&lt;/td&gt;
&lt;td&gt;Unit tests + canary deploy&lt;/td&gt;
&lt;td&gt;Sprint&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Staging → production rollout&lt;/td&gt;
&lt;td&gt;p99 latency + memory monitoring&lt;/td&gt;
&lt;td&gt;1 week&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  8.1 Dockerfile Example — Multi-Stage + Distroless
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# syntax=docker/dockerfile:1.7&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:24.14.1-alpine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;builder&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package.json package-lock.json ./&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;&lt;span class="nt"&gt;--mount&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;cache,target&lt;span class="o"&gt;=&lt;/span&gt;/root/.npm npm ci &lt;span class="nt"&gt;--omit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;dev
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;span class="c"&gt;# Type-check only (Node.js strips types at runtime)&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;npx tsc &lt;span class="nt"&gt;--noEmit&lt;/span&gt;

&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; gcr.io/distroless/nodejs24-debian12:nonroot&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder --chown=nonroot:nonroot /app /app&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 3000&lt;/span&gt;
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; NODE_ENV=production NODE_OPTIONS=--enable-source-maps&lt;/span&gt;
&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; nonroot&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["server.ts"]  # native TS execution — no build artifacts&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  8.2 Known Regressions
&lt;/h3&gt;

&lt;p&gt;GitHub issue #60719 reports a &lt;strong&gt;~57% performance regression in SQLite SELECT operations with native modules&lt;/strong&gt;. Services leaning heavily on better-sqlite3 or similar native DB drivers should benchmark before deciding. A patch is planned for v24.15.x. Alternatives: use the native &lt;code&gt;node:sqlite&lt;/code&gt; module (experimental), or migrate to PostgreSQL/Redis-based architectures.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. ManoIT Recommended Adoption Scenarios
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Project type&lt;/th&gt;
&lt;th&gt;When to adopt&lt;/th&gt;
&lt;th&gt;Features to prioritize&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;New Fastify/Hono API service&lt;/td&gt;
&lt;td&gt;Adopt immediately&lt;/td&gt;
&lt;td&gt;Native TS, using, URLPattern, node:test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Existing Node.js 22 production&lt;/td&gt;
&lt;td&gt;By 2026 Q3&lt;/td&gt;
&lt;td&gt;Migrate after Security Level 2 audit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node.js 20 legacy (EOL imminent)&lt;/td&gt;
&lt;td&gt;Before 2026-04-30, urgent&lt;/td&gt;
&lt;td&gt;Via 22 or direct to 24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Electron/CLI tools&lt;/td&gt;
&lt;td&gt;Wait for Electron 35+&lt;/td&gt;
&lt;td&gt;Verify bundle compatibility first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serverless (Lambda, Cloud Run)&lt;/td&gt;
&lt;td&gt;After AWS Lambda Node 24 runtime GA&lt;/td&gt;
&lt;td&gt;Boot time improvements + npm 11 build cache&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  10. Summary — Why Node.js 24 LTS, and Why Now
&lt;/h2&gt;

&lt;p&gt;Node.js 24 is more than a safe upgrade — it represents a &lt;strong&gt;structural leap in backend developer productivity&lt;/strong&gt;. Build steps disappear, resource leaks are structurally prevented, TLS/crypto enters the post-quantum era, and npm is noticeably faster. With Node.js 20 Iron's EOL imminent, any team without a migration plan for 2026 H1 will face a security-patch gap. ManoIT is adopting 24.14.1 LTS as the default stack for all new Node.js projects and actively recommending staged migration for existing clients.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ManoIT AI Credits&lt;/strong&gt; — This post was produced by our Claude Opus 4.6–powered automated blog pipeline, cross-referencing official Node.js blog posts, OpenJS Foundation announcements, NodeSource, Red Hat Developer, and pkgpulse benchmarks. Always benchmark and run regression tests in your own environment before production rollout.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://www.manoit.co.kr/forum/view/1454884" rel="noopener noreferrer"&gt;ManoIT Tech Blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>backend</category>
      <category>javascript</category>
      <category>security</category>
    </item>
    <item>
      <title>Complete Guide to AI-Powered Zero-Day Vulnerability Discovery — Claude Opus 4.6's 500+ Zero-Days and the Security Paradigm Shift</title>
      <dc:creator>daniel jeong</dc:creator>
      <pubDate>Thu, 16 Apr 2026 00:04:26 +0000</pubDate>
      <link>https://dev.to/x4nent/complete-guide-to-ai-powered-zero-day-vulnerability-discovery-claude-opus-46s-500-zero-days-38pg</link>
      <guid>https://dev.to/x4nent/complete-guide-to-ai-powered-zero-day-vulnerability-discovery-claude-opus-46s-500-zero-days-38pg</guid>
      <description>&lt;h1&gt;
  
  
  Complete Guide to AI-Powered Zero-Day Vulnerability Discovery — Claude Opus 4.6's 500+ Zero-Days, a 23-Year-Old Linux Kernel Bug, and the Security Paradigm Shift
&lt;/h1&gt;

&lt;p&gt;In February 2026, Anthropic published &lt;strong&gt;"Evaluating and mitigating the growing risk of LLM-discovered 0-days"&lt;/strong&gt;, revealing that Claude Opus 4.6 discovered &lt;strong&gt;over 500 validated high-severity zero-day vulnerabilities&lt;/strong&gt; in open-source codebases — without specialized tools, custom scaffolding, or specialized prompting. Among these was a &lt;strong&gt;remotely exploitable heap buffer overflow in the Linux kernel's NFS driver (CVE-2026-31402)&lt;/strong&gt; that had been hiding since 2003, predating Git itself. This article analyzes the technical mechanisms, real-world case studies, and DevSecOps implications of AI-driven vulnerability discovery.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Anthropic's Zero-Day Research: Key Numbers
&lt;/h2&gt;

&lt;p&gt;The research demonstrated that LLMs have evolved beyond coding assistants into &lt;strong&gt;autonomous security research agents&lt;/strong&gt;. Here's the scorecard:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Significance&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vulnerabilities found&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;500+ high-severity&lt;/td&gt;
&lt;td&gt;Out-of-the-box, no custom tooling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Target codebases&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Major OSS projects&lt;/td&gt;
&lt;td&gt;Linux Kernel, Firefox, GhostScript, OpenSC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Oldest bug&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;23 years (introduced 2003)&lt;/td&gt;
&lt;td&gt;CVE-2026-31402 Linux kernel NFS heap overflow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Firefox vulnerabilities&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;22 in 2 weeks&lt;/td&gt;
&lt;td&gt;Mozilla collaboration; first bug found in 20 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;FreeBSD exploit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Remote root shell&lt;/td&gt;
&lt;td&gt;Written autonomously in 4 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Model gap&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Opus 4.6 &amp;gt;&amp;gt; Opus 4.1&lt;/td&gt;
&lt;td&gt;8-month-old model found only a fraction&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  1.1 The Method: Nothing Special
&lt;/h3&gt;

&lt;p&gt;The most striking aspect of this research is the &lt;strong&gt;simplicity of the methodology&lt;/strong&gt;. Researchers deployed Claude Opus 4.6 in a simulated computer environment with standard utilities and vulnerability analysis tools — no specialized instructions or custom frameworks.&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;# Nicholas Carlini's actual approach (simple bash script)&lt;/span&gt;
&lt;span class="c"&gt;# Iterate over Linux kernel source files, instruct Claude Code to find vulnerabilities&lt;/span&gt;
&lt;span class="k"&gt;for &lt;/span&gt;src_file &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;find /usr/src/linux &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"*.c"&lt;/span&gt; &lt;span class="nt"&gt;-type&lt;/span&gt; f&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Analyzing: &lt;/span&gt;&lt;span class="nv"&gt;$src_file&lt;/span&gt;&lt;span class="s2"&gt; ==="&lt;/span&gt;
  claude-code &lt;span class="nt"&gt;--prompt&lt;/span&gt; &lt;span class="s2"&gt;"You are participating in a CTF competition. &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
    Analyze this file for security vulnerabilities. &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
    Focus on memory corruption, buffer overflows, &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
    race conditions, and integer overflows."&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--file&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$src_file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude Opus 4.6 read and reasoned about code the way a human researcher would — examining past fixes to find similar unaddressed bugs, recognizing patterns that tend to cause problems, and understanding logic deeply enough to know exactly what input would break it.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.2 Validation Process
&lt;/h3&gt;

&lt;p&gt;Every discovered bug underwent &lt;strong&gt;rigorous false-positive prevention&lt;/strong&gt;. Memory corruption vulnerabilities were confirmed through crash monitoring with AddressSanitizer (ASan). Claude then "critiqued, de-duplicated, and re-prioritized the crashes," followed by manual validation from internal security researchers who developed patches.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. CVE-2026-31402: A 23-Year-Old Linux Kernel NFS Heap Overflow
&lt;/h2&gt;

&lt;p&gt;The flagship discovery, &lt;strong&gt;CVE-2026-31402&lt;/strong&gt;, is a heap buffer overflow in the Linux kernel's NFSv4.0 LOCK replay cache. Introduced in a 2003 commit that predates Git, this bug is &lt;strong&gt;remotely triggerable without authentication&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1 Technical Mechanism
&lt;/h3&gt;

&lt;p&gt;The NFSv4.0 server's LOCK response replay cache uses a &lt;strong&gt;fixed 112-byte inline buffer&lt;/strong&gt; for encoded responses. This size was calculated based on OPEN responses, but LOCK denial responses include the conflicting lock's owner information — a variable-length field up to 1024 bytes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* Vulnerable code path (pseudocode reconstruction) */&lt;/span&gt;
&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;nfsd4_compoundres&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/* ... */&lt;/span&gt;
    &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;u8&lt;/span&gt; &lt;span class="n"&gt;inline_buf&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;112&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;  &lt;span class="cm"&gt;/* Sized for OPEN responses — 112 bytes */&lt;/span&gt;
        &lt;span class="cm"&gt;/* LOCK denied response: up to 1056 bytes possible */&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="n"&gt;replay_cache&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="cm"&gt;/* When LOCK is denied, response includes owner info */&lt;/span&gt;
&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;encode_lock_denied&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;nfsd4_compoundres&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;file_lock&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;fl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cm"&gt;/* fl-&amp;gt;fl_owner length up to 1024 bytes */&lt;/span&gt;
    &lt;span class="cm"&gt;/* Total response: 32(header) + 1024(owner) = 1056 bytes */&lt;/span&gt;
    &lt;span class="cm"&gt;/* But buffer is 112 bytes → 944-byte heap overflow! */&lt;/span&gt;
    &lt;span class="n"&gt;memcpy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;replay_cache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inline_buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;encoded_response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;response_len&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="cm"&gt;/* No bounds check */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2.2 Attack Scenario
&lt;/h3&gt;

&lt;p&gt;Triggering this vulnerability requires two cooperating NFS clients:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Client&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Client A&lt;/td&gt;
&lt;td&gt;Acquire file lock with 1024-byte owner ID&lt;/td&gt;
&lt;td&gt;Server stores large owner info&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Client B&lt;/td&gt;
&lt;td&gt;Request conflicting lock on same file&lt;/td&gt;
&lt;td&gt;Server generates denial response&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Server&lt;/td&gt;
&lt;td&gt;Includes Client A's owner in denial&lt;/td&gt;
&lt;td&gt;Writes 1056 bytes into 112-byte buffer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;944-byte heap memory overflow&lt;/td&gt;
&lt;td&gt;Adjacent slab objects corrupted → kernel memory manipulation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  2.3 The Patch
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* Fixed code — bounds check before cache copy */&lt;/span&gt;
&lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;nfsd4_store_cache_entry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;nfsd4_compoundres&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;encoded_len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;cstate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current_response_len&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="cm"&gt;/* Patch: skip cache payload if response exceeds buffer */&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;encoded_len&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;replay_cache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inline_buf&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="cm"&gt;/* Cache status but skip payload */&lt;/span&gt;
        &lt;span class="cm"&gt;/* Client already received correct response on original request */&lt;/span&gt;
        &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;replay_cache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;has_payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&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="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;memcpy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;replay_cache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inline_buf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
           &lt;span class="n"&gt;encoded_response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;encoded_len&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;replay_cache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;has_payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The fix is simple but effective: if the encoded response exceeds the buffer size, skip the replay cache payload. Since the client already received the correct response on the original request, the replay cache isn't strictly necessary.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Model Generation Gap: Non-Linear Capability Growth
&lt;/h2&gt;

&lt;p&gt;Another critical finding is the &lt;strong&gt;dramatic capability gap between model generations&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Release&lt;/th&gt;
&lt;th&gt;Vulnerabilities Found&lt;/th&gt;
&lt;th&gt;Linux Kernel NFS&lt;/th&gt;
&lt;th&gt;Firefox&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Claude Opus 4.6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dec 2025&lt;/td&gt;
&lt;td&gt;500+&lt;/td&gt;
&lt;td&gt;Found&lt;/td&gt;
&lt;td&gt;22 in 2 weeks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Opus 4.1&lt;/td&gt;
&lt;td&gt;Apr 2025&lt;/td&gt;
&lt;td&gt;Very few&lt;/td&gt;
&lt;td&gt;Not found&lt;/td&gt;
&lt;td&gt;Very few&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Sonnet 4.5&lt;/td&gt;
&lt;td&gt;Jun 2025&lt;/td&gt;
&lt;td&gt;Very few&lt;/td&gt;
&lt;td&gt;Not found&lt;/td&gt;
&lt;td&gt;Very few&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This reveals two key insights. First, LLM security research capabilities are improving &lt;strong&gt;non-linearly&lt;/strong&gt; — capabilities jumped by orders of magnitude in just 8 months. Second, current security processes &lt;strong&gt;may not keep pace&lt;/strong&gt; with AI discovery speed. The industry-standard 90-day disclosure window may be inadequate when LLMs can mass-discover vulnerabilities in hours to days.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Impact on the Linux Kernel Security Ecosystem
&lt;/h2&gt;

&lt;p&gt;Since Claude Opus 4.6's emergence, Linux kernel maintainers have experienced a &lt;strong&gt;dramatic increase in vulnerability reports&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Period&lt;/th&gt;
&lt;th&gt;Weekly Reports&lt;/th&gt;
&lt;th&gt;Valid Report Rate&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pre-2025&lt;/td&gt;
&lt;td&gt;2-3&lt;/td&gt;
&lt;td&gt;40-60%&lt;/td&gt;
&lt;td&gt;Manual audit-based&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Post-Feb 2026&lt;/td&gt;
&lt;td&gt;35-70 (5-10/day)&lt;/td&gt;
&lt;td&gt;80%+&lt;/td&gt;
&lt;td&gt;LLM-driven automated discovery&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Greg Kroah-Hartman (Linux kernel stable branch maintainer) noted "conditions changed about a month ago," and Willy Tarreau confirmed reports escalated from 2-3/week to 5-10/day, "with most of them being correct." Carlini himself has &lt;strong&gt;hundreds of unvalidated crashes&lt;/strong&gt; awaiting human verification.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.1 Confirmed Linux Kernel Vulnerabilities
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Subsystem&lt;/th&gt;
&lt;th&gt;Vulnerability Type&lt;/th&gt;
&lt;th&gt;Severity&lt;/th&gt;
&lt;th&gt;Age&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NFS (CVE-2026-31402)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Heap buffer overflow&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;td&gt;23 years (2003~)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;io_uring&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Memory corruption&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Several years&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;futex&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Race condition&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Several years&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ksmbd&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Memory corruption&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Several years&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Other&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Undisclosed&lt;/td&gt;
&lt;td&gt;Medium-High&lt;/td&gt;
&lt;td&gt;Under verification&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  5. Anthropic's Safeguards: Cyber-Specific Probe System
&lt;/h2&gt;

&lt;p&gt;With great capability comes the need for &lt;strong&gt;abuse prevention&lt;/strong&gt;. Anthropic introduced a new cyber security detection layer alongside Opus 4.6:&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;# Anthropic Cyber Probe Architecture (conceptual)&lt;/span&gt;
&lt;span class="na"&gt;detection_layer&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;probes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;activation_probe&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Measures&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;internal&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;activation&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;patterns&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;during&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;response&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;generation"&lt;/span&gt;
      &lt;span class="na"&gt;scope&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Detect&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;exploit&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;code&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;generation"&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cyber_specific_probe&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Domain-specific&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;probes&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;cybersecurity"&lt;/span&gt;
      &lt;span class="na"&gt;scope&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Detect&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;malicious&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;vulnerability&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;research&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;patterns"&lt;/span&gt;
  &lt;span class="na"&gt;enforcement&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;real_time_intervention&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;traffic_blocking&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;limitations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;note&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;May&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;create&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;friction&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;for&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;legitimate&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;security&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;research"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The core mechanism uses &lt;strong&gt;activation probes&lt;/strong&gt; that measure internal activation patterns as the model generates responses, detecting malicious vulnerability research patterns in real-time.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. DevSecOps Response Strategy
&lt;/h2&gt;

&lt;h3&gt;
  
  
  6.1 Integrating AI Security Audits into CI/CD
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# .github/workflows/ai-security-audit.yml&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AI Security Audit&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;src/**/*.c'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;src/**/*.go'&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;src/**/*.py'&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;llm-security-scan&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;fetch-depth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Get changed files&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;changed&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;echo "files=$(git diff --name-only origin/main...HEAD \&lt;/span&gt;
            &lt;span class="s"&gt;| grep -E '\.(c|go|py|rs)$' | tr '\n' ' ')" &amp;gt;&amp;gt; $GITHUB_OUTPUT&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AI-powered vulnerability scan&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.ANTHROPIC_API_KEY }}&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;for file in ${{ steps.changed.outputs.files }}; do&lt;/span&gt;
            &lt;span class="s"&gt;echo "=== Scanning: $file ==="&lt;/span&gt;
            &lt;span class="s"&gt;python scripts/ai-security-scan.py \&lt;/span&gt;
              &lt;span class="s"&gt;--file "$file" \&lt;/span&gt;
              &lt;span class="s"&gt;--model claude-sonnet-4-6 \&lt;/span&gt;
              &lt;span class="s"&gt;--focus "memory-safety,injection,race-condition" \&lt;/span&gt;
              &lt;span class="s"&gt;--output reports/security-${{ github.sha }}.json&lt;/span&gt;
          &lt;span class="s"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6.2 Defensive Code Patterns
&lt;/h3&gt;

&lt;p&gt;The key lesson from CVE-2026-31402 is the &lt;strong&gt;importance of bounds checking&lt;/strong&gt; — especially when copying variable-length data into fixed-size buffers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* Safe buffer copy patterns */&lt;/span&gt;

&lt;span class="cm"&gt;/* BAD: No bounds check */&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;unsafe_copy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;dst&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;src_len&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;memcpy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dst&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;src_len&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="cm"&gt;/* Overflow possible */&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cm"&gt;/* GOOD: Bounds check included */&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;safe_copy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;dst&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;dst_size&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;src_len&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src_len&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;dst_size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;pr_warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"buffer overflow prevented: %zu &amp;gt; %zu&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;src_len&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dst_size&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;EOVERFLOW&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;memcpy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dst&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;src_len&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Rust, the ownership system prevents buffer overflows at compile time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;safe_encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="mi"&gt;112&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;Error&lt;/span&gt;&lt;span class="o"&gt;&amp;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;data&lt;/span&gt;&lt;span class="nf"&gt;.len&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="nf"&gt;.len&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Err&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;BufferTooSmall&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;needed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="nf"&gt;.len&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;available&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;buffer&lt;/span&gt;&lt;span class="nf"&gt;.len&lt;/span&gt;&lt;span class="p"&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;buffer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="nf"&gt;.len&lt;/span&gt;&lt;span class="p"&gt;()]&lt;/span&gt;&lt;span class="nf"&gt;.copy_from_slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(())&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6.3 Immediate Action Checklist
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Tool/Method&lt;/th&gt;
&lt;th&gt;Timeline&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;P0&lt;/td&gt;
&lt;td&gt;Check NFS service exposure and patch kernel&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cat /proc/fs/nfsd/versions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Immediately&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P0&lt;/td&gt;
&lt;td&gt;Test with ASan/MSan-enabled kernel builds&lt;/td&gt;
&lt;td&gt;KASAN, KMSAN&lt;/td&gt;
&lt;td&gt;Within 1 week&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;td&gt;Add static analysis tools to CI/CD&lt;/td&gt;
&lt;td&gt;CodeQL, Semgrep, Coverity&lt;/td&gt;
&lt;td&gt;Within 2 weeks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;td&gt;Evaluate memory-safe language (Rust) adoption&lt;/td&gt;
&lt;td&gt;Rust for Linux project&lt;/td&gt;
&lt;td&gt;Quarterly plan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P2&lt;/td&gt;
&lt;td&gt;Build AI-powered security scan pipeline&lt;/td&gt;
&lt;td&gt;Claude API + CI integration&lt;/td&gt;
&lt;td&gt;Within quarter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P2&lt;/td&gt;
&lt;td&gt;Review vulnerability disclosure process (90-day)&lt;/td&gt;
&lt;td&gt;Org security policy&lt;/td&gt;
&lt;td&gt;Within quarter&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  7. Industry Implications and What's Next
&lt;/h2&gt;

&lt;h3&gt;
  
  
  7.1 The 90-Day Disclosure Window Under Pressure
&lt;/h3&gt;

&lt;p&gt;Anthropic's paper questions whether the industry-standard &lt;strong&gt;90-day responsible disclosure period&lt;/strong&gt; is adequate in the LLM era. If Claude Opus 4.6 can mass-discover vulnerabilities in hours, attackers can too. The entire patch cycle and disclosure timeline needs industry-wide reconsideration.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.2 Concurrent Vulnerabilities: CrackArmor and Kyverno SSRF
&lt;/h3&gt;

&lt;p&gt;April 2026 has seen multiple critical vulnerabilities surface simultaneously. &lt;strong&gt;CrackArmor&lt;/strong&gt; (9 AppArmor flaws since 2017) enables root access and container escape on 12M+ Linux systems. &lt;strong&gt;Kyverno SSRF (CVE-2026-4789)&lt;/strong&gt; allows namespace administrators to bypass RBAC via SSRF to Kyverno's pod network stack.&lt;/p&gt;

&lt;h3&gt;
  
  
  7.3 Memory-Safe Language Transition Accelerating
&lt;/h3&gt;

&lt;p&gt;Vulnerabilities like CVE-2026-31402 — a classic C memory management bug — strengthen the case for &lt;strong&gt;Rust for Linux&lt;/strong&gt;. Fixed-size buffer overflows from variable-length data would be caught at compile time with Rust's ownership system.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Conclusion: The New Role of Security Teams
&lt;/h2&gt;

&lt;p&gt;AI-driven vulnerability discovery is no longer theoretical — it's production-ready. The security team's role is shifting from &lt;strong&gt;"finding vulnerabilities" to "validating, prioritizing, and patching vulnerabilities found by AI."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Three immediate actions: First, check NFS service exposure and patch your kernels. Second, add static analysis and memory safety checks to your CI/CD pipelines. Third, review whether your organization's vulnerability disclosure and response processes can keep pace with AI discovery speed. In an era where LLMs find zero-days in hours, the 90-day disclosure window and monthly patch cycles deserve fundamental re-examination.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was written with AI assistance (Claude Opus 4.6, Anthropic). Technical facts were cross-verified against original sources. | ManoIT Tech Blog&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://www.manoit.co.kr/forum/view/1453926" rel="noopener noreferrer"&gt;ManoIT Tech Blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>ai</category>
      <category>linux</category>
      <category>devops</category>
    </item>
    <item>
      <title>Complete Guide to Kubernetes 1.36: DRA GA, OCI VolumeSource, MutatingAdmissionPolicy, and Production Upgrade Checklist</title>
      <dc:creator>daniel jeong</dc:creator>
      <pubDate>Wed, 15 Apr 2026 00:24:51 +0000</pubDate>
      <link>https://dev.to/x4nent/complete-guide-to-kubernetes-136-dra-ga-oci-volumesource-mutatingadmissionpolicy-and-2h8b</link>
      <guid>https://dev.to/x4nent/complete-guide-to-kubernetes-136-dra-ga-oci-volumesource-mutatingadmissionpolicy-and-2h8b</guid>
      <description>&lt;h1&gt;
  
  
  Complete Guide to Kubernetes 1.36 — DRA GA, OCI VolumeSource, and MutatingAdmissionPolicy Usher in a New Era for AI Workloads and Security
&lt;/h1&gt;

&lt;p&gt;Kubernetes v1.36 ships on April 22, 2026. This release brings &lt;strong&gt;Dynamic Resource Allocation (DRA) to GA&lt;/strong&gt;, &lt;strong&gt;OCI VolumeSource to Stable&lt;/strong&gt;, and &lt;strong&gt;MutatingAdmissionPolicy to GA&lt;/strong&gt; — major stabilizations that directly impact production environments. DRA's graduation in particular transforms how GPU and FPGA resources are natively scheduled, fundamentally changing the paradigm for AI/ML workload operations. At the same time, bold security cleanups like the &lt;strong&gt;permanent removal of gitRepo volumes&lt;/strong&gt; and &lt;strong&gt;Portworx in-tree driver deletion&lt;/strong&gt; tighten the cluster attack surface. This guide covers every key change in 1.36 with production-ready code examples and an upgrade checklist.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Release Overview and Change Matrix
&lt;/h2&gt;

&lt;p&gt;v1.36 includes over &lt;strong&gt;60 enhancements&lt;/strong&gt;, with more than 10 graduating to GA. Workload-aware scheduling, introduced in 1.35 Timbernetes, has matured further, and meaningful progress spans security, storage, and networking.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Key Change&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI/GPU&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dynamic Resource Allocation (DRA)&lt;/td&gt;
&lt;td&gt;GA&lt;/td&gt;
&lt;td&gt;Native GPU/FPGA scheduling, 50% perf improvement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Storage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;OCI VolumeSource&lt;/td&gt;
&lt;td&gt;GA&lt;/td&gt;
&lt;td&gt;Mount OCI registry artifacts directly as volumes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security/Policy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MutatingAdmissionPolicy (MAP)&lt;/td&gt;
&lt;td&gt;GA&lt;/td&gt;
&lt;td&gt;Declarative CEL-based mutation, no webhook server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fine-grained kubelet API Authorization&lt;/td&gt;
&lt;td&gt;GA&lt;/td&gt;
&lt;td&gt;Per-endpoint RBAC on kubelet access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Storage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Volume Group Snapshot&lt;/td&gt;
&lt;td&gt;GA&lt;/td&gt;
&lt;td&gt;Atomic multi-volume snapshots via CSI drivers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Storage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SELinux Mount Relabeling&lt;/td&gt;
&lt;td&gt;GA&lt;/td&gt;
&lt;td&gt;Mount-time labeling replaces recursive relabeling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DX&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;kubectl kuberc&lt;/td&gt;
&lt;td&gt;Beta&lt;/td&gt;
&lt;td&gt;Separate user preferences and aliases into a dedicated file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Removal&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;gitRepo Volume&lt;/td&gt;
&lt;td&gt;Removed&lt;/td&gt;
&lt;td&gt;Permanent disable — root code execution vulnerability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Removal&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Portworx In-tree Driver&lt;/td&gt;
&lt;td&gt;Removed&lt;/td&gt;
&lt;td&gt;Must migrate to CSI driver&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deprecation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Service .spec.externalIPs&lt;/td&gt;
&lt;td&gt;Deprecated&lt;/td&gt;
&lt;td&gt;CVE-2020-8554 MITM risk, full removal in v1.43&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  2. Dynamic Resource Allocation (DRA) GA — A Game Changer for AI Workload Scheduling
&lt;/h2&gt;

&lt;p&gt;DRA was first introduced as alpha in Kubernetes 1.26, underwent a complete redesign in 1.31, and has now &lt;strong&gt;graduated to GA in 1.36&lt;/strong&gt;. It goes beyond the limitations of the existing Device Plugin interface, enabling &lt;strong&gt;declarative, attribute-based scheduling of hardware resources&lt;/strong&gt; like GPUs, FPGAs, and network adapters through native Kubernetes APIs.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1 Core DRA Architecture
&lt;/h3&gt;

&lt;p&gt;DRA uses three key API resources: &lt;strong&gt;ResourceClaim&lt;/strong&gt; declares the resources a Pod needs, &lt;strong&gt;ResourceSlice&lt;/strong&gt; advertises resources available on a node, and &lt;strong&gt;DeviceClass&lt;/strong&gt; defines the type and attributes of resources. In 1.36, the scheduler plugin now splits ResourceSlice entries into shared and per-node categories, &lt;strong&gt;reducing Filter stage latency by approximately 50%&lt;/strong&gt;.&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;# ResourceClaim — Request 2 GPUs&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;resource.k8s.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ResourceClaim&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gpu-claim&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ml-training&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;devices&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gpu&lt;/span&gt;
      &lt;span class="na"&gt;deviceClassName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nvidia-gpu&lt;/span&gt;
      &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
      &lt;span class="na"&gt;selectors&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cel&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;expression&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;device.attributes['gpu.nvidia.com'].memory.isGreaterThan(quantity('40Gi'))"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# DeviceClass — NVIDIA GPU class definition&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;resource.k8s.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DeviceClass&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nvidia-gpu&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;selectors&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;cel&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;expression&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;device.driver&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;==&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;'gpu.nvidia.com'"&lt;/span&gt;
  &lt;span class="na"&gt;config&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;opaque&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;driver&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gpu.nvidia.com&lt;/span&gt;
      &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gpu.nvidia.com/v1&lt;/span&gt;
        &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;GpuConfig&lt;/span&gt;
        &lt;span class="na"&gt;sharing&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;strategy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;TimeSlicing&lt;/span&gt;
          &lt;span class="na"&gt;timeSlicingConfig&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2.2 Using DRA in Pods
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# AI inference Pod using DRA&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Pod&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;llm-inference&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ml-training&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;inference&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;vllm/vllm-openai:latest&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;python3"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-m"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;vllm.entrypoints.openai.api_server"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--model"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;meta-llama/Llama-3.3-70B-Instruct"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;claims&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gpu&lt;/span&gt;
        &lt;span class="na"&gt;request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gpu&lt;/span&gt;
  &lt;span class="na"&gt;resourceClaims&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gpu&lt;/span&gt;
    &lt;span class="na"&gt;resourceClaimName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gpu-claim&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2.3 New DRA Features in 1.36
&lt;/h3&gt;

&lt;p&gt;Beyond DRA GA, several related improvements ship in 1.36. &lt;strong&gt;Device Taints and Tolerations&lt;/strong&gt; (Beta) lets you taint specific devices to exclude GPUs under maintenance from scheduling. &lt;strong&gt;ResourcePoolStatusRequest API&lt;/strong&gt; (Alpha) is a new API that queries available devices per pool before submitting workloads. &lt;strong&gt;DRA Admin Access&lt;/strong&gt; also graduates to GA, enabling cluster administrators to manage ResourceClaims centrally.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. OCI VolumeSource GA — Beyond Container Images to OCI Artifacts as Volumes
&lt;/h2&gt;

&lt;p&gt;OCI VolumeSource was introduced as alpha in 1.31 and has graduated to GA in 1.36. This feature &lt;strong&gt;mounts artifacts stored in OCI registries (config files, ML model weights, static data) directly as Pod volumes&lt;/strong&gt;. Previously, such data had to be baked into container images or downloaded via initContainers — now it can be declaratively mounted.&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;# Mounting OCI artifacts as volumes&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Pod&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ml-model-server&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;server&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myregistry.io/inference-server:v2.1&lt;/span&gt;
    &lt;span class="na"&gt;volumeMounts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;model-weights&lt;/span&gt;
      &lt;span class="na"&gt;mountPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/models/llama-3.3&lt;/span&gt;
      &lt;span class="na"&gt;readOnly&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;config&lt;/span&gt;
      &lt;span class="na"&gt;mountPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/etc/app-config&lt;/span&gt;
      &lt;span class="na"&gt;readOnly&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;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;model-weights&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;reference&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myregistry.io/ml-models/llama-3.3-70b:latest&lt;/span&gt;
      &lt;span class="na"&gt;pullPolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;IfNotPresent&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;config&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;reference&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myregistry.io/configs/inference-config:v1.2&lt;/span&gt;
      &lt;span class="na"&gt;pullPolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Always&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is especially powerful for AI/ML workloads. &lt;strong&gt;Managing model weights as OCI artifacts&lt;/strong&gt; means model updates no longer require rebuilding the entire container image — just swap the model artifact. The existing OCI registry infrastructure (caching, mirroring, access control) can be leveraged as-is.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. MutatingAdmissionPolicy GA — Declarative Resource Mutation Without Webhooks
&lt;/h2&gt;

&lt;p&gt;MutatingAdmissionPolicy (MAP) is the mutation counterpart to ValidatingAdmissionPolicy. It &lt;strong&gt;modifies resources using CEL (Common Expression Language) expressions without external webhook servers&lt;/strong&gt;. Existing MutatingWebhookConfiguration required maintaining separate servers and could impact cluster operations during network failures. MAP runs inside kube-apiserver, eliminating these issues entirely.&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;# MutatingAdmissionPolicy — Inject default resource limits on all Pods&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;admissionregistration.k8s.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;MutatingAdmissionPolicy&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;inject-default-resources&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;failurePolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Fail&lt;/span&gt;
  &lt;span class="na"&gt;matchConstraints&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;resourceRules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;apiGroups&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;apiVersions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;v1"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pods"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;operations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CREATE"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;mutations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;patchType&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ApplyConfiguration&lt;/span&gt;
    &lt;span class="na"&gt;applyConfiguration&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;expression&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;Object{&lt;/span&gt;
          &lt;span class="s"&gt;spec: Object.spec{&lt;/span&gt;
            &lt;span class="s"&gt;containers: object.spec.containers.map(c,&lt;/span&gt;
              &lt;span class="s"&gt;Object.spec.containers{&lt;/span&gt;
                &lt;span class="s"&gt;resources: Object.spec.containers.resources{&lt;/span&gt;
                  &lt;span class="s"&gt;limits: c.resources.?limits.orValue({}).merge({&lt;/span&gt;
                    &lt;span class="s"&gt;"memory": c.resources.?limits.orValue({}).?memory.orValue("512Mi"),&lt;/span&gt;
                    &lt;span class="s"&gt;"cpu": c.resources.?limits.orValue({}).?cpu.orValue("500m")&lt;/span&gt;
                  &lt;span class="s"&gt;})&lt;/span&gt;
                &lt;span class="s"&gt;}&lt;/span&gt;
              &lt;span class="s"&gt;}&lt;/span&gt;
            &lt;span class="s"&gt;)&lt;/span&gt;
          &lt;span class="s"&gt;}&lt;/span&gt;
        &lt;span class="s"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MAP supports two mutation modes: &lt;strong&gt;Server-Side Apply merge strategy&lt;/strong&gt; and &lt;strong&gt;JSON Patch&lt;/strong&gt;. With Server-Side Apply, mutations merge naturally with existing fields without overwriting user-specified values. Simple mutation logic previously handled by external solutions like OPA Gatekeeper or Kyverno can now be moved to native Kubernetes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn2lps51k9jf0oiwtfm5u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn2lps51k9jf0oiwtfm5u.png" alt="Kubernetes 1.36 GA features architecture diagram showing DRA, OCI VolumeSource, and MutatingAdmissionPolicy" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Security Hardening — gitRepo Removal, kubelet Authorization, SELinux Mount
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5.1 gitRepo Volume Permanent Removal (KEP-5040)
&lt;/h3&gt;

&lt;p&gt;The gitRepo volume, deprecated since v1.11, has been &lt;strong&gt;permanently disabled in 1.36&lt;/strong&gt;. This volume type cloned Git repositories into Pods but carried a critical security vulnerability that &lt;strong&gt;allowed arbitrary code execution as root on nodes&lt;/strong&gt;. It can no longer be re-enabled via Feature Gate — any workloads using it must be migrated before upgrading.&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;# gitRepo replacement — initContainer + git-sync pattern&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Pod&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app-with-git&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;initContainers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;git-clone&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;alpine/git:latest&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;git'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;clone'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;--depth=1'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;https://github.com/org/repo.git'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;/repo'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;volumeMounts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;git-data&lt;/span&gt;
      &lt;span class="na"&gt;mountPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/repo&lt;/span&gt;
  &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myapp:latest&lt;/span&gt;
    &lt;span class="na"&gt;volumeMounts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;git-data&lt;/span&gt;
      &lt;span class="na"&gt;mountPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/app/data&lt;/span&gt;
      &lt;span class="na"&gt;readOnly&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;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;git-data&lt;/span&gt;
    &lt;span class="na"&gt;emptyDir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5.2 Fine-grained kubelet API Authorization (GA)
&lt;/h3&gt;

&lt;p&gt;Fine-grained kubelet API authorization has graduated to GA. Previously, a compromised kubelet credential granted &lt;strong&gt;full access to the kubelet API&lt;/strong&gt; on that node. Starting in 1.36, endpoint-level RBAC can be applied to prevent a compromised node credential from escalating to full kubelet access.&lt;/p&gt;

&lt;h3&gt;
  
  
  5.3 SELinux Mount Relabeling (GA)
&lt;/h3&gt;

&lt;p&gt;Volume security labeling on SELinux-enforcing systems has been dramatically improved. Instead of recursively traversing every file on a volume to change labels, 1.36 applies them &lt;strong&gt;all at once at mount time via &lt;code&gt;mount -o context=XYZ&lt;/code&gt;&lt;/strong&gt;. Pod startup times that previously took minutes on large volumes are now reduced to milliseconds.&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;# SELinux labeling policy configuration&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Pod&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;selinux-optimized&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;securityContext&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;seLinuxOptions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;level&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;s0:c123,c456"&lt;/span&gt;
    &lt;span class="na"&gt;seLinuxChangePolicy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;MountBased&lt;/span&gt;
  &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myapp:latest&lt;/span&gt;
    &lt;span class="na"&gt;volumeMounts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;data&lt;/span&gt;
      &lt;span class="na"&gt;mountPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/data&lt;/span&gt;
  &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;data&lt;/span&gt;
    &lt;span class="na"&gt;persistentVolumeClaim&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;claimName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-pvc&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. Developer Experience and Notable Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  6.1 kubectl kuberc (Beta)
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;kuberc&lt;/code&gt; separates kubectl user preferences and aliases into a &lt;strong&gt;dedicated file&lt;/strong&gt;. Custom aliases, default output formats, and column settings can now be managed independently in &lt;code&gt;~/.kube/kuberc&lt;/code&gt;.&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;# ~/.kube/kuberc — kubectl user preferences&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kubectl.config.k8s.io/v1beta1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Preference&lt;/span&gt;
&lt;span class="na"&gt;aliases&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;get-pods-wide&lt;/span&gt;
  &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;get&lt;/span&gt;
  &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pods"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-o"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wide"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;flags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;all-namespaces&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;true"&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;logs-tail&lt;/span&gt;
  &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;logs&lt;/span&gt;
  &lt;span class="na"&gt;flags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;tail&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;100"&lt;/span&gt;
    &lt;span class="na"&gt;follow&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;true"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6.2 ARCH Column Added
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;kubectl get node -o wide&lt;/code&gt; now includes an &lt;strong&gt;ARCH column&lt;/strong&gt;, making it easy to identify node architectures in mixed ARM64/AMD64 clusters at a glance.&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;# kubectl get node -o wide output in 1.36&lt;/span&gt;
kubectl get nodes &lt;span class="nt"&gt;-o&lt;/span&gt; wide

NAME          STATUS   ROLES    AGE   VERSION   INTERNAL-IP    OS-IMAGE       KERNEL         ARCH
node-arm-01   Ready    worker   45d   v1.36.0   10.0.1.10     Bottlerocket    6.1.94         arm64
node-amd-01   Ready    worker   45d   v1.36.0   10.0.1.20     Bottlerocket    6.1.94         amd64
node-gpu-01   Ready    gpu      10d   v1.36.0   10.0.1.30     Ubuntu 22.04    6.5.0-44       amd64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6.3 Service .spec.externalIPs Deprecation (KEP-5707)
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Service.spec.externalIPs&lt;/code&gt; has been officially deprecated in v1.36. This field posed a security risk due to &lt;strong&gt;CVE-2020-8554&lt;/strong&gt;, which enabled man-in-the-middle attacks on cluster traffic. Full removal is planned for v1.43 — if you're currently using it, plan migration to LoadBalancer Service, NodePort, or Gateway API.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. v1.36 Upgrade Checklist — Production Migration Guide
&lt;/h2&gt;

&lt;p&gt;Before upgrading production clusters to 1.36, verify the following items:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Check Item&lt;/th&gt;
&lt;th&gt;Command / Method&lt;/th&gt;
&lt;th&gt;Risk&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;gitRepo volume usage&lt;/td&gt;
&lt;td&gt;`kubectl get pods -A -o json \&lt;/td&gt;
&lt;td&gt;jq '.items[].spec.volumes[]? \&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Portworx in-tree driver usage&lt;/td&gt;
&lt;td&gt;{% raw %}`kubectl get pv -o json \&lt;/td&gt;
&lt;td&gt;jq '.items[] \&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;externalIPs Services&lt;/td&gt;
&lt;td&gt;{% raw %}`kubectl get svc -A -o json \&lt;/td&gt;
&lt;td&gt;jq '.items[] \&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Non-canonical IP/CIDR formats&lt;/td&gt;
&lt;td&gt;Audit IaC tool IP generation logic&lt;/td&gt;
&lt;td&gt;Warning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Audit log configuration review&lt;/td&gt;
&lt;td&gt;Check {% raw %}&lt;code&gt;--audit-log-maxsize&lt;/code&gt;, &lt;code&gt;--audit-log-maxage&lt;/code&gt; flags&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Flex Volume usage (kubeadm)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;find /usr/libexec/kubernetes/kubelet-plugins -type f&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Warning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;SELinux policy compatibility&lt;/td&gt;
&lt;td&gt;Verify &lt;code&gt;seLinuxChangePolicy&lt;/code&gt; in mixed privileged/unprivileged Pod environments&lt;/td&gt;
&lt;td&gt;Medium&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 shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Scan all major risk factors at once&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== gitRepo Volume Scan ==="&lt;/span&gt;
kubectl get pods &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; json | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'
  .items[] |
  select(.spec.volumes[]?.gitRepo != null) |
  "\(.metadata.namespace)/\(.metadata.name)"
'&lt;/span&gt; 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"No gitRepo volumes found ✅"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== Portworx In-tree PV Scan ==="&lt;/span&gt;
kubectl get pv &lt;span class="nt"&gt;-o&lt;/span&gt; json | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'
  .items[] |
  select(.spec.portworxVolume != null) |
  .metadata.name
'&lt;/span&gt; 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"No Portworx in-tree PVs found ✅"&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"=== externalIPs Service Scan ==="&lt;/span&gt;
kubectl get svc &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; json | jq &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s1"&gt;'
  .items[] |
  select(.spec.externalIPs != null and (.spec.externalIPs | length &amp;gt; 0)) |
  "\(.metadata.namespace)/\(.metadata.name): \(.spec.externalIPs)"
'&lt;/span&gt; 2&amp;gt;/dev/null &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"No externalIPs Services found ✅"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  8. Conclusion — What 1.36 Means and How to Prepare
&lt;/h2&gt;

&lt;p&gt;Kubernetes 1.36 delivers the most meaningful progress across two axes: &lt;strong&gt;native AI workload support&lt;/strong&gt; and &lt;strong&gt;security streamlining&lt;/strong&gt;. DRA's GA graduation moves GPU resource scheduling from Device Plugin's integer-based constraints to &lt;strong&gt;attribute-based declarative scheduling&lt;/strong&gt;. OCI VolumeSource GA decouples ML model weight deployment from container image builds, improving &lt;strong&gt;operational agility&lt;/strong&gt;. MutatingAdmissionPolicy GA removes the operational burden of webhook servers, enabling policy management through &lt;strong&gt;declarations rather than code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ahead of the April 22 official release, we recommend testing the RC (Release Candidate) in staging environments first and using the upgrade checklist above to pre-audit gitRepo, Portworx, and externalIPs usage. If you're running AI/ML workloads, consider piloting DRA and OCI VolumeSource together.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;References:&lt;/strong&gt; &lt;a href="https://kubernetes.io/blog/2026/03/30/kubernetes-v1-36-sneak-peek/" rel="noopener noreferrer"&gt;Kubernetes v1.36 Sneak Peek (Official Blog)&lt;/a&gt;, &lt;a href="https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.36.md" rel="noopener noreferrer"&gt;CHANGELOG-1.36.md (GitHub)&lt;/a&gt;, &lt;a href="https://www.kloia.com/blog/kubernetes-1-36-whats-coming" rel="noopener noreferrer"&gt;Kubernetes 1.36: GA Features, Removals &amp;amp; Upgrade Guide (Kloia)&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://www.manoit.co.kr/forum/view/1453012" rel="noopener noreferrer"&gt;ManoIT Tech Blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>cloud</category>
      <category>devops</category>
      <category>docker</category>
    </item>
    <item>
      <title>Complete Guide to Dagger v0.20 — Beyond YAML Pipelines with CI/CD as Code, Dang Scripting, and Production Deployment</title>
      <dc:creator>daniel jeong</dc:creator>
      <pubDate>Tue, 14 Apr 2026 00:16:00 +0000</pubDate>
      <link>https://dev.to/x4nent/complete-guide-to-dagger-v020-beyond-yaml-pipelines-with-cicd-as-code-dang-scripting-and-4g45</link>
      <guid>https://dev.to/x4nent/complete-guide-to-dagger-v020-beyond-yaml-pipelines-with-cicd-as-code-dang-scripting-and-4g45</guid>
      <description>&lt;h1&gt;
  
  
  Complete Guide to Dagger v0.20 — Beyond YAML Pipelines with CI/CD as Code: Dang Scripting, Daggerverse Modules, and Production Deployment Strategies
&lt;/h1&gt;

&lt;p&gt;In 2026, CI/CD pipelines are still trapped in YAML hell. GitHub Actions' &lt;code&gt;.github/workflows/*.yml&lt;/code&gt;, GitLab CI's &lt;code&gt;.gitlab-ci.yml&lt;/code&gt;, Jenkins' &lt;code&gt;Jenkinsfile&lt;/code&gt; — different syntax per platform, no local testing, and vendor lock-in. &lt;strong&gt;Dagger&lt;/strong&gt;, created by Docker founder &lt;strong&gt;Solomon Hykes&lt;/strong&gt;, is a container-native automation engine that lets you write CI/CD pipelines in &lt;strong&gt;programming languages&lt;/strong&gt; and run them identically &lt;strong&gt;anywhere&lt;/strong&gt; inside containers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v0.20&lt;/strong&gt;, released in February 2026, introduced the dedicated &lt;strong&gt;Dang&lt;/strong&gt; scripting language, a completely redesigned terminal UI, and a logs-based progress mode. In OpenMeter's real-world case, a pipeline that took 25 minutes on GitHub Actions alone was reduced to &lt;strong&gt;5 minutes (5x faster, 50% cost reduction)&lt;/strong&gt; with Dagger Cloud caching. This guide covers Dagger's architecture, SDK ecosystem, Daggerverse modules, CI integration patterns, Kubernetes production deployment, and comparison with existing CI/CD tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dagger Architecture — DAG-Based Container Execution Engine
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Core Structure: Engine → GraphQL API → SDK
&lt;/h3&gt;

&lt;p&gt;Understanding Dagger's architecture requires distinguishing three layers. The &lt;strong&gt;Dagger Engine&lt;/strong&gt; is a core runtime combining an execution engine, universal type system, data layer, and module system. It runs on any OCI-compatible system. Each language SDK (Go, Python, TypeScript, etc.) doesn't execute pipelines directly — instead, it sends pipeline definitions to the &lt;strong&gt;Dagger GraphQL API&lt;/strong&gt;, which triggers the Engine.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────────────┐
│  Your Code (Go / Python / TypeScript / Dang)                │
│  └── SDK: Converts pipeline definitions to GraphQL requests │
├─────────────────────────────────────────────────────────────┤
│  Dagger GraphQL API                                         │
│  └── Parses pipeline definitions into a DAG                 │
├─────────────────────────────────────────────────────────────┤
│  Dagger Engine                                              │
│  ├── Executes DAG operations concurrently                   │
│  ├── Intermediate artifacts: JIT build + incremental cache  │
│  ├── Container sandbox: all ops run inside containers       │
│  └── Auto-generates OpenTelemetry traces                    │
└─────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the Engine receives an API request, it computes a &lt;strong&gt;DAG (Directed Acyclic Graph)&lt;/strong&gt; of low-level operations and processes them concurrently. Intermediate artifacts are built just-in-time, and every operation is &lt;strong&gt;incremental&lt;/strong&gt; by default. Once all operations resolve, the Engine returns results to your program.&lt;/p&gt;

&lt;h3&gt;
  
  
  CI-Agnostic Design — "Write Once, Run Anywhere"
&lt;/h3&gt;

&lt;p&gt;Dagger's core design principle is &lt;strong&gt;CI-agnostic&lt;/strong&gt;. Your pipelines aren't tied to any platform or provider. GitHub Actions, GitLab CI, Jenkins, CircleCI, Azure Pipelines, or your local terminal — the same pipeline logic works everywhere.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Key Value:&lt;/strong&gt; This fundamentally solves "works on my machine" problems. A pipeline tested locally with &lt;code&gt;dagger call build&lt;/code&gt; runs identically on CI runners. Local debugging — impossible with YAML-based CI — is now a reality.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  v0.20 Key Features — Dang, Native TUI, Cache Management
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Dang: Dagger's Dedicated Scripting Language
&lt;/h3&gt;

&lt;p&gt;Introduced in v0.20.2, &lt;strong&gt;Dang&lt;/strong&gt; is a scripting language designed specifically for Dagger. It runs on a native runtime built into the Engine and introspects the Engine schema at runtime, making every Dagger type a native language type. No codegen, near-instant startup, and concise syntax optimized for AI-assisted development.&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;# Build pipeline in Dang — much more concise than Go SDK&lt;/span&gt;
container |
  from &lt;span class="s2"&gt;"golang:1.22-alpine"&lt;/span&gt; |
  with-exec &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"apk"&lt;/span&gt;, &lt;span class="s2"&gt;"add"&lt;/span&gt;, &lt;span class="s2"&gt;"git"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; |
  with-directory &lt;span class="s2"&gt;"/src"&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;host | directory &lt;span class="s2"&gt;"."&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; |
  with-workdir &lt;span class="s2"&gt;"/src"&lt;/span&gt; |
  with-exec &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"go"&lt;/span&gt;, &lt;span class="s2"&gt;"test"&lt;/span&gt;, &lt;span class="s2"&gt;"./..."&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; |
  with-exec &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"go"&lt;/span&gt;, &lt;span class="s2"&gt;"build"&lt;/span&gt;, &lt;span class="s2"&gt;"-o"&lt;/span&gt;, &lt;span class="s2"&gt;"/app"&lt;/span&gt;, &lt;span class="s2"&gt;"."&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dang modules run directly inside the Engine, eliminating the usual module loading overhead (container startup, process coordination). This is particularly valuable for workflows where AI agents generate and modify pipelines.&lt;/p&gt;

&lt;h3&gt;
  
  
  Redesigned Native TUI
&lt;/h3&gt;

&lt;p&gt;v0.20.2 completely rebuilt the interactive TUI. Instead of the previous fixed viewport, it uses the terminal's &lt;strong&gt;native scrollback&lt;/strong&gt; — free scrolling, link clicking, and text selection. A separate logs-based progress mode (&lt;code&gt;--progress=logs&lt;/code&gt;) was also added for easier CI log scanning.&lt;/p&gt;

&lt;h3&gt;
  
  
  Improved Manual Cache Management
&lt;/h3&gt;

&lt;p&gt;For teams with automatic GC disabled, explicit space threshold-based cache pruning was introduced. Per-call overrides are available for max used space, reserved space, minimum free space, and target space.&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;# Cache pruning options&lt;/span&gt;
dagger call build &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--cache-max-used-space&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;20GB &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--cache-reserved-space&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;5GB &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--cache-min-free-space&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10GB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  SDK Ecosystem — Write Pipelines in 8 Languages
&lt;/h2&gt;

&lt;p&gt;Dagger auto-generates SDKs from its API schema, providing full type safety and editor support (autocomplete, linting) for each language.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;SDK&lt;/th&gt;
&lt;th&gt;Maturity&lt;/th&gt;
&lt;th&gt;Latest Version&lt;/th&gt;
&lt;th&gt;Highlights&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Go&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GA&lt;/td&gt;
&lt;td&gt;v0.20.3&lt;/td&gt;
&lt;td&gt;Most mature, official reference implementation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Python&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GA&lt;/td&gt;
&lt;td&gt;v0.20.3&lt;/td&gt;
&lt;td&gt;async/await, typing support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TypeScript&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GA&lt;/td&gt;
&lt;td&gt;v0.20.3&lt;/td&gt;
&lt;td&gt;Deno/Bun support, ESM default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rust&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GA&lt;/td&gt;
&lt;td&gt;v0.20.3&lt;/td&gt;
&lt;td&gt;Ideal for system-level pipelines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PHP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Beta&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Laravel/Symfony ecosystem integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Java&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Beta&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;For Maven/Gradle projects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;.NET&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Beta&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;C# pipeline authoring&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Elixir&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Beta&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;For Phoenix projects&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  TypeScript SDK Example — Build → Test → Publish
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// dagger/src/index.ts — Full-stack CI pipeline with TypeScript SDK&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;dag&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Directory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;object&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;func&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@dagger.io/dagger&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;object&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CiPipeline&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Directory&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Container&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;dag&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;container&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node:22-alpine&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withDirectory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/app&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withWorkdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/app&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withExec&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;npm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ci&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withExec&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;npm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;run&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;build&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Directory&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ctr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;ctr&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withExec&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;npm&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;run&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;test&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;--&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;--coverage&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;func&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Directory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;
  &lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;built&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;built&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;withEntrypoint&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dist/main.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;registry&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Run locally — identical results to CI&lt;/span&gt;
dagger call &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;--source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Run in GitHub Actions — same command&lt;/span&gt;
dagger call publish &lt;span class="nt"&gt;--source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--registry&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ghcr.io/myorg/myapp &lt;span class="nt"&gt;--tag&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;v1.2.3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Go SDK Example — Multi-Architecture Build
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// dagger/main.go — Multi-arch container build with Go SDK&lt;/span&gt;
&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"context"&lt;/span&gt;
    &lt;span class="s"&gt;"dagger/ci/internal/dagger"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Ci&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Ci&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;BuildMultiArch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;dagger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Directory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&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;dagger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;platforms&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;dagger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Platform&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s"&gt;"linux/amd64"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s"&gt;"linux/arm64"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;platformVariants&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;dagger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;platforms&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;platform&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;platforms&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;platformVariants&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dagger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContainerOpts&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Platform&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;platform&lt;/span&gt;&lt;span class="p"&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;From&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"golang:1.22-alpine"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
            &lt;span class="n"&gt;WithDirectory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/src"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
            &lt;span class="n"&gt;WithWorkdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/src"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
            &lt;span class="n"&gt;WithExec&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"go"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"build"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"-o"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"/app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"."&lt;/span&gt;&lt;span class="p"&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;dag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
        &lt;span class="n"&gt;Publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"ghcr.io/myorg/app:latest"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;dagger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContainerPublishOpts&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;PlatformVariants&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;platformVariants&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Daggerverse — 1,500+ Reusable Modules
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Daggerverse&lt;/strong&gt; serves as the central index for Dagger modules, similar to DockerHub's role for container images. Over 1,500 public modules are registered, hosted on GitHub public repositories. Dagger indexes modules — it doesn't host the code.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Key Modules&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Build&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;golang, node, python, rust&lt;/td&gt;
&lt;td&gt;Standardized language build steps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Test&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;pytest, vitest, go-test&lt;/td&gt;
&lt;td&gt;Test runner integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;trivy, grype, cosign&lt;/td&gt;
&lt;td&gt;Image scanning + signing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deploy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;helm, kubectl, terraform&lt;/td&gt;
&lt;td&gt;Infrastructure provisioning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;daggie, openai, ollama&lt;/td&gt;
&lt;td&gt;AI agent pipelines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Notifications&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;slack, discord, github-comment&lt;/td&gt;
&lt;td&gt;Pipeline result notifications&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 shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Using Daggerverse modules — direct remote module calls&lt;/span&gt;
dagger call &lt;span class="nt"&gt;-m&lt;/span&gt; github.com/purpleclay/daggerverse/trivy@v0.5.0 &lt;span class="se"&gt;\&lt;/span&gt;
  scan &lt;span class="nt"&gt;--source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--severity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;HIGH,CRITICAL

&lt;span class="c"&gt;# Production tip: Always pin versions for remote modules&lt;/span&gt;
&lt;span class="c"&gt;# ✅ github.com/user/module@v1.2.3&lt;/span&gt;
&lt;span class="c"&gt;# ❌ github.com/user/module (latest auto — not recommended)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Production Warning:&lt;/strong&gt; Always pin specific versions when using Daggerverse modules in production to prevent unexpected changes. Manage internal modules in a monorepo subdirectory.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  CI Integration Patterns — GitHub Actions, GitLab CI, Jenkins
&lt;/h2&gt;

&lt;h3&gt;
  
  
  GitHub Actions + Dagger
&lt;/h3&gt;

&lt;p&gt;Dagger replaces GitHub Actions' YAML definitions while keeping the runner infrastructure. YAML serves only as a minimal wrapper for Dagger calls.&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;# .github/workflows/ci.yml — Dagger + GitHub Actions&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;CI&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;dagger&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run Dagger Pipeline&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dagger/dagger-for-github@v8&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0.20.3"&lt;/span&gt;
          &lt;span class="na"&gt;verb&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;call&lt;/span&gt;
          &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;test --source=.&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build and Push&lt;/span&gt;
        &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;github.ref == 'refs/heads/main'&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dagger/dagger-for-github@v8&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0.20.3"&lt;/span&gt;
          &lt;span class="na"&gt;verb&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;call&lt;/span&gt;
          &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;publish --source=. --registry=ghcr.io/${{ github.repository }} --tag=${{ github.sha }}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  GitLab CI + Dagger
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# .gitlab-ci.yml — Dagger + GitLab CI&lt;/span&gt;
&lt;span class="na"&gt;stages&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ci&lt;/span&gt;

&lt;span class="na"&gt;dagger&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;stage&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ci&lt;/span&gt;
  &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;alpine:latest&lt;/span&gt;
  &lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker:dind&lt;/span&gt;
  &lt;span class="na"&gt;variables&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;DOCKER_HOST&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tcp://docker:2376&lt;/span&gt;
    &lt;span class="na"&gt;DOCKER_TLS_CERTDIR&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/certs"&lt;/span&gt;
  &lt;span class="na"&gt;before_script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;apk add --no-cache curl&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;curl -fsSL https://dl.dagger.io/dagger/install.sh | sh&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;export PATH=$HOME/.dagger/bin:$PATH&lt;/span&gt;
  &lt;span class="na"&gt;script&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;dagger call test --source=.&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;dagger call publish --source=. --registry=$CI_REGISTRY_IMAGE --tag=$CI_COMMIT_SHA&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Dagger Cloud Checks — Managed CI
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Dagger Cloud&lt;/strong&gt; connects to your Git provider and automatically runs &lt;code&gt;dagger check&lt;/code&gt; on every change. Auto-scaled on cloud engines — no YAML, no vendor syntax, no orchestration layer. Through a partnership with &lt;strong&gt;Depot&lt;/strong&gt;, managed Dagger Powered GitHub Actions runners are also available with pre-installed Dagger, automatic persistent layer caching, and multi-architecture support.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kubernetes Production Deployment
&lt;/h2&gt;

&lt;h3&gt;
  
  
  DaemonSet Pattern
&lt;/h3&gt;

&lt;p&gt;In Kubernetes, the Dagger Engine deploys as a &lt;strong&gt;DaemonSet&lt;/strong&gt; — one Engine instance per node for maximum resource efficiency and local cache reuse.&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;# dagger-engine-daemonset.yaml&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DaemonSet&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dagger-engine&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ci&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dagger-engine&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dagger-engine&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dagger-engine&lt;/span&gt;
          &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;registry.dagger.io/engine:v0.20.3&lt;/span&gt;
          &lt;span class="na"&gt;securityContext&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;privileged&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;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8080&lt;/span&gt;
              &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;api&lt;/span&gt;
          &lt;span class="na"&gt;volumeMounts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dagger-cache&lt;/span&gt;
              &lt;span class="na"&gt;mountPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/var/lib/dagger&lt;/span&gt;
          &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2"&lt;/span&gt;
              &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;4Gi"&lt;/span&gt;
            &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;4"&lt;/span&gt;
              &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;8Gi"&lt;/span&gt;
      &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dagger-cache&lt;/span&gt;
          &lt;span class="na"&gt;hostPath&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/var/lib/dagger&lt;/span&gt;
            &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DirectoryOrCreate&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Actions Runner Controller (ARC) Integration
&lt;/h3&gt;

&lt;p&gt;For GitHub Actions with Kubernetes runners, combine &lt;strong&gt;ARC&lt;/strong&gt; with Dagger. ARC usage grew &lt;strong&gt;45% year-over-year&lt;/strong&gt; in 2026, making it the standard for ephemeral, auto-scaling runners.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparison with Existing CI/CD Tools
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Dagger&lt;/th&gt;
&lt;th&gt;GitHub Actions&lt;/th&gt;
&lt;th&gt;Jenkins&lt;/th&gt;
&lt;th&gt;GitLab CI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pipeline Definition&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Code (Go/TS/Py)&lt;/td&gt;
&lt;td&gt;YAML&lt;/td&gt;
&lt;td&gt;Groovy DSL&lt;/td&gt;
&lt;td&gt;YAML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Local Execution&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Full support&lt;/td&gt;
&lt;td&gt;act (limited)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vendor Lock-in&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;GitHub&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;GitLab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Caching&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Auto incremental&lt;/td&gt;
&lt;td&gt;Manual config&lt;/td&gt;
&lt;td&gt;Plugins&lt;/td&gt;
&lt;td&gt;Manual config&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Debugging&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;OTel traces&lt;/td&gt;
&lt;td&gt;Logs only&lt;/td&gt;
&lt;td&gt;Blue Ocean&lt;/td&gt;
&lt;td&gt;Logs only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Module Ecosystem&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1,500+&lt;/td&gt;
&lt;td&gt;20K+ Marketplace&lt;/td&gt;
&lt;td&gt;1,800+ plugins&lt;/td&gt;
&lt;td&gt;Limited built-in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;K8s Native&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DaemonSet&lt;/td&gt;
&lt;td&gt;ARC&lt;/td&gt;
&lt;td&gt;Agent Pod&lt;/td&gt;
&lt;td&gt;Runner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI Integration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dang + Daggie&lt;/td&gt;
&lt;td&gt;Copilot&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Duo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Dagger is not a replacement for GitHub Actions — it's complementary. Keep your CI runner infrastructure (GitHub Actions, GitLab CI, etc.) and replace the YAML logic with Dagger functions. "Dagger replaces YAML, not your CI."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  OpenTelemetry Integration — Pipeline Observability
&lt;/h2&gt;

&lt;p&gt;Every Dagger operation automatically generates &lt;strong&gt;OpenTelemetry traces&lt;/strong&gt; with granular logs and metrics, viewable in terminal or web interfaces.&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;# Configure OpenTelemetry export&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OTEL_EXPORTER_OTLP_ENDPOINT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://jaeger:4318

&lt;span class="c"&gt;# Run pipeline — traces sent automatically&lt;/span&gt;
dagger call build &lt;span class="nt"&gt;--source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Visualize every pipeline step in Jaeger UI&lt;/span&gt;
&lt;span class="c"&gt;# See execution time, cache hits/misses, dependency graphs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Combined with Prometheus + Grafana, you can monitor pipeline execution time trends, cache hit rates, and failure rates on dashboards — deep trace-based analysis that was impossible with log-only YAML CI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance Benchmarks — Real-World Data
&lt;/h2&gt;

&lt;h3&gt;
  
  
  OpenMeter Case Study (Published Data)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Configuration&lt;/th&gt;
&lt;th&gt;Build Time&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;th&gt;Improvement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GitHub Actions alone&lt;/td&gt;
&lt;td&gt;25 min&lt;/td&gt;
&lt;td&gt;Baseline&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dagger + Cloud caching&lt;/td&gt;
&lt;td&gt;10 min&lt;/td&gt;
&lt;td&gt;-30%&lt;/td&gt;
&lt;td&gt;2.5x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dagger + Cloud + Fast Runner&lt;/td&gt;
&lt;td&gt;5 min&lt;/td&gt;
&lt;td&gt;-50%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The key factor is &lt;strong&gt;incremental caching&lt;/strong&gt;. The Dagger Engine caches each DAG node independently, re-executing only changed portions — fundamentally different from traditional CI that runs entire workflows from scratch.&lt;/p&gt;

&lt;h3&gt;
  
  
  GitHub Actions Runner Price Reduction
&lt;/h3&gt;

&lt;p&gt;In January 2026, GitHub reduced runner pricing by up to &lt;strong&gt;39%&lt;/strong&gt;. The new 4-vCPU "Standard" runner costs the same as the 2024 2-vCPU runner. Combining these runners with Dagger enables 5x performance at half the cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Production Adoption Checklist
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;Check Item&lt;/th&gt;
&lt;th&gt;Recommendation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1. Pilot&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Apply Dagger to a single project&lt;/td&gt;
&lt;td&gt;Run parallel with existing YAML, compare results&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2. SDK Selection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Use your team's primary language SDK&lt;/td&gt;
&lt;td&gt;Recommend GA SDKs: Go/TS/Python&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3. Module Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pin external module versions, monorepo for internal&lt;/td&gt;
&lt;td&gt;Supply chain security: Cosign signature verification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4. Caching&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dagger Cloud caching or self-hosted cache&lt;/td&gt;
&lt;td&gt;Per-node hostPath or PVC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;5. Observability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Configure OTel trace collection&lt;/td&gt;
&lt;td&gt;Jaeger/Tempo + Grafana dashboard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;6. Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Minimize privileged containers&lt;/td&gt;
&lt;td&gt;Evaluate Sysbox or rootless mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;7. Rollout&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Team-wide adoption after pilot success&lt;/td&gt;
&lt;td&gt;Build internal module library&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusion — The Next Step for CI/CD
&lt;/h2&gt;

&lt;p&gt;Dagger's proposition is clear: write CI/CD pipelines in &lt;strong&gt;code&lt;/strong&gt; (not YAML), run them &lt;strong&gt;identically&lt;/strong&gt; locally and in CI, and maximize speed with container-based &lt;strong&gt;incremental caching&lt;/strong&gt;. At cdCon 2026, AI-powered pipeline optimization, platform engineering, and software supply chain security are key themes — and Dagger shows strength in all three areas.&lt;/p&gt;

&lt;p&gt;The emergence of the Dang scripting language signals a future where AI agents create and modify pipelines. Its design — introspecting the Engine schema without codegen — is an interface optimized for LLMs to understand and manipulate pipelines. In the evolution from "humans writing YAML" to "AI agents orchestrating pipelines as code," Dagger is the most compelling runtime candidate.&lt;/p&gt;

&lt;p&gt;You don't need to abandon GitHub Actions or GitLab CI today. Keep the YAML wrapper and gradually migrate pipeline logic to Dagger functions — that's the most practical adoption strategy. Start with a pilot on one project, and share the build time reduction and local debugging experience with your team. Once "works on my machine" problems disappear, going back to YAML becomes very difficult.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was written with AI assistance (Claude Opus 4.6). Technical accuracy was cross-verified against official documentation, release notes, and published case study data. For the latest version changes, check the &lt;a href="https://dagger.io/changelog/" rel="noopener noreferrer"&gt;Dagger Official Changelog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;© 2026 ManoIT · &lt;a href="https://www.manoit.co.kr" rel="noopener noreferrer"&gt;www.manoit.co.kr&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://www.manoit.co.kr/forum/view/1452211" rel="noopener noreferrer"&gt;ManoIT Tech Blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>cicd</category>
      <category>github</category>
      <category>automation</category>
    </item>
    <item>
      <title>Complete Guide to Google Gemma 4 — Apache 2.0 Open Model Benchmark: PLE Architecture to Ollama Local Deployment</title>
      <dc:creator>daniel jeong</dc:creator>
      <pubDate>Mon, 13 Apr 2026 00:35:41 +0000</pubDate>
      <link>https://dev.to/x4nent/complete-guide-to-google-gemma-4-apache-20-open-model-benchmark-ple-architecture-to-ollama-35ad</link>
      <guid>https://dev.to/x4nent/complete-guide-to-google-gemma-4-apache-20-open-model-benchmark-ple-architecture-to-ollama-35ad</guid>
      <description>&lt;h1&gt;
  
  
  Complete Guide to Google Gemma 4 — The New Open Model Benchmark Under Apache 2.0, from PLE Architecture to Ollama Local Deployment
&lt;/h1&gt;

&lt;p&gt;In April 2026, Google DeepMind released &lt;strong&gt;Gemma 4&lt;/strong&gt; — a family of open-weight models built on Gemini 3 research and distributed under the &lt;strong&gt;Apache 2.0 license&lt;/strong&gt;. No MAU limits, no commercial restrictions. The 31B Dense model scores &lt;strong&gt;89.2%&lt;/strong&gt; on AIME 2026 math, &lt;strong&gt;80.0%&lt;/strong&gt; on LiveCodeBench v6 coding, and &lt;strong&gt;84.3%&lt;/strong&gt; on GPQA Diamond science — competing with 400B-class proprietary models on a parameter-efficiency basis.&lt;/p&gt;

&lt;p&gt;Four key innovations stand out. First, &lt;strong&gt;Per-Layer Embeddings (PLE)&lt;/strong&gt; architecture enables the E2B edge model to achieve 5.1B-class quality with only 2.3B active parameters. Second, all models support &lt;strong&gt;native multimodal&lt;/strong&gt; input (vision + audio). Third, &lt;strong&gt;Function Calling&lt;/strong&gt; is trained into the model from the ground up, optimized for multi-turn agentic workflows. Fourth, up to &lt;strong&gt;256K context window&lt;/strong&gt; handles entire codebases and long documents in a single prompt.&lt;/p&gt;

&lt;p&gt;This guide covers Gemma 4's architectural innovations (PLE, MoE, alternating attention), model specifications and benchmark comparisons, the competitive landscape against Llama 4 and Qwen 3.5, practical local deployment with Ollama/vLLM, and fine-tuning strategies for production use.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Gemma 4 Model Family — Four Models, Three Architectures
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Full Specification Overview
&lt;/h3&gt;

&lt;p&gt;Gemma 4 isn't a single model but a family of &lt;strong&gt;four models&lt;/strong&gt; with distinct hardware targets and architectures. All share Gemini 3's training data and techniques but employ different strategies for inference efficiency.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Total Params&lt;/th&gt;
&lt;th&gt;Active Params&lt;/th&gt;
&lt;th&gt;Architecture&lt;/th&gt;
&lt;th&gt;Context&lt;/th&gt;
&lt;th&gt;Multimodal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gemma 4 31B&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;31B&lt;/td&gt;
&lt;td&gt;31B&lt;/td&gt;
&lt;td&gt;Dense&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;Vision&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gemma 4 26B MoE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;25.2B&lt;/td&gt;
&lt;td&gt;3.8B&lt;/td&gt;
&lt;td&gt;MoE (128E/8A+1S)&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;Vision&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gemma 4 E4B&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~5B&lt;/td&gt;
&lt;td&gt;~4B&lt;/td&gt;
&lt;td&gt;Dense + PLE&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Vision + Audio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gemma 4 E2B&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~5.1B&lt;/td&gt;
&lt;td&gt;~2.3B&lt;/td&gt;
&lt;td&gt;Dense + PLE&lt;/td&gt;
&lt;td&gt;128K&lt;/td&gt;
&lt;td&gt;Vision + Audio&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The 26B MoE model uses 128 small experts with 8 active per token plus one always-on shared expert. Despite 25.2B total parameters, only &lt;strong&gt;3.8B are activated during inference&lt;/strong&gt; — achieving &lt;strong&gt;97% of 31B Dense quality&lt;/strong&gt; at roughly &lt;strong&gt;8x less compute&lt;/strong&gt;. This contrasts sharply with Llama 4 Scout's 16 large expert approach.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apache 2.0 — Why the License Matters
&lt;/h3&gt;

&lt;p&gt;The license change from Google's proprietary license to &lt;strong&gt;Apache 2.0&lt;/strong&gt; is as significant as the technical innovations. This means no MAU limits, full commercial freedom, fine-tuning with redistribution, and embedding in cloud services. While Llama 4's community license restricts apps with 700M+ monthly users, Gemma 4 can be adopted &lt;strong&gt;without constraints&lt;/strong&gt; from startups to hyperscalers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture Deep Dive — PLE, MoE, and Alternating Attention
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Per-Layer Embeddings (PLE) — The Edge Model Innovation
&lt;/h3&gt;

&lt;p&gt;PLE is the novel architecture powering Gemma 4's E2B and E4B edge models. Traditional transformers generate a token vector once at the input embedding layer, then pass it identically through all decoder layers. PLE inverts this paradigm by providing &lt;strong&gt;dedicated embedding vectors for each decoder layer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Specifically, PLE adds a parallel, &lt;strong&gt;lower-dimensional conditioning pathway&lt;/strong&gt; alongside the main residual stream. For each token, it combines a token-identity component (from an embedding lookup) and a context-aware component (a learned projection of the main embeddings) to generate per-layer vectors. Each decoder layer then modulates hidden states via a lightweight residual block after attention and feed-forward.&lt;/p&gt;

&lt;p&gt;Because the PLE dimension is &lt;strong&gt;much smaller&lt;/strong&gt; than the main hidden size, parameter cost is modest while layer-specific specialization improves dramatically. The E2B model achieves the representational depth of its full 5.1B parameter count with only 2.3B active parameters — enabling execution under &lt;strong&gt;1.5GB RAM&lt;/strong&gt; on mobile devices via LiteRT-LM.&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="c1"&gt;# PLE Architecture Concept (Pseudocode)
&lt;/span&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PLEDecoderLayer&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;forward&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;hidden_states&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ple_vectors&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# 1. Standard attention + FFN (same as vanilla transformer)
&lt;/span&gt;        &lt;span class="n"&gt;attn_out&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="nf"&gt;attention&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hidden_states&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;ffn_out&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="nf"&gt;feed_forward&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;attn_out&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# 2. PLE conditional modulation (novel addition)
&lt;/span&gt;        &lt;span class="n"&gt;ple_signal&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="nf"&gt;ple_residual_block&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ple_vectors&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;layer_idx&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

        &lt;span class="c1"&gt;# 3. Inject PLE signal into main stream
&lt;/span&gt;        &lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ffn_out&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;ple_signal&lt;/span&gt;  &lt;span class="c1"&gt;# lightweight residual connection
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PLEEmbedding&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;generate_per_layer_vectors&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;token_ids&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;main_embeddings&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;identity&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="nf"&gt;token_embed_lookup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token_ids&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;      &lt;span class="c1"&gt;# fixed per-token
&lt;/span&gt;        &lt;span class="n"&gt;context&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="nf"&gt;context_projection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;main_embeddings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# context-dependent
&lt;/span&gt;        &lt;span class="n"&gt;per_layer&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="nf"&gt;layer_projection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;identity&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;context&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;per_layer&lt;/span&gt;  &lt;span class="c1"&gt;# [num_layers, low_dim]
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Mixture of Experts (MoE) — The 128 Small Experts Strategy
&lt;/h3&gt;

&lt;p&gt;The 26B MoE model's expert structure differs dramatically from other MoE models. While Llama 4 Scout uses 16 large experts, Gemma 4 employs &lt;strong&gt;128 small experts + 1 shared expert&lt;/strong&gt;, activating 8 per token with the shared expert always on.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Gemma 4 26B MoE&lt;/th&gt;
&lt;th&gt;Llama 4 Scout&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Expert count&lt;/td&gt;
&lt;td&gt;128 + 1 shared&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Active experts/token&lt;/td&gt;
&lt;td&gt;8 + 1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total parameters&lt;/td&gt;
&lt;td&gt;25.2B&lt;/td&gt;
&lt;td&gt;109B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Active parameters&lt;/td&gt;
&lt;td&gt;3.8B&lt;/td&gt;
&lt;td&gt;17B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context length&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;10M&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The 128 small expert strategy enables &lt;strong&gt;finer-grained specialization&lt;/strong&gt; — each expert covers a narrower knowledge domain, improving routing accuracy and maintaining high quality with fewer active parameters.&lt;/p&gt;

&lt;h3&gt;
  
  
  Alternating Attention — Balancing Efficiency and Long-Range Understanding
&lt;/h3&gt;

&lt;p&gt;All Gemma 4 models use &lt;strong&gt;alternating attention&lt;/strong&gt;, where decoder layers alternate between &lt;strong&gt;local sliding-window attention&lt;/strong&gt; (512–1024 tokens) and &lt;strong&gt;global full-context attention&lt;/strong&gt;. Sliding-window layers use standard RoPE, while global layers use &lt;strong&gt;Proportional RoPE&lt;/strong&gt; to enable the 256K context window.&lt;/p&gt;

&lt;p&gt;This design bypasses the O(n²) complexity of full attention. Most layers process only local windows quickly, while periodic global layers maintain long-range dependencies — keeping memory manageable even at 256K tokens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benchmark Deep Dive — Gemma 4 vs Llama 4 vs Qwen 3.5
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Core Benchmark Results
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Benchmark&lt;/th&gt;
&lt;th&gt;Gemma 4 31B&lt;/th&gt;
&lt;th&gt;Gemma 4 26B MoE&lt;/th&gt;
&lt;th&gt;Gemma 4 E4B&lt;/th&gt;
&lt;th&gt;Gemma 3 27B&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Arena AI (text)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1452&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1441&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;1365&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AIME 2026 (math)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;89.2%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;88.3%&lt;/td&gt;
&lt;td&gt;42.5%&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LiveCodeBench v6&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;80.0%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;77.1%&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPQA Diamond (science)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;84.3%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;82.3%&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;42.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Codeforces ELO&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2150&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;110&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The most striking number is the &lt;strong&gt;Codeforces ELO&lt;/strong&gt; jump from 110 to 2150 — corresponding to an Expert-rated competitive programmer. GPQA Diamond nearly doubled from 42.4% to 84.3%, demonstrating massive improvements in graduate-level science reasoning.&lt;/p&gt;

&lt;h3&gt;
  
  
  Competitive Comparison
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Gemma 4 31B&lt;/th&gt;
&lt;th&gt;Llama 4 Scout&lt;/th&gt;
&lt;th&gt;Qwen 3.5 27B&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;License&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Apache 2.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Community (700M MAU limit)&lt;/td&gt;
&lt;td&gt;Apache 2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AIME 2026 math&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;89.2%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;~49%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MMLU Pro&lt;/td&gt;
&lt;td&gt;85.2%&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;86.1%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context length&lt;/td&gt;
&lt;td&gt;256K&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;10M&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multilingual&lt;/td&gt;
&lt;td&gt;140+&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;201&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Native audio&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;E2B/E4B&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Native function calling&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;All models&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Gemma 4 dominates in &lt;strong&gt;math/coding reasoning&lt;/strong&gt;, Qwen 3.5 edges ahead in &lt;strong&gt;general knowledge (MMLU Pro) and multilingual&lt;/strong&gt;, and Llama 4 Scout remains unmatched in &lt;strong&gt;ultra-long context (10M tokens)&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Native Function Calling and Agent Workflows
&lt;/h2&gt;

&lt;p&gt;Gemma 4's function calling isn't prompt engineering — it's built on &lt;strong&gt;FunctionGemma&lt;/strong&gt; research and trained into the model, optimized for multi-turn agentic flows with multiple tools.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;google.adk&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ToolDeclaration&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;google.generativeai&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;

&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;GenerativeModel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma-4-31b-it&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function_declarations&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;FunctionDeclaration&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;search_database&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Search the user database for information&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;parameters&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;type&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;object&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;properties&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;query&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;type&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;string&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;description&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;Search query&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;limit&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;type&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;integer&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;description&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 limit&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;required&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;query&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="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;FunctionDeclaration&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_notification&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;description&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 a notification to a user&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;parameters&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;type&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;object&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;properties&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;user_id&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;type&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;string&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;message&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;type&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;string&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;channel&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;type&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;string&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;enum&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;email&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;slack&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;sms&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;required&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;user_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;message&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="p"&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;chat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start_chat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Find the 5 most recently registered users and send them a welcome message on Slack&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tools&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# Gemma 4 automatically chains:
# 1. search_database(query="recent_users", limit=5)
# 2. Parses results, then for each user:
# 3. send_notification(user_id=..., message=..., channel="slack")
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The synergy with &lt;strong&gt;MCP (Model Context Protocol)&lt;/strong&gt; is particularly powerful — map MCP server tools to Gemma 4 Function Declarations and a locally-running agent seamlessly interacts with external services. Under Apache 2.0, you can embed such agents in commercial services without restrictions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Local Deployment Guide — Ollama and vLLM
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Getting Started with Ollama in 5 Minutes
&lt;/h3&gt;

&lt;p&gt;Ollama is currently the simplest way to run Gemma 4 locally.&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;# 1. Install Ollama (macOS/Linux)&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://ollama.com/install.sh | sh

&lt;span class="c"&gt;# 2. Choose and run your model&lt;/span&gt;
ollama run gemma4:e2b    &lt;span class="c"&gt;# Edge — mobile/laptop (8GB RAM enough)&lt;/span&gt;
ollama run gemma4:e4b    &lt;span class="c"&gt;# Mid — desktop (16GB+ RAM recommended)&lt;/span&gt;
ollama run gemma4:26b    &lt;span class="c"&gt;# MoE — workstation (18GB+ VRAM)&lt;/span&gt;
ollama run gemma4:31b    &lt;span class="c"&gt;# Dense — server-class (24GB+ VRAM)&lt;/span&gt;

&lt;span class="c"&gt;# 3. Use as OpenAI-compatible API server&lt;/span&gt;
ollama serve  &lt;span class="c"&gt;# http://localhost:11434&lt;/span&gt;

&lt;span class="c"&gt;# 4. Test with curl&lt;/span&gt;
curl http://localhost:11434/v1/chat/completions &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "model": "gemma4:26b",
    "messages": [
      {"role": "user", "content": "Explain the difference between Kubernetes HPA and VPA"}
    ]
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Production Serving with vLLM
&lt;/h3&gt;

&lt;p&gt;For multi-user environments and production pipelines, vLLM provides continuous batching and paged attention for maximum throughput.&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;# Install vLLM (uv recommended — 10x faster than pip)&lt;/span&gt;
uv pip &lt;span class="nb"&gt;install &lt;/span&gt;vllm

&lt;span class="c"&gt;# Single GPU (E4B)&lt;/span&gt;
vllm serve google/gemma-4-E4B-it &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--host&lt;/span&gt; 0.0.0.0 &lt;span class="nt"&gt;--port&lt;/span&gt; 8000 &lt;span class="nt"&gt;--max-model-len&lt;/span&gt; 32768

&lt;span class="c"&gt;# Multi-GPU tensor parallel (31B)&lt;/span&gt;
vllm serve google/gemma-4-31B-it &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--tensor-parallel-size&lt;/span&gt; 2 &lt;span class="nt"&gt;--host&lt;/span&gt; 0.0.0.0 &lt;span class="nt"&gt;--port&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;⚠️ Note:&lt;/strong&gt; As of April 2026, a known vLLM bug drops Gemma 4 to ~9 tok/s on RTX 4090, while Ollama achieves 40–60 tok/s on the same hardware. Ollama is recommended for single-user setups; use vLLM only when multi-user serving is required.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Hardware Requirements
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Min VRAM/RAM&lt;/th&gt;
&lt;th&gt;Recommended Hardware&lt;/th&gt;
&lt;th&gt;Expected Speed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;E2B&lt;/td&gt;
&lt;td&gt;1.5GB RAM&lt;/td&gt;
&lt;td&gt;Smartphone, Raspberry Pi&lt;/td&gt;
&lt;td&gt;Mobile-optimized&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E4B&lt;/td&gt;
&lt;td&gt;8GB VRAM&lt;/td&gt;
&lt;td&gt;Laptop, Apple Silicon&lt;/td&gt;
&lt;td&gt;40-60 tok/s (Ollama)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;26B MoE&lt;/td&gt;
&lt;td&gt;18GB+ VRAM&lt;/td&gt;
&lt;td&gt;RTX 4090, A6000&lt;/td&gt;
&lt;td&gt;30-50 tok/s (Ollama)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;31B Dense&lt;/td&gt;
&lt;td&gt;24GB+ VRAM&lt;/td&gt;
&lt;td&gt;RTX 4090, A100, H100&lt;/td&gt;
&lt;td&gt;20-35 tok/s (Ollama)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Kubernetes Deployment Architecture
&lt;/h2&gt;

&lt;p&gt;For production Gemma 4 deployment on Kubernetes, the vLLM + OpenAI-compatible API + LiteLLM router combination is effective.&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;# gemma4-deployment.yaml&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;apps/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deployment&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gemma4-moe-serving&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ai-inference&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gemma4-moe&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gemma4-moe&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;vllm&lt;/span&gt;
        &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;vllm/vllm-openai:latest&lt;/span&gt;
        &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;--model=google/gemma-4-26B-MoE-it&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;--max-model-len=65536&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;--gpu-memory-utilization=0.9&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;--enable-chunked-prefill&lt;/span&gt;
        &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8000&lt;/span&gt;
        &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;nvidia.com/gpu&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;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;40Gi"&lt;/span&gt;
        &lt;span class="na"&gt;readinessProbe&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;httpGet&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/health&lt;/span&gt;
            &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8000&lt;/span&gt;
          &lt;span class="na"&gt;initialDelaySeconds&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;periodSeconds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
      &lt;span class="na"&gt;nodeSelector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;gpu-type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;a100&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Fine-Tuning and Customization
&lt;/h2&gt;

&lt;p&gt;Apache 2.0 permits &lt;strong&gt;free redistribution&lt;/strong&gt; of fine-tuned models. With LoRA/QLoRA, you can create domain-specific models on consumer GPUs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;unsloth&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastLanguageModel&lt;/span&gt;

&lt;span class="c1"&gt;# Load with 4-bit quantization (saves VRAM)
&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tokenizer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FastLanguageModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_pretrained&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model_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;google/gemma-4-E4B-it&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_seq_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;load_in_4bit&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="c1"&gt;# QLoRA — works on RTX 3090
&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Add LoRA adapter
&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FastLanguageModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_peft_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;target_modules&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;q_proj&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;k_proj&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;v_proj&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;o_proj&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;gate_proj&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;up_proj&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;down_proj&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;lora_alpha&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;lora_dropout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Run SFT
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;trl&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SFTTrainer&lt;/span&gt;
&lt;span class="n"&gt;trainer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SFTTrainer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;tokenizer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;tokenizer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;train_dataset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;your_dataset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;dataset_text_field&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;max_seq_length&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4096&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nc"&gt;TrainingArguments&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;per_device_train_batch_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;gradient_accumulation_steps&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;num_train_epochs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;learning_rate&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;2e-4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;fp16&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;output_dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma4-finetuned&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="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;trainer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;train&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Convert to GGUF for Ollama
&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save_pretrained_gguf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemma4-custom&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tokenizer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;quantization_method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;q4_k_m&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;
  
  
  Practical Recommendations
&lt;/h2&gt;

&lt;p&gt;Gemma 4 sets a new benchmark for open models. Here are key production recommendations:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick start:&lt;/strong&gt; Run E4B locally with Ollama for code review, document analysis, and architecture queries. 8GB VRAM is sufficient, and the OpenAI-compatible API integrates with existing toolchains instantly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost optimization:&lt;/strong&gt; The 26B MoE model delivers 31B-class quality with 3.8B active parameters — &lt;strong&gt;8x compute savings&lt;/strong&gt; with only 3% quality trade-off. Ideal for RAG pipelines and agent backends.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Edge AI strategy:&lt;/strong&gt; E2B's PLE architecture runs under 1.5GB RAM, making it a game-changer for embedding AI in mobile apps or IoT devices. LiteRT-LM integration simplifies native Android/iOS deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Caution:&lt;/strong&gt; Monitor the vLLM performance issue, use Ollama for single-user environments. When using 256K context, monitor memory and consider limiting via &lt;code&gt;--max-model-len&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The 2026 open model landscape has shifted decisively. Gemma 4's combination of "Apache 2.0 + PLE + native multimodal + Function Calling" provides a realistic alternative for reducing proprietary model dependency in enterprise AI infrastructure.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was written with the assistance of AI (Claude Opus 4.6). Technical facts were verified against official documentation and benchmark data. For the latest information, refer to the &lt;a href="https://ai.google.dev/gemma/docs/core" rel="noopener noreferrer"&gt;official Google Gemma documentation&lt;/a&gt;, &lt;a href="https://deepmind.google/models/gemma/gemma-4/" rel="noopener noreferrer"&gt;DeepMind Gemma 4 page&lt;/a&gt;, and &lt;a href="https://huggingface.co/blog/gemma4" rel="noopener noreferrer"&gt;HuggingFace Gemma 4 blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://www.manoit.co.kr/forum/view/1451329" rel="noopener noreferrer"&gt;ManoIT Tech Blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>machinelearning</category>
      <category>deeplearning</category>
    </item>
    <item>
      <title>Complete Guide to Valkey 8.1 vs Redis 8.0 — The 2026 In-Memory Datastore Fork War and Production Migration Strategy</title>
      <dc:creator>daniel jeong</dc:creator>
      <pubDate>Mon, 13 Apr 2026 00:24:45 +0000</pubDate>
      <link>https://dev.to/x4nent/complete-guide-to-valkey-81-vs-redis-80-the-2026-in-memory-datastore-fork-war-and-production-579g</link>
      <guid>https://dev.to/x4nent/complete-guide-to-valkey-81-vs-redis-80-the-2026-in-memory-datastore-fork-war-and-production-579g</guid>
      <description>&lt;h1&gt;
  
  
  Complete Guide to Valkey 8.1 vs Redis 8.0 — The 2026 In-Memory Datastore Fork War Winner and Production Migration Strategy
&lt;/h1&gt;

&lt;p&gt;In March 2024, Redis Ltd. switched its open-source license from BSD-3-Clause to SSPL/RSALv2 dual licensing, sending shockwaves through the open-source community. The Linux Foundation immediately launched the &lt;strong&gt;Valkey&lt;/strong&gt; project, with approximately &lt;strong&gt;50 companies&lt;/strong&gt; — including AWS, Google Cloud, Oracle, Alibaba, and Ericsson — joining as contributors. As of April 2026, Valkey 8.1 delivers &lt;strong&gt;37% higher throughput&lt;/strong&gt; and &lt;strong&gt;28% lower memory usage&lt;/strong&gt; compared to Redis, while AWS ElastiCache and GCP Memorystore have made Valkey their default engine.&lt;/p&gt;

&lt;p&gt;Meanwhile, Redis added &lt;strong&gt;AGPLv3 as a third licensing option&lt;/strong&gt; in version 8.0, attempting an open-source reconciliation, and counterattacked with &lt;strong&gt;Vector Set&lt;/strong&gt; — a new data type for the AI era. This guide provides a comprehensive, production-focused comparison of both sides: architecture differences, performance benchmarks, licensing strategies, cloud ecosystem landscape, and migration strategies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Background — Why Valkey Was Born
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Redis License Change and Community Split
&lt;/h3&gt;

&lt;p&gt;Redis operated under BSD-3-Clause for 15 years, becoming the de facto standard for in-memory datastores. In March 2024, Redis Ltd. switched to SSPLv1/RSALv2 dual licensing, citing insufficient contributions from cloud providers who offered Redis as a managed service. Neither license is OSI-approved, effectively restricting managed service offerings.&lt;/p&gt;

&lt;p&gt;The Linux Foundation launched &lt;strong&gt;Valkey&lt;/strong&gt; in late March 2024, forking from Redis 7.2.4. AWS, Google Cloud, Oracle, Snap, and Ericsson joined as initial contributors, with former Redis core developers forming the technical leadership committee. The name "Valkey" combines "value" and "key" — the fundamental concepts of a datastore.&lt;/p&gt;

&lt;h3&gt;
  
  
  Redis AGPLv3 Retreat — A Reconciliation Gesture Too Late?
&lt;/h3&gt;

&lt;p&gt;In May 2025, alongside Redis 8.0 GA, Redis added &lt;strong&gt;AGPLv3 as a third licensing option&lt;/strong&gt;. Users can now choose from SSPLv1, RSALv2, or the OSI-approved AGPLv3. However, by this point the Valkey ecosystem was already firmly established. AGPLv3 requires source disclosure for all modifications when providing network services, creating higher adoption barriers for enterprises compared to Valkey's BSD-3-Clause.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deep Architecture Comparison — I/O Threading and Memory Optimization
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Valkey 8.1's I/O Threading Innovation
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;enhanced async I/O threading&lt;/strong&gt; introduced in Valkey 8.0 represents the biggest architectural change since the fork. While maintaining the single-threaded command processing model for atomicity, network reads/writes are offloaded to an I/O thread pool. Valkey intelligently distributes I/O tasks across multiple cores based on real-time usage analysis, maximizing hardware utilization.&lt;/p&gt;

&lt;p&gt;Valkey 8.1 takes this further. &lt;strong&gt;TLS negotiation offloading&lt;/strong&gt; moved to I/O threads, improving new connection acceptance speed by approximately &lt;strong&gt;300%&lt;/strong&gt; in TLS-enabled environments. &lt;strong&gt;Replication stream writes on primary nodes&lt;/strong&gt; are also offloaded to the I/O thread pool, making diskless replication with TLS up to &lt;strong&gt;18% faster&lt;/strong&gt;. Memory prefetching techniques preload hashtable buckets and elements into CPU cache during key iteration, significantly improving SCAN command family performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Memory Efficiency — Hashtable Redesign
&lt;/h3&gt;

&lt;p&gt;Valkey 8.x's hashtable redesign significantly reduces per-key-value-pair memory overhead: approximately &lt;strong&gt;20 bytes&lt;/strong&gt; for keys without TTL, and up to &lt;strong&gt;30 bytes&lt;/strong&gt; for keys with TTL. At hyperscale, the difference is dramatic:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key Count&lt;/th&gt;
&lt;th&gt;Valkey 8.1&lt;/th&gt;
&lt;th&gt;Redis 8.0&lt;/th&gt;
&lt;th&gt;Difference&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1M&lt;/td&gt;
&lt;td&gt;~80 MB&lt;/td&gt;
&lt;td&gt;~100 MB&lt;/td&gt;
&lt;td&gt;-20%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10M&lt;/td&gt;
&lt;td&gt;~760 MB&lt;/td&gt;
&lt;td&gt;~980 MB&lt;/td&gt;
&lt;td&gt;-22%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50M&lt;/td&gt;
&lt;td&gt;3.77 GB&lt;/td&gt;
&lt;td&gt;4.83 GB&lt;/td&gt;
&lt;td&gt;-28% (1.06 GB)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At 50 million keys, Valkey saves &lt;strong&gt;1.06 GB&lt;/strong&gt; compared to Redis. For environments running hundreds of replicas, the infrastructure cost savings are substantial.&lt;/p&gt;

&lt;h3&gt;
  
  
  Redis 8.0's Vector Set — The AI Era Differentiator
&lt;/h3&gt;

&lt;p&gt;Redis 8.0's most powerful differentiator is the &lt;strong&gt;Vector Set&lt;/strong&gt; data type. Inspired by Sorted Sets, it natively supports high-dimensional vector embedding storage and similarity search. This enables semantic search, recommendation systems, and RAG (Retrieval-Augmented Generation) pipelines without a separate vector database.&lt;/p&gt;

&lt;p&gt;Key Vector Set capabilities:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auto Quantization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Default 8-bit quantization, with no-quantization and binary quantization options&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dimension Reduction&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Automatic dimension reduction via random projection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Attribute Filtering&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JSON blob metadata association for filtered searches&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;HNSW Index&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High-performance approximate nearest neighbor search&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Note that Vector Set is currently in &lt;strong&gt;beta&lt;/strong&gt;, and its API may change. Unless your use case specifically requires combining caching with vector similarity search in a single infrastructure, dedicated vector databases (Weaviate, Milvus, etc.) remain the more mature choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance Benchmarks — The Gap in Numbers
&lt;/h2&gt;

&lt;p&gt;Independent benchmarks conducted by Momento on AWS c8g.2xlarge (8 vCPU) instances clearly demonstrate the performance gap:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Valkey 8.1.1&lt;/th&gt;
&lt;th&gt;Redis 8.0&lt;/th&gt;
&lt;th&gt;Valkey Advantage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SET RPS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;999,800&lt;/td&gt;
&lt;td&gt;729,400&lt;/td&gt;
&lt;td&gt;+37%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SET p99 Latency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.80 ms&lt;/td&gt;
&lt;td&gt;0.99 ms&lt;/td&gt;
&lt;td&gt;-19%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GET RPS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~1,050,000&lt;/td&gt;
&lt;td&gt;~860,000&lt;/td&gt;
&lt;td&gt;+22%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory (50M keys)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;3.77 GB&lt;/td&gt;
&lt;td&gt;4.83 GB&lt;/td&gt;
&lt;td&gt;-28%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;TLS Connection Accept&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;(Valkey 8.1 baseline)&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;+300%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Valkey's I/O threading architecture shows a clear advantage in multi-core environments. The 300% TLS connection acceptance improvement makes a real difference in production environments with TLS enabled. Pipeline workloads also see an additional &lt;strong&gt;10% throughput improvement&lt;/strong&gt; in Valkey 8.1 over 8.0.&lt;/p&gt;

&lt;h2&gt;
  
  
  Licensing Strategy and Governance — Who Is True Open Source?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Valkey&lt;/th&gt;
&lt;th&gt;Redis&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;License&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;BSD-3-Clause&lt;/td&gt;
&lt;td&gt;SSPLv1 / RSALv2 / AGPLv3 (triple)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OSI Approved&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;BSD-3 is OSI-approved&lt;/td&gt;
&lt;td&gt;Only AGPLv3 is OSI-approved&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Governance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Linux Foundation (neutral)&lt;/td&gt;
&lt;td&gt;Redis Ltd. (commercial entity)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Contributors&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~50 companies (AWS, GCP, Oracle, etc.)&lt;/td&gt;
&lt;td&gt;Redis Ltd.-centric&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub Stars&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;19,800+&lt;/td&gt;
&lt;td&gt;68,000+ (15 years accumulated)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Managed Service&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No restrictions&lt;/td&gt;
&lt;td&gt;AGPLv3 requires source disclosure&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;From an enterprise perspective, the most critical difference is &lt;strong&gt;license risk&lt;/strong&gt;. Valkey's BSD-3-Clause has virtually no commercial use restrictions. Redis's AGPLv3, while OSI-approved, requires modified source disclosure for network services, necessitating legal review. Choosing SSPL/RSALv2 means you're using source-available, not open-source, licenses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cloud Ecosystem Landscape — Big Three Choices
&lt;/h2&gt;

&lt;p&gt;As of April 2026, major cloud providers' in-memory datastore strategies have clearly diverged:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Cloud&lt;/th&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Default Engine&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AWS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ElastiCache / MemoryDB&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Valkey&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Serverless 33% cheaper, node-based 20% cheaper&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GCP&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Memorystore&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Valkey&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Up to 14.5 TB, multi-zone clusters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Azure&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Azure Managed Redis&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Redis&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Azure Cache for Redis retiring&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Akamai&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Managed Valkey&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Valkey&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Switched in 2024&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Oracle&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;OCI Cache&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Valkey&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Linux Foundation contributor&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;AWS's Valkey-based ElastiCache Serverless is &lt;strong&gt;33% cheaper&lt;/strong&gt; than Redis OSS, with node-based options &lt;strong&gt;20% cheaper&lt;/strong&gt;. Excluding Azure, Valkey has become the de facto standard engine for multi-cloud strategies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Feature Comparison — Where They Diverge
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Valkey 8.1&lt;/th&gt;
&lt;th&gt;Redis 8.0+&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;I/O Threading&lt;/td&gt;
&lt;td&gt;Enhanced async I/O&lt;/td&gt;
&lt;td&gt;Basic I/O threading&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vector Search&lt;/td&gt;
&lt;td&gt;Not supported (external)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Vector Set (native)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full-text Search&lt;/td&gt;
&lt;td&gt;Not supported&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Redis Query Engine&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Time Series&lt;/td&gt;
&lt;td&gt;Not supported&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;RedisTimeSeries&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JSON Support&lt;/td&gt;
&lt;td&gt;Basic support&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;RedisJSON (native)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Probabilistic Data Structures&lt;/td&gt;
&lt;td&gt;Basic support&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;RedisBloom (integrated)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client Compatibility&lt;/td&gt;
&lt;td&gt;100% Redis client compatible&lt;/td&gt;
&lt;td&gt;Native&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Redis's strength lies in its &lt;strong&gt;unified data platform&lt;/strong&gt; strategy — caching + vector search + full-text search + time series in a single infrastructure. Valkey focuses on &lt;strong&gt;pure caching/session/message queue&lt;/strong&gt; workloads, delegating vector and full-text search to dedicated solutions (Weaviate, Elasticsearch, etc.).&lt;/p&gt;

&lt;h2&gt;
  
  
  Production Migration Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Redis to Valkey Migration
&lt;/h3&gt;

&lt;p&gt;Valkey maintains &lt;strong&gt;full API compatibility&lt;/strong&gt; with Redis OSS 7.2. Existing Redis clients (ioredis, redis-py, Jedis, StackExchange.Redis) work &lt;strong&gt;without code changes&lt;/strong&gt;. Migration follows three steps:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Compatibility Verification&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Check current Redis version&lt;/span&gt;
redis-cli INFO server | &lt;span class="nb"&gt;grep &lt;/span&gt;redis_version

&lt;span class="c"&gt;# Test compatibility with Valkey container&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; valkey-test &lt;span class="nt"&gt;-p&lt;/span&gt; 6380:6379 valkey/valkey:8.1

&lt;span class="c"&gt;# Test existing client against Valkey&lt;/span&gt;
redis-cli &lt;span class="nt"&gt;-p&lt;/span&gt; 6380 PING
&lt;span class="c"&gt;# Response: PONG&lt;/span&gt;

&lt;span class="c"&gt;# Run existing application integration tests&lt;/span&gt;
&lt;span class="nv"&gt;REDIS_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;redis://localhost:6380 npm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 2: Data Migration&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# RDB snapshot migration (with downtime)&lt;/span&gt;
redis-cli &lt;span class="nt"&gt;-h&lt;/span&gt; source-redis BGSAVE
&lt;span class="c"&gt;# Copy RDB file to Valkey data directory and restart&lt;/span&gt;

&lt;span class="c"&gt;# Live migration (minimal downtime)&lt;/span&gt;
&lt;span class="c"&gt;# Set Valkey as Redis replica&lt;/span&gt;
valkey-cli &lt;span class="nt"&gt;-h&lt;/span&gt; valkey-new REPLICAOF source-redis 6379

&lt;span class="c"&gt;# Verify sync completion&lt;/span&gt;
valkey-cli &lt;span class="nt"&gt;-h&lt;/span&gt; valkey-new INFO replication
&lt;span class="c"&gt;# Confirm: master_link_status:up, master_sync_in_progress:0&lt;/span&gt;

&lt;span class="c"&gt;# Execute failover&lt;/span&gt;
valkey-cli &lt;span class="nt"&gt;-h&lt;/span&gt; valkey-new REPLICAOF NO ONE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3: AWS ElastiCache Migration (Managed)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Change ElastiCache engine via AWS CLI&lt;/span&gt;
aws elasticache modify-replication-group &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--replication-group-id&lt;/span&gt; my-redis-cluster &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--engine&lt;/span&gt; valkey &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--engine-version&lt;/span&gt; 8.0 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--apply-immediately&lt;/span&gt;

&lt;span class="c"&gt;# Or create new Valkey cluster with data migration&lt;/span&gt;
aws elasticache create-serverless-cache &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--serverless-cache-name&lt;/span&gt; my-valkey-cache &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--engine&lt;/span&gt; valkey &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--major-engine-version&lt;/span&gt; 8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Decision Framework
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scenario&lt;/th&gt;
&lt;th&gt;Recommendation&lt;/th&gt;
&lt;th&gt;Reason&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Pure caching/session/queue&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Valkey&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Higher throughput, lower memory, permissive license&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Caching + vector search integration&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Redis&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vector Set simplifies infrastructure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS/GCP managed services&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Valkey&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Default engine, 20-33% cost savings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure environment&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Redis&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Azure Managed Redis native support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full-text search + time series needed&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Redis&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;RedisSearch, RedisTimeSeries integrated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Minimize license risk&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Valkey&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;BSD-3, no managed service restrictions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High-traffic (1M+ RPS)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Valkey&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;I/O threading maximizes multi-core utilization&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Kubernetes Deployment — Helm Chart Comparison
&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;# Valkey Helm deployment (Bitnami)&lt;/span&gt;
&lt;span class="c1"&gt;# values-valkey.yaml&lt;/span&gt;
&lt;span class="na"&gt;architecture&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;replication&lt;/span&gt;
&lt;span class="na"&gt;auth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;enabled&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;password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-secure-password"&lt;/span&gt;
&lt;span class="na"&gt;master&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;500m&lt;/span&gt;
      &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;1Gi&lt;/span&gt;
    &lt;span class="na"&gt;limits&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;2000m&lt;/span&gt;
      &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;4Gi&lt;/span&gt;
  &lt;span class="na"&gt;persistence&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;enabled&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;size&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;10Gi&lt;/span&gt;
&lt;span class="na"&gt;replica&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;replicaCount&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;
  &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;requests&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;cpu&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;250m&lt;/span&gt;
      &lt;span class="na"&gt;memory&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;512Mi&lt;/span&gt;
&lt;span class="na"&gt;metrics&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;enabled&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;serviceMonitor&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;  &lt;span class="c1"&gt;# Prometheus integration&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install Valkey&lt;/span&gt;
helm &lt;span class="nb"&gt;install &lt;/span&gt;my-valkey oci://registry-1.docker.io/bitnamicharts/valkey &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-f&lt;/span&gt; values-valkey.yaml &lt;span class="nt"&gt;-n&lt;/span&gt; datastore

&lt;span class="c"&gt;# Install Redis (for comparison)&lt;/span&gt;
helm &lt;span class="nb"&gt;install &lt;/span&gt;my-redis oci://registry-1.docker.io/bitnamicharts/redis &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-f&lt;/span&gt; values-redis.yaml &lt;span class="nt"&gt;-n&lt;/span&gt; datastore
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2026 and Beyond — Valkey 9.0 and Redis 8.6 Directions
&lt;/h2&gt;

&lt;p&gt;The Valkey community has already released &lt;strong&gt;Valkey 9.0&lt;/strong&gt;, demonstrating aggressive development velocity. The Keyspace Amsterdam event shows an independent community ecosystem taking shape. Redis has released &lt;strong&gt;8.4 and 8.6&lt;/strong&gt; in quick succession, focusing on performance improvements and memory reduction, with Redis 8.6 achieving "substantial performance improvements and memory reduction."&lt;/p&gt;

&lt;p&gt;The codebase divergence deepens over time. Valkey focuses on &lt;strong&gt;core performance and memory efficiency&lt;/strong&gt;, while Redis differentiates through &lt;strong&gt;data platform integration&lt;/strong&gt; (vector, search, time series, JSON). Starting from the same code in 2024, by 2026 each has developed a distinct identity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion — A Practical Selection Guide
&lt;/h2&gt;

&lt;p&gt;Choosing an in-memory datastore in 2026 is no longer "just use Redis." &lt;strong&gt;For most caching, session management, and message queue workloads, Valkey is the rational choice across performance, cost, and licensing dimensions&lt;/strong&gt;. If you're on AWS or GCP, managed service cost savings alone justify the switch.&lt;/p&gt;

&lt;p&gt;However, for &lt;strong&gt;AI-centric architectures requiring vector similarity search, full-text search, and time series data integrated with a cache layer&lt;/strong&gt;, Redis's unified data platform strategy reduces infrastructure complexity. If Azure is your primary environment, Redis is the natural choice.&lt;/p&gt;

&lt;p&gt;The key takeaway: &lt;strong&gt;existing Redis client code works with Valkey without modification&lt;/strong&gt;. Migration cost is extremely low, so if you're currently running Redis, we strongly recommend testing Valkey 8.1 in your staging environment.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was generated by the **ManoIT Tech Blog Automation Pipeline&lt;/em&gt;&lt;em&gt;. AI-powered trend analysis, technical research, content generation, and quality verification. For technical corrections or suggestions, contact &lt;a href="https://www.manoit.co.kr" rel="noopener noreferrer"&gt;ManoIT&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://www.manoit.co.kr/forum/view/1449790" rel="noopener noreferrer"&gt;ManoIT Tech Blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>database</category>
      <category>backend</category>
      <category>api</category>
      <category>node</category>
    </item>
    <item>
      <title>CVE-2026-33105 AKS CVSS 10.0 Emergency Analysis and Complete Guide to Managed Kubernetes Zero Trust Security</title>
      <dc:creator>daniel jeong</dc:creator>
      <pubDate>Thu, 09 Apr 2026 02:17:30 +0000</pubDate>
      <link>https://dev.to/x4nent/cve-2026-33105-aks-cvss-100-emergency-analysis-and-complete-guide-to-managed-kubernetes-zero-trust-4oea</link>
      <guid>https://dev.to/x4nent/cve-2026-33105-aks-cvss-100-emergency-analysis-and-complete-guide-to-managed-kubernetes-zero-trust-4oea</guid>
      <description>&lt;h1&gt;
  
  
  CVE-2026-33105 AKS CVSS 10.0 Emergency Analysis and Complete Guide to Managed Kubernetes Zero Trust Security — EKS/AKS/GKE Multi-Cloud Defense Strategy
&lt;/h1&gt;

&lt;p&gt;On April 3, 2026, Microsoft disclosed &lt;strong&gt;CVE-2026-33105&lt;/strong&gt; — a &lt;strong&gt;CVSS 10.0 (Critical)&lt;/strong&gt; privilege escalation vulnerability in Azure Kubernetes Service (AKS). An unauthenticated attacker can escalate privileges over the network, potentially gaining full cluster control from a single compromised workload. With 89% of organizations experiencing at least one Kubernetes security incident in the last 12 months and Kubernetes token theft attacks surging &lt;strong&gt;282% year-over-year&lt;/strong&gt;, managed Kubernetes security can no longer be delegated solely to cloud providers.&lt;/p&gt;

&lt;p&gt;This article analyzes the CVE-2026-33105 attack mechanism and immediate remediation steps, then provides a comprehensive guide to building a &lt;strong&gt;Zero Trust security framework&lt;/strong&gt; across EKS/AKS/GKE multi-cloud environments — covering Workload Identity, least-privilege RBAC, network policies, and runtime security.&lt;/p&gt;

&lt;h2&gt;
  
  
  CVE-2026-33105 — The Worst AKS Privilege Escalation Ever
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Vulnerability Overview and Attack Vector
&lt;/h3&gt;

&lt;p&gt;The core of CVE-2026-33105 is &lt;strong&gt;Improper Authorization (CWE-285)&lt;/strong&gt;. AKS fails to correctly validate authorization checks for certain resources, allowing an unauthenticated attacker to interact with a network-accessible AKS component and gain higher-level permissions than intended.&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;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CVE ID&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CVE-2026-33105&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CVSS Score&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10.0 (Critical) — Maximum severity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vulnerability Type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CWE-285: Improper Authorization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Attack Vector&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Network (No authentication required, No user interaction)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Impact Scope&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AKS cluster privilege escalation → Full cluster control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Disclosed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;April 3, 2026&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Patch&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Security update deployed via Azure Update Manager&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Attack Scenario and Blast Radius
&lt;/h3&gt;

&lt;p&gt;The key risk lies in authorization bypass through the &lt;strong&gt;nodes/proxy&lt;/strong&gt; path. Once an attacker tricks a network-accessible AKS component into granting elevated permissions, limited workload access can escalate to &lt;strong&gt;full cluster or Azure tenant-level control&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attack Phase&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Severity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1. Initial Access&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Unauthenticated request to network-accessible AKS endpoint&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2. Authorization Bypass&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Bypass authorization checks via nodes/proxy path&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3. Privilege Escalation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Obtain cluster-admin level privileges&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4. Lateral Movement&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Harvest kubeconfig, node metadata, service credentials&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;5. Tenant Infiltration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Pivot to other resources within the Azure tenant&lt;/td&gt;
&lt;td&gt;Critical&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Immediate Response Checklist
&lt;/h3&gt;

&lt;p&gt;Every organization running AKS must execute these 5 steps &lt;strong&gt;immediately&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Step 1: Identify affected AKS clusters&lt;/span&gt;
az aks list &lt;span class="nt"&gt;--query&lt;/span&gt; &lt;span class="s2"&gt;"[].{Name:name, RG:resourceGroup, Version:kubernetesVersion, State:provisioningState}"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; table

&lt;span class="c"&gt;# Step 2: Apply security patch (Azure Update Manager)&lt;/span&gt;
az aks upgrade &lt;span class="nt"&gt;--resource-group&lt;/span&gt; &amp;lt;RG&amp;gt; &lt;span class="nt"&gt;--name&lt;/span&gt; &amp;lt;CLUSTER&amp;gt; &lt;span class="nt"&gt;--kubernetes-version&lt;/span&gt; &amp;lt;PATCHED_VERSION&amp;gt;

&lt;span class="c"&gt;# Step 3: Audit over-privileged RBAC bindings&lt;/span&gt;
kubectl get clusterrolebindings &lt;span class="nt"&gt;-o&lt;/span&gt; json | jq &lt;span class="s1"&gt;'.items[] | select(.roleRef.name=="cluster-admin") | .subjects[]'&lt;/span&gt;

&lt;span class="c"&gt;# Step 4: Check nodes/proxy access permissions&lt;/span&gt;
kubectl auth can-i create nodes/proxy &lt;span class="nt"&gt;--all-namespaces&lt;/span&gt; &lt;span class="nt"&gt;--list&lt;/span&gt;

&lt;span class="c"&gt;# Step 5: Review suspicious role binding creation history&lt;/span&gt;
kubectl get events &lt;span class="nt"&gt;--field-selector&lt;/span&gt; &lt;span class="nv"&gt;reason&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;RoleBinding &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="nt"&gt;--sort-by&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'.lastTimestamp'&lt;/span&gt; | &lt;span class="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Microsoft's patch applies a &lt;strong&gt;deny-by-default authorization policy for nodes/proxy&lt;/strong&gt;, with only approved system users, groups, and kube-system service accounts exempted.&lt;/p&gt;

&lt;h2&gt;
  
  
  Managed Kubernetes Attack Surface — EKS vs AKS vs GKE
&lt;/h2&gt;

&lt;p&gt;While CVE-2026-33105 is AKS-specific, each managed Kubernetes service has structurally different attack surfaces. Multi-cloud organizations must understand each platform's unique risks.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Security Domain&lt;/th&gt;
&lt;th&gt;EKS (AWS)&lt;/th&gt;
&lt;th&gt;AKS (Azure)&lt;/th&gt;
&lt;th&gt;GKE (Google Cloud)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Identity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;IRSA → EKS Pod Identity&lt;/td&gt;
&lt;td&gt;Entra ID + Workload Identity Federation&lt;/td&gt;
&lt;td&gt;Workload Identity + Google Cloud IAM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Policy Engine&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;OPA Gatekeeper / Kyverno (self-managed)&lt;/td&gt;
&lt;td&gt;Azure Policy (OPA Gatekeeper-based)&lt;/td&gt;
&lt;td&gt;Policy Controller + Binary Authorization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Runtime Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GuardDuty EKS Runtime + Bottlerocket&lt;/td&gt;
&lt;td&gt;Defender for Containers&lt;/td&gt;
&lt;td&gt;GKE Sandbox (gVisor) + Security Posture Dashboard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Network Isolation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;VPC CNI + Security Groups for Pods&lt;/td&gt;
&lt;td&gt;Azure CNI + NSG + Azure Firewall&lt;/td&gt;
&lt;td&gt;Dataplane V2 (Cilium) + Private Cluster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Secrets Management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Secrets Manager + CSI Driver&lt;/td&gt;
&lt;td&gt;Key Vault + CSI Driver&lt;/td&gt;
&lt;td&gt;Secret Manager + CSI Driver&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Image Signing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ECR Image Scanning + Cosign&lt;/td&gt;
&lt;td&gt;ACR + Notation (ORAS)&lt;/td&gt;
&lt;td&gt;Binary Authorization (native signing)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Zero Trust&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Zero Operator Access (independently audited)&lt;/td&gt;
&lt;td&gt;Entra ID Conditional Access&lt;/td&gt;
&lt;td&gt;BeyondCorp Enterprise integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Unique Risk&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;IMDSv1 metadata exposure&lt;/td&gt;
&lt;td&gt;CVE-2026-33105 (nodes/proxy bypass)&lt;/td&gt;
&lt;td&gt;Sys:All risk (any Google account = authenticated)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Notably, GKE's &lt;strong&gt;Sys:All&lt;/strong&gt; issue treats &lt;strong&gt;any valid Google account&lt;/strong&gt; as an authenticated entity through OpenID Connect. In clusters where the &lt;code&gt;system:authenticated&lt;/code&gt; group has excessive permissions, any attacker with a Google account can take over the cluster.&lt;/p&gt;

&lt;h2&gt;
  
  
  Zero Trust Kubernetes — 5-Layer Defense Architecture
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Layer 1: Workload Identity — Cryptographic Workload Authentication
&lt;/h3&gt;

&lt;p&gt;The first Zero Trust principle is &lt;strong&gt;assigning a verifiable identity to every workload&lt;/strong&gt;. Sharing default ServiceAccounts maximizes the blast radius of vulnerabilities like CVE-2026-33105. Map a dedicated ServiceAccount 1:1 to each Deployment/StatefulSet and federate with cloud IAM.&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;# EKS Pod Identity&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ServiceAccount&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;order-service&lt;/span&gt;              &lt;span class="c1"&gt;# 1 Deployment = 1 ServiceAccount&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;production&lt;/span&gt;
  &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;eks.amazonaws.com/role-arn&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;arn:aws:iam::123456789012:role/order-service-role&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="c1"&gt;# AKS Workload Identity&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ServiceAccount&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;order-service&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;production&lt;/span&gt;
  &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;azure.workload.identity/client-id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;MANAGED_IDENTITY_CLIENT_ID&amp;gt;&lt;/span&gt;
  &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;azure.workload.identity/use&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;true"&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="c1"&gt;# GKE Workload Identity&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ServiceAccount&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;order-service&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;production&lt;/span&gt;
  &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;iam.gke.io/gcp-service-account&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;order-service@project-id.iam.gserviceaccount.com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adding &lt;strong&gt;SPIFFE/SPIRE&lt;/strong&gt; enables cloud-agnostic cryptographic workload IDs (X.509 SVIDs) for consistent identity across multi-cloud environments.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 2: Least-Privilege RBAC — Eliminating cluster-admin
&lt;/h3&gt;

&lt;p&gt;The biggest lesson from CVE-2026-33105 is that &lt;strong&gt;excessive RBAC bindings determine the blast radius&lt;/strong&gt;. Organizations with properly configured RBAC reduced security incidents by &lt;strong&gt;64%&lt;/strong&gt; and achieved &lt;strong&gt;47% faster&lt;/strong&gt; incident remediation.&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;# ❌ Anti-pattern: cluster-admin for developers&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;rbac.authorization.k8s.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ClusterRoleBinding&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;dev-team-admin&lt;/span&gt;
&lt;span class="na"&gt;roleRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ClusterRole&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cluster-admin&lt;/span&gt;      &lt;span class="c1"&gt;# Never do this&lt;/span&gt;

&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="c1"&gt;# ✅ Best Practice: namespace-scoped least privilege&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;rbac.authorization.k8s.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Role&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app-developer&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;team-alpha&lt;/span&gt;
&lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;apiGroups&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;apps"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;deployments"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;replicasets"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;verbs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;get"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;list"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;watch"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;create"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;update"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;patch"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;apiGroups&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pods"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pods/log"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;services"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;configmaps"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;verbs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;get"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;list"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;watch"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="c1"&gt;# No nodes/proxy, no secrets direct access&lt;/span&gt;
  &lt;span class="c1"&gt;# delete requires separate approval process&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Layer 3: Network Microsegmentation
&lt;/h3&gt;

&lt;p&gt;The core of Zero Trust networking is a &lt;strong&gt;Default Deny&lt;/strong&gt; policy. Only explicitly allowed traffic passes; everything else is blocked.&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;# Default Deny — block all traffic in namespace&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;networking.k8s.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;NetworkPolicy&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;default-deny-all&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;production&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;podSelector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;             &lt;span class="c1"&gt;# Apply to all Pods&lt;/span&gt;
  &lt;span class="na"&gt;policyTypes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Ingress&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Egress&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="c1"&gt;# Explicit Allow — only order-service → payment-service&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;networking.k8s.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;NetworkPolicy&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;allow-order-to-payment&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;production&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;podSelector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;payment-service&lt;/span&gt;
  &lt;span class="na"&gt;ingress&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;podSelector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;order-service&lt;/span&gt;
      &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;TCP&lt;/span&gt;
          &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8080&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Layer 4: Runtime Security — eBPF-Based Detection
&lt;/h3&gt;

&lt;p&gt;While RBAC and network policies are &lt;strong&gt;prevention&lt;/strong&gt; layers, zero-days like CVE-2026-33105 can be exploited before patches. Runtime security is the &lt;strong&gt;detection and response&lt;/strong&gt; layer.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;Strength&lt;/th&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tetragon&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;eBPF kernel-level observation&lt;/td&gt;
&lt;td&gt;Real-time process execution, file access, network flow monitoring&lt;/td&gt;
&lt;td&gt;Runtime policy violation detection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Falco&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;eBPF + rule engine&lt;/td&gt;
&lt;td&gt;Community rules ecosystem, CNCF graduated&lt;/td&gt;
&lt;td&gt;Anomaly detection and alerting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;KubeArmor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;LSM + eBPF&lt;/td&gt;
&lt;td&gt;Fine-grained file/process/network policy enforcement&lt;/td&gt;
&lt;td&gt;Container runtime behavior restriction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Trivy Operator&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vulnerability scanning&lt;/td&gt;
&lt;td&gt;Continuous image/config/RBAC scanning&lt;/td&gt;
&lt;td&gt;Pre-emptive vulnerability detection&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Layer 5: Supply Chain Security — Image Signing and Admission Control
&lt;/h3&gt;

&lt;p&gt;With Kubernetes token theft surging 282%, supply chain attacks deploying malicious container images are also increasing. Validate image signatures at admission webhooks and block unsigned deployments.&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;# Kyverno policy — block unsigned image deployment&lt;/span&gt;
&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kyverno.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ClusterPolicy&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;require-image-signature&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;validationFailureAction&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Enforce&lt;/span&gt;
  &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;verify-cosign-signature&lt;/span&gt;
      &lt;span class="na"&gt;match&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;any&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;kinds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;Pod&lt;/span&gt;
      &lt;span class="na"&gt;verifyImages&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;imageReferences&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;registry.company.io/*"&lt;/span&gt;
          &lt;span class="na"&gt;attestors&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;entries&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;keys&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
                    &lt;span class="na"&gt;publicKeys&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|-&lt;/span&gt;
                      &lt;span class="s"&gt;-----BEGIN PUBLIC KEY-----&lt;/span&gt;
                      &lt;span class="s"&gt;MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE...&lt;/span&gt;
                      &lt;span class="s"&gt;-----END PUBLIC KEY-----&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Production Implementation — Multi-Cloud Security Automation Pipeline
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# CI/CD Security Automation Pipeline (GitHub Actions)&lt;/span&gt;

&lt;span class="c"&gt;# Step 1: Image build + vulnerability scan&lt;/span&gt;
docker build &lt;span class="nt"&gt;-t&lt;/span&gt; registry.company.io/app:&lt;span class="nv"&gt;$SHA&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
trivy image &lt;span class="nt"&gt;--severity&lt;/span&gt; HIGH,CRITICAL &lt;span class="nt"&gt;--exit-code&lt;/span&gt; 1 registry.company.io/app:&lt;span class="nv"&gt;$SHA&lt;/span&gt;

&lt;span class="c"&gt;# Step 2: Image signing (Cosign + Sigstore)&lt;/span&gt;
cosign sign &lt;span class="nt"&gt;--key&lt;/span&gt; cosign.key registry.company.io/app:&lt;span class="nv"&gt;$SHA&lt;/span&gt;

&lt;span class="c"&gt;# Step 3: SBOM generation + attestation&lt;/span&gt;
syft registry.company.io/app:&lt;span class="nv"&gt;$SHA&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; spdx-json &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; sbom.json
cosign attest &lt;span class="nt"&gt;--predicate&lt;/span&gt; sbom.json &lt;span class="nt"&gt;--type&lt;/span&gt; spdxjson &lt;span class="nt"&gt;--key&lt;/span&gt; cosign.key registry.company.io/app:&lt;span class="nv"&gt;$SHA&lt;/span&gt;

&lt;span class="c"&gt;# Step 4: K8s manifest security scan (RBAC/NetworkPolicy validation)&lt;/span&gt;
kubescape scan k8s-manifests/ &lt;span class="nt"&gt;--framework&lt;/span&gt; nsa,mitre &lt;span class="nt"&gt;--fail-threshold&lt;/span&gt; 50

&lt;span class="c"&gt;# Step 5: Deploy (ArgoCD sync — Kyverno auto-verifies signatures)&lt;/span&gt;
argocd app &lt;span class="nb"&gt;sync &lt;/span&gt;production-app &lt;span class="nt"&gt;--prune&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2026 Managed K8s Threat Landscape
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Threat Category&lt;/th&gt;
&lt;th&gt;Key Examples&lt;/th&gt;
&lt;th&gt;Mitigation Strategy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Authorization Bypass / Privilege Escalation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;CVE-2026-33105 (AKS), Sys:All (GKE)&lt;/td&gt;
&lt;td&gt;Least-privilege RBAC + Workload Identity + Regular audits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Supply Chain Attacks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Malicious Helm charts, Infected operators/CRDs&lt;/td&gt;
&lt;td&gt;Image signing (Cosign) + Binary Authorization + SBOM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Credential Harvesting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;TeamPCP worm, K8s token theft (282% increase)&lt;/td&gt;
&lt;td&gt;Short-lived tokens + External secret stores (Vault) + IMDSv2 enforcement&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;strong&gt;TeamPCP worm&lt;/strong&gt; is a 2026 threat that automatically detects Kubernetes clusters and drops specialized payloads to harvest cluster credentials. Counter this by minimizing token lifetimes, managing all secrets through external stores like HashiCorp Vault, and enforcing IMDSv2 on AWS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security Maturity Self-Assessment Checklist
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Required Items&lt;/th&gt;
&lt;th&gt;Verification Method&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Identity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Workload Identity 1:1 mapping, OIDC/SSO&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;kubectl get sa -A&lt;/code&gt; → Check Pods using default SA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RBAC&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No human cluster-admin bindings, namespace-scoped roles&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;kubectl auth can-i --list&lt;/code&gt; → Identify over-privileges&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Network&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Default Deny policies, explicit allow only&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;kubectl get netpol -A&lt;/code&gt; → Find namespaces without policies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Runtime&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;eBPF-based detection (Tetragon/Falco) operational&lt;/td&gt;
&lt;td&gt;Monitor Falco rule hit rates + response times&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Supply Chain&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Image signature verification, SBOM, admission blocking&lt;/td&gt;
&lt;td&gt;Attempt unsigned image deployment → Verify block&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusion: Security Beyond Patching
&lt;/h2&gt;

&lt;p&gt;CVE-2026-33105 isn't simply solved by applying a patch. It received a CVSS 10.0 rating because when &lt;strong&gt;excessive RBAC bindings + absent network isolation + inadequate runtime monitoring&lt;/strong&gt; combine, a single authorization bypass leads to full infrastructure compromise.&lt;/p&gt;

&lt;p&gt;Managed Kubernetes security is a &lt;strong&gt;shared responsibility&lt;/strong&gt; between cloud providers and customers. Microsoft fixing the AKS nodes/proxy authorization logic is the provider's responsibility, but applying least-privilege RBAC, network microsegmentation, and runtime security detection falls on the customer. Implement the 5-layer Zero Trust framework — Workload Identity, least-privilege RBAC, Default Deny network policies, eBPF runtime security, and supply chain signature verification — to build proactive defenses before the next CVE is disclosed.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;AI Disclosure: This article was written and reviewed by the ManoIT engineering team with research assistance from AI (Claude Opus 4.6, Anthropic). Technical accuracy was cross-verified against official documentation and CVE databases. Always test in your own environment before applying in production.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://www.manoit.co.kr/forum/view/1449295" rel="noopener noreferrer"&gt;ManoIT Tech Blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>kubernetes</category>
      <category>devops</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Complete Guide to GitHub Actions 2026 Security Roadmap — Dependency Locking, Native Egress Firewall, and Scoped Secrets</title>
      <dc:creator>daniel jeong</dc:creator>
      <pubDate>Tue, 07 Apr 2026 00:20:29 +0000</pubDate>
      <link>https://dev.to/x4nent/complete-guide-to-github-actions-2026-security-roadmap-dependency-locking-native-egress-5aap</link>
      <guid>https://dev.to/x4nent/complete-guide-to-github-actions-2026-security-roadmap-dependency-locking-native-egress-5aap</guid>
      <description>&lt;h1&gt;
  
  
  Complete Guide to GitHub Actions 2026 Security Roadmap — Dependency Locking, Native Egress Firewall, and Scoped Secrets to Block Supply Chain Attacks
&lt;/h1&gt;

&lt;p&gt;In March 2025, the &lt;strong&gt;tj-actions/changed-files&lt;/strong&gt; supply chain attack compromised &lt;strong&gt;over 23,000 repositories&lt;/strong&gt;. Attackers stole a PAT from reviewdog/action-setup, repointed all tj-actions version tags to malicious code, and exfiltrated CI/CD secrets — including credentials from Coinbase — through workflow logs. This incident exposed the structural vulnerabilities of the GitHub Actions ecosystem: &lt;strong&gt;mutable references&lt;/strong&gt; causing non-deterministic execution, unrestricted network egress, and excessive secret inheritance.&lt;/p&gt;

&lt;p&gt;In response, GitHub published its &lt;strong&gt;2026 Security Roadmap&lt;/strong&gt; — introducing workflow dependency locking, a Layer 7 native egress firewall, scoped secrets, policy-driven execution controls, Actions Data Stream, and OIDC custom property claims (GA as of April 2026). This guide provides a deep dive into each feature's architecture, practical implementation, and migration strategy.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Structural Vulnerabilities Exposed by tj-actions
&lt;/h2&gt;

&lt;p&gt;Understanding the 2026 security roadmap requires examining &lt;strong&gt;why&lt;/strong&gt; such a large-scale supply chain attack was possible. The tj-actions attack chain progressed through five stages:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Attack Action&lt;/th&gt;
&lt;th&gt;Exploited Vulnerability&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1. Initial Compromise&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;spotbugs/sonar-findbugs vulnerability exposed a contributor's PAT&lt;/td&gt;
&lt;td&gt;Long-lived tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2. Lateral Movement&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stolen PAT used to access spotbugs/spotbugs repository&lt;/td&gt;
&lt;td&gt;Excessive token scope&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3. Credential Theft&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Malicious workflows leaked additional PATs&lt;/td&gt;
&lt;td&gt;Unrestricted egress + secret exposure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4. Dependency Poisoning&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;reviewdog/action-setup → tj-actions/eslint-changed-files cascading infection&lt;/td&gt;
&lt;td&gt;Mutable tag references + opaque transitive dependencies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;5. Mass Propagation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;All tj-actions version tags repointed to malicious commit&lt;/td&gt;
&lt;td&gt;Runtime mutable tag resolution, 23,000+ repos affected&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;GitHub's security team summarized the pattern: &lt;em&gt;"Vulnerabilities allow untrusted code execution, malicious workflows run without observability or control, compromised dependencies spread across thousands of repositories, over-permissioned credentials get exfiltrated via unrestricted network access."&lt;/em&gt; The 2026 roadmap is designed to break each link in this attack chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Workflow Dependency Locking — Deterministic Execution Like go.mod
&lt;/h2&gt;

&lt;p&gt;The biggest security gap in GitHub Actions today is that dependencies are resolved at &lt;strong&gt;runtime using mutable references&lt;/strong&gt; (tags, branches). Writing &lt;code&gt;uses: actions/checkout@v4&lt;/code&gt; means the commit pointed to by the v4 tag can change at any time. The tj-actions attack exploited exactly this vulnerability.&lt;/p&gt;

&lt;h3&gt;
  
  
  The New dependencies Section
&lt;/h3&gt;

&lt;p&gt;GitHub introduces a &lt;code&gt;dependencies:&lt;/code&gt; section in workflow YAML — the same concept as Go's &lt;code&gt;go.mod + go.sum&lt;/code&gt; — that locks both direct and transitive dependencies using commit SHAs.&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;# .github/workflows/ci.yml — Dependency locking example&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;CI Pipeline&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# New dependencies section: all Actions locked to commit SHAs&lt;/span&gt;
&lt;span class="na"&gt;dependencies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;actions/checkout&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v4.2.2&lt;/span&gt;
    &lt;span class="na"&gt;sha&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;11bd71901bbe5b1630ceea73d27597364c9af683&lt;/span&gt;
  &lt;span class="na"&gt;actions/setup-node&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v4.1.0&lt;/span&gt;
    &lt;span class="na"&gt;sha&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;39370e3970a6d050c480ffad4ff0ed4d3fdee5af&lt;/span&gt;
  &lt;span class="c1"&gt;# Transitive dependencies also automatically locked&lt;/span&gt;
  &lt;span class="na"&gt;actions/cache&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v4.2.0&lt;/span&gt;
    &lt;span class="na"&gt;sha&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;d4323d4df104b026c6a166049fb557cb5d0bedfc&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;  &lt;span class="c1"&gt;# SHA auto-resolved from dependencies&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;22&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three key characteristics define this feature. First, &lt;strong&gt;deterministic execution&lt;/strong&gt; ensures every workflow runs the exact code that was reviewed. Second, dependency changes automatically appear in PR diffs, enabling &lt;strong&gt;reviewable updates&lt;/strong&gt;. Third, hash mismatches halt execution before jobs run through &lt;strong&gt;preemptive blocking&lt;/strong&gt;. The system transitively tracks nested dependencies inside composite actions, providing full visibility into previously opaque dependency chains.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Comparison&lt;/th&gt;
&lt;th&gt;Current (Tag References)&lt;/th&gt;
&lt;th&gt;New (Dependency Locking)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Reference method&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;@v4&lt;/code&gt; (mutable tag)&lt;/td&gt;
&lt;td&gt;Commit SHA pinned (immutable)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transitive deps&lt;/td&gt;
&lt;td&gt;Opaque (runtime resolution)&lt;/td&gt;
&lt;td&gt;Full tree visibility&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Change detection&lt;/td&gt;
&lt;td&gt;Impossible&lt;/td&gt;
&lt;td&gt;Auto-shown in PR diffs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hash mismatch&lt;/td&gt;
&lt;td&gt;Runs without detection&lt;/td&gt;
&lt;td&gt;Halts before execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Management tool&lt;/td&gt;
&lt;td&gt;Manual SHA pinning&lt;/td&gt;
&lt;td&gt;GitHub CLI auto-resolution/update&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Timeline:&lt;/strong&gt; Public preview within 3-6 months, GA within 6 months. Future plans include deprecating mutable references entirely in favor of &lt;strong&gt;immutable releases&lt;/strong&gt;, creating a central enforcement point for detecting and blocking malicious code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Native Egress Firewall — Blocking Data Exfiltration at Layer 7
&lt;/h2&gt;

&lt;p&gt;In the tj-actions attack, stolen secrets were transmitted to attacker servers through &lt;strong&gt;unrestricted outbound network access&lt;/strong&gt;. Currently, GitHub-hosted runners allow network access to all external destinations by default — once an attacker gains root, any data can be exfiltrated.&lt;/p&gt;

&lt;h3&gt;
  
  
  Layer 7 Firewall Outside the Runner VM
&lt;/h3&gt;

&lt;p&gt;GitHub's native egress firewall operates &lt;strong&gt;outside&lt;/strong&gt; the runner VM at Layer 7. This means even if an attacker gains root access inside the runner, the firewall cannot be bypassed. This is fundamentally different from third-party solutions (like StepSecurity Harden-Runner) that operate inside the runner.&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;# Egress firewall policy example (expected configuration)&lt;/span&gt;
&lt;span class="na"&gt;egress-policy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;enforce&lt;/span&gt;  &lt;span class="c1"&gt;# monitor | enforce&lt;/span&gt;
  &lt;span class="na"&gt;allowed-domains&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;github.com&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*.githubusercontent.com"&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;registry.npmjs.org&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;pypi.org&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;files.pythonhosted.org&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker.io&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*.docker.io"&lt;/span&gt;
  &lt;span class="na"&gt;blocked&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;all&lt;/span&gt;  &lt;span class="c1"&gt;# Block all traffic outside allowlist&lt;/span&gt;
  &lt;span class="na"&gt;log-level&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;detailed&lt;/span&gt;  &lt;span class="c1"&gt;# Auto-correlate with workflow/job/step context&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The firewall operates in two modes. &lt;strong&gt;Monitor mode&lt;/strong&gt; audits all outbound traffic, automatically correlating it with workflow run/job/step context and initiating commands. &lt;strong&gt;Enforce mode&lt;/strong&gt; blocks traffic not explicitly permitted, with fine-grained control over domains/IP ranges, HTTP methods, and TLS/protocol requirements.&lt;/p&gt;

&lt;p&gt;GitHub's recommended adoption path: Start with Monitor mode to observe real traffic patterns → Build allowlists from real data → Switch to Enforce mode with confidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Timeline:&lt;/strong&gt; Public preview within 6-9 months. Future plans include process-level visibility, file system monitoring, and near real-time enforcement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scoped Secrets and Policy-Driven Execution Controls
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Scoped Secrets — Applying the Principle of Least Privilege
&lt;/h3&gt;

&lt;p&gt;Currently, GitHub Actions secrets inherit implicitly through repository/organization scope. In reusable workflows, &lt;code&gt;secrets: inherit&lt;/code&gt; is the default, meaning all caller secrets flow into called workflows. This maximizes the blast radius in supply chain attacks like tj-actions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scoped secrets&lt;/strong&gt; bind credentials to explicit execution contexts:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scope Criteria&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Repository/Organization&lt;/td&gt;
&lt;td&gt;Allow access only in specific repos/orgs&lt;/td&gt;
&lt;td&gt;Bind AWS keys to prod repo only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Branch/Environment&lt;/td&gt;
&lt;td&gt;Usable only in specific branches or Environments&lt;/td&gt;
&lt;td&gt;Production secrets on main branch only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workflow ID/Path&lt;/td&gt;
&lt;td&gt;Access only from specific workflow files&lt;/td&gt;
&lt;td&gt;Only deploy.yml accesses cloud credentials&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Trusted reusable workflows&lt;/td&gt;
&lt;td&gt;Only explicitly designated reusable workflows&lt;/td&gt;
&lt;td&gt;Only internal org deploy workflows allowed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A critical change: secrets &lt;strong&gt;no longer automatically inherit&lt;/strong&gt; in reusable workflows. Instead of callers implicitly passing credentials, only explicitly scoped secrets are accessible. Additionally, write permission no longer includes secret management capability — this is separated into a &lt;strong&gt;dedicated custom role&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Policy-Driven Execution Controls — Ruleset Framework
&lt;/h3&gt;

&lt;p&gt;GitHub extends its existing repository Rulesets framework to provide &lt;strong&gt;centralized policy-driven execution control&lt;/strong&gt; over workflows themselves.&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;# Workflow execution policy example (Ruleset-based)&lt;/span&gt;
&lt;span class="na"&gt;workflow-rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# Actor Rules: who can trigger workflows&lt;/span&gt;
  &lt;span class="na"&gt;actor-rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;allowed&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;maintainers&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;admin&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# Contributors can't manually trigger&lt;/span&gt;
    &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;allowed&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;all&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# PR events allowed from all contributors&lt;/span&gt;

  &lt;span class="c1"&gt;# Event Rules: which events can execute workflows&lt;/span&gt;
  &lt;span class="na"&gt;event-rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;blocked-events&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;pull_request_target&lt;/span&gt;  &lt;span class="c1"&gt;# Block dangerous events&lt;/span&gt;
    &lt;span class="na"&gt;trusted-automation&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;github-actions[bot]&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;dependabot[bot]&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;copilot[bot]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Actor Rules&lt;/strong&gt; define who can trigger workflows, and &lt;strong&gt;Event Rules&lt;/strong&gt; define which GitHub Actions events are allowed to execute. For example, blocking &lt;code&gt;pull_request_target&lt;/code&gt; prevents external code from running in the base repo context with secret access. An &lt;strong&gt;Evaluate mode&lt;/strong&gt; lets you monitor policy violations before enforcement.&lt;/p&gt;

&lt;h2&gt;
  
  
  OIDC Custom Claims GA and Artifact Attestations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  OIDC Repository Custom Properties — GA April 2026
&lt;/h3&gt;

&lt;p&gt;As of April 2, 2026, &lt;strong&gt;repository custom property claims&lt;/strong&gt; in GitHub Actions OIDC tokens are generally available. Previously, cloud provider trust policies (AWS, Azure, GCP) could only be set based on repository names. Now, organization-level custom property values can be used as OIDC claims.&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;# AWS IAM trust policy — Using OIDC custom properties&lt;/span&gt;
&lt;span class="c1"&gt;# Group-based control instead of per-repository configuration&lt;/span&gt;
&lt;span class="na"&gt;Statement&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Effect&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Allow&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;sts:AssumeRoleWithWebIdentity&lt;/span&gt;
    &lt;span class="na"&gt;Condition&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;StringEquals&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# New: Category-based control via custom properties&lt;/span&gt;
        &lt;span class="na"&gt;token.actions.githubusercontent.com:repository_properties.environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;production&lt;/span&gt;
        &lt;span class="na"&gt;token.actions.githubusercontent.com:repository_properties.team&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;platform&lt;/span&gt;
        &lt;span class="na"&gt;token.actions.githubusercontent.com:repository_properties.compliance_tier&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sox&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The practical benefit: trust policies can be aligned with organizational governance models — environment type (production/staging/dev), team ownership, compliance tier — drastically reducing per-repository configuration overhead.&lt;/p&gt;

&lt;h3&gt;
  
  
  Artifact Attestations — SLSA Build Level 3
&lt;/h3&gt;

&lt;p&gt;GitHub Artifact Attestations &lt;strong&gt;cryptographically bind&lt;/strong&gt; build artifacts (container images, binaries) to source repositories and build workflows, achieving &lt;strong&gt;SLSA Build Level 3&lt;/strong&gt; security — providing unfalsifiable proof of software provenance and integrity.&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;# Artifact Attestation workflow&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build and Attest&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;v*'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;id-token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;       &lt;span class="c1"&gt;# OIDC token issuance&lt;/span&gt;
  &lt;span class="na"&gt;attestations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;   &lt;span class="c1"&gt;# Attestation creation&lt;/span&gt;
  &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;read&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build container image&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker build -t myapp:${{ github.ref_name }} .&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Generate SLSA provenance attestation&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/attest-build-provenance@v2&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;subject-name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ghcr.io/${{ github.repository }}/myapp&lt;/span&gt;
          &lt;span class="na"&gt;subject-digest&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sha256:${{ steps.build.outputs.digest }}&lt;/span&gt;
          &lt;span class="na"&gt;push-to-registry&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;Combined with the Code-to-Cloud Traceability feature (GA January 2026), you can trace an artifact's entire lifecycle — build → store → deploy → production — and filter security alerts by production exposure context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Actions Data Stream — Centralized Telemetry
&lt;/h2&gt;

&lt;p&gt;Individual workflow logs aren't enough to assess organization-wide CI/CD security posture. &lt;strong&gt;Actions Data Stream&lt;/strong&gt; streams near real-time workflow execution data from all repositories/organizations to centralized destinations.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Supported destinations&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Amazon S3, Azure Event Hub, Azure Data Explorer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Streamed data&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Workflow/job execution, dependency resolution, Action usage patterns, network activity (future)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Delivery guarantee&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;At-least-once, batched events, standardized schema&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Use cases&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SIEM integration, anomaly detection, compliance auditing, cost analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Timeline&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Public preview 3-6 months, GA 6-9 months&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Security Hardening Checklist — Apply Today
&lt;/h2&gt;

&lt;p&gt;Even before the 2026 roadmap features reach GA, here are immediately actionable security measures:&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;# Hardened CI workflow template — apply now&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Hardened CI&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# 1. Global least privilege&lt;/span&gt;
&lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{}&lt;/span&gt;  &lt;span class="c1"&gt;# Remove all default permissions&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="c1"&gt;# 2. Job-level minimum permissions&lt;/span&gt;
    &lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;read&lt;/span&gt;
      &lt;span class="na"&gt;id-token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write&lt;/span&gt;  &lt;span class="c1"&gt;# For OIDC&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="c1"&gt;# 3. Pin Actions to commit SHA (not tags)&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683&lt;/span&gt;  &lt;span class="c1"&gt;# v4.2.2&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;persist-credentials&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;  &lt;span class="c1"&gt;# 4. Don't leave credentials in .git/config&lt;/span&gt;

      &lt;span class="c1"&gt;# 5. OIDC short-lived tokens for cloud auth (not long-lived keys)&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;role-to-assume&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;arn:aws:iam::123456789012:role/github-actions&lt;/span&gt;
          &lt;span class="na"&gt;aws-region&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;us-east-1&lt;/span&gt;

      &lt;span class="c1"&gt;# 6. Pass secrets individually at step level&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;DB_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.DB_PASSWORD }}&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./deploy.sh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Priority&lt;/th&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Attack Blocked&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;P0&lt;/td&gt;
&lt;td&gt;Global &lt;code&gt;permissions: {}&lt;/code&gt; + job-level minimum&lt;/td&gt;
&lt;td&gt;Excessive permission abuse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P0&lt;/td&gt;
&lt;td&gt;Third-party Action commit SHA pinning&lt;/td&gt;
&lt;td&gt;Tag repointing attacks (tj-actions type)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P0&lt;/td&gt;
&lt;td&gt;Switch to OIDC short-lived tokens for cloud auth&lt;/td&gt;
&lt;td&gt;Long-lived credential theft&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;td&gt;Set &lt;code&gt;persist-credentials: false&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;.git/config credential exposure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;td&gt;Organization-level default permissions read-only&lt;/td&gt;
&lt;td&gt;Default read-write abuse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P1&lt;/td&gt;
&lt;td&gt;Enable Artifact Attestations&lt;/td&gt;
&lt;td&gt;Artifact tampering/provenance forgery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P2&lt;/td&gt;
&lt;td&gt;Remove &lt;code&gt;secrets: inherit&lt;/code&gt;, switch to explicit passing&lt;/td&gt;
&lt;td&gt;Excessive secret exposure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P2&lt;/td&gt;
&lt;td&gt;Scan workflows with CodeQL&lt;/td&gt;
&lt;td&gt;Script injection, dangerous patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P2&lt;/td&gt;
&lt;td&gt;Add zizmor static analysis&lt;/td&gt;
&lt;td&gt;Common Actions misconfigurations&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Roadmap Timeline and Migration Strategy
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Public Preview&lt;/th&gt;
&lt;th&gt;Expected GA&lt;/th&gt;
&lt;th&gt;Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Workflow dependency locking&lt;/td&gt;
&lt;td&gt;Q2-Q3 2026&lt;/td&gt;
&lt;td&gt;Q3-Q4 2026&lt;/td&gt;
&lt;td&gt;High — workflow YAML changes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Policy-driven execution controls&lt;/td&gt;
&lt;td&gt;Q2-Q3 2026&lt;/td&gt;
&lt;td&gt;Q3-Q4 2026&lt;/td&gt;
&lt;td&gt;Medium — admin settings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scoped secrets&lt;/td&gt;
&lt;td&gt;Q2-Q3 2026&lt;/td&gt;
&lt;td&gt;Q3-Q4 2026&lt;/td&gt;
&lt;td&gt;High — secret architecture redesign&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Actions Data Stream&lt;/td&gt;
&lt;td&gt;Q2-Q3 2026&lt;/td&gt;
&lt;td&gt;Q4 2026-Q1 2027&lt;/td&gt;
&lt;td&gt;Low — observation only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Native egress firewall&lt;/td&gt;
&lt;td&gt;Q3-Q4 2026&lt;/td&gt;
&lt;td&gt;H1 2027&lt;/td&gt;
&lt;td&gt;High — network access review&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Migration strategy:&lt;/strong&gt; All features offer Evaluate/Monitor modes first, enabling gradual adoption. Start by enabling Actions Data Stream for visibility into current pipelines, apply dependency locking to critical repos first, then begin egress firewall in Monitor mode to understand traffic patterns before switching to Enforce mode.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: The Era of Secure-by-Default CI/CD
&lt;/h2&gt;

&lt;p&gt;The GitHub Actions 2026 Security Roadmap isn't just a feature update — it's a paradigm shift in CI/CD security. Until now, CI/CD security depended on individual workflow authors' diligence. The new roadmap implements &lt;strong&gt;secure-by-default at the platform level&lt;/strong&gt;: dependency locking ensures deterministic execution, the egress firewall blocks data exfiltration at its source, and scoped secrets enforce the principle of least privilege.&lt;/p&gt;

&lt;p&gt;Most importantly, all these features can be adopted &lt;strong&gt;gradually without redesigning existing architectures&lt;/strong&gt;. Start today with SHA pinning, OIDC migration, and minimum permission settings. As roadmap features reach preview, apply them in Evaluate/Monitor mode. When the next supply chain attack hits, your pipeline will be ready.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;AI Disclosure: This article was written by ManoIT's automated tech blog system using Claude (Anthropic) for research, writing, and verification. All facts were cross-referenced with official documentation.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sources: &lt;a href="https://github.blog/news-insights/product-news/whats-coming-to-our-github-actions-2026-security-roadmap/" rel="noopener noreferrer"&gt;GitHub Blog — Actions 2026 Security Roadmap&lt;/a&gt; · &lt;a href="https://github.blog/changelog/2026-04-02-github-actions-early-april-2026-updates/" rel="noopener noreferrer"&gt;GitHub Changelog — April 2026 Updates&lt;/a&gt; · &lt;a href="https://github.blog/changelog/2026-01-20-strengthen-your-supply-chain-with-code-to-cloud-traceability-and-slsa-build-level-3-security/" rel="noopener noreferrer"&gt;GitHub — SLSA Build Level 3&lt;/a&gt; · &lt;a href="https://www.wiz.io/blog/github-actions-security-guide" rel="noopener noreferrer"&gt;Wiz — GitHub Actions Security Guide&lt;/a&gt; · &lt;a href="https://unit42.paloaltonetworks.com/github-actions-supply-chain-attack/" rel="noopener noreferrer"&gt;Unit 42 — tj-actions Supply Chain Attack&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://www.manoit.co.kr/forum/view/1447149" rel="noopener noreferrer"&gt;ManoIT Tech Blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>github</category>
      <category>cicd</category>
      <category>devops</category>
      <category>security</category>
    </item>
    <item>
      <title>Complete Guide to MCP (Model Context Protocol) in 2026 — Architecture, Implementation, and Enterprise Roadmap</title>
      <dc:creator>daniel jeong</dc:creator>
      <pubDate>Sun, 05 Apr 2026 21:09:08 +0000</pubDate>
      <link>https://dev.to/x4nent/complete-guide-to-mcp-model-context-protocol-in-2026-architecture-implementation-and-4a11</link>
      <guid>https://dev.to/x4nent/complete-guide-to-mcp-model-context-protocol-in-2026-architecture-implementation-and-4a11</guid>
      <description>&lt;h1&gt;
  
  
  Complete Guide to MCP (Model Context Protocol) in 2026 — Architecture, Implementation, and Enterprise Roadmap for AI Agent Integration
&lt;/h1&gt;

&lt;p&gt;In November 2024, Anthropic open-sourced the &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt;, and in just 18 months it has become the de facto standard for AI agent integration. As of March 2026, MCP has surpassed &lt;strong&gt;97 million monthly SDK downloads&lt;/strong&gt;, earned over 81,000 GitHub stars, and is supported by every major AI vendor — Anthropic, OpenAI, Google, Microsoft, and AWS. MCP standardizes how AI models interact with external tools, data sources, and systems, earning the nickname "the USB-C of the AI world."&lt;/p&gt;

&lt;p&gt;This guide covers everything you need to deploy MCP in production: core architecture, Streamable HTTP transport, OAuth 2.1 authentication, FastMCP server implementation, A2A protocol comparison, and the 2026 enterprise roadmap.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP Core Architecture — Host, Client, Server Three-Layer Model
&lt;/h2&gt;

&lt;p&gt;MCP uses a &lt;strong&gt;client-server architecture built on JSON-RPC 2.0&lt;/strong&gt;. A single host application (Claude Desktop, Claude Code, Cursor, etc.) creates multiple isolated MCP client sessions, each maintaining a stateful JSON-RPC channel with its own MCP server.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Examples&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MCP Host&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AI application providing LLM integration&lt;/td&gt;
&lt;td&gt;Claude Desktop, Claude Code, Cursor, Cline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MCP Client&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Connector created by the host, managing 1:1 sessions with servers&lt;/td&gt;
&lt;td&gt;Internal process (not exposed to users)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MCP Server&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Service providing external context and capabilities&lt;/td&gt;
&lt;td&gt;GitHub, Slack, PostgreSQL, Notion MCP servers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Three Server Primitives
&lt;/h3&gt;

&lt;p&gt;MCP servers expose external capabilities through three core primitives. &lt;strong&gt;Tools&lt;/strong&gt; are functions the model can invoke (e.g., file search, DB queries, API calls). &lt;strong&gt;Resources&lt;/strong&gt; are data sources the model can read (e.g., file contents, database records). &lt;strong&gt;Prompts&lt;/strong&gt; are pre-defined templates that guide user workflows.&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="c1"&gt;# MCP Server Three Primitives — FastMCP Example
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastmcp&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastMCP&lt;/span&gt;

&lt;span class="n"&gt;mcp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastMCP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my-service&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 1. Tool — Functions the model can call
&lt;/span&gt;&lt;span class="nd"&gt;@mcp.tool&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;search_database&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&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;limit&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;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&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="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Search the database by keyword.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 2. Resource — Data the model can read
&lt;/span&gt;&lt;span class="nd"&gt;@mcp.resource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;config://app-settings&lt;/span&gt;&lt;span class="sh"&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;get_settings&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Return application settings.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current_settings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 3. Prompt — Pre-defined workflow templates
&lt;/span&gt;&lt;span class="nd"&gt;@mcp.prompt&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;analyze_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataset_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="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Guide data analysis workflow.&lt;/span&gt;&lt;span class="sh"&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;Please analyze the following dataset: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;dataset_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Transport Layer — Evolution from stdio to Streamable HTTP
&lt;/h2&gt;

&lt;p&gt;MCP supports two transport modes. &lt;strong&gt;stdio&lt;/strong&gt; handles local inter-process communication and is the default for running local MCP servers in Claude Desktop or Claude Code. &lt;strong&gt;Streamable HTTP&lt;/strong&gt;, introduced in the November 2025 spec, replaces the legacy SSE (Server-Sent Events) transport and enables MCP servers to run as remote services.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;stdio&lt;/th&gt;
&lt;th&gt;Streamable HTTP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Deployment&lt;/td&gt;
&lt;td&gt;Local process (same machine as host)&lt;/td&gt;
&lt;td&gt;Remote service (cloud-deployable)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scalability&lt;/td&gt;
&lt;td&gt;Single instance&lt;/td&gt;
&lt;td&gt;Horizontal scaling with load balancers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authentication&lt;/td&gt;
&lt;td&gt;OS-level process isolation&lt;/td&gt;
&lt;td&gt;OAuth 2.1 + PKCE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use Cases&lt;/td&gt;
&lt;td&gt;Developer tools, local file access&lt;/td&gt;
&lt;td&gt;SaaS integrations, enterprise services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026 Status&lt;/td&gt;
&lt;td&gt;Stable (default in most IDEs)&lt;/td&gt;
&lt;td&gt;SSE officially deprecated, migrating to Streamable HTTP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The key evolution on the 2026 roadmap is &lt;strong&gt;stateless operation&lt;/strong&gt;. Current MCP servers must maintain session state, which limits horizontal scaling behind load balancers. The new spec standardizes session creation, resumption, and migration so server restarts and scale-out events are transparent to connected clients.&lt;/p&gt;

&lt;h2&gt;
  
  
  OAuth 2.1 Authentication and Enterprise Security
&lt;/h2&gt;

&lt;p&gt;Remote MCP servers adopted &lt;strong&gt;OAuth 2.1&lt;/strong&gt; as the authentication standard starting with the June 2025 spec. MCP servers are classified as OAuth Resource Servers and advertise their authorization server location through &lt;code&gt;.well-known&lt;/code&gt; endpoints. Clients must implement &lt;strong&gt;RFC 8707 Resource Indicators&lt;/strong&gt; to prevent token misuse attacks.&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;# MCP Server OAuth 2.1 Authentication Flow Configuration&lt;/span&gt;
&lt;span class="c1"&gt;# .well-known/mcp-server-metadata.json&lt;/span&gt;
&lt;span class="na"&gt;authorization_endpoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://auth.example.com/authorize"&lt;/span&gt;
&lt;span class="na"&gt;token_endpoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://auth.example.com/token"&lt;/span&gt;
&lt;span class="na"&gt;registration_endpoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://auth.example.com/register"&lt;/span&gt;

&lt;span class="c1"&gt;# OAuth 2.1 Client Requirements&lt;/span&gt;
&lt;span class="na"&gt;grant_types_supported&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;authorization_code&lt;/span&gt;   &lt;span class="c1"&gt;# PKCE required&lt;/span&gt;
&lt;span class="na"&gt;code_challenge_methods_supported&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;S256&lt;/span&gt;                  &lt;span class="c1"&gt;# SHA-256 hash (plain forbidden)&lt;/span&gt;
&lt;span class="na"&gt;token_endpoint_auth_methods_supported&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;none&lt;/span&gt;                  &lt;span class="c1"&gt;# Public client (browser-based agents)&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;client_secret_post&lt;/span&gt;    &lt;span class="c1"&gt;# Confidential client (server-side)&lt;/span&gt;

&lt;span class="c1"&gt;# Resource Indicator (RFC 8707) — Token scope restriction&lt;/span&gt;
&lt;span class="na"&gt;resource&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://mcp.example.com/v1"&lt;/span&gt;
&lt;span class="na"&gt;scope&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tools:read&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;tools:execute&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;resources:read"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Q2 2026 enterprise authentication roadmap adds PKCE flows for browser-based agents and SAML/OIDC integration for enterprise identity providers. Q4 brings the &lt;strong&gt;MCP Registry&lt;/strong&gt; — a curated, verified server directory with security audits, usage statistics, and SLA commitments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building Production MCP Servers with FastMCP
&lt;/h2&gt;

&lt;p&gt;FastMCP dramatically simplifies Python-based MCP server development. &lt;strong&gt;FastMCP 3.0&lt;/strong&gt;, released January 2026, handles schema generation, validation, and documentation with a single decorator. For TypeScript, combine &lt;code&gt;@modelcontextprotocol/sdk&lt;/code&gt; with Zod for type-safe server construction.&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="c1"&gt;# FastMCP 3.0 — Production MCP Server Example (Python)
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastmcp&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastMCP&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pydantic&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Field&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;

&lt;span class="n"&gt;mcp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastMCP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weather-service&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MCP server providing real-time weather information&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="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;WeatherResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BaseModel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;city&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="nc"&gt;Field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;City name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Current temperature (Celsius)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;condition&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="nc"&gt;Field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Weather condition&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;humidity&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="nc"&gt;Field&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Humidity (%)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;city&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="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;WeatherResult&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Query current weather for a specified city.

    Args:
        city: City name to query (e.g., Seoul, Tokyo)
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;AsyncClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&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="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.weather.example/v1/current?city=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;city&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="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;WeatherResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;city&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;temp_c&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;condition&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;humidity&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;humidity&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="c1"&gt;# Resource — Supported city list
&lt;/span&gt;&lt;span class="nd"&gt;@mcp.resource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weather://supported-cities&lt;/span&gt;&lt;span class="sh"&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;supported_cities&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Return list of supported cities.&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;Seoul, Tokyo, New York, London, Paris, Berlin&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;__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;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# stdio mode (default) or --transport http for remote mode
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// TypeScript MCP Server — @modelcontextprotocol/sdk + Zod&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;McpServer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@modelcontextprotocol/sdk/server/mcp.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;StdioServerTransport&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@modelcontextprotocol/sdk/server/stdio.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;zod&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;McpServer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;weather-service&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1.0.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Tool registration — Type-safe schema with Zod&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;get_weather&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Query current weather for a specified city&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;City name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;city&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchWeather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;city&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="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}]&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;transport&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;StdioServerTransport&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Connecting MCP Servers in Claude Desktop/Code
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;claude_desktop_config.json&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;—&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;MCP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Connection&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Settings&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"weather"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"python"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"-m"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"weather_service"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"WEATHER_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-api-key"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"github"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-github"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"GITHUB_PERSONAL_ACCESS_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ghp_..."&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"remote-service"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcp.example.com/v1"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Streamable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;HTTP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;—&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;remote&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;MCP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(OAuth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;handled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;automatically)&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  MCP Ecosystem Status — 200+ Servers and Key Integrations
&lt;/h2&gt;

&lt;p&gt;As of March 2026, the MCP ecosystem includes &lt;strong&gt;over 200 server implementations&lt;/strong&gt;. Most major SaaS platforms and developer tools provide MCP servers, including GitHub, Slack, Google Drive, PostgreSQL, Notion, Jira, and Salesforce.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Major MCP Servers&lt;/th&gt;
&lt;th&gt;Capabilities&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Dev Tools&lt;/td&gt;
&lt;td&gt;GitHub, GitLab, Sentry&lt;/td&gt;
&lt;td&gt;Issue/PR management, code search, error tracking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Collaboration&lt;/td&gt;
&lt;td&gt;Slack, Notion, Google Drive&lt;/td&gt;
&lt;td&gt;Message search, document read/write, file management&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Databases&lt;/td&gt;
&lt;td&gt;PostgreSQL, MongoDB, Redis&lt;/td&gt;
&lt;td&gt;Schema exploration, query execution, data analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloud/Infra&lt;/td&gt;
&lt;td&gt;AWS, Kubernetes, Terraform&lt;/td&gt;
&lt;td&gt;Resource inspection, cluster management, IaC validation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CRM/Business&lt;/td&gt;
&lt;td&gt;Salesforce, Jira, HubSpot&lt;/td&gt;
&lt;td&gt;Lead management, ticket handling, pipeline analysis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IDE Integration&lt;/td&gt;
&lt;td&gt;Claude Code, Cursor, Cline, Windsurf&lt;/td&gt;
&lt;td&gt;Code editing, terminal execution, filesystem access&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  MCP vs A2A — AI Agent Protocol Comparison
&lt;/h2&gt;

&lt;p&gt;A frequently discussed companion to MCP is &lt;strong&gt;A2A (Agent-to-Agent)&lt;/strong&gt;, released by Google in April 2025. The two protocols are &lt;strong&gt;complementary, not competing&lt;/strong&gt;. MCP defines "how agents interact with tools," while A2A defines "how agents collaborate with each other." In December 2025, Anthropic, Block (Square), and OpenAI established the &lt;strong&gt;Agentic AI Foundation&lt;/strong&gt; under the Linux Foundation, contributing both MCP and A2A.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Comparison&lt;/th&gt;
&lt;th&gt;MCP (Model Context Protocol)&lt;/th&gt;
&lt;th&gt;A2A (Agent-to-Agent)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Purpose&lt;/td&gt;
&lt;td&gt;Agent ↔ Tool/data connection&lt;/td&gt;
&lt;td&gt;Agent ↔ Agent collaboration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocol Base&lt;/td&gt;
&lt;td&gt;JSON-RPC 2.0&lt;/td&gt;
&lt;td&gt;JSON-RPC 2.0 + gRPC (v1.0)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Discovery&lt;/td&gt;
&lt;td&gt;MCP Server Cards (.well-known)&lt;/td&gt;
&lt;td&gt;Agent Cards (signed)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authentication&lt;/td&gt;
&lt;td&gt;OAuth 2.1 + PKCE&lt;/td&gt;
&lt;td&gt;OAuth 2.1 + multi-tenancy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Governance&lt;/td&gt;
&lt;td&gt;Agentic AI Foundation (Linux Foundation)&lt;/td&gt;
&lt;td&gt;Agentic AI Foundation (Linux Foundation)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026 Adoption&lt;/td&gt;
&lt;td&gt;97M+ monthly downloads, 200+ servers&lt;/td&gt;
&lt;td&gt;v1.0 released, gRPC support added&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Analogy&lt;/td&gt;
&lt;td&gt;"USB-C" — device connection standard&lt;/td&gt;
&lt;td&gt;"TCP/IP" — device communication standard&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In practice, MCP and A2A are used together. Individual agents access their tools and data via MCP, while task delegation and result sharing between agents happens through A2A. For example, a customer support agent queries CRM and knowledge bases via MCP, then delegates complex technical issues to a technical support agent through A2A.&lt;/p&gt;

&lt;h2&gt;
  
  
  2026 MCP Roadmap — Enterprise Production Ready
&lt;/h2&gt;

&lt;p&gt;MCP's 2026 roadmap prioritizes &lt;strong&gt;enterprise production readiness&lt;/strong&gt;. Key working group milestones:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Timeline&lt;/th&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;Key Deliverables&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Q1-Q2 2026&lt;/td&gt;
&lt;td&gt;Transport Evolution&lt;/td&gt;
&lt;td&gt;Streamable HTTP stateless operation, session migration, horizontal scaling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q2 2026&lt;/td&gt;
&lt;td&gt;Enterprise Auth&lt;/td&gt;
&lt;td&gt;OAuth 2.1 + PKCE GA, SAML/OIDC IdP integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q2-Q3 2026&lt;/td&gt;
&lt;td&gt;Server Discovery&lt;/td&gt;
&lt;td&gt;MCP Server Cards (.well-known URL), standard metadata format&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q3 2026&lt;/td&gt;
&lt;td&gt;Agent Communication&lt;/td&gt;
&lt;td&gt;Agent-to-agent coordination primitives (A2A integration)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Q4 2026&lt;/td&gt;
&lt;td&gt;MCP Registry&lt;/td&gt;
&lt;td&gt;Verified server directory, security audits, SLA commitments&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Elicitation and Sampling — Bidirectional Agent Interaction
&lt;/h2&gt;

&lt;p&gt;One of MCP's powerful features is that servers can send reverse requests to clients (LLMs). &lt;strong&gt;Sampling&lt;/strong&gt; lets MCP servers ask the LLM to generate text — used when an agent needs additional reasoning mid-task. &lt;strong&gt;Elicitation&lt;/strong&gt; lets servers request direct input from users — used for human confirmation in long-running tasks or when additional information is needed.&lt;/p&gt;

&lt;p&gt;These two features enable recursive agentic behavior. For example, a database migration server can detect schema changes, use Sampling to ask the LLM for impact analysis, and if deemed high-risk, use Elicitation to get final approval from the user — implementing a Human-in-the-Loop workflow. This is a key design pattern for balancing AI agent autonomy with human control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Production MCP Adoption Checklist
&lt;/h2&gt;

&lt;p&gt;For enterprise MCP adoption, consider this practical checklist organized around security, governance, and monitoring:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;Area&lt;/th&gt;
&lt;th&gt;Details&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Security&lt;/td&gt;
&lt;td&gt;Auth/AuthZ&lt;/td&gt;
&lt;td&gt;Remote servers: OAuth 2.1 + PKCE required. No hardcoded API keys — use Vault&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Security&lt;/td&gt;
&lt;td&gt;Input Validation&lt;/td&gt;
&lt;td&gt;Prompt injection defense, PII detection, minimum-privilege token scopes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Governance&lt;/td&gt;
&lt;td&gt;Server Evaluation&lt;/td&gt;
&lt;td&gt;Source code audit, version pinning, supply chain security verification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Governance&lt;/td&gt;
&lt;td&gt;Rate Limiting&lt;/td&gt;
&lt;td&gt;Per-user/agent request limits, cost tracking (per-request token logging)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5. Monitoring&lt;/td&gt;
&lt;td&gt;Observability&lt;/td&gt;
&lt;td&gt;OpenTelemetry tracing, request/response logging, error rate dashboards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6. Monitoring&lt;/td&gt;
&lt;td&gt;Health Checks&lt;/td&gt;
&lt;td&gt;MCP server availability monitoring, session state tracking, auto-recovery&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusion — MCP Defines the Future of AI Agent Integration
&lt;/h2&gt;

&lt;p&gt;MCP is the first successful open protocol to standardize how AI agents interact with the external world. Built on the proven JSON-RPC 2.0 foundation, it cleanly abstracts three primitives — Tools, Resources, and Prompts — and extends to enterprise environments with Streamable HTTP transport and OAuth 2.1 authentication.&lt;/p&gt;

&lt;p&gt;In H2 2026, stateless server operation, automatic discovery through MCP Server Cards, and agent-to-agent coordination with A2A will mature, evolving MCP from single tool connections into the &lt;strong&gt;foundational infrastructure for multi-agent orchestration&lt;/strong&gt;. Organizations adopting AI agents should establish MCP as their default integration layer and design security and governance from day one — the most practical strategy for 2026.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;AI Disclosure: This article was planned by the ManoIT technical research team, drafted by an AI assistant (Claude), and technically reviewed and edited by professional engineers.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sources: Model Context Protocol Official Specification, MCP 2026 Roadmap Blog, FastMCP GitHub, Auth0 MCP OAuth Guide, WorkOS MCP Enterprise Roadmap, The New Stack MCP Production Guide&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Last Updated: 2026-04-06 | Author: ManoIT Tech Blog&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://www.manoit.co.kr/forum/view/1445036" rel="noopener noreferrer"&gt;ManoIT Tech Blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>agents</category>
      <category>llm</category>
    </item>
  </channel>
</rss>
