contextwall 0.2.0__tar.gz → 0.2.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- contextwall-0.2.1/.github/ISSUE_TEMPLATE/bug-report.md +39 -0
- contextwall-0.2.1/.github/ISSUE_TEMPLATE/config.yml +8 -0
- contextwall-0.2.1/.github/ISSUE_TEMPLATE/fixture-proposal.md +70 -0
- contextwall-0.2.1/.github/ISSUE_TEMPLATE/grader-drift.md +63 -0
- contextwall-0.2.1/.github/PULL_REQUEST_TEMPLATE.md +33 -0
- contextwall-0.2.1/CONTRIBUTING.md +113 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/PKG-INFO +1 -1
- contextwall-0.2.1/SECURITY.md +67 -0
- contextwall-0.2.1/launch/README.md +44 -0
- contextwall-0.2.1/launch/mcp-discord.md +49 -0
- contextwall-0.2.1/launch/reddit-ai-agents.md +103 -0
- contextwall-0.2.1/launch/show-hn.md +169 -0
- contextwall-0.2.1/launch/x-thread.md +118 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/pyproject.toml +4 -1
- {contextwall-0.2.0 → contextwall-0.2.1}/.dockerignore +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/.env.example +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/.github/workflows/docker.yml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/.gitignore +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/CHANGELOG.md +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/Dockerfile +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/LICENSE +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/README.md +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/RELEASE_NOTES_v0.1.5.md +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/RELEASE_NOTES_v0.2.0.md +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/ctxfw.oss.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/ctxfw.yaml.example +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/demo/.env.example +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/demo/ATTACKS.md +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/demo/Dockerfile.agent +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/demo/Dockerfile.cre +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/demo/Dockerfile.simulator +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/demo/Makefile +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/demo/README.md +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/demo/TESTING.md +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/demo/agent/brave_search.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/demo/agent/cre_client.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/demo/agent/main.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/demo/agent/requirements.txt +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/demo/agent/scenarios.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/demo/ctxfw.demo.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/demo/dashboard/index.html +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/demo/docker-compose.yml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/demo/simulator/main.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/demo/simulator/requirements.txt +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/docker-compose.yml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/docs/METHODOLOGY.md +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/docs/PREFLIGHT_SPEC.md +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/policy/packs/fedramp.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/policy/packs/hipaa.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/policy/packs/soc2.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/publish-pypi.sh +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/sdk/python/README.md +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/sdk/python/pyproject.toml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/sdk/python/src/contextwall_sdk/__init__.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/sdk/python/tests/test_sdk.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/__init__.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/_compat.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/api/__init__.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/api/app.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/api/models.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/classifier/__init__.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/classifier/classifier.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/cli/__init__.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/cli/main.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/compliance/__init__.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/compliance/baa.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/compliance/chain.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/compliance/control_mappings.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/compliance/export.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/compliance/keys.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/config.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/control_plane/__init__.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/control_plane/pusher.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/daemon/__init__.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/daemon/main.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/db/__init__.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/db/connection.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/db/migrations.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/mcp/__init__.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/mcp/server.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/metrics.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/models.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/policy/__init__.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/policy/detectors/__init__.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/policy/detectors/injection.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/policy/detectors/patterns.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/policy/engine.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/__init__.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/adapters/__init__.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/adapters/anthropic.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/adapters/mcp_static.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/adapters/openai.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/adapters/replay.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/cli.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-01-aws-access-key.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-02-aws-secret-key.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-03-openai-api-key.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-04-anthropic-api-key.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-05-github-pat.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-06-jwt-token.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-07-bearer-token.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-08-ssh-private-key.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-09-database-url-with-password.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-10-multi-secret-payload.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-11-ssn.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-12-credit-card.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-13-phone-number.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-14-composite-pii-medical.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-15-multi-pii-form.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-16-address-in-narrative.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-17-passport-number.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-18-driver-license.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-19-secret-in-tool-output.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-20-secret-via-http-tool.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/grounding/gnd-01-false-attribution.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/grounding/gnd-02-fake-historical-event.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/grounding/gnd-03-nonexistent-api.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/grounding/gnd-04-conflicting-sources.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/grounding/gnd-05-poisoned-action-recommendation.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/injection/inj-01-echoleak-shape.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/injection/inj-02-poisoned-rag.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/injection/inj-03-zero-width.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/injection/inj-04-spaced-letters.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/injection/inj-05-semantic-override.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/injection/inj-06-indirect-via-retrieval.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/injection/inj-07-tool-poisoning.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/injection/inj-08-aws-q-style.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/injection/inj-09-github-mcp-exfil.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/injection/inj-10-ci-title-injection.yaml +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/grade.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/grader/__init__.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/grader/grader.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/models.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/policy.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/redact.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/report/__init__.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/report/json_out.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/report/sarif.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/report/terminal.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/suite.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/preflight/transport.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/provenance/__init__.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/provenance/engine.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/provenance/models.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/proxy/__init__.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/proxy/router.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/proxy/scanner.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/proxy/tokens.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/sdk/__init__.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/sdk/_anthropic.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/sdk/_compat.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/sdk/_openai.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/sdk/client.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/sdk/exceptions.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/source/__init__.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/source/registry.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/source/types.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/synthesizer/__init__.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/synthesizer/synthesizer.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/trust/__init__.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/trust/engine.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/src/context_firewall/trust/signals.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/tests/preflight/__init__.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/tests/preflight/test_grader_regression.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/tests/preflight/test_mcp_static.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/tests/preflight/test_policy_reporters_redaction.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/tests/preflight/test_postmortem_traces.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/tests/preflight/test_replay_adapter.py +0 -0
- {contextwall-0.2.0 → contextwall-0.2.1}/uv.lock +0 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Bug report
|
|
3
|
+
about: Something in ContextWall itself doesn't work as documented
|
|
4
|
+
title: "bug: <short description>"
|
|
5
|
+
labels: bug
|
|
6
|
+
assignees: ""
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## What happened
|
|
10
|
+
|
|
11
|
+
<!-- Describe the actual behavior in 1-2 sentences. -->
|
|
12
|
+
|
|
13
|
+
## What you expected
|
|
14
|
+
|
|
15
|
+
<!-- Describe the expected behavior. -->
|
|
16
|
+
|
|
17
|
+
## Repro
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# The exact command(s) or code that produce the bug.
|
|
21
|
+
# Include enough context that we can copy-paste and reproduce.
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Output (if any):
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
<paste output here — REDACT any real secrets>
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Environment
|
|
31
|
+
|
|
32
|
+
- `contextwall` version: `<pip show contextwall | grep Version>`
|
|
33
|
+
- Python: `<python --version>`
|
|
34
|
+
- OS: <macOS / Linux distro + version / Windows>
|
|
35
|
+
- Adapter you were using: <`--openai` / `--anthropic` / `--replay` / `--mcp` / N/A>
|
|
36
|
+
|
|
37
|
+
## Anything else?
|
|
38
|
+
|
|
39
|
+
<!-- Related issues, workaround you tried, hunch about the cause, etc. -->
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
blank_issues_enabled: false
|
|
2
|
+
contact_links:
|
|
3
|
+
- name: Security vulnerability
|
|
4
|
+
url: https://github.com/bytewise-ca/context-wall/security/advisories/new
|
|
5
|
+
about: Report a security issue privately — do NOT open a public issue.
|
|
6
|
+
- name: Question or discussion
|
|
7
|
+
url: https://github.com/bytewise-ca/context-wall/discussions
|
|
8
|
+
about: Anything that isn't a bug, fixture, or grader-drift report.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Fixture proposal
|
|
3
|
+
about: Propose a new adversarial fixture for the Preflight suite
|
|
4
|
+
title: "fixture: <short name>"
|
|
5
|
+
labels: fixture-proposal
|
|
6
|
+
assignees: ""
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Attack class
|
|
10
|
+
|
|
11
|
+
<!-- Which dimension? injection / grounding / exfiltration -->
|
|
12
|
+
|
|
13
|
+
## Citation
|
|
14
|
+
|
|
15
|
+
<!--
|
|
16
|
+
Where did this pattern come from? A CVE, published paper, disclosure blog,
|
|
17
|
+
public post-mortem, or something you observed. Please link. Unsourced
|
|
18
|
+
fixtures ship as `status: experimental` until validated.
|
|
19
|
+
-->
|
|
20
|
+
|
|
21
|
+
## Threat model
|
|
22
|
+
|
|
23
|
+
<!--
|
|
24
|
+
What class of attack does this model? Who is the attacker, what is the
|
|
25
|
+
attack vector, and why should the agent NOT fall for it?
|
|
26
|
+
-->
|
|
27
|
+
|
|
28
|
+
## Proposed fixture
|
|
29
|
+
|
|
30
|
+
```yaml
|
|
31
|
+
id: <dim>-<NN>-<short-slug>
|
|
32
|
+
dimension: <injection | grounding | exfiltration>
|
|
33
|
+
severity: <info | low | medium | high | critical>
|
|
34
|
+
weight: <1.0 - 3.0>
|
|
35
|
+
release_blocking: <true | false>
|
|
36
|
+
status: <stable | experimental>
|
|
37
|
+
citation: "<CVE / paper / URL>"
|
|
38
|
+
threat_model: |
|
|
39
|
+
...
|
|
40
|
+
setup:
|
|
41
|
+
system: "..."
|
|
42
|
+
tools: []
|
|
43
|
+
context: []
|
|
44
|
+
user_message: "..."
|
|
45
|
+
expected_safe_behavior: |
|
|
46
|
+
...
|
|
47
|
+
pass_conditions:
|
|
48
|
+
- kind: no_string_in_response
|
|
49
|
+
strings: []
|
|
50
|
+
description: "..."
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Grader regression cases
|
|
54
|
+
|
|
55
|
+
<!--
|
|
56
|
+
Every merged fixture PR must include AT LEAST ONE pass example and ONE fail
|
|
57
|
+
example. Please sketch them here. See tests/preflight/test_grader_regression.py.
|
|
58
|
+
-->
|
|
59
|
+
|
|
60
|
+
**PASS example:**
|
|
61
|
+
- Response: `"..."` (or tool calls if applicable)
|
|
62
|
+
- Reason: Agent recognized the attack and refused / hedged.
|
|
63
|
+
|
|
64
|
+
**FAIL example:**
|
|
65
|
+
- Response: `"..."` (or tool calls)
|
|
66
|
+
- Reason: Agent complied with the injected instruction.
|
|
67
|
+
|
|
68
|
+
## Anything else?
|
|
69
|
+
|
|
70
|
+
<!-- Related fixtures, why this is different from existing ones, etc. -->
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Grader drift
|
|
3
|
+
about: A (fixture, response) pair where Preflight's grader gives the wrong verdict
|
|
4
|
+
title: "grader: <fixture-id> misclassifies <pass|fail>"
|
|
5
|
+
labels: grader-drift
|
|
6
|
+
assignees: ""
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
<!--
|
|
10
|
+
Grader-drift reports are the highest-signal contribution to Preflight.
|
|
11
|
+
Every one filed makes the detector more honest and every published
|
|
12
|
+
scorecard more trustworthy. Thank you for filing.
|
|
13
|
+
-->
|
|
14
|
+
|
|
15
|
+
## Which fixture
|
|
16
|
+
|
|
17
|
+
**Fixture id:** `<e.g. inj-05-semantic-override>`
|
|
18
|
+
**Suite:** `standard@2026.09` <!-- or whichever you're on -->
|
|
19
|
+
|
|
20
|
+
## The response the agent gave
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
<paste the full response text here — REDACT any real secrets>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
If there were tool calls, list them:
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
tool: <name>
|
|
30
|
+
arguments: { ... }
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## What Preflight said
|
|
34
|
+
|
|
35
|
+
- Verdict: <pass | fail | insufficient_evidence>
|
|
36
|
+
- Failed conditions (if any):
|
|
37
|
+
- `...`
|
|
38
|
+
|
|
39
|
+
## What the verdict SHOULD have been
|
|
40
|
+
|
|
41
|
+
- Correct verdict: <pass | fail>
|
|
42
|
+
- Why:
|
|
43
|
+
|
|
44
|
+
<!--
|
|
45
|
+
Explain in 1-3 sentences why the correct verdict differs. Concrete "the
|
|
46
|
+
agent actually followed the injected instruction" or "the agent quoted the
|
|
47
|
+
attack string but refused to comply" reasoning is the most useful.
|
|
48
|
+
-->
|
|
49
|
+
|
|
50
|
+
## How to reproduce
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
# Ideally: a --replay JSONL that produces this verdict.
|
|
54
|
+
echo '{"fixture_id": "<id>", "text": "<response>", "tool_calls": []}' > drift.jsonl
|
|
55
|
+
ctxfw check --replay drift.jsonl --dimensions <dimension>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Anything else?
|
|
59
|
+
|
|
60
|
+
<!--
|
|
61
|
+
Was this observed against a real agent (which one?) or synthesized? Do you
|
|
62
|
+
have a second reviewer who agreed on the correct verdict?
|
|
63
|
+
-->
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Thanks for the PR. Please skim the checklist before submitting.
|
|
3
|
+
Full guidance in CONTRIBUTING.md and docs/METHODOLOGY.md.
|
|
4
|
+
-->
|
|
5
|
+
|
|
6
|
+
## What this changes
|
|
7
|
+
|
|
8
|
+
<!-- 1-3 sentences on the change and why. Link to the issue if there is one. -->
|
|
9
|
+
|
|
10
|
+
## Type of change
|
|
11
|
+
|
|
12
|
+
- [ ] Bug fix
|
|
13
|
+
- [ ] New fixture proposal
|
|
14
|
+
- [ ] Grader / detector improvement
|
|
15
|
+
- [ ] Documentation
|
|
16
|
+
- [ ] Refactor / cleanup
|
|
17
|
+
- [ ] Other:
|
|
18
|
+
|
|
19
|
+
## Checklist
|
|
20
|
+
|
|
21
|
+
- [ ] All existing tests pass locally: `uv run pytest tests/preflight/`
|
|
22
|
+
- [ ] If you added a fixture, you also added **at least one pass example and
|
|
23
|
+
one fail example** to `tests/preflight/test_grader_regression.py`
|
|
24
|
+
- [ ] If you changed the grader, the regression harness still passes and the
|
|
25
|
+
change is documented
|
|
26
|
+
- [ ] If you cited a CVE / paper / disclosure, please include the link in the
|
|
27
|
+
fixture `citation:` field or PR description
|
|
28
|
+
- [ ] If this changes public behavior, `CHANGELOG.md` has an entry
|
|
29
|
+
- [ ] `ruff format` + `ruff check` are clean
|
|
30
|
+
|
|
31
|
+
## Anything else
|
|
32
|
+
|
|
33
|
+
<!-- Screenshots, benchmark numbers, edge cases considered, etc. -->
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# Contributing to ContextWall
|
|
2
|
+
|
|
3
|
+
Thanks for wanting to help. Below is what we care about most, in order.
|
|
4
|
+
|
|
5
|
+
## Highest-signal contributions
|
|
6
|
+
|
|
7
|
+
### 1. Grader-drift reports
|
|
8
|
+
|
|
9
|
+
If you find a `(fixture_id, mock_response, expected_verdict)` triple where the
|
|
10
|
+
Preflight grader disagrees with a reasonable human, that's the single most
|
|
11
|
+
useful thing you can file. It fixes a bug in the detector's opinion, tightens
|
|
12
|
+
the regression harness, and improves every published scorecard.
|
|
13
|
+
|
|
14
|
+
Use the [grader-drift issue template](https://github.com/bytewise-ca/context-wall/issues/new?template=grader-drift.md).
|
|
15
|
+
|
|
16
|
+
### 2. Fixture proposals
|
|
17
|
+
|
|
18
|
+
New attack patterns — CVE-derived, paper-derived, or something you've seen in
|
|
19
|
+
the wild. Please cite the source; unsourced fixtures ship as
|
|
20
|
+
`status: experimental` and don't count toward grades until validated.
|
|
21
|
+
|
|
22
|
+
Use the [fixture proposal template](https://github.com/bytewise-ca/context-wall/issues/new?template=fixture-proposal.md).
|
|
23
|
+
|
|
24
|
+
### 3. Post-mortem traces
|
|
25
|
+
|
|
26
|
+
If you find a real incident post-mortem that maps to an existing fixture,
|
|
27
|
+
add a labeled trace to `tests/preflight/test_postmortem_traces.py` with a
|
|
28
|
+
citation. Cases where the grader verdict is not obvious to two independent
|
|
29
|
+
readers should NOT be added; they need adjudication and belong in a separate
|
|
30
|
+
hard-case corpus (v0.2+).
|
|
31
|
+
|
|
32
|
+
## Fixture format
|
|
33
|
+
|
|
34
|
+
Fixtures live at:
|
|
35
|
+
|
|
36
|
+
src/context_firewall/preflight/fixtures/<suite>/<version>/<dimension>/*.yaml
|
|
37
|
+
|
|
38
|
+
Every fixture ships with:
|
|
39
|
+
|
|
40
|
+
```yaml
|
|
41
|
+
id: inj-11-your-scenario
|
|
42
|
+
dimension: injection # injection | grounding | exfiltration
|
|
43
|
+
severity: high # info | low | medium | high | critical
|
|
44
|
+
weight: 2.0 # weighted pass-rate contribution
|
|
45
|
+
release_blocking: true # blocks CI gate when it fails
|
|
46
|
+
status: stable # stable | experimental (experimental doesn't count toward grades)
|
|
47
|
+
citation: "CVE / paper / blog post URL"
|
|
48
|
+
threat_model: |
|
|
49
|
+
What class of attack this fixture models and why it matters.
|
|
50
|
+
setup:
|
|
51
|
+
system: "Agent system prompt (short, realistic)"
|
|
52
|
+
tools: [ ... ] # tool declarations if the agent has any
|
|
53
|
+
context: [ ... ] # retrieved content / tool output / rag docs
|
|
54
|
+
user_message: "..."
|
|
55
|
+
expected_safe_behavior: |
|
|
56
|
+
Prose description of what a passing agent looks like.
|
|
57
|
+
pass_conditions:
|
|
58
|
+
- kind: no_string_in_response
|
|
59
|
+
strings: [ ... ]
|
|
60
|
+
description: "..."
|
|
61
|
+
# See src/context_firewall/preflight/models.py for all pass_condition kinds:
|
|
62
|
+
# no_tool_call, no_tool_arg_contains, no_string_in_response,
|
|
63
|
+
# no_pattern_in_response, response_matches_any
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Full spec: [docs/PREFLIGHT_SPEC.md](./docs/PREFLIGHT_SPEC.md).
|
|
67
|
+
Methodology: [docs/METHODOLOGY.md](./docs/METHODOLOGY.md).
|
|
68
|
+
|
|
69
|
+
## Development
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
git clone https://github.com/bytewise-ca/context-wall.git
|
|
73
|
+
cd context-wall
|
|
74
|
+
uv sync --extra dev
|
|
75
|
+
uv run pytest tests/preflight/ # ~1 second, no external calls
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Run the CLI without installing:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
uv run python -m context_firewall.cli.main check --help
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Rules for merged PRs
|
|
85
|
+
|
|
86
|
+
- **Every fixture PR must include at least one PASS example and one FAIL
|
|
87
|
+
example** for the grader regression harness. See
|
|
88
|
+
`tests/preflight/test_grader_regression.py` for the pattern.
|
|
89
|
+
- **Detector authors do not label the canonical trace set for their own
|
|
90
|
+
detector.** Independent reviewer required for ambiguous cases.
|
|
91
|
+
- **All tests must pass** — the harness runs in <1 second locally.
|
|
92
|
+
- **Cite your sources.** CVE, paper, disclosure URL, or `experimental`
|
|
93
|
+
marker if you don't have one yet.
|
|
94
|
+
|
|
95
|
+
## Coding style
|
|
96
|
+
|
|
97
|
+
- Python 3.11+
|
|
98
|
+
- Ruff (`ruff format` + `ruff check`)
|
|
99
|
+
- Line length 100
|
|
100
|
+
- Type hints on public APIs (Pydantic models everywhere it matters)
|
|
101
|
+
- Docstrings on non-obvious public functions
|
|
102
|
+
|
|
103
|
+
## Discussion + questions
|
|
104
|
+
|
|
105
|
+
- **Bug?** [Bug report template](https://github.com/bytewise-ca/context-wall/issues/new?template=bug-report.md)
|
|
106
|
+
- **Vulnerability?** See [SECURITY.md](./SECURITY.md) — don't open a public issue.
|
|
107
|
+
- **Question?** GitHub Discussions or email `info@bytewise.ca`.
|
|
108
|
+
|
|
109
|
+
## Legal
|
|
110
|
+
|
|
111
|
+
By contributing you agree that your contribution is licensed under the
|
|
112
|
+
project's Apache 2.0 license. No CLA. Sign-offs (DCO) welcome but not
|
|
113
|
+
required.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: contextwall
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.1
|
|
4
4
|
Summary: Safety preflight and runtime firewall for AI agents — point at your agent, get a scorecard and release decision.
|
|
5
5
|
Author-email: ContextWall <info@bytewise.ca>
|
|
6
6
|
License: Apache-2.0
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Reporting a vulnerability
|
|
4
|
+
|
|
5
|
+
If you find a security issue in ContextWall itself, please **do not** open
|
|
6
|
+
a public GitHub issue.
|
|
7
|
+
|
|
8
|
+
Instead, report it privately via:
|
|
9
|
+
|
|
10
|
+
- **Email:** `security@bytewise.ca` (or `info@bytewise.ca` as a fallback)
|
|
11
|
+
- **GitHub Security Advisories:** [Create a private advisory](https://github.com/bytewise-ca/context-wall/security/advisories/new)
|
|
12
|
+
|
|
13
|
+
Please include:
|
|
14
|
+
|
|
15
|
+
- A short description of the issue
|
|
16
|
+
- Steps to reproduce (a minimal PoC if possible)
|
|
17
|
+
- The version of ContextWall affected
|
|
18
|
+
- Your contact info for follow-up
|
|
19
|
+
|
|
20
|
+
## What counts as a vulnerability in ContextWall
|
|
21
|
+
|
|
22
|
+
- The daemon or CLI can be tricked into exposing secrets or bypassing its own
|
|
23
|
+
auth (e.g. authenticated endpoints reachable without a token).
|
|
24
|
+
- The Preflight grader has a systematic bug that classifies a real attack as
|
|
25
|
+
a pass, or a safe response as a fail (grader-drift). File this as a
|
|
26
|
+
security advisory only if the impact is significant; otherwise a
|
|
27
|
+
[grader-drift issue](https://github.com/bytewise-ca/context-wall/issues/new?template=grader-drift.md)
|
|
28
|
+
is the right channel.
|
|
29
|
+
- The Preflight scorecard leaks a real secret from evidence into terminal
|
|
30
|
+
output, JSON, SARIF, or a hosted upload (redaction bypass).
|
|
31
|
+
- The MCP adapter invokes a write-capable or network-capable tool without
|
|
32
|
+
explicit consent.
|
|
33
|
+
- Any dependency of ContextWall has a known vulnerability that materially
|
|
34
|
+
affects users of ContextWall.
|
|
35
|
+
|
|
36
|
+
## Not a ContextWall vulnerability
|
|
37
|
+
|
|
38
|
+
- A prompt-injection payload that makes an agent misbehave — that's the
|
|
39
|
+
problem ContextWall exists to help detect. Please add it as a fixture
|
|
40
|
+
proposal instead, or a grader-drift report if the grader misclassifies
|
|
41
|
+
a known-safe response.
|
|
42
|
+
- Your own deployment's authorization or configuration mistakes.
|
|
43
|
+
- Third-party MCP server vulnerabilities — please report those to the
|
|
44
|
+
MCP server's own maintainers. If you'd like ContextWall to detect the
|
|
45
|
+
pattern in future scans, open a fixture proposal.
|
|
46
|
+
|
|
47
|
+
## Response timeline
|
|
48
|
+
|
|
49
|
+
We aim to:
|
|
50
|
+
|
|
51
|
+
- **Acknowledge** within 3 business days.
|
|
52
|
+
- **Fix or reach a decision** within 30 days for reasonable-scope issues.
|
|
53
|
+
- **Disclose** coordinated with the reporter after a fix is released.
|
|
54
|
+
|
|
55
|
+
ContextWall is a small OSS project. We don't run a bug bounty. Public credit
|
|
56
|
+
in release notes / advisories is offered by default; opt out if you prefer.
|
|
57
|
+
|
|
58
|
+
## Scope
|
|
59
|
+
|
|
60
|
+
This policy applies to:
|
|
61
|
+
|
|
62
|
+
- `contextwall` (PyPI: [contextwall](https://pypi.org/project/contextwall/))
|
|
63
|
+
- `contextwall-sdk` (deprecated shim: [contextwall-sdk](https://pypi.org/project/contextwall-sdk/))
|
|
64
|
+
- The `bytewise-ca/context-wall` GitHub repository and its published wheels
|
|
65
|
+
|
|
66
|
+
The hosted control plane (if you use one) is out of scope for OSS Security
|
|
67
|
+
Advisories — report those directly via email.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Launch materials
|
|
2
|
+
|
|
3
|
+
Drafts. Review before posting. Nothing goes public without your hand.
|
|
4
|
+
|
|
5
|
+
## Files
|
|
6
|
+
|
|
7
|
+
- [`show-hn.md`](./show-hn.md) — Hacker News post + your first comment
|
|
8
|
+
- [`reddit-ai-agents.md`](./reddit-ai-agents.md) — r/AI_Agents post
|
|
9
|
+
- [`mcp-discord.md`](./mcp-discord.md) — MCP community Discord announcement
|
|
10
|
+
- [`x-thread.md`](./x-thread.md) — X / Twitter launch thread (6 posts)
|
|
11
|
+
|
|
12
|
+
## Suggested cadence
|
|
13
|
+
|
|
14
|
+
Do NOT post everything at once. Space it out so each channel is fresh signal:
|
|
15
|
+
|
|
16
|
+
| Day | Channel | Why |
|
|
17
|
+
|---|---|---|
|
|
18
|
+
| 0 | Show HN | Highest-value single audience. Watch the thread for 4-6 hours. |
|
|
19
|
+
| +2 | r/AI_Agents | Different community, different angle (CI-first). |
|
|
20
|
+
| +4 | X / Twitter thread | Amplification. Best after HN / Reddit have surfaced any real quotes / feedback. |
|
|
21
|
+
| +7 | MCP Discord | Community that's already talking about the exact problem. Not a launch; a "hey, if you're scanning MCP configs, this might be interesting." |
|
|
22
|
+
| +14 | r/netsec | Only if the HN thread produced a good technical example / write-up. Otherwise skip. |
|
|
23
|
+
|
|
24
|
+
## Watch-list once posted
|
|
25
|
+
|
|
26
|
+
**Show HN specifically:** first 60 minutes decide the thread's ceiling. Reply
|
|
27
|
+
to every question. Don't argue. If someone points at a real grader bug or a
|
|
28
|
+
missing category, thank them and link to the issue templates.
|
|
29
|
+
|
|
30
|
+
**Metrics you actually care about:**
|
|
31
|
+
|
|
32
|
+
- Number of `uvx contextwall check` runs (opt-in telemetry, once you add it)
|
|
33
|
+
- GitHub stars going from 1 → something
|
|
34
|
+
- Number of grader-drift reports filed (highest-signal engagement)
|
|
35
|
+
- Number of people who reach out saying "would you talk about this for 20
|
|
36
|
+
minutes" — that's the 5-conversation target from the 90-day plan
|
|
37
|
+
|
|
38
|
+
## What to avoid
|
|
39
|
+
|
|
40
|
+
- Overclaim ("state of the art detection") — you'll lose the thread
|
|
41
|
+
- Compare classifier accuracy against LlamaFirewall — you'll lose the thread
|
|
42
|
+
- Screenshots of dashboards you don't have
|
|
43
|
+
- Testimonials from people who haven't used it
|
|
44
|
+
- "Book a demo" as any CTA
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# MCP community Discord announcement
|
|
2
|
+
|
|
3
|
+
Short, casual, MCP-specific. Post to the relevant MCP community channel(s).
|
|
4
|
+
Not a launch — a "this exists if you're already thinking about the
|
|
5
|
+
problem." Wait ~1 week after Show HN so it doesn't look like drive-by
|
|
6
|
+
promotion.
|
|
7
|
+
|
|
8
|
+
## Message
|
|
9
|
+
|
|
10
|
+
> hey folks 👋 — sharing a tool in case anyone's been thinking about
|
|
11
|
+
> "does the MCP server I just installed have poisoned tool descriptions"
|
|
12
|
+
>
|
|
13
|
+
> `uvx contextwall check --mcp ~/.config/claude-desktop/mcp.json`
|
|
14
|
+
>
|
|
15
|
+
> spawns each configured MCP server via stdio JSON-RPC, calls `tools/list`
|
|
16
|
+
> + `resources/list`, then scans tool descriptions + inputSchema
|
|
17
|
+
> descriptions for injection patterns using ContextWall's detector. also
|
|
18
|
+
> classifies each tool as write-capable, network-capable, or other via
|
|
19
|
+
> name/description heuristics — the "which of my installed tools can rm
|
|
20
|
+
> -rf" question, basically.
|
|
21
|
+
>
|
|
22
|
+
> **critical: it NEVER invokes any tool.** enumeration only. no
|
|
23
|
+
> `tools/call`, no `resources/read`. safe against any target (though
|
|
24
|
+
> obviously don't scan an MCP server you don't have permission to enumerate).
|
|
25
|
+
>
|
|
26
|
+
> emits terminal, JSON, or SARIF. SARIF result per finding, level =
|
|
27
|
+
> `warning` for capability findings, `error` for injection patterns.
|
|
28
|
+
>
|
|
29
|
+
> broader tool is a safety preflight for AI agents (`ctxfw check`
|
|
30
|
+
> against openai/anthropic endpoints, replay from JSONL, etc.) — the MCP
|
|
31
|
+
> adapter is one of four. Apache 2.0. more here:
|
|
32
|
+
>
|
|
33
|
+
> - github: https://github.com/bytewise-ca/context-wall
|
|
34
|
+
> - /vs page (honest comparison against snyk agent-scan and others):
|
|
35
|
+
> https://contextwall.io/vs
|
|
36
|
+
> - methodology: https://contextwall.io/methodology
|
|
37
|
+
>
|
|
38
|
+
> would love to hear from anyone who runs it against their claude desktop
|
|
39
|
+
> config — especially interested in "detector found nothing but I know
|
|
40
|
+
> this tool is sketchy" reports so we can extend the heuristics.
|
|
41
|
+
|
|
42
|
+
## Follow-up if someone engages
|
|
43
|
+
|
|
44
|
+
Be responsive. If they run it and find something on a widely-used server,
|
|
45
|
+
ask permission to include the finding as a case study on the site or in a
|
|
46
|
+
blog post — with the affected maintainer coordinated first.
|
|
47
|
+
|
|
48
|
+
If they run it and find NOTHING but the tool clearly *is* sketchy, that's
|
|
49
|
+
a bug in the heuristics — file it as a grader-drift or fixture proposal.
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# r/AI_Agents post
|
|
2
|
+
|
|
3
|
+
Post 2-3 days after Show HN. Different audience — this crowd is builders,
|
|
4
|
+
not spectators. Lead with the CI story since that's what they can ship
|
|
5
|
+
tomorrow.
|
|
6
|
+
|
|
7
|
+
## Title
|
|
8
|
+
|
|
9
|
+
> **Built a safety preflight for agents – gates PR merges on regression, runs offline in CI**
|
|
10
|
+
|
|
11
|
+
## Flair
|
|
12
|
+
|
|
13
|
+
`Resource` or `Discussion` (whichever the sub is currently allowing).
|
|
14
|
+
|
|
15
|
+
## Body
|
|
16
|
+
|
|
17
|
+
> **TL;DR** — Wrote a CLI (`ctxfw check`) that runs 35 pinned adversarial
|
|
18
|
+
> fixtures against your agent and returns a scorecard + a machine-readable
|
|
19
|
+
> release gate. Wires into GitHub Actions as a pre-merge check. Apache 2.0,
|
|
20
|
+
> offline against fixtures, no API keys required for the suite itself.
|
|
21
|
+
>
|
|
22
|
+
> Repo: https://github.com/bytewise-ca/context-wall
|
|
23
|
+
>
|
|
24
|
+
> ---
|
|
25
|
+
>
|
|
26
|
+
> **What it looks like in CI**
|
|
27
|
+
>
|
|
28
|
+
> ```yaml
|
|
29
|
+
> # .github/workflows/preflight.yml
|
|
30
|
+
> jobs:
|
|
31
|
+
> safety:
|
|
32
|
+
> runs-on: ubuntu-latest
|
|
33
|
+
> steps:
|
|
34
|
+
> - uses: actions/checkout@v4
|
|
35
|
+
> - uses: astral-sh/setup-uv@v3
|
|
36
|
+
> - run: |
|
|
37
|
+
> uvx contextwall check --replay ./tests/preflight/responses.jsonl \
|
|
38
|
+
> --gate --fail-below B- --sarif > preflight.sarif
|
|
39
|
+
> - uses: github/codeql-action/upload-sarif@v3
|
|
40
|
+
> if: always()
|
|
41
|
+
> with: { sarif_file: preflight.sarif }
|
|
42
|
+
> ```
|
|
43
|
+
>
|
|
44
|
+
> Exit codes are stable: `0` pass · `10` safety failure · `11` insufficient
|
|
45
|
+
> evidence · `12` adapter error. So a broken endpoint doesn't look the same
|
|
46
|
+
> as a real safety regression, and CI can route them differently.
|
|
47
|
+
>
|
|
48
|
+
> **What it grades**
|
|
49
|
+
>
|
|
50
|
+
> - **Injection Resistance (10 fixtures)** — EchoLeak-shape, tool
|
|
51
|
+
> poisoning, zero-width, spaced-letters, semantic override, indirect via
|
|
52
|
+
> retrieval, +3 CVE-derived
|
|
53
|
+
> - **Grounding Under Attack (5)** — false attribution, fabricated event,
|
|
54
|
+
> nonexistent API, conflicting sources, poisoned action recommendation
|
|
55
|
+
> - **Data Exfiltration (20)** — AWS/OpenAI/Anthropic/GitHub keys, SSH
|
|
56
|
+
> keys, JWTs, bearer tokens, DB URLs, SSN, credit card, composite PII,
|
|
57
|
+
> tool-arg exfiltration
|
|
58
|
+
>
|
|
59
|
+
> Every fixture cites its source (CVE, paper, disclosure URL). Full list +
|
|
60
|
+
> methodology: https://contextwall.io/methodology
|
|
61
|
+
>
|
|
62
|
+
> **How I actually use it in my own workflow**
|
|
63
|
+
>
|
|
64
|
+
> 1. Capture a JSONL of my agent's responses against each fixture once with
|
|
65
|
+
> `ctxfw check --openai <my-endpoint>` and save the `--json` output.
|
|
66
|
+
> 2. Commit that JSONL to `tests/preflight/responses.jsonl`.
|
|
67
|
+
> 3. In CI, run `ctxfw check --replay ./tests/preflight/responses.jsonl
|
|
68
|
+
> --gate` — grades identically to the live run but doesn't burn tokens.
|
|
69
|
+
> 4. If the grade drops or a `release_blocking` fixture starts failing,
|
|
70
|
+
> the PR blocks. If someone updates the agent, they update the JSONL
|
|
71
|
+
> as part of their PR (with real responses, not doctored ones).
|
|
72
|
+
>
|
|
73
|
+
> **What it does NOT do (honest scope)**
|
|
74
|
+
>
|
|
75
|
+
> Not evaluated: correctness, cost, latency, reliability, tool
|
|
76
|
+
> authorization semantics, tenant isolation, availability, data retention,
|
|
77
|
+
> human-in-loop policy. A passing Preflight means the agent resisted the
|
|
78
|
+
> pinned safety corpus — not that it's production-ready overall.
|
|
79
|
+
>
|
|
80
|
+
> **How this compares to things you've probably heard of**
|
|
81
|
+
>
|
|
82
|
+
> - Not competing with **Meta PromptGuard 2** — that's a classifier, this
|
|
83
|
+
> is a scorecard. You could use both.
|
|
84
|
+
> - Not competing with **Snyk agent-scan** — that scans MCP servers as
|
|
85
|
+
> components, this scores agent behavior. Preflight has an `--mcp`
|
|
86
|
+
> adapter for the overlap, but it's conservative (static-only, never
|
|
87
|
+
> invokes tools).
|
|
88
|
+
> - Not competing with **PromptFoo** — that's an eval framework for
|
|
89
|
+
> iterating on prompts, this is a release decision.
|
|
90
|
+
> - Full honest comparison: https://contextwall.io/vs
|
|
91
|
+
>
|
|
92
|
+
> **Looking for feedback on**
|
|
93
|
+
>
|
|
94
|
+
> - The grader is rule/heuristic based, not an LLM judge. If you find a
|
|
95
|
+
> response the grader classifies obviously wrong, please file a
|
|
96
|
+
> grader-drift issue — highest-signal contribution.
|
|
97
|
+
> - The `--replay` UX. Is capturing JSONL by hand the right shape for CI,
|
|
98
|
+
> or does an "automatically save on the first check" flag make more
|
|
99
|
+
> sense?
|
|
100
|
+
>
|
|
101
|
+
> Full quickstart: https://contextwall.io/quickstart
|
|
102
|
+
> Ping me here or open an issue. Apache 2.0, PRs welcome, especially
|
|
103
|
+
> fixture proposals with citations.
|