# Email Agent — Agent Runbook ## Before you start 1. Read `00-index.md`. Inject only the documents you need. 2. Read `AGENTS.md` section 11 (build order) and section 10 (rules). 3. Check git status and the last commits. ```sh cd /home/sam/paseo/projects/email_agent git status git log -n 5 --oneline ``` ## Run the tests Run the Go tests in a container. The image has the toolchain. ```sh timeout 600 docker run --rm -v "$PWD":/src -w /src golang:1.25-alpine go test ./... timeout 600 docker run --rm -v "$PWD":/src -w /src golang:1.25-alpine go vet ./... ``` Expected: `go test ./...` is green and `go vet ./...` is silent. ## Run locally ```sh go run ./cmd/email-agent curl -s localhost:8790/health ``` The health reply is JSON: `{"status":"ok","database":"ok", ...}`. ## Build and deploy on .13 Load the host secrets, then build and start the container. ```sh set -a; . ~/.config/environment.d/10-secrets.conf; set +a cd /home/sam/paseo/projects/email_agent EMAIL_AGENT_VERSION=phase8 EMAIL_AGENT_COMMIT=$(git rev-parse --short HEAD) docker compose build docker compose up -d ``` Check the result: ```sh docker ps --filter name=email-agent curl -s https://mail.lab.audasmedia.com.au/health ``` ## Check the live service ```sh curl -s http://127.0.0.1:8790/health curl -s http://127.0.0.1:8790/readyz timeout 10 docker exec email-agent email-agent -version timeout 10 docker exec email-agent email-agent -check-smtp ``` `-check-smtp` verifies IPv4, STARTTLS, and login. It sends no mail. ## Trigger the jobs The jobs also run from the dashboard buttons. The CLI runs them without the UI. ```sh timeout 60 docker exec email-agent email-agent -fetch timeout 120 docker exec email-agent email-agent -classify timeout 60 docker exec email-agent email-agent -summary ``` `-summary-send` sends a real email. Get Sam's approval first. `-retain` clears old bodies and caps the log. ## The Hub API `HUB_TOKEN` protects `/capabilities` and `/ask`. `email_agent` is registered with the running Hub. ```sh set -a; . ~/.config/environment.d/10-secrets.conf; set +a curl -s -H "Authorization: Bearer $HUB_TOKEN" http://127.0.0.1:8790/capabilities curl -s -H "Authorization: Bearer $HUB_TOKEN" -H 'Content-Type: application/json' \ -d '{"question":"anything important in my inbox?","asker":"sam"}' \ http://127.0.0.1:8790/ask ``` `/ask` is read-only. It never writes to the database. ## Restart ```sh docker compose restart email-agent docker logs --tail 50 email-agent ``` ## Roll back 1. `git revert && docker compose up -d --build`. 2. The database is on the `email_agent_data` volume. It is not changed by a code revert. A schema migration is forward-only; restore a database copy to go back a schema version. 3. To disable the Hub API, remove `HUB_TOKEN` from the host secrets and restart. ## Rebuild the documentation ```sh cd /home/sam/paseo/projects/email_agent mmdc -i docs/email-agent-architecture.mmd -o docs/diagrams/email-agent-architecture.png --scale 2 -b white cd /home/sam/.agents/skills/archify node bin/archify.mjs validate architecture /home/sam/paseo/projects/email_agent/docs/archify/email-agent.architecture.json --quality showcase --json node bin/archify.mjs deliver architecture /home/sam/paseo/projects/email_agent/docs/archify/email-agent.architecture.json /home/sam/paseo/projects/email_agent/docs/email-agent-map.html --quality showcase --json ``` ## Publish the map ```sh ~/.agents/skills/project-docs/scripts/publish-maps.sh /home/sam/paseo/projects/email_agent ``` Result: `https://maps.lab.audasmedia.com.au/email_agent/docs/`. ## Documentation surfaces | Surface | Location | | :--- | :--- | | Gitea | `ssh://git@gitea.lab.audasmedia.com.au:2222/sam/email_agent.git` | | Obsidian | Vault `010 inbox` on `.27` (the sorter files it later). | | Outline | Collection `Email Agent` on `outline.lab.audasmedia.com.au`. | | Vikunja | Project `Email Agent` on `vikunja.lab.audasmedia.com.au`. | | Map | `central_ai_llm_master/docs/hub-architecture-map.html` and this repo's map. | ## Safety rules - Force IPv4 for every Gmail connection. IPv6 fails from `.13`. - Never commit a secret. - Never send a real email as a test. Ask Sam first. - Never follow a real unsubscribe link. Only mark and record. - Spam is recommended, never auto-deleted. - Bound every `docker run` with `timeout` and `--entrypoint sh`. A bare `docker run` starts the server and hangs.