<?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: Muhtalip Dede</title>
    <description>The latest articles on DEV Community by Muhtalip Dede (@muhtalipdede).</description>
    <link>https://dev.to/muhtalipdede</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F596699%2F3b22f4b8-7c35-4c45-bf6e-99fd7a593c12.jpg</url>
      <title>DEV Community: Muhtalip Dede</title>
      <link>https://dev.to/muhtalipdede</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/muhtalipdede"/>
    <language>en</language>
    <item>
      <title>Observe vs investigate: always-on agent vs on-demand CLI</title>
      <dc:creator>Muhtalip Dede</dc:creator>
      <pubDate>Sun, 16 Aug 2026 11:49:12 +0000</pubDate>
      <link>https://dev.to/muhtalipdede/observe-vs-investigate-always-on-agent-vs-on-demand-cli-2ccj</link>
      <guid>https://dev.to/muhtalipdede/observe-vs-investigate-always-on-agent-vs-on-demand-cli-2ccj</guid>
      <description>&lt;p&gt;Same Investigation Graph DNA — different trigger. Laptop investigate is reactive; the optional Observe agent is continuous watch → Incident → gated notify.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://kprompt.ai/blog/observe-vs-investigate" rel="noopener noreferrer"&gt;https://kprompt.ai/blog/observe-vs-investigate&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Operators ask the same question two ways: “why is checkout broken right now?” and “tell me when payments starts misbehaving without me watching.” kprompt answers both — but with different surfaces. Confusing them is how you end up expecting a laptop REPL to page Slack, or an in-cluster watcher to silently apply fixes.&lt;/p&gt;

&lt;h2&gt;
  
  
  At a glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Surface&lt;/th&gt;
&lt;th&gt;Trigger&lt;/th&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Mutate?&lt;/th&gt;
&lt;th&gt;Artifact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CLI &lt;code&gt;investigate&lt;/code&gt; / &lt;code&gt;why&lt;/code&gt; / &lt;code&gt;timeline&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;You type a prompt&lt;/td&gt;
&lt;td&gt;kubeconfig context(s)&lt;/td&gt;
&lt;td&gt;Only after PlanResult approval&lt;/td&gt;
&lt;td&gt;Investigation → optional PlanResult&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Observe agent&lt;/td&gt;
&lt;td&gt;Always-on watch&lt;/td&gt;
&lt;td&gt;One namespace (Role)&lt;/td&gt;
&lt;td&gt;Never by default&lt;/td&gt;
&lt;td&gt;Incident / AgentAlert&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Autopilot (opt-in)&lt;/td&gt;
&lt;td&gt;Open Incident + allowlist&lt;/td&gt;
&lt;td&gt;Same ns agent&lt;/td&gt;
&lt;td&gt;Propose-only; apply gated&lt;/td&gt;
&lt;td&gt;PlanResult (&lt;code&gt;Applied&lt;/code&gt; false)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Same graph, different entry
&lt;/h2&gt;

&lt;p&gt;Always-on intelligence is the same gated &lt;a href="https://github.com/kprompt/kprompt/blob/main/docs/investigation-graph.md" rel="noopener noreferrer"&gt;Investigation Graph&lt;/a&gt; as CLI investigate — signal hops → findings → optional PlanResult → approve → apply → verify. It is not a free-form multi-agent fleet. Observe / Namespace Agent runs the continuous edge of that graph; &lt;a href="https://github.com/kprompt/kprompt/blob/main/docs/investigate.md" rel="noopener noreferrer"&gt;investigate&lt;/a&gt; is the on-demand hop you steer from a laptop. Modes table: &lt;a href="https://github.com/kprompt/kprompt/blob/main/docs/namespace-agent.md" rel="noopener noreferrer"&gt;namespace-agent&lt;/a&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;# On-demand RCA (reactive)&lt;/span&gt;
kprompt &lt;span class="s2"&gt;"investigate checkout"&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; payments
kprompt &lt;span class="s2"&gt;"why is api crashing"&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; payments
kprompt &lt;span class="s2"&gt;"timeline for checkout"&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; payments
&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;# Always-on Observe (continuous)&lt;/span&gt;
kprompt agent run &lt;span class="nt"&gt;-n&lt;/span&gt; payments &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--analyze&lt;/span&gt; &lt;span class="nt"&gt;--fetch-logs&lt;/span&gt; &lt;span class="nt"&gt;--health&lt;/span&gt; &lt;span class="nt"&gt;--heuristic&lt;/span&gt;

&lt;span class="c"&gt;# in-cluster: Helm charts/kprompt-agent (namespace Role)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  When to install neither, one, or both
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Neither&lt;/strong&gt; — you only need occasional explain/investigate from CI or a laptop; no pager path yet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CLI only&lt;/strong&gt; — brownfield day-2 mutate + RCA under plan → approve; no daemon required&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observe only&lt;/strong&gt; — you want Slack/Discord when a namespace degrades, still refuse silent heal&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Both&lt;/strong&gt; — continuous alerts plus human-driven investigate/why when you dig in; Autopilot propose optional&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Honest non-claims
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Observe is not K8sGPT — analyzer-on-demand vs watch → Incident → gated alert&lt;/li&gt;
&lt;li&gt;Observe is not Kagent — one kprompt-native pipeline, not a general multi-agent platform&lt;/li&gt;
&lt;li&gt;Default RBAC is a namespace Role (get/list/watch), not ClusterRole god-mode&lt;/li&gt;
&lt;li&gt;Memory / patterns bias confidence; they do not prove root cause alone&lt;/li&gt;
&lt;li&gt;Coordinator is for cross-ns verification handoff — mutate still default off&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try both paths on kind
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/kprompt/kprompt-examples.git
&lt;span class="nb"&gt;cd &lt;/span&gt;kprompt-examples
make walkthrough

