Repository navigation
eat: the guard's vLLM image by digest when deploy_guardrails is on (G01) - #275
Merged
Merged
Conversation
…s is on (failing) With deploy_guardrails=on, EAT release-1.1.0's deploy-guardrails.yml installs the vllm chart with core/helm-charts/vllm/guardrail-values.yaml, which names vllm/vllm-openai-cpu:v0.28.0 by tag only (0c726f5 lines 115 and 133-135). These tests ask brownfield.sh to hand that playbook, and only it, a copy of EAT's charts whose guardrail-values.yaml carries the digest vllm-values.yaml already pins for the same image, and to stop before anything deploys when the two disagree. The stub EAT now calls deploy-guardrails.yml the way fresh-install.sh:419 and guardrails-controller.sh do, and its charts carry a guardrail-values.yaml cut from 0c726f5. Ten cases fail: the copy is never made, and no mismatch stops the deploy.
EAT release-1.1.0 installs its Qwen3Guard guard with deploy-guardrails.yml, which
runs helm on {{ remote_helm_charts_base }}/vllm with that chart's
guardrail-values.yaml (0c726f5 lines 115 and 133-135). That file names
vllm/vllm-openai-cpu:v0.28.0 by tag only, so with deploy_guardrails=on the guard
pulled whatever the tag pointed to, while every other image eat-up.sh deploys is
pinned by digest.
In stack mode, with the guard on, brownfield.sh now copies EAT's core/helm-charts
to ~/k3d-gpu-guard-charts before anything deploys. The new guard-values.py sets the
copy's guard image tag to the digest vllm-values.yaml already pins for the same
image. It stops the deploy if EAT's guard names another repository or tag, or if
the vLLM values carry no digest. The ansible-playbook wrapper hands that copy to
deploy-guardrails.yml alone, as the extra var remote_helm_charts_base, which takes
precedence over the playbook's vars_files. Nothing else in that play reads the
variable; the utils tasks it includes do not either. The play runs on the
bastion itself (brownfield_deployment.sh:212-222 puts localhost, ansible_connection
local, in kube_control_plane), so the copy's path is where helm runs. A marker file and a check
after the deploy catch a guard playbook that bypassed the wrapper, as for the
gateway, and the wrapper refuses a guard call that has no copy.
Checked against 0c726f5: helm template of the vllm chart with the playbook's
values renders the same manifests from EAT's charts and from the copy except for
the one image line, which now ends in
@sha256:197354e6475e638eb5ccca09beb078488046a82de0e204e7429bf1a804df9647
(re-read from Docker Hub with scripts/images-lock digest). The guard has not run on
a k3d-gpu cluster; the shipped config keeps it off and F4 runs with it off.
One more eat_test case covers the wrapper refusing a guard call with no copy; it
fails with that line removed.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This fills the last open item of gap G01 from the agent-stack gap matrix: with
deploy_guardrails=on, Qwen3Guard should be deployed by digest. #250 movedeat-up.shto EATrelease-1.1.0and #264 added its refusals. On main, the guard still pulledvllm/vllm-openai-cpu:v0.28.0by tag.The gap
EAT
release-1.1.0(0c726f5) installs the guard withcore/playbooks/deploy-guardrails.yml. That playbook runshelm upgrade --install vllm-guard {{ remote_helm_charts_base }}/vllm --values {{ remote_helm_charts_base }}/vllm/guardrail-values.yaml(lines 115 and 133-135), and that values file names the image by tag only (line 30). Every other imageeat-up.shdeploys is pinned by digest. The shippedagentic-config.cfgkeeps the guard off, so this only matters to a user who turns it on.What changes
integrations/eat/brownfield.sh, stack mode, guard on: before anything deploys, it copies EAT'score/helm-chartsto~/k3d-gpu-guard-chartsin the bastion.integrations/eat/guard-values.pysets the copy's guardimage.tagto the digestvllm-values.yamlalready pins for the same image:v0.28.0@sha256:197354e6...df9647, theimages.lockentry from eat: eat-up.sh deploys EAT release-1.1.0 (ledger F4 pre-registered) #250. The deploy stops, naming both sides, if:<tag>part of that pin, oransible-playbookwrapper passes the copy todeploy-guardrails.ymlalone, as the extra varremote_helm_charts_base. Extra vars take precedence over the playbook'svars_files(config/vars/inference_common.ymlsets/tmp/helm-charts).utilstasks it includes (get_optimized_cpu_topology,get_optimal_memory). The play runs on the bastion itself:brownfield_deployment.sh:212-222puts localhost (ansible_connection: local) inkube_control_plane.images.lockis unchanged, because the guard uses the image that is already pinned.integrations/eat/README.md(file table, versions table, blocker 11) and the guardrail bullet indocs/platforms.md.Checked against 0c726f5 (read only)
helm template(Helm v4.1.1) of thevllmchart, with the playbook's values and--set-strings, renders the same manifests from EAT's charts and from the copy. The one difference is the image line:scripts/images-lock digest docker.io/vllm/vllm-openai-cpu:v0.28.0re-read the same index digest on 2026-10-29.Tests (written first)
The first commit, c77c22d, adds the cases to
tests/eat_test.sh(108 passed, 10 failed). The stub EAT now callsdeploy-guardrails.ymlthe wayfresh-install.sh:419andguardrails-controller.sh:29-35do, and its charts carry aguardrail-values.yamlcut from 0c726f5. The cases cover:vllm-values.yaml's, every other key is unchanged, and EAT's file and the rest of the chart are untouchedbrownfield_deploymentruns on: another guard tag, a guard tag that already carries a different digest, another repository, vLLM values with no digest, and vLLM values with no imageResults on this branch:
Overlap
No open PR touches
brownfield.sh. #260 and #261 already conflict with main in the header comment oftests/eat_test.sh. A trial merge of #260 with this branch gives the same single conflict hunk as a merge with main, so this PR adds no new conflict.Not verified
The guard has not run on a k3d-gpu cluster. The shipped config keeps it off, and F4 is pre-registered with it off. This PR changes nothing on that path.