WIP: Rename the owner agent host to worker.bstein.dev (merge last) #41
Closed
hermes-automation
wants to merge 2 commits from
feature/hermes-domain-rename-agent-worker-bstein into main
pull from: feature/hermes-domain-rename-agent-worker-bstein
merge into: titan:main
titan:main
titan:feature/hermes-agent-build-mirrors
titan:feature/hermes-agent-multiarch
titan:feature/hermes-next-hux
titan:feature/hermes-hux-contracts
titan:feature/t_39cf1905-webui-build-token
titan:feature/t_26da4c88-titan-capacity-guardrails-v4
titan:feature/t_26da4c88-titan-capacity-guardrails-v3
titan:feature/t_26da4c88-titan-capacity-guardrails-v2
titan:feature/t_26da4c88-titan-capacity-guardrails
titan:fix/t_39cf1905-jenkins-controller-priority
titan:feature/t_8cbe6a55-hermes-webui-release-v2
titan:feature/t_8cbe6a55-hermes-webui-release
titan:feature/hermes-domain-rename-agent-worker-v2
titan:hermes/t_65356568-multiuser-capacity-assessment
titan:fix/cli-auto-failover-effort
titan:feature/hermes-pr44-after-pr43
titan:fix/hermes-heartbeat-dead-reclaim-replacement
titan:handoff/t_1a2c627b
titan:feature/hermes-combined-multilingual-voice-v2
titan:fix/hermes-handsfree-stt-webm
titan:fix/hermes-restore-legacy-chat-triage-hosts-v2
titan:fix/hermes-restore-legacy-chat-triage-hosts-v3
titan:hermes/tts-voice-multilingual-prerequisite
titan:fix/hermes-restore-legacy-chat-triage-hosts
titan:fix/hermes-oidc-ensure-rerun-hostname-rollout
titan:feature/hermes-direct-cli-lane-concurrency-2-replacement
titan:feature/hermes-domain-rename-chat-bstein-triage
titan:feature/hermes-kanban-profile-concurrency-2
titan:feature/hermes-zombie-lane-heartbeat-reclaim
titan:hermes/repair-pr26-voice-split
titan:feature/hermes-durable-two-worker-cli-concurrency
titan:hermes/chat-voice-conversation-instrument
titan:feature/hermes-domain-rename-chat-triage
titan:hermes/voice-stt-tts-language-routing
titan:hermes/voice-stt-language-routing
titan:hermes/tts-voice-multilingual
titan:fix/hermes-chat-session-continuity-contract
titan:hermes/tts-voice-hfc-female
titan:hermes/fix-grafana-no-data-vm-storage
titan:feature/ci-gitops
titan:fix/jenkins-quality-gate-discovery
titan:feature/hermes-inpod-supervisor
titan:feature/hermes-chat-smoothness
titan:wt/t_1e95ea6d
titan:feature/hermes-full-handoff-acceptance
titan:feature/hermes-distributed-worker-pool
titan:feature/hermes-review-goal-semantics
titan:feature/hermes-cli-auto-quota-routing
titan:fix/hermes-result-decomposition-reliability
titan:feature/hermes-safe-gitea-pr-client
titan:feature/hermes-unprivileged-image-builder
titan:feature/hermes-cli-process-reaping
titan:feature/hermes-three-lane-placement
titan:wt/t_cca008de
titan:codex/cassandra-generator-08105
titan:cassandra-0851-rollout
titan:cassandra-0821-deploy
titan:codex/testing-dashboard-health-20260604
titan:feature/ariadne
titan:feature/pi-usb-scratch-rollout
titan:feature/sso-hardening
titan:codex/titan-iac-work-quality-gate
titan:codex/titan-iac-main-platform-metrics
titan:codex/titan-iac-platform-metrics
titan:feature/atlas-jobs-schedule-observability
titan:lane2/jenkins-cleanup-activate
titan:lane2/jenkins-cleanup-wiring-split
titan:codex-ananke-fixes
titan:feature/atlasbot-ananke-recovery
titan:feature/atlasbot
titan:deploy
titan:feature/vault-consumption
titan:feature/postgres-migration
titan:feature/bstein-dev-home
titan:feature/mailu
titan:feature/sso
titan:feature/atlas-monitoring
titan:restructure/hybrid-clusters
titan:fea/titan24-gpu
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
No description provided.
Delete Branch "feature/hermes-domain-rename-agent-worker-bstein"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Renames the owner-only Hermes coordinator host from
agent.hermes.bstein.devtoworker.bstein.dev.Read the rollout section before merging. This hostname is the coordinator's own
public access point, so the rollout — not the repo edit — changes how you reach the
running coordinator. Merge this LAST, after the chat/triage rename (#34) has rolled
out cleanly. See "Blocker found in #34" below: it has not.
Deliberate design: the old host is not retired here
agent.hermes.bstein.devkeeps working through the transition. It stays in theCoreDNS hosts entry, in BOTH agent Ingress rules, and on the
hermes-sites-tlscertificate SAN list. Retiring it is a separate, separately scheduled change.
No redirect middleware is added. A redirect from the old host to the new one could
be proposed later; it is deliberately not implemented here, so nothing silently
changes where a request lands.
The one thing that does move is where a fresh login happens. The oauth2-proxy
session and CSRF cookies use the
__Host-prefix, which binds them to exactly oneorigin, so
--redirect-urlcan only name one host. It now namesworker.bstein.dev.Consequence, stated plainly:
agent.hermes.bstein.devkeep working.validation, because the CSRF cookie was set on the old origin. Start fresh logins
on
worker.bstein.dev.--redirect-urlinagent-deployment.yaml. It doesNOT require re-running the Keycloak job, because both callback URLs stay
registered (see below).
Re-login required
oauth2-proxy cookies are host-bound (
__Host-hermes_agent). Existing coordinatorsessions and cookies do NOT carry over to the new origin. Expect to log in again on
worker.bstein.devafter rollout, including any in-flight coordinator session.Keycloak
services/keycloak/scripts/hermes_access_oidc_ensure.shmust run for the newredirect URI. Login on
worker.bstein.devfails until it completes.The ensure Job is bumped
hermes-access-oidc-client-ensure-10->-11in this PR,so Flux re-runs it automatically on reconcile. No manual step is required.
ensure_proxy_clientnow accepts optional trailing legacy URLs. The agent client isensured with
https://worker.bstein.devas canonical plushttps://agent.hermes.bstein.devas legacy, soredirectUris,webOriginsand thepost-logout origins cover both hosts while
rootUrltracks the canonical one.Called with a single URL the function emits a byte-identical payload to before, so
the chat and triage clients are unaffected by the signature change (verified).
Ordered rollout
infrastructure/core,services/hermes,services/keycloak,services/quality,services/comms.worker.bstein.dev.hermes-sites-tls; wait for Ready with theworker.bstein.devSAN present.-11ensure Job runs and updates the Keycloakhermes-agent-proxyclient.https://worker.bstein.dev(re-login required, see above).agent.hermes.bstein.dev, as a SEPARATE scheduledchange. Do not retire it in this one.
Steps 3-5 are independent of each other but ALL must complete before step 6 succeeds.
If step 6 fails, the old host is still serving existing sessions and the one-line
rollback above applies.
Post-merge verification checklist
Each step marks whether this agent can run it. "Agent-executable" means the access
was demonstrated in this environment while preparing this PR, not assumed.
getent hosts worker.bstein.dev192.168.22.9 worker.bstein.devgetent hosts agent.hermes.bstein.dev192.168.22.9 ...curl -sS -o /dev/null -w '%{http_code}' https://worker.bstein.dev/ping200curl -sS -o /dev/null -w '%{http_code}' https://agent.hermes.bstein.dev/ping200echo | openssl s_client -connect 192.168.22.9:443 -servername worker.bstein.dev 2>/dev/null | openssl x509 -noout -ext subjectAltNameworker.bstein.devANDagent.hermes.bstein.devhermes-agent-proxywith redirect urihttps://worker.bstein.dev/oauth2/callback302(not400 Invalid parameter: redirect_uri)302kubectl -n hermes get certificate hermes-sites-tlsREADY=Truekubectl -n hermes get ingress hermes-agent-dashboard hermes-agent-terminalkubectl -n sso get job hermes-access-oidc-client-ensure-11COMPLETIONS=1/1flux get kustomizationshttps://worker.bstein.devSteps 8-11 are operator-required because this agent's Kubernetes identity
(
system:serviceaccount:hermes:hermes-agent) is observer-only. Every one ofget ingress -n hermes,get certificate -n hermes,get job -n sso,get configmap coredns-custom -n kube-systemandget kustomization -n flux-systemreturned
Forbiddenwhen tested for this PR. Do not expect the agent to confirmthem.
Blocker found in #34: chat and triage logins are currently broken
While proving check 6 above, the same probe run against the already-merged chat and
triage clients shows they were never updated:
hermes-chat-proxychat.hermes.bstein.dev->302chat.bstein.dev->400 Invalid parameter: redirect_urihermes-triage-proxytriage.hermes.bstein.dev->302triage.bstein.dev->400 Invalid parameter: redirect_uriPR #34 changed the oauth2-proxy
--redirect-urlfor both services and the Keycloakensure script, but did NOT bump the ensure Job name, so the Job never re-ran.
DNS, ingress and TLS all rolled out, so both hosts serve
/ping200 — but Keycloakstill rejects the callback URL oauth2-proxy now sends. Logging in at
chat.bstein.devandtriage.bstein.devshould be failing right now.The
-11Job bump in this PR re-runsensure_proxy_clientfor all three clients, somerging this repairs chat and triage as a side effect. That inverts the usual advice:
if chat/triage login is confirmed broken, this PR is the fix and should not wait.
Your call — verify with check 6's probe against the chat client first.
Scope and collisions
Does not touch
chat.hermes.bstein.devortriage.hermes.bstein.dev; a concurrenttask owns those and its work is already merged as #34.
Collision check before editing:
worker.bstein.devwas unused. Not present anywherein the repo (
git grep), absent from the knowledge catalogs and every ingress, andgetent hosts worker.bstein.devreturned NXDOMAIN.Two commits, deliberately split:
chore(knowledge): regenerate stale Atlas catalogs— puremake knowledgerunagainst unmodified main. The committed catalogs had drifted from the manifests
(missing
hermes-scm-broker,hermes-scm-broker-code,hermes-scm-namespace,hermes-observer-rbac,hermes-observer-bindings,vault-hermes-jenkins-token-seed, and the Atlas AI Operations panels). Isolatedso the rename reviews as a rename: without this split ~1700 unrelated lines would
sit in the same diff.
refactor(hermes): rename the owner agent host to worker.bstein.dev— the rename.Intentionally left on the old hostname
mermaid/ServiceAccessArchitecture.mmdand.svgstill sayagent.hermes.bstein.dev. These two files cannot be pushed through the SCM broker.Its content scanner has a forge-token rule matching a
gitea-style prefix followedby a 20-plus character identifier suffix, and one pre-existing mermaid node id in
these diagrams (the Cassandra OIDC access node) matches it. The scanner rejects the
entire push with an opaque HTTP 400. That id is already on main, so any PR touching
these two files hits the same wall regardless of what it changes. Fixing it is a
scanner-tuning or diagram-regeneration concern, not a rename concern, so it is left
for a follow-up rather than worked around by renaming a diagram node in this PR.
Diagnosed by replaying the broker's own scan over the outgoing objects locally.
testing/tests/data/hermes_kanban_card_corpus.jsonlstill contains the old host ina stored card body. That file is documented in
testing/tests/test_hermes_cli_review_corpus.pyas "a verbatim snapshot of everycard on the board". Rewriting a historical record to match a later rename would
falsify it.
Validation
kustomize buildclean for every touched service:services/hermes,services/keycloak,services/quality,services/comms,infrastructure/core.certificate lists 4 SANs, the ensure Job renders as
-11.make test(full quality gate): 2621 passed, 4 failed, 4 skipped. All 4failures reproduce identically on unmodified
origin/main(e3de466a) and areunrelated to this change: two node-capacity assertions in
test_hermes_agent_layout.py, onetest_hermes_gitea_pr_integration.pytest thatreaches the live network instead of its monkeypatch, and
test_hermes_kanban_supervisor.py::test_auto_supervise_flag_defaults_false_in_configmap.No new failures.
sh -nclean on the Keycloak ensure script;ruffclean on the touched Python.intended arrays, and the single-origin path is byte-identical to the previous
output, so chat and triage are unchanged.
API_SERVER_CORS_ORIGINScomma-splitting confirmed against the running Hermesbuild (
_parse_cors_originssplits on,), so the paired value is valid.new test pins the transition contract — CoreDNS, both Ingresses and the certificate
must carry BOTH hosts. Retiring the old host will deliberately fail that test until
the retirement change updates it.
Pull request closed