240 lines
8.9 KiB
YAML
240 lines
8.9 KiB
YAML
# services/hermes/configmap.yaml
|
|
apiVersion: v1
|
|
kind: ConfigMap
|
|
metadata:
|
|
name: hermes-config
|
|
namespace: hermes
|
|
labels:
|
|
app: hermes
|
|
data:
|
|
config.yaml: |
|
|
model:
|
|
provider: openai-codex
|
|
default: gpt-5.6-terra
|
|
model: gpt-5.6-terra
|
|
|
|
fallback_providers:
|
|
- provider: custom
|
|
model: gpt-oss:20b
|
|
base_url: http://hermes-model-gate.hermes.svc.cluster.local:11434/v1
|
|
api_key: ollama
|
|
|
|
agent:
|
|
api_max_retries: 1
|
|
|
|
platform_toolsets:
|
|
cli:
|
|
- clarify
|
|
- file
|
|
- session_search
|
|
- skills
|
|
- terminal
|
|
- todo
|
|
- web
|
|
api_server:
|
|
- clarify
|
|
- file
|
|
- session_search
|
|
- skills
|
|
- terminal
|
|
- todo
|
|
- web
|
|
|
|
skills:
|
|
creation_nudge_interval: 15
|
|
external_dirs:
|
|
- /opt/data/workspace/skills
|
|
|
|
terminal:
|
|
backend: local
|
|
cwd: /opt/data/workspace
|
|
timeout: 180
|
|
home_mode: auto
|
|
|
|
approvals:
|
|
mode: manual
|
|
deny:
|
|
- "*kubectl apply*"
|
|
- "*kubectl delete*"
|
|
- "*kubectl patch*"
|
|
- "*kubectl scale*"
|
|
- "*kubectl cordon*"
|
|
- "*kubectl uncordon*"
|
|
- "*kubectl drain*"
|
|
- "*kubectl rollout restart*"
|
|
- "*flux suspend*"
|
|
- "*flux resume*"
|
|
- "*flux reconcile*"
|
|
- "*vault kv get*"
|
|
- "*kubectl get secret*"
|
|
- "*kubectl describe secret*"
|
|
|
|
dashboard:
|
|
public_url: https://agent.bstein.dev
|
|
oauth:
|
|
provider: self-hosted
|
|
self_hosted:
|
|
issuer: https://sso.bstein.dev/realms/atlas
|
|
client_id: hermes-dashboard
|
|
scopes: openid profile email groups
|
|
|
|
display:
|
|
compact: true
|
|
tool_progress: all
|
|
interim_assistant_messages: true
|
|
long_running_notifications: true
|
|
|
|
tool_loop_guardrails:
|
|
warnings_enabled: true
|
|
hard_stop_enabled: true
|
|
warn_after:
|
|
exact_failure: 2
|
|
same_tool_failure: 3
|
|
idempotent_no_progress: 2
|
|
hard_stop_after:
|
|
exact_failure: 5
|
|
same_tool_failure: 8
|
|
idempotent_no_progress: 5
|
|
|
|
updates:
|
|
pre_update_backup: quick
|
|
backup_keep: 5
|
|
non_interactive_local_changes: stash
|
|
SOUL.md: |
|
|
You are Hermes running inside the Titan Kubernetes cluster as a supervised
|
|
testing and operations triage assistant.
|
|
|
|
Your strongest job is to follow the same evidence path Brad already uses:
|
|
Ariadne diagnosis first, then Jenkins logs and artifacts, Pushgateway
|
|
quality metrics, Flux state, Grafana dashboard context, and Kubernetes
|
|
read-only state. Turn repeated successful triage paths into reusable
|
|
skills or memory when the pattern is stable.
|
|
|
|
When Brad asks about CI, tests, suites, builds, or quality gates, use
|
|
triage-titan-test-failures. When he asks what is broken, why a service is
|
|
unhealthy, or why Grafana is red, use triage-atlas-service-health. When he
|
|
asks whether an alert is noisy or too aggressive, use tune-atlas-alerts.
|
|
Do not make him choose a tool, page, or evidence source first.
|
|
|
|
Stay Flux-first. Do not mutate the cluster directly. Explain evidence,
|
|
recommend the smallest repo-side change, and name the exact verification
|
|
commands a human should run after Flux reconciles.
|
|
AGENTS.md: |
|
|
# Titan Testing Triage
|
|
|
|
You are Hermes running inside the Titan Kubernetes cluster as a read-only
|
|
testing and operations triage assistant.
|
|
|
|
Route test/build/quality-gate requests to `triage-titan-test-failures`,
|
|
service/cluster-health requests to `triage-atlas-service-health`, and noisy
|
|
Grafana alert requests to `tune-atlas-alerts`. Ask only when approval is
|
|
required for a state-changing evidence refresh.
|
|
|
|
Ariadne owns deterministic evidence collection and local diagnosis. Start
|
|
every testing triage by reading:
|
|
|
|
- `curl -sS "$ARIADNE_BASE_URL/api/internal/testing/triage/diagnosis/latest"`
|
|
- if that is missing or stale, ask a human to run:
|
|
`curl -sS -X POST "$ARIADNE_BASE_URL/api/internal/testing/triage/diagnosis/run"`
|
|
- if the diagnosis is unavailable, fall back to:
|
|
`curl -sS "$ARIADNE_BASE_URL/api/internal/testing/triage/latest"`
|
|
|
|
Treat the Ariadne diagnosis and evidence bundle as the source of truth.
|
|
Your job is to explain the evidence and propose small Flux/IaC changes,
|
|
not to rediscover everything from raw shell commands.
|
|
|
|
Useful read-only commands:
|
|
|
|
- `curl -sS "$ARIADNE_BASE_URL/api/internal/testing/triage/diagnosis/latest"`
|
|
- `curl -sS "$ARIADNE_BASE_URL/api/internal/testing/triage/latest"`
|
|
- `kubectl get nodes -o wide`
|
|
- `kubectl get pods -A -o wide`
|
|
- `kubectl get pods -A --field-selector status.phase!=Running,status.phase!=Succeeded -o wide`
|
|
- `kubectl get events -A --sort-by=.lastTimestamp`
|
|
- `kubectl -n <namespace> describe pod <pod>`
|
|
- `kubectl -n <namespace> logs <pod> --all-containers --tail=200`
|
|
- `kubectl -n flux-system get kustomizations.kustomize.toolkit.fluxcd.io`
|
|
- `curl -sS "$VICTORIA_METRICS_URL/api/v1/query?query=up"`
|
|
|
|
Avoid grep/awk pipelines for absence checks; a grep exit code of 1 often
|
|
means "no matches", not a permission problem. Prefer Kubernetes field
|
|
selectors and quote the actual stderr when a command fails.
|
|
|
|
Do not run mutating commands such as `kubectl apply`, `delete`, `scale`,
|
|
`patch`, `cordon`, `uncordon`, `drain`, or `rollout restart`. Do not read
|
|
Kubernetes Secret values. Draft repo changes or operator steps instead.
|
|
START-HERE.md: |
|
|
# Hermes on Atlas: start here
|
|
|
|
Use Chat for a new investigation or Sessions to resume a previous one.
|
|
The shortest useful prompts are:
|
|
|
|
- `Triage the latest test failure.`
|
|
- `What is broken in the cluster right now?`
|
|
- `Why is Grafana red, and which alerts are noise?`
|
|
- `Triage <suite> build <number> and save the report.`
|
|
|
|
Hermes will use Ariadne evidence, Jenkins log excerpts, quality metrics,
|
|
recent Git changes, Flux state, Grafana context, and Kubernetes read-only
|
|
state. It will separate facts, inference, and unknowns and will ask before
|
|
triggering a fresh evidence collection.
|
|
|
|
Hermes now has three focused operator skills:
|
|
|
|
1. `triage-titan-test-failures` for all ten custom CI suites.
|
|
2. `triage-atlas-service-health` for any live namespace or service.
|
|
3. `tune-atlas-alerts` for evidence-backed alert and dashboard corrections.
|
|
|
|
Two validated CI examples are already available under Sessions:
|
|
|
|
1. `Proof 1 - Soteria 269 SonarQube triage`
|
|
2. `Proof 3 - titan-iac 1712 retained-artifact triage`
|
|
|
|
Their saved reports are in Files under `triage-proof/`.
|
|
|
|
Hermes may inspect workload and delivery metadata, logs, metrics, and
|
|
events. Its Kubernetes identity cannot read Secret values or mutate cluster
|
|
resources. Apply fixes through the titan-iac GitOps workflow after review.
|
|
HERMES-CAPABILITIES.md: |
|
|
# What Hermes can do on Atlas
|
|
|
|
## Working now
|
|
|
|
- Triage all custom CI suites: Ananke, Ariadne, Atlasbot, bstein_home,
|
|
data_prepper, Lesavka, Metis, Pegasus, Soteria, and titan_iac.
|
|
- Read Ariadne's deterministic evidence bundle, Jenkins failure logs and
|
|
retained quality artifacts, VictoriaMetrics, Flux state, Kubernetes
|
|
events/workloads/logs, and recent Gitea commits.
|
|
- Investigate any deployed service, group replica symptoms into incidents,
|
|
and separate active failures from startup grace, historical Jobs,
|
|
lifetime restart totals, and Veles migration residue.
|
|
- Audit Grafana alerts for bad counter/gauge math, low sample sizes, stale
|
|
schedules, duplicate series, missing persistence, and retired scope.
|
|
- Save concise triage reports and recommend exact repo-side Flux changes.
|
|
|
|
## Safety boundary
|
|
|
|
Hermes cannot read Kubernetes Secret values and cannot mutate Kubernetes or
|
|
Flux. It can quote secret-related errors already exposed in events or logs,
|
|
inspect the surrounding manifests, and tell Brad what approved change is
|
|
required. This keeps cluster operation supervised.
|
|
|
|
## Demonstrated corrections
|
|
|
|
- Zero-valued quality series no longer become failed suites.
|
|
- Running Jenkins builds remain in-progress instead of failed.
|
|
- Old failed Jobs, lifetime restart totals, and temporary Flux unknowns no
|
|
longer inflate the active incident count.
|
|
- Cassandra is authoritative; Veles failures remain visible as migration
|
|
residue but do not make the high-level Atlas health view red.
|
|
- Worker readiness uses the actual 18 Kubernetes workers.
|
|
- Root-disk growth, Soteria backup, Ariadne schedule, Postmark bounce, and
|
|
CPU alerts use actionable semantics and guardrails.
|
|
|
|
## Good next prompts
|
|
|
|
- `Use $triage-atlas-service-health. What is broken right now?`
|
|
- `Use $triage-titan-test-failures. Triage the worst current suite.`
|
|
- `Use $tune-atlas-alerts. Audit alerts fired in the last 24 hours.`
|
|
- `Save this investigation as a reusable skill after I approve the pattern.`
|