6161 Commits

Author SHA1 Message Date
flux-bot
05f84f43ed chore(bstein-dev-home): automated image update 2026-08-27 09:48:09 +00:00
flux-bot
c038a10857 chore(maintenance): automated image update
Some checks failed
Tests / Declarative: Post Actions failed: 48, skipped: 81, passed: 3766
2026-08-27 01:52:12 +00:00
flux-bot
066b125c94 chore(maintenance): automated image update 2026-08-27 01:51:12 +00:00
flux-bot
da56cfbf71 chore(maintenance): automated image update 2026-08-27 01:47:11 +00:00
flux-bot
3b4ceddd8f chore(maintenance): automated image update 2026-08-27 01:42:10 +00:00
flux-bot
5a0e2089b6 chore(bstein-dev-home): automated image update 2026-08-26 21:50:41 +00:00
flux-bot
1a65c315fc chore(bstein-dev-home): automated image update 2026-08-26 21:47:42 +00:00
flux-bot
7477c304e2 chore(maintenance): automated image update
Some checks failed
Tests / Declarative: Post Actions failed: 48, skipped: 81, passed: 3766
2026-08-26 13:34:32 +00:00
flux-bot
88ad08f668 chore(maintenance): automated image update 2026-08-26 13:34:24 +00:00
flux-bot
9afe4eb6c6 chore(maintenance): automated image update 2026-08-26 13:32:28 +00:00
flux-bot
156b0440bf chore(maintenance): automated image update 2026-08-26 13:31:23 +00:00
flux-bot
371bd8087a chore(bstein-dev-home): automated image update 2026-08-26 09:51:49 +00:00
flux-bot
c61be05153 chore(bstein-dev-home): automated image update 2026-08-26 09:49:51 +00:00
flux-bot
2f07e89151 chore(maintenance): automated image update
Some checks failed
Tests / Declarative: Post Actions failed: 48, skipped: 81, passed: 3766
2026-08-26 01:35:04 +00:00
flux-bot
3c6b2bd381 chore(maintenance): automated image update 2026-08-26 01:34:56 +00:00
flux-bot
54e7caf4f0 chore(maintenance): automated image update 2026-08-26 01:32:58 +00:00
flux-bot
3ac9b9a570 chore(maintenance): automated image update 2026-08-26 01:31:55 +00:00
jenkins
391a7f2f1f hermes(agent): make titan-22 the strong primary home
Now that both the agent image (a68d1c4d, via the kustomize images: override)
and the hux sidecar (build-39) are multi-arch with amd64 leaves, move the worker
onto the amd64 accelerator titan-22:
- Add an OR'd nodeSelectorTerm for amd64 + node-role.kubernetes.io/accelerator +
  hostname titan-22, with NO worker=true requirement. Keep the arm64 pi-fleet
  term as an OR'd fallback so the worker is never stranded.
- Strong primary preference: hostname=titan-22 at weight 100 (scheduler max),
  pi-fleet rpi5 nudge lowered to 50, so hermes actually lives on titan-22.
- Tolerate node-role.kubernetes.io/accelerator=true:NoSchedule (harmless where
  absent) and the soft atlas.bstein.dev/media-primary:PreferNoSchedule that
  titan-22 currently carries, so the weight-100 preference is not offset and
  placement is deterministic.

Completes the titan-22 effort the flip branches missed; the earlier branches
never repointed to multi-arch images, which is why the worker never landed here.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BvMSXH8VH2tMWXanb8SJdf
2026-08-25 20:17:28 -03:00
jenkins
975399cbe0 test(monitoring): guard Claude renewal delivery path 2026-08-25 20:06:09 -03:00
flux-bot
6c35930f0b chore(hermes): promote validated image release 2026-08-25 23:05:30 +00:00
jenkins
0ad2ffefce monitoring: prefer worker nodes for Alertmanager 2026-08-25 20:00:05 -03:00
jenkins
1f636489f7 monitoring: keep Alertmanager on available rpi5 workers 2026-08-25 19:52:55 -03:00
jenkins
8d3a1193b6 monitoring: move Alertmanager recovery to available worker 2026-08-25 19:38:48 -03:00
jenkins
2c91aea01d fix(hermes-webui): verify OCI revision label on multi-arch index children
The webui release handoff verified org.opencontainers.image.revision on the
Harbor artifact's own extra_attrs.config.Labels. That works for a single-arch
image, but a multi-arch manifest list has no top-level config, so Harbor reports
the label on each per-arch child. build-38 built + published the index fine, then
failed post-publish with 'Harbor artifact omitted OCI image labels'.

