208 lines
7.8 KiB
Markdown
208 lines
7.8 KiB
Markdown
# 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)
|
|
|
|
```yaml
|
|
---
|
|
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)
|
|
|
|
```yaml
|
|
---
|
|
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
|
|
|
|
1. Gatekeeper says GO.
|
|
2. CoS creates the job file. `state: open`. Live URL required before any draft.
|
|
3. Worker reads that URL now. Writes `NNN-<from>-proposal.md`. If the live surface cannot be read, writes `block` instead of inventing CURRENT.
|
|
4. Watcher sees the new file and doorbells CoS.
|
|
5. CoS fact-checks against the project's canonical facts. Writes `ack` or `reject` event. Flips job `state` to `acked` or `blocked`.
|
|
6. Worker drives to the field and stops at login.
|
|
7. Gatekeeper logs in. Worker pastes only the ACK'd text. Stops before Save.
|
|
8. Gatekeeper clicks Save and tells CoS. CoS writes `outcome`, sets `saved`, attaches evidence.
|
|
9. 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.
|
|
|
|
```bash
|
|
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, never `0.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_down` if 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](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.
|