@@ -13,6 +13,7 @@ const bodyContent = `<h1>Configuration</h1>
1313 <li><a href="#directory">Directory structure</a></li>
1414 <li><a href="#daemon-flags">Daemon flags</a></li>
1515 <li><a href="#logging">Logging</a></li>
16+ <li><a href="#setup-manifests">Setup manifests</a></li>
1617 </ul>
1718 </div>
1819
@@ -51,7 +52,7 @@ const bodyContent = `<h1>Configuration</h1>
5152 <tbody>
5253 <tr><td>PILOT_SOCKET</td><td>/tmp/pilot.sock</td><td>Path to the daemon IPC socket</td></tr>
5354 <tr><td>PILOT_REGISTRY</td><td>34.71.57.205:9000</td><td>Registry server address</td></tr>
54- <tr><td>PILOT_HOSTNAME</td><td>(none)</td><td>Hostname to set during install; if unset, the daemon uses the system hostname </td></tr>
55+ <tr><td>PILOT_HOSTNAME</td><td>(none)</td><td>Hostname to set during install; if unset, no hostname is registered </td></tr>
5556 <tr><td>PILOT_ADMIN_TOKEN</td><td>(none)</td><td>Admin token for enterprise operations</td></tr>
5657 </tbody>
5758 </table>
@@ -63,6 +64,7 @@ const bodyContent = `<h1>Configuration</h1>
6364 config.json <span class="comment"># Configuration file</span>
6465 identity.json <span class="comment"># Ed25519 keypair (persistent identity)</span>
6566 trust.json <span class="comment"># Trust state (trusted peers, pending requests)</span>
67+ setups/ <span class="comment"># Setup manifests (role identity files)</span>
6668 received/ <span class="comment"># Files received via data exchange</span>
6769 inbox/ <span class="comment"># Messages received via data exchange</span>
6870 tasks/ <span class="comment"># Task files and results</span>
@@ -121,6 +123,60 @@ const bodyContent = `<h1>Configuration</h1>
121123
122124 <p>Log levels: <code>debug</code>, <code>info</code> (default), <code>warn</code>, <code>error</code></p>
123125
126+ <h2 id="setup-manifests">Setup manifests</h2>
127+
128+ <p>When a setup skill configures this agent for a specific role, it writes a <strong>setup manifest</strong> to <code>~/.pilot/setups/<slug>.json</code>. This file persists the role configuration so the agent knows its identity, which skills to use and how, which peers exist, and what data flows to expect.</p>
129+
130+ <pre><code>{
131+ "setup": "fleet-health-monitor",
132+ "setup_name": "Fleet Health Monitor",
133+ "role": "web-monitor",
134+ "role_name": "Web Server Monitor",
135+ "hostname": "acme-web-monitor",
136+ "description": "Watches nginx/app health, CPU, memory, response times.",
137+ "skills": {
138+ "pilot-health": "Check nginx, app endpoints, SSL certs.",
139+ "pilot-alert": "Publish alerts to acme-alert-hub on health-alert.",
140+ "pilot-metrics": "Collect CPU, memory, disk, response time."
141+ },
142+ "peers": [
143+ {
144+ "role": "alert-hub",
145+ "hostname": "acme-alert-hub",
146+ "description": "Central alert aggregator"
147+ }
148+ ],
149+ "data_flows": [
150+ {
151+ "direction": "send",
152+ "peer": "acme-alert-hub",
153+ "port": 1002,
154+ "topic": "health-alert",
155+ "description": "Health check failures"
156+ }
157+ ],
158+ "handshakes_needed": ["acme-alert-hub"]
159+ }</code></pre>
160+
161+ <h3>Manifest fields</h3>
162+ <table>
163+ <thead><tr><th>Field</th><th>Type</th><th>Description</th></tr></thead>
164+ <tbody>
165+ <tr><td>setup</td><td>string</td><td>Setup slug (matches the filename)</td></tr>
166+ <tr><td>setup_name</td><td>string</td><td>Human-readable setup name</td></tr>
167+ <tr><td>role</td><td>string</td><td>This agent's role ID within the setup</td></tr>
168+ <tr><td>role_name</td><td>string</td><td>Human-readable role name</td></tr>
169+ <tr><td>hostname</td><td>string</td><td>This agent's hostname</td></tr>
170+ <tr><td>description</td><td>string</td><td>What this agent does in context</td></tr>
171+ <tr><td>skills</td><td>map</td><td>Skill name → contextual description of what it does <em>in this role</em></td></tr>
172+ <tr><td>peers</td><td>array</td><td>All peer agents in the setup (even indirect ones)</td></tr>
173+ <tr><td>data_flows</td><td>array</td><td>Directional data flows (send/receive) with port and topic</td></tr>
174+ <tr><td>handshakes_needed</td><td>array</td><td>Hostnames of peers that need direct trust (handshakes)</td></tr>
175+ </tbody>
176+ </table>
177+
178+ <p>The manifest is a convention — the AI agent writes it during setup and reads it when it needs to act. No daemon or CLI changes are required.</p>
179+
124180 <div class="callout">
125181 <strong>Further reading:</strong> <a href="/blog/run-agent-network-without-cloud-dependency">Run an Agent Network Without Cloud Dependency</a>
126182 </div> ` ;
0 commit comments