verify_registry_digest now checks the top-level config labels when present
(single-arch, unchanged) and otherwise walks the index references, fetching each
child artifact by digest and asserting its revision label. Mirrors how the agent
image lane already tolerates a multi-arch index, without dropping the supply-chain
label check. Adds multi-arch pass/reject tests.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BvMSXH8VH2tMWXanb8SJdf
2026-08-25 19:37:27 -03:00
jenkins
35f650ef41 monitoring: recover Alertmanager placement drift 2026-08-25 19:34:42 -03:00
jenkins
db446c9244 monitoring(ai): alert before Claude quota auth expires 2026-08-25 19:16:01 -03:00
flux-bot
2a11c8d207 chore(bstein-dev-home): automated image update 2026-08-25 22:07:28 +00:00
flux-bot
c30a7c2d2b chore(bstein-dev-home): automated image update 2026-08-25 22:06:28 +00:00
jenkins
4908e1ea37 test(hermes): track agent base repoint to in-cluster multi-arch mirror
test_gateway_image_honors_ui_model_and_caps_reasoning still pinned the old
arm64-only docker.io base (nousresearch/hermes-agent@sha256:47d4bd4c...). The
agent image moved to the multi-arch mirror base
(harbor-core.harbor.svc.cluster.local/mirror/hermes-agent@sha256:9c841866...)
in 8a710845 for the two-leg build; the test wasn't updated, so it was a latent
red only the webui/quality lane runs. Point the assertion at the current base.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BvMSXH8VH2tMWXanb8SJdf
2026-08-25 19:04:58 -03:00
jenkins
342677dde7 monitoring(ai): preserve quota data across rollouts 2026-08-25 18:33:18 -03:00
jenkins
6f783b7778 build(hermes-webui): multi-arch image (arm64 + amd64)
Repoints both Dockerfile.hermes-webui FROM bases to in-cluster Harbor mirrors
(webui base OCI index + the a68d1c4d multi-arch hermes-agent manifest list),
adds the suspended webui base-mirror Job, and gives the WebUI image build an
amd64 leg on titan-24 plus a manifest-list combine — so the hux sidecar can
schedule onto the amd64 accelerator node titan-22.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BvMSXH8VH2tMWXanb8SJdf
2026-08-25 18:31:00 -03:00
jenkins
e7d6759140 fix(hermes-agent): reinstall codex when this arch's native dep is missing
The arch-specific CLI stamp assumed the shared node_modules keeps both arches'
codex native deps, but a sibling-arch npm install removes this arch's binary from
the shared volume. So after running on the other arch, the stamp exists yet the
native codex dep is gone -> configure-agent-clients fails -> churn. Gate the
install on the current arch's native codex package being present, so it self-heals.
2026-08-25 18:23:13 -03:00
jenkins
9c516b9808 build(hermes-webui): multi-arch image (arm64 + amd64)
Make registry.bstein.dev/bstein/hermes-webui a linux/amd64 + linux/arm64
manifest list so the agent pod's `hux` sidecar (which runs the webui image)
can schedule onto the amd64 node titan-22. Reuses the hermes-agent multi-arch
pattern already on main.

- Dockerfile.hermes-webui: repoint both FROMs to multi-arch, internal sources.
  The upstream WebUI base (ghcr sha256:a83a3893..., already a multi-arch OCI
  index) is now pulled from the in-cluster Harbor mirror; the agent base moves
  from the retired arm64-only leaf (81970563) to the multi-arch agent index
  (a68d1c4d). Kaniko selects the matching arch leaf per build node.
- services/harbor/hermes-webui-base-mirror-job.yaml: new suspended, operator-run
  skopeo `copy --all` Job mirroring the upstream WebUI base index into Harbor's
  `mirror` project (modeled on hermes-agent-base-mirror-job.yaml; reuses the
  generic ensure-project helper). Wired into the harbor kustomization.
- Jenkinsfile.hermes-webui-image: arm64 leg (titan-20) + amd64 leg (titan-24,
  hostname+arch pin, toleration Exists, resource-capped, own checkout scm) +
  Combine multi-arch index stage; per-arch evidence archived alongside the index.
- hermes_multiarch_combine.py: generalize the destination pattern/component to
  serve both hermes-agent and hermes-webui (fail-closed to just those two).