&lt;span class="c"&gt;# afterward, on-demand:&lt;/span&gt;
kprompt &lt;span class="s2"&gt;"investigate checkout"&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; payments
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Heuristic Observe needs no LLM key. Investigate with a provider when you want richer narration — still read-first; mutations stay behind approval. Pair with &lt;a href="https://kprompt.ai/blog/observe-agent-alert-fatigue" rel="noopener noreferrer"&gt;alert fatigue gates&lt;/a&gt; and the &lt;a href="https://kprompt.ai/blog/observe-agent-kind-demo" rel="noopener noreferrer"&gt;kind demo&lt;/a&gt;. Experimental — prefer kind / non-prod first.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Try:&lt;/strong&gt; &lt;a href="https://kprompt.ai" rel="noopener noreferrer"&gt;kprompt.ai&lt;/a&gt; · &lt;a href="https://github.com/kprompt/kprompt" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;code&gt;brew install kprompt/tap/kprompt&lt;/code&gt;&lt;br&gt;
Muhtalip&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>cli</category>
      <category>ai</category>
    </item>
    <item>
      <title>Stop paging on every kubelet Event: Incidents + confidence gates</title>
      <dc:creator>Muhtalip Dede</dc:creator>
      <pubDate>Sun, 16 Aug 2026 11:48:30 +0000</pubDate>
      <link>https://dev.to/muhtalipdede/stop-paging-on-every-kubelet-event-incidents-confidence-gates-45nk</link>
      <guid>https://dev.to/muhtalipdede/stop-paging-on-every-kubelet-event-incidents-confidence-gates-45nk</guid>
      <description>&lt;p&gt;Always-on Kubernetes watch only helps if you correlate into Incidents and gate by severity and confidence — not one Slack message per BackOff.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://kprompt.ai/blog/observe-agent-alert-fatigue" rel="noopener noreferrer"&gt;https://kprompt.ai/blog/observe-agent-alert-fatigue&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Wiring &lt;code&gt;kubectl get events&lt;/code&gt; into Slack feels productive for about a day. Then CrashLoop storms reopen the same fingerprint every few seconds, ImagePull retries spam the channel, and nobody trusts the bot. Always-on watch is only useful if the product artifact is a &lt;strong&gt;correlated Incident&lt;/strong&gt; — not a raw Event dump.&lt;/p&gt;

&lt;h2&gt;
  
  
  The failure mode: Event → page
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;One message per kubelet Event → thread death under restart storms&lt;/li&gt;
&lt;li&gt;LLM called on every raw API event → cost and latency spikes with no extra truth&lt;/li&gt;
&lt;li&gt;No durable “open incident” → you cannot ask &lt;em&gt;why&lt;/em&gt; later or mark false positive&lt;/li&gt;
&lt;li&gt;No severity/confidence gate → low-signal noise trains the team to ignore alerts&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Observe pipeline (gated)
&lt;/h2&gt;

