7.8 KiB
Fleet Manual
Operator contract. Version 3.0 — 27 September 2026.
Changelog: v3.0 locks the fleet to jobs, not chat. The shared diary mailbox is retired as a bus. Wiring (Tailscale, SSH relay, :8642) is infra, not the operating model.
This file is the source of truth. MANUAL.md is historical.
1. What this is
Grok Bot is the front door you talk to. Hermes is the worker on your machine. Regis is an outside drafter. You are the Gatekeeper.
Agents do not chat. They pass jobs. A job has one owner, one state, one live surface, and an evidence slot. Anything irreversible is you.
2. Locked shape
You → CoS GO / no-go / "saved" / "stand down"
CoS → worker open a job (what, who, done-when, live URL)
worker → CoS event file: proposal | block | outcome
CoS → job file the only rewrite: flip state
watcher → CoS routine doorbell POST when a new event file appears
Illegal:
- Regis talking to Hermes
- Hermes talking to Regis
- A third agent joining a job without CoS opening a second job
- CURRENT text without a live URL and a
live_read_at - "Done" without an evidence path
- Secrets in git, chat, jobs, or events
3. Roles
| Role | Who | Does | Never |
|---|---|---|---|
| Gatekeeper | Human | GO, login, Save / Send / publish / spend, plant vault secrets | Pastes secrets into chat |
| CoS | One Grok Bot | Opens jobs, fact-checks, owns state, wakes on doorbell |
Approves done without evidence; chats with workers |
| Worker (Regis) | Outside runtime | Reads live surface, drafts, drive-and-stop at login | Send, post, login, Save, talk to Hermes |
| Worker (Hermes) | Host agent | Audit, research, desktop hands, evidence packs | Page editing as the primary path; talk to Regis |
| Watcher | Script or local Hermes cron | Detects new event files, POSTs doorbell | Calls a model to see if a file grew |
| Fleet Ops | Optional later | Host doctor / disk / updates | Exists before a second host has been up 14 days |
One human conversation: you talk to CoS. CoS does not freelance package upgrades.
4. The record
Repo: Tony_tech/personal-agent-os
memory-systems/agent-os/04_projects/<project>/jobs/
JOB-<YYYYMMDD>-<slug>.md # CoS owns this file
events/JOB-<YYYYMMDD>-<slug>/
001-<from>-<type>.md # anyone may add; nobody edits
Old shared logs (regis-cos.md and any append-only diary) are archives. Do not append work to them.
Job file (CoS only)
---
id: JOB-YYYYMMDD-slug
project: <project>
surface: <one page or one artifact>
state: open
owner: regis
gate: human-login
live_url:
live_read_at:
current_hash:
proposed_hash:
evidence: []
blocker: null
---
# JOB-YYYYMMDD-slug
what:
who:
done-when:
state values, in order:
open → proposed → acked → ready_to_save → saved
Side exits: blocked | stand_down
Only CoS writes this file. A worker that rewrites state is out of contract.
Event file (workers and CoS)
---
job: JOB-YYYYMMDD-slug
from: regis
to: cos
type: proposal
at: 2026-09-27T10:50:00-07:00
live_url:
live_read_at:
---
type is one of: proposal | ack | reject | block | outcome | gatekeeper.
proposal without live_url and live_read_at is invalid. CoS rejects it and does not discuss it.
Body holds CURRENT (from that URL at that time), PROPOSED, and evidence paths. No secrets. Relayed human words are quoted verbatim and labeled who / where / when.
5. Job loop
- Gatekeeper says GO.
- CoS creates the job file.
state: open. Live URL required before any draft. - Worker reads that URL now. Writes
NNN-<from>-proposal.md. If the live surface cannot be read, writesblockinstead of inventing CURRENT. - Watcher sees the new file and doorbells CoS.
- CoS fact-checks against the project's canonical facts. Writes
ackorrejectevent. Flips jobstatetoackedorblocked. - Worker drives to the field and stops at login.
- Gatekeeper logs in. Worker pastes only the ACK'd text. Stops before Save.
- Gatekeeper clicks Save and tells CoS. CoS writes
outcome, setssaved, attaches evidence. - CoS opens the next job. One surface per job.
Approvals count only as a CoS ack/outcome event or a gatekeeper event quoting you.
6. Wake path
Do not pay a model to see if a file grew.
Primary: watcher lists jobs/events/** (mtime or git log --since). On a new file, one HTTPS POST to the CoS routine.
curl -fsS -X POST "<WEBHOOK_URL>" \
-H "Authorization: <AUTH_HEADER_FROM_VAULT>" \
-H "Content-Type: text/plain" \
--max-time 10 \
--data "JOB-id type=proposal"
Body is a doorbell. No secrets. No draft text. CoS acts only on job + event files. Duplicate ping with nothing new: stay quiet.
Backup until the doorbell has fired clean twice: hourly hash check, not a 15-minute model poll.
Pinger is outbound only. No Funnel. No new open port on Hermes hosts. Human plants URL and header in the pinger vault. The bot never sees the key.
STATUS: doorbell planted but not proven as of 2026-09-27. Keep the hourly backup until two clean wakes are logged as outcome events on any job.
7. Hermes wiring (infra only)
Need Hermes from CoS? Use what already works on the host.
- Desktop-primary, no gateway: SSH relay MCP (
ask,health). - Gateway up: HTTP
http://<tailscale-host>:8642/v1, bind the Tailscale IP, never0.0.0.0. - Tailscale only. No Funnel.
- Grok may read Hermes memory plugins. Grok may not write them.
- Account-scoped MCP is visible to every bot on the account. Treat every identity bot as able to see every connector. Do not pretend a prompt is isolation.
- Do not add Fleet Ops or a second-host identity bot until a second host has been up 14 days.
Relay details and marketplace template URLs live in MANUAL.md if you need to rebuild a box. They are not the fleet.
8. Secrets
- Vault holds
API_SERVER_KEY, mailbox/job-repo token, webhook header, SSH keys. - Job-repo token: narrow, repo-scoped, planted by the human. Never an admin credential. Never pasted in chat.
- Nothing secret in jobs, events, or this manual.
- Rotate anything that appeared in a screenshot or a thread.
9. Cadence
- You talk to CoS when there is work or a Save.
- Watcher runs continuously or every few minutes. It does not use Grok.
- CoS runs when you speak or when a doorbell arrives.
- Workers run only on an open job.
- Weekly: one secrets check, one "any job stuck in
blocked?" pass.
10. Hard rules
- One surface per job.
- Live read on the same surface before CURRENT.
- Evidence path before
saved. - Re-read live immediately before paste;
stand_downif it is already done. - Anything beyond the card (new account, payment, verification code, different listing):
block. - Jobs are not memory. Do not copy them into Hermes memory by default.
- Long goals go to a Hermes kanban or a project file, not a Grok thread.
11. Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| Two agents fighting a SHA | Still writing one diary | Use a new event file |
| Stale CURRENT | Drafted from memory or another URL | Reject; demand live_url + live_read_at |
| "Done" with no proof | Prose status | Leave state where it is |
| No wake | Webhook unplanted or non-2xx | Check vault, fall back to hourly hash |
| Agent "doesn't see it" | Said in chat, not an event file | Post the event |
| Other bots calling a host | Account-scoped MCP | Assume shared; don't put irreversible tools on it |
tailscale ping to Regis fails |
Outbound-only by design | Not a fault |
12. Sources
- This contract supersedes v2.0 mailbox + 15-minute dual poll.
- Wiring appendix: MANUAL.md
- Bridge: https://github.com/shagghiesuperstar/hermes-grok-bridge
- Live job seat:
Tony_tech/personal-agent-os→memory-systems/agent-os/04_projects/<project>/jobs/ - Archive only:
…/veripath/regis-cos.md
Hostnames, URLs, keys, and ACL tags in any leftover examples are placeholders.