From 0d8a5fa26b9064e3bd27ead023b9c2270a76dd64 Mon Sep 17 00:00:00 2001 From: seonghobae <8172694+seonghobae@users.noreply.github.com> Date: Fri, 3 Jul 2026 14:30:14 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=8E=A8=20Palette:=20APPGUARDRAIL=5FNO=5FE?= =?UTF-8?q?MOJI=20=ED=99=98=EA=B2=BD=20=EB=B3=80=EC=88=98=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EC=8B=9C=20CLI=20=EC=9D=B4=EB=AA=A8=EC=A7=80=20?= =?UTF-8?q?=EC=88=A8=EA=B9=80=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .Jules/palette.md | 4 + get_hint_lines.py | 6 + get_imports.py | 3 + get_print_lines.py | 17 + out2.log | 0 out3.log | 4376 +++++++++++++++++++++++++++++++++++ patch_appguardrail_emoji.py | 34 + patch_plural.py | 25 + scanner/cli/appguardrail.py | 521 +++-- 9 files changed, 4800 insertions(+), 186 deletions(-) create mode 100644 get_hint_lines.py create mode 100644 get_imports.py create mode 100644 get_print_lines.py create mode 100644 out2.log create mode 100644 out3.log create mode 100644 patch_appguardrail_emoji.py create mode 100644 patch_plural.py diff --git a/.Jules/palette.md b/.Jules/palette.md index f8c1fbd..a99ba78 100644 --- a/.Jules/palette.md +++ b/.Jules/palette.md @@ -5,3 +5,7 @@ ## 2026-06-30 - Added Emojis to CLI Output Messages **Learning:** Adding subtle emojis to informative CLI output headers (like "Created/updated files" and "Next steps") provides clearer visual cues for developers scanning long CLI output. **Action:** Always include relevant emojis in summary output text to make success and informational messages more visually distinguishable from routine command logs. + +## 2026-07-03 - Conditional Emojis in CLI Output Messages +**Learning:** Hard-coded emojis in CLI output messages can break integrations with tools that do not support unicode and look bad in environments that don't support modern unicode. +**Action:** When adding emojis to terminal output, conditionally remove them if `APPGUARDRAIL_NO_EMOJI` environment variable is set. diff --git a/get_hint_lines.py b/get_hint_lines.py new file mode 100644 index 0000000..b6d9e66 --- /dev/null +++ b/get_hint_lines.py @@ -0,0 +1,6 @@ +with open("scanner/cli/appguardrail.py", "r") as f: + lines = f.readlines() + +for i, line in enumerate(lines): + if "๐Ÿ’ก Hint:" in line: + print(f"{i+1}: {line.strip()}") diff --git a/get_imports.py b/get_imports.py new file mode 100644 index 0000000..cc00c49 --- /dev/null +++ b/get_imports.py @@ -0,0 +1,3 @@ +with open("scanner/cli/appguardrail.py", "r") as f: + for i in range(20): + print(f.readline().strip()) diff --git a/get_print_lines.py b/get_print_lines.py new file mode 100644 index 0000000..af2663f --- /dev/null +++ b/get_print_lines.py @@ -0,0 +1,17 @@ +import re + +with open("scanner/cli/appguardrail.py", "r") as f: + content = f.read() + +emojis = [ + "โœ…", "โœจ", "๐Ÿš€", "๐Ÿ’ก", "โš™๏ธ", "โŒ", "๐Ÿงญ", "๐Ÿงฉ", "๐Ÿ”Ž", "๐Ÿ", + "๐ŸŒ", "๐Ÿงพ", "๐Ÿ”ด", "๐Ÿ”ต", "๐ŸŸ ", "๐ŸŸก", "โญ๏ธ", "๐Ÿ”", "โš ๏ธ", "โšก", + "โš™", "โš ", "โ”€", "โ•" +] + +lines = content.split('\n') +for i, line in enumerate(lines): + if "print(" in line: + has_emoji = any(e in line for e in emojis) + if has_emoji: + print(f"{i+1}: {line.strip()}") diff --git a/out2.log b/out2.log new file mode 100644 index 0000000..e69de29 diff --git a/out3.log b/out3.log new file mode 100644 index 0000000..429edd0 --- /dev/null +++ b/out3.log @@ -0,0 +1,4376 @@ + +AppGuardrail scanning: /app + +Detected language axes: python +Beginner profile: Generic code scan + Code files detected; AppGuardrail will run applicable built-in rules. + Framework signals: templates + Optional external engines: bandit, ruff, semgrep + ZAP baseline: provide --zap-baseline for authorized DAST + +External auto mode: + Skipped Bandit: executable not found or not runnable + Skipped Semgrep: executable not found or not runnable + +Ruff security rules enabled: select S + +[CRITICAL] scanner/rules/supabase.yml:16 + Rule: next-public-secret + Details: appguardrail-rule | secrets | scanner-fixture + Message: Secret environment variable uses NEXT_PUBLIC_ prefix โ€” this exposes it to the browser bundle. [OWASP A05:2021 - Security Misconfiguration] + Code: [REDACTED: sensitive match suppressed] + Gate: non-blocking context + +[CRITICAL] scanner/rules/supabase.yml:16 + Rule: nextjs-env-secret-client-prefix + Details: appguardrail-rule | secrets | scanner-fixture + Message: Secret environment variable uses NEXT_PUBLIC_ prefix, which exposes it +in the browser bundle. Remove the NEXT_PUBLIC_ prefix and ensure it is +only referenced in server-side code. + Code: [REDACTED: sensitive match suppressed] + Gate: non-blocking context + +[CRITICAL] scanner/rules/nextjs.yml:63 + Rule: stripe-secret-key-client-exposure + Details: appguardrail-rule | secrets | scanner-fixture + Message: Stripe secret key appears to use NEXT_PUBLIC_ prefix, which exposes it +to the browser. Remove the NEXT_PUBLIC_ prefix immediately. The Stripe +secret key must only be used server-side. + Code: [REDACTED: sensitive match suppressed] + Gate: non-blocking context + +[CRITICAL] scanner/rules/stripe.yml:62 + Rule: next-public-secret + Details: appguardrail-rule | secrets | scanner-fixture + Message: Secret environment variable uses NEXT_PUBLIC_ prefix โ€” this exposes it to the browser bundle. [OWASP A05:2021 - Security Misconfiguration] + Code: [REDACTED: sensitive match suppressed] + Gate: non-blocking context + +[CRITICAL] scanner/rules/stripe.yml:62 + Rule: nextjs-env-secret-client-prefix + Details: appguardrail-rule | secrets | scanner-fixture + Message: Secret environment variable uses NEXT_PUBLIC_ prefix, which exposes it +in the browser bundle. Remove the NEXT_PUBLIC_ prefix and ensure it is +only referenced in server-side code. + Code: [REDACTED: sensitive match suppressed] + Gate: non-blocking context + +[CRITICAL] scanner/rules/stripe.yml:62 + Rule: stripe-secret-key-client-exposure + Details: appguardrail-rule | secrets | scanner-fixture + Message: Stripe secret key appears to use NEXT_PUBLIC_ prefix, which exposes it +to the browser. Remove the NEXT_PUBLIC_ prefix immediately. The Stripe +secret key must only be used server-side. + Code: [REDACTED: sensitive match suppressed] + Gate: non-blocking context + +[CRITICAL] scanner/rules/stripe.yml:63 + Rule: stripe-secret-key-client-exposure + Details: appguardrail-rule | secrets | scanner-fixture + Message: Stripe secret key appears to use NEXT_PUBLIC_ prefix, which exposes it +to the browser. Remove the NEXT_PUBLIC_ prefix immediately. The Stripe +secret key must only be used server-side. + Code: [REDACTED: sensitive match suppressed] + Gate: non-blocking context + +[CRITICAL] scanner/cli/appguardrail.py:441 + Rule: dangerous-eval + Details: appguardrail-rule | injection | scanner-fixture + Message: Use of eval() detected. This is a critical risk for arbitrary code execution and injection attacks. [OWASP A03:2021 - Injection] + Code: "message": "Use of eval() detected. This is a critical risk for arbitrary code execution and injection attacks. [OWASP A + Gate: non-blocking context + +[CRITICAL] examples/vulnerable-vibe-app/README.md:54 + Rule: next-public-secret + Details: appguardrail-rule | secrets | example + Message: Secret environment variable uses NEXT_PUBLIC_ prefix โ€” this exposes it to the browser bundle. [OWASP A05:2021 - Security Misconfiguration] + Code: [REDACTED: sensitive match suppressed] + Gate: non-blocking context + +[CRITICAL] examples/vulnerable-vibe-app/README.md:54 + Rule: nextjs-env-secret-client-prefix + Details: appguardrail-rule | secrets | example + Message: Secret environment variable uses NEXT_PUBLIC_ prefix, which exposes it +in the browser bundle. Remove the NEXT_PUBLIC_ prefix and ensure it is +only referenced in server-side code. + Code: [REDACTED: sensitive match suppressed] + Gate: non-blocking context + +[CRITICAL] checklists/secrets.md:65 + Rule: next-public-secret + Details: appguardrail-rule | secrets | doc + Message: Secret environment variable uses NEXT_PUBLIC_ prefix โ€” this exposes it to the browser bundle. [OWASP A05:2021 - Security Misconfiguration] + Code: [REDACTED: sensitive match suppressed] + Gate: non-blocking context + +[CRITICAL] checklists/secrets.md:65 + Rule: nextjs-env-secret-client-prefix + Details: appguardrail-rule | secrets | doc + Message: Secret environment variable uses NEXT_PUBLIC_ prefix, which exposes it +in the browser bundle. Remove the NEXT_PUBLIC_ prefix and ensure it is +only referenced in server-side code. + Code: [REDACTED: sensitive match suppressed] + Gate: non-blocking context + +[CRITICAL] checklists/secrets.md:65 + Rule: stripe-secret-key-client-exposure + Details: appguardrail-rule | secrets | doc + Message: Stripe secret key appears to use NEXT_PUBLIC_ prefix, which exposes it +to the browser. Remove the NEXT_PUBLIC_ prefix immediately. The Stripe +secret key must only be used server-side. + Code: [REDACTED: sensitive match suppressed] + Gate: non-blocking context + +[CRITICAL] checklists/secrets.md:65 + Rule: stripe-secret-key-client-exposure + Details: appguardrail-rule | secrets | doc + Message: Stripe secret key appears to use NEXT_PUBLIC_ prefix, which exposes it +to the browser. Remove the NEXT_PUBLIC_ prefix immediately. The Stripe +secret key must only be used server-side. + Code: [REDACTED: sensitive match suppressed] + Gate: non-blocking context + +[CRITICAL] checklists/stripe.md:62 + Rule: stripe-secret-key-client-exposure + Details: appguardrail-rule | secrets | doc + Message: Stripe secret key appears to use NEXT_PUBLIC_ prefix, which exposes it +to the browser. Remove the NEXT_PUBLIC_ prefix immediately. The Stripe +secret key must only be used server-side. + Code: [REDACTED: sensitive match suppressed] + Gate: non-blocking context + +[CRITICAL] tests/test_coverage_edge_cases.py:267 + Rule: hardcoded-api-credential + Details: appguardrail-rule | secrets | test + Message: Hardcoded API credential detected. Move credentials to secret storage and rotate any committed value. [OWASP A07:2021 - Identification and Authentication Failures] + Code: [REDACTED: sensitive match suppressed] + Gate: non-blocking context + +[CRITICAL] tests/test_appguardrail.py:1662 + Rule: python-insecure-deserialization + Details: appguardrail-rule | misconfig | test + Message: Insecure deserialization detected. Loading untrusted data with pickle, marshal, yaml.load, or yaml.unsafe_load can lead to arbitrary code execution. [OWASP A08:2021 - Software and Data Integrity Failures] + Code: "pickle.loads(data)\n" + Gate: non-blocking context + +[CRITICAL] tests/test_appguardrail.py:1663 + Rule: python-insecure-deserialization + Details: appguardrail-rule | misconfig | test + Message: Insecure deserialization detected. Loading untrusted data with pickle, marshal, yaml.load, or yaml.unsafe_load can lead to arbitrary code execution. [OWASP A08:2021 - Software and Data Integrity Failures] + Code: "yaml.load(raw_config)\n" + Gate: non-blocking context + +[CRITICAL] tests/test_appguardrail.py:1664 + Rule: python-insecure-deserialization + Details: appguardrail-rule | misconfig | test + Message: Insecure deserialization detected. Loading untrusted data with pickle, marshal, yaml.load, or yaml.unsafe_load can lead to arbitrary code execution. [OWASP A08:2021 - Software and Data Integrity Failures] + Code: "yaml.unsafe_load(raw_config)\n" + Gate: non-blocking context + +[CRITICAL] tests/test_appguardrail.py:1666 + Rule: python-insecure-deserialization + Details: appguardrail-rule | misconfig | test + Message: Insecure deserialization detected. Loading untrusted data with pickle, marshal, yaml.load, or yaml.unsafe_load can lead to arbitrary code execution. [OWASP A08:2021 - Software and Data Integrity Failures] + Code: "marshal.load(stream)\n" + Gate: non-blocking context + +[CRITICAL] tests/test_appguardrail.py:477 + Rule: next-public-secret + Details: appguardrail-rule | secrets | test + Message: Secret environment variable uses NEXT_PUBLIC_ prefix โ€” this exposes it to the browser bundle. [OWASP A05:2021 - Security Misconfiguration] + Code: [REDACTED: sensitive match suppressed] + Gate: non-blocking context + +[CRITICAL] tests/test_appguardrail.py:1228 + Rule: dangerous-eval + Details: appguardrail-rule | injection | test + Message: Use of eval() detected. This is a critical risk for arbitrary code execution and injection attacks. [OWASP A03:2021 - Injection] + Code: (scanner_cli / "appguardrail.py").write_text('"message": "Use eval() detected"\n') + Gate: non-blocking context + +[CRITICAL] tests/test_appguardrail.py:1254 + Rule: dangerous-eval + Details: appguardrail-rule | injection | test + Message: Use of eval() detected. This is a critical risk for arbitrary code execution and injection attacks. [OWASP A03:2021 - Injection] + Code: scanner_file.write_text('"message": "Use eval() detected"\n') + Gate: non-blocking context + +[CRITICAL] tests/test_appguardrail.py:200 + Rule: python-dynamic-sql + Details: appguardrail-rule | injection | test + Message: Dynamic SQL query construction detected. Use parameterized queries or query-builder binding instead of string formatting or concatenation. [OWASP A03:2021 - Injection] + Code: "content": 'cursor.execute(f"SELECT * FROM users WHERE name = {name}")\n', + Gate: non-blocking context + +[CRITICAL] tests/test_appguardrail.py:205 + Rule: tool-execute-parameters-passthrough + Details: appguardrail-rule | misconfig | test + Message: Tool execution endpoint appears to pass request parameters directly into a registry or handler. Validate the tool code allowlist and parameter schema before dispatch. [OWASP A03:2021 - Injection] + Code: "@router.post('/tools/{code}/execute')\n" + Gate: non-blocking context + +[CRITICAL] tests/test_appguardrail.py:196 + Rule: python-jwt-decode-without-algorithms + Details: appguardrail-rule | authz | test + Message: JWT decode call does not appear to pin accepted algorithms. Explicitly require expected algorithms and validate issuer, audience, expiry, and key id. [OWASP A07:2021 - Identification and Authentication Failures] + Code: [REDACTED: sensitive match suppressed] + Gate: non-blocking context + +[CRITICAL] tests/test_appguardrail.py:252 + Rule: hardcoded-api-credential + Details: appguardrail-rule | secrets | test + Message: Hardcoded API credential detected. Move credentials to secret storage and rotate any committed value. [OWASP A07:2021 - Identification and Authentication Failures] + Code: [REDACTED: sensitive match suppressed] + Gate: non-blocking context + +[CRITICAL] tests/test_appguardrail.py:477 + Rule: nextjs-env-secret-client-prefix + Details: appguardrail-rule | secrets | test + Message: Secret environment variable uses NEXT_PUBLIC_ prefix, which exposes it +in the browser bundle. Remove the NEXT_PUBLIC_ prefix and ensure it is +only referenced in server-side code. + Code: [REDACTED: sensitive match suppressed] + Gate: non-blocking context + +[HIGH] scanner/cli/appguardrail.py:382 + Rule: todo-skip-auth + Details: appguardrail-rule | authz | scanner-fixture + Message: Comment suggests auth/security check was deferred. Verify this is not deployed to production. [OWASP A01:2021 - Broken Access Control] + Code: "id": "todo-skip-auth", + Gate: non-blocking context + +[HIGH] scanner/cli/appguardrail.py:384 + Rule: todo-skip-auth + Details: appguardrail-rule | authz | scanner-fixture + Message: Comment suggests auth/security check was deferred. Verify this is not deployed to production. [OWASP A01:2021 - Broken Access Control] + Code: r"(?i)(?:todo|fixme|hack|temp)[^\n]{0,50}(?:auth|security|permission|check|protect)", + Gate: non-blocking context + +[HIGH] scanner/cli/appguardrail.py:1144 + Rule: todo-skip-auth + Details: appguardrail-rule | authz | scanner-fixture + Message: Comment suggests auth/security check was deferred. Verify this is not deployed to production. [OWASP A01:2021 - Broken Access Control] + Code: 6. **AI Patterns**: Are there TODO comments that defer security checks? + Gate: non-blocking context + +[HIGH] scanner/cli/appguardrail.py:820 + Rule: python-django-csrf-exempt + Details: appguardrail-rule | misconfig | scanner-fixture + Message: Django CSRF protection is explicitly disabled on a view. Require CSRF protection or document a safe non-browser authentication boundary. [CWE-352 - Cross-Site Request Forgery] + Code: "pattern": re.compile(r"@csrf_exempt\b", re.MULTILINE), + Gate: non-blocking context + +[HIGH] scanner/cli/appguardrail.py:382 + Rule: todo-skip-auth + Details: appguardrail-rule | authz | scanner-fixture + Message: Comment suggests authentication or security check was intentionally skipped +or deferred. This is a common pattern in AI-generated code. Review and ensure +proper authentication and authorization are in place before deploying. + Code: "id": "todo-skip-auth", + Gate: non-blocking context + +[HIGH] scanner/cli/appguardrail.py:384 + Rule: todo-skip-auth + Details: appguardrail-rule | authz | scanner-fixture + Message: Comment suggests authentication or security check was intentionally skipped +or deferred. This is a common pattern in AI-generated code. Review and ensure +proper authentication and authorization are in place before deploying. + Code: r"(?i)(?:todo|fixme|hack|temp)[^\n]{0,50}(?:auth|security|permission|check|protect)", + Gate: non-blocking context + +[HIGH] scanner/cli/appguardrail.py:1144 + Rule: todo-skip-auth + Details: appguardrail-rule | authz | scanner-fixture + Message: Comment suggests authentication or security check was intentionally skipped +or deferred. This is a common pattern in AI-generated code. Review and ensure +proper authentication and authorization are in place before deploying. + Code: 6. **AI Patterns**: Are there TODO comments that defer security checks? + Gate: non-blocking context + +[HIGH] scanner/cli/appguardrail.py:378 + Rule: todo-skip-auth + Details: appguardrail-rule | authz | scanner-fixture + Message: Comment suggests authentication or security check was intentionally skipped +or deferred. This is a common pattern in AI-generated code. Review and ensure +proper authentication and authorization are in place before deploying. + Code: "message": "Firebase/Firestore rule allows unrestricted read/write access. Add authentication and ownership checks. [OWA + Gate: non-blocking context + +[HIGH] scanner/cli/appguardrail.py:382 + Rule: todo-skip-auth + Details: appguardrail-rule | authz | scanner-fixture + Message: Comment suggests authentication or security check was intentionally skipped +or deferred. This is a common pattern in AI-generated code. Review and ensure +proper authentication and authorization are in place before deploying. + Code: "id": "todo-skip-auth", + Gate: non-blocking context + +[HIGH] scanner/cli/appguardrail.py:901 + Rule: todo-skip-auth + Details: appguardrail-rule | authz | scanner-fixture + Message: Comment suggests authentication or security check was intentionally skipped +or deferred. This is a common pattern in AI-generated code. Review and ensure +proper authentication and authorization are in place before deploying. + Code: "message": "Cookie Secure flag is explicitly disabled. Session and auth cookies should be restricted to HTTPS transport. + Gate: non-blocking context + +[HIGH] tests/test_reports_core.py:20 + Rule: python-requests-verify-false + Details: appguardrail-rule | misconfig | test + Message: HTTP client disables TLS certificate verification. Keep verification enabled or pin a trusted CA bundle. [CWE-295 - Improper Certificate Validation] + Code: "snippet": "requests.get(url, verify=False)", + Gate: non-blocking context + +[HIGH] tests/test_coverage_edge_cases.py:92 + Rule: hardcoded-password + Details: appguardrail-rule | secrets | test + Message: Possible hardcoded password detected. [OWASP A07:2021 - Identification and Authentication Failures] + Code: [REDACTED: sensitive match suppressed] + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:45 + Rule: todo-skip-auth + Details: appguardrail-rule | authz | test + Message: Comment suggests auth/security check was deferred. Verify this is not deployed to production. [OWASP A01:2021 - Broken Access Control] + Code: "pattern": re.compile(r"TODO: fix auth"), + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:153 + Rule: todo-skip-auth + Details: appguardrail-rule | authz | test + Message: Comment suggests auth/security check was deferred. Verify this is not deployed to production. [OWASP A01:2021 - Broken Access Control] + Code: "const key = MOCK_SECRET_KEY;\n// TODO: fix auth checks here\n" + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:188 + Rule: upload-filename-path-traversal-risk + Details: appguardrail-rule | injection | test + Message: Uploaded filename is used in a filesystem path. Sanitize with a strict allowlist and verify the resolved path stays inside the intended directory. [OWASP A01:2021 - Broken Access Control] + Code: "content": "target = os.path.join(tmpdir, upload.filename)\n", + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:230 + Rule: python-subprocess-string-command + Details: appguardrail-rule | injection | test + Message: Subprocess command is built as a formatted or concatenated string. Pass an argument list and validate attacker-controlled command arguments. [OWASP A03:2021 - Injection] + Code: "content": 'subprocess.run(f"ffmpeg -i {source_path}")\n', + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:192 + Rule: python-permissive-cors + Details: appguardrail-rule | misconfig | test + Message: CORS allows every origin. Restrict authenticated APIs to known origins. [OWASP A05:2021 - Security Misconfiguration] + Code: "content": "app.add_middleware(CORSMiddleware, allow_origins=['*'])\n", + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:239 + Rule: python-subprocess-user-controlled-args + Details: appguardrail-rule | injection | test + Message: Subprocess argument list includes high-risk user-controlled media or filename parameters. Validate each argument with strict allowlists and bounds before invoking external tools. [OWASP A03:2021 - Injection] + Code: "subprocess.run(['ffmpeg', '-i', source_path, '-fs', str(target_bytes)])\n" + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:295 + Rule: python-subprocess-user-controlled-args + Details: appguardrail-rule | injection | test + Message: Subprocess argument list includes high-risk user-controlled media or filename parameters. Validate each argument with strict allowlists and bounds before invoking external tools. [OWASP A03:2021 - Injection] + Code: "content": "subprocess.run(['ffmpeg', '-i', source_path], check=True)\n", + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:239 + Rule: python-target-bytes-missing-upper-bound + Details: appguardrail-rule | misconfig | test + Message: target_bytes is checked only for a lower bound. Add a server-side upper bound to prevent resource exhaustion in media processing. [OWASP A04:2021 - Insecure Design] + Code: "subprocess.run(['ffmpeg', '-i', source_path, '-fs', str(target_bytes)])\n" + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:265 + Rule: pydantic-bounding-box-unconstrained + Details: appguardrail-rule | misconfig | test + Message: Bounding box schema fields are unconstrained numeric values. Add min/max bounds to reject invalid coordinates before document processing. [OWASP A04:2021 - Insecure Design] + Code: "class BoundingBox(BaseModel):\n" + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:265 + Rule: pydantic-unbounded-nested-list + Details: appguardrail-rule | misconfig | test + Message: Pydantic model accepts nested lists without an obvious size or depth bound. Add max_length/depth validation for untrusted recursive structures. [OWASP A04:2021 - Insecure Design] + Code: "class BoundingBox(BaseModel):\n" + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:280 + Rule: python-absolute-path-traversal-check-missing + Details: appguardrail-rule | injection | test + Message: Path validation checks '..' parts but does not reject absolute paths nearby. Reject absolute paths and verify resolved paths stay under the allowed root. [OWASP A01:2021 - Broken Access Control] + Code: "candidate = Path(input_path)\n" + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:288 + Rule: python-okta-host-endswith-ssrf + Details: appguardrail-rule | misconfig | test + Message: Okta/Snowflake authenticator host validation uses a suffix check. Parse the URL hostname and allow only exact Okta domains or verified subdomains to prevent SSRF bypasses. [OWASP A10:2021 - Server-Side Request Forgery] + Code: "parsed = urlparse(authenticator)\n" + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:230 + Rule: python-subprocess-missing-timeout + Details: appguardrail-rule | injection | test + Message: External process call has no timeout. Add a bounded timeout and handle TimeoutExpired to prevent worker exhaustion. [OWASP A04:2021 - Insecure Design] + Code: "content": 'subprocess.run(f"ffmpeg -i {source_path}")\n', + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:295 + Rule: python-subprocess-missing-timeout + Details: appguardrail-rule | injection | test + Message: External process call has no timeout. Add a bounded timeout and handle TimeoutExpired to prevent worker exhaustion. [OWASP A04:2021 - Insecure Design] + Code: "content": "subprocess.run(['ffmpeg', '-i', source_path], check=True)\n", + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:311 + Rule: python-expanduser-user-path-traversal + Details: appguardrail-rule | injection | test + Message: User-controlled path is expanded before containment validation. Reject traversal and verify resolved paths stay under the allowed root. [OWASP A01:2021 - Broken Access Control] + Code: "content": "audio_file = Path(input_path).expanduser()\n", + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:345 + Rule: python-requests-verify-false + Details: appguardrail-rule | misconfig | test + Message: HTTP client disables TLS certificate verification. Keep verification enabled or pin a trusted CA bundle. [CWE-295 - Improper Certificate Validation] + Code: "content": "requests.get('https://api.example.test', verify=False)\n", + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:822 + Rule: python-requests-verify-false + Details: appguardrail-rule | misconfig | test + Message: HTTP client disables TLS certificate verification. Keep verification enabled or pin a trusted CA bundle. [CWE-295 - Improper Certificate Validation] + Code: "requests.get(url, verify=False)", + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:881 + Rule: python-requests-verify-false + Details: appguardrail-rule | misconfig | test + Message: HTTP client disables TLS certificate verification. Keep verification enabled or pin a trusted CA bundle. [CWE-295 - Improper Certificate Validation] + Code: "code": "requests.get(url, verify=False)", + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:1501 + Rule: python-requests-verify-false + Details: appguardrail-rule | misconfig | test + Message: HTTP client disables TLS certificate verification. Keep verification enabled or pin a trusted CA bundle. [CWE-295 - Improper Certificate Validation] + Code: "snippet": "requests.get(url, verify=False)", + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:1531 + Rule: python-requests-verify-false + Details: appguardrail-rule | misconfig | test + Message: HTTP client disables TLS certificate verification. Keep verification enabled or pin a trusted CA bundle. [CWE-295 - Improper Certificate Validation] + Code: "snippet": "requests.get(url, verify=False)", + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:349 + Rule: python-tempfile-mktemp + Details: appguardrail-rule | misconfig | test + Message: tempfile.mktemp creates predictable names without opening the file atomically. Use NamedTemporaryFile or mkstemp. [CWE-377 - Insecure Temporary File] + Code: "content": "name = tempfile.mktemp()\n", + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:353 + Rule: python-flask-debug-true + Details: appguardrail-rule | misconfig | test + Message: Debug mode is enabled in application code. Disable active debug code before deployment. [CWE-489 - Active Debug Code] + Code: "content": "app.run(host='0.0.0.0', debug=True)\n", + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:902 + Rule: python-flask-debug-true + Details: appguardrail-rule | misconfig | test + Message: Debug mode is enabled in application code. Disable active debug code before deployment. [CWE-489 - Active Debug Code] + Code: "issue_text": "Flask app run with debug=True", + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:903 + Rule: python-flask-debug-true + Details: appguardrail-rule | misconfig | test + Message: Debug mode is enabled in application code. Disable active debug code before deployment. [CWE-489 - Active Debug Code] + Code: "code": "app.run(debug=True)", + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:946 + Rule: python-flask-debug-true + Details: appguardrail-rule | misconfig | test + Message: Debug mode is enabled in application code. Disable active debug code before deployment. [CWE-489 - Active Debug Code] + Code: "message": "flask app with debug=True", + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:357 + Rule: python-jinja-autoescape-disabled + Details: appguardrail-rule | misconfig | test + Message: Jinja2 autoescaping is disabled. Keep autoescape enabled for HTML templates to reduce XSS risk. [CWE-79 - Cross-site Scripting] + Code: "content": "env = jinja2.Environment(loader=loader, autoescape=False)\n", + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:361 + Rule: python-django-csrf-exempt + Details: appguardrail-rule | misconfig | test + Message: Django CSRF protection is explicitly disabled on a view. Require CSRF protection or document a safe non-browser authentication boundary. [CWE-352 - Cross-Site Request Forgery] + Code: "content": "@csrf_exempt\ndef update_profile(request):\n return HttpResponse('ok')\n", + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:45 + Rule: todo-skip-auth + Details: appguardrail-rule | authz | test + Message: Comment suggests authentication or security check was intentionally skipped +or deferred. This is a common pattern in AI-generated code. Review and ensure +proper authentication and authorization are in place before deploying. + Code: "pattern": re.compile(r"TODO: fix auth"), + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:153 + Rule: todo-skip-auth + Details: appguardrail-rule | authz | test + Message: Comment suggests authentication or security check was intentionally skipped +or deferred. This is a common pattern in AI-generated code. Review and ensure +proper authentication and authorization are in place before deploying. + Code: "const key = MOCK_SECRET_KEY;\n// TODO: fix auth checks here\n" + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:685 + Rule: todo-skip-auth + Details: appguardrail-rule | authz | test + Message: Comment suggests authentication or security check was intentionally skipped +or deferred. This is a common pattern in AI-generated code. Review and ensure +proper authentication and authorization are in place before deploying. + Code: assert "Skipped Ruff security rules: executable not found or not runnable" in out + Gate: non-blocking context + +[HIGH] tests/test_appguardrail.py:811 + Rule: todo-skip-auth + Details: appguardrail-rule | authz | test + Message: Comment suggests authentication or security check was intentionally skipped +or deferred. This is a common pattern in AI-generated code. Review and ensure +proper authentication and authorization are in place before deploying. + Code: def test_build_finding_adds_public_security_metadata(): + Gate: non-blocking context + +[HIGH] tests/test_issueops_core.py:39 + Rule: ruff:S105 + Details: ruff | misconfig | test + Message: Possible hardcoded password assigned to: "secret_log" + Code: Possible hardcoded password assigned to: "secret_log" + Gate: non-blocking context + +[HIGH] tests/test_org_readiness_report_script.py:50 + Rule: ruff:S603 + Details: ruff | misconfig | test + Message: `subprocess` call: check for execution of untrusted input + Code: `subprocess` call: check for execution of untrusted input + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:234 + Rule: http-exception-chains-internal-error + Details: appguardrail-rule | misconfig | test + Message: HTTPException is chained from an internal exception. Avoid leaking implementation details in API error responses. [OWASP A05:2021 - Security Misconfiguration] + Code: "content": "raise HTTPException(status_code=500) from exc\n", + Gate: non-blocking context + +[WARNING] scripts/ci/collect_org_security_failures.py:37 + Rule: ruff:S104 + Details: ruff | misconfig | app-code + Message: Possible binding to all interfaces + Code: Possible binding to all interfaces + +[WARNING] tests/test_appguardrail.py:126 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:129 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:136 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:145 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:146 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:158 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:159 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:160 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:339 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:420 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:429 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:437 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:447 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:454 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:462 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:463 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:464 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:468 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:469 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:470 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:471 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:482 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:509 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:514 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:538 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:539 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:540 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:541 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:542 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:555 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:556 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:570 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:571 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:578 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:595 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:605 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:614 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:615 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:622 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:624 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:625 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:650 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:662 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:665 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:666 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:667 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:680 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:683 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:684 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:685 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:686 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:698 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:701 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:702 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:703 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:704 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:705 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:706 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:727 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:729 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:744 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:745 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:794 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:795 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:800 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:801 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:802 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:803 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:804 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:805 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:806 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:807 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:808 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:825 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:826 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:827 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:828 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:842 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:845 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:846 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:847 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:863 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:888 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:889 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:890 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:891 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:916 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:917 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:918 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:919 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:934 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:935 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:936 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:937 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:958 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:964 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:985 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:986 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:987 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:988 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1015 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1022 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1023 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1057 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1062 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1063 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1064 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1082 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1084 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1085 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1086 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1087 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1106 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1108 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1109 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1110 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1111 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1153 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1155 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1156 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1157 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1164 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1166 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1167 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1214 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1218 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1219 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1220 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1221 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1222 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1240 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1243 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1244 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1266 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1269 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1270 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1271 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1278 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1279 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1280 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1281 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1298 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1299 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1300 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1301 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1302 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1303 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1304 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1324 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1325 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1326 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1343 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1344 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1345 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1391 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1392 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1393 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1394 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1395 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1402 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1403 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1405 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1406 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1413 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1414 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1425 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1426 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1427 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1437 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1439 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1440 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1447 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1448 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1449 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1457 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1458 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1459 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1461 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1462 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1468 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1472 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1473 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1474 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1475 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1486 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1487 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1510 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1513 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1514 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1515 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1516 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1540 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1543 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1544 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1545 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1546 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1553 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1556 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1557 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1600 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1603 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1604 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1605 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1606 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1607 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1608 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1610 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1611 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1620 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1622 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1623 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1634 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1635 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1642 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1643 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1646 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1649 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1650 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1653 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1675 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1676 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1677 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1678 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1679 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1680 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1681 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1691 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1693 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1694 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1708 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail.py:1709 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:45 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:46 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:47 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:48 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:59 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:60 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:68 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:69 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:70 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:71 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:72 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:73 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:74 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:82 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:83 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:92 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:93 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:110 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:112 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:113 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:134 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:136 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:137 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:150 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:151 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:159 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:162 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:164 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:165 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:166 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:169 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:171 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:182 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:186 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:187 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:188 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:203 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:205 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:206 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:222 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:223 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:235 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:269 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:276 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:287 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:300 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:318 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:319 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:320 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:326 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:327 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:345 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:371 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:381 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:390 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:391 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:399 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:408 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:415 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:458 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:466 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:469 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:470 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_appguardrail_coverage.py:473 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:42 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:45 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:48 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:51 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:54 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:57 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:60 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:63 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:66 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:67 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:68 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:71 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:72 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:75 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:78 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:84 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:89 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:107 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:108 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:122 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:124 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:125 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:143 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:145 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:146 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:158 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:161 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:162 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:166 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:167 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:168 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:169 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:170 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:173 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:174 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:175 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:213 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:214 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:215 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:216 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:219 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:220 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:221 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:222 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:225 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:226 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:227 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:228 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:234 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:284 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_coverage_edge_cases.py:285 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_external_core.py:21 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_external_core.py:22 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_external_core.py:23 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_external_core.py:24 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_external_core.py:25 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_external_core.py:26 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_external_core.py:36 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_external_core.py:37 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_external_core.py:38 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_external_core.py:39 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_external_core.py:40 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_external_core.py:41 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_external_core.py:57 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_external_core.py:58 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_external_core.py:59 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_external_core.py:69 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_external_core.py:70 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_external_core.py:71 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_external_core.py:72 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_findings_core.py:24 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_findings_core.py:25 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_findings_core.py:26 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_findings_core.py:27 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_findings_core.py:28 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_findings_core.py:29 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_findings_core.py:40 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_findings_core.py:41 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_findings_core.py:54 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_findings_core.py:58 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_findings_core.py:59 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_findings_core.py:60 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_findings_core.py:61 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_findings_core.py:74 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_findings_core.py:78 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_findings_core.py:79 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_issueops_core.py:26 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_issueops_core.py:27 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_issueops_core.py:28 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_issueops_core.py:29 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_issueops_core.py:30 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_issueops_core.py:34 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_issueops_core.py:44 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_issueops_core.py:45 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_issueops_core.py:46 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_issueops_core.py:60 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_issueops_core.py:61 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_issueops_core.py:62 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_issueops_core.py:63 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_issueops_core.py:64 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_issueops_core.py:70 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_issueops_core.py:71 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_issueops_core.py:72 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_issueops_core.py:73 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_issueops_core.py:76 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_issueops_core.py:81 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_issueops_core.py:82 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_issueops_core.py:83 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_issueops_core.py:85 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_issueops_core.py:86 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_language_core.py:11 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_language_core.py:30 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_language_core.py:31 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_language_core.py:32 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_language_core.py:33 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_language_core.py:34 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_language_core.py:35 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_language_core.py:47 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_language_core.py:48 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_language_core.py:49 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_language_core.py:50 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_language_core.py:67 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_language_core.py:68 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_language_core.py:69 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_language_core.py:70 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_language_core.py:71 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_language_core.py:80 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_language_core.py:81 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_language_core.py:82 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_metrics_core.py:26 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_metrics_core.py:27 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_metrics_core.py:28 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_metrics_core.py:29 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_metrics_core.py:41 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_metrics_core.py:42 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_metrics_core.py:43 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_metrics_core.py:58 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_metrics_core.py:59 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_metrics_core.py:75 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:23 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:24 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:25 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:26 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:27 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:28 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:29 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:30 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:31 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:64 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:65 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:66 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:67 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:68 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:69 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:70 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:71 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:120 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:121 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:126 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:131 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:132 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:133 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:134 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:135 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:136 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:137 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:138 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:139 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:202 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:203 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:204 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:205 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:206 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:207 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:208 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:209 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:210 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:211 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_intelligence_core.py:212 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_readiness_report_script.py:80 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_readiness_report_script.py:81 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_readiness_report_script.py:82 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_readiness_report_script.py:83 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_readiness_report_script.py:84 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_readiness_report_script.py:85 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_readiness_report_script.py:86 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_readiness_report_script.py:87 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_readiness_report_script.py:88 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_readiness_report_script.py:116 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_readiness_report_script.py:119 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_readiness_report_script.py:122 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_security_failure_collector.py:12 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_security_failure_collector.py:37 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_security_failure_collector.py:38 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_security_failure_collector.py:39 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_security_failure_collector.py:88 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_security_failure_collector.py:101 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_security_failure_collector.py:116 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_security_failure_collector.py:124 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_security_failure_collector.py:125 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_security_failure_collector.py:126 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_security_failure_collector.py:138 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_security_failure_collector.py:139 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_security_failure_collector.py:140 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_org_security_failure_collector.py:141 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:54 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:55 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:56 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:57 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:58 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:59 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:60 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:61 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:62 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:63 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:81 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:82 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:95 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:96 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:97 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:110 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:111 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:112 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:113 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:114 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:131 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:132 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:133 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:134 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:135 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:136 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:158 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:159 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:160 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:161 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:162 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:166 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_reports_core.py:178 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_rules_core.py:14 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_rules_core.py:28 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_rules_core.py:31 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_rules_core.py:32 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_rules_core.py:33 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_rules_core.py:34 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_rules_core.py:48 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +[WARNING] tests/test_rules_core.py:49 + Rule: ruff:S101 + Details: ruff | misconfig | test + Message: Use of `assert` detected + Code: Use of `assert` detected + Gate: non-blocking context + +โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ +Scanned 100 files | Deploy blockers: 0 critical issues 0 high issues 1 warning 0 info issues +Non-blocking findings in docs/tests/examples/fixtures: 615 + +No deploy-blocking critical or high issues found. + +Run 'appguardrail review' to get an AI prompt for fixing these issues. diff --git a/patch_appguardrail_emoji.py b/patch_appguardrail_emoji.py new file mode 100644 index 0000000..e1a867c --- /dev/null +++ b/patch_appguardrail_emoji.py @@ -0,0 +1,34 @@ +import re + +with open("scanner/cli/appguardrail.py", "r") as f: + content = f.read() + +emojis = [ + "โœ…", "โœจ", "๐Ÿš€", "๐Ÿ’ก", "โš™๏ธ", "โŒ", "๐Ÿงญ", "๐Ÿงฉ", "๐Ÿ”Ž", "๐Ÿ", + "๐ŸŒ", "๐Ÿงพ", "๐Ÿ”ด", "๐Ÿ”ต", "๐ŸŸ ", "๐ŸŸก", "โญ๏ธ", "๐Ÿ”", "โš ๏ธ", "โšก", + "โš™", "โš " +] + +patch_template = """ +def strip_emoji(text): + if not bool(os.getenv("APPGUARDRAIL_NO_EMOJI")): + return text + for e in {emojis}: + text = text.replace(e + " ", "") + text = text.replace(e + " ", "") + text = text.replace(e, "") + return text +""" +patch = patch_template.format(emojis=str(emojis)) + +# Inject after imports +content = content.replace("from pathlib import Path", "from pathlib import Path\nimport os\n" + patch) + +# Find all print statements with strings containing emojis +# and wrap the string argument with strip_emoji() +def replacer(match): + # This is a complex regex task, might be easier to just conditionally replace print globally inside the file using string manipulation + pass + +with open("scanner/cli/appguardrail.py", "w") as f: + f.write(content) diff --git a/patch_plural.py b/patch_plural.py new file mode 100644 index 0000000..93e109c --- /dev/null +++ b/patch_plural.py @@ -0,0 +1,25 @@ +import re + +with open("scanner/cli/appguardrail.py", "r") as f: + content = f.read() + +# Replace pluralizations: +# files_word +# critical_word +# high_word +# warnings_word +# info_word +# finding_word +# issue_word +# these_word + +patch_plurals = """ + files_word = "file" if files_scanned == 1 else "files" + critical_word = "critical issue" if counts["CRITICAL"] == 1 else "critical issues" + high_word = "high issue" if counts["HIGH"] == 1 else "high issues" + warnings_word = "warning" if counts["WARNING"] == 1 else "warnings" + info_word = "info issue" if counts["INFO"] == 1 else "info issues" +""" + +def plural(count, sing, plur=None): + return sing if count == 1 else (plur or sing + "s") diff --git a/scanner/cli/appguardrail.py b/scanner/cli/appguardrail.py index 9314ee4..8a6d4bc 100644 --- a/scanner/cli/appguardrail.py +++ b/scanner/cli/appguardrail.py @@ -57,34 +57,176 @@ sys.path.insert(0, str(Path(__file__).resolve().parents[2])) from appguardrail_core.external import build_external_scan_plan -from appguardrail_core.findings import ( - NON_BLOCKING_CONTEXTS, - is_deploy_blocking as core_is_deploy_blocking, - normalize_findings, -) -from appguardrail_core.language import ( - LANGUAGE_EXTENSIONS, - detect_language_axes, - detect_stack_profile, -) -from appguardrail_core.org_bundle import ( - OrgBundleError, - annotate_missing_pr_repositories, - gh_error_message, - gh_pr_list, - gh_repo_list, - load_json as load_org_json, - render_org_evidence, - write_bundle, -) -from appguardrail_core.reports import ( - REPORT_TYPE_LABELS, - ReportContext, - render_report, - supported_report_types, -) +from appguardrail_core.findings import NON_BLOCKING_CONTEXTS +from appguardrail_core.findings import \ + is_deploy_blocking as core_is_deploy_blocking +from appguardrail_core.findings import normalize_findings +from appguardrail_core.language import (LANGUAGE_EXTENSIONS, + detect_language_axes, + detect_stack_profile) +from appguardrail_core.org_bundle import (OrgBundleError, + annotate_missing_pr_repositories, + gh_error_message, gh_pr_list, + gh_repo_list) +from appguardrail_core.org_bundle import load_json as load_org_json +from appguardrail_core.org_bundle import render_org_evidence, write_bundle +from appguardrail_core.reports import (REPORT_TYPE_LABELS, ReportContext, + render_report, supported_report_types) from appguardrail_core.rules import build_rule_metadata +_NO_EMOJI = bool(os.getenv("APPGUARDRAIL_NO_EMOJI")) + + +def _strip_emoji(text: str) -> str: + if not _NO_EMOJI: + return text + for e in [ + "โœ…", + "โœจ", + "๐Ÿš€", + "๐Ÿ’ก", + "โš™๏ธ", + "โŒ", + "๐Ÿงญ", + "๐Ÿงฉ", + "๐Ÿ”Ž", + "๐Ÿ", + "๐ŸŒ", + "๐Ÿงพ", + "๐Ÿ”ด", + "๐Ÿ”ต", + "๐ŸŸ ", + "๐ŸŸก", + "โญ๏ธ", + "๐Ÿ”", + "โš ๏ธ", + "โšก", + "โš™", + "โš ", + ]: + text = text.replace(e + " ", "") + text = text.replace(e + " ", "") + text = text.replace(e, "") + return text + + +def __ccprint(*args, **kwargs): + if not _NO_EMOJI: + print(*args, **kwargs) + return + + new_args = [] + for arg in args: + if isinstance(arg, str): + new_args.append(_strip_emoji(arg)) + else: + new_args.append(arg) + print(*new_args, **kwargs) + + +_NO_EMOJI = bool(os.getenv("APPGUARDRAIL_NO_EMOJI")) + + +def _strip_emoji(text: str) -> str: + if not _NO_EMOJI: + return text + for e in [ + "โœ…", + "โœจ", + "๐Ÿš€", + "๐Ÿ’ก", + "โš™๏ธ", + "โŒ", + "๐Ÿงญ", + "๐Ÿงฉ", + "๐Ÿ”Ž", + "๐Ÿ", + "๐ŸŒ", + "๐Ÿงพ", + "๐Ÿ”ด", + "๐Ÿ”ต", + "๐ŸŸ ", + "๐ŸŸก", + "โญ๏ธ", + "๐Ÿ”", + "โš ๏ธ", + "โšก", + "โš™", + "โš ", + ]: + text = text.replace(e + " ", "") + text = text.replace(e + " ", "") + text = text.replace(e, "") + return text + + +def cccprint(*args, **kwargs): + if not _NO_EMOJI: + print(*args, **kwargs) + return + + new_args = [] + for arg in args: + if isinstance(arg, str): + new_args.append(_strip_emoji(arg)) + else: + new_args.append(arg) + print(*new_args, **kwargs) + + +_NO_EMOJI = bool(os.getenv("APPGUARDRAIL_NO_EMOJI")) + + +def _strip_emoji(text: str) -> str: + if not _NO_EMOJI: + return text + for e in [ + "โœ…", + "โœจ", + "๐Ÿš€", + "๐Ÿ’ก", + "โš™๏ธ", + "โŒ", + "๐Ÿงญ", + "๐Ÿงฉ", + "๐Ÿ”Ž", + "๐Ÿ", + "๐ŸŒ", + "๐Ÿงพ", + "๐Ÿ”ด", + "๐Ÿ”ต", + "๐ŸŸ ", + "๐ŸŸก", + "โญ๏ธ", + "๐Ÿ”", + "โš ๏ธ", + "โšก", + "โš™", + "โš ", + ]: + text = text.replace(e + " ", "") + text = text.replace(e + " ", "") + text = text.replace(e, "") + return text + + +_orig_print = print + + +def ccccprint(*args, **kwargs): + if not _NO_EMOJI: + _orig_cprint(*args, **kwargs) + return + + new_args = [] + for arg in args: + if isinstance(arg, str): + new_args.append(_strip_emoji(arg)) + else: + new_args.append(arg) + _orig_cprint(*new_args, **kwargs) + + __version__ = "0.1.1" # --------------------------------------------------------------------------- @@ -725,7 +867,7 @@ r"(?i)\n]*target\s*=\s*[\"']_blank[\"'])(?![^>\n]*rel\s*=\s*[\"'][^\"']*(?:noopener|noreferrer))[^>\n]*href\s*=\s*[\"']https?://" ), "severity": "WARNING", - "message": "External target=_blank link is missing rel=\"noopener noreferrer\". Add rel attributes to prevent reverse tabnabbing. [OWASP A05:2021 - Security Misconfiguration]", + "message": 'External target=_blank link is missing rel="noopener noreferrer". Add rel attributes to prevent reverse tabnabbing. [OWASP A05:2021 - Security Misconfiguration]', "extensions": [".html", ".htm"], }, { @@ -873,6 +1015,7 @@ }, ] + def _unquote_rule_scalar(value: str) -> str: """Return a simple YAML scalar value from the controlled rule files.""" value = value.strip() @@ -1178,8 +1321,8 @@ def cmd_init(args): selected for selected in selected_tools if selected not in tool_configs ] if unknown_tools: - print(f"โŒ Error: Unknown tool '{tool}'", file=sys.stderr) - print( + cccprint(f"โŒ Error: Unknown tool '{tool}'", file=sys.stderr) + cccprint( f"๐Ÿ’ก Hint: Supported tools are {', '.join([*tool_groups.keys(), *tool_configs.keys()])}", file=sys.stderr, ) @@ -1194,11 +1337,11 @@ def cmd_init(args): # SECURITY: Prevent Arbitrary File Write via symlink path traversal if not target_file.resolve().is_relative_to(project_root): - print( + cccprint( f"โŒ Error: Target path {target_file} escapes the project root. Aborting.", file=sys.stderr, ) - print( + cccprint( "๐Ÿ’ก Hint: Ensure the target file or its symlinks do not point outside the repository.", file=sys.stderr, ) @@ -1223,11 +1366,11 @@ def cmd_init(args): # SECURITY: Prevent Arbitrary File Write via symlink path traversal if not checklist_file.resolve().is_relative_to(project_root): - print( + cccprint( f"โŒ Error: Checklist path {checklist_file} escapes the project root. Aborting.", file=sys.stderr, ) - print( + cccprint( "๐Ÿ’ก Hint: Ensure the checklist file or its symlinks do not point outside the repository.", file=sys.stderr, ) @@ -1244,33 +1387,33 @@ def cmd_init(args): if stack and "supabase" in stack: _print_supabase_reminder() - print("\nโœ… AppGuardrail initialized successfully!\n") + cccprint("\nโœ… AppGuardrail initialized successfully!\n") if installed: - print("โœจ Created/updated files:") + cccprint("โœจ Created/updated files:") for f in installed: - print(f" {f}") - print() + cccprint(f" {f}") + cccprint() if skipped: - print("โญ๏ธ Skipped (already configured):") + cccprint("โญ๏ธ Skipped (already configured):") for f in skipped: - print(f" {f}") - print() + cccprint(f" {f}") + cccprint() - print("๐Ÿš€ Next steps:") - print(" 1. Review the installed rules and customize for your project") - print(" 2. Run 'appguardrail scan .' to check for existing issues") - print(" 3. Check APPGUARDRAIL_CHECKLIST.md before deploying") - print() + cccprint("๐Ÿš€ Next steps:") + cccprint(" 1. Review the installed rules and customize for your project") + cccprint(" 2. Run 'appguardrail scan .' to check for existing issues") + cccprint(" 3. Check APPGUARDRAIL_CHECKLIST.md before deploying") + cccprint() def _print_supabase_reminder(): """Print extra operational reminders for Supabase-backed projects.""" - print("\n๐Ÿ’ก Supabase stack detected. Quick reminders:") - print(" - Enable RLS on every user-data table") - print(" - Use getUser() not getSession() on the server") - print(" - Keep SUPABASE_SERVICE_ROLE_KEY server-side only") - print() + cccprint("\n๐Ÿ’ก Supabase stack detected. Quick reminders:") + cccprint(" - Enable RLS on every user-data table") + cccprint(" - Use getUser() not getSession() on the server") + cccprint(" - Keep SUPABASE_SERVICE_ROLE_KEY server-side only") + cccprint() def _detect_scan_languages(files): @@ -1308,10 +1451,10 @@ def _print_external_auto_skips(plan): ] if not skipped: return - print("โš™๏ธ External auto mode:") + cccprint("โš™๏ธ External auto mode:") for decision in skipped: - print(f" Skipped {decision.display_name}: {decision.skip_reason}") - print() + cccprint(f" Skipped {decision.display_name}: {decision.skip_reason}") + cccprint() def cmd_scan(args): @@ -1334,33 +1477,33 @@ def cmd_scan(args): run_codegraph = getattr(args, "codegraph", False) if not scan_arg.exists(): - print(f"โŒ Error: Path does not exist: {scan_path}", file=sys.stderr) - print( + cccprint(f"โŒ Error: Path does not exist: {scan_path}", file=sys.stderr) + cccprint( "๐Ÿ’ก Hint: Check if the path is correct or if you are in the right directory.", file=sys.stderr, ) sys.exit(1) if scan_arg.is_symlink(): - print(f"Skipping symlink path: {scan_arg}") + cccprint(f"Skipping symlink path: {scan_arg}") return 0 - print(f"\n๐Ÿ” AppGuardrail scanning: {scan_path}\n") + cccprint(f"\n๐Ÿ” AppGuardrail scanning: {scan_path}\n") if run_codegraph: - print("๐Ÿงญ CodeGraph enabled: initializing or syncing structural index\n") + cccprint("๐Ÿงญ CodeGraph enabled: initializing or syncing structural index\n") try: status = _run_codegraph_index(scan_path) except RuntimeError as exc: - print(f"โŒ Error: {exc}", file=sys.stderr) - print( + cccprint(f"โŒ Error: {exc}", file=sys.stderr) + cccprint( "๐Ÿ’ก Hint: Install the CodeGraph CLI or run without --codegraph.", file=sys.stderr, ) return 1 if status: - print(status) - print() + cccprint(status) + cccprint() findings = [] files_scanned = 0 @@ -1380,16 +1523,20 @@ def cmd_scan(args): profile = detect_stack_profile(scanned_files) languages = set(profile.languages) if profile.languages: - print(f"๐Ÿงฉ Detected language axes: {', '.join(profile.languages)}") - print(f"๐Ÿงญ Beginner profile: {profile.display_name}") - print(f" {profile.beginner_summary}") + cccprint(f"๐Ÿงฉ Detected language axes: {', '.join(profile.languages)}") + cccprint(f"๐Ÿงญ Beginner profile: {profile.display_name}") + cccprint(f" {profile.beginner_summary}") if profile.frameworks: - print(f" Framework signals: {', '.join(profile.frameworks)}") + cccprint(f" Framework signals: {', '.join(profile.frameworks)}") if profile.external_tools: - print(f" Optional external engines: {', '.join(profile.external_tools)}") + cccprint( + f" Optional external engines: {', '.join(profile.external_tools)}" + ) if profile.zap_recommended: - print(" ZAP baseline: provide --zap-baseline for authorized DAST") - print() + cccprint( + " ZAP baseline: provide --zap-baseline for authorized DAST" + ) + cccprint() external_plan = build_external_scan_plan( languages, @@ -1405,75 +1552,72 @@ def cmd_scan(args): _print_external_auto_skips(external_plan) if external_plan.trivy.should_run: - print("๐Ÿ”Ž Trivy FS enabled: vuln, secret, misconfig\n") + cccprint("๐Ÿ”Ž Trivy FS enabled: vuln, secret, misconfig\n") try: findings.extend(_run_trivy_fs(scan_path)) except RuntimeError as exc: - print(f"โŒ Error: {exc}", file=sys.stderr) - print( + cccprint(f"โŒ Error: {exc}", file=sys.stderr) + cccprint( "๐Ÿ’ก Hint: Ensure Trivy is installed and running correctly, or run without --trivy.", file=sys.stderr, ) return 1 if external_plan.bandit.should_run: - print("๐Ÿ Bandit enabled: Python SAST\n") + cccprint("๐Ÿ Bandit enabled: Python SAST\n") try: findings.extend(_run_bandit_scan(scan_path)) except RuntimeError as exc: if external_plan.bandit.auto_selected and not external_plan.bandit.forced: - print(f"โš ๏ธ Skipping Bandit auto integration: {exc}\n") + cccprint(f"โš ๏ธ Skipping Bandit auto integration: {exc}\n") else: - print(f"โŒ Error: {exc}", file=sys.stderr) - print( + cccprint(f"โŒ Error: {exc}", file=sys.stderr) + cccprint( f"๐Ÿ’ก Hint: {external_plan.bandit.hint}", file=sys.stderr, ) return 1 if external_plan.ruff.should_run: - print("๐Ÿ Ruff security rules enabled: select S\n") + cccprint("๐Ÿ Ruff security rules enabled: select S\n") try: findings.extend(_run_ruff_security_scan(scan_path)) except RuntimeError as exc: if external_plan.ruff.auto_selected and not external_plan.ruff.forced: - print(f"โš ๏ธ Skipping Ruff auto integration: {exc}\n") + cccprint(f"โš ๏ธ Skipping Ruff auto integration: {exc}\n") else: - print(f"โŒ Error: {exc}", file=sys.stderr) - print( + cccprint(f"โŒ Error: {exc}", file=sys.stderr) + cccprint( f"๐Ÿ’ก Hint: {external_plan.ruff.hint}", file=sys.stderr, ) return 1 if external_plan.semgrep.should_run: - print(f"๐Ÿ”Ž Semgrep enabled: config {semgrep_config}\n") + cccprint(f"๐Ÿ”Ž Semgrep enabled: config {semgrep_config}\n") try: findings.extend(_run_semgrep_scan(scan_path, semgrep_config)) except RuntimeError as exc: - if ( - external_plan.semgrep.auto_selected - and not external_plan.semgrep.forced - ): - print(f"โš ๏ธ Skipping Semgrep auto integration: {exc}\n") + if external_plan.semgrep.auto_selected and not external_plan.semgrep.forced: + cccprint(f"โš ๏ธ Skipping Semgrep auto integration: {exc}\n") else: - print(f"โŒ Error: {exc}", file=sys.stderr) - print( + cccprint(f"โŒ Error: {exc}", file=sys.stderr) + cccprint( f"๐Ÿ’ก Hint: {external_plan.semgrep.hint}", file=sys.stderr, ) return 1 if external_plan.zap.should_run: - print(f"๐ŸŒ OWASP ZAP baseline enabled: {zap_baseline_url}\n") + cccprint(f"๐ŸŒ OWASP ZAP baseline enabled: {zap_baseline_url}\n") try: findings.extend(_run_zap_baseline(zap_baseline_url)) except RuntimeError as exc: if external_plan.zap.auto_selected and not external_plan.zap.forced: - print(f"โš ๏ธ Skipping ZAP auto integration: {exc}\n") + cccprint(f"โš ๏ธ Skipping ZAP auto integration: {exc}\n") else: - print(f"โŒ Error: {exc}", file=sys.stderr) - print( + cccprint(f"โŒ Error: {exc}", file=sys.stderr) + cccprint( f"๐Ÿ’ก Hint: {external_plan.zap.hint}", file=sys.stderr, ) @@ -1483,8 +1627,8 @@ def cmd_scan(args): try: _write_findings_json(findings, Path(findings_json)) except RuntimeError as exc: - print(f"โŒ Error: {exc}", file=sys.stderr) - print( + cccprint(f"โŒ Error: {exc}", file=sys.stderr) + cccprint( "๐Ÿ’ก Hint: Check the output path and directory permissions.", file=sys.stderr, ) @@ -1511,7 +1655,7 @@ def _write_findings_json(findings, output_path: Path): ) except OSError as exc: raise RuntimeError(f"Cannot write findings JSON: {output_path}") from exc - print(f"๐Ÿงพ Findings JSON written: {output_path}") + cccprint(f"๐Ÿงพ Findings JSON written: {output_path}") def cmd_monitor(args): @@ -1520,11 +1664,11 @@ def cmd_monitor(args): workflow_file = project_root / ".github" / "workflows" / "appguardrail-monitor.yml" if not workflow_file.resolve().is_relative_to(project_root): - print( + cccprint( f"โŒ Error: Monitor workflow path {workflow_file} escapes the project root. Aborting.", file=sys.stderr, ) - print( + cccprint( "๐Ÿ’ก Hint: Ensure .github/workflows and its symlinks stay inside the repository.", file=sys.stderr, ) @@ -1535,10 +1679,10 @@ def cmd_monitor(args): workflow_file.unlink() workflow_file.write_text(MONITOR_WORKFLOW) - print("\nโœ… AppGuardrail monitor workflow installed!\n") - print(f"Created/updated: {workflow_file.relative_to(project_root)}") - print() - print( + cccprint("\nโœ… AppGuardrail monitor workflow installed!\n") + cccprint(f"Created/updated: {workflow_file.relative_to(project_root)}") + cccprint() + cccprint( "This workflow runs `appguardrail scan .` on pull requests, pushes, and manual dispatches." ) return 0 @@ -1548,8 +1692,8 @@ def cmd_report(args): """Generate markdown reports from normalized AppGuardrail findings JSON.""" report_type = getattr(args, "report_type", None) if report_type not in supported_report_types(): - print(f"โŒ Error: Unsupported report type: {report_type}", file=sys.stderr) - print( + cccprint(f"โŒ Error: Unsupported report type: {report_type}", file=sys.stderr) + cccprint( "๐Ÿ’ก Hint: Supported report types are: " + ", ".join(supported_report_types()), file=sys.stderr, @@ -1559,8 +1703,8 @@ def cmd_report(args): try: findings = _load_findings_json(Path(getattr(args, "findings"))) except (TypeError, RuntimeError) as exc: - print(f"โŒ Error: {exc}", file=sys.stderr) - print( + cccprint(f"โŒ Error: {exc}", file=sys.stderr) + cccprint( "๐Ÿ’ก Hint: Provide a JSON array or an object with a `findings` array.", file=sys.stderr, ) @@ -1576,8 +1720,7 @@ def cmd_report(args): or "Application source, configuration, and security workflow evidence.", client_name=getattr(args, "client_name", None) or "n/a", reviewer=getattr(args, "reviewer", None) or "AppGuardrail", - engagement_type=getattr(args, "engagement_type", None) - or "Pre-launch review", + engagement_type=getattr(args, "engagement_type", None) or "Pre-launch review", based_on=getattr(args, "based_on", None) or "AppGuardrail findings JSON", ) report = render_report(report_type, findings, context) @@ -1587,9 +1730,9 @@ def cmd_report(args): target = Path(output_path) target.parent.mkdir(parents=True, exist_ok=True) target.write_text(report, encoding="utf-8") - print(f"โœ… {REPORT_TYPE_LABELS[report_type]} written: {target}") + cccprint(f"โœ… {REPORT_TYPE_LABELS[report_type]} written: {target}") else: - print(report, end="") + cccprint(report, end="") return 0 @@ -1614,11 +1757,13 @@ def cmd_org_bundle(args): prs, collection_warnings = gh_pr_list(owner, repos, per_repo_pr_limit) if prs_repository: prs = annotate_missing_pr_repositories(prs, prs_repository) - generated_at, report, evidence_payload, inventory, pr_summary = render_org_evidence( - repos, - prs, - active_repository_target=active_repository_target, - generated_at=getattr(args, "generated_at", None), + generated_at, report, evidence_payload, inventory, pr_summary = ( + render_org_evidence( + repos, + prs, + active_repository_target=active_repository_target, + generated_at=getattr(args, "generated_at", None), + ) ) manifest = write_bundle( bundle_dir, @@ -1636,32 +1781,34 @@ def cmd_org_bundle(args): collection_warnings=collection_warnings, ) except OrgBundleError as exc: - print(f"โŒ Error: {exc}", file=sys.stderr) - print( + cccprint(f"โŒ Error: {exc}", file=sys.stderr) + cccprint( "๐Ÿ’ก Hint: Authenticate `gh` or provide --repos-json and --prs-json.", file=sys.stderr, ) return 1 except subprocess.CalledProcessError as exc: - print(f"โŒ Error: GitHub command failed: {gh_error_message(exc)}", file=sys.stderr) - print( + cccprint( + f"โŒ Error: GitHub command failed: {gh_error_message(exc)}", file=sys.stderr + ) + cccprint( "๐Ÿ’ก Hint: Retry later or provide --repos-json and --prs-json.", file=sys.stderr, ) return 1 summary = manifest["summary"] - print(f"\nโœ… Buyer evidence bundle written: {bundle_dir}\n") - print("Files:") - print(" - org-readiness.md") - print(" - buyer-evidence.json") - print(" - manifest.json") - print(" - README.md") - print() - print(f"Open PRs analyzed: {summary['open_pull_requests']}") - print(f"Buyer evidence status: {summary['buyer_evidence_status']}") + cccprint(f"\nโœ… Buyer evidence bundle written: {bundle_dir}\n") + cccprint("Files:") + cccprint(" - org-readiness.md") + cccprint(" - buyer-evidence.json") + cccprint(" - manifest.json") + cccprint(" - README.md") + cccprint() + cccprint(f"Open PRs analyzed: {summary['open_pull_requests']}") + cccprint(f"Buyer evidence status: {summary['buyer_evidence_status']}") if manifest["collection_warnings"]: - print(f"Collection warnings: {len(manifest['collection_warnings'])}") + cccprint(f"Collection warnings: {len(manifest['collection_warnings'])}") return 0 @@ -1690,8 +1837,8 @@ def cmd_hook(args): run_codegraph = getattr(args, "codegraph", False) if not git_dir.is_dir(): - print("โŒ Error: Not a git repository.", file=sys.stderr) - print( + cccprint("โŒ Error: Not a git repository.", file=sys.stderr) + cccprint( "๐Ÿ’ก Hint: Run 'git init' first to initialize a git repository.", file=sys.stderr, ) @@ -1700,11 +1847,11 @@ def cmd_hook(args): hooks_dir = git_dir / "hooks" # SECURITY: Prevent Arbitrary File Write via symlink path traversal if not hooks_dir.resolve().is_relative_to(project_root): - print( + cccprint( f"โŒ Error: Target path {hooks_dir} escapes the project root. Aborting.", file=sys.stderr, ) - print( + cccprint( "๐Ÿ’ก Hint: Ensure your .git directory or hooks path is contained within the project.", file=sys.stderr, ) @@ -1746,15 +1893,15 @@ def cmd_hook(args): pre_commit_file.write_text(hook_content) pre_commit_file.chmod(pre_commit_file.stat().st_mode | stat.S_IEXEC) - print( + cccprint( "\nโœ… AppGuardrail pre-commit hook installed successfully at .git/hooks/pre-commit!\n" ) hook_scan_command = f"appguardrail scan{scan_flags} ." - print( + cccprint( f"This will run '{hook_scan_command}' before every commit and block commits if vulnerabilities are found." ) if run_codegraph: - print("CodeGraph mode is enabled for this hook.") + cccprint("CodeGraph mode is enabled for this hook.") return 0 @@ -2298,20 +2445,22 @@ def _run_semgrep_scan(scan_path: Path, config: str = "auto"): config = config or "auto" try: - process = subprocess.run( # noqa: S603 - Semgrep path resolved with shutil.which - [ - semgrep, - "scan", - "--config", - config, - "--json", - str(scan_path), - ], - shell=False, - capture_output=True, - text=True, - check=False, - timeout=600, + process = ( + subprocess.run( # noqa: S603 - Semgrep path resolved with shutil.which + [ + semgrep, + "scan", + "--config", + config, + "--json", + str(scan_path), + ], + shell=False, + capture_output=True, + text=True, + check=False, + timeout=600, + ) ) except subprocess.TimeoutExpired as exc: raise RuntimeError("Semgrep scan timed out.") from exc @@ -2378,13 +2527,15 @@ def _run_zap_baseline(target_url: str): with tempfile.TemporaryDirectory() as tmpdir: report_path = Path(tmpdir) / "zap-baseline.json" try: - process = subprocess.run( # noqa: S603 - ZAP path resolved with shutil.which - [zap, "-t", target_url, "-J", str(report_path), "-I"], - shell=False, - capture_output=True, - text=True, - check=False, - timeout=900, + process = ( + subprocess.run( # noqa: S603 - ZAP path resolved with shutil.which + [zap, "-t", target_url, "-J", str(report_path), "-I"], + shell=False, + capture_output=True, + text=True, + check=False, + timeout=900, + ) ) except subprocess.TimeoutExpired as exc: raise RuntimeError("ZAP baseline scan timed out.") from exc @@ -2602,25 +2753,25 @@ def _print_scan_results(findings, files_scanned): elif f.get("context", "app-code") in NON_BLOCKING_CONTEXTS: non_blocking += 1 icon = _SEVERITY_ICONS.get(f["severity"], f["severity"]) - print(f"[{icon}] {f['file']}:{f['line']}") - print(f" Rule: {f['rule_id']}") - print( + cccprint(f"[{icon}] {f['file']}:{f['line']}") + cccprint(f" Rule: {f['rule_id']}") + cccprint( f" Details: {f.get('source', 'appguardrail-rule')} | {f.get('category', 'misconfig')} | {f.get('context', 'app-code')}" ) - print(f" Message: {f['message']}") - print(f" Code: {f['snippet']}") + cccprint(f" Message: {f['message']}") + cccprint(f" Code: {f['snippet']}") if f.get("context", "app-code") in NON_BLOCKING_CONTEXTS: - print(" Gate: non-blocking context") - print() + cccprint(" Gate: non-blocking context") + cccprint() - print("โ”€" * 60) + cccprint("โ”€" * 60) files_word = "file" if files_scanned == 1 else "files" critical_word = "critical issue" if counts["CRITICAL"] == 1 else "critical issues" high_word = "high issue" if counts["HIGH"] == 1 else "high issues" warnings_word = "warning" if counts["WARNING"] == 1 else "warnings" info_word = "info issue" if counts["INFO"] == 1 else "info issues" - print( + cccprint( f"Scanned {files_scanned} {files_word} | Deploy blockers: " f"๐Ÿ”ด {counts['CRITICAL']} {critical_word} " f"๐ŸŸ  {counts['HIGH']} {high_word} " @@ -2629,29 +2780,29 @@ def _print_scan_results(findings, files_scanned): ) if non_blocking: finding_word = "finding" if non_blocking == 1 else "findings" - print( + cccprint( f"Non-blocking {finding_word} in docs/tests/examples/fixtures: {non_blocking}" ) if files_scanned == 0: - print("\nโš ๏ธ No files were scanned. Are you in the right directory?") + cccprint("\nโš ๏ธ No files were scanned. Are you in the right directory?") elif counts["CRITICAL"] > 0: issue_word = "issue" if counts["CRITICAL"] == 1 else "issues" - print(f"\nโŒ Critical {issue_word} found. Fix before deploying.") + cccprint(f"\nโŒ Critical {issue_word} found. Fix before deploying.") elif counts["HIGH"] > 0: issue_word = "issue" if counts["HIGH"] == 1 else "issues" - print(f"\nโš ๏ธ High-severity {issue_word} found. Review before deploying.") + cccprint(f"\nโš ๏ธ High-severity {issue_word} found. Review before deploying.") elif not findings: - print("\nโœ… No issues found in this scan.") + cccprint("\nโœ… No issues found in this scan.") else: - print("\nโœ… No deploy-blocking critical or high issues found.") + cccprint("\nโœ… No deploy-blocking critical or high issues found.") if findings: these_word = "this issue" if len(findings) == 1 else "these issues" - print( + cccprint( f"\n๐Ÿ’ก Run 'appguardrail review' to get an AI prompt for fixing {these_word}." ) - print() + cccprint() def cmd_review(args): @@ -2673,16 +2824,16 @@ def cmd_review(args): prompt += REVIEW_PROMPT_FOOTER - print("\n" + "โ•" * 60) - print(" AppGuardrail โ€” Copy this prompt into your AI coding assistant") - print("โ•" * 60 + "\n") - print(prompt) - print("โ•" * 60 + "\n") - print("๐Ÿ’ก Tips:") - print(" - Paste this into Claude Code, Cursor, or any AI assistant") - print(" - Include relevant files as context (API routes, DB schema, etc.)") - print(" - Run 'appguardrail scan .' first to identify specific files to review") - print() + cccprint("\n" + "โ•" * 60) + cccprint(" AppGuardrail โ€” Copy this prompt into your AI coding assistant") + cccprint("โ•" * 60 + "\n") + cccprint(prompt) + cccprint("โ•" * 60 + "\n") + cccprint("๐Ÿ’ก Tips:") + cccprint(" - Paste this into Claude Code, Cursor, or any AI assistant") + cccprint(" - Include relevant files as context (API routes, DB schema, etc.)") + cccprint(" - Run 'appguardrail scan .' first to identify specific files to review") + cccprint() # --------------------------------------------------------------------------- @@ -2817,9 +2968,7 @@ def add_report_arguments(parser): ) parser.add_argument("--app-name", default=None, help="Application name") parser.add_argument("--repository", default=None, help="Repository name") - parser.add_argument( - "--commit", default=None, help="Commit SHA or version" - ) + parser.add_argument("--commit", default=None, help="Commit SHA or version") parser.add_argument( "--generated-at", default=None, help="Report timestamp in ISO-8601 form" )