- Tests updated to the two-arch topology (two legs, combine, both FROM bases,
  the mirror Job, twelve archived evidence files).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BvMSXH8VH2tMWXanb8SJdf
2026-08-25 18:17:35 -03:00
jenkins
70002aeff7 Revert "Reapply "hermes(agent): make titan-22 the strong primary home (no worker label)""
This reverts commit 9e4fbf4e0df364230588749f80710a8369a3108f.
2026-08-25 17:49:44 -03:00
jenkins
a01eac5059 Revert "Reapply "hermes(agent): also tolerate titan-22's media-primary taint (flip applied pre-classification)""
This reverts commit 2e38422478b0d569441176431f104faae0dd1703.
2026-08-25 17:49:44 -03:00
jenkins
2e38422478 Reapply "hermes(agent): also tolerate titan-22's media-primary taint (flip applied pre-classification)"
Some checks failed
Tests / Declarative: Post Actions failed: 49, skipped: 81, passed: 3753
This reverts commit 1c495a6e2c0a525b9e16608b16bc09c645e3c337.
2026-08-25 17:40:36 -03:00
jenkins
9e4fbf4e0d Reapply "hermes(agent): make titan-22 the strong primary home (no worker label)"
This reverts commit f8628e6ee0d2c33d287ec9086ff5328d982e88c3.
2026-08-25 17:40:36 -03:00
jenkins
fe40f68d5e merge: arch-aware agent runtime tooling install (feature/agent-tooling-multiarch) 2026-08-25 17:39:28 -03:00
jenkins
12a6d2c4f5 hermes(agent): make runtime tooling install architecture-aware
The hermes-agent installs its CLI toolchain at runtime into the shared
/opt/data/tools Longhorn volume, but every download hardcoded arm64. On
the amd64 node titan-22 that left configure-agent-clients failing with
"Missing optional dependency @openai/codex-linux-x64" and the operator
toolchain fetching arm64 binaries, so the pod churned.

Detect the running node's arch (uname -m; fail closed on anything but
aarch64/x86_64) and resolve every asset per-arch:

- install-agent-tools init script (agent-deployment.yaml): ttyd and
  kubectl download the arch-correct asset with the arch-correct sha256
  (real ttyd 1.7.7 x86_64 and kubectl v1.33.3 amd64 checksums added; the
  arm64 ones kept). The npm CLI stamp is now arch-specific
  (.cli-versions-<vers>-${arch}) so a fresh arch re-runs npm install and
  pulls its own native optional deps; npm keeps both arches' packages.

- install_agent_tools.sh: flux/helm/kustomize/jq/yq/gh/vault/sops/age/
  k9s/terraform/go URLs, tarball subdirs (helm linux-${arch}, gh dir),
  and checksums are all arch-resolved with both arches pinned. Stamps
  and the Go tree are arch-specific, and an active-arch marker forces a
  republish of the single-arch ${bin} binaries when the pod moves
  between arches on the shared volume. Single fetch/verify helper kept.

Tests updated to assert the arch-aware form (both arches' Go checksums,
${dl_arch} templating) instead of the arm64-only literal.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BvMSXH8VH2tMWXanb8SJdf
2026-08-25 17:37:57 -03:00
jenkins
f8628e6ee0 Revert "hermes(agent): make titan-22 the strong primary home (no worker label)"
This reverts commit 2de52ec3e2e42696ae411482cb16f27ff1f5d273.
2026-08-25 16:54:04 -03:00
jenkins
1c495a6e2c Revert "hermes(agent): also tolerate titan-22's media-primary taint (flip applied pre-classification)"
This reverts commit aa5898f9e33b371451c94af803cda1e0ed714591.
2026-08-25 16:54:04 -03:00
jenkins
aa5898f9e3 hermes(agent): also tolerate titan-22's media-primary taint (flip applied pre-classification)
Applying the titan-22 flip ahead of the full accelerator classification, so
titan-22 still carries its soft media-primary taint. Tolerate it too so the
strong titan-22 preference isn't penalised. Harmless once media-primary is gone.
2026-08-25 16:43:32 -03:00
jenkins
5631366c4e hermes(agent): make titan-22 the strong primary home (no worker label)
APPLY ONLY AFTER the multi-arch hermes-agent image is built + validated
(both arch leaves + promoted index). Supersedes the earlier titan-22
flip on feature/hermes-agent-multiarch (dfa50b75), which required
worker=true and tolerated the old media-primary taint.

