2026-08-02 02:47:55 -03:00

98 lines
4.4 KiB
Markdown

# Live Atlas Hermes architecture
Use this reference for deployment-specific facts. Re-check live state before
asserting health, placement, ownership, or current model availability.
## Two isolated agent instances
| Surface | Purpose | Identity boundary | State and permissions |
| --- | --- | --- | --- |
| `agent.bstein.dev` | Brad's operator and triage lab | Keycloak plus an outer oauth2-proxy exact-email allow-list for `brad@bstein.dev` | `hermes` namespace, its own PVC and service account; read-only cluster triage plus approved internal evidence endpoints |
| `chat.bstein.dev` | Consumer chat and research | Keycloak login | `hermes-chat` namespace, separate PVC/config/auth/sessions/skills; read-only cluster observer RBAC and no access to Secrets or Kubernetes mutation APIs |
The instances do not share conversation state, credentials, profiles, skills
created on their PVCs, or Kubernetes identities. They share only the inference
service described below. Consumer users cannot reach the operator dashboard
through the chat Service or Ingress.
## Inference path
```text
operator Hermes ─┐
├─> hermes-model-gate ─> Ollama gpt-oss:20b on titan-24 GPU
consumer Hermes ─┘ │
└─ 503 while Wolf owns the GPU
each instance independently ─────> openai-codex/gpt-5.4 fallback
```
- The configured context length is 64,000 tokens.
- `hermes-model-gate` is the stable OpenAI-compatible endpoint.
- A GPU-owner ConfigMap and controller coordinate Hermes versus Wolf/Moonlight.
- Wolf ownership makes the gate return a deliberate unavailable response. The
Hermes gateway stays alive and can use its configured fallback.
- The two agent pods do not consume titan-24 GPU memory. Ollama does. Agent pods
are ARM gateway workloads with persistent state on separate PVCs.
- Fallback credentials are deliberately per-instance. Never copy Brad's Codex
credential store into the consumer PVC.
Verify rather than memorize:
```sh
hermes status
hermes fallback list
kubectl -n hermes get configmap hermes-gpu-owner -o yaml
kubectl -n hermes get deploy hermes hermes-model-gate hermes-ollama -o wide
kubectl -n hermes-chat get deploy hermes-chat -o wide
```
Do not change the GPU owner as part of a lesson.
## Operator evidence path
The operator role is designed for supervised test-failure triage:
1. Ariadne deterministic bundle and optional diagnosis.
2. Retained Jenkins logs and artifacts.
3. Recent Git changes and Flux revision/state.
4. Kubernetes workload, node, event, storage, DNS, and dependency health.
5. Pushgateway quality metrics and VictoriaMetrics/Grafana context.
6. A concise finding, confidence, evidence, blast radius, next checks,
repo-side fix, and approval-required section.
The versioned `$triage-titan-test-failures` skill encodes this workflow. The
operator has internal URLs for Ariadne, Jenkins, and VictoriaMetrics. The
consumer instance intentionally does not.
## Security layers and their limits
Security is layered rather than delegated to a prompt:
1. Keycloak authenticates the human.
2. The operator proxy limits `agent.bstein.dev` to Brad's exact email.
3. Separate namespaces, PVCs, service accounts, configs, and ingresses isolate
operator and consumer state.
4. Kubernetes RBAC grants the consumer get/list/watch only and excludes Secrets,
exec, attach, port-forward, and mutation.
5. NetworkPolicy permits the consumer to reach DNS, the shared model gate, the
Kubernetes API, and public IPv4 while blocking arbitrary private service
access.
6. Hermes deny patterns and instructions add user-facing guardrails.
Prompt rules and shell deny patterns are not the primary security boundary.
RBAC, network policy, credential separation, and routing isolation are. The
consumer can still disclose non-secret cluster metadata it is authorized to
read; that is an intentional requirement and should be described honestly.
## CLI-to-web mental model
The pinned Hermes build exposes chat, models and fallback, auth, sessions,
profiles, skills and bundles, plugins, tools, MCP, gateway/channels, pairing,
webhooks, cron, kanban, projects, hooks, memory/journey, logs, security, backup,
and diagnostics. The web interface is a control surface over many of these
same persisted capabilities.
Use `<command> --help` and the web Documentation page for the installed version.
Do not rely on screenshots or online docs from a different release when a live
command can settle the question.