diff --git a/sdk/python/e2e/test_suite8_guardrails.py b/sdk/python/e2e/test_suite8_guardrails.py index ff6bd596..06044d1e 100644 --- a/sdk/python/e2e/test_suite8_guardrails.py +++ b/sdk/python/e2e/test_suite8_guardrails.py @@ -50,8 +50,12 @@ ) # G3: Agent output regex (block, multi-pattern) — blocks secrets +# Case-insensitive: a secrets filter must catch "Password"/"TOKEN" etc., not +# just the lowercase forms. Without (?i) the guardrail misses capitalised +# words the LLM nondeterministically produces (e.g. "Password" at a sentence +# start), letting them slip into output and flaking this suite. G3_NO_SECRETS = RegexGuardrail( - patterns=[r"\bpassword\b", r"\bsecret\b", r"\btoken\b"], + patterns=[r"(?i)\bpassword\b", r"(?i)\bsecret\b", r"(?i)\btoken\b"], mode="block", name="no_secrets", message="Do not include passwords, secrets, or tokens.", @@ -359,7 +363,7 @@ def test_plan_reflects_all_guardrails(self, runtime, model): assert g3["position"] == "output" assert g3["onFail"] == "retry" patterns = g3.get("patterns", []) - for pat in [r"\bpassword\b", r"\bsecret\b", r"\btoken\b"]: + for pat in [r"(?i)\bpassword\b", r"(?i)\bsecret\b", r"(?i)\btoken\b"]: assert pat in patterns, f"G3 missing pattern '{pat}'. Got: {patterns}" # ── Tool-level guardrails ─────────────────────────────────────