Files
command-center/agent/managed-skills/hermes-config-home-drift/SKILL.md
T
Frank 9bfa0be85d chore(skills): promote runbook skills to managed-skills; drop superseded SKILL.md
- 31 new managed skills (anubis/arr/authentik/hermes/freetoken/podman/llm-swap
  runbooks etc.) now tracked.
- Removed superseded skills: omp_harness_config, peon_ping_integration
  (replaced by user-authored peon-ping-* managed skills),
  rocmfp4-strix-benchmark-orchestration.
- New memory-root skills: niri_compositor_ops, omp_git_workflow,
  omp_model_config, quadlet-media-migration, homelab-service-triage,
  hermes-dankclaw-ops, frank-default-large-ops, caddy-auth-dns-playbook.
2026-09-09 16:20:28 -07:00

2.1 KiB

name, description
name description
hermes-config-home-drift Diagnose Hermes webui/agent model-connection failures caused by HERMES_HOME config-home drift (image VOLUME anonymous volumes resetting on recreation) — verify which home each runtime reads, resolve provider→endpoint with the app's own resolver code, then probe the endpoint.

Hermes config-home drift diagnosis

Symptom: hermes-webui/agent "cannot connect" to models even though the model endpoints answer curl.

  1. Find the real config home per runtime. podman exec <container> printenv HERMES_HOME for each hermes container. If webui reads /opt/data (image default) while the gateway reads /data, the webui runs the image-default template config (provider: auto → openrouter.ai with no key = connect failure).
  2. Know the recreation trap. Image VOLUME points get a fresh anonymous volume on every container recreation (podman run --replace --rm) — edits inside such a mount are lost on restart/redeploy. Compare volume ids before/after a restart to confirm.
  3. Fix: pin Environment=HERMES_HOME=/data in the quadlet unit (shared state root), deploy via service-scoped deployer, restart.
  4. Verify with the app's own code, not guesses:
    • from api import config as C; C.resolve_model_provider("<model-id>") → returns (model_id, provider, base_url); bare ids map to owning provider by scanning the providers: dict models allow-list; @provider:model syntax forces an explicit provider.
    • hermes_cli.providers.resolve_user_provider(name, cfg["providers"]) → ProviderDef with real base_url; accepts api/url/base_url keys on named provider entries.
  5. Probe the endpoint with the exact served model id (FLM/NPU endpoints route only by exact registry tag and answer HTTP 200 with {"error":"Failed to load <tag> model!"} for unknown tags — status-code checks miss this).

Key gotcha: named providers (providers: dict) are a catalog + connection source; custom:<slug> connections resolve only via custom_providers[] entries. If neither holds an entry for the provider name, the request has no endpoint and fails to connect.