<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cleanroom</title><link>https://cleanroom-docs.pages.dev/dev/</link><description>Recent content on Cleanroom</description><generator>Hugo</generator><language>en</language><atom:link href="https://cleanroom-docs.pages.dev/dev/index.xml" rel="self" type="application/rss+xml"/><item><title>cleanroom-mcp</title><link>https://cleanroom-docs.pages.dev/dev/docs/components/mcp/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cleanroom-docs.pages.dev/dev/docs/components/mcp/</guid><description>&lt;h1 id="cleanroom-mcp"&gt;cleanroom-mcp&lt;a class="anchor" href="#cleanroom-mcp"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The MCP server is the AI integration layer. It exposes MCP tools that AI agents (Hermes, Claude, Codex) can call to request cleanroom environments, submit jobs, and retrieve results — without any knowledge of the underlying infrastructure.&lt;/p&gt;
&lt;h2 id="responsibilities"&gt;Responsibilities&lt;a class="anchor" href="#responsibilities"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Expose MCP tools over the MCP protocol&lt;/li&gt;
&lt;li&gt;Translate tool calls into HTTP API requests against the controller&lt;/li&gt;
&lt;li&gt;Return structured results (logs, artifacts, status) to the caller&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="design-constraints"&gt;Design constraints&lt;a class="anchor" href="#design-constraints"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Stateless — all state lives in the controller&lt;/li&gt;
&lt;li&gt;No business logic — routing and validation belong in the controller&lt;/li&gt;
&lt;li&gt;Must not require the caller to understand PXE, Buildroot, PoE, or worker lifecycle&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mcp-tools-planned"&gt;MCP tools (planned)&lt;a class="anchor" href="#mcp-tools-planned"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Tool&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;submit_job&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Submit a job script and return a job ID&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;get_job_status&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Poll a job by ID for status and progress&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;get_job_logs&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Retrieve stdout/stderr for a completed job&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;code&gt;list_workers&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;List registered workers and their current state&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>cleanroom-controller</title><link>https://cleanroom-docs.pages.dev/dev/docs/components/controller/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cleanroom-docs.pages.dev/dev/docs/components/controller/</guid><description>&lt;h1 id="cleanroom-controller"&gt;cleanroom-controller&lt;a class="anchor" href="#cleanroom-controller"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The controller is the central authority for all cleanroom state. It is built on &lt;a href="https://pocketbase.io/"&gt;PocketBase&lt;/a&gt; with an embedded Go binary and a lightweight UI for manual operation.&lt;/p&gt;
&lt;h2 id="responsibilities"&gt;Responsibilities&lt;a class="anchor" href="#responsibilities"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Node registry — track which workers are registered and their current state&lt;/li&gt;
&lt;li&gt;Job scheduler — assign jobs to idle workers, track execution&lt;/li&gt;
&lt;li&gt;Power provider abstraction — enable/disable PoE ports, request reboots&lt;/li&gt;
&lt;li&gt;Log and artifact storage — persist job outputs to the local filesystem&lt;/li&gt;
&lt;li&gt;HTTP API — serve the controller API consumed by the MCP server and the UI&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="subsystems"&gt;Subsystems&lt;a class="anchor" href="#subsystems"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;h3 id="node-registry"&gt;Node registry&lt;a class="anchor" href="#node-registry"&gt;#&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Each worker registers itself with the controller on boot. The controller maintains current state (idle, busy, offline) and last-seen timestamps for each node.&lt;/p&gt;</description></item><item><title>cleanroom-worker</title><link>https://cleanroom-docs.pages.dev/dev/docs/components/worker/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cleanroom-docs.pages.dev/dev/docs/components/worker/</guid><description>&lt;h1 id="cleanroom-worker"&gt;cleanroom-worker&lt;a class="anchor" href="#cleanroom-worker"&gt;#&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;The worker is a small Go binary baked into the Buildroot image. It runs on each cleanroom node and is responsible for executing jobs assigned by the controller.&lt;/p&gt;
&lt;h2 id="responsibilities"&gt;Responsibilities&lt;a class="anchor" href="#responsibilities"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Register with the controller on boot&lt;/li&gt;
&lt;li&gt;Poll for assigned jobs&lt;/li&gt;
&lt;li&gt;Execute job scripts in an isolated environment&lt;/li&gt;
&lt;li&gt;Stream logs and upload artifacts to the controller&lt;/li&gt;
&lt;li&gt;Report completion status and exit cleanly&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="design-constraints"&gt;Design constraints&lt;a class="anchor" href="#design-constraints"&gt;#&lt;/a&gt;&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No durable state.&lt;/strong&gt; The worker writes nothing to persistent storage. All output goes to the controller.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No long-lived secrets.&lt;/strong&gt; Job credentials are passed at assignment time and discarded after the job completes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stateless across reboots.&lt;/strong&gt; A rebooted worker is indistinguishable from a freshly booted one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Minimal dependencies.&lt;/strong&gt; The worker binary must build with only the Go standard library.&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>