<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0"><channel><title>Pulumi Blog: Peter Yoakum</title><link>https://www.pulumi.com/blog/author/peter-yoakum/</link><description>Pulumi blog posts: Peter Yoakum.</description><language>en-us</language><pubDate>Mon, 28 Sep 2026 00:00:00 +0000</pubDate><item><title>Self-driving infrastructure with Pulumi and Jev</title><link>https://www.pulumi.com/blog/self-driving-infrastructure-pulumi-jev/</link><pubDate>Mon, 28 Sep 2026 00:00:00 +0000</pubDate><guid>https://www.pulumi.com/blog/self-driving-infrastructure-pulumi-jev/</guid><description>
&lt;img src="https://www.pulumi.com/images/generated/blog/self-driving-infrastructure-pulumi-jev/index.png" /&gt;
&lt;p&gt;It&amp;rsquo;s been a weirdly great time to be building software. We&amp;rsquo;ve never had so many tools that help us get things done: endless cloud providers, regions, deployment frameworks, and now AI agents that can actually build and manage infrastructure for us. That&amp;rsquo;s part of what made this past week feel so big. TypeSafe AI opened early access to Jev, their SystemOne model, and we here at Pulumi were bitten by the excitement bug and got straight to work building.&lt;/p&gt;
&lt;p&gt;&lt;img src="screenshot-1.png" alt="The GeoDeploy web UI showing the us-east deployment on a live globe"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="screenshot-2.png" alt="The GeoDeploy decision panel for the us-east geo, showing the region selection plus the coverage, cost, maturity, sprawl, and architecture scores with their confidence"&gt;&lt;/p&gt;
&lt;p&gt;Almost immediately we were able to whip up some test agentic workflows that were making real, live decisions about infrastructure. If you&amp;rsquo;re not familiar with &lt;a href="https://docs.typesafe.ai/introduction"&gt;TypeSafe&amp;rsquo;s Jev&lt;/a&gt;, it comes with a powerful set of AI primitives that let your apps, agents, and workflows make decisions based on context.&lt;/p&gt;
&lt;p&gt;&lt;img src="jev-primitives.png" alt="Diagram of Jev&amp;rsquo;s decision-making primitives: confidence scoring, multiple choice, and yes/no (noul) questions"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Jev&amp;rsquo;s decision-making primitives are the perfect complement to agentic work.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;When you combine that reasoning power with Pulumi, the gap between dreaming up your ideal infrastructure and deploying it to production practically vanishes.&lt;/p&gt;
&lt;p&gt;In the past, having more choices usually meant dealing with more complexity, which added technical debt and inevitably meant someone (perhaps you) spent hours setting things up. Now you can let agents handle provisioning and the day-to-day scaling and reliability decisions while you stay focused on defining how your infrastructure should work.&lt;/p&gt;
&lt;h2 id="okay-but-how-does-it-work"&gt;Okay, but how does it work?&lt;/h2&gt;
&lt;p&gt;Our example, &lt;a href="https://github.com/pulumi/devx-geodeploy"&gt;GeoDeploy&lt;/a&gt;, answers one question: &lt;em&gt;my users are in these places and I have this container image, so where should it run and what will it cost?&lt;/em&gt; Then it builds the answer.&lt;/p&gt;
&lt;p&gt;You give it a deployment request with four parts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Target geos:&lt;/strong&gt; where your users are, what share of traffic each place sends, and any data-residency rule (EU-only, US-only, or in-country).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;An image:&lt;/strong&gt; a container image and the platforms it&amp;rsquo;s built for (amd64, arm64, or both).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A workload shape:&lt;/strong&gt; replicas, CPU and memory per pod, egress, and storage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Constraints:&lt;/strong&gt; which providers are allowed, how many providers you&amp;rsquo;ll tolerate, and a budget.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From there, GeoDeploy compares every AWS, Azure, and Google Cloud region that offers managed Kubernetes, picks the best one for each geo, and provisions consistent environments across all three hyperscalers.&lt;/p&gt;
&lt;h3 id="three-systems-three-jobs"&gt;Three systems, three jobs&lt;/h3&gt;
&lt;p&gt;The design principle that makes this work is a strict division of labor:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;System&lt;/th&gt;
&lt;th style="text-align: left"&gt;Job&lt;/th&gt;
&lt;th style="text-align: left"&gt;Never does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;TypeScript app&lt;/td&gt;
&lt;td style="text-align: left"&gt;Takes in the request, fetches live pricing, does all the math&lt;/td&gt;
&lt;td style="text-align: left"&gt;Make judgment calls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Jev&lt;/td&gt;
&lt;td style="text-align: left"&gt;Decides which region wins and which modules to use&lt;/td&gt;
&lt;td style="text-align: left"&gt;Do arithmetic, generate code, or invent region names&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Pulumi&lt;/td&gt;
&lt;td style="text-align: left"&gt;Provisions clusters, registries, workloads, and DNS&lt;/td&gt;
&lt;td style="text-align: left"&gt;Decide anything&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Here&amp;rsquo;s how a request flows through the pipeline:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Normalize the geos.&lt;/strong&gt; Each business region (geo) is mapped to a canonical location and residency class.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enumerate candidates.&lt;/strong&gt; GeoDeploy lists every region with managed Kubernetes and uses great-circle distance as a coverage measure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fetch live prices.&lt;/strong&gt; Current prices come from the AWS Price List API, the Azure Retail Prices API, and the Google Cloud Billing Catalog, normalized into a single quote format.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do the math.&lt;/strong&gt; Plain, deterministic TypeScript bin-packs pods onto nodes, filters out instance types that don&amp;rsquo;t match the image&amp;rsquo;s architecture, and computes a monthly cost for each candidate.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Decide.&lt;/strong&gt; Jev picks the winning region and modules for each geo (more on this below).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compose.&lt;/strong&gt; GeoDeploy assembles a Pulumi program from a curated registry of typed modules: EKS, AKS, or GKE; ECR, ACR, or Artifact Registry; ingress; DNS through Route 53, NS1, or Cloudflare; and observability.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Provision.&lt;/strong&gt; The &lt;a href="https://www.pulumi.com/automation/"&gt;Pulumi Automation API&lt;/a&gt; runs a preview and then an update, with one stack per region. It won&amp;rsquo;t run at all unless your cloud credentials pass readiness checks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Report.&lt;/strong&gt; Every run writes a &lt;code&gt;plan.json&lt;/code&gt; and &lt;code&gt;plan.md&lt;/code&gt; with the full decision record, and a web UI shows the deployment on a live globe.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="why-jev-and-not-a-general-purpose-llm"&gt;Why Jev, and not a general-purpose LLM?&lt;/h3&gt;
&lt;p&gt;Jev doesn&amp;rsquo;t return free text. It returns typed answers with calibrated confidence, through three primitives:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;choice()&lt;/code&gt; picks one option from a closed list and returns the pick, a probability distribution across all options, and a confidence.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;score()&lt;/code&gt; rates something against a rubric you describe (GeoDeploy uses 10 levels).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;noul()&lt;/code&gt; answers a yes/no question with a single probability.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The core rule is that Jev only ever selects from closed sets. It chooses among region IDs that GeoDeploy has already priced and checked. It never writes code or does arithmetic, so a hallucinated &lt;code&gt;us-west-9&lt;/code&gt; or a made-up Pulumi argument can&amp;rsquo;t happen by construction.&lt;/p&gt;
&lt;p&gt;For each geo, GeoDeploy sends Jev a shortlist of up to 40 priced candidates, along with the constraints and the image&amp;rsquo;s architecture. In a single call, it asks for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A selection&lt;/strong&gt; (&lt;code&gt;choice&lt;/code&gt;): which region should serve this geo?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Five quality scores&lt;/strong&gt; (&lt;code&gt;score&lt;/code&gt;): coverage, cost fit, maturity, sprawl risk, and architecture consistency.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Two hard checks&lt;/strong&gt; (&lt;code&gt;noul&lt;/code&gt;): is data residency satisfied, and is there enough capacity?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A fallback&lt;/strong&gt; (&lt;code&gt;choice&lt;/code&gt;): a backup region in case the primary fails at apply time.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&amp;rsquo;s what that looks like in &lt;code&gt;packages/decide/src/questions.ts&lt;/code&gt; (trimmed):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;noul&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;@typesafe-ai/sdk&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;buildStageAQuestions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;shortlisted&lt;/span&gt;: &lt;span class="kt"&gt;CandidateCost&lt;/span&gt;&lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// &amp;#34;aws:us-east-1&amp;#34; -&amp;gt; { monthlyUsd, distanceKm, azCount, gaStatus, complianceFlags, ... }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;candidateOptions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;shortlisted&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;selection&lt;/span&gt;: &lt;span class="kt"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Which candidate region should serve this demand geo?&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;coverage&lt;/span&gt;: &lt;span class="kt"&gt;score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;How well does the selected region cover this demand geo&amp;#39;s users?&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;COVERAGE_LEVELS&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;costFit&lt;/span&gt;: &lt;span class="kt"&gt;score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;How favorable is this candidate&amp;#39;s monthly cost relative to the cheapest alternative in the shortlist?&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;COST_LEVELS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// ...maturity, sprawlRisk, archConsistency
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;residencyOk&lt;/span&gt;: &lt;span class="kt"&gt;noul&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Does the selected region satisfy the stated data-residency constraint for this demand geo?&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;The region&amp;#39;s jurisdiction and compliance flags fully satisfy the demand geo&amp;#39;s residency class ...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;... or residency cannot be confirmed from the given compliance flags.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// ...capacityOk
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;fallback&lt;/span&gt;: &lt;span class="kt"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;If the top-ranked candidate becomes unavailable at apply time, which candidate is the best substitute?&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The options passed to &lt;code&gt;choice()&lt;/code&gt; are the priced candidates themselves, keyed by ID, so Jev literally can&amp;rsquo;t answer with a region that isn&amp;rsquo;t on the list. The rubrics follow TypeSafe&amp;rsquo;s advice to &amp;ldquo;describe situations, not degrees.&amp;rdquo; Instead of &amp;ldquo;good coverage,&amp;rdquo; each of the 10 levels is a concrete scenario, running from &amp;ldquo;Serves users on a different continent with no nearby presence&amp;rdquo; up to &amp;ldquo;In-geo with multiple availability zones, directly in or adjacent to the demand geo&amp;rsquo;s primary population center.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The whole question set goes out in one call, along with the state Jev reasons over:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&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;new&lt;/span&gt; &lt;span class="nx"&gt;TypeSafeClient&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;resultA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;systemOne&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;: &lt;span class="kt"&gt;toState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;stateA&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nx"&gt;questions&lt;/span&gt;: &lt;span class="kt"&gt;questionsA&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;resultA&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;answers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// a.selection.choice, a.selection.confidence, a.residencyOk.noul, a.coverage.score, ...
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The five scores feed a ranking system that runs on weight profiles (latency-optimized by default, plus balanced, residency-first, and failure-domain). Because the weights live in code, we can re-tune the ranking without calling Jev again:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// composite = W.cost*norm(costFit) + W.coverage*norm(coverage) +
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// W.maturity*norm(maturity) + W.archConsistency*norm(archConsistency) -
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// W.sprawl*norm(sprawlRisk)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;WEIGHT_PROFILES&lt;/span&gt;: &lt;span class="kt"&gt;Record&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;WeightProfileName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;CompositeWeights&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;latency-optimized&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;cost&lt;/span&gt;: &lt;span class="kt"&gt;0.13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;coverage&lt;/span&gt;: &lt;span class="kt"&gt;0.48&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;maturity&lt;/span&gt;: &lt;span class="kt"&gt;0.17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sprawl&lt;/span&gt;: &lt;span class="kt"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;archConsistency&lt;/span&gt;: &lt;span class="kt"&gt;0.12&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;balanced&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;cost&lt;/span&gt;: &lt;span class="kt"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;coverage&lt;/span&gt;: &lt;span class="kt"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;maturity&lt;/span&gt;: &lt;span class="kt"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sprawl&lt;/span&gt;: &lt;span class="kt"&gt;0.12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;archConsistency&lt;/span&gt;: &lt;span class="kt"&gt;0.18&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;residency-first&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;cost&lt;/span&gt;: &lt;span class="kt"&gt;0.12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;coverage&lt;/span&gt;: &lt;span class="kt"&gt;0.12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;maturity&lt;/span&gt;: &lt;span class="kt"&gt;0.38&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sprawl&lt;/span&gt;: &lt;span class="kt"&gt;0.23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;archConsistency&lt;/span&gt;: &lt;span class="kt"&gt;0.15&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;failure-domain&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;cost&lt;/span&gt;: &lt;span class="kt"&gt;0.08&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;coverage&lt;/span&gt;: &lt;span class="kt"&gt;0.17&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;maturity&lt;/span&gt;: &lt;span class="kt"&gt;0.48&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sprawl&lt;/span&gt;: &lt;span class="kt"&gt;0.15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;archConsistency&lt;/span&gt;: &lt;span class="kt"&gt;0.12&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sprawl risk undermines the good work we&amp;rsquo;ve done, so it&amp;rsquo;s subtracted. We&amp;rsquo;re trying to reduce our spend after all, and every extra cloud provider means more credentials, tooling, and on-call runbooks.&lt;/p&gt;
&lt;p&gt;A second, smaller set of questions covers the modules. Cluster and registry modules follow directly from the provider (AWS always means EKS and ECR), so Jev is left with the squishy judgment calls that are genuinely open choices: ingress posture, autoscaling posture, and node-pool sizing tier.&lt;/p&gt;
&lt;h3 id="confidence-gates-keep-the-agent-contained"&gt;Confidence gates keep the agent contained&lt;/h3&gt;
&lt;p&gt;The confidence score is how we decide it&amp;rsquo;s safe to let an agent touch production. Every answer is checked against a threshold matched to how risky the decision is:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left"&gt;Decision&lt;/th&gt;
&lt;th style="text-align: left"&gt;Threshold&lt;/th&gt;
&lt;th style="text-align: left"&gt;If it doesn&amp;rsquo;t pass&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Data residency&lt;/td&gt;
&lt;td style="text-align: left"&gt;0.95&lt;/td&gt;
&lt;td style="text-align: left"&gt;Hard reject&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Region for a new cluster&lt;/td&gt;
&lt;td style="text-align: left"&gt;0.90&lt;/td&gt;
&lt;td style="text-align: left"&gt;Top three candidates are flagged for a human to choose&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Region when a stack already exists&lt;/td&gt;
&lt;td style="text-align: left"&gt;0.75&lt;/td&gt;
&lt;td style="text-align: left"&gt;Keep the existing region&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Ingress or autoscaling module&lt;/td&gt;
&lt;td style="text-align: left"&gt;0.85&lt;/td&gt;
&lt;td style="text-align: left"&gt;Use the registry default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Node-pool sizing tier&lt;/td&gt;
&lt;td style="text-align: left"&gt;0.60&lt;/td&gt;
&lt;td style="text-align: left"&gt;Use the bin-packing result&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left"&gt;Region pick, residency, or capacity (global floor)&lt;/td&gt;
&lt;td style="text-align: left"&gt;0.50&lt;/td&gt;
&lt;td style="text-align: left"&gt;Drop the AI path for that geo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Enforcing a gate is plain old deterministic code. Here&amp;rsquo;s the residency check from &lt;code&gt;packages/decide/src/engine.ts&lt;/code&gt;, followed by a validation check that the selection really is one of the candidates:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// residencyOk is a hard gate: below 0.95, hard-reject — never soft-fail a
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// compliance constraint, even by falling back to the model&amp;#39;s own pick.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;residencyGate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;applyGate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;residencyOk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;noul&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;GATE_THRESHOLDS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;residencyOk&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;residencyOk&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&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;residencyGate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;passed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;AiPathAborted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sb"&gt;`residencyOk hard gate failed (&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;residencyOk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;noul&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt; &amp;lt; &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;GATE_THRESHOLDS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;residencyOk&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;); hard-rejecting the AI region selection`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;stageAAttempt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;chosenId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;selection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;choice&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;chosenCandidate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;shortlisted&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;find&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;c&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;candidateId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;chosenId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&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;chosenCandidate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;AiPathAborted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`model selected an unknown candidate id &amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;chosenId&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;&amp;#34;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;stageAAttempt&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Each &lt;code&gt;AiPathAborted&lt;/code&gt; carries the full attempt (state, questions, and answers), so even a rejected answer ends up in the audit trail.&lt;/p&gt;
&lt;p&gt;If a gate check fails, the API times out or returns an error, or the upstream can&amp;rsquo;t be reached, GeoDeploy switches to a deterministic fallback: it compares prices across providers while still enforcing the residency and constraint checks. Run &lt;code&gt;geodeploy explain&lt;/code&gt; to see why each region won.&lt;/p&gt;
&lt;h3 id="self-driving-mode"&gt;Self-driving mode&lt;/h3&gt;
&lt;p&gt;When self-driving mode is enabled (&lt;code&gt;geodeploy monitor&lt;/code&gt;), the agent periodically checks each deployment&amp;rsquo;s CPU utilization and asks Jev one joint question across all regions: &lt;code&gt;no-change&lt;/code&gt;, &lt;code&gt;scale-up:&amp;lt;geo&amp;gt;&lt;/code&gt;, &lt;code&gt;scale-down:&amp;lt;geo&amp;gt;&lt;/code&gt;, or &lt;code&gt;shift:&amp;lt;from&amp;gt;-&amp;gt;&amp;lt;to&amp;gt;&lt;/code&gt;, plus a separate check on disruption risk. Code, not Jev, computes the actual node-count changes. Above 0.85 confidence, the resize is applied automatically. Between 0.70 and 0.85, it&amp;rsquo;s suggested for a human to approve. Below 0.70, GeoDeploy ignores Jev&amp;rsquo;s pick and falls back to a deterministic per-region rule based on the observed utilization.&lt;/p&gt;
&lt;p&gt;For builders familiar with the sharp corners of maintaining a reliable service: CPU utilization alone makes a poor autoscaling metric. Once you&amp;rsquo;ve established a traffic baseline, it&amp;rsquo;s usually paired with other signals, such as median end-to-end request latency, error rates, or something specific to your application. For our purposes, it&amp;rsquo;s a decent approximation for proving out the test case.&lt;/p&gt;
&lt;h2 id="the-power-is-yours"&gt;The power is yours!&lt;/h2&gt;
&lt;p&gt;From here, the possibilities are quite literally endless for how we could tweak our agentic, self-driving infrastructure, and we&amp;rsquo;re honestly getting dizzy over all the ways we&amp;rsquo;d like to use Jev internally.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re releasing GeoDeploy as open source so you can take it and build something of your own. As long as you&amp;rsquo;ve got access to Jev and a cloud provider, you can get started today:&lt;/p&gt;
&lt;a href="https://github.com/pulumi/devx-geodeploy" target="_blank" rel="noopener noreferrer" class="github-card"&gt;
&lt;img
src="https://opengraph.githubassets.com/1/pulumi/devx-geodeploy"
alt="GitHub repository: pulumi/devx-geodeploy"
class="github-card-image"
loading="lazy"
/&gt;
&lt;div class="github-card-content"&gt;
&lt;div class="github-card-domain"&gt;
&lt;svg xmlns="http://www.w3.org/2000/svg" class="ph-icon github-card-icon" fill="currentColor" aria-hidden="true" focusable="false"&gt;&lt;use href="https://www.pulumi.com/icons/sprite.233e2a8e44d77c3fb864f7b6741050b277d317a225202560ecc3ea43f8ea27de.svg#b-github"/&gt;&lt;/svg&gt;
github.com/pulumi/devx-geodeploy
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
&lt;p&gt;Are you currently experimenting with Jev or Pulumi in your infrastructure stack? We&amp;rsquo;d love to hear about it. &lt;a href="https://x.com/PulumiCorp"&gt;@ us on X at @PulumiCorp&lt;/a&gt; and send us a link to what you&amp;rsquo;re building!&lt;/p&gt;
&lt;p&gt;Ready to start building your dream infrastructure stack? &lt;a href="https://app.pulumi.com/signup"&gt;Sign up for a free Pulumi account&lt;/a&gt; and start shipping today!&lt;/p&gt;</description><author>Peter Yoakum</author><category>ai-agents</category><category>automation-api</category><category>kubernetes</category><category>multi-cloud</category><category>typescript</category></item></channel></rss>