&lt;p&gt;kprompt’s optional &lt;a href="https://kprompt.ai/docs/agent" rel="noopener noreferrer"&gt;Observe agent&lt;/a&gt; watches Pods/Events (and optional workloads) in &lt;strong&gt;one namespace&lt;/strong&gt;, correlates into durable Incidents, optionally analyzes with your BYOK LLM, then notifies Discord, Slack, or a webhook only after a &lt;strong&gt;severity + confidence gate&lt;/strong&gt;. Default Observe never applies, patches, or deletes (&lt;a href="https://github.com/kprompt/kprompt-architecture/blob/main/decisions/ADR-0013-in-cluster-agent.md" rel="noopener noreferrer"&gt;ADR-0013&lt;/a&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kprompt agent run &lt;span class="nt"&gt;-n&lt;/span&gt; payments &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--emit-initial&lt;/span&gt; &lt;span class="nt"&gt;--analyze&lt;/span&gt; &lt;span class="nt"&gt;--fetch-logs&lt;/span&gt; &lt;span class="nt"&gt;--health&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--min-severity&lt;/span&gt; medium &lt;span class="nt"&gt;--min-confidence&lt;/span&gt; 0.7
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Levers that cut fatigue
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Lever&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;--heuristic&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Zero token spend; deterministic detectors for demos and many day-2 signals&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--min-severity&lt;/code&gt; / &lt;code&gt;--min-confidence&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Defaults medium / 0.7 — raise both to cut noise and LLM burn&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Incident batching&lt;/td&gt;
&lt;td&gt;One analysis per evidence fingerprint, not per raw Event&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--memory&lt;/code&gt; / &lt;code&gt;--patterns&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Namespace facts + “seen before” bias confidence — never sole proof of root cause&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Slack threads&lt;/td&gt;
&lt;td&gt;Prefer bot + channel update-in-thread over a new webhook post per pulse&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Rough expectation from the &lt;a href="https://github.com/kprompt/kprompt/blob/main/docs/agent-ops.md" rel="noopener noreferrer"&gt;ops runbook&lt;/a&gt;: busy namespace with LLM on and gate at medium/0.7 → a handful of completions per real incident, not hundreds per hour. If spend spikes, check the gate and whether CrashLoop storms reopen fingerprints.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memory and patterns are bias, not proof
&lt;/h2&gt;

&lt;p&gt;Namespace memory and pattern learning can boost confidence when a signature looks familiar, and Slack false-positive feedback can dampen repeat noise. They must &lt;strong&gt;not&lt;/strong&gt; invent root cause alone. If Prom, OTel, or GitOps evidence is missing, Observe degrades honestly — it does not fabricate metrics. More on the memory bet: &lt;a href="https://kprompt.ai/blog/building-ai-sre-08-cluster-memory" rel="noopener noreferrer"&gt;cluster memory&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Autopilot stays propose-only
&lt;/h2&gt;

&lt;p&gt;Optional &lt;code&gt;--autopilot-propose&lt;/code&gt; emits PlanResult-shaped remediations with &lt;code&gt;Applied&lt;/code&gt; false. Silent heal is not the goal. Apply remains policy + allowlist + explicit approve under &lt;a href="https://github.com/kprompt/kprompt-architecture/blob/main/decisions/ADR-0015-autopilot-mode.md" rel="noopener noreferrer"&gt;ADR-0015&lt;/a&gt;. See also &lt;a href="https://kprompt.ai/blog/building-ai-sre-10-autonomous-not-yet" rel="noopener noreferrer"&gt;Autonomous not yet&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it without paging anyone
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/kprompt/kprompt-examples.git
&lt;span class="nb"&gt;cd &lt;/span&gt;kprompt-examples
make walkthrough
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Heuristic mode needs no API key. For a Slack path, add &lt;code&gt;--slack&lt;/code&gt; (or Discord webhook) only after the gate settings match your tolerance. Walkthrough details: &lt;a href="https://kprompt.ai/blog/observe-agent-kind-demo" rel="noopener noreferrer"&gt;Break a kind cluster on purpose&lt;/a&gt;. Experimental — prefer kind / non-prod first.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Try:&lt;/strong&gt; &lt;a href="https://kprompt.ai" rel="noopener noreferrer"&gt;kprompt.ai&lt;/a&gt; · &lt;a href="https://github.com/kprompt/kprompt" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;code&gt;brew install kprompt/tap/kprompt&lt;/code&gt;&lt;br&gt;
Muhtalip&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>sre</category>
      <category>devops</category>
      <category>ai</category>
    </item>
    <item>
      <title>Break a kind cluster on purpose, then watch an Observe agent</title>
      <dc:creator>Muhtalip Dede</dc:creator>
      <pubDate>Sun, 16 Aug 2026 11:47:42 +0000</pubDate>
      <link>https://dev.to/muhtalipdede/break-a-kind-cluster-on-purpose-then-watch-an-observe-agent-2ceg</link>
      <guid>https://dev.to/muhtalipdede/break-a-kind-cluster-on-purpose-then-watch-an-observe-agent-2ceg</guid>
      <description>&lt;p&gt;One command from kprompt-examples: kind up, seven failure scenarios, verify they actually broke, then run the Observe agent offline in heuristic mode — $0, no silent auto-heal.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://kprompt.ai/blog/observe-agent-kind-demo" rel="noopener noreferrer"&gt;https://kprompt.ai/blog/observe-agent-kind-demo&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;v0.5 shipped the optional &lt;a href="https://kprompt.ai/docs/agent" rel="noopener noreferrer"&gt;Observe agent&lt;/a&gt;: always-on watch → correlated Incident → gated Slack/webhook, with Autopilot still propose-only. The missing piece for a live walkthrough was a &lt;code&gt;payments&lt;/code&gt; namespace that actually misbehaves — not a slide claiming CrashLoopBackOff.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/kprompt/kprompt-examples" rel="noopener noreferrer"&gt;kprompt-examples&lt;/a&gt; is that fixture set. Break the cluster on purpose, then watch the agent react without spending an LLM token.&lt;/p&gt;

&lt;h2&gt;
  
  
  One command
&lt;/h2&gt;

&lt;p&gt;Needs Docker, kind, kubectl, and kprompt with the &lt;code&gt;agent&lt;/code&gt; subcommand. Heuristic mode — no API key, no spend. &lt;code&gt;DEMO_SECONDS=60&lt;/code&gt; stretches the agent window for recordings.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/kprompt/kprompt-examples.git
&lt;span class="nb"&gt;cd &lt;/span&gt;kprompt-examples
make walkthrough   &lt;span class="c"&gt;# up → break-all → verify → agent-full (~45s)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or step by step when you want to film each failure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make up
make &lt;span class="nb"&gt;break &lt;/span&gt;&lt;span class="nv"&gt;SCENARIO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;01-crashloop
make verify
kprompt agent run &lt;span class="nt"&gt;-n&lt;/span&gt; payments &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--emit-initial&lt;/span&gt; &lt;span class="nt"&gt;--analyze&lt;/span&gt; &lt;span class="nt"&gt;--fetch-logs&lt;/span&gt; &lt;span class="nt"&gt;--health&lt;/span&gt; &lt;span class="nt"&gt;--heuristic&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--memory&lt;/span&gt; &lt;span class="nt"&gt;--patterns&lt;/span&gt; &lt;span class="nt"&gt;--autopilot-propose&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;--emit-initial&lt;/code&gt; matters: a live watch stays quiet until new Pod/Event traffic. Already-broken workloads may not re-emit until the next &lt;code&gt;BackOff&lt;/code&gt;. Emitting current state first makes demos and CI deterministic.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you should see
&lt;/h2&gt;

&lt;p&gt;Seven scenarios in one namespace, with a healthy baseline so the health score has something Ready to weigh against:&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;Rough signal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CrashLoop&lt;/td&gt;
&lt;td&gt;Restarting container / BackOff&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ImagePull&lt;/td&gt;
&lt;td&gt;ImagePullBackOff / ErrImagePull&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OOM&lt;/td&gt;
&lt;td&gt;OOMKilled / Exit 137&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stalled rollout&lt;/td&gt;
&lt;td&gt;Progress deadline / unavailable replicas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unbound PVC&lt;/td&gt;
&lt;td&gt;Pending Pod waiting on volume&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failing CronJob&lt;/td&gt;
&lt;td&gt;Job failures / backoff&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Missing Redis hostname&lt;/td&gt;
&lt;td&gt;DNS / connection errors to a stub Service name&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Expect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Health score moves while baseline &lt;code&gt;web&lt;/code&gt; stays Ready&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Correlated Incidents&lt;/strong&gt; and gated alerts — not one Slack message per kubelet Event&lt;/li&gt;
&lt;li&gt;With &lt;code&gt;--autopilot-propose&lt;/code&gt;: a propose-only rollback suggestion on the stalled checkout rollout (&lt;code&gt;Applied&lt;/code&gt; stays &lt;strong&gt;false&lt;/strong&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last point is the product claim: Observe never applies, patches, or deletes by default (&lt;a href="https://github.com/kprompt/kprompt-architecture/blob/main/decisions/ADR-0013-in-cluster-agent.md" rel="noopener noreferrer"&gt;ADR-0013&lt;/a&gt;). Autopilot emits PlanResult-shaped proposals (&lt;a href="https://github.com/kprompt/kprompt-architecture/blob/main/decisions/ADR-0015-autopilot-mode.md" rel="noopener noreferrer"&gt;ADR-0015&lt;/a&gt;); apply stays gated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this is not “AI auto-heal”
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Surface&lt;/th&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Laptop CLI&lt;/td&gt;
&lt;td&gt;Reactive: NL → PlanResult → approve → apply&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Observe agent&lt;/td&gt;
&lt;td&gt;Always-on: watch → Incident → severity/confidence gate → notify&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Autopilot&lt;/td&gt;
&lt;td&gt;Opt-in propose-only; apply needs policy + explicit approve&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;K8sGPT-style tools are great at on-demand scan → explain. Observe is a different job: continuous watch with threaded alerts from live Events/Pods. Do not expect fleet-scanner or multi-agent-framework parity — we ship one kprompt-native pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest limits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Heuristic analysis is deterministic and offline — useful for demos and CI, not a substitute for a real BYOK LLM run&lt;/li&gt;
&lt;li&gt;Redis/Postgres in the dependency scenario are busybox stubs for Service-name discovery, not databases&lt;/li&gt;
&lt;li&gt;Full caveats live in the &lt;a href="https://github.com/kprompt/kprompt-examples#readme" rel="noopener noreferrer"&gt;examples README&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Experimental — prefer kind / non-prod first&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Release narrative: &lt;a href="https://kprompt.ai/blog/kprompt-v0-5-observe-agent" rel="noopener noreferrer"&gt;kprompt v0.5 Observe agent&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Flags, RBAC, cost gates: &lt;a href="https://kprompt.ai/docs/agent" rel="noopener noreferrer"&gt;docs/agent&lt;/a&gt; · &lt;a href="https://github.com/kprompt/kprompt/blob/main/docs/agent-ops.md" rel="noopener noreferrer"&gt;agent-ops&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Install: &lt;code&gt;brew install kprompt/tap/kprompt&lt;/code&gt; or &lt;code&gt;curl -fsSL https://kprompt.ai/install | bash&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Try:&lt;/strong&gt; &lt;a href="https://kprompt.ai" rel="noopener noreferrer"&gt;kprompt.ai&lt;/a&gt; · &lt;a href="https://github.com/kprompt/kprompt" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://github.com/kprompt/kprompt-examples" rel="noopener noreferrer"&gt;kprompt-examples&lt;/a&gt;&lt;br&gt;
Muhtalip&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>sre</category>
      <category>ai</category>
    </item>
    <item>
      <title>Kubernetes OOMKilled — diagnose with a plan, not a wall of kubectl</title>
      <dc:creator>Muhtalip Dede</dc:creator>
      <pubDate>Fri, 14 Aug 2026 20:29:14 +0000</pubDate>
      <link>https://dev.to/muhtalipdede/kubernetes-oomkilled-diagnose-with-a-plan-not-a-wall-of-kubectl-4997</link>
      <guid>https://dev.to/muhtalipdede/kubernetes-oomkilled-diagnose-with-a-plan-not-a-wall-of-kubectl-4997</guid>
      <description>&lt;p&gt;OOMKilled is a classic day-2 rabbit hole: events, limits, restarts, then a risky scale or edit. kprompt turns the investigation prompt into a reviewable plan before apply.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://kprompt.ai/blog/kubernetes-oomkilled" rel="noopener noreferrer"&gt;https://kprompt.ai/blog/kubernetes-oomkilled&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;OOMKilled is one of the most common “the app is broken” signals in Kubernetes — and one of the easiest to misread. The Pod may still show Running. Restarts climb. Logs look fine until they stop mid-request. Someone raises the memory limit “a bit,” the Deployment rolls, and two hours later it happens again. Or worse: they remove the limit entirely and the node starts evicting neighbors.&lt;/p&gt;

&lt;p&gt;This guide is the operator ladder for memory kills: how to confirm OOMKilled, how requests and limits differ, what kubectl shows, and how to apply a bounded fix with a reviewable plan. kprompt's explain path detects OOM findings and can propose a memory patch — still behind approval, because raising limits is a real cluster change.&lt;/p&gt;

&lt;h2&gt;
  
  
  What OOMKilled actually means
&lt;/h2&gt;

&lt;p&gt;When a container exceeds its memory limit, the Linux OOM killer (via cgroup enforcement) terminates the process. Kubernetes records the termination reason as OOMKilled. Exit code is often 137 (128 + SIGKILL). That is not an application “bug code” — it is the kernel saying the cgroup ran out of memory.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Limit hit → container killed → kubelet may restart it (CrashLoopBackOff if it keeps dying)&lt;/li&gt;
&lt;li&gt;No memory limit → the container can grow until the node is under pressure (evictions, not always a clean OOMKilled on that Pod)&lt;/li&gt;
&lt;li&gt;Requests affect scheduling; limits affect kill behavior — confusing them is the most common ops mistake&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Confirm it before you patch
&lt;/h2&gt;

&lt;p&gt;Do not raise memory because “it feels like OOM.” Read the Pod status. The smoking gun is usually Last State / Last Termination State on the container: Reason OOMKilled, Exit Code 137.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Classic kubectl confirmation&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get pods &lt;span class="nt"&gt;-n&lt;/span&gt; staging
kubectl describe pod &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;api &lt;span class="nt"&gt;-n&lt;/span&gt; staging
&lt;span class="c"&gt;# Look under Containers → Last State:&lt;/span&gt;
&lt;span class="c"&gt;#   Reason: OOMKilled&lt;/span&gt;
&lt;span class="c"&gt;#   Exit Code: 137&lt;/span&gt;

kubectl get pod &lt;span class="nt"&gt;-n&lt;/span&gt; staging &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;jsonpath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'{range .items[*]}{.metadata.name}{"\t"}{range .status.containerStatuses[*]}{.name}{"="}{.lastState.terminated.reason}{" "}{end}{"\n"}{end}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also check current limits on the Deployment template — describe Pod shows what ran; the Deployment owns what will run next:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;See memory requests and limits&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get deploy api &lt;span class="nt"&gt;-n&lt;/span&gt; staging &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;jsonpath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'{range .spec.template.spec.containers[*]}{.name}{" limits="}{.resources.limits.memory}{" requests="}{.resources.requests.memory}{"\n"}{end}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Requests vs limits (the part people skip)
&lt;/h2&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;What it does&lt;/th&gt;
&lt;th&gt;OOM relevance&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;requests.memory&lt;/td&gt;
&lt;td&gt;Scheduler places the Pod on a node with enough capacity&lt;/td&gt;
&lt;td&gt;Too low → noisy neighbor risk; does not by itself OOMKill&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;limits.memory&lt;/td&gt;
&lt;td&gt;Hard cgroup cap for the container&lt;/td&gt;
&lt;td&gt;Exceed this → OOMKilled&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No limit&lt;/td&gt;
&lt;td&gt;Container can use free node memory&lt;/td&gt;
&lt;td&gt;May avoid OOMKilled on that Pod; can hurt the node&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A healthy fix usually raises the limit (and often the request toward a sensible fraction of that limit) based on observed usage — not deleting limits to “make it stop.” If you have Prometheus, compare working set / RSS to the current limit before you double everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  kubectl explain ladder for memory kills
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Scope — which Deployment / Pod, which namespace and context&lt;/li&gt;
&lt;li&gt;Status — restarts, Ready, Last State reason&lt;/li&gt;
&lt;li&gt;Resources — limits and requests on the crashing container&lt;/li&gt;
&lt;li&gt;Events — Failed / OOM / eviction messages on Pod or node&lt;/li&gt;
&lt;li&gt;Logs — --previous for the crashed instance (may be empty if killed hard)&lt;/li&gt;
&lt;li&gt;Change — bump memory or roll back a bad image / leaky release&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Investigation sequence&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl describe deploy api &lt;span class="nt"&gt;-n&lt;/span&gt; staging
kubectl describe pod &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;api &lt;span class="nt"&gt;-n&lt;/span&gt; staging
kubectl logs deploy/api &lt;span class="nt"&gt;-n&lt;/span&gt; staging &lt;span class="nt"&gt;--previous&lt;/span&gt; &lt;span class="nt"&gt;--tail&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;100
kubectl get events &lt;span class="nt"&gt;-n&lt;/span&gt; staging &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;OOMKilling &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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Natural-language explain → suggested patch
&lt;/h2&gt;

&lt;p&gt;kprompt's explain path walks live Deployment → Pod → Events → Logs style signals. When it finds OOMKilled on a container, it can propose a follow-up: raise the Deployment memory limit (typically doubling a known limit in the suggested plan) and show the plan for approval. Reads run immediately; the patch does not apply until you confirm — or you pass --approve in a context you trust.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Detect and review a memory fix&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ kprompt "explain why api is crashing" -n staging

# … findings include OOMKilled on container app …

Suggested fix (requires approval):
Plan
  1. patch Deployment/api memory limit (e.g. 64Mi → 128Mi)

Risk: medium
Apply? [y/N]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the intent-compiler shape: evidence from the apiserver, a concrete mutation plan, human gate. It is not “the model silently edited production.” If you reject the plan, nothing changes — dig into leaks, heap dumps, or a bad release instead.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use explain first on non-production or a staging clone of the workload&lt;/li&gt;
&lt;li&gt;Read the before→after memory numbers in the plan — doubling forever is not a strategy&lt;/li&gt;
&lt;li&gt;Prefer fixing leaks for steady growth; raise limits for genuine under-provisioning&lt;/li&gt;
&lt;li&gt;After apply, use --wait on related rollouts or watch the Deployment until restarts stabilize&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Manual patch when you want exact numbers
&lt;/h2&gt;

&lt;p&gt;Sometimes you already know the target (512Mi limit, 256Mi request). Use kubectl or a reviewed kprompt plan with an explicit change — do not approve a suggested bump you have not sanity-checked against metrics.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Explicit memory patch&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl &lt;span class="nb"&gt;set &lt;/span&gt;resources deploy/api &lt;span class="nt"&gt;-n&lt;/span&gt; staging &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--limits&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;memory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;512Mi &lt;span class="nt"&gt;--requests&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;memory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;256Mi

&lt;span class="c"&gt;# or edit the template&lt;/span&gt;
kubectl edit deploy api &lt;span class="nt"&gt;-n&lt;/span&gt; staging
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  When raising memory is the wrong fix
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Memory leak — usage climbs until any limit dies; fix the app or roll back the release&lt;/li&gt;
&lt;li&gt;Cache without bound — tune the process (JVM heap, Node heap, Go pacer) to fit the cgroup&lt;/li&gt;
&lt;li&gt;Wrong container — sidecar OOMs while you patch the app container&lt;/li&gt;
&lt;li&gt;Node pressure — Pod evicted or node NotReady; look at node allocatable and neighbors&lt;/li&gt;
&lt;li&gt;Burst then idle — a higher limit may be fine; also consider HPA/VPA later, not blind doubles&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Production habits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Confirm OOMKilled in Last State before changing resources&lt;/li&gt;
&lt;li&gt;Change one variable at a time — memory patch or image rollback, not both blind&lt;/li&gt;
&lt;li&gt;Keep limits; size them from data&lt;/li&gt;
&lt;li&gt;Record the plan (kprompt history or -o json) for the incident timeline&lt;/li&gt;
&lt;li&gt;Revisit after 24h of metrics — did working set settle under the new limit?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it on a sandbox Deployment
&lt;/h2&gt;

&lt;p&gt;Spin a tiny limit on kind or staging, force an OOM, then run explain and decide whether to approve the suggested patch. Pair with the &lt;a href="https://kprompt.ai/blog/kubernetes-imagepullbackoff" rel="noopener noreferrer"&gt;ImagePullBackOff guide&lt;/a&gt; when the Pod never starts, and with the &lt;a href="https://kprompt.ai/blog/kubernetes-crashloopbackoff" rel="noopener noreferrer"&gt;CrashLoopBackOff guide&lt;/a&gt; when the memory kill is what keeps the container looping.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Quick start&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://kprompt.ai/install | bash
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;KPROMPT_GEMINI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;

kprompt &lt;span class="s2"&gt;"explain why api is crashing"&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; staging
&lt;span class="c"&gt;# review Suggested fix → y or n&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;Try:&lt;/strong&gt; &lt;a href="https://kprompt.ai" rel="noopener noreferrer"&gt;kprompt.ai&lt;/a&gt; · &lt;a href="https://github.com/kprompt/kprompt" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;code&gt;brew install kprompt/tap/kprompt&lt;/code&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>sre</category>
      <category>devops</category>
      <category>debugging</category>
    </item>
    <item>
      <title>An intent compiler for Kubernetes — not another chat REPL</title>
      <dc:creator>Muhtalip Dede</dc:creator>
      <pubDate>Fri, 14 Aug 2026 20:28:01 +0000</pubDate>
      <link>https://dev.to/muhtalipdede/an-intent-compiler-for-kubernetes-not-another-chat-repl-3abh</link>
      <guid>https://dev.to/muhtalipdede/an-intent-compiler-for-kubernetes-not-another-chat-repl-3abh</guid>
      <description>&lt;p&gt;Chat CLIs optimize for turn-taking. Operators need a reviewable artifact before mutate.&lt;/p&gt;

&lt;p&gt;kprompt is built as an intent compiler: NL → PlanResult → safety → approve → apply. Same day-2 surface (Helm, Prom, GitOps…) under one approval loop. Experimental.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://kprompt.ai/blog/intent-compiler-not-chat" rel="noopener noreferrer"&gt;https://kprompt.ai/blog/intent-compiler-not-chat&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Most Kubernetes AI demos look the same in a screenshot: a prompt box, some English, something that resembles kubectl. Underneath, products diverge. Some scan the cluster. Some run agents inside it. Some host chat in a SaaS control plane. And in the local CLI lane — where kubectl-ai and kprompt both sit — the important question is not who has the slicker REPL. It is what the tool emits before anything hits the apiserver.&lt;/p&gt;

&lt;p&gt;Our locked bet: kprompt is an intent compiler. Plain English compiles into a typed, reviewable PlanResult — actions, risk, hard denies — that a human or CI can gate, then apply. It is not a free-form agent chat optimized for “keep talking until the cluster moves.” That difference is the product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Same lane, different contract
&lt;/h2&gt;

&lt;p&gt;We do not claim a unique category against every Kubernetes AI tool. The map is simpler:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;K8sGPT — analyzer-first diagnosis (scan → explain). We are not a fleet scanner.&lt;/li&gt;
&lt;li&gt;Kagent — in-cluster agent framework. We ship an optional Observe-only agent, not a multi-agent platform.&lt;/li&gt;
&lt;li&gt;Hosted chat — managed control planes. We are BYOK and local by default.&lt;/li&gt;
&lt;li&gt;kubectl-ai — natural-language kubectl fluency. Same lane as us; different mutate contract.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Trying to out-chat &lt;a href="https://github.com/GoogleCloudPlatform/kubectl-ai" rel="noopener noreferrer"&gt;kubectl-ai&lt;/a&gt; on agentic REPL features is a losing strategy. Google can ship conversation quality and tool-calling surface area faster than a small OSS project. Competing there means forever second place. Competing on a printable, policy-shaped plan artifact is a fight worth picking.&lt;/p&gt;

&lt;h2&gt;
  
  
  What “intent compiler” means in practice
&lt;/h2&gt;

&lt;p&gt;A chat REPL optimizes for turn-taking: the model calls tools, narrates, maybe runs kubectl. An intent compiler optimizes for an artifact you can refuse:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Compile → review → apply (or abort)&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;kprompt &lt;span class="s2"&gt;"scale api to 3"&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; staging
&lt;span class="go"&gt;
Plan
  1. kubectl scale deployment/api --replicas=3 -n staging

Risk: low
Apply? [y/N] n
Aborted.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;LLM proposes intent; Go packages own planning, safety, and execution&lt;/li&gt;
&lt;li&gt;Mutations default to plan-only until y/N or an explicit --approve&lt;/li&gt;
&lt;li&gt;Wipe-class prompts hard-deny before a useful apply path exists&lt;/li&gt;
&lt;li&gt;CI consumes the same PlanResult JSON humans see summarized in the terminal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Same prompt, machine-readable gate&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kprompt &lt;span class="s2"&gt;"scale api to 3"&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; staging &lt;span class="nt"&gt;-o&lt;/span&gt; json | &lt;span class="se"&gt;\&lt;/span&gt;
  jq &lt;span class="s1"&gt;'{intent:.plan.intent, risk:.risk, denied:.risk.denied}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why the artifact matters more than the chat
&lt;/h2&gt;

&lt;p&gt;Platform teams already distrust “AI applied something.” They trust diffs, PRs, admission policy, and change tickets. A scrollback of model narration does not fit that muscle memory. A PlanResult does: intent, ordered actions, risk level, denied flag, applied boolean — something you can jq, archive, and teach juniors to read before they type y.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Chat REPL instinct&lt;/th&gt;
&lt;th&gt;Intent compiler instinct&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Keep the session going until it works&lt;/td&gt;
&lt;td&gt;Emit one plan; refuse or approve&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tool calls are the product&lt;/td&gt;
&lt;td&gt;The gated plan is the product&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Speed to first kubectl&lt;/td&gt;
&lt;td&gt;Speed to a reviewable change&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hard to put in CI without scraping text&lt;/td&gt;
&lt;td&gt;JSON PlanResult is a first-class gate&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Neither instinct is “wrong.” If you want kubectl fluency in an interactive session, a chat-shaped CLI is rational. If you want NL day-2 ops that behave like a change you would put in a pipeline, compile to a plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  One contract across tools
&lt;/h2&gt;

&lt;p&gt;The compiler model only pays off if it stretches past kubectl scale. kprompt routes day-2 backends — Helm install/upgrade previews, Prometheus performance explains, trace adapters, Workflow generation — through the same plan → safety → approve loop. The LLM does not become a second control plane; it proposes steps against real CLIs and APIs you already run.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Different backends, same gate&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kprompt &lt;span class="s2"&gt;"install redis"&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; cache
kprompt &lt;span class="s2"&gt;"why is my api slow?"&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; production
kprompt &lt;span class="s2"&gt;"explain why api is crashing"&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; staging
&lt;span class="c"&gt;# Mutating suggestions still show a plan before apply&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Post-v1 originality we are building toward — not shipping as vapor demos — is cluster-level NL ops on that same contract: optimize my cluster style reports with optional approved fixes, and service dependency graphs grounded in Kubernetes (and traces when available). Still plan-before-apply. Never a silent controller.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we are not selling today
&lt;/h2&gt;

&lt;p&gt;Honesty is part of the positioning. The Apache-2.0 CLI is free, local, and BYOK. Org policy sync, shared audit, and Team enrollment are explored for later — there is nothing to buy on the site today, and this post is not a pricing page. When governance ships, it should attach to the same PlanResult artifact, not invent a parallel chatbot product.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not a hosted agent in your cluster (OSS path)&lt;/li&gt;
&lt;li&gt;Not “unique NL kubectl” — kubectl-ai shares that job&lt;/li&gt;
&lt;li&gt;Not a replacement for RBAC, admission, or GitOps&lt;/li&gt;
&lt;li&gt;Experimental — hard denies help; they are not a production certificate&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to evaluate us in one afternoon
&lt;/h2&gt;

&lt;p&gt;Do not score kprompt on who tells a better joke in a 40-turn chat. Score the contract:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Same mutate prompt in kubectl-ai and kprompt — what prints before apply?&lt;/li&gt;
&lt;li&gt;Wipe-class prompt — does it fail closed?&lt;/li&gt;
&lt;li&gt;JSON gate — can CI reject denied/high-risk without scraping ANSI?&lt;/li&gt;
&lt;li&gt;Wrong namespace / scale to zero — does the plan make the blast radius obvious?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Thirty-minute drill&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://kprompt.ai/install | bash
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;KPROMPT_GEMINI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;

kprompt &lt;span class="s2"&gt;"delete all pods"&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; staging
kprompt &lt;span class="s2"&gt;"scale api to 0"&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; staging &lt;span class="nt"&gt;-o&lt;/span&gt; json | jq .risk
kprompt &lt;span class="s2"&gt;"scale api to 2"&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; staging
&lt;span class="c"&gt;# read plan → n or y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Design principle we will not trade away
&lt;/h2&gt;

&lt;p&gt;Compile to PlanResult, not chat scroll. The LLM proposes; the product artifact is a structured plan humans and policy can gate. Feature parity with agentic REPLs is explicitly out of scope as a north star. If a future feature cannot show up in a reviewable plan (or a clear read-only report), it probably is not a kprompt feature.&lt;/p&gt;

&lt;p&gt;For the peer map, read the &lt;a href="https://kprompt.ai/blog/kubernetes-ai-tools-comparison" rel="noopener noreferrer"&gt;AI tools comparison&lt;/a&gt;. For a direct head-to-head, see &lt;a href="https://kprompt.ai/blog/kprompt-vs-kubectl-ai" rel="noopener noreferrer"&gt;kprompt vs kubectl-ai&lt;/a&gt;. For the safety loop, read &lt;a href="https://kprompt.ai/blog/kubernetes-safety-plan-approve" rel="noopener noreferrer"&gt;plan → approve&lt;/a&gt;. For CI schema, read &lt;a href="https://kprompt.ai/blog/planresult-json-deep-dive" rel="noopener noreferrer"&gt;PlanResult JSON deep dive&lt;/a&gt; and &lt;a href="https://kprompt.ai/blog/kubernetes-ci-cd-plan-gates" rel="noopener noreferrer"&gt;PlanResult gates&lt;/a&gt;. Talk to your cluster — but make the cluster change look like something you would sign.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Try:&lt;/strong&gt; &lt;a href="https://kprompt.ai" rel="noopener noreferrer"&gt;kprompt.ai&lt;/a&gt; · &lt;a href="https://github.com/kprompt/kprompt" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;code&gt;brew install kprompt/tap/kprompt&lt;/code&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>architecture</category>
      <category>ai</category>
    </item>
    <item>
      <title>kprompt vs kubectl-ai: plan-before-apply vs NL kubectl</title>
      <dc:creator>Muhtalip Dede</dc:creator>
      <pubDate>Fri, 14 Aug 2026 20:26:45 +0000</pubDate>
      <link>https://dev.to/muhtalipdede/kprompt-vs-kubectl-ai-plan-before-apply-vs-nl-kubectl-5ggk</link>
      <guid>https://dev.to/muhtalipdede/kprompt-vs-kubectl-ai-plan-before-apply-vs-nl-kubectl-5ggk</guid>
      <description>&lt;p&gt;If you are shopping for a “kubectl-ai alternative,” you are already in the right lane: local kubeconfig + BYOK + natural language. The fork in the road is the mutate contract.&lt;/p&gt;

&lt;p&gt;kprompt compiles intent into a typed PlanResult (actions, risk, hard denies), then requires approve before apply — including CI JSON gates. kubectl-ai is often a faster path to kubectl-shaped execution.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://kprompt.ai/blog/kprompt-vs-kubectl-ai" rel="noopener noreferrer"&gt;https://kprompt.ai/blog/kprompt-vs-kubectl-ai&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;If you searched for a &lt;a href="https://github.com/GoogleCloudPlatform/kubectl-ai" rel="noopener noreferrer"&gt;kubectl-ai&lt;/a&gt; alternative or “AI Kubernetes CLI,” you will land on Google’s kubectl-ai and a handful of peers. kprompt sits in the same lane: local binary, your kubeconfig, natural language in. The useful question is not who has the slicker chat — it is what happens before anything mutates the cluster. For a job-first alternatives map (keep kubectl-ai vs switch), see &lt;a href="https://kprompt.ai/blog/kubectl-ai-alternatives" rel="noopener noreferrer"&gt;kubectl-ai alternatives&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Short answer: use kubectl-ai when you want an agentic REPL that is excellent at generating and running kubectl. Use kprompt when you want an &lt;a href="https://kprompt.ai/blog/intent-compiler-not-chat" rel="noopener noreferrer"&gt;intent compiler&lt;/a&gt; — a typed, reviewable plan with risk and hard denies, optional CI JSON, and day-2 backends (Helm, metrics, GitOps) under one approval loop. Same problem space; different contract.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick decision
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;You care about…&lt;/th&gt;
&lt;th&gt;Prefer&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fast kubectl fluency / interactive chat with tool calls&lt;/td&gt;
&lt;td&gt;kubectl-ai&lt;/td&gt;
&lt;td&gt;REPL-first; strong model + tool-calling surface from Google’s project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reviewable plan before every mutate&lt;/td&gt;
&lt;td&gt;kprompt&lt;/td&gt;
&lt;td&gt;Plan → safety → y/N (or --approve); wipe-class hard denies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gate plans in CI with stable JSON&lt;/td&gt;
&lt;td&gt;kprompt&lt;/td&gt;
&lt;td&gt;PlanResult on stdout; human UI on stderr&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One NL layer across Helm / Prom / GitOps&lt;/td&gt;
&lt;td&gt;kprompt&lt;/td&gt;
&lt;td&gt;Multi-tool routes with aggregate plan + single approval&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP server / IDE agent integration today&lt;/td&gt;
&lt;td&gt;Either&lt;/td&gt;
&lt;td&gt;kubectl-ai has broad MCP mode; kprompt mcp serve is read/plan-only — mutations return a PlanResult, never auto-apply&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BYOK + Apache-2.0 laptop-local CLI&lt;/td&gt;
&lt;td&gt;Either&lt;/td&gt;
&lt;td&gt;Both keep kubeconfig local; pick by mutate contract&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Side-by-side
&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;kubectl-ai&lt;/th&gt;
&lt;th&gt;kprompt&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Primary artifact&lt;/td&gt;
&lt;td&gt;Conversation + generated kubectl / tool calls&lt;/td&gt;
&lt;td&gt;PlanResult (actions, risk, denies)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default mutate UX&lt;/td&gt;
&lt;td&gt;Agent executes kubectl (modes vary)&lt;/td&gt;
&lt;td&gt;Show plan → approve on TTY&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Safety model&lt;/td&gt;
&lt;td&gt;Tool / mode dependent&lt;/td&gt;
&lt;td&gt;Risk scoring + hard denies (wipe-class)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI / policy gate&lt;/td&gt;
&lt;td&gt;Bring your own wrappers&lt;/td&gt;
&lt;td&gt;First-class --output json PlanResult&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Day-2 stack&lt;/td&gt;
&lt;td&gt;kubectl (+ extensible tools / MCP)&lt;/td&gt;
&lt;td&gt;Helm, Argo, Prom, OTel, Grafana, GitOps… via tools detect&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Positioning&lt;/td&gt;
&lt;td&gt;AI-powered kubectl assistant&lt;/td&gt;
&lt;td&gt;Intent compiler → AI SRE direction&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What a scale looks like in each
&lt;/h2&gt;

&lt;p&gt;Illustrative shapes — versions and flags change; read current docs for each project.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;kubectl-ai — NL → kubectl fluency&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl-ai &lt;span class="s2"&gt;"scale deployment api to 3 in staging"&lt;/span&gt;
&lt;span class="c"&gt;# Typically proposes / runs the matching kubectl&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;kprompt — compile → review → apply&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kprompt "scale api to 3" -n staging

Plan
  1. scale Deployment/api replicas → 3

Risk: low
Apply? [y/N]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your team’s fear is “the model applied something I did not see,” kprompt’s default path is built around that fear. If your team’s fear is “I am slow at remembering kubectl under pressure,” kubectl-ai’s REPL is built around that fear. Both are legitimate.&lt;/p&gt;

&lt;h2&gt;
  
  
  When kprompt is the better fit
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Shared clusters where every mutate needs a visible plan&lt;/li&gt;
&lt;li&gt;CI pipelines that must jq on risk.denied / plan.actions&lt;/li&gt;
&lt;li&gt;Prompts that span Helm install, Prom explain, then an approved scale&lt;/li&gt;
&lt;li&gt;Hard deny for wipe jokes and unscoped deletes as product behavior&lt;/li&gt;
&lt;li&gt;You want the long-term AI SRE path (investigate / blast-radius) without giving up approval&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When kubectl-ai is the better fit
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You want a chat REPL that stays close to raw kubectl&lt;/li&gt;
&lt;li&gt;MCP / IDE agent workflows are the primary integration&lt;/li&gt;
&lt;li&gt;You already standardize on Google’s kubectl-ai releases and models&lt;/li&gt;
&lt;li&gt;You prefer maximum conversational flexibility over a fixed PlanResult schema&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Honest limits (both sides)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Neither replaces RBAC, admission controllers, or GitOps as source of truth&lt;/li&gt;
&lt;li&gt;Neither is production-hardened by slogan — try on kind / staging first&lt;/li&gt;
&lt;li&gt;kprompt is experimental OSS; plans can be wrong — always read the plan&lt;/li&gt;
&lt;li&gt;kubectl-ai is a fast-moving Google project — features and UX shift; check upstream README&lt;/li&gt;
&lt;li&gt;We are not claiming to out-chat kubectl-ai on agentic REPL quality&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try kprompt in five minutes
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Install + safe read + one mutate plan&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;kprompt/tap/kprompt
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;KPROMPT_GEMINI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;

kprompt &lt;span class="s2"&gt;"list deployments"&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; staging
kprompt &lt;span class="s2"&gt;"scale api to 2"&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; staging   &lt;span class="c"&gt;# review plan, then y/N&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the wider peer map (K8sGPT, Kagent, hosted chat), see the &lt;a href="https://kprompt.ai/blog/kubernetes-ai-tools-comparison" rel="noopener noreferrer"&gt;AI tools comparison&lt;/a&gt;. For where kprompt is headed beyond AI kubectl, see &lt;a href="https://kprompt.ai/blog/ai-sre-not-ai-kubectl" rel="noopener noreferrer"&gt;Beyond AI kubectl: why kprompt is aiming at AI SRE&lt;/a&gt; and &lt;a href="https://kprompt.ai/docs/roadmap" rel="noopener noreferrer"&gt;Roadmap &amp;amp; vision&lt;/a&gt;. Configure BYOK models on &lt;a href="https://kprompt.ai/docs/providers" rel="noopener noreferrer"&gt;Providers&lt;/a&gt;. Optional always-on alerts: &lt;a href="https://kprompt.ai/docs/agent" rel="noopener noreferrer"&gt;Observe agent&lt;/a&gt;. &lt;a href="https://kprompt.ai/docs/safety" rel="noopener noreferrer"&gt;Safety docs&lt;/a&gt; before shared-cluster --approve.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Try:&lt;/strong&gt; &lt;a href="https://kprompt.ai" rel="noopener noreferrer"&gt;kprompt.ai&lt;/a&gt; · &lt;a href="https://github.com/kprompt/kprompt" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;code&gt;brew install kprompt/tap/kprompt&lt;/code&gt;&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>cli</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
