refactor: restructure services layout, retire oceanus, add aether scaffolding
- Move flat service manifests into structured subdirs (apps/, bootstrap-jobs/,
repair-jobs/, migration-jobs/, validation-jobs/, node-ops/, networking/)
- Retire oneoffs/ directories across services
- Remove oceanus cluster and its host roles; add aether cluster + terraform scaffolding
- Reorganize scripts/ into ops/, render/, sync/, manual-tests/
- Add Makefile with render/validate/test/flux targets and repo-structure tests
- Update flux-system application CRs to the new paths
- Add hermes-automated-triage-24h-plan knowledge doc (+ comms mirror)
- Refresh knowledge catalogs, dashboards, vmalert rules, quality contract
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-05 16:21:36 -03:00
|
|
|
# services/maintenance/apps/ariadne-deployment.yaml
|
2026-01-19 16:58:02 -03:00
|
|
|
apiVersion: apps/v1
|
|
|
|
|
kind: Deployment
|
|
|
|
|
metadata:
|
|
|
|
|
name: ariadne
|
|
|
|
|
namespace: maintenance
|
|
|
|
|
spec:
|
2026-01-22 15:23:23 -03:00
|
|
|
replicas: 1
|
2026-01-19 16:58:02 -03:00
|
|
|
revisionHistoryLimit: 3
|
|
|
|
|
selector:
|
|
|
|
|
matchLabels:
|
|
|
|
|
app: ariadne
|
|
|
|
|
template:
|
|
|
|
|
metadata:
|
|
|
|
|
labels:
|
|
|
|
|
app: ariadne
|
|
|
|
|
annotations:
|
|
|
|
|
prometheus.io/scrape: "true"
|
|
|
|
|
prometheus.io/port: "8080"
|
|
|
|
|
prometheus.io/path: "/metrics"
|
2026-04-13 02:45:29 -03:00
|
|
|
maintenance.bstein.dev/restart-rev: "20260413-jenkins-api-2"
|
2026-01-19 16:58:02 -03:00
|
|
|
vault.hashicorp.com/agent-inject: "true"
|
|
|
|
|
vault.hashicorp.com/role: "maintenance"
|
2026-05-20 03:14:50 -03:00
|
|
|
vault.hashicorp.com/agent-requests-cpu: "25m"
|
|
|
|
|
vault.hashicorp.com/agent-limits-cpu: "100m"
|
|
|
|
|
vault.hashicorp.com/agent-requests-mem: "32Mi"
|
|
|
|
|
vault.hashicorp.com/agent-limits-mem: "128Mi"
|
2026-01-20 23:03:39 -03:00
|
|
|
vault.hashicorp.com/agent-inject-secret-ariadne-env.sh: "kv/data/atlas/maintenance/ariadne-db"
|
2026-01-19 16:58:02 -03:00
|
|
|
vault.hashicorp.com/agent-inject-template-ariadne-env.sh: |
|
2026-01-20 23:03:39 -03:00
|
|
|
{{ with secret "kv/data/atlas/maintenance/ariadne-db" }}
|
2026-01-21 02:57:40 -03:00
|
|
|
export ARIADNE_DATABASE_URL="{{ .Data.data.database_url }}"
|
2026-04-13 02:41:20 -03:00
|
|
|
export JENKINS_API_USER="{{ .Data.data.jenkins_api_user }}"
|
|
|
|
|
export JENKINS_API_TOKEN="{{ .Data.data.jenkins_api_token }}"
|
2026-08-06 22:38:11 -03:00
|
|
|
{{- if .Data.data.sonarqube_token }}
|
|
|
|
|
export ARIADNE_HERMES_SONAR_TOKEN="{{ .Data.data.sonarqube_token }}"
|
|
|
|
|
{{- end }}
|
2026-05-21 02:07:17 -03:00
|
|
|
{{- if .Data.data.game_mode_hook_token }}
|
|
|
|
|
export GAME_MODE_HOOK_TOKEN="{{ .Data.data.game_mode_hook_token }}"
|
|
|
|
|
{{- end }}
|
2026-01-21 03:39:17 -03:00
|
|
|
{{ end }}
|
2026-08-15 17:58:47 -03:00
|
|
|
{{ with secret "kv/data/atlas/hermes/triage-api" }}
|
|
|
|
|
export ARIADNE_HERMES_API_KEY="{{ .Data.data.api_key }}"
|
|
|
|
|
{{ end }}
|
|
|
|
|
{{ with secret "kv/data/atlas/hermes/developer-gitea" }}
|
|
|
|
|
export ARIADNE_HERMES_GITEA_TOKEN="{{ .Data.data.token }}"
|
|
|
|
|
{{ end }}
|
2026-01-21 03:39:17 -03:00
|
|
|
{{ with secret "kv/data/atlas/portal/atlas-portal-db" }}
|
|
|
|
|
export PORTAL_DATABASE_URL="{{ .Data.data.PORTAL_DATABASE_URL }}"
|
2026-01-19 16:58:02 -03:00
|
|
|
{{ end }}
|
|
|
|
|
{{ with secret "kv/data/atlas/portal/bstein-dev-home-keycloak-admin" }}
|
|
|
|
|
export KEYCLOAK_ADMIN_CLIENT_SECRET="{{ .Data.data.client_secret }}"
|
|
|
|
|
{{ end }}
|
2026-01-20 23:03:39 -03:00
|
|
|
{{ with secret "kv/data/atlas/nextcloud/nextcloud-db" }}
|
|
|
|
|
export NEXTCLOUD_DB_NAME="{{ .Data.data.database }}"
|
|
|
|
|
export NEXTCLOUD_DB_USER="{{ index .Data.data "db-username" }}"
|
|
|
|
|
export NEXTCLOUD_DB_PASSWORD="{{ index .Data.data "db-password" }}"
|
|
|
|
|
{{ end }}
|
|
|
|
|
{{ with secret "kv/data/atlas/nextcloud/nextcloud-admin" }}
|
|
|
|
|
export NEXTCLOUD_ADMIN_USER="{{ index .Data.data "admin-user" }}"
|
|
|
|
|
export NEXTCLOUD_ADMIN_PASSWORD="{{ index .Data.data "admin-password" }}"
|
|
|
|
|
{{ end }}
|
|
|
|
|
{{ with secret "kv/data/atlas/health/wger-admin" }}
|
|
|
|
|
export WGER_ADMIN_USERNAME="{{ .Data.data.username }}"
|
|
|
|
|
export WGER_ADMIN_PASSWORD="{{ .Data.data.password }}"
|
|
|
|
|
{{ end }}
|
|
|
|
|
{{ with secret "kv/data/atlas/finance/firefly-secrets" }}
|
|
|
|
|
export FIREFLY_CRON_TOKEN="{{ .Data.data.STATIC_CRON_TOKEN }}"
|
|
|
|
|
{{ end }}
|
2026-01-19 16:58:02 -03:00
|
|
|
{{ with secret "kv/data/atlas/mailu/mailu-db-secret" }}
|
|
|
|
|
export MAILU_DB_NAME="{{ .Data.data.database }}"
|
|
|
|
|
export MAILU_DB_USER="{{ .Data.data.username }}"
|
|
|
|
|
export MAILU_DB_PASSWORD="{{ .Data.data.password }}"
|
|
|
|
|
{{ end }}
|
|
|
|
|
{{ with secret "kv/data/atlas/mailu/mailu-initial-account-secret" }}
|
|
|
|
|
export SMTP_HOST="mailu-front.mailu-mailserver.svc.cluster.local"
|
|
|
|
|
export SMTP_PORT="587"
|
|
|
|
|
export SMTP_STARTTLS="true"
|
|
|
|
|
export SMTP_USE_TLS="false"
|
|
|
|
|
export SMTP_USERNAME="no-reply-portal@bstein.dev"
|
|
|
|
|
export SMTP_PASSWORD="{{ .Data.data.password }}"
|
|
|
|
|
export SMTP_FROM="no-reply-portal@bstein.dev"
|
2026-01-21 02:57:40 -03:00
|
|
|
export MAILU_SYSTEM_PASSWORD="{{ .Data.data.password }}"
|
2026-01-19 16:58:02 -03:00
|
|
|
{{ end }}
|
2026-01-20 23:03:39 -03:00
|
|
|
{{ with secret "kv/data/atlas/comms/mas-admin-client-runtime" }}
|
|
|
|
|
export COMMS_MAS_ADMIN_CLIENT_SECRET="{{ .Data.data.client_secret }}"
|
|
|
|
|
{{ end }}
|
|
|
|
|
{{ with secret "kv/data/atlas/comms/atlasbot-credentials-runtime" }}
|
|
|
|
|
export COMMS_BOT_PASSWORD="{{ index .Data.data "bot-password" }}"
|
|
|
|
|
export COMMS_SEEDER_PASSWORD="{{ index .Data.data "seeder-password" }}"
|
|
|
|
|
{{ end }}
|
2026-01-27 04:48:44 -03:00
|
|
|
{{ with secret "kv/data/atlas/comms/synapse-admin" }}
|
|
|
|
|
export COMMS_SYNAPSE_ADMIN_TOKEN="{{ .Data.data.access_token }}"
|
|
|
|
|
{{ end }}
|
2026-01-20 23:03:39 -03:00
|
|
|
{{ with secret "kv/data/atlas/comms/synapse-db" }}
|
|
|
|
|
export COMMS_SYNAPSE_DB_PASSWORD="{{ .Data.data.POSTGRES_PASSWORD }}"
|
|
|
|
|
{{ end }}
|
|
|
|
|
{{ with secret "kv/data/atlas/vault/vault-oidc-config" }}
|
|
|
|
|
export VAULT_OIDC_DISCOVERY_URL="{{ .Data.data.discovery_url }}"
|
|
|
|
|
export VAULT_OIDC_CLIENT_ID="{{ .Data.data.client_id }}"
|
|
|
|
|
export VAULT_OIDC_CLIENT_SECRET="{{ .Data.data.client_secret }}"
|
|
|
|
|
export VAULT_OIDC_DEFAULT_ROLE="{{ .Data.data.default_role }}"
|
|
|
|
|
export VAULT_OIDC_SCOPES="{{ .Data.data.scopes }}"
|
|
|
|
|
export VAULT_OIDC_USER_CLAIM="{{ .Data.data.user_claim }}"
|
|
|
|
|
export VAULT_OIDC_GROUPS_CLAIM="{{ .Data.data.groups_claim }}"
|
2026-05-15 11:52:03 -03:00
|
|
|
{{- if .Data.data.token_policies }}
|
2026-01-20 23:03:39 -03:00
|
|
|
export VAULT_OIDC_TOKEN_POLICIES="{{ .Data.data.token_policies }}"
|
2026-05-15 11:52:03 -03:00
|
|
|
{{- else }}
|
|
|
|
|
export VAULT_OIDC_TOKEN_POLICIES="default"
|
|
|
|
|
{{- end }}
|
2026-01-20 23:03:39 -03:00
|
|
|
export VAULT_OIDC_ADMIN_GROUP="{{ .Data.data.admin_group }}"
|
|
|
|
|
export VAULT_OIDC_ADMIN_POLICIES="{{ .Data.data.admin_policies }}"
|
2026-05-15 11:52:03 -03:00
|
|
|
{{- if .Data.data.admin_bound_claims }}
|
|
|
|
|
export VAULT_OIDC_ADMIN_BOUND_CLAIMS="{{ .Data.data.admin_bound_claims }}"
|
|
|
|
|
{{- else }}
|
|
|
|
|
export VAULT_OIDC_ADMIN_BOUND_CLAIMS="{\"groups\":\"admin\"}"
|
|
|
|
|
{{- end }}
|
2026-01-20 23:03:39 -03:00
|
|
|
export VAULT_OIDC_DEV_GROUP="{{ .Data.data.dev_group }}"
|
|
|
|
|
export VAULT_OIDC_DEV_POLICIES="{{ .Data.data.dev_policies }}"
|
|
|
|
|
export VAULT_OIDC_USER_GROUP="{{ .Data.data.user_group }}"
|
|
|
|
|
export VAULT_OIDC_USER_POLICIES="{{ .Data.data.user_policies }}"
|
|
|
|
|
export VAULT_OIDC_REDIRECT_URIS="{{ .Data.data.redirect_uris }}"
|
|
|
|
|
export VAULT_OIDC_BOUND_AUDIENCES="{{ .Data.data.bound_audiences }}"
|
2026-05-15 11:52:03 -03:00
|
|
|
{{- if .Data.data.ui_default_auth_method }}
|
|
|
|
|
export VAULT_UI_DEFAULT_AUTH_METHOD="{{ .Data.data.ui_default_auth_method }}"
|
|
|
|
|
{{- else }}
|
|
|
|
|
export VAULT_UI_DEFAULT_AUTH_METHOD="oidc"
|
|
|
|
|
{{- end }}
|
|
|
|
|
{{- if .Data.data.ui_default_auth_path }}
|
|
|
|
|
export VAULT_UI_DEFAULT_AUTH_PATH="{{ .Data.data.ui_default_auth_path }}"
|
|
|
|
|
{{- else }}
|
|
|
|
|
export VAULT_UI_DEFAULT_AUTH_PATH="oidc"
|
|
|
|
|
{{- end }}
|
2026-01-27 01:14:42 -03:00
|
|
|
{{- if .Data.data.bound_claims_type }}
|
2026-01-20 23:03:39 -03:00
|
|
|
export VAULT_OIDC_BOUND_CLAIMS_TYPE="{{ .Data.data.bound_claims_type }}"
|
2026-01-27 01:14:42 -03:00
|
|
|
{{- else }}
|
|
|
|
|
export VAULT_OIDC_BOUND_CLAIMS_TYPE="string"
|
|
|
|
|
{{- end }}
|
2026-01-20 23:03:39 -03:00
|
|
|
{{ end }}
|
2026-01-19 16:58:02 -03:00
|
|
|
spec:
|
|
|
|
|
serviceAccountName: ariadne
|
|
|
|
|
nodeSelector:
|
|
|
|
|
kubernetes.io/arch: arm64
|
|
|
|
|
node-role.kubernetes.io/worker: "true"
|
2026-04-21 21:00:56 -03:00
|
|
|
affinity:
|
|
|
|
|
nodeAffinity:
|
|
|
|
|
preferredDuringSchedulingIgnoredDuringExecution:
|
|
|
|
|
- weight: 100
|
|
|
|
|
preference:
|
|
|
|
|
matchExpressions:
|
2026-05-20 01:57:03 -03:00
|
|
|
- key: hardware
|
|
|
|
|
operator: In
|
|
|
|
|
values: ["rpi5"]
|
2026-04-21 21:00:56 -03:00
|
|
|
- weight: 95
|
|
|
|
|
preference:
|
|
|
|
|
matchExpressions:
|
|
|
|
|
- key: kubernetes.io/hostname
|
|
|
|
|
operator: NotIn
|
|
|
|
|
values:
|
|
|
|
|
- titan-13
|
2026-05-20 01:57:03 -03:00
|
|
|
- titan-14
|
2026-04-21 21:00:56 -03:00
|
|
|
- titan-15
|
|
|
|
|
- titan-17
|
|
|
|
|
- titan-19
|
2026-05-20 01:57:03 -03:00
|
|
|
- weight: 80
|
2026-04-21 21:00:56 -03:00
|
|
|
preference:
|
|
|
|
|
matchExpressions:
|
2026-05-20 01:57:03 -03:00
|
|
|
- key: atlas.bstein.dev/spillover
|
|
|
|
|
operator: DoesNotExist
|
2026-04-21 21:00:56 -03:00
|
|
|
- weight: 50
|
|
|
|
|
preference:
|
|
|
|
|
matchExpressions:
|
|
|
|
|
- key: hardware
|
|
|
|
|
operator: In
|
|
|
|
|
values: ["rpi4"]
|
2026-01-19 16:58:02 -03:00
|
|
|
containers:
|
|
|
|
|
- name: ariadne
|
2026-03-31 00:06:44 -03:00
|
|
|
image: registry.bstein.dev/bstein/ariadne:latest
|
2026-01-19 16:58:02 -03:00
|
|
|
imagePullPolicy: Always
|
|
|
|
|
command: ["/bin/sh", "-c"]
|
|
|
|
|
args:
|
|
|
|
|
- >-
|
|
|
|
|
. /vault/secrets/ariadne-env.sh
|
|
|
|
|
&& exec uvicorn ariadne.app:app --host 0.0.0.0 --port 8080
|
|
|
|
|
ports:
|
|
|
|
|
- name: http
|
|
|
|
|
containerPort: 8080
|
|
|
|
|
env:
|
|
|
|
|
- name: KEYCLOAK_URL
|
|
|
|
|
value: https://sso.bstein.dev
|
|
|
|
|
- name: KEYCLOAK_REALM
|
|
|
|
|
value: atlas
|
|
|
|
|
- name: KEYCLOAK_CLIENT_ID
|
|
|
|
|
value: bstein-dev-home
|
2026-05-21 07:07:30 -03:00
|
|
|
- name: KEYCLOAK_EXTRA_CLIENT_IDS
|
|
|
|
|
value: wolf
|
2026-01-19 16:58:02 -03:00
|
|
|
- name: KEYCLOAK_ISSUER
|
|
|
|
|
value: https://sso.bstein.dev/realms/atlas
|
|
|
|
|
- name: KEYCLOAK_JWKS_URL
|
|
|
|
|
value: http://keycloak.sso.svc.cluster.local/realms/atlas/protocol/openid-connect/certs
|
|
|
|
|
- name: KEYCLOAK_ADMIN_URL
|
|
|
|
|
value: http://keycloak.sso.svc.cluster.local
|
|
|
|
|
- name: KEYCLOAK_ADMIN_REALM
|
|
|
|
|
value: atlas
|
|
|
|
|
- name: KEYCLOAK_ADMIN_CLIENT_ID
|
|
|
|
|
value: bstein-dev-home-admin
|
|
|
|
|
- name: PORTAL_PUBLIC_BASE_URL
|
|
|
|
|
value: https://bstein.dev
|
2026-01-20 03:01:59 -03:00
|
|
|
- name: ARIADNE_LOG_LEVEL
|
|
|
|
|
value: INFO
|
2026-01-22 14:09:39 -03:00
|
|
|
- name: ARIADNE_DB_POOL_MIN
|
|
|
|
|
value: "0"
|
|
|
|
|
- name: ARIADNE_DB_POOL_MAX
|
|
|
|
|
value: "5"
|
|
|
|
|
- name: ARIADNE_DB_CONNECT_TIMEOUT_SEC
|
|
|
|
|
value: "5"
|
|
|
|
|
- name: ARIADNE_DB_LOCK_TIMEOUT_SEC
|
|
|
|
|
value: "5"
|
|
|
|
|
- name: ARIADNE_DB_STATEMENT_TIMEOUT_SEC
|
|
|
|
|
value: "30"
|
|
|
|
|
- name: ARIADNE_DB_IDLE_IN_TX_TIMEOUT_SEC
|
|
|
|
|
value: "10"
|
|
|
|
|
- name: ARIADNE_RUN_MIGRATIONS
|
|
|
|
|
value: "false"
|
2026-01-19 16:58:02 -03:00
|
|
|
- name: PORTAL_ADMIN_USERS
|
|
|
|
|
value: bstein
|
|
|
|
|
- name: PORTAL_ADMIN_GROUPS
|
|
|
|
|
value: admin
|
|
|
|
|
- name: ACCOUNT_ALLOWED_GROUPS
|
|
|
|
|
value: dev,admin
|
|
|
|
|
- name: ALLOWED_FLAG_GROUPS
|
2026-01-23 22:30:50 -03:00
|
|
|
value: demo,test,vaultwarden_grandfathered
|
2026-01-19 16:58:02 -03:00
|
|
|
- name: DEFAULT_USER_GROUPS
|
|
|
|
|
value: dev
|
|
|
|
|
- name: MAILU_DOMAIN
|
|
|
|
|
value: bstein.dev
|
2026-01-20 23:03:39 -03:00
|
|
|
- name: MAILU_HOST
|
|
|
|
|
value: mail.bstein.dev
|
2026-01-19 16:58:02 -03:00
|
|
|
- name: MAILU_SYNC_URL
|
2026-01-21 02:57:40 -03:00
|
|
|
value: http://ariadne.maintenance.svc.cluster.local/events
|
|
|
|
|
- name: MAILU_EVENT_MIN_INTERVAL_SEC
|
|
|
|
|
value: "10"
|
|
|
|
|
- name: MAILU_SYSTEM_USERS
|
|
|
|
|
value: no-reply-portal@bstein.dev,no-reply-vaultwarden@bstein.dev
|
2026-01-19 16:58:02 -03:00
|
|
|
- name: MAILU_MAILBOX_WAIT_TIMEOUT_SEC
|
2026-01-19 22:49:23 -03:00
|
|
|
value: "180"
|
2026-01-19 16:58:02 -03:00
|
|
|
- name: MAILU_DB_HOST
|
|
|
|
|
value: postgres-service.postgres.svc.cluster.local
|
|
|
|
|
- name: MAILU_DB_PORT
|
|
|
|
|
value: "5432"
|
|
|
|
|
- name: NEXTCLOUD_NAMESPACE
|
|
|
|
|
value: nextcloud
|
2026-01-20 23:03:39 -03:00
|
|
|
- name: NEXTCLOUD_POD_LABEL
|
|
|
|
|
value: app=nextcloud
|
|
|
|
|
- name: NEXTCLOUD_CONTAINER
|
|
|
|
|
value: nextcloud
|
|
|
|
|
- name: NEXTCLOUD_EXEC_TIMEOUT_SEC
|
|
|
|
|
value: "120"
|
|
|
|
|
- name: NEXTCLOUD_URL
|
|
|
|
|
value: https://cloud.bstein.dev
|
|
|
|
|
- name: NEXTCLOUD_DB_HOST
|
|
|
|
|
value: postgres-service.postgres.svc.cluster.local
|
|
|
|
|
- name: NEXTCLOUD_DB_PORT
|
|
|
|
|
value: "5432"
|
2026-01-19 16:58:02 -03:00
|
|
|
- name: WGER_NAMESPACE
|
|
|
|
|
value: health
|
|
|
|
|
- name: WGER_USER_SYNC_WAIT_TIMEOUT_SEC
|
|
|
|
|
value: "90"
|
2026-01-20 23:03:39 -03:00
|
|
|
- name: WGER_POD_LABEL
|
|
|
|
|
value: app=wger
|
|
|
|
|
- name: WGER_CONTAINER
|
|
|
|
|
value: wger
|
|
|
|
|
- name: WGER_ADMIN_EMAIL
|
|
|
|
|
value: brad@bstein.dev
|
2026-01-19 16:58:02 -03:00
|
|
|
- name: FIREFLY_NAMESPACE
|
|
|
|
|
value: finance
|
|
|
|
|
- name: FIREFLY_USER_SYNC_WAIT_TIMEOUT_SEC
|
|
|
|
|
value: "90"
|
2026-01-20 23:03:39 -03:00
|
|
|
- name: FIREFLY_POD_LABEL
|
|
|
|
|
value: app=firefly
|
|
|
|
|
- name: FIREFLY_CONTAINER
|
|
|
|
|
value: firefly
|
|
|
|
|
- name: FIREFLY_CRON_BASE_URL
|
|
|
|
|
value: http://firefly.finance.svc.cluster.local/api/v1/cron
|
|
|
|
|
- name: FIREFLY_CRON_TIMEOUT_SEC
|
|
|
|
|
value: "30"
|
2026-01-20 03:01:59 -03:00
|
|
|
- name: VAULT_NAMESPACE
|
|
|
|
|
value: vault
|
2026-01-20 23:03:39 -03:00
|
|
|
- name: VAULT_ADDR
|
|
|
|
|
value: http://vault.vault.svc.cluster.local:8200
|
|
|
|
|
- name: VAULT_K8S_ROLE
|
|
|
|
|
value: vault-admin
|
|
|
|
|
- name: VAULT_K8S_ROLE_TTL
|
|
|
|
|
value: 1h
|
2026-05-21 02:07:17 -03:00
|
|
|
- name: GAME_MODE_NODE_NAME
|
|
|
|
|
value: titan-24
|
|
|
|
|
- name: GAME_MODE_DISPLACE_WORKLOADS
|
2026-08-01 22:38:07 -03:00
|
|
|
value: "[]"
|
|
|
|
|
- name: GAME_MODE_LEASE_NAMESPACE
|
|
|
|
|
value: hermes
|
|
|
|
|
- name: GAME_MODE_LEASE_NAME
|
|
|
|
|
value: titan-24-gpu-owner
|
|
|
|
|
- name: GAME_MODE_OLLAMA_URL
|
2026-08-11 05:20:18 -03:00
|
|
|
value: http://hermes-gpu-handoff.hermes.svc.cluster.local:11434
|
2026-08-01 22:38:07 -03:00
|
|
|
- name: GAME_MODE_OLLAMA_MODEL
|
2026-08-11 05:20:18 -03:00
|
|
|
value: flux-2-klein-4b-local
|
2026-08-01 22:38:07 -03:00
|
|
|
- name: GAME_MODE_OLLAMA_REQUEST_TIMEOUT_SEC
|
|
|
|
|
value: "900"
|
|
|
|
|
- name: GAME_MODE_TRANSITION_TIMEOUT_SEC
|
|
|
|
|
value: "900"
|
|
|
|
|
- name: GAME_MODE_POLL_INTERVAL_SEC
|
|
|
|
|
value: "1"
|
2026-05-21 02:07:17 -03:00
|
|
|
- name: WOLF_OIDC_CLIENT_ID
|
|
|
|
|
value: wolf
|
|
|
|
|
- name: WOLF_OIDC_BASE_URL
|
|
|
|
|
value: https://wolf.bstein.dev
|
|
|
|
|
- name: WOLF_OIDC_VAULT_PATH
|
|
|
|
|
value: game-stream/wolf-oidc
|
|
|
|
|
- name: ARIADNE_SCHEDULE_WOLF_OIDC
|
|
|
|
|
value: "17 */6 * * *"
|
2026-05-21 15:53:17 -03:00
|
|
|
- name: WOLF_API_URL
|
|
|
|
|
value: http://wolf-api.game-stream.svc.cluster.local:8088
|
|
|
|
|
- name: WOLF_GATEKEEPER_URL
|
|
|
|
|
value: http://wolf-gatekeeper.game-stream.svc.cluster.local:8087
|
|
|
|
|
- name: GAME_STREAM_FIREWALL_UNLOCK_TTL_SEC
|
|
|
|
|
value: "28800"
|
|
|
|
|
- name: GAME_STREAM_MOONLIGHT_HOST
|
|
|
|
|
value: moonlight.bstein.dev
|
2026-05-21 02:07:17 -03:00
|
|
|
- name: GAME_STREAM_USER_GROUP
|
|
|
|
|
value: game-stream-users
|
|
|
|
|
- name: GAME_STREAM_ADMIN_GROUP
|
|
|
|
|
value: admin
|
|
|
|
|
- name: GAME_STREAM_PROFILE_GROUP_PREFIX
|
|
|
|
|
value: game-stream-profile-
|
2026-01-20 03:01:59 -03:00
|
|
|
- name: COMMS_NAMESPACE
|
|
|
|
|
value: comms
|
2026-01-20 23:03:39 -03:00
|
|
|
- name: COMMS_SYNAPSE_BASE
|
2026-01-21 04:05:41 -03:00
|
|
|
value: http://othrys-synapse-matrix-synapse.comms.svc.cluster.local:8008
|
2026-01-20 23:03:39 -03:00
|
|
|
- name: COMMS_AUTH_BASE
|
2026-01-21 04:05:41 -03:00
|
|
|
value: http://matrix-authentication-service.comms.svc.cluster.local:8080
|
2026-01-20 23:03:39 -03:00
|
|
|
- name: COMMS_MAS_ADMIN_API_BASE
|
2026-01-21 04:05:41 -03:00
|
|
|
value: http://matrix-authentication-service.comms.svc.cluster.local:8081/api/admin/v1
|
2026-01-20 23:03:39 -03:00
|
|
|
- name: COMMS_MAS_TOKEN_URL
|
2026-01-21 04:05:41 -03:00
|
|
|
value: http://matrix-authentication-service.comms.svc.cluster.local:8080/oauth2/token
|
2026-01-20 23:03:39 -03:00
|
|
|
- name: COMMS_MAS_ADMIN_CLIENT_ID
|
|
|
|
|
value: 01KDXMVQBQ5JNY6SEJPZW6Z8BM
|
|
|
|
|
- name: COMMS_SERVER_NAME
|
|
|
|
|
value: live.bstein.dev
|
|
|
|
|
- name: COMMS_ROOM_ALIAS
|
|
|
|
|
value: "#othrys:live.bstein.dev"
|
|
|
|
|
- name: COMMS_ROOM_NAME
|
|
|
|
|
value: Othrys
|
|
|
|
|
- name: COMMS_PIN_MESSAGE
|
|
|
|
|
value: "Invite guests: share https://live.bstein.dev/#/room/#othrys:live.bstein.dev?action=join and choose 'Continue' -> 'Join as guest'."
|
|
|
|
|
- name: COMMS_SEEDER_USER
|
|
|
|
|
value: othrys-seeder
|
|
|
|
|
- name: COMMS_BOT_USER
|
|
|
|
|
value: atlasbot
|
|
|
|
|
- name: COMMS_SYNAPSE_DB_HOST
|
|
|
|
|
value: postgres-service.postgres.svc.cluster.local
|
|
|
|
|
- name: COMMS_SYNAPSE_DB_PORT
|
|
|
|
|
value: "5432"
|
|
|
|
|
- name: COMMS_SYNAPSE_DB_NAME
|
|
|
|
|
value: synapse
|
|
|
|
|
- name: COMMS_SYNAPSE_DB_USER
|
|
|
|
|
value: synapse
|
|
|
|
|
- name: COMMS_TIMEOUT_SEC
|
|
|
|
|
value: "30"
|
|
|
|
|
- name: COMMS_GUEST_STALE_DAYS
|
|
|
|
|
value: "14"
|
2026-01-19 16:58:02 -03:00
|
|
|
- name: VAULTWARDEN_NAMESPACE
|
|
|
|
|
value: vaultwarden
|
|
|
|
|
- name: VAULTWARDEN_POD_LABEL
|
|
|
|
|
value: app=vaultwarden
|
|
|
|
|
- name: VAULTWARDEN_POD_PORT
|
|
|
|
|
value: "80"
|
|
|
|
|
- name: VAULTWARDEN_SERVICE_HOST
|
|
|
|
|
value: vaultwarden-service.vaultwarden.svc.cluster.local
|
|
|
|
|
- name: VAULTWARDEN_ADMIN_SECRET_NAME
|
|
|
|
|
value: vaultwarden-admin
|
|
|
|
|
- name: VAULTWARDEN_ADMIN_SECRET_KEY
|
|
|
|
|
value: ADMIN_TOKEN
|
|
|
|
|
- name: VAULTWARDEN_ADMIN_SESSION_TTL_SEC
|
|
|
|
|
value: "900"
|
|
|
|
|
- name: VAULTWARDEN_ADMIN_RATE_LIMIT_BACKOFF_SEC
|
|
|
|
|
value: "600"
|
|
|
|
|
- name: VAULTWARDEN_RETRY_COOLDOWN_SEC
|
|
|
|
|
value: "1800"
|
|
|
|
|
- name: VAULTWARDEN_FAILURE_BAILOUT
|
|
|
|
|
value: "2"
|
|
|
|
|
- name: ARIADNE_PROVISION_POLL_INTERVAL_SEC
|
|
|
|
|
value: "5"
|
|
|
|
|
- name: ARIADNE_PROVISION_RETRY_COOLDOWN_SEC
|
|
|
|
|
value: "30"
|
|
|
|
|
- name: ARIADNE_SCHEDULE_TICK_SEC
|
|
|
|
|
value: "5"
|
|
|
|
|
- name: ARIADNE_SCHEDULE_MAILU_SYNC
|
|
|
|
|
value: "30 4 * * *"
|
|
|
|
|
- name: ARIADNE_SCHEDULE_NEXTCLOUD_SYNC
|
2026-03-31 00:06:44 -03:00
|
|
|
value: "*/15 * * * *"
|
2026-01-20 23:03:39 -03:00
|
|
|
- name: ARIADNE_SCHEDULE_NEXTCLOUD_CRON
|
|
|
|
|
value: "*/5 * * * *"
|
|
|
|
|
- name: ARIADNE_SCHEDULE_NEXTCLOUD_MAINTENANCE
|
|
|
|
|
value: "30 4 * * *"
|
2026-01-19 16:58:02 -03:00
|
|
|
- name: ARIADNE_SCHEDULE_VAULTWARDEN_SYNC
|
2026-05-10 04:27:48 -03:00
|
|
|
value: "*/15 * * * *"
|
2026-01-21 02:57:40 -03:00
|
|
|
- name: ARIADNE_SCHEDULE_WGER_USER_SYNC
|
2026-03-31 00:06:44 -03:00
|
|
|
value: "*/15 * * * *"
|
2026-01-19 16:58:02 -03:00
|
|
|
- name: ARIADNE_SCHEDULE_WGER_ADMIN
|
|
|
|
|
value: "15 3 * * *"
|
2026-01-21 02:57:40 -03:00
|
|
|
- name: ARIADNE_SCHEDULE_FIREFLY_USER_SYNC
|
2026-03-31 00:06:44 -03:00
|
|
|
value: "*/15 * * * *"
|
2026-01-20 23:03:39 -03:00
|
|
|
- name: ARIADNE_SCHEDULE_FIREFLY_CRON
|
|
|
|
|
value: "0 3 * * *"
|
|
|
|
|
- name: ARIADNE_SCHEDULE_POD_CLEANER
|
2026-03-31 00:06:44 -03:00
|
|
|
value: "*/30 * * * *"
|
2026-01-20 23:03:39 -03:00
|
|
|
- name: ARIADNE_SCHEDULE_OPENSEARCH_PRUNE
|
|
|
|
|
value: "23 3 * * *"
|
|
|
|
|
- name: ARIADNE_SCHEDULE_IMAGE_SWEEPER
|
2026-03-31 00:06:44 -03:00
|
|
|
value: "0 */4 * * *"
|
2026-01-20 03:01:59 -03:00
|
|
|
- name: ARIADNE_SCHEDULE_VAULT_K8S_AUTH
|
2026-04-05 17:40:40 -03:00
|
|
|
value: "0 0 1 1 *"
|
2026-01-20 03:01:59 -03:00
|
|
|
- name: ARIADNE_SCHEDULE_VAULT_OIDC
|
2026-04-05 17:40:40 -03:00
|
|
|
value: "0 0 1 1 *"
|
2026-01-20 03:01:59 -03:00
|
|
|
- name: ARIADNE_SCHEDULE_COMMS_GUEST_NAME
|
2026-01-21 13:37:36 -03:00
|
|
|
value: "*/5 * * * *"
|
2026-01-20 03:01:59 -03:00
|
|
|
- name: ARIADNE_SCHEDULE_COMMS_PIN_INVITE
|
2026-01-26 20:54:33 -03:00
|
|
|
value: "0 0 1 * *"
|
2026-01-20 03:01:59 -03:00
|
|
|
- name: ARIADNE_SCHEDULE_COMMS_RESET_ROOM
|
|
|
|
|
value: "0 0 1 1 *"
|
|
|
|
|
- name: ARIADNE_SCHEDULE_COMMS_SEED_ROOM
|
|
|
|
|
value: "*/10 * * * *"
|
2026-01-26 03:32:17 -03:00
|
|
|
- name: ARIADNE_SCHEDULE_CLUSTER_STATE
|
2026-03-31 00:06:44 -03:00
|
|
|
value: "*/10 * * * *"
|
2026-01-26 03:32:17 -03:00
|
|
|
- name: ARIADNE_CLUSTER_STATE_KEEP
|
2026-03-31 00:06:44 -03:00
|
|
|
value: "720"
|
2026-01-19 16:58:02 -03:00
|
|
|
- name: WELCOME_EMAIL_ENABLED
|
|
|
|
|
value: "true"
|
|
|
|
|
- name: K8S_API_TIMEOUT_SEC
|
|
|
|
|
value: "5"
|
2026-01-26 03:32:17 -03:00
|
|
|
- name: ARIADNE_VM_URL
|
|
|
|
|
value: http://victoria-metrics-single-server.monitoring.svc.cluster.local:8428
|
|
|
|
|
- name: ARIADNE_CLUSTER_STATE_VM_TIMEOUT_SEC
|
2026-08-02 17:26:58 -03:00
|
|
|
value: "30"
|
2026-03-31 00:06:44 -03:00
|
|
|
- name: ARIADNE_ALERTMANAGER_URL
|
|
|
|
|
value: http://alertmanager.monitoring.svc.cluster.local
|
2026-01-20 23:03:39 -03:00
|
|
|
- name: OPENSEARCH_URL
|
|
|
|
|
value: http://opensearch-master.logging.svc.cluster.local:9200
|
|
|
|
|
- name: OPENSEARCH_LIMIT_BYTES
|
|
|
|
|
value: "1099511627776"
|
|
|
|
|
- name: OPENSEARCH_INDEX_PATTERNS
|
|
|
|
|
value: kube-*,journald-*,trace-analytics-*
|
2026-03-31 14:51:49 -03:00
|
|
|
- name: METIS_BASE_URL
|
|
|
|
|
value: http://metis.maintenance.svc.cluster.local
|
|
|
|
|
- name: METIS_TIMEOUT_SEC
|
|
|
|
|
value: "15"
|
|
|
|
|
- name: ARIADNE_SCHEDULE_METIS_SENTINEL_WATCH
|
|
|
|
|
value: "*/30 * * * *"
|
2026-04-13 00:25:33 -03:00
|
|
|
- name: ARIADNE_SCHEDULE_JENKINS_BUILD_WEATHER
|
|
|
|
|
value: "*/10 * * * *"
|
|
|
|
|
- name: JENKINS_BASE_URL
|
|
|
|
|
value: https://ci.bstein.dev
|
|
|
|
|
- name: JENKINS_API_TIMEOUT_SEC
|
|
|
|
|
value: "10"
|
2026-04-12 04:47:19 -03:00
|
|
|
- name: ARIADNE_SCHEDULE_JENKINS_WORKSPACE_CLEANUP
|
|
|
|
|
value: "45 */6 * * *"
|
2026-05-19 23:30:29 -03:00
|
|
|
- name: ARIADNE_SCHEDULE_TESTING_TRIAGE
|
|
|
|
|
value: "*/15 * * * *"
|
2026-08-05 16:51:48 -03:00
|
|
|
- name: ARIADNE_SCHEDULE_HERMES_AUTOTRIAGE
|
|
|
|
|
value: "* * * * *"
|
|
|
|
|
- name: ARIADNE_HERMES_AUTOTRIAGE_ENABLED
|
|
|
|
|
value: "true"
|
|
|
|
|
- name: ARIADNE_HERMES_AUTOTRIAGE_JOB_ALLOWLIST
|
feat(hermes-triage): enable real-service triage across homegrown Jenkins jobs
Adds ariadne, lesavka, soteria, metis, ananke, pegasus, atlasbot,
bstein-dev-home and data-prepper to the autotriage allowlist. These get
detection, evidence, Hermes diagnosis and human-required escalation only:
no allowlisted repair action applies to them, so nothing is mutated.
Verified on lesavka #582 with the new console failure-region evidence:
classification coverage_quality_gate_failure, confidence 0.93, first
failed gate coverage (previously undetermined).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-05 20:31:40 -03:00
|
|
|
value: hermes-triage-demo,hermes-code-demo,ariadne,lesavka,soteria,metis,ananke,pegasus,atlasbot,bstein-dev-home,data-prepper
|
2026-08-05 16:51:48 -03:00
|
|
|
- name: ARIADNE_HERMES_AUTOREMEDIATION_ENABLED
|
2026-08-05 17:56:42 -03:00
|
|
|
value: "true"
|
2026-08-05 16:51:48 -03:00
|
|
|
- name: ARIADNE_HERMES_ALLOWED_ACTIONS
|
2026-08-06 21:16:17 -03:00
|
|
|
value: repair_demo_fixture,retry_transient_infra,reclaim_workspace_storage,clear_stuck_agent_pods
|
2026-08-05 23:17:17 -03:00
|
|
|
# Each classification maps to exactly one action id. A diagnosis
|
|
|
|
|
# whose classification is absent here can never reach an action,
|
|
|
|
|
# and a diagnosis asking for an action that is not its
|
|
|
|
|
# classification's own is refused before anything runs.
|
|
|
|
|
- name: ARIADNE_HERMES_ACTION_CLASSIFICATIONS
|
2026-08-06 21:16:17 -03:00
|
|
|
value: known_demo_fixture_failure=repair_demo_fixture,transient_infra_failure=retry_transient_infra,workspace_storage_exhausted=reclaim_workspace_storage,jenkins_agent_provisioning_failure=clear_stuck_agent_pods
|
2026-08-06 12:33:19 -03:00
|
|
|
# Adds a service's own namespace to log evidence alongside
|
|
|
|
|
# jenkins, so a build failure that coincides with the service being
|
|
|
|
|
# unhealthy carries some trace of the service. Only mapped jobs are
|
|
|
|
|
# affected; of the triaged services only this one runs in-cluster.
|
|
|
|
|
- name: ARIADNE_HERMES_JOB_NAMESPACES
|
|
|
|
|
value: bstein-dev-home=bstein-dev-home
|
2026-08-05 16:51:48 -03:00
|
|
|
- name: ARIADNE_HERMES_MIN_CONFIDENCE
|
|
|
|
|
value: "0.85"
|
|
|
|
|
- name: ARIADNE_HERMES_MAX_ACTIONS_PER_INCIDENT
|
|
|
|
|
value: "1"
|
|
|
|
|
- name: ARIADNE_HERMES_API_URL
|
|
|
|
|
value: http://hermes.hermes.svc.cluster.local:8642
|
|
|
|
|
- name: ARIADNE_HERMES_RUN_TIMEOUT_SECONDS
|
|
|
|
|
value: "420"
|
2026-08-05 19:19:05 -03:00
|
|
|
- name: ARIADNE_HERMES_CODE_ENABLED
|
|
|
|
|
value: "true"
|
|
|
|
|
- name: ARIADNE_HERMES_CODE_JOB
|
|
|
|
|
value: hermes-code-demo
|
|
|
|
|
- name: ARIADNE_HERMES_CODE_OWNER
|
|
|
|
|
value: bstein
|
|
|
|
|
- name: ARIADNE_HERMES_CODE_REPO
|
|
|
|
|
value: hermes-code-demo
|
|
|
|
|
- name: ARIADNE_HERMES_CODE_BASE_BRANCH
|
|
|
|
|
value: master
|
|
|
|
|
- name: ARIADNE_HERMES_CODE_CANDIDATE_PATH
|
|
|
|
|
value: src/discount.py
|
|
|
|
|
- name: ARIADNE_HERMES_CODE_ALLOWED_PREFIXES
|
|
|
|
|
value: src/
|
|
|
|
|
- name: ARIADNE_HERMES_CODE_ALLOWED_SUFFIXES
|
|
|
|
|
value: .py
|
|
|
|
|
- name: ARIADNE_HERMES_CODE_MAX_PATCH_BYTES
|
|
|
|
|
value: "4000"
|
|
|
|
|
- name: ARIADNE_HERMES_CODE_MAX_CHANGED_LINES
|
|
|
|
|
value: "20"
|
|
|
|
|
- name: ARIADNE_HERMES_GITEA_BASE_URL
|
|
|
|
|
value: https://scm.bstein.dev
|
2026-08-05 21:01:46 -03:00
|
|
|
# File a Gitea issue in the failing service's own repository when
|
|
|
|
|
# triage concludes a human is needed. Opt-in per job: only jobs
|
|
|
|
|
# mapped here can ever receive an issue. Deduplicated by
|
|
|
|
|
# job+classification so a repeatedly failing job produces one
|
|
|
|
|
# issue per kind of failure, not one per build.
|
|
|
|
|
- name: ARIADNE_HERMES_ISSUES_ENABLED
|
|
|
|
|
value: "true"
|
|
|
|
|
- name: ARIADNE_HERMES_ISSUE_REPOS
|
2026-08-14 23:54:35 -03:00
|
|
|
value: metis=atlas/metis,lesavka=bstein/lesavka,soteria=atlas/soteria,bstein-dev-home=bstein/bstein-dev-home,ariadne=atlas/ariadne,ananke=atlas/ananke,pegasus=atlas/pegasus,atlasbot=bstein/atlasbot
|
2026-08-05 21:01:46 -03:00
|
|
|
- name: ARIADNE_HERMES_ISSUE_DEDUPE_SCOPE
|
|
|
|
|
value: classification
|
|
|
|
|
- name: ARIADNE_HERMES_ISSUE_MAX_PER_TICK
|
|
|
|
|
value: "2"
|
2026-08-05 21:30:24 -03:00
|
|
|
# Homegrown repositories that may receive a Hermes patch proposal.
|
|
|
|
|
# Escalated incidents on these jobs get an issue AND, when the
|
|
|
|
|
# evidence implicates source files, a pull request on a
|
|
|
|
|
# hermes-repair/<build> branch. Path allowlists are per repo so a
|
|
|
|
|
# proposal can only ever touch that repo's source tree.
|
2026-08-06 13:10:16 -03:00
|
|
|
# Review capacity, not correctness: proposals are cheap to make
|
|
|
|
|
# and expensive to read. Below this ceiling an open pull request on
|
|
|
|
|
# a repository is no reason to withhold a fix for a different
|
|
|
|
|
# failure; at it, new proposals wait.
|
2026-08-06 20:46:55 -03:00
|
|
|
# What Hermes may be asked to propose a fix for. Deliberately not
|
|
|
|
|
# in ARIADNE_HERMES_ALLOWED_ACTIONS: that list gates what Ariadne
|
|
|
|
|
# executes on its own authority, whereas everything here becomes a
|
|
|
|
|
# pull request a person reads before anything changes.
|
|
|
|
|
- name: ARIADNE_HERMES_FIX_CATEGORIES
|
feat(ariadne): enable the SonarQube sweep, scoped to one project
Static analysis findings never fail a build, so nothing has ever pulled them
into triage. There are 139 open on Ariadne alone, each already naming its
file, line and rule - better-located evidence than the console text the
code-repair flow usually mines.
Scoped deliberately narrow to start: one project, one proposal per hourly
sweep, and only findings SonarQube itself estimates at 20 minutes or less.
Effort is the filter rather than severity because it is the closest proxy for
the single anchored change the patch validator can actually check. The
64-open-proposal ceiling still applies on top, so the queue cannot grow while
nobody is draining it.
Hotspots are not in the type list and cannot be: SonarQube models them as
needing human review, this instance's quality gate fails on exactly that
condition, and an automation that resolved them would be marking them reviewed
without review.
The token comes from Vault. Ariadne's maintenance role was granted read on
kv/data/atlas/quality/sonarqube-oidc, which it did not previously have.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 22:13:03 -03:00
|
|
|
value: sonarqube_issue,lint_violation,undefined_name,failing_assertion
|
2026-08-06 13:10:16 -03:00
|
|
|
- name: ARIADNE_HERMES_CODE_MAX_OPEN_PROPOSALS
|
|
|
|
|
value: "64"
|
feat(ariadne): enable the SonarQube sweep, scoped to one project
Static analysis findings never fail a build, so nothing has ever pulled them
into triage. There are 139 open on Ariadne alone, each already naming its
file, line and rule - better-located evidence than the console text the
code-repair flow usually mines.
Scoped deliberately narrow to start: one project, one proposal per hourly
sweep, and only findings SonarQube itself estimates at 20 minutes or less.
Effort is the filter rather than severity because it is the closest proxy for
the single anchored change the patch validator can actually check. The
64-open-proposal ceiling still applies on top, so the queue cannot grow while
nobody is draining it.
Hotspots are not in the type list and cannot be: SonarQube models them as
needing human review, this instance's quality gate fails on exactly that
condition, and an automation that resolved them would be marking them reviewed
without review.
The token comes from Vault. Ariadne's maintenance role was granted read on
kv/data/atlas/quality/sonarqube-oidc, which it did not previously have.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 22:13:03 -03:00
|
|
|
# The SonarQube sweep: the second way into the proposal flow. Triage
|
|
|
|
|
# enters on a build failure; static analysis never fails anything, so
|
|
|
|
|
# its findings would otherwise sit unread forever. From evidence
|
|
|
|
|
# collection onward the path is identical, gates included.
|
2026-08-06 23:17:02 -03:00
|
|
|
# Printed in every pull request Hermes proposes, so a reviewer can
|
|
|
|
|
# open the run that wrote it rather than taking "Proposed by
|
|
|
|
|
# Hermes" on trust.
|
|
|
|
|
- name: ARIADNE_HERMES_UI_URL
|
2026-08-21 06:43:18 +00:00
|
|
|
value: https://triage.bstein.dev
|
feat(ariadne): enable the SonarQube sweep, scoped to one project
Static analysis findings never fail a build, so nothing has ever pulled them
into triage. There are 139 open on Ariadne alone, each already naming its
file, line and rule - better-located evidence than the console text the
code-repair flow usually mines.
Scoped deliberately narrow to start: one project, one proposal per hourly
sweep, and only findings SonarQube itself estimates at 20 minutes or less.
Effort is the filter rather than severity because it is the closest proxy for
the single anchored change the patch validator can actually check. The
64-open-proposal ceiling still applies on top, so the queue cannot grow while
nobody is draining it.
Hotspots are not in the type list and cannot be: SonarQube models them as
needing human review, this instance's quality gate fails on exactly that
condition, and an automation that resolved them would be marking them reviewed
without review.
The token comes from Vault. Ariadne's maintenance role was granted read on
kv/data/atlas/quality/sonarqube-oidc, which it did not previously have.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 22:13:03 -03:00
|
|
|
- name: ARIADNE_HERMES_SONAR_ENABLED
|
|
|
|
|
value: "true"
|
|
|
|
|
- name: ARIADNE_HERMES_SONAR_URL
|
|
|
|
|
value: http://sonarqube.quality.svc.cluster.local:9000
|
2026-08-07 00:06:29 -03:00
|
|
|
# The browsable console, printed in each proposal so the finding
|
|
|
|
|
# that caused it is one click away.
|
|
|
|
|
- name: ARIADNE_HERMES_SONAR_UI_URL
|
|
|
|
|
value: https://quality.bstein.dev
|
feat(ariadne): enable the SonarQube sweep, scoped to one project
Static analysis findings never fail a build, so nothing has ever pulled them
into triage. There are 139 open on Ariadne alone, each already naming its
file, line and rule - better-located evidence than the console text the
code-repair flow usually mines.
Scoped deliberately narrow to start: one project, one proposal per hourly
sweep, and only findings SonarQube itself estimates at 20 minutes or less.
Effort is the filter rather than severity because it is the closest proxy for
the single anchored change the patch validator can actually check. The
64-open-proposal ceiling still applies on top, so the queue cannot grow while
nobody is draining it.
Hotspots are not in the type list and cannot be: SonarQube models them as
needing human review, this instance's quality gate fails on exactly that
condition, and an automation that resolved them would be marking them reviewed
without review.
The token comes from Vault. Ariadne's maintenance role was granted read on
kv/data/atlas/quality/sonarqube-oidc, which it did not previously have.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 22:13:03 -03:00
|
|
|
# sonar-project=jenkins-job. The job already carries the repository
|
|
|
|
|
# mapping in ARIADNE_HERMES_CODE_REPOS, so there is no second place
|
2026-08-07 00:06:29 -03:00
|
|
|
# for the two to disagree. Only projects whose job also has a write
|
|
|
|
|
# allowlist in ARIADNE_HERMES_CODE_PREFIXES are listed: without one
|
|
|
|
|
# nothing is patchable, so a sweep would spend a SonarQube call to
|
|
|
|
|
# discover it has nowhere to write. That excludes ananke, pegasus,
|
|
|
|
|
# atlasbot, data_prepper and titan_iac for now.
|
feat(ariadne): enable the SonarQube sweep, scoped to one project
Static analysis findings never fail a build, so nothing has ever pulled them
into triage. There are 139 open on Ariadne alone, each already naming its
file, line and rule - better-located evidence than the console text the
code-repair flow usually mines.
Scoped deliberately narrow to start: one project, one proposal per hourly
sweep, and only findings SonarQube itself estimates at 20 minutes or less.
Effort is the filter rather than severity because it is the closest proxy for
the single anchored change the patch validator can actually check. The
64-open-proposal ceiling still applies on top, so the queue cannot grow while
nobody is draining it.
Hotspots are not in the type list and cannot be: SonarQube models them as
needing human review, this instance's quality gate fails on exactly that
condition, and an automation that resolved them would be marking them reviewed
without review.
The token comes from Vault. Ariadne's maintenance role was granted read on
kv/data/atlas/quality/sonarqube-oidc, which it did not previously have.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 22:13:03 -03:00
|
|
|
- name: ARIADNE_HERMES_SONAR_PROJECTS
|
2026-08-07 04:45:15 -03:00
|
|
|
value: ariadne=ariadne,metis=metis,soteria=soteria,bstein_home=bstein-dev-home,ananke=ananke,pegasus=pegasus,atlasbot=atlasbot
|
feat(ariadne): enable the SonarQube sweep, scoped to one project
Static analysis findings never fail a build, so nothing has ever pulled them
into triage. There are 139 open on Ariadne alone, each already naming its
file, line and rule - better-located evidence than the console text the
code-repair flow usually mines.
Scoped deliberately narrow to start: one project, one proposal per hourly
sweep, and only findings SonarQube itself estimates at 20 minutes or less.
Effort is the filter rather than severity because it is the closest proxy for
the single anchored change the patch validator can actually check. The
64-open-proposal ceiling still applies on top, so the queue cannot grow while
nobody is draining it.
Hotspots are not in the type list and cannot be: SonarQube models them as
needing human review, this instance's quality gate fails on exactly that
condition, and an automation that resolved them would be marking them reviewed
without review.
The token comes from Vault. Ariadne's maintenance role was granted read on
kv/data/atlas/quality/sonarqube-oidc, which it did not previously have.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 22:13:03 -03:00
|
|
|
# Hotspots are absent by construction - they need human review, not a
|
|
|
|
|
# patch - so only findings with a code fix are ever requested.
|
|
|
|
|
- name: ARIADNE_HERMES_SONAR_TYPES
|
|
|
|
|
value: CODE_SMELL,BUG
|
2026-08-07 04:45:15 -03:00
|
|
|
# One per project per hourly sweep across seven projects. Rule-level
|
|
|
|
|
# dedupe means a project stops producing proposals once every rule
|
|
|
|
|
# it has is already under review, so this is a ceiling rather than a
|
|
|
|
|
# rate: the backlog cannot turn into a pull request queue nobody
|
|
|
|
|
# drains. The 64-open-proposal ceiling still applies on top.
|
2026-08-07 05:00:25 -03:00
|
|
|
# Findings with no possible patch become an issue carrying the fix
|
|
|
|
|
# Hermes would make. Most of the backlog is refactors too diffuse
|
|
|
|
|
# for an anchored patch, so without this the majority of what
|
|
|
|
|
# SonarQube knows never reaches a maintainer at all. Deduped on the
|
|
|
|
|
# rule, exactly like the pull requests.
|
|
|
|
|
- name: ARIADNE_HERMES_SONAR_ADVICE_ENABLED
|
|
|
|
|
value: "true"
|
feat(ariadne): enable the SonarQube sweep, scoped to one project
Static analysis findings never fail a build, so nothing has ever pulled them
into triage. There are 139 open on Ariadne alone, each already naming its
file, line and rule - better-located evidence than the console text the
code-repair flow usually mines.
Scoped deliberately narrow to start: one project, one proposal per hourly
sweep, and only findings SonarQube itself estimates at 20 minutes or less.
Effort is the filter rather than severity because it is the closest proxy for
the single anchored change the patch validator can actually check. The
64-open-proposal ceiling still applies on top, so the queue cannot grow while
nobody is draining it.
Hotspots are not in the type list and cannot be: SonarQube models them as
needing human review, this instance's quality gate fails on exactly that
condition, and an automation that resolved them would be marking them reviewed
without review.
The token comes from Vault. Ariadne's maintenance role was granted read on
kv/data/atlas/quality/sonarqube-oidc, which it did not previously have.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 22:13:03 -03:00
|
|
|
- name: ARIADNE_HERMES_SONAR_MAX_PER_SWEEP
|
2026-08-07 04:45:15 -03:00
|
|
|
value: "7"
|
feat(ariadne): enable the SonarQube sweep, scoped to one project
Static analysis findings never fail a build, so nothing has ever pulled them
into triage. There are 139 open on Ariadne alone, each already naming its
file, line and rule - better-located evidence than the console text the
code-repair flow usually mines.
Scoped deliberately narrow to start: one project, one proposal per hourly
sweep, and only findings SonarQube itself estimates at 20 minutes or less.
Effort is the filter rather than severity because it is the closest proxy for
the single anchored change the patch validator can actually check. The
64-open-proposal ceiling still applies on top, so the queue cannot grow while
nobody is draining it.
Hotspots are not in the type list and cannot be: SonarQube models them as
needing human review, this instance's quality gate fails on exactly that
condition, and an automation that resolved them would be marking them reviewed
without review.
The token comes from Vault. Ariadne's maintenance role was granted read on
kv/data/atlas/quality/sonarqube-oidc, which it did not previously have.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 22:13:03 -03:00
|
|
|
# SonarQube's own effort estimate is the filter, not severity: it is
|
|
|
|
|
# the closest proxy for the single anchored change the patch
|
|
|
|
|
# validator can check. Anything it calls longer than this is a
|
|
|
|
|
# refactor for a person.
|
|
|
|
|
- name: ARIADNE_HERMES_SONAR_MAX_EFFORT_MINUTES
|
|
|
|
|
value: "20"
|
2026-08-05 21:30:24 -03:00
|
|
|
- name: ARIADNE_HERMES_CODE_REPOS
|
2026-08-14 23:54:35 -03:00
|
|
|
value: metis=atlas/metis,lesavka=bstein/lesavka,soteria=atlas/soteria,bstein-dev-home=bstein/bstein-dev-home,ariadne=atlas/ariadne,ananke=atlas/ananke,pegasus=atlas/pegasus,atlasbot=bstein/atlasbot
|
2026-08-05 21:30:24 -03:00
|
|
|
- name: ARIADNE_HERMES_CODE_BASE_BRANCHES
|
2026-08-06 13:10:16 -03:00
|
|
|
value: metis=master,lesavka=master,soteria=main,bstein-dev-home=master,ariadne=master,ananke=main,pegasus=main,atlasbot=main
|
2026-08-05 21:30:24 -03:00
|
|
|
- name: ARIADNE_HERMES_CODE_PREFIXES
|
2026-08-07 04:45:15 -03:00
|
|
|
value: metis=cmd/|pkg/,lesavka=server/|client/|common/,soteria=cmd/|internal/,bstein-dev-home=backend/|frontend/,ariadne=ariadne/,ananke=cmd/|internal/,pegasus=backend/|frontend/,atlasbot=atlasbot/
|
2026-08-05 21:30:24 -03:00
|
|
|
- name: ARIADNE_HERMES_CODE_SUFFIXES
|
2026-08-07 04:45:15 -03:00
|
|
|
value: metis=.go,lesavka=.rs,soteria=.go,bstein-dev-home=.py|.ts|.tsx|.js,ariadne=.py,ananke=.go,pegasus=.go|.ts|.tsx|.js,atlasbot=.py
|
2026-05-20 03:14:50 -03:00
|
|
|
- name: ARIADNE_TESTING_TRIAGE_MODEL_URL
|
2026-08-01 22:38:07 -03:00
|
|
|
value: http://hermes-model-gate.hermes.svc.cluster.local:11434
|
2026-05-20 03:14:50 -03:00
|
|
|
- name: ARIADNE_TESTING_TRIAGE_MODEL
|
2026-08-11 05:20:18 -03:00
|
|
|
value: qwen2.5:14b-instruct-q4_0
|
2026-05-20 03:14:50 -03:00
|
|
|
- name: ARIADNE_TESTING_TRIAGE_MODEL_TIMEOUT_SEC
|
2026-08-01 22:38:07 -03:00
|
|
|
value: "900"
|
2026-04-12 04:47:19 -03:00
|
|
|
- name: JENKINS_WORKSPACE_NAMESPACE
|
|
|
|
|
value: jenkins
|
|
|
|
|
- name: JENKINS_WORKSPACE_PVC_PREFIX
|
|
|
|
|
value: pvc-workspace-
|
|
|
|
|
- name: JENKINS_WORKSPACE_CLEANUP_MIN_AGE_HOURS
|
2026-04-12 12:32:20 -03:00
|
|
|
value: "24"
|
|
|
|
|
- name: JENKINS_WORKSPACE_CLEANUP_DRY_RUN
|
2026-04-12 14:29:01 -03:00
|
|
|
value: "false"
|
2026-04-12 12:32:20 -03:00
|
|
|
- name: JENKINS_WORKSPACE_CLEANUP_MAX_DELETIONS_PER_RUN
|
|
|
|
|
value: "20"
|
2026-01-19 16:58:02 -03:00
|
|
|
- name: METRICS_PATH
|
|
|
|
|
value: "/metrics"
|
|
|
|
|
resources:
|
|
|
|
|
requests:
|
|
|
|
|
cpu: 100m
|
|
|
|
|
memory: 128Mi
|
|
|
|
|
limits:
|
|
|
|
|
cpu: 500m
|
|
|
|
|
memory: 512Mi
|
2026-08-06 05:20:14 -03:00
|
|
|
# timeoutSeconds defaults to 1, which this pod cannot honour. The
|
|
|
|
|
# auto-triage tick runs every minute and spends most of it waiting on
|
|
|
|
|
# Jenkins, OpenSearch, Gitea and Hermes; against a 500m CPU limit the
|
|
|
|
|
# event loop occasionally takes longer than a second to answer
|
|
|
|
|
# /health. Three of those in a row and the kubelet kills a container
|
|
|
|
|
# that is working perfectly well. Observed 11 times in 139 minutes,
|
|
|
|
|
# each one dropping triage ticks for the length of a restart.
|
2026-08-06 06:15:46 -03:00
|
|
|
# Startup is the other way this pod gets killed while healthy. It
|
|
|
|
|
# runs migrations and builds its schedule before it listens, which
|
|
|
|
|
# can take longer than liveness allows from initialDelaySeconds
|
|
|
|
|
# alone, and the kubelet then reports "connection refused" and
|
|
|
|
|
# restarts a pod that was simply still booting. A startupProbe gives
|
|
|
|
|
# boot up to five minutes and only then hands over to liveness.
|
|
|
|
|
startupProbe:
|
|
|
|
|
httpGet:
|
|
|
|
|
path: /health
|
|
|
|
|
port: http
|
|
|
|
|
periodSeconds: 10
|
|
|
|
|
timeoutSeconds: 5
|
|
|
|
|
failureThreshold: 30
|
2026-01-19 16:58:02 -03:00
|
|
|
livenessProbe:
|
|
|
|
|
httpGet:
|
|
|
|
|
path: /health
|
|
|
|
|
port: http
|
|
|
|
|
initialDelaySeconds: 10
|
|
|
|
|
periodSeconds: 10
|
2026-08-06 05:20:14 -03:00
|
|
|
timeoutSeconds: 5
|
|
|
|
|
failureThreshold: 5
|
2026-01-19 16:58:02 -03:00
|
|
|
readinessProbe:
|
|
|
|
|
httpGet:
|
|
|
|
|
path: /health
|
|
|
|
|
port: http
|
|
|
|
|
initialDelaySeconds: 5
|
|
|
|
|
periodSeconds: 10
|
2026-08-06 05:20:14 -03:00
|
|
|
timeoutSeconds: 5
|
|
|
|
|
failureThreshold: 3
|