<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Kubemoot</title><link>https://kubemoot.org/</link><description>Recent content on Kubemoot</description><generator>Hugo</generator><language>en</language><atom:link href="https://kubemoot.org/index.xml" rel="self" type="application/rss+xml"/><item><title>Agent CRD</title><link>https://kubemoot.org/docs/reference/agent/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/reference/agent/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;The Agent CRD declares an LLM-powered agent as a thin, capability-only resource and deploys it as a Kubernetes-native service. The Agent spec carries no model name, no server, and no GPU hint. Agents declare &lt;em&gt;what they can do&lt;/em&gt;; the scheduler matches them to a &lt;code&gt;(model, server, endpoint)&lt;/code&gt; via &lt;code&gt;CrewSchedulingPolicy&lt;/code&gt; rules over labeled &lt;code&gt;Model&lt;/code&gt; CRs.&lt;/p&gt;
&lt;p&gt;Agents orchestrate:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Models&lt;/strong&gt;: LLM inference resolved by the scheduler from &lt;code&gt;spec.capabilities&lt;/code&gt; + &lt;code&gt;CrewSchedulingPolicy&lt;/code&gt; (see &lt;a href="https://kubemoot.org/docs/architecture/scheduler/"&gt;scheduler.md&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Knowledge&lt;/strong&gt;: RAG retrieval via &lt;code&gt;spec.ragSources&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tools&lt;/strong&gt;: MCP tool execution via the MCPGateway, filtered by &lt;code&gt;spec.enabledTools&lt;/code&gt; / &lt;code&gt;spec.disabledTools&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Collaboration&lt;/strong&gt;: Multi-agent discussions via NATS JetStream, configured by &lt;code&gt;spec.discussRole&lt;/code&gt; / &lt;code&gt;spec.discussChannels&lt;/code&gt; / &lt;code&gt;spec.discussKeywords&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prompts&lt;/strong&gt;: System prompts composed from &lt;code&gt;PromptModule&lt;/code&gt; CRs referenced by &lt;code&gt;spec.promptRefs&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="supported-types"&gt;Supported Types&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Type&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;code&gt;chat&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Conversational agent with HTTP API&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;task&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Task-oriented agent (planned)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;workflow&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Multi-step workflow orchestration (planned)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="spec-fields"&gt;Spec Fields&lt;/h2&gt;
&lt;h3 id="spectype"&gt;&lt;code&gt;spec.type&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Agent type. Default: &lt;code&gt;chat&lt;/code&gt;. Only &lt;code&gt;chat&lt;/code&gt; is implemented today.&lt;/p&gt;</description></item><item><title>Kubemoot Architecture - Distributed Consensus vs Single-Model Orchestration</title><link>https://kubemoot.org/docs/architecture/consensus-vs-single-model/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/architecture/consensus-vs-single-model/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;Kubemoot composes capability horizontally - many small specialists, because no single model is big enough to do it all; intelligence is emergent from a committee. A single-model agent is the opposite: capability concentrated in one large reasoner that drives tools and, when needed, spawns copies of itself.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;a single-model coding agent, contrasting itself with Kubemoot&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id="purpose"&gt;Purpose&lt;/h2&gt;
&lt;p&gt;There are two broad shapes an agentic system can take. Kubemoot is one of them; most well-known agent systems are the other. The fastest way to understand &lt;em&gt;why Kubemoot is built the way it is&lt;/em&gt; - many small models, a coordinator, consensus signals over a message bus - is to hold it next to its opposite and see what each shape buys and costs.&lt;/p&gt;</description></item><item><title>Kubemoot Crew Fitness Functions</title><link>https://kubemoot.org/docs/fitness/kubemoot-crew-fitness-functions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/fitness/kubemoot-crew-fitness-functions/</guid><description>&lt;p&gt;Kubemoot implements architectural fitness functions as first-class Kubernetes resources. The &lt;code&gt;CrewFitness&lt;/code&gt; CRD allows operators and crew designers to define, execute, and observe fitness tests against deployed agent crews - declaratively, headlessly, and with automatic cleanup.&lt;/p&gt;
&lt;p&gt;This document describes how Kubemoot adapts the fitness function concept from &lt;a href="https://learning.oreilly.com/library/view/architecture-as-code/9798341640368/"&gt;&lt;em&gt;Architecture as Code&lt;/em&gt;&lt;/a&gt; (Richards, Ford, and Johnson) to the domain of AI agent crew orchestration.&lt;/p&gt;
&lt;h2 id="from-adl-to-kubernetes"&gt;From ADL to Kubernetes&lt;/h2&gt;
&lt;p&gt;An architectural fitness function is &amp;ldquo;any mechanism that provides an objective integrity check on some architectural characteristic,&amp;rdquo; as defined in &lt;em&gt;Building Evolutionary Architectures&lt;/em&gt; (Ford, Parsons, and Kua); &lt;em&gt;Architecture as Code&lt;/em&gt; (Richards, Ford, and Johnson) builds on the idea. In Kubemoot, the architectural characteristic under test is the &lt;strong&gt;crew&amp;rsquo;s discussion behavior&lt;/strong&gt; - does the crew answer questions correctly, does it stand aside on irrelevant input, does the coordinator synthesize Tooler and Analyst contributions?&lt;/p&gt;</description></item><item><title>Onboarding Guide</title><link>https://kubemoot.org/docs/operating/onboarding-guide/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/operating/onboarding-guide/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;When no agent in a crew can answer a question, the coordinator signals a capability gap. An agent running in onboarding mode reacts to that signal: it proposes an MCP server that could fill the gap. On the user&amp;rsquo;s consent it replies with a proposed &lt;code&gt;MCPServer&lt;/code&gt; manifest in the discussion thread. Applying that manifest, and creating the Tooler &lt;code&gt;Agent&lt;/code&gt; that uses it, are manual steps today.&lt;/p&gt;
&lt;p&gt;This page describes what ships today, how to enable it, and what is not automated yet. For the consensus signals that produce a gap, see &lt;a href="../../architecture/agentic-consensus/"&gt;Agentic Consensus&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Agentic Consensus</title><link>https://kubemoot.org/docs/architecture/agentic-consensus/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/architecture/agentic-consensus/</guid><description>&lt;p&gt;Kubemoot answers a question by convening the agents whose expertise fits it, letting
them investigate and deliberate, and settling on a synthesis once the crew has spoken.
This page is the architecture behind that: how the coordinator selects who takes part,
what a consensus signal means to the protocol, and why a discussion settles by state
rather than by a clock. For the concept-level model (roles, phases, signal vocabulary)
see &lt;a href="../../concepts/crews-and-agents/"&gt;Crews &amp;amp; Agents&lt;/a&gt;,
&lt;a href="../../concepts/consensus-model/"&gt;The Moot&lt;/a&gt;, and
&lt;a href="../../concepts/signals-and-protocol/"&gt;Signals &amp;amp; Protocol&lt;/a&gt; - this page assumes them and
goes one level deeper into the coordinator&amp;rsquo;s mechanics.&lt;/p&gt;</description></item><item><title>Crew CRD</title><link>https://kubemoot.org/docs/reference/crew/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/reference/crew/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;A &lt;code&gt;Crew&lt;/code&gt; groups a set of &lt;code&gt;Agent&lt;/code&gt;s (joined by the &lt;code&gt;kubemoot.ai/crew&lt;/code&gt; label) into one collaborating team, and configures crew-wide concerns: the discussion gateway and the crew&amp;rsquo;s &lt;strong&gt;working memory&lt;/strong&gt;. Agents are the workers; the Crew is the team-level context they share.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kubemoot.ai/v1alpha1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Crew&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;homelab-pilot&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;crew-homelab-pilot&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Homelab infrastructure crew&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;discussion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;maxFacts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5000&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ttlDays&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;365&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;injectLimit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;verifyOnAdd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The namespace separates names. The same crew name can run in many namespaces side by
side: the discussion, request, artifact, and memory subjects and keys a crew uses carry its
namespace and crew name after a fixed prefix (some operator subjects carry no namespace), so two crews named
&lt;code&gt;homelab-pilot&lt;/code&gt; in two different namespaces do not collide. This is naming separation,
not a security boundary: NATS has no authentication in this release, and a client that
can reach it can read any subject. See
&lt;a href="https://github.com/kubemoot/kubemoot/blob/main/SECURITY.md#security-model-and-known-limitations"&gt;Security model and known limitations&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Gherkin, ADL, and Fitness Functions</title><link>https://kubemoot.org/docs/fitness/gherkin-adl-and-fitness-functions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/fitness/gherkin-adl-and-fitness-functions/</guid><description>&lt;h2 id="purpose"&gt;Purpose&lt;/h2&gt;
&lt;p&gt;Kubemoot uses two structured languages: &lt;strong&gt;ADL&lt;/strong&gt; (the Architecture Definition Language, applied to agents) to compose agent prompts, and a &lt;strong&gt;fitness-function&lt;/strong&gt; format to specify executable acceptance checks for a crew. A natural question - especially for anyone arriving from a Behavior-Driven Development (BDD) background - is: &lt;em&gt;why not use Gherkin (Cucumber&amp;rsquo;s Given/When/Then) for either of these?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This document answers that. It is a general compare-and-contrast, not a proposal. It explains where Gherkin &lt;strong&gt;overlaps&lt;/strong&gt; with what Kubemoot already does, where it &lt;strong&gt;diverges&lt;/strong&gt;, and why Kubemoot settled on ADL plus a purpose-built fitness format. Gherkin remains a credible alternative substrate for one of the two surfaces; the reasoning below makes clear which, and why.&lt;/p&gt;</description></item><item><title>Kubemoot Dashboard</title><link>https://kubemoot.org/docs/operating/dashboard/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/operating/dashboard/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;The Kubemoot Dashboard is a web UI for looking at a running Kubemoot installation. It lists Kubemoot resources across namespaces, shows GPU node and model state, and streams agent discussions and NATS messages as they happen. It is a SvelteKit application that reads the Kubernetes API and the NATS bus from the server side; the browser never connects to either directly.&lt;/p&gt;
&lt;p&gt;Metrics, logs, and traces are not part of the dashboard. For those, see &lt;a href="../observability/"&gt;Observability&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Kubemoot Observability</title><link>https://kubemoot.org/docs/operating/observability/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/operating/observability/</guid><description>&lt;p&gt;How to observe what a Kubemoot crew is doing: the data it exposes, the surfaces that render it, and the external observability stack it depends on. For the dashboard UI itself see &lt;a href="https://kubemoot.org/docs/operating/dashboard/"&gt;dashboard.md&lt;/a&gt;; for the consensus protocol that produces most of this data see &lt;a href="https://kubemoot.org/docs/architecture/agentic-consensus/"&gt;agentic-consensus.md&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="what-you-can-observe"&gt;What you can observe&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Domain&lt;/th&gt;
 &lt;th&gt;Signals&lt;/th&gt;
 &lt;th&gt;Where it comes from&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Discussions / consensus&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Thread lifecycle, per-agent signals (&lt;code&gt;triaging&lt;/code&gt;, &lt;code&gt;evaluating&lt;/code&gt;, &lt;code&gt;waiting&lt;/code&gt;, &lt;code&gt;agree&lt;/code&gt;, &lt;code&gt;concern&lt;/code&gt;, &lt;code&gt;stand_aside&lt;/code&gt;, &lt;code&gt;failure&lt;/code&gt;, &lt;code&gt;block&lt;/code&gt;, &lt;code&gt;advisory&lt;/code&gt;, &lt;code&gt;synthesis&lt;/code&gt;), settle decisions, synthesis text&lt;/td&gt;
 &lt;td&gt;Coordinator + agents publish to NATS &lt;code&gt;kubemoot.discuss.&amp;lt;namespace&amp;gt;.&amp;lt;crew&amp;gt;.*&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Agent activity&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Heartbeats while GPU-queued, triage vs evaluation phases, per-call server attribution (which model/server/GPU served each call)&lt;/td&gt;
 &lt;td&gt;Agent runtime signals + metadata&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;GPU &amp;amp; scheduling&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Loaded-model footprints, in-flight tickets, server readiness, total/used VRAM, scheduling decisions&lt;/td&gt;
 &lt;td&gt;Operator-published server state (NATS KV) + DCGM&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Quality&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;MCP tool quality verdicts (hot/failing/out-of-norm)&lt;/td&gt;
 &lt;td&gt;MCP quality pipeline → &lt;code&gt;kubemoot.quality.*&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;RAG indexing&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Source indexing progress, chunk/embed status&lt;/td&gt;
 &lt;td&gt;RAGSource controller&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Fitness&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Per-scenario/iteration pass-rates, assertion results, durations, full conversation transcripts&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;CrewFitness&lt;/code&gt; / &lt;code&gt;CrewFitnessSuite&lt;/code&gt; → XLSX in NATS Object Store&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="surfaces"&gt;Surfaces&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kubemoot Dashboard&lt;/strong&gt;: the primary real-time view (discussion threads &amp;amp; timeline, agent topology, NATS messages, fitness suites, accelerator and model activity). Updates push-style via NATS JetStream SSE and k8s watch→SSE. See &lt;a href="https://kubemoot.org/docs/operating/dashboard/"&gt;dashboard.md&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NATS JetStream&lt;/strong&gt;: the event substrate. Streams: &lt;code&gt;KUBEMOOT_CHRONICLE&lt;/code&gt;, &lt;code&gt;KUBEMOOT_QUALITY&lt;/code&gt;, &lt;code&gt;KUBEMOOT_CHAT&lt;/code&gt;, &lt;code&gt;KUBEMOOT_OPERATOR&lt;/code&gt;, &lt;code&gt;KUBEMOOT_DISCUSS&lt;/code&gt;. Anything the dashboard shows is reconstructable from these.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prometheus metrics and Grafana dashboards&lt;/strong&gt; (optional): every Kubemoot component serves Prometheus metrics, and Kubemoot ships Grafana dashboards for them. See &lt;a href="https://kubemoot.org/docs/operating/observability/#1-metrics-prometheus-and-grafana-optional"&gt;Metrics: Prometheus and Grafana&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="the-three-pillars-of-observability"&gt;The three pillars of observability&lt;/h2&gt;
&lt;p&gt;Kubemoot leans on the cluster&amp;rsquo;s existing observability stack rather than shipping its own. The three pillars (&lt;strong&gt;metrics, logs, spans&lt;/strong&gt;) are at different stages.&lt;/p&gt;</description></item><item><title>Models in Kubemoot</title><link>https://kubemoot.org/docs/reference/models/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/reference/models/</guid><description>&lt;p&gt;This document covers the model layer end to end: the CRDs (ModelServer, Model, EmbeddingModel), how Agents reach a &lt;code&gt;(model, server)&lt;/code&gt; binding via the scheduler, the load-on-demand principle, the model catalog, and GPU compatibility for a reference deployment.&lt;/p&gt;
&lt;p&gt;For the framework behind these choices - why tool-calling fidelity outranks coding benchmarks, how to budget VRAM, and how to match model size to discussion role - see &lt;a href="../../concepts/choosing-a-model/"&gt;Choosing a Model&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="crd-hierarchy"&gt;CRD Hierarchy&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ModelServer (where - a model server endpoint)
 │
 ├── Model (what - labeled inference model on a server)
 │
 └── EmbeddingModel (what - embedding model for RAGSource indexing)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Agents declare &lt;strong&gt;capabilities&lt;/strong&gt;; the scheduler matches them to a &lt;code&gt;Model&lt;/code&gt; whose labels satisfy a &lt;code&gt;CrewSchedulingPolicy&lt;/code&gt;&amp;rsquo;s &lt;code&gt;require&lt;/code&gt; / &lt;code&gt;prefer&lt;/code&gt; selectors. See &lt;a href="../../architecture/scheduler/"&gt;Scheduler&lt;/a&gt; for the full algorithm.&lt;/p&gt;</description></item><item><title>Tooler-Analyst Architecture</title><link>https://kubemoot.org/docs/architecture/tooler-analyst-architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/architecture/tooler-analyst-architecture/</guid><description>&lt;h2 id="two-roles-that-serve-different-phases"&gt;Two Roles That Serve Different Phases&lt;/h2&gt;
&lt;p&gt;Kubemoot organizes the data-gathering and reasoning work of a discussion into two complementary roles that mirror how real teams operate: &lt;strong&gt;Toolers&lt;/strong&gt; who interact with live systems, and &lt;strong&gt;Analysts&lt;/strong&gt; who reason over what the Toolers found.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;&lt;/th&gt;
 &lt;th&gt;&lt;strong&gt;Toolers (MCP)&lt;/strong&gt;&lt;/th&gt;
 &lt;th&gt;&lt;strong&gt;Analysts (RAG)&lt;/strong&gt;&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Phase&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;EVALUATING&lt;/td&gt;
 &lt;td&gt;REVIEW&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Declared&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Agents with MCP tools&lt;/td&gt;
 &lt;td&gt;Agents with embedded domain docs&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Self-discovered&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Onboarding agent deploys new MCP servers&lt;/td&gt;
 &lt;td&gt;RTFM agent indexes new documentation&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Carries&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;MCP tools, no live tools in reasoning&lt;/td&gt;
 &lt;td&gt;RAG sources, no MCP tools&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Thinking&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;OFF (deterministic tool selection)&lt;/td&gt;
 &lt;td&gt;ON (reasoning over gathered data)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;Analogy&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;The person with their hands on the keyboard&lt;/td&gt;
 &lt;td&gt;The person with the manual open, weighing the evidence&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;strong&gt;GPU profile&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;Heavier (tool-calling inference)&lt;/td&gt;
 &lt;td&gt;Lighter (reasoning-focused, no tool overhead)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="why-separate-them"&gt;Why Separate Them&lt;/h3&gt;
&lt;p&gt;LLMs have a practical limit on how much context they can process while still reliably selecting tools and interpreting results. When a single agent carries both MCP tool schemas and RAG documentation in its system prompt, the prompt bloats and tool selection degrades. Separating concerns gives each agent a smaller, focused prompt: Toolers are better at picking the right tool, Analysts are better at weighing the evidence from those tools.&lt;/p&gt;</description></item><item><title>GPU Worker Nodes</title><link>https://kubemoot.org/docs/operating/gpu-worker-nodes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/operating/gpu-worker-nodes/</guid><description>&lt;p&gt;Kubemoot schedules models onto GPUs, but it does not create GPU nodes. This page covers
the general path for making an NVIDIA GPU usable by Kubernetes workloads, whether the
worker node is a bare-metal machine or a virtual machine, and ends with how a Kubemoot
&lt;code&gt;ModelServer&lt;/code&gt; then uses the node. A short worked example closes the page.&lt;/p&gt;
&lt;p&gt;The end state is one check: the node reports &lt;code&gt;nvidia.com/gpu&lt;/code&gt; capacity.&lt;/p&gt;
&lt;h2 id="choose-a-path"&gt;Choose a path&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Your worker node is&lt;/th&gt;
 &lt;th&gt;GPU access&lt;/th&gt;
 &lt;th&gt;Start at&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;A bare-metal machine with the GPU installed&lt;/td&gt;
 &lt;td&gt;Direct&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://kubemoot.org/docs/operating/gpu-worker-nodes/#install-the-driver-and-container-toolkit"&gt;Install the driver and container toolkit&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;A VM on a hypervisor (Proxmox, KVM, ESXi, and similar)&lt;/td&gt;
 &lt;td&gt;PCI passthrough of the whole card&lt;/td&gt;
 &lt;td&gt;&lt;a href="https://kubemoot.org/docs/operating/gpu-worker-nodes/#pass-the-gpu-through-to-the-vm"&gt;Pass the GPU through to the VM&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;A VM on a cloud provider&lt;/td&gt;
 &lt;td&gt;The provider&amp;rsquo;s GPU instance types&lt;/td&gt;
 &lt;td&gt;The provider&amp;rsquo;s documentation, then &lt;a href="https://kubemoot.org/docs/operating/gpu-worker-nodes/#install-the-driver-and-container-toolkit"&gt;Install the driver and container toolkit&lt;/a&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Passthrough hands the entire physical GPU to one VM. The host loses access to it while
the VM runs, and no second VM can share it. Plan one GPU per GPU worker VM. A cluster
scales by adding such nodes.&lt;/p&gt;</description></item><item><title>RAGSource Guide</title><link>https://kubemoot.org/docs/reference/ragsource-guide/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/reference/ragsource-guide/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;RAGSource is a Kubemoot CRD that manages the complete lifecycle of Retrieval-Augmented Generation knowledge sources. It automates: cloning source documents, chunking, embedding through a model server, storing vectors in pgvector, deploying a query service, and continuously verifying data integrity.&lt;/p&gt;
&lt;p&gt;The operator follows the Kubernetes reconciler contract: compare desired state (the RAGSource spec) against observed state (what&amp;rsquo;s actually in the vector store), and reconcile the difference.&lt;/p&gt;
&lt;h2 id="architecture"&gt;Architecture&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;RAGSource CR
 │
 ├─── Indexer Job (Java/Spring Boot)
 │ ├── Clone git repo / fetch documents
 │ ├── Chunk documents (TokenTextSplitter)
 │ ├── Generate embeddings (model server, /v1/embeddings)
 │ └── Store vectors in pgvector (Spring AI schema: data_{collection})
 │
 ├─── Query Service (Python/FastAPI)
 │ ├── Deployment + Service (auto-deployed)
 │ ├── POST /query - semantic search
 │ └── GET /info - collection stats (used by verification)
 │
 └─── Docling Serve Sidecar (for document source type)
 └── Converts PDF/DOCX/PPTX/HTML/images → markdown
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="component-images"&gt;Component Images&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Component&lt;/th&gt;
 &lt;th&gt;Image&lt;/th&gt;
 &lt;th&gt;Language&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Indexer&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;registry.example.com/kubemoot/indexer&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Java (Spring Boot)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Query Service&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;registry.example.com/kubemoot/query-service&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Python (FastAPI)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Docling Serve&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;quay.io/docling-project/docling-serve-cpu&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Python&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;All image versions are managed centrally via the KubemootConfig singleton - never hardcode image tags.&lt;/p&gt;</description></item><item><title>Scheduling - reminders, follow-ups, recurring</title><link>https://kubemoot.org/docs/architecture/scheduling/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/architecture/scheduling/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;One sentence&lt;/strong&gt;: a crew&amp;rsquo;s &lt;code&gt;scheduler-advisor&lt;/code&gt; Tooler agent calls the &lt;code&gt;scheduling-mcp&lt;/code&gt; server&amp;rsquo;s tools to write &lt;code&gt;ScheduleRecord&lt;/code&gt;s into the NATS KV bucket &lt;code&gt;kubemoot_scheduled&lt;/code&gt;; the operator&amp;rsquo;s scheduler poller fires due records - either inline in the originating thread or as a new thread, depending on &lt;code&gt;kind&lt;/code&gt; x whether a &lt;code&gt;sourceThreadId&lt;/code&gt; was attached.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="why-this-exists"&gt;Why this exists&lt;/h2&gt;
&lt;p&gt;Some discussions are inherently &lt;em&gt;temporally&lt;/em&gt; driven:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reminder&lt;/strong&gt; - &amp;ldquo;Remind me in 30 minutes to check the backup job status.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Follow-up&lt;/strong&gt; - &amp;ldquo;Re-check disk usage in an hour&amp;rdquo; / &amp;ldquo;Run the weekly health summary every Monday.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recurring&lt;/strong&gt; - daily/weekly admin checks, configured by a cluster admin rather than via chat.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All three reduce to: &lt;em&gt;publish a discussion message at a future time, in the right place&lt;/em&gt;. This module provides the primitive.&lt;/p&gt;</description></item><item><title>Kubemoot Scheduler</title><link>https://kubemoot.org/docs/architecture/scheduler/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/architecture/scheduler/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Audience:&lt;/strong&gt; operator and agent-runtime developers; developers of the ecosystem tools (CrewForge, kmctl); open-source consumers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="one-paragraph-summary"&gt;One-Paragraph Summary&lt;/h2&gt;
&lt;p&gt;Kubemoot is an LLM orchestrator. Like &lt;code&gt;kube-scheduler&lt;/code&gt; matches Pods to Nodes based on resource requests, the &lt;strong&gt;Kubemoot scheduler matches agents to &lt;code&gt;(Model, ModelServer)&lt;/code&gt; bindings based on capability requirements.&lt;/strong&gt; Agents declare what they can do (capabilities), Models declare what they are (family, params, capabilities) as labels, ModelServers declare what they have (VRAM, parallelism), and a &lt;code&gt;CrewSchedulingPolicy&lt;/code&gt; CRD expresses require/prefer rules using Kubernetes-style label selectors. The match is computed in the agent reconciler via filter → score → bind; the resolved &lt;code&gt;(model, server, endpoint)&lt;/code&gt; is applied to the agent&amp;rsquo;s Deployment.&lt;/p&gt;</description></item><item><title>KubemootConfig Guide</title><link>https://kubemoot.org/docs/reference/kubemootconfig-guide/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/reference/kubemootconfig-guide/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;KubemootConfig is a &lt;strong&gt;cluster-scoped singleton&lt;/strong&gt; CRD that centralizes default images and configuration for all Kubemoot components. It eliminates hardcoded image versions in the operator source code and enables GitOps-friendly version management.&lt;/p&gt;
&lt;p&gt;Every Kubemoot controller reads from KubemootConfig via the ConfigCache - a thread-safe in-memory cache that the KubemootConfigReconciler populates on startup and updates on every change.&lt;/p&gt;
&lt;h3 id="why-a-singleton"&gt;Why a singleton&lt;/h3&gt;
&lt;p&gt;Image references and operator defaults live in one cluster-scoped resource instead of the
operator source, operator environment variables, or every custom resource. An image bump
is a patch to one resource: no recompile, no operator restart, no Helm upgrade, and no
chance of two namespaces running different runtime images. The scope is cluster-wide on
purpose; a per-namespace config would bring the drift back. New cluster-wide defaults
(scheduler strategy, retention windows) become new fields on the same resource rather
than new CRDs. If &lt;code&gt;default&lt;/code&gt; is missing, controllers fail their first reconcile until it
exists, which is why the operator chart installs it.&lt;/p&gt;</description></item><item><title>The Starter Crew</title><link>https://kubemoot.org/docs/user-guides/starter-crew/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/user-guides/starter-crew/</guid><description>&lt;p&gt;&lt;code&gt;kmctl create&lt;/code&gt; scaffolds a small, complete crew you can install on a fresh Kubemoot
cluster and talk to within minutes. It is the Kubemoot equivalent of the nginx chart
&lt;code&gt;helm create&lt;/code&gt; produces: a working example you change into your own crew.&lt;/p&gt;
&lt;p&gt;The starter crew is a read-only guide to the Kubernetes namespace it is installed into.
Ask it what is running, what is wrong, and why. It reads the namespace with real tools and
answers from what it found. It never changes anything.&lt;/p&gt;</description></item><item><title>MCPServer Guide</title><link>https://kubemoot.org/docs/reference/mcpserver-guide/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/reference/mcpserver-guide/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;MCPServer is a Kubemoot CRD that deploys and manages Model Context Protocol servers in Kubernetes. Each MCPServer provides tools that agents can invoke through an MCPGateway.&lt;/p&gt;
&lt;p&gt;The operator handles the complete lifecycle: deploying the container, injecting the mcp-bridge sidecar for stdio transport, configuring health probes, and registering with gateways.&lt;/p&gt;
&lt;h2 id="architecture"&gt;Architecture&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;MCPServer CR
 │
 ├─── Deployment (operator-managed)
 │ ├── MCP Server Container (your image)
 │ └── MCP Bridge Sidecar (auto-injected for stdio)
 │
 ├─── Service (ClusterIP)
 │ └── Exposes the bridge HTTP/SSE endpoint
 │
 └─── Gateway Registration
 └── Registers tools with matching MCPGateways
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="tool-chain"&gt;Tool Chain&lt;/h3&gt;
&lt;p&gt;Agents never connect to MCPServers directly. The full chain is:&lt;/p&gt;</description></item><item><title>The Moot Mesh</title><link>https://kubemoot.org/docs/architecture/moot-mesh/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/architecture/moot-mesh/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Audience:&lt;/strong&gt; crew authors who bring their own harness; operator and sidecar developers; anyone deciding how much to trust a harness at the table.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The Moot Mesh is the layer that lets any agent harness sit at the table without
knowing how the table works. It follows the shape of a service mesh:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Service mesh&lt;/th&gt;
 &lt;th&gt;Moot Mesh&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Control plane&lt;/td&gt;
 &lt;td&gt;The Kubemoot operator. It writes each agent&amp;rsquo;s contract, binds its models, creates its bus consumer, and builds its pod.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Data plane proxy (Envoy)&lt;/td&gt;
 &lt;td&gt;The Moot Mesh sidecar, one per agent pod.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;The application&lt;/td&gt;
 &lt;td&gt;The harness: the program that does the agent&amp;rsquo;s reasoning.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;The mesh&amp;rsquo;s shared services&lt;/td&gt;
 &lt;td&gt;The bus (NATS JetStream), observability, and identity.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;A harness does not connect to NATS, does not choose a model server, and does not
reach the tool gateway. It talks to three loopback addresses and its sidecar does
the rest. That is what makes a harness replaceable: the agent-runtime that ships
with Kubemoot, a command-line agent behind a thin shim, and a framework you wrote
yourself all join the table the same way.&lt;/p&gt;</description></item><item><title>MCPGateway Guide</title><link>https://kubemoot.org/docs/reference/mcpgateway-guide/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/reference/mcpgateway-guide/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;MCPGateway is a Kubemoot CRD that deploys an MCP gateway - the central hub that routes agent tool calls to MCPServers. Agents connect to the gateway (not individual MCPServers), and the gateway discovers and manages connections to all matching MCPServers.&lt;/p&gt;
&lt;h2 id="architecture"&gt;Architecture&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Agent Runtime
 │
 │ KUBEMOOT_GATEWAY_ENDPOINT
 ▼
MCPGateway (Deployment + Service)
 │
 ├── MCPServer: kubernetes-mcp (via label selector)
 ├── MCPServer: nats-mcp (via label selector)
 ├── MCPServer: github-mcp (via label selector)
 └── MCPServer: fetch-mcp (via label selector)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The gateway:&lt;/p&gt;</description></item><item><title>The Harness Seam and the Shim</title><link>https://kubemoot.org/docs/architecture/the-harness-seam/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/architecture/the-harness-seam/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Audience:&lt;/strong&gt; crew authors who choose a harness; developers who add one; anyone comparing harnesses on the same crew.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="the-seam"&gt;The seam&lt;/h2&gt;
&lt;p&gt;Every agent at the table is a harness behind the same seam. The harness does the
reasoning: it builds the prompt, runs the tool loop, and decides what to say. The
&lt;a href="../moot-mesh/"&gt;Moot Mesh&lt;/a&gt; sidecar does everything else: the bus, the signals, the
placement of each model call on an accelerator, and the tool allow-list.&lt;/p&gt;</description></item><item><title>CrewFitnessSuite CRD</title><link>https://kubemoot.org/docs/reference/crewfitnesssuite/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/reference/crewfitnesssuite/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;A &lt;code&gt;CrewFitnessSuite&lt;/code&gt; runs a set of fitness scripts against a crew many times, collects the result of every iteration, and writes an XLSX report to the NATS Object Store bucket &lt;code&gt;kubemoot_fitness_artifacts&lt;/code&gt;. The operator creates one &lt;code&gt;CrewFitness&lt;/code&gt; per script and iteration, serially by default, and owns each one through an owner reference.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kubemoot.ai/v1alpha1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;CrewFitnessSuite&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;homelab-baseline&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;crew-homelab-pilot&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;crewRef&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;homelab-pilot&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;READ-query baseline across the homelab layers&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;iterations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;15&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;concurrency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;scripts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;testRef&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;gpu-utilization-live&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;configMapRef&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;homelab-pilot-fitness-tests&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;testRef&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;node-count&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;configMapRef&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;homelab-pilot-fitness-tests&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="spec"&gt;Spec&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Field&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Default&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;code&gt;crewRef&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string&lt;/td&gt;
 &lt;td&gt;required&lt;/td&gt;
 &lt;td&gt;Crew in the same namespace that the suite runs against.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;Purpose of the suite. Shown on the dashboard and in the XLSX Overview tab.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;iterations&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;int&lt;/td&gt;
 &lt;td&gt;required, at least 1&lt;/td&gt;
 &lt;td&gt;How many times each script runs. The suite creates &lt;code&gt;len(scripts) x iterations&lt;/code&gt; runs.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;scripts&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;list&lt;/td&gt;
 &lt;td&gt;required, at least 1&lt;/td&gt;
 &lt;td&gt;The scripts to run, in order. Each entry has a &lt;code&gt;testRef&lt;/code&gt; and exactly one of &lt;code&gt;testContent&lt;/code&gt; (inline script) or &lt;code&gt;configMapRef&lt;/code&gt; (ConfigMap holding &lt;code&gt;&amp;lt;testRef&amp;gt;.adl&lt;/code&gt;).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;concurrency&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;int&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Maximum runs in flight at once. Keep it at 1 for baselines: parallel runs share the crew and its model servers, so they measure contention.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;perIterationTimeout&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;duration&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;10m&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Wall-clock cap for one iteration.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;artifactRetention&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;duration&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;168h&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Object Store TTL for the XLSX.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;purgeMemory&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;bool&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Clear the crew&amp;rsquo;s working memory once before the first iteration.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;suspend&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;bool&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Pause between iterations. See &lt;a href="https://kubemoot.org/docs/reference/crewfitnesssuite/#pause-resume-and-stop"&gt;Pause, resume and stop&lt;/a&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;cancel&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;bool&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Stop the suite. See &lt;a href="https://kubemoot.org/docs/reference/crewfitnesssuite/#pause-resume-and-stop"&gt;Pause, resume and stop&lt;/a&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;rejudge&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;object&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;Set at creation, immutable. Judge an earlier run&amp;rsquo;s saved answers against this suite&amp;rsquo;s scripts instead of running iterations. &lt;code&gt;suite&lt;/code&gt; names the source &lt;code&gt;CrewFitnessSuite&lt;/code&gt; in the same namespace and &lt;code&gt;runId&lt;/code&gt; its run. See &lt;a href="https://kubemoot.org/docs/reference/crewfitnesssuite/#re-judge-an-earlier-run"&gt;Re-judge an earlier run&lt;/a&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="status"&gt;Status&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Field&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;code&gt;phase&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;Pending&lt;/code&gt;, &lt;code&gt;Running&lt;/code&gt;, &lt;code&gt;Paused&lt;/code&gt;, &lt;code&gt;Completed&lt;/code&gt;, &lt;code&gt;Cancelled&lt;/code&gt;, &lt;code&gt;Failed&lt;/code&gt;, or &lt;code&gt;Error&lt;/code&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;runId&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Identifies this execution. Used in iteration names and in the artifact key.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;startedAt&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;When scheduling began.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;completedAt&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;When the last iteration finished, or when the suite was cancelled.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;iterationsTotal&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;len(scripts) x iterations&lt;/code&gt;. It keeps the planned total after a cancel, so &lt;code&gt;iterationsCompleted &amp;lt; iterationsTotal&lt;/code&gt; marks a partial run.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;iterationsCompleted&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Iterations that reached a terminal phase, whatever the outcome.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;passed&lt;/code&gt;, &lt;code&gt;failed&lt;/code&gt;, &lt;code&gt;errored&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;iterationsCompleted&lt;/code&gt; broken down by outcome.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;artifactRef&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Bucket, object key (&lt;code&gt;&amp;lt;namespace&amp;gt;/&amp;lt;suite&amp;gt;/&amp;lt;runId&amp;gt;.xlsx&lt;/code&gt;), and size of the XLSX, set once it is written.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;error&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Why the suite itself failed to execute (phase &lt;code&gt;Error&lt;/code&gt;).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;rejudge&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;On a re-judge suite: the &lt;code&gt;source&lt;/code&gt; run, how many &lt;code&gt;transcripts&lt;/code&gt; were copied, and &lt;code&gt;notInSource&lt;/code&gt;, the scenarios of this suite the source run has no answer for.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;scenarios&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Per-scenario rollup of the finished iterations, in spec order. See &lt;a href="https://kubemoot.org/docs/reference/crewfitnesssuite/#results-in-status"&gt;Results in status&lt;/a&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;judge&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Progress and scores of the deferred judge pass. See &lt;a href="https://kubemoot.org/docs/reference/crewfitnesssuite/#results-in-status"&gt;Results in status&lt;/a&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;conditions&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;On a re-judge suite, &lt;code&gt;RejudgeSourceReady&lt;/code&gt; reports whether the source could be used. See &lt;a href="https://kubemoot.org/docs/reference/crewfitnesssuite/#re-judge-an-earlier-run"&gt;Re-judge an earlier run&lt;/a&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="phases"&gt;Phases&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Phase&lt;/th&gt;
 &lt;th&gt;Terminal&lt;/th&gt;
 &lt;th&gt;Meaning&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Pending&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;no&lt;/td&gt;
 &lt;td&gt;Created, not yet started.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Running&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;no&lt;/td&gt;
 &lt;td&gt;Iterations are being scheduled or are in flight.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Paused&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;no&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;spec.suspend&lt;/code&gt; is true and no iteration is in flight. Nothing runs against the crew.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Completed&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;yes&lt;/td&gt;
 &lt;td&gt;Every iteration reached a terminal phase. Failed or errored iterations are outcomes in the counts, not a suite failure.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Cancelled&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;yes&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;spec.cancel&lt;/code&gt; stopped the suite. Completed iterations are kept and the XLSX is marked partial.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Failed&lt;/code&gt;, &lt;code&gt;Error&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;yes&lt;/td&gt;
 &lt;td&gt;The suite itself could not execute, such as an invalid spec.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="results-in-status"&gt;Results in status&lt;/h2&gt;
&lt;p&gt;The operator writes a run&amp;rsquo;s results to the suite&amp;rsquo;s status, so any client with read access to &lt;code&gt;crewfitnesssuites&lt;/code&gt; gets them through the Kubernetes API: &lt;code&gt;kubectl&lt;/code&gt;, &lt;code&gt;kmctl&lt;/code&gt;, CrewForge, or a script. The status outlives the per-iteration &lt;code&gt;CrewFitness&lt;/code&gt; objects, which the operator removes after the run, and the object store retention of the transcripts and judge checkpoint.&lt;/p&gt;</description></item><item><title>MootArchetype CRD</title><link>https://kubemoot.org/docs/reference/mootarchetype/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/reference/mootarchetype/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;A &lt;code&gt;MootArchetype&lt;/code&gt; declares the shape of a consensus archetype: the phases it passes
through, the signals agents may emit, and the legal transitions between phases. The
operator installs one, &lt;code&gt;consent-3&lt;/code&gt;, and validates the resource and the scheduling
policies that reference it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Maturity.&lt;/strong&gt; &lt;code&gt;MootArchetype&lt;/code&gt; is a newer feature and is not fully vetted. The API is
&lt;code&gt;kubemoot.ai/v1alpha1&lt;/code&gt;: expect the fields to change. Read
&lt;a href="https://kubemoot.org/docs/reference/mootarchetype/#what-it-does-today"&gt;What it does today&lt;/a&gt; and
&lt;a href="https://kubemoot.org/docs/reference/mootarchetype/#what-it-does-not-do-yet"&gt;What it does not do yet&lt;/a&gt; before building on it.&lt;/p&gt;</description></item><item><title>ADL Reference</title><link>https://kubemoot.org/docs/reference/adl-reference/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/reference/adl-reference/</guid><description>&lt;p&gt;ADL has two dialects that share a style. The &lt;strong&gt;prompt&lt;/strong&gt; dialect composes an agent&amp;rsquo;s
behavior; the &lt;strong&gt;fitness&lt;/strong&gt; dialect specifies executable checks against a live crew. This
page is the complete vocabulary for both; see
&lt;a href="https://kubemoot.org/docs/concepts/agent-definition-language/"&gt;ADL, the Architecture Definition Language, for agents&lt;/a&gt;
for where the notation comes from and how Kubemoot applies it. For how to write and run
it, see &lt;a href="https://kubemoot.org/docs/user-guides/write-agents-and-adl/"&gt;Write Agents &amp;amp; ADL&lt;/a&gt; and
&lt;a href="https://kubemoot.org/docs/fitness/kubemoot-crew-fitness-functions/"&gt;Kubemoot Crew Fitness Functions&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="prompt-adl"&gt;Prompt ADL&lt;/h2&gt;
&lt;p&gt;Prompt ADL is stored in the &lt;code&gt;content&lt;/code&gt; of a &lt;code&gt;PromptModule&lt;/code&gt; CR. Modules are concatenated
by &lt;code&gt;order&lt;/code&gt; to form an agent&amp;rsquo;s system prompt.&lt;/p&gt;</description></item><item><title>Build a Crew</title><link>https://kubemoot.org/docs/user-guides/build-a-crew/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/user-guides/build-a-crew/</guid><description>&lt;p&gt;This guide builds a crew from its parts. A crew is a set of Kubernetes resources, so
&amp;ldquo;building&amp;rdquo; one means declaring those resources - usually packaged together as a Helm
chart so they version and deploy as a unit.&lt;/p&gt;
&lt;p&gt;To see a complete small crew before writing your own, scaffold the
&lt;a href="../starter-crew/"&gt;starter crew&lt;/a&gt; with &lt;code&gt;kmctl create&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="what-a-crew-is-made-of"&gt;What a crew is made of&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Resource&lt;/th&gt;
 &lt;th&gt;Role in the crew&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Crew&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;The team - groups agents by the &lt;code&gt;kubemoot.ai/crew&lt;/code&gt; label, enables the discussion gateway, configures working memory.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Agent&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Each participant: one coordinator, plus Toolers (and optionally Analysts). Declares capabilities, tools, RAG, and prompt refs.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;PromptModule&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Each agent&amp;rsquo;s behavior, written in &lt;a href="../write-agents-and-adl/"&gt;ADL&lt;/a&gt; and composed by reference.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Model&lt;/code&gt; / &lt;code&gt;ModelServer&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;The models (by capability label) and the GPU-backed endpoints that serve them.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;MCPServer&lt;/code&gt; / &lt;code&gt;MCPGateway&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;The tools Toolers use, reached through the gateway.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;RAGSource&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Knowledge sources, indexed and made queryable.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;EmbeddingModel&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;The embedding model a RAGSource indexes with. It names the model and its dimensions, never a server.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="steps"&gt;Steps&lt;/h2&gt;
&lt;h3 id="1-define-the-crew"&gt;1. Define the crew&lt;/h3&gt;
&lt;p&gt;Declare a &lt;code&gt;Crew&lt;/code&gt; with the discussion gateway enabled, and a label every agent will
share. See the &lt;a href="../../reference/crew/"&gt;Crew CRD reference&lt;/a&gt; for the full spec including
the working-memory policy.&lt;/p&gt;</description></item><item><title>Contributing</title><link>https://kubemoot.org/docs/community/contributing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/community/contributing/</guid><description>&lt;p&gt;Contributions are welcome: bug reports, ideas, documentation fixes, tests, and code.
This page is the process. The &lt;a href="../development/"&gt;Development Guide&lt;/a&gt; covers the repository
layout and how to build and test each component.&lt;/p&gt;
&lt;h2 id="report-a-bug-or-request-a-feature"&gt;Report a bug or request a feature&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Not sure it is a bug, or have a question?&lt;/strong&gt; Open a
&lt;a href="https://github.com/orgs/kubemoot/discussions"&gt;Discussion&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Found a defect?&lt;/strong&gt; Open an issue on the repo where you found it, using the bug
report template. If the &lt;a href="../../introduction/quickstart/"&gt;Quickstart&lt;/a&gt; itself failed, use
the quickstart-failed template; it asks for what is needed to reproduce a
fresh-cluster run.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Have an idea for a feature?&lt;/strong&gt; Start in Discussions, so the shape of the idea can
settle before anyone writes code. A maintainer turns it into an issue when the work
is clear. The feature request template works too when you already know what
you want.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Larger or cross-cutting change?&lt;/strong&gt; Open an issue titled &lt;code&gt;Proposal: &amp;lt;summary&amp;gt;&lt;/code&gt;
describing the problem, the approach, the alternatives, and what it touches (CRDs,
runtime, dashboard, crews). See &lt;a href="../governance/#how-decisions-are-made"&gt;Governance&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="open-a-pull-request"&gt;Open a pull request&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Fork the repository you want to change, clone your fork, and branch off &lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Install and connect</title><link>https://kubemoot.org/docs/ecosystem/crewforge/install-and-connect/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/ecosystem/crewforge/install-and-connect/</guid><description>&lt;p&gt;CrewForge installs from the VS Code Marketplace and connects through the kubeconfig you already
use. This page covers the prerequisites, the install, how CrewForge chooses a cluster,
and what it tells you when it cannot reach one.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;You need&lt;/th&gt;
 &lt;th&gt;For&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;VS Code 1.95 or later&lt;/td&gt;
 &lt;td&gt;Running the extension.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;A kubeconfig with access to a cluster that runs the &lt;a href="../../../introduction/installation/"&gt;Kubemoot operator&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Everything. CrewForge lists the crews your account can read.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;kubectl&lt;/code&gt; on your PATH&lt;/td&gt;
 &lt;td&gt;Deploying a bundle of plain manifests (&lt;code&gt;kubectl apply --server-side&lt;/code&gt;).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;helm&lt;/code&gt; on your PATH&lt;/td&gt;
 &lt;td&gt;Deploying a crew chart, and Lint. Without it, Lint says where to get it.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="../../../user-guides/kmctl/#install"&gt;&lt;code&gt;kmctl&lt;/code&gt;&lt;/a&gt; on your PATH, a current release (its &lt;code&gt;kmctl create&lt;/code&gt; takes &lt;code&gt;--display-name&lt;/code&gt;)&lt;/td&gt;
 &lt;td&gt;&lt;strong&gt;New Kubemoot Crew Here&lt;/strong&gt; and &lt;strong&gt;Create Crew&lt;/strong&gt;, which run &lt;code&gt;kmctl create --chart&lt;/code&gt; to scaffold the starter crew. CrewForge checks kmctl before it asks you anything and names the minimum it needs.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;git&lt;/code&gt; on your PATH (optional)&lt;/td&gt;
 &lt;td&gt;Recording the revision a crew was deployed from, and deploying an earlier commit.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Browsing crews and chatting need only the kubeconfig. Developing a crew needs the rest.
Your account&amp;rsquo;s cluster permissions are listed in
&lt;a href="../settings-and-permissions/#what-your-account-needs"&gt;Settings and permissions&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Kubemoot - the Controller</title><link>https://kubemoot.org/docs/ecosystem/kubemoot-controller/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/ecosystem/kubemoot-controller/</guid><description>&lt;p&gt;Kubemoot is &lt;strong&gt;the controller&lt;/strong&gt; - the Kubernetes operator, agent runtime, and MCP
components that turn declared crews into running, deliberating systems. It is the
project everything else in this ecosystem is built on. A crew, an authoring tool, or a
CLI is only useful because the controller reconciles the resources they produce.&lt;/p&gt;
&lt;h2 id="what-it-includes"&gt;What it includes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The operator&lt;/strong&gt; (Go, controller-runtime) - reconciles the Kubemoot CRDs (&lt;code&gt;Crew&lt;/code&gt;,
&lt;code&gt;Agent&lt;/code&gt;, &lt;code&gt;Model&lt;/code&gt;, &lt;code&gt;ModelServer&lt;/code&gt;, &lt;code&gt;MCPServer&lt;/code&gt;, &lt;code&gt;MCPGateway&lt;/code&gt;, &lt;code&gt;RAGSource&lt;/code&gt;,
&lt;code&gt;PromptModule&lt;/code&gt;, and the cluster-scoped &lt;code&gt;KubemootConfig&lt;/code&gt;), and owns lifecycle:
scheduling, finalizers, namespace and resource cleanup.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The agent runtime&lt;/strong&gt; (Java/Quarkus + LangChain4j) - the process each agent runs as,
which deliberates over the message bus, calls tools through the gateway, retrieves
RAG knowledge, and emits consensus signals.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The MCP components&lt;/strong&gt; - the gateway and the &lt;code&gt;mcp-bridge&lt;/code&gt; sidecar that connect agents
to tools.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="what-it-does"&gt;What it does&lt;/h2&gt;
&lt;p&gt;The controller is the substrate; it carries &lt;strong&gt;no domain knowledge of its own&lt;/strong&gt;. It
provides the machinery - reconciliation, GPU-aware scheduling, the tool gateway,
consensus orchestration, working memory, and observability - and the domain comes
entirely from the crews that run on it. That separation is what lets one controller
serve infrastructure ops, Kafka operations, research, or security work without change.&lt;/p&gt;</description></item><item><title>The Crew Liaison</title><link>https://kubemoot.org/docs/integrations/crew-liaison/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/integrations/crew-liaison/</guid><description>&lt;p&gt;A crew is a committee. From inside the cluster you can watch it work: agents
convening, findings arriving, signals settling. From outside, a client should not
have to. The crew liaison is the operator&amp;rsquo;s door for other agents: one MCP endpoint
that fronts every crew in the cluster, takes a question, and hands back the crew&amp;rsquo;s
synthesized answer.&lt;/p&gt;
&lt;h2 id="what-the-client-sees"&gt;What the client sees&lt;/h2&gt;
&lt;p&gt;Three tools, and nothing about the discussion&amp;rsquo;s substance.&lt;/p&gt;</description></item><item><title>The Moot - Consensus Model</title><link>https://kubemoot.org/docs/concepts/consensus-model/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/concepts/consensus-model/</guid><description>&lt;p&gt;Kubemoot&amp;rsquo;s defining idea is that an answer is reached by &lt;strong&gt;deliberation among
agents&lt;/strong&gt;, not asserted by a single model. This page explains the goal, the
signal vocabulary, the discussion phases, and, importantly, that &lt;em&gt;how&lt;/em&gt; a crew
organizes its deliberation is configurable. For the units of interaction the
deliberation sits inside - conversations, turns, and the thread each discussion
runs on - see &lt;a href="../conversations-turns-and-threads/"&gt;Conversations, Turns &amp;amp; Threads&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="the-goal"&gt;The goal&lt;/h2&gt;
&lt;p&gt;Settle a question through structured deliberation rather than by one authority. A
crew of agents each contributes what it knows; the result is composed from the
crew, so a single model being confidently wrong does not, by itself, become the
answer.&lt;/p&gt;</description></item><item><title>Why Kubemoot</title><link>https://kubemoot.org/docs/introduction/why-kubemoot/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/introduction/why-kubemoot/</guid><description>&lt;p&gt;Kubemoot runs agentic AI as a &lt;strong&gt;committee of small, specialized models that
deliberate to consensus&lt;/strong&gt; - on your own Kubernetes cluster, declared as Kubernetes
resources, and measured by executable fitness functions. This page is about &lt;em&gt;where
that fits&lt;/em&gt;, &lt;em&gt;what it solves&lt;/em&gt;, and &lt;em&gt;how it differs&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="where-it-started-and-where-it-can-go"&gt;Where it started, and where it can go&lt;/h2&gt;
&lt;p&gt;Kubemoot began as a small agent system to help with observability, security, and
administration on one homelab cluster, and grew into a general way to run crews of
agents on Kubernetes. Today it works well on local clusters with a couple of accelerators
or more, running open models you serve yourself.&lt;/p&gt;</description></item><item><title>Skill CRD</title><link>https://kubemoot.org/docs/reference/skill/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/reference/skill/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;A &lt;code&gt;Skill&lt;/code&gt; is a packaged procedure that belongs to a crew. It has a &lt;code&gt;description&lt;/code&gt; that says when it applies and a &lt;code&gt;content&lt;/code&gt; body, written in &lt;a href="../adl-reference/"&gt;ADL&lt;/a&gt;, that says what to do. The body stays out of every agent&amp;rsquo;s prompt until a discussion needs it. The coordinator reads each skill&amp;rsquo;s description when it chooses who joins a discussion, and it selects the skills that fit the question. Only the selected bodies reach the agents for that discussion.&lt;/p&gt;</description></item><item><title>Compose a Crew</title><link>https://kubemoot.org/docs/user-guides/compose-a-crew/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/user-guides/compose-a-crew/</guid><description>&lt;p&gt;A crew is only as useful as its design. This guide covers the decisions that determine
whether a crew&amp;rsquo;s coordinator routes questions intelligently and whether its Toolers and
Analysts can answer them: which agents to include, how to write resumes the coordinator
can reason over, how to ground the coordinator with broad knowledge and a well-crafted
advisory brief, and how to give each Tooler the narrowly-scoped tools it needs and
each Analyst the focused RAG knowledge it reasons over.&lt;/p&gt;</description></item><item><title>Conversations, Turns &amp; Threads</title><link>https://kubemoot.org/docs/concepts/conversations-turns-and-threads/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/concepts/conversations-turns-and-threads/</guid><description>&lt;p&gt;When you ask a crew a question, four words describe what happens, and they nest.
The docs and the dashboard use them with specific meanings, so this page defines
each one and how it relates to the others.&lt;/p&gt;
&lt;h2 id="the-layers"&gt;The layers&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; Conversation durable session with a crew (conversationId)
 |
 +-- Turn one question and the answer settled on it
 | |
 | +-- Thread where that turn&amp;#39;s discussion runs (threadId)
 | |
 | +-- Discussion the deliberation on the thread (phases + signals)
 |
 +-- Turn ... later questions, each on its own thread
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A conversation holds many turns; each turn runs on its own thread; the discussion
is what happens on that thread. The two innermost words name the same layer from
different angles, which is explained below.&lt;/p&gt;</description></item><item><title>Development Guide</title><link>https://kubemoot.org/docs/community/development/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/community/development/</guid><description>&lt;p&gt;This guide covers the repository layout and how to build and test each component. The
process for issues, ideas, and pull requests is on the &lt;a href="../contributing/"&gt;Contributing&lt;/a&gt;
page; the conventions a change is expected to follow are summarized at the end of this
one.&lt;/p&gt;
&lt;h2 id="repositories"&gt;Repositories&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Repository&lt;/th&gt;
 &lt;th&gt;What it holds&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://github.com/kubemoot/kubemoot"&gt;kubemoot&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;The operator, agent runtime, dashboard, MCP components, and the component docs&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://github.com/kubemoot/crews"&gt;crews&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;Packaged crews as Helm charts&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://github.com/kubemoot/kmctl"&gt;kmctl&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;The command-line tool&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://github.com/kubemoot/vscode-crewforge"&gt;vscode-crewforge&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;CrewForge for VS Code&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;a href="https://github.com/kubemoot/kubemoot-docs"&gt;kubemoot-docs&lt;/a&gt;&lt;/td&gt;
 &lt;td&gt;This site: the Hugo and Docsy shell and the cross-cutting chapters&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="layout-of-the-kubemoot-repository"&gt;Layout of the kubemoot repository&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Component&lt;/th&gt;
 &lt;th&gt;Path&lt;/th&gt;
 &lt;th&gt;Language / stack&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Operator&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;operator/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Go, controller-runtime, kubebuilder CRDs&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Agent runtime&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;agent-runtime/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Java / Quarkus + LangChain4j (GraalVM Community native)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Dashboard&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;dashboard/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;SvelteKit&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;MCP bridge, scheduling and tool servers&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;mcp-bridge/&lt;/code&gt;, &lt;code&gt;scheduling-mcp/&lt;/code&gt;, &lt;code&gt;accelerator-mcp/&lt;/code&gt;, &lt;code&gt;artifact-access/&lt;/code&gt;, &lt;code&gt;code-sandbox/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Go&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;MCP gateway&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;mcp-gateway/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Java&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Discussion gateway, crew liaison, fitness runner&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;discussion-gateway/&lt;/code&gt;, &lt;code&gt;crew-liaison/&lt;/code&gt;, &lt;code&gt;fitness-runner/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Go&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Indexer&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;indexer/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Java&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Query service&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;query-service/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Python&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Quickstart&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;quickstart/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Shell&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Integration tests&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;k8s/tests/&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Shell&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Go 1.27+ (operator, Go components)&lt;/li&gt;
&lt;li&gt;Java 25+ with Gradle (agent runtime, indexer, MCP gateway)&lt;/li&gt;
&lt;li&gt;Node.js 26+ (dashboard)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kubectl&lt;/code&gt; and &lt;code&gt;helm&lt;/code&gt; (v3.8+, for OCI charts)&lt;/li&gt;
&lt;li&gt;Access to a Kubernetes cluster; &lt;code&gt;kind&lt;/code&gt; works for the quickstart&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="build-and-test"&gt;Build and test&lt;/h2&gt;
&lt;p&gt;Every change ships with tests. Run the suite for the component you touched.&lt;/p&gt;</description></item><item><title>Claude Code</title><link>https://kubemoot.org/docs/integrations/claude-code/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/integrations/claude-code/</guid><description>&lt;p&gt;Claude Code speaks MCP over HTTP natively, so connecting it to the crew liaison is
one command. See &lt;a href="../crew-liaison/"&gt;The Crew Liaison&lt;/a&gt; for what the tools do and why
the answer comes by ticket.&lt;/p&gt;
&lt;h2 id="try-it-against-any-cluster-you-can-reach"&gt;Try it against any cluster you can reach&lt;/h2&gt;
&lt;p&gt;Port-forward the liaison&amp;rsquo;s Service and add it as a local server:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;kubectl -n kubemoot port-forward svc/kubemoot-operator-liaison 18080:80
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;claude mcp add --transport http kubemoot http://localhost:18080/mcp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Start a new Claude Code session and ask in plain language:&lt;/p&gt;</description></item><item><title>Crews</title><link>https://kubemoot.org/docs/ecosystem/crews/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/ecosystem/crews/</guid><description>&lt;p&gt;If the &lt;a href="../kubemoot-controller/"&gt;controller&lt;/a&gt; is the substrate, &lt;strong&gt;crews&lt;/strong&gt; are what runs
on it. The crews repository is a home for many crews - both the ones Kubemoot needs to
operate and example crews that show how to build your own.&lt;/p&gt;
&lt;h2 id="internal-and-example-crews"&gt;Internal and example crews&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Internal crews&lt;/strong&gt; are part of how Kubemoot works. The fitness judge crew, for
instance, scores other crews&amp;rsquo; fitness runs. These ship with the project.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Example crews&lt;/strong&gt; demonstrate patterns you can copy - the clearest being
&lt;a href="../pilot/"&gt;Homelab Pilot&lt;/a&gt;, an infrastructure-operations crew that doubles as the
reference implementation.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="a-growing-catalog"&gt;A growing catalog&lt;/h2&gt;
&lt;p&gt;The intent is an &lt;strong&gt;ecosystem&lt;/strong&gt; of crews, not a fixed set. A crew is a portable Helm
chart - agents, prompts, tools, and knowledge bundled together - so crews are meant to
be shared and reused across clusters. As the catalog grows, crews are expected to be
published to a registry such as &lt;strong&gt;ArtifactHub.io&lt;/strong&gt;, the same way Helm charts and other
cloud-native artifacts are distributed.&lt;/p&gt;</description></item><item><title>Crews &amp; Agents</title><link>https://kubemoot.org/docs/concepts/crews-and-agents/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/concepts/crews-and-agents/</guid><description>&lt;p&gt;A &lt;strong&gt;crew&lt;/strong&gt; is a team of agents that deliberate together; an &lt;strong&gt;agent&lt;/strong&gt; is one
participant in that team. Both are Kubernetes resources you declare and version like
any other workload.&lt;/p&gt;
&lt;h2 id="crew"&gt;Crew&lt;/h2&gt;
&lt;p&gt;A &lt;code&gt;Crew&lt;/code&gt; groups a set of &lt;code&gt;Agent&lt;/code&gt;s - joined by the &lt;code&gt;kubemoot.ai/crew&lt;/code&gt; label - into one
collaborating team, and configures crew-wide concerns: the discussion gateway (the
HTTP entry point external clients talk to) and the crew&amp;rsquo;s &lt;strong&gt;working memory&lt;/strong&gt;. Agents
are the workers; the crew is the team-level context they share.&lt;/p&gt;</description></item><item><title>Develop a crew in VS Code</title><link>https://kubemoot.org/docs/ecosystem/crewforge/develop-a-crew/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/ecosystem/crewforge/develop-a-crew/</guid><description>&lt;p&gt;This guide walks the whole loop on one small example: a &lt;code&gt;helpdesk&lt;/code&gt; crew scaffolded from
the starter crew, a read-only guide to its own Kubernetes namespace. You create it, change
it, deploy it to a namespace, ask it something, and redeploy after an edit. Everything happens in
the editor, without GitOps: CrewForge deploys with Helm straight to a namespace, and
never commits or pushes. Flux rollouts stay the outer loop.&lt;/p&gt;</description></item><item><title>Governance</title><link>https://kubemoot.org/docs/community/governance/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/community/governance/</guid><description>&lt;p&gt;Kubemoot is an independent open-source project. Its governance is small and
deliberately simple, and this page states how it works today.&lt;/p&gt;
&lt;h2 id="maintainers"&gt;Maintainers&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Maintainer&lt;/th&gt;
 &lt;th&gt;Role&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Jonathan Johnson&lt;/td&gt;
 &lt;td&gt;Maintainer&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Write access to the repositories in the &lt;code&gt;kubemoot&lt;/code&gt; organization is limited to the
maintainers. Everyone else contributes through forks and pull requests.&lt;/p&gt;
&lt;h2 id="how-decisions-are-made"&gt;How decisions are made&lt;/h2&gt;
&lt;p&gt;The maintainer decides. Day-to-day changes are decided in the pull request or issue
where they come up. Changes that affect the API (the CRDs), the consensus protocol, or
how components fit together are discussed in the open first, so the reasoning is on
record:&lt;/p&gt;</description></item><item><title>Overview</title><link>https://kubemoot.org/docs/introduction/kubemoot-brief/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/introduction/kubemoot-brief/</guid><description>&lt;p&gt;Kubemoot is a Kubernetes operator and runtime for &lt;strong&gt;multi-agent AI consensus&lt;/strong&gt;. A
question is answered not by one model but by a &lt;strong&gt;crew&lt;/strong&gt; of small, specialized agents
that deliberate over a message bus and settle by signal. Everything - the crew, its
agents, their prompts, and the models they use - is a Kubernetes resource you
declare and version like any other.&lt;/p&gt;
&lt;h2 id="the-mental-model"&gt;The mental model&lt;/h2&gt;
&lt;p&gt;A &lt;strong&gt;moot&lt;/strong&gt; is an assembly that reaches a decision by deliberation. In Kubemoot:&lt;/p&gt;</description></item><item><title>Write Agents &amp; ADL</title><link>https://kubemoot.org/docs/user-guides/write-agents-and-adl/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/user-guides/write-agents-and-adl/</guid><description>&lt;p&gt;An agent&amp;rsquo;s behavior is its prompt, and in Kubemoot every prompt is written in
&lt;strong&gt;ADL (the Architecture Definition Language)&lt;/strong&gt; and stored in &lt;code&gt;PromptModule&lt;/code&gt; CRs - never
as inline prose in an Agent spec. This guide covers how to write ADL and how modules
compose.&lt;/p&gt;
&lt;h2 id="why-adl"&gt;Why ADL&lt;/h2&gt;
&lt;p&gt;ADL expresses behavior as structured rules instead of free-flowing prose. The benefits
are practical: a rule-based prompt is &lt;strong&gt;scannable&lt;/strong&gt; (you can read what an agent will
and won&amp;rsquo;t do at a glance), &lt;strong&gt;versionable&lt;/strong&gt; (&lt;code&gt;kubectl diff&lt;/code&gt; shows exactly what changed),
and &lt;strong&gt;deployable without recompilation&lt;/strong&gt; (a &lt;code&gt;kubectl apply&lt;/code&gt; changes how an agent
reasons). Prose prompts drift and hide their intent; ADL keeps it explicit.&lt;/p&gt;</description></item><item><title>The Table and the Harnesses</title><link>https://kubemoot.org/docs/concepts/the-table-and-the-harnesses/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/concepts/the-table-and-the-harnesses/</guid><description>&lt;p&gt;A harness is everything around a model: the guides that steer an agent before it acts
and the sensors that let it correct itself afterwards, in the sense of Martin Fowler&amp;rsquo;s
&lt;a href="https://martinfowler.com/articles/harness-engineering.html"&gt;Harness Engineering&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A crew is a harness made of harnesses. Each agent has its own loop: its prompt, its
tools, its retries, its memory. The moot is the harness one level up, and its guides
and sensors act between agents:&lt;/p&gt;</description></item><item><title>ADL, the Architecture Definition Language, for agents</title><link>https://kubemoot.org/docs/concepts/agent-definition-language/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/concepts/agent-definition-language/</guid><description>&lt;p&gt;Kubemoot defines what an agent does in &lt;strong&gt;ADL&lt;/strong&gt;, a small, structured language of
behavioral rules. Every agent prompt is ADL stored in a &lt;code&gt;PromptModule&lt;/code&gt; resource, never
free prose in an Agent spec, and the same language expresses a crew&amp;rsquo;s executable fitness
checks. ADL is the surface where a crew&amp;rsquo;s behavior is authored, reviewed, and versioned.&lt;/p&gt;
&lt;h2 id="what-adl-is-and-where-it-comes-from"&gt;What ADL is, and where it comes from&lt;/h2&gt;
&lt;p&gt;ADL is the &lt;strong&gt;Architecture Definition Language&lt;/strong&gt;, a pseudo-code introduced by Mark
Richards for describing and governing the structure of a software system, and paired
with the fitness-function idea from Richards and Neal Ford&amp;rsquo;s evolutionary-architecture
work (see &lt;a href="https://learning.oreilly.com/library/view/architecture-as-code/9798341640368/"&gt;&lt;em&gt;Architecture as Code&lt;/em&gt;&lt;/a&gt; by Mark Richards, Neal Ford, and
Jonathan Johnson, and Richards&amp;rsquo; ADL reference at developertoarchitect.com). In its original form ADL defines a system&amp;rsquo;s parts (&lt;code&gt;DEFINE SYSTEM&lt;/code&gt;, &lt;code&gt;DEFINE DOMAIN&lt;/code&gt;, &lt;code&gt;DEFINE COMPONENT&lt;/code&gt;) and asserts the rules between them
(&lt;code&gt;ASSERT&lt;/code&gt;, &lt;code&gt;FOREACH ... CONTAINED WITHIN&lt;/code&gt;), making architecture a machine-readable
artifact and enforcing it with executable checks that fail when an implementation
drifts from its intended design. Kubemoot applies that same language, unchanged in
form, to a different subject: instead of governing how a system&amp;rsquo;s components may
depend on each other, its rules govern how an agent behaves. This is a partnership with
ADL&amp;rsquo;s authors and their notation, not a fork or a renaming.&lt;/p&gt;</description></item><item><title>Claude Desktop</title><link>https://kubemoot.org/docs/integrations/claude-desktop/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/integrations/claude-desktop/</guid><description>&lt;p&gt;Claude Desktop connects to remote MCP servers through its connector settings, with
OAuth or no authentication, and cannot add custom headers. The crew liaison is
usually behind a bearer token or an access gateway, so Desktop reaches it through
&lt;code&gt;mcp-remote&lt;/code&gt;, a small bridge that runs locally, speaks stdio to Desktop, and
forwards to the liaison with whatever headers it needs.&lt;/p&gt;
&lt;h2 id="configuration"&gt;Configuration&lt;/h2&gt;
&lt;p&gt;Add the liaison to &lt;code&gt;claude_desktop_config.json&lt;/code&gt; (Settings, Developer, Edit Config):&lt;/p&gt;</description></item><item><title>Code of Conduct</title><link>https://kubemoot.org/docs/community/code-of-conduct/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/community/code-of-conduct/</guid><description>&lt;p&gt;Kubemoot follows the &lt;a href="https://www.contributor-covenant.org/version/2/1/code_of_conduct.html"&gt;Contributor Covenant&lt;/a&gt;,
version 2.1. It applies in every project space: GitHub issues, pull requests, and
Discussions, and any other place where someone represents the project in public.&lt;/p&gt;
&lt;p&gt;The full text lives in one place, the
&lt;a href="https://github.com/kubemoot/.github/blob/main/CODE_OF_CONDUCT.md"&gt;&lt;code&gt;CODE_OF_CONDUCT.md&lt;/code&gt;&lt;/a&gt;
file in the organization&amp;rsquo;s &lt;code&gt;.github&lt;/code&gt; repository. GitHub shows it on every repository in
the organization, so it is not copied into each one.&lt;/p&gt;
&lt;h2 id="the-short-version"&gt;The short version&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Be respectful of differing opinions, viewpoints, and experience.&lt;/li&gt;
&lt;li&gt;Give and accept constructive feedback gracefully.&lt;/li&gt;
&lt;li&gt;Take responsibility for mistakes and learn from them.&lt;/li&gt;
&lt;li&gt;Focus on what is best for the community, not only for you.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Harassment, trolling, insulting comments, and publishing others&amp;rsquo; private information
are not acceptable.&lt;/p&gt;</description></item><item><title>Define Fitness Functions</title><link>https://kubemoot.org/docs/user-guides/define-fitness-functions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/user-guides/define-fitness-functions/</guid><description>&lt;p&gt;A crew&amp;rsquo;s behavior is only as trustworthy as your ability to check it. Kubemoot
implements &lt;strong&gt;architectural fitness functions&lt;/strong&gt; as Kubernetes resources: you write a
short scenario that asks the crew a real question and states what a good answer must
satisfy, apply it, and the operator runs the crew live and scores each assertion pass
or fail.&lt;/p&gt;
&lt;h2 id="the-shape-of-a-scenario"&gt;The shape of a scenario&lt;/h2&gt;
&lt;p&gt;A fitness scenario is ADL pseudo-code - a question plus assertions:&lt;/p&gt;</description></item><item><title>Pilot - a Reference Crew</title><link>https://kubemoot.org/docs/ecosystem/pilot/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/ecosystem/pilot/</guid><description>&lt;p&gt;&lt;strong&gt;Homelab Pilot&lt;/strong&gt; is one reference crew - an example of what a Kubemoot crew looks like
when it&amp;rsquo;s fully built out. It is not the product; the product is the
&lt;a href="../kubemoot-controller/"&gt;controller&lt;/a&gt;. Pilot exists to demonstrate the controller with
a complete, real crew you can read and learn from.&lt;/p&gt;
&lt;h2 id="what-it-demonstrates"&gt;What it demonstrates&lt;/h2&gt;
&lt;p&gt;Pilot is an &lt;strong&gt;infrastructure-operations&lt;/strong&gt; crew: its Toolers carry MCP tools for
Kubernetes, Helm, Proxmox, and Prometheus, and its Analysts carry domain knowledge
from Kubernetes, Proxmox, and Talos documentation. Ask it an operational question and
the coordinator convenes the relevant Toolers, they investigate with their tools,
Analysts reason over the findings in the REVIEW phase, and the crew settles on an answer.&lt;/p&gt;</description></item><item><title>Signals &amp; Protocol</title><link>https://kubemoot.org/docs/concepts/signals-and-protocol/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/concepts/signals-and-protocol/</guid><description>&lt;p&gt;Agents in a crew never call each other directly. They publish to a message bus
(NATS JetStream), and every contribution carries a &lt;strong&gt;signal&lt;/strong&gt; that says how it relates
to the emerging answer. The signals plus a phase model are the whole protocol - there
is no central controller issuing commands.&lt;/p&gt;
&lt;h2 id="consensus-signals"&gt;Consensus signals&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Signal&lt;/th&gt;
 &lt;th&gt;Meaning&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;agree&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;This contribution supports the emerging answer.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;concern&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;A reservation that should be weighed before the crew settles.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;stand_aside&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;No relevant contribution; abstain without blocking. With &lt;code&gt;metadata.reason&lt;/code&gt; set to &lt;code&gt;gpu-busy&lt;/code&gt;, &lt;code&gt;model-too-large&lt;/code&gt;, or &lt;code&gt;prompt-too-large&lt;/code&gt;, the agent was willing but could not get a GPU (see below).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;block&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;A strong objection that should stop the answer as it stands.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;failure&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;The agent tried and could not complete - surfaced as a first-class signal, not hidden behind silence.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Treating &lt;strong&gt;failure as signal&lt;/strong&gt; is deliberate. An agent that fails a tool call or
cannot reach a source says so, so the coordinator can route around it, rather than
standing aside silently and letting the crew mistake &amp;ldquo;no answer&amp;rdquo; for &amp;ldquo;no objection.&amp;rdquo;&lt;/p&gt;</description></item><item><title>The Orchestration Gap</title><link>https://kubemoot.org/docs/introduction/orchestration-gap/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/introduction/orchestration-gap/</guid><description>&lt;p&gt;A prototype agent is easy to build and hard to operate. The distance between &amp;ldquo;it
works on my machine&amp;rdquo; and &amp;ldquo;it runs as dependable infrastructure&amp;rdquo; is where most agentic
AI projects stall. This page describes that distance, and why neither the frameworks
above it nor Kubernetes below it closes it.&lt;/p&gt;
&lt;h2 id="from-prototype-to-production"&gt;From prototype to production&lt;/h2&gt;
&lt;p&gt;Building an agent is a good experience today. You wire up a framework (LangChain,
LlamaIndex, an SDK), point it at a model, add a retriever and a few tools, and it
works on your laptop against test data. Then it has to run for real, and a different
set of questions starts:&lt;/p&gt;</description></item><item><title>Views and dashboards</title><link>https://kubemoot.org/docs/ecosystem/crewforge/views-and-dashboards/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/ecosystem/crewforge/views-and-dashboards/</guid><description>&lt;p&gt;This page is the reference. For a guided tour, see
&lt;a href="../develop-a-crew/"&gt;Develop a crew in VS Code&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="what-crewforge-changes"&gt;What CrewForge changes&lt;/h2&gt;
&lt;p&gt;CrewForge applies only Kubemoot custom resources and Helm releases of them. It never
deletes a namespace or any other kind of object; the operator owns cleanup through
finalizers and owner references. &lt;strong&gt;Add &lt;Kind&gt;&amp;hellip;&lt;/strong&gt; and &lt;strong&gt;Remove from Source&amp;hellip;&lt;/strong&gt; change
only files of a source. Anything that deletes files, such as &lt;strong&gt;Delete Source&amp;hellip;&lt;/strong&gt;,
moves them to your trash. Actions that only read are marked &amp;ldquo;nothing&amp;rdquo; in the
&lt;a href="https://kubemoot.org/docs/ecosystem/crewforge/views-and-dashboards/#action-reference"&gt;action reference&lt;/a&gt; below.&lt;/p&gt;</description></item><item><title>Discussion Artifact Store</title><link>https://kubemoot.org/docs/concepts/discussion-artifact-store/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/concepts/discussion-artifact-store/</guid><description>&lt;p&gt;When a tooler fetches data from a live system, the result can be large: a full
namespace inventory, a Prometheus time-series dump, a JSON response carrying
hundreds of rows. The NATS discussion bus and the LLM context window were not
designed to carry datasets. Dumping bulk data onto the bus truncates it, floods
downstream agents&amp;rsquo; context, and degrades the quality of reasoning that follows.&lt;/p&gt;
&lt;p&gt;Kubemoot passes large outputs &lt;strong&gt;by reference&lt;/strong&gt;. The data lands in an object store;
the discussion message carries only a small reference and a preview. Agents that
need the data fetch a targeted slice; most can answer from the preview alone.&lt;/p&gt;</description></item><item><title>How the Pieces Fit Together</title><link>https://kubemoot.org/docs/introduction/how-the-pieces-fit-together/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/introduction/how-the-pieces-fit-together/</guid><description>&lt;p&gt;Before you install anything, it helps to know where each piece runs and how they find
each other. There are three ideas, and each builds on the one before.&lt;/p&gt;
&lt;h2 id="the-picture"&gt;The picture&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://kubemoot.org/diagrams/how-the-pieces-fit-together.svg" alt="One Kubernetes cluster with two nodes. Kubemoot and NATS run on one node. The model server runs on the node with the accelerator, behind a Service. A ModelServer resource names that Service: Kubemoot reads it, then sends model calls to the Service."&gt;&lt;/p&gt;</description></item><item><title>Fitness from the editor</title><link>https://kubemoot.org/docs/ecosystem/crewforge/fitness/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/ecosystem/crewforge/fitness/</guid><description>&lt;p&gt;&lt;a href="../../../fitness/kubemoot-crew-fitness-functions/"&gt;Fitness functions&lt;/a&gt; measure whether a
crew does its job. CrewForge runs them, shows their results, and lets you hold or end a
run, all against the same Kubemoot resources &lt;code&gt;kubectl&lt;/code&gt; and &lt;code&gt;kmctl&lt;/code&gt; use. Writing the
scenarios themselves is covered in
&lt;a href="../../../user-guides/define-fitness-functions/"&gt;Define Fitness Functions&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="your-scenarios"&gt;Your scenarios&lt;/h2&gt;
&lt;p&gt;A crew source keeps its fitness definitions in a &lt;code&gt;fitness/&lt;/code&gt; folder, inside a chart or
beside a bundle. Expand &lt;strong&gt;Fitness Scenarios&lt;/strong&gt; under a source to list them: the scripts of
each CrewFitnessSuite, each CrewFitness, and loose &lt;code&gt;.adl&lt;/code&gt; (ADL) and &lt;code&gt;.md&lt;/code&gt; (prose) scripts.&lt;/p&gt;</description></item><item><title>Models &amp; Scheduling</title><link>https://kubemoot.org/docs/concepts/models-and-scheduling/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/concepts/models-and-scheduling/</guid><description>&lt;p&gt;Kubemoot composes capability from &lt;strong&gt;many small models&lt;/strong&gt; rather than one large one,
and it binds an agent to a model &lt;strong&gt;as late as possible&lt;/strong&gt;. Two ideas make that work:
loose model coupling and just-in-time scheduling.&lt;/p&gt;
&lt;h2 id="loose-model-coupling"&gt;Loose model coupling&lt;/h2&gt;
&lt;p&gt;An &lt;code&gt;Agent&lt;/code&gt; spec names no model. It declares abstract &lt;strong&gt;capabilities&lt;/strong&gt; -
&lt;code&gt;tool-calling&lt;/code&gt;, &lt;code&gt;reasoning&lt;/code&gt;, &lt;code&gt;kubernetes&lt;/code&gt;, and so on. Concrete models are separate
resources: a &lt;code&gt;Model&lt;/code&gt; (an LLM, by capability labels, not a hardcoded name) served by a
&lt;code&gt;ModelServer&lt;/code&gt; (an inference server on an accelerator, such as vLLM, the currently preferred engine, or Ollama).&lt;/p&gt;</description></item><item><title>Onboard MCP Tools</title><link>https://kubemoot.org/docs/user-guides/onboard-mcp-tools/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/user-guides/onboard-mcp-tools/</guid><description>&lt;p&gt;A crew gains new abilities by gaining new &lt;strong&gt;tools&lt;/strong&gt;, and tools come from MCP servers.
You can declare them directly, or let Kubemoot&amp;rsquo;s &lt;strong&gt;autonomic onboarding&lt;/strong&gt; acquire them
when the crew hits a capability gap. This guide covers both.&lt;/p&gt;
&lt;h2 id="declare-a-tool-server-directly"&gt;Declare a tool server directly&lt;/h2&gt;
&lt;p&gt;When you already know the MCP server you want, declare an &lt;code&gt;MCPServer&lt;/code&gt; and let an
&lt;code&gt;MCPGateway&lt;/code&gt; discover it. The operator handles the deployment, health probes, and - for
stdio servers - the auto-injected &lt;code&gt;mcp-bridge&lt;/code&gt; sidecar.&lt;/p&gt;</description></item><item><title>Quickstart</title><link>https://kubemoot.org/docs/introduction/quickstart/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/introduction/quickstart/</guid><description>&lt;p&gt;This is a laptop trial: one script takes an empty Kubernetes cluster to a real crew
answering a real question, on CPU, with no accelerator required. It runs the same protocol as
a production deployment - a coordinator convening a Tooler, signals exchanged over
NATS, an answer synthesized - just smaller and slower, because it runs on CPU with a
1-3B model instead of an accelerator with a reasoning-sized one. The trial uses Ollama,
which is familiar and runs anywhere; an installation defaults to vLLM. See
&lt;a href="../installation/"&gt;Installation&lt;/a&gt; for the accelerator-backed deployment this trial is a
preview of, and the profile table below for exactly what&amp;rsquo;s smaller and slower.&lt;/p&gt;</description></item><item><title>Security</title><link>https://kubemoot.org/docs/community/security/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/community/security/</guid><description>&lt;h2 id="reporting-a-vulnerability"&gt;Reporting a vulnerability&lt;/h2&gt;
&lt;p&gt;Report a vulnerability privately, by either of these:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub private vulnerability reporting.&lt;/strong&gt; Open
&lt;a href="https://github.com/kubemoot/kubemoot/security/advisories/new"&gt;a private report on the kubemoot repository&lt;/a&gt;,
or use &lt;strong&gt;Report a vulnerability&lt;/strong&gt; on the &lt;strong&gt;Security&lt;/strong&gt; tab of the affected repository
(&lt;code&gt;kubemoot&lt;/code&gt;, &lt;code&gt;kmctl&lt;/code&gt;, &lt;code&gt;vscode-crewforge&lt;/code&gt;, &lt;code&gt;crews&lt;/code&gt;, or &lt;code&gt;kubemoot-docs&lt;/code&gt;). The report is
sent over HTTPS and only you and the maintainers can see it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Email&lt;/strong&gt; &lt;a href="mailto:security@kubemoot.org"&gt;security@kubemoot.org&lt;/a&gt;. The project publishes
no OpenPGP key, so email is not encrypted end to end; when the details must stay
confidential in transit, use GitHub&amp;rsquo;s private reporting.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The security address is only for vulnerability reports; send every other question to
&lt;a href="mailto:moot@kubemoot.org"&gt;moot@kubemoot.org&lt;/a&gt; or
&lt;a href="https://github.com/orgs/kubemoot/discussions"&gt;GitHub Discussions&lt;/a&gt;. Do not open a public
issue, Discussion, or pull request for a security report.&lt;/p&gt;</description></item><item><title>Choosing a Model</title><link>https://kubemoot.org/docs/concepts/choosing-a-model/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/concepts/choosing-a-model/</guid><description>&lt;p&gt;Kubemoot runs on the GPUs you have. A crew is typically twenty or more agents sharing a
small number of cards, so choosing a model is a capacity decision as much as a quality
one. This page is the decision framework. For the CRD fields, the current model catalog,
and the per-GPU fit matrix, see &lt;a href="../../reference/models/"&gt;Models in Kubemoot&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Because an &lt;code&gt;Agent&lt;/code&gt; names no model, changing your mind is cheap. Adopting a different
model is a &lt;code&gt;Model&lt;/code&gt; CR and a label, not an edit to every agent in the crew. That makes
model choice a thing you &lt;strong&gt;measure and revise&lt;/strong&gt;, not a thing you get right up front.&lt;/p&gt;</description></item><item><title>How Kubemoot Is Built and Secured</title><link>https://kubemoot.org/docs/community/how-kubemoot-is-built-and-secured/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/community/how-kubemoot-is-built-and-secured/</guid><description>&lt;p&gt;This page describes how the project builds, releases, and protects its software, and
where you can see each practice for yourself. It follows the
&lt;a href="https://www.bestpractices.dev/"&gt;OpenSSF Best Practices&lt;/a&gt; criteria for open-source
projects. The per-criterion answers live on the
&lt;a href="https://www.bestpractices.dev/projects/15226"&gt;project&amp;rsquo;s Best Practices entry&lt;/a&gt;; this
page explains the practices in plain words and links to the files, workflows, and pages
that show them.&lt;/p&gt;
&lt;h2 id="how-changes-are-made"&gt;How changes are made&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pull requests from forks.&lt;/strong&gt; Contributors fork a repository, branch off &lt;code&gt;main&lt;/code&gt;, and
open a pull request using the template. A maintainer review and approval is required
to merge. See &lt;a href="../contributing/#open-a-pull-request"&gt;Contributing&lt;/a&gt; and
&lt;a href="../governance/#how-public-issues-and-pull-requests-are-handled"&gt;Governance&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Maintainers use pull requests too.&lt;/strong&gt; Every change to a public repository reaches
&lt;code&gt;main&lt;/code&gt; through a pull request that merges only after its required checks pass: the DCO
sign-off, CodeQL, and a gate that waits for every other check, including the tests.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Conventional Commits.&lt;/strong&gt; Every commit message carries a prefix such as &lt;code&gt;fix:&lt;/code&gt; or
&lt;code&gt;feat:&lt;/code&gt;, and the prefix decides the version bump. See
&lt;a href="../contributing/#commit-messages"&gt;Contributing&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Developer Certificate of Origin.&lt;/strong&gt; Every commit is signed off, and a pull request
check named &amp;ldquo;DCO&amp;rdquo; verifies it
(&lt;a href="https://github.com/kubemoot/kubemoot/blob/main/.github/workflows/dco.yaml"&gt;workflow&lt;/a&gt;).
There is no contributor license agreement. See
&lt;a href="../contributing/#licensing-and-sign-off"&gt;Contributing&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tests ship with the change.&lt;/strong&gt; A new feature comes with tests, and a bug fix comes
with a test that fails without the fix. The pull request template has a checklist
item for it
(&lt;a href="https://github.com/kubemoot/.github/blob/main/PULL_REQUEST_TEMPLATE.md"&gt;template&lt;/a&gt;).
See &lt;a href="../contributing/#tests-ship-with-the-code"&gt;Contributing&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI-assisted work is visible.&lt;/strong&gt; Agent-authored commits use the &lt;code&gt;Klaude&lt;/code&gt; identity and
name the model in a &lt;code&gt;Co-Authored-By:&lt;/code&gt; trailer, and they pass the same gates as every
other change. See &lt;a href="../contributing/#ai-assisted-working-style"&gt;Contributing&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;License.&lt;/strong&gt; Every repository is Apache License 2.0, for example the
&lt;a href="https://github.com/kubemoot/kubemoot/blob/main/LICENSE"&gt;LICENSE of kubemoot&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="how-versions-and-releases-work"&gt;How versions and releases work&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Versions live only in git tags.&lt;/strong&gt; Files in git hold &lt;code&gt;0.0.0&lt;/code&gt;; every build computes
its version from the tags and stamps it into what it publishes, and CI never commits a
version back. See &lt;a href="../releases/#the-version-rule"&gt;The version rule&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Every merge to &lt;code&gt;main&lt;/code&gt; builds a release candidate.&lt;/strong&gt; Candidates are tagged
&lt;code&gt;X.Y.Z-rc.N&lt;/code&gt; and are not published publicly. See
&lt;a href="../releases/#from-merge-to-release"&gt;From merge to release&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A maintainer publishes a candidate.&lt;/strong&gt; The &lt;strong&gt;Publish Release&lt;/strong&gt; workflow starts as a
dry run that publishes nothing, then runs again with approval. It copies the exact
tested images by digest rather than rebuilding them
(&lt;a href="https://github.com/kubemoot/kubemoot/blob/main/.github/workflows/publish-release.yaml"&gt;workflow&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Releases are immutable.&lt;/strong&gt; A published version is never rewritten; a fix ships as the
next version.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Release notes list what users see.&lt;/strong&gt; Breaking changes, new features, fixes, and
speedups, with a link to every commit. See
&lt;a href="../releases/#release-notes"&gt;Release notes&lt;/a&gt; and the
&lt;a href="https://github.com/kubemoot/kubemoot/releases"&gt;releases of kubemoot&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;One shared pipeline.&lt;/strong&gt; Every repository uses the same pinned actions from
&lt;a href="https://github.com/kubemoot/release-actions"&gt;&lt;code&gt;kubemoot/release-actions&lt;/code&gt;&lt;/a&gt;, so the logic
is not copied from repository to repository.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No stored registry tokens for CrewForge.&lt;/strong&gt; The extension is published to the VS Code
Marketplace and Open VSX only from the Publish Release workflow, in a protected environment
that waits for maintainer approval, using federated sign-in instead of a stored token.
See &lt;a href="../releases/#crewforge"&gt;CrewForge&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="how-the-supply-chain-is-protected"&gt;How the supply chain is protected&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dependencies are pinned by digest.&lt;/strong&gt; Container base images and GitHub Actions
reference an immutable digest or commit, not a movable tag. The default workflow token
is read-only, and a job that needs more asks for it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How images are built.&lt;/strong&gt; Every image is built inside the project&amp;rsquo;s own cluster, in a
short-lived pod with no Docker daemon and no privileged container. The Java, GraalVM
native, and Go images, and the image of this documentation site, are built with
&lt;a href="https://buildpacks.io/"&gt;Cloud Native Buildpacks&lt;/a&gt; and the &lt;a href="https://paketo.io/"&gt;Paketo&lt;/a&gt;
buildpacks, as a non-root user, and carry a software bill of materials. The images
that keep a Dockerfile (the dashboard, the RAG query service, the code sandbox, and
the test runner) are built by &lt;a href="https://buildah.io/"&gt;Buildah&lt;/a&gt; in a pod with its own
user namespace, so the build is root only inside that namespace. The builder images are pinned by digest. Images go to
the project&amp;rsquo;s own registry first, and &lt;strong&gt;Publish Release&lt;/strong&gt; copies the tested image to
GHCR by digest, never rebuilding it (see the
&lt;a href="../../introduction/roadmap/#images-built-with-cloud-native-buildpacks"&gt;roadmap&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dependabot&lt;/strong&gt; proposes updates to dependencies and Actions in every repository
(&lt;a href="https://github.com/kubemoot/kubemoot/blob/main/.github/dependabot.yml"&gt;configuration&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Signatures and provenance.&lt;/strong&gt; &lt;code&gt;kmctl&lt;/code&gt; and CrewForge releases carry a keyless
&lt;a href="https://www.sigstore.dev/"&gt;Sigstore&lt;/a&gt; signature and SLSA build provenance. Every
container image and Helm chart published to GHCR carries both, and the Kubemoot and
crew GitHub Releases attach the provenance file.
No signing key is stored; the certificate is issued to the release workflow&amp;rsquo;s
identity. You can check any of them yourself with the commands in
&lt;a href="../releases/#verify-images-and-charts"&gt;Verify images and charts&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Secret scanning with push protection&lt;/strong&gt; is on for every public repository and blocks
a push that contains a known credential format.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="how-the-code-is-checked"&gt;How the code is checked&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tests&lt;/strong&gt; run in CI on every pull request and every push to &lt;code&gt;main&lt;/code&gt;, and the
&lt;a href="../../introduction/quickstart/"&gt;quickstart&lt;/a&gt; runs against each release&amp;rsquo;s published
chart. The &lt;a href="../development/"&gt;Development Guide&lt;/a&gt; lists the command for each component.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Linters&lt;/strong&gt; run in CI for every language and block a merge on any finding:
&lt;code&gt;golangci-lint&lt;/code&gt; for each Go module, Checkstyle for the Java services, ESLint and
&lt;code&gt;svelte-check&lt;/code&gt; for the dashboard and CrewForge, ruff for Python, and ShellCheck for
scripts, with a cyclomatic complexity limit of 10. A false positive is suppressed on
its line with the reason. See
&lt;a href="../contributing/#linters-and-warnings"&gt;Linters and warnings&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CodeQL&lt;/strong&gt; scans every repository on every pull request, every push to &lt;code&gt;main&lt;/code&gt;, and
weekly. Every alert it has raised was fixed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SonarQube&lt;/strong&gt; applies a quality gate on every push to &lt;code&gt;main&lt;/code&gt; in the code repositories
(&lt;a href="https://github.com/kubemoot/kubemoot/blob/main/.github/workflows/quality.yaml"&gt;workflow&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fuzz tests.&lt;/strong&gt; Every Go native fuzz target in the operator runs on each operator
change (&lt;a href="https://github.com/kubemoot/kubemoot/blob/main/.github/workflows/ci.yaml"&gt;workflow&lt;/a&gt;).
Fuzzing has found real parser bugs, and each failing input is kept as a regression
seed beside its fix.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OpenSSF Scorecard&lt;/strong&gt; runs on every push to &lt;code&gt;main&lt;/code&gt; and weekly, and the results are
public
(&lt;a href="https://github.com/kubemoot/kubemoot/blob/main/.github/workflows/scorecard.yaml"&gt;workflow&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The same checks are summarized on &lt;a href="../security/#how-the-code-is-checked"&gt;Security&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Install the Operator</title><link>https://kubemoot.org/docs/introduction/installation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/introduction/installation/</guid><description>&lt;p&gt;This page installs the &lt;strong&gt;Kubemoot operator&lt;/strong&gt;: what a cluster needs before it runs, and
how to install it on your own cluster - the accelerator-backed deployment Kubemoot is
built for. If you want to try the protocol first without an accelerator, the
&lt;a href="../quickstart/"&gt;Quickstart&lt;/a&gt; runs a smaller CPU-only trial with its own script and its
own limits, described below.&lt;/p&gt;
&lt;p&gt;The operator is one part of the ecosystem. The others install separately, each from
its own page:&lt;/p&gt;</description></item><item><title>kmctl - the CLI</title><link>https://kubemoot.org/docs/ecosystem/kmctl/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/ecosystem/kmctl/</guid><description>&lt;p&gt;&lt;strong&gt;kmctl&lt;/strong&gt; (&amp;ldquo;kubemoot control&amp;rdquo;) is the command-line tool for working with crews and
Kubemoot. It is the scriptable, terminal-native way to scaffold, apply, and exercise crews;
&lt;a href="../crewforge/"&gt;CrewForge&lt;/a&gt; is the VS Code extension for developing crews and talking to
them from the editor.&lt;/p&gt;
&lt;h2 id="status"&gt;Status&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;kmctl&lt;/code&gt; is early and actively developed. It is installable from GitHub releases and
ships a working command set covering cluster inspection, crew scaffolding, resource
management, live conversation, fitness suite execution, and shell completion. Check
your installed version with &lt;code&gt;kmctl version&lt;/code&gt;, and see the GitHub Releases page for the
latest. A small set of subcommands is still planned and marked as such in the
&lt;a href="../../reference/kmctl/"&gt;reference page&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>kmctl User Guide</title><link>https://kubemoot.org/docs/user-guides/kmctl/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/user-guides/kmctl/</guid><description>&lt;p&gt;&lt;code&gt;kmctl&lt;/code&gt; is the command-line tool for Kubemoot. This guide covers installation, a
runnable quickstart that walks through the core workflow, and shell-completion setup.&lt;/p&gt;
&lt;p&gt;For the complete command reference, see &lt;a href="../../reference/kmctl/"&gt;kmctl Reference&lt;/a&gt;.
For an overview of &lt;code&gt;kmctl&lt;/code&gt;&amp;rsquo;s role in the ecosystem, see
&lt;a href="../../ecosystem/kmctl/"&gt;kmctl - the CLI&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="command-structure"&gt;Command structure&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;kmctl&lt;/code&gt; uses a hybrid noun-verb layout, chosen deliberately as the best fit for a
domain CLI with deeply-nested resources and actions that have no clean kubectl
equivalent.&lt;/p&gt;</description></item><item><title>MCP Tools</title><link>https://kubemoot.org/docs/concepts/mcp-tools/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/concepts/mcp-tools/</guid><description>&lt;p&gt;An agent&amp;rsquo;s knowledge comes from its model and its RAG sources; its &lt;em&gt;abilities&lt;/em&gt; - to
read a cluster, query a database, search the web - come from &lt;strong&gt;tools&lt;/strong&gt;. Kubemoot
exposes tools through the &lt;a href="https://modelcontextprotocol.io"&gt;Model Context Protocol (MCP)&lt;/a&gt;,
so any MCP server becomes a capability a crew can use.&lt;/p&gt;
&lt;h2 id="servers-gateway-agents"&gt;Servers, gateway, agents&lt;/h2&gt;
&lt;p&gt;Three resources form the tool chain, and agents never connect to a tool server
directly:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Agent → MCPGateway → MCPServer
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;An &lt;strong&gt;MCPServer&lt;/strong&gt; deploys one MCP tool server (a container image) and manages its
lifecycle: the deployment, health probes, and - for the many servers that only
speak stdio - an auto-injected &lt;code&gt;mcp-bridge&lt;/code&gt; sidecar that bridges HTTP/SSE to the
server&amp;rsquo;s stdin/stdout.&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;MCPGateway&lt;/strong&gt; is the hub agents talk to. It discovers MCPServers by label
selector, performs the MCP handshake with each, aggregates all their tools, and
routes an agent&amp;rsquo;s tool call to the right server.&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;Agent&lt;/strong&gt; reaches the gateway through its runtime and sees the union of tools the
gateway exposes, narrowed by the agent&amp;rsquo;s own &lt;code&gt;enabledTools&lt;/code&gt; / &lt;code&gt;disabledTools&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This indirection means you can add or remove a tool server, or scale the gateway,
without touching agent specs - the gateway rediscovers servers and re-aggregates tools.&lt;/p&gt;</description></item><item><title>Releases and Versioning</title><link>https://kubemoot.org/docs/community/releases/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/community/releases/</guid><description>&lt;p&gt;Every merge to &lt;code&gt;main&lt;/code&gt; builds a release candidate. A maintainer publishes a tested
candidate as a public release. Users install final releases; &lt;code&gt;main&lt;/code&gt; is in development.&lt;/p&gt;
&lt;h2 id="the-version-rule"&gt;The version rule&lt;/h2&gt;
&lt;p&gt;Versions live only in git tags. Files in git hold &lt;code&gt;0.0.0&lt;/code&gt;. Every build computes its
version from the tags and stamps it into what it publishes, and CI never commits a
version back to the repository. The source tree therefore never carries a release or
candidate number, and the tag is the only record of what was released.&lt;/p&gt;</description></item><item><title>Settings and permissions</title><link>https://kubemoot.org/docs/ecosystem/crewforge/settings-and-permissions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/ecosystem/crewforge/settings-and-permissions/</guid><description>&lt;h2 id="settings"&gt;Settings&lt;/h2&gt;
&lt;p&gt;Open &lt;strong&gt;Settings&lt;/strong&gt; in VS Code and search for &lt;code&gt;crewforge&lt;/code&gt;.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Setting&lt;/th&gt;
 &lt;th&gt;Default&lt;/th&gt;
 &lt;th&gt;Meaning&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;crewforge.kubeconfig&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;empty&lt;/td&gt;
 &lt;td&gt;Path to a kubeconfig file. Empty uses &lt;code&gt;KUBECONFIG&lt;/code&gt;, then &lt;code&gt;~/.kube/config&lt;/code&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;crewforge.context&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;empty&lt;/td&gt;
 &lt;td&gt;Kubernetes context to use. Empty uses the kubeconfig&amp;rsquo;s current context.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;crewforge.namespaces&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;[]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Show crews only in these namespaces. Set it when your account may read only some namespaces. Empty shows every namespace you can read.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;crewforge.streamTimeoutSeconds&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;600&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Longest a single turn may stream before CrewForge gives up on it. The minimum is 60.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;crewforge.dashboardService&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;empty&lt;/td&gt;
 &lt;td&gt;The Kubemoot dashboard&amp;rsquo;s Service as &lt;code&gt;namespace/name:port&lt;/code&gt;. CrewForge reads it through the Kubernetes service proxy, read-only, for thread counts, discussion failures, fitness scores, and archived iterations. Empty finds the Service labelled &lt;code&gt;app.kubernetes.io/part-of=kubemoot&lt;/code&gt; whose &lt;code&gt;app.kubernetes.io/name&lt;/code&gt; is &lt;code&gt;dashboard&lt;/code&gt; (the operator chart&amp;rsquo;s subchart) or &lt;code&gt;kubemoot-dashboard&lt;/code&gt; (a standalone install). Add an optional base path, &lt;code&gt;namespace/name:port/base&lt;/code&gt;, when the dashboard serves under a path such as &lt;code&gt;/dashboard&lt;/code&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;crewforge.yamlFormat&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;yaml&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;How Show Live YAML, Show Source YAML, and Compare with Live write an object. &lt;code&gt;yaml&lt;/code&gt; is block YAML. &lt;code&gt;kyaml&lt;/code&gt; is KYAML, the strict YAML subset &lt;code&gt;kubectl get -o kyaml&lt;/code&gt; prints: every string quoted, maps in &lt;code&gt;{ }&lt;/code&gt;, lists in &lt;code&gt;[ ]&lt;/code&gt;. KYAML is still valid YAML.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;crewforge.dashboardUrl&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;empty&lt;/td&gt;
 &lt;td&gt;The address of the &lt;a href="../../../operating/dashboard/"&gt;Kubemoot dashboard&lt;/a&gt; for this cluster. &lt;strong&gt;Powered by Kubemoot&lt;/strong&gt; in a chat opens it, and &lt;strong&gt;Open this turn in the Kubemoot dashboard&lt;/strong&gt; appears under an answer only when this is set. Behind a &lt;code&gt;kubectl port-forward&lt;/code&gt;, use the local address. Empty makes &lt;strong&gt;Powered by Kubemoot&lt;/strong&gt; open this setting.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The Kubemoot dashboard is optional. Without it, the parts of the crew and fitness
dashboards that come from it (discussion counts, agent failures, judge scores, and the
results workbook download) say they are not available.&lt;/p&gt;</description></item><item><title>Secrets and tools</title><link>https://kubemoot.org/docs/concepts/secrets-and-tools/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/concepts/secrets-and-tools/</guid><description>&lt;p&gt;A tool that sends mail, queries a database, or calls an API needs a credential. Kubemoot
keeps that credential away from the model. The principle:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The model never holds a secret; only the tool process does.&lt;/strong&gt; An agent calls a tool
and receives results. It never receives the token, password, or key behind the tool.&lt;/p&gt;
&lt;h2 id="why"&gt;Why&lt;/h2&gt;
&lt;p&gt;A model reads prompts and writes text. Anything placed in a prompt, a ConfigMap an agent
reads, or an agent&amp;rsquo;s environment can appear in a response, a log, a discussion
artifact, or a retrieved document. A credential held only by the tool process cannot be
leaked by what a model says, and a prompt-injected agent has nothing to hand over. The
tool chain reinforces this boundary: agents reach tools only through the
&lt;a href="../mcp-tools/"&gt;MCPGateway&lt;/a&gt;, and the credential lives in the MCPServer pod behind it.&lt;/p&gt;</description></item><item><title>Troubleshooting</title><link>https://kubemoot.org/docs/ecosystem/crewforge/troubleshooting/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/ecosystem/crewforge/troubleshooting/</guid><description>&lt;h2 id="where-the-logs-are"&gt;Where the logs are&lt;/h2&gt;
&lt;p&gt;CrewForge writes to its own output channel. Open &lt;strong&gt;View &amp;gt; Output&lt;/strong&gt; and choose
&lt;strong&gt;CrewForge&lt;/strong&gt; from the drop-down. It holds page errors, Lint failures, and the output of
the &lt;code&gt;helm&lt;/code&gt; and &lt;code&gt;kubectl&lt;/code&gt; commands behind a deploy, redeploy, or undeploy. A failed deploy
opens it for you. A failed &lt;code&gt;kmctl create&lt;/code&gt; shows kmctl&amp;rsquo;s own message in a dialog.&lt;/p&gt;
&lt;p&gt;For a bug report, run &lt;strong&gt;CrewForge: Show Connection Info&lt;/strong&gt; and use its &lt;strong&gt;Copy&lt;/strong&gt; button. It
gives CrewForge&amp;rsquo;s version, the Kubemoot operator&amp;rsquo;s version, the Kubernetes server version,
and the context and server address.&lt;/p&gt;</description></item><item><title>Questions</title><link>https://kubemoot.org/docs/introduction/faq/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/introduction/faq/</guid><description>&lt;p&gt;Short answers, each one a position you can hold us to, with the page that backs it.&lt;/p&gt;
&lt;h2 id="why-not-just-use-claude-code-with-a-frontier-model"&gt;Why not just use Claude Code with a frontier model?&lt;/h2&gt;
&lt;p&gt;Often you should. A frontier model wins open-ended, one-off work where data may leave
your network and per-token cost is acceptable. Kubemoot is for the other situation:
data that stays home, cost that is fixed by hardware rather than by usage, behaviour
governed as code, and agents that run where your platform already runs, under its
RBAC, quotas, and lifecycle. It is not either-or: Claude Code can use a crew as one
agent through the &lt;a href="../../integrations/crew-liaison/"&gt;crew liaison&lt;/a&gt;, the frontier model
at the edge and the private crew on the domain work. We do not claim that a crew of
small models out-reasons a frontier model; that is not what it is for. What a crew
does give you is the choice of where the compute is spent: tokens billed by a
server, or watts on hardware you run.&lt;/p&gt;</description></item><item><title>Related Projects</title><link>https://kubemoot.org/docs/introduction/related-projects/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/introduction/related-projects/</guid><description>&lt;p&gt;A common first question is &amp;ldquo;how is this different from X?&amp;rdquo; This page answers it for
the projects people ask about most. Each entry says what the project is, where it
overlaps with Kubemoot, and where the two differ. Several of these are the better
choice for some jobs, and the entries say so. Descriptions of other projects are
summaries of their own documentation; read their sites for the current picture.&lt;/p&gt;</description></item><item><title>kmctl Reference</title><link>https://kubemoot.org/docs/reference/kmctl/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/reference/kmctl/</guid><description>&lt;p&gt;&lt;code&gt;kmctl&lt;/code&gt; is the command-line tool for Kubemoot. It is a convenience layer over
Kubemoot&amp;rsquo;s Kubernetes resources, consistent in flag and output style with &lt;code&gt;kubectl&lt;/code&gt;,
&lt;code&gt;istioctl&lt;/code&gt;, and &lt;code&gt;helm&lt;/code&gt;. The command layout (noun-first resource commands + global
manifest verbs) is a deliberate design choice; see
&lt;a href="../../user-guides/kmctl/#command-structure"&gt;Command structure&lt;/a&gt; in the user guide.&lt;/p&gt;
&lt;p&gt;This reference covers the shipped command surface. Commands marked &lt;strong&gt;planned&lt;/strong&gt; are
designed but not yet implemented; all others work today. Check your installed version
with &lt;code&gt;kmctl version&lt;/code&gt;. Every command has runnable &lt;code&gt;--help&lt;/code&gt; examples, and &lt;code&gt;get&lt;/code&gt; commands
offer shell completion of resource names. Run &lt;code&gt;kmctl &amp;lt;command&amp;gt; --help&lt;/code&gt; for the same
information inline.&lt;/p&gt;</description></item><item><title>Roadmap</title><link>https://kubemoot.org/docs/introduction/roadmap/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/introduction/roadmap/</guid><description>&lt;p&gt;Kubemoot is young. If a capability you expect is missing, it is more likely on this
page than rejected. This page lists the significant directions under consideration or
in progress: the ones that change what a crew can be. Small features, conveniences,
and fixes live on the project board, not here. Each item says what exists today, so
nothing below is mistaken for something already shipped.&lt;/p&gt;
&lt;p&gt;Ideas become work in the open: propose or argue for one in
&lt;a href="https://github.com/orgs/kubemoot/discussions"&gt;Discussions&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>About the Name</title><link>https://kubemoot.org/docs/introduction/about-the-name/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kubemoot.org/docs/introduction/about-the-name/</guid><description>&lt;p&gt;In Anglo-Saxon England, a &lt;strong&gt;moot&lt;/strong&gt; (or &lt;em&gt;gemōt&lt;/em&gt;) was an assembly gathered to deliberate
and reach a decision. From village moots to the great Witenagemot that advised kings,
these assemblies embodied a principle: better decisions emerge when diverse
perspectives contribute to a shared deliberation.&lt;/p&gt;
&lt;p&gt;Readers of Tolkien know another one. In &lt;em&gt;The Two Towers&lt;/em&gt;, the Ents hold an
&lt;a href="https://tolkiengateway.net/wiki/Entmoot"&gt;Entmoot&lt;/a&gt; to decide whether to march on
Isengard: a gathering in a hidden dell, unhurried, where every Ent speaks and nothing
is decided until all have. It takes three days. A Kubemoot crew takes minutes, which
is still slower than one model asserting an answer, and for the same reason: the
answer is not one voice&amp;rsquo;s.&lt;/p&gt;</description></item></channel></rss>