Rewrites the runtime node affinity so hermes-agent runs on titan-22:
- Adds a second, OR'd nodeSelectorTerm matching amd64 + hostname
  titan-22 + node-role.kubernetes.io/accelerator=true. It does NOT
  require node-role.kubernetes.io/worker (titan-22 is no longer a
  generic worker).
- Keeps the arm64 pi-fleet term untouched as an OR'd fallback so the
  worker is never stranded if titan-22 is unavailable.
- Makes titan-22 the STRONG/primary preference: a hostname=titan-22
  preference at weight 100 (the scheduler maximum) outranks the pi-fleet
  rpi5 nudge, lowered to weight 50, so hermes actually lives on titan-22.
- Tolerates node-role.kubernetes.io/accelerator=true:NoSchedule so it
  can consider titan-22; this does not change jellyfin's media-core
  priority or preemption.

Updates test_hermes_agent_layout.py to the two-term topology, the
[100, 50] preference weights, the titan-22 primary preference, the
absence of a worker requirement on the titan-22 term, and the toleration.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BvMSXH8VH2tMWXanb8SJdf
2026-08-25 16:43:32 -03:00
flux-bot
aae22ea798 chore(hermes): promote validated image release 2026-08-25 19:28:55 +00:00
jenkins
a7fc9b20a0 fix(harbor): mirror to external Harbor endpoint (valid TLS)
harbor-core internally advertises an HTTPS token realm, so skopeo could not push
over HTTP. Push to registry.bstein.dev (valid cert, the path kaniko already
uses); the image lands in the same 'mirror' project and stays internally pullable.
2026-08-25 14:23:51 -03:00
jenkins
e7ac6351a6 fix(harbor): mark harbor-core insecure so skopeo pushes over HTTP
skopeo derived the token realm as HTTPS and got 'HTTP response to HTTPS client'.
A registries.conf with insecure=true for harbor-core:80 makes the registry AND
its token request use HTTP.
2026-08-25 14:21:15 -03:00
jenkins
4f5fc44013 fix(harbor): push the mirror over Harbor's HTTP port 80
harbor-core serves http on :80 only; the skopeo dest omitted the port so it
dialed :443 and timed out. Pin the dest to :80 (with --dest-tls-verify=false).
2026-08-25 14:18:35 -03:00
jenkins
6a25a7681a fix(harbor): run Vault init first in the base-image mirror Job
The Job's ensure-project init container reads /vault/secrets/harbor-admin-password,
but Vault appended its init container AFTER ensure-project, so the secret file
was absent and the init failed. Force vault-agent-init to run first.
2026-08-25 14:10:57 -03:00
jenkins
8a71084585 build(hermes-agent): source base image + test deps from in-cluster mirrors
The hermes-agent-image pipeline failed intermittently on external network:
Kaniko's docker.io fallback for the base image is IPv6-broken from build
pods, and the "Validate reviewed release source" stage pip-installed pytest
from files.pythonhosted.org (DNS failures). Neither should touch the public
internet.

Base image: repoint the Dockerfile FROM from docker.io to the in-cluster
Harbor "mirror" project, keeping the exact content-addressed index digest
(9c841866...) and both arch leaves. A Flux-managed one-shot Job
(services/harbor/hermes-agent-base-mirror-job.yaml, suspend: true like the
cassandra bootstrap job) runs `skopeo copy --all` from docker.io into Harbor
using the same Vault-injected admin credential as the existing Harbor
immutability jobs; a tiny fail-closed helper ensures the public target
project first. Digest pinning and multi-arch are preserved; Kaniko pulls it
over the internal insecure registry with no docker.io fallback.

Test deps: install pytest/PyYAML fully offline (`pip --no-index
--find-links`) from a reviewed in-repo wheelhouse
(ci/vendor/hermes-agent-test-wheels) matching the arm64 python:3.12 build
container, so the validate stage never resolves a public index.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BvMSXH8VH2tMWXanb8SJdf
2026-08-25 13:53:22 -03:00
jenkins
2675241739 fix(hermes-agent): checkout scm in the amd64 build leg (fix exit 128)
The amd64 leg runs on its own fresh titan-24 pod but never checked out the SCM,
so its independent reviewed-revision boundary check hit 'git rev-parse
origin/main -> fatal: not a git repository' and the build failed with exit 128
(the arm64 leg built and pushed fine). Add checkout scm to the amd64 stage.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BvMSXH8VH2tMWXanb8SJdf
2026-08-25 13:03:13 -03:00