Full SOP-driven update of Hermes Agent.530 commits pulled (5af899c7c →6110aed9b). Same version tag — pure fast-forward, no upstream release between. Repo was clean before and after. Snapshot saved, all required post-update gates passed.
20260610-191100-pre-update2). Confirmed updates.pre_update_backup: true in config. Verified Claude Code 2.1.170, hermes-claude-auth b799919. Checked auth health (Keychain + file OK, ~7.7h remaining on token).write_approval feature, no Revert of major features.hermes update. Exit0. Gateway restart attempted; launchd bootstrap failed exit5 (plist stale); fell back to bg process. Telegram polling reconnected.| Gate | Result | Notes |
|---|---|---|
| Hermes version | ✅ v0.16.0 | Same tag, fast-forward. Head5af899c7c →6110aed9b |
| Repo clean post-update | ✅ | No dirty files, no stashed patches needed |
| Pre-update backup | ✅ | Snapshot20260610-191100-pre-update2 + auto zip via config flag |
| Camofox localhost patch | ✅ | 127.0.0.1 bind at ~/.hermes/services/camofox-browser/server.js |
| Profile skill symlinks (7) | ✅ | researcher, ops, coder, reviewer, writer, specifier, orchestrator |
| Gateway running | ✅ PID9635 | Telegram polling connected,87 targets, cron ticker running |
| Telegram reachability | ✅ | Polling mode,30 commands registered, channel directory rebuilt |
| OAuth structural health | ✅ | Keychain7.7h, file7.7h, Hermes pool has2 credentials |
| Claude Code CLI smoke | ⏭ skipped per BB | SOP updated to opt-in |
| Hermes Anthropic smoke | ⏭ skipped per BB | Would have shown401 (env-var credential dead) |
| Launchd plist | ⚠ stale | Bootstrap exit5; bg process fallback; no auto-restart on crash |
platform_pause_after_failures=0 | ⚠ lost | Custom2026-05-24 patch clobbered |
Added a new Step6d-OPT block to 40-Projects/claude-oauth-safety-guardrails/sops/update-gate.md. It explicitly prompts BB before running the Claude Code CLI and Hermes Anthropic smoke tests. If BB says skip, the SOP logs that decision and continues to step7a.
The smokes cost live API calls (5s each, negligible but real tokens) and only matter if BB is actively using Claude/Anthropic. During the2026-06-10 update, BB was on OpenCode Go (minimax-m3). Running the smokes by default would have spent calls on a route BB didn't need. The agent should ask, not assume.
40-Projects/claude-oauth-safety-guardrails/sops/update-gate.md — lines288-313. Renumbered6d → opt-in Claude Code CLI check,6e → opt-in Hermes Anthropic smoke.
The530-commit window added a new _handle_polling_network_error pattern at gateway/platforms/telegram.py:948+. It does what our local _recover_degraded_send_path patch did: reset the httpx connection pool used for getUpdates polling, re-call start_polling(), verify the long-poll is actually alive after restart.
Per the SOP source-vs-config rule and reconciliation pattern: drop our local patch. Upstream ships the equivalent. Add to 50-Areas/Hermes-Infra.md: remove the _recover_degraded_send_path entry from the "known patches" list. No behaviour change for us — same resilience, cleaner upstream pattern.
Our2026-05-24 patch added a custom config key platform_pause_after_failures + env override HERMES_GATEWAY_PLATFORM_PAUSE_AFTER_FAILURES to keep Telegram polling on retryable network failures instead of auto-pausing after10. The update clobbered both. gateway/run.py no longer reads the config key or env var. Default behaviour is now: pause Telegram after10 consecutive failures (same as pre-patch stock).
Mac-sleep / hotel-Wi-Fi scenarios were repeatedly causing Telegram to go dead. The auto-pause was too eager —10 failures on a flaky connection would kill the bot for the whole outage. The override kept the bot retrying until the network came back.
~/.hermes/skills/productivity/orchestrator/SKILL.md v2.0.0) — stock is v3.0.0. Upstream changelog showed only docs changes (d17c953a5, fda66c488). No behavior drift this update. Merge task (logged2026-06-06) still pending but no new drift.~/.hermes/hooks/memory-gate/handler.sh) — still wired and active. Upstream now ships write_approval config + inline prompt as a new layer. Our hook is orthogonal (stricter: requires literal "save to memory" / "yes save" in recent transcript). Keep both.Your2026-05-24 patch added a custom config key platform_pause_after_failures and env override HERMES_GATEWAY_PLATFORM_PAUSE_AFTER_FAILURES. Together they tell the gateway: "never auto-pause Telegram on retryable network failures, just keep retrying indefinitely." The2026-06-10 update clobbered it. Default behaviour is back to: auto-pause Telegram after10 consecutive failures.
On a Mac that drops Wi-Fi, sleeps, or has a flaky hotel connection, the gateway's Telegram polling would hit network errors. Without the patch, after10 retries it gives up and marks the platform as paused. With the patch, it keeps retrying until the network comes back. You avoid having to manually /platform resume telegram every time.
The2026-05-24 incident: Telegram kept going dead on the Mac whenever the hotel Wi-Fi dropped or the laptop slept. The10-failure threshold was being hit constantly during normal travel. You added the override because auto-pause was making things worse, not better.
gateway/run.py + one env line in .env./platform resume telegram after every outage./platform resume telegram (or hermes gateway restart) after every outage.update-gate.md so the next update reapplies it automatically.# Edit gateway/run.py to read the env override # (sed patch — exact line varies per Hermes version, search for 'auto-paused') # Add to ~/.hermes/.env # HERMES_GATEWAY_PLATFORM_PAUSE_AFTER_FAILURES=0 # Restart gateway # hermes gateway restart
During the update, hermes update tried to restart the gateway via launchd. launchctl reported "Service definition is stale relative to current Hermes install" and bootstrap failed with exit5 (Input/output error). Hermes fell back to running the gateway as a background process. That bg process is up now (PID9635) and Telegram polling works, but it has two consequences:
hermes gateway start.hermes gateway start doesRefreshes the plist definition (path: ~/Library/LaunchAgents/ai.hermes.gateway.plist) to match the current Hermes install, then re-bootstraps it under launchd. After that, the gateway is properly managed: auto-start on login, auto-restart on crash, normal exit code semantics.
hermes gateway start # Verify: hermes gateway status # Should show: 'Gateway service is loaded' + PID + clean timestamps
Our custom orchestrator skill at ~/.hermes/skills/productivity/orchestrator/SKILL.md is v2.0.0. Stock Hermes ships skills/devops/kanban-orchestrator/SKILL.md v3.0.0 with meaningful improvements (goal_mode cards, stuck-worker recovery, hallucination detection, better decomposition rules). This drift was first logged2026-06-06. The2026-06-10 update added no new drift — task unchanged.
Read both side by side. KEEP our BB-specific sections (verify-before-design, orchestrator SOUL companion note, named profile examples). ADOPT stock improvements (goal_mode, stuck worker recovery, hallucination detection, improved decomposition rule wording). BUMP version to3.0.0 after merge. TEST with a real kanban dispatch.
~/.hermes/skills/productivity/orchestrator/SKILL.md (ours) + ~/.hermes/hermes-agent/skills/devops/kanban-orchestrator/SKILL.md (stock).diff or read end-to-end. Note the sections.hermes kanban assignees + dispatch a small task via the orchestrator profile.The env-var credential CLAUDE_CODE_OAUTH_TOKEN in ~/.hermes/.env is dead. Hermes resolves env-var credentials before the healthy Keychain + file credentials, so any request that hits the env-var path returns401. The Keychain + file tokens are fresh (~7.7h remaining) but the resolver picks the wrong one first.
You're on OpenCode Go (minimax-m3) right now, not Claude. The failure doesn't bite. If/when you switch back to Claude/Anthropic, requests will fail until this is fixed.
Open Claude Code, type /login, complete the browser OAuth, exit. That writes a fresh access token + refresh token to macOS Keychain. Mirror the credentials file via the hermes-claude-auth installer. Reset Hermes's credential pool so it re-discovers both. Restart the gateway.
/login in Claude Code (cannot automate — needs browser).#1. Open Claude Code interactively claude # Then inside the TUI: /login → browser OAuth → /exit #2. Mirror credentials to file cd ~/Documents/ClaudeCode/hermes-claude-auth && ./install.sh #3. Reset Hermes pool hermes auth reset anthropic #4. Restart gateway hermes gateway restart #5. Smoke (OPT-IN now, per new SOP) # hermes chat -q 'Reply with exactly: AUTH TEST OK' \ # --provider anthropic -m claude-sonnet-4-6 -Q # (NEVER use 'claude setup-token' — requires TTY, fails silently from automation)
| # | Action | Priority | Time | My take |
|---|---|---|---|---|
| 1 | Re-apply platform_pause_after_failures=0 | HIGH | 5 min | Re-apply if you travel + rely on Telegram |
| 2 | Refresh gateway launchd plist | MEDIUM | 30s | Do it — restores safety net |
| 3 | Merge kanban-orchestrator v2 → v3 | MEDIUM | 30-60 min | Schedule this week |
| 4 | Fix Anthropic401 | LOW | 3 min | Defer until on Claude |