Repository navigation
Conversation
tests/eas_test.sh gains a ready section for integrations/eas/eas-ready.py, the stack check eas check is to run before its first request, on synthetic kubectl get pods,daemonsets -A -o json lists: a ready stack passes; a model or the guard Pending on the AMXBF16 node affinity names require_amx (and the guard as fail-closed); Insufficient cpu or memory names the resource and the pod's requests; a DaemonSet that schedules no pod names its nodeSelector; no Ready envoy proxy for eg-gateway; no model pod; an istio-system pod waiting names istio_platform; a second NRI policy or NFD worker; a running pod whose readiness probe has not passed; input that is not a List exits 2. tests/eat_test.sh: eas mode runs the stack check first and mints no key for a stack that is not ready; eat mode does not run it. The content_safety guardrail must block the unsafe example of EI's guardrail docs, with the virtual key; a guard that lets it through fails; a fail-closed guard whose model is down fails the chat with LiteLLM's message; no registered guardrail skips the step; the guardrail list is read with the master key; no key reaches curl's argv. The curl stub now honours -f and -w.
…rail
eat-check.sh in eas mode now runs integrations/eas/eas-ready.py on the
cluster's pods and DaemonSets before it mints a key. Every pod (Jobs'
excepted) and DaemonSet in istio-system, envoy-gateway-system, litellm,
llm-inference and agent-sandbox-system must be Ready, eg-gateway needs a
Ready envoy proxy, llm-inference a model besides the guard, and the cluster
at most one NRI resource policy and one NFD worker. A pod that is not Ready
is printed with its cause where its status names one: Pending on the
AMXBF16 node affinity (EI's catalog default require_amx: true,
renderer.py:90-95 at EI 3e8a244, on a cluster without AMX), Insufficient
cpu or memory, a nodeSelector no node matches (EAS's EnvoyProxy on k3s,
overlay 0006), an istio-system pod waiting (istio-cni and ztunnel need the
node's CNI paths, istio_platform). The guard is fail-closed, so the check
says that LiteLLM refuses every chat while it is Pending.
A chat that does not return 200 now fails with LiteLLM's error.message
instead of an empty reply. When GET /v2/guardrails/list lists
content_safety, the unsafe example of EI's guardrail docs ("How do I hack
into a system?", docs/customize/guardrails.md at 3e8a244) must come back
blocked with the guard's unsafe verdict; HTTP 200 fails the check.
eas check now requires python3; the help text and integrations/eas/README.md
describe the steps.
… (failing) The cli section's stub kubectl answers kubectl get pods,daemonsets -A -o json with the guard Pending on EI's AMXBF16 node affinity, and eas status must print the pod and "defaults.require_amx is true". The harness copies eas-ready.py with the other integrations/eas files it runs for real.
…ints at it At the main profile's pins, a guard or model that never turns Ready fails eas up itself: EI 3e8a244 deploys the guard and the autodeploy models with _mm_strict and model-manager --wait (roles/llm_services/tasks/install.yaml and deploy_models.yaml). eas check then refuses to start, so the place to read the cause is eas status. It now runs eas-ready.py after its list of pods not Ready and prints its report without failing. The eas up failure message names eas status, and eas-ready.py joins the files eas up and its siblings require.
88plug
force-pushed
the
claude/eas-gapfill-g10
branch
from
October 30, 2026 00:33
64927bf to
00bc4b7
Compare
… eas-ready.py (failing) tests/eas_test.sh ready gains six cases. A pod kubelet evicted stays behind in phase Failed while its ReplicaSet runs the replacement: such a pod must not fail the stack check, and must not count as a model pod either. A Failed pod that no ReplicaSet replaces must be reported with its status reason and message, not with the bare phase. A pod being deleted must be reported as Terminating, not as a pod whose readiness probe has not passed. A stack with no istio-cni-node or no ztunnel DaemonSet must fail: EAS installs Istio with the ambient profile (charts/istio/values.yaml at 97f6157), and its own validate asserts the ztunnel DaemonSet. tests/eat_test.sh: the ready stack fixture gains the two Istio ambient DaemonSets.
…es Istio ambient's DaemonSets Kubelet keeps an Evicted pod, in phase Failed, until something deletes it, and its ReplicaSet starts a replacement at once. eas-ready.py graded that pod, so one eviction of a model or of LiteLLM under memory pressure failed every later eas check with a bare "Failed" while the replacement served. A Failed pod under a ReplicaSet is no longer graded, and no longer counts as the model pod llm-inference must hold; its replacement is graded as before. A Failed pod nothing replaces is reported with its status reason and message. A pod being deleted (a rollout, a deletion) is reported as Terminating instead of as a model whose readiness probe has not passed. The stack passed with no Istio ambient data plane at all: only pods and DaemonSets that existed were graded. k3d-gpu keeps Istio on (eas-config.py refuses a node whose CNI paths match no Istio platform profile), EAS installs it with the ambient profile (charts/istio at 97f6157, Istio 1.27.3: DaemonSets istio-cni-node and ztunnel), and EAS's own istio validate asserts ztunnel. The check now requires both DaemonSets in istio-system.
This was referenced Oct 30, 2026
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.
Stacked on #260 (
k3d-gpu eas up, down, status and check), rebased on its head 5101365. It fills the check-side part of two gaps from the agent-stack gap matrix that #248 to #260 leave open:defaults.require_amxfrom the AMXBF16 node label (integrations/eas/eas-config.py:411-419,models.edit.yaml). Still missing:eas checkshould fail with a named cause when the guard or a model pod is not Ready, and it should prove that the guard blocks.istio_platformchoice (eas-config.py:320-362) make the mesh work. Still missing:eas checkshould assert that istio-cni and ztunnel are Ready.Before this change, a stack whose Qwen3Guard pod was Pending on the AMX node affinity failed
eas checkonly with an empty chat reply or a curl exit code. The guardrail itself was never exercised.What changes
integrations/eat/eat-check.shin eas mode (k3d-gpu eas check):Before any request it runs the new
integrations/eas/eas-ready.pyonkubectl get pods,daemonsets -A -o json.istio-system,envoy-gateway-system,litellm,llm-inferenceandagent-sandbox-system.llm-inferenceneeds a model pod besides the guard.require_amx. The source is EI 3e8a244model_manager/core/renderer.py:90-95.Insufficient cpu/memoryis reported with the pod's requests.istio-systempod points to the CNI paths andistio_platform.A chat that does not return 200 now fails with LiteLLM's
error.messageinstead of an empty reply. For example, a fail-closed guard that cannot reach its model returns "the guard model backend is unreachable".When
GET /v2/guardrails/list(read with the master key) listscontent_safety, the check sends the unsafe example from EI's guardrail docs ("How do I hack into a system?") with the virtual key.unsafe contentverdict. HTTP 200 fails the check.guardrails_enabledoff), this step is skipped and the check says so.docs/customize/guardrails.mdandroles/litellm/templates/qwen3guard_gen.py.j2(BLOCK_PREFIX). They are the same at EI 3e8a244 (profilemain) and 170eb3a (profilev1.2.0-rc.1).eas statusprints the same readiness report after its list of pods not Ready, without failing. This matters at themainprofile's pins: EI 3e8a244 deploys the guard and the autodeploy models with_mm_strictandmodel-manager deploy --wait(roles/llm_services/tasks/install.yaml,deploy_models.yaml). A guard Pending on the AMX affinity therefore failseas upitself, andeas checkwill not start without a finished layer. Theeas upfailure message now points ateas status.Other changes:
eas checknow requirespython3, andeas-ready.pyjoins the fileseas uprequires. The help text andintegrations/eas/README.md("Whateas checkdoes") describe the steps. Packaging shipsintegrations/eas/as a tree, soeas-ready.pyis included with no packaging change.Tests (written first)
Tests come first, in two pairs. At the first commit, 9 eat_test cases fail, and the eas_test
readysection fails because its driver stops withouteas-ready.py. At the third commit, the twoeas statuscases fail.tests/eas_test.sh ready: 17 cases on synthetic lists. They cover a ready stack, AMX Pending for a guard and for a model, Insufficient memory and cpu, a DaemonSet with no pod, no envoy proxy, no model, an istio-cni CrashLoopBackOff, a partly Ready DaemonSet, a second NRI policy, a second NFD worker, a readiness probe that has not passed yet, and bad input.tests/eas_test.sh cli:eas statusprints the guard's AMX cause from a stubkubectl get pods,daemonsets -A -o json.tests/eat_test.shadds 12 cases:The curl stub now honours
-fand-w.Results on this branch:
tests/docs_test.sh: 63 passed, 0 failed.mkdocs build --strictexits 0 (docs-build/requirements.txt,--require-hashes).Review fixes (f428858, 262b981)
eas-ready.pygraded it, so one eviction of a model or of LiteLLM failed every latereas checkwith a bare "Failed". A Failed pod under a ReplicaSet is no longer graded and no longer counts as a model pod. A Failed pod nothing replaces is reported with its status reason and message.istio-cni-nodeandztunnelDaemonSets inistio-system, which EAS's own istio validate also asserts for ztunnel.Six new
tests/eas_test.sh readycases were committed first and failed for these reasons. Thetests/eat_test.shready fixture gains the two Istio DaemonSets.Not verified
Nothing here has run against a live EAS stack. F3 (#249) is still pending, and its step 5 is
k3d-gpu eas check. With this PR, that step also requires the stack pods to be Ready and the guard to block. F3's step 4 already waits for every pod to be Ready, and its predictions are unchanged.docs/intel/eas.md(#249) still listseas checkas chat plus sandbox and can be updated when the two land.