contextwall 0.1.5__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.1.5 → contextwall-0.2.1}/CHANGELOG.md +46 -0
- contextwall-0.2.1/CONTRIBUTING.md +113 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/PKG-INFO +23 -2
- {contextwall-0.1.5 → contextwall-0.2.1}/README.md +13 -1
- contextwall-0.2.1/RELEASE_NOTES_v0.2.0.md +70 -0
- 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.1.5 → contextwall-0.2.1}/pyproject.toml +11 -1
- contextwall-0.2.1/sdk/python/README.md +30 -0
- contextwall-0.2.1/sdk/python/pyproject.toml +42 -0
- contextwall-0.2.1/sdk/python/src/contextwall_sdk/__init__.py +50 -0
- contextwall-0.2.1/src/context_firewall/sdk/__init__.py +84 -0
- contextwall-0.1.5/sdk/python/README.md +0 -48
- contextwall-0.1.5/sdk/python/pyproject.toml +0 -39
- contextwall-0.1.5/sdk/python/src/contextwall_sdk/__init__.py +0 -68
- {contextwall-0.1.5 → contextwall-0.2.1}/.dockerignore +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/.env.example +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/.github/workflows/docker.yml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/.gitignore +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/Dockerfile +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/LICENSE +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/RELEASE_NOTES_v0.1.5.md +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/ctxfw.oss.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/ctxfw.yaml.example +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/demo/.env.example +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/demo/ATTACKS.md +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/demo/Dockerfile.agent +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/demo/Dockerfile.cre +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/demo/Dockerfile.simulator +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/demo/Makefile +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/demo/README.md +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/demo/TESTING.md +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/demo/agent/brave_search.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/demo/agent/cre_client.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/demo/agent/main.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/demo/agent/requirements.txt +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/demo/agent/scenarios.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/demo/ctxfw.demo.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/demo/dashboard/index.html +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/demo/docker-compose.yml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/demo/simulator/main.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/demo/simulator/requirements.txt +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/docker-compose.yml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/docs/METHODOLOGY.md +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/docs/PREFLIGHT_SPEC.md +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/policy/packs/fedramp.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/policy/packs/hipaa.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/policy/packs/soc2.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/publish-pypi.sh +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/sdk/python/tests/test_sdk.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/__init__.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/_compat.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/api/__init__.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/api/app.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/api/models.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/classifier/__init__.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/classifier/classifier.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/cli/__init__.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/cli/main.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/compliance/__init__.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/compliance/baa.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/compliance/chain.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/compliance/control_mappings.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/compliance/export.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/compliance/keys.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/config.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/control_plane/__init__.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/control_plane/pusher.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/daemon/__init__.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/daemon/main.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/db/__init__.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/db/connection.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/db/migrations.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/mcp/__init__.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/mcp/server.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/metrics.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/models.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/policy/__init__.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/policy/detectors/__init__.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/policy/detectors/injection.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/policy/detectors/patterns.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/policy/engine.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/__init__.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/adapters/__init__.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/adapters/anthropic.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/adapters/mcp_static.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/adapters/openai.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/adapters/replay.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/cli.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-01-aws-access-key.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-02-aws-secret-key.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-03-openai-api-key.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-04-anthropic-api-key.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-05-github-pat.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-06-jwt-token.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-07-bearer-token.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-08-ssh-private-key.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-09-database-url-with-password.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-10-multi-secret-payload.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-11-ssn.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-12-credit-card.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-13-phone-number.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-14-composite-pii-medical.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-15-multi-pii-form.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-16-address-in-narrative.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-17-passport-number.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-18-driver-license.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-19-secret-in-tool-output.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-20-secret-via-http-tool.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/grounding/gnd-01-false-attribution.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/grounding/gnd-02-fake-historical-event.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/grounding/gnd-03-nonexistent-api.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/grounding/gnd-04-conflicting-sources.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/grounding/gnd-05-poisoned-action-recommendation.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/injection/inj-01-echoleak-shape.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/injection/inj-02-poisoned-rag.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/injection/inj-03-zero-width.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/injection/inj-04-spaced-letters.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/injection/inj-05-semantic-override.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/injection/inj-06-indirect-via-retrieval.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/injection/inj-07-tool-poisoning.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/injection/inj-08-aws-q-style.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/injection/inj-09-github-mcp-exfil.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/injection/inj-10-ci-title-injection.yaml +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/grade.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/grader/__init__.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/grader/grader.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/models.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/policy.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/redact.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/report/__init__.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/report/json_out.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/report/sarif.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/report/terminal.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/suite.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/transport.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/provenance/__init__.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/provenance/engine.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/provenance/models.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/proxy/__init__.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/proxy/router.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/proxy/scanner.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/proxy/tokens.py +0 -0
- {contextwall-0.1.5/sdk/python/src/contextwall_sdk → contextwall-0.2.1/src/context_firewall/sdk}/_anthropic.py +0 -0
- {contextwall-0.1.5/sdk/python/src/contextwall_sdk → contextwall-0.2.1/src/context_firewall/sdk}/_compat.py +0 -0
- {contextwall-0.1.5/sdk/python/src/contextwall_sdk → contextwall-0.2.1/src/context_firewall/sdk}/_openai.py +0 -0
- {contextwall-0.1.5/sdk/python/src/contextwall_sdk → contextwall-0.2.1/src/context_firewall/sdk}/client.py +0 -0
- {contextwall-0.1.5/sdk/python/src/contextwall_sdk → contextwall-0.2.1/src/context_firewall/sdk}/exceptions.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/source/__init__.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/source/registry.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/source/types.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/synthesizer/__init__.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/synthesizer/synthesizer.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/trust/__init__.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/trust/engine.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/trust/signals.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/tests/preflight/__init__.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/tests/preflight/test_grader_regression.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/tests/preflight/test_mcp_static.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/tests/preflight/test_policy_reporters_redaction.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/tests/preflight/test_postmortem_traces.py +0 -0
- {contextwall-0.1.5 → contextwall-0.2.1}/tests/preflight/test_replay_adapter.py +0 -0
- {contextwall-0.1.5 → 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. -->
|
|
@@ -4,6 +4,52 @@ All notable changes to ContextWall are recorded here. Format follows
|
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and this project
|
|
5
5
|
adheres to [SemVer](https://semver.org/spec/v2.0.0.html).
|
|
6
6
|
|
|
7
|
+
## [0.2.0] — 2026-09
|
|
8
|
+
|
|
9
|
+
The **consolidation** release. The SDK now ships inside the main `contextwall`
|
|
10
|
+
package as `context_firewall.sdk`. The separate `contextwall-sdk` package becomes
|
|
11
|
+
a thin deprecation shim that installs `contextwall>=0.2.0` and re-exports
|
|
12
|
+
from the new location.
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
|
|
16
|
+
- **`context_firewall.sdk` submodule** — hosts `SafeAnthropic`, `AsyncSafeAnthropic`,
|
|
17
|
+
`SafeOpenAI`, `AsyncSafeOpenAI`, `ContextWallClient`, `AsyncContextWallClient`,
|
|
18
|
+
and all response models. Same class contracts and method signatures as the
|
|
19
|
+
old `contextwall_sdk` package.
|
|
20
|
+
- **Optional extras** on the main package for provider SDKs:
|
|
21
|
+
- `pip install "contextwall[anthropic]"` — anthropic>=0.25
|
|
22
|
+
- `pip install "contextwall[openai]"` — openai>=1.0
|
|
23
|
+
- `pip install "contextwall[all]"` — both
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
|
|
27
|
+
- **`contextwall-sdk` bumped to 0.2.0 as a deprecation shim.** Depends on
|
|
28
|
+
`contextwall>=0.2.0` plus both provider SDKs (matches the old
|
|
29
|
+
`contextwall-sdk[all]` behavior so pinned installs keep working). Emits a
|
|
30
|
+
`DeprecationWarning` on import. Will be removed in v0.4.
|
|
31
|
+
|
|
32
|
+
### Migration
|
|
33
|
+
|
|
34
|
+
```diff
|
|
35
|
+
- pip install contextwall-sdk[all]
|
|
36
|
+
+ pip install "contextwall[all]"
|
|
37
|
+
|
|
38
|
+
- from contextwall_sdk import SafeAnthropic
|
|
39
|
+
+ from context_firewall.sdk import SafeAnthropic
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Nothing about class contracts changed — only the import path and the extras
|
|
43
|
+
name.
|
|
44
|
+
|
|
45
|
+
### Why
|
|
46
|
+
|
|
47
|
+
The split between `contextwall` and `contextwall-sdk` caused version drift
|
|
48
|
+
(main went to 0.1.5, SDK stayed at 0.1.4 in the previous release) and
|
|
49
|
+
doubled the release surface. Single-package is the pattern most successful
|
|
50
|
+
OSS security tools follow (openai, anthropic, snyk agent-scan, semgrep,
|
|
51
|
+
trivy). See [contextwall.io/vs](https://contextwall.io/vs) for context.
|
|
52
|
+
|
|
7
53
|
## [0.1.5] — 2026-08
|
|
8
54
|
|
|
9
55
|
The **Preflight** release. Introduces the `ctxfw check` subcommand — a safety
|
|
@@ -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.1
|
|
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
|
|
@@ -24,11 +24,20 @@ Requires-Dist: rapidfuzz>=3.0
|
|
|
24
24
|
Requires-Dist: rich>=13.0
|
|
25
25
|
Requires-Dist: uvicorn[standard]>=0.27
|
|
26
26
|
Requires-Dist: watchdog>=3.0
|
|
27
|
+
Provides-Extra: all
|
|
28
|
+
Requires-Dist: anthropic>=0.25; extra == 'all'
|
|
29
|
+
Requires-Dist: openai>=1.0; extra == 'all'
|
|
30
|
+
Provides-Extra: anthropic
|
|
31
|
+
Requires-Dist: anthropic>=0.25; extra == 'anthropic'
|
|
27
32
|
Provides-Extra: dev
|
|
33
|
+
Requires-Dist: anthropic>=0.25; extra == 'dev'
|
|
28
34
|
Requires-Dist: httpx>=0.27; extra == 'dev'
|
|
35
|
+
Requires-Dist: openai>=1.0; extra == 'dev'
|
|
29
36
|
Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
|
|
30
37
|
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
31
38
|
Requires-Dist: ruff>=0.4; extra == 'dev'
|
|
39
|
+
Provides-Extra: openai
|
|
40
|
+
Requires-Dist: openai>=1.0; extra == 'openai'
|
|
32
41
|
Description-Content-Type: text/markdown
|
|
33
42
|
|
|
34
43
|
# ContextWall
|
|
@@ -81,9 +90,21 @@ uvx contextwall check --help
|
|
|
81
90
|
**Install into your env:**
|
|
82
91
|
|
|
83
92
|
```bash
|
|
84
|
-
pip install contextwall
|
|
93
|
+
pip install contextwall # CLI + Preflight + detectors + daemon
|
|
94
|
+
pip install "contextwall[anthropic]" # + SafeAnthropic wrapper
|
|
95
|
+
pip install "contextwall[openai]" # + SafeOpenAI wrapper (works with vLLM, Ollama, Mistral, ...)
|
|
96
|
+
pip install "contextwall[all]" # everything
|
|
85
97
|
```
|
|
86
98
|
|
|
99
|
+
The client SDK ships as a submodule:
|
|
100
|
+
|
|
101
|
+
```python
|
|
102
|
+
from context_firewall.sdk import SafeAnthropic, ContextWallBlockedError
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Users of the old `contextwall-sdk` package: keep working via a deprecation
|
|
106
|
+
shim (import from `context_firewall.sdk` when convenient).
|
|
107
|
+
|
|
87
108
|
**Point at your agent — four adapters:**
|
|
88
109
|
|
|
89
110
|
| Flag | For | Assessment mode |
|
|
@@ -48,9 +48,21 @@ uvx contextwall check --help
|
|
|
48
48
|
**Install into your env:**
|
|
49
49
|
|
|
50
50
|
```bash
|
|
51
|
-
pip install contextwall
|
|
51
|
+
pip install contextwall # CLI + Preflight + detectors + daemon
|
|
52
|
+
pip install "contextwall[anthropic]" # + SafeAnthropic wrapper
|
|
53
|
+
pip install "contextwall[openai]" # + SafeOpenAI wrapper (works with vLLM, Ollama, Mistral, ...)
|
|
54
|
+
pip install "contextwall[all]" # everything
|
|
52
55
|
```
|
|
53
56
|
|
|
57
|
+
The client SDK ships as a submodule:
|
|
58
|
+
|
|
59
|
+
```python
|
|
60
|
+
from context_firewall.sdk import SafeAnthropic, ContextWallBlockedError
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Users of the old `contextwall-sdk` package: keep working via a deprecation
|
|
64
|
+
shim (import from `context_firewall.sdk` when convenient).
|
|
65
|
+
|
|
54
66
|
**Point at your agent — four adapters:**
|
|
55
67
|
|
|
56
68
|
| Flag | For | Assessment mode |
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# ContextWall v0.2.0 — SDK consolidation
|
|
2
|
+
|
|
3
|
+
Small but structurally important release. **The SDK now lives inside the
|
|
4
|
+
main `contextwall` package** as `context_firewall.sdk`. The old `contextwall-sdk`
|
|
5
|
+
package continues to work as a deprecation shim.
|
|
6
|
+
|
|
7
|
+
## What changed
|
|
8
|
+
|
|
9
|
+
- **One package, one release story.** `context_firewall.sdk` is the new home
|
|
10
|
+
for `SafeAnthropic`, `SafeOpenAI`, `ContextWallClient`, and all response
|
|
11
|
+
models. Same class contracts as before.
|
|
12
|
+
- **Note on naming:** the PyPI package is named `contextwall` (no separator);
|
|
13
|
+
the Python module has always been `context_firewall` (with underscore).
|
|
14
|
+
So: `pip install contextwall` and `import context_firewall`. The old
|
|
15
|
+
`contextwall-sdk` package continues to install as `contextwall_sdk` (the
|
|
16
|
+
shim).
|
|
17
|
+
- **Optional extras** for the provider SDKs:
|
|
18
|
+
- `pip install "contextwall[anthropic]"`
|
|
19
|
+
- `pip install "contextwall[openai]"`
|
|
20
|
+
- `pip install "contextwall[all]"`
|
|
21
|
+
- **`contextwall-sdk` 0.2.0** is now a thin shim that installs the main
|
|
22
|
+
package and re-exports from `context_firewall.sdk` with a `DeprecationWarning`.
|
|
23
|
+
It will be removed in v0.4.
|
|
24
|
+
|
|
25
|
+
## Migration
|
|
26
|
+
|
|
27
|
+
```diff
|
|
28
|
+
- pip install contextwall-sdk[all]
|
|
29
|
+
+ pip install "contextwall[all]"
|
|
30
|
+
|
|
31
|
+
- from contextwall_sdk import SafeAnthropic
|
|
32
|
+
+ from context_firewall.sdk import SafeAnthropic
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Nothing about behavior changed — only the import path and the extras name.
|
|
36
|
+
If you don't migrate, the shim keeps working; you'll see a one-time
|
|
37
|
+
`DeprecationWarning` and can silence it after the migration.
|
|
38
|
+
|
|
39
|
+
## Why
|
|
40
|
+
|
|
41
|
+
The old `contextwall` / `contextwall-sdk` split caused two real problems:
|
|
42
|
+
|
|
43
|
+
1. **Version drift.** v0.1.5 shipped only for the main package; the SDK
|
|
44
|
+
stayed at 0.1.4. Users didn't know which pair to install.
|
|
45
|
+
2. **Doubled release surface.** Every release meant two publishes, two
|
|
46
|
+
changelogs, two READMEs to keep in sync.
|
|
47
|
+
|
|
48
|
+
Single-package is the pattern most successful OSS security tools follow
|
|
49
|
+
(openai, anthropic, snyk agent-scan, semgrep, trivy). The provider-SDK
|
|
50
|
+
weight concern that motivated the split originally is now handled cleanly
|
|
51
|
+
by optional extras.
|
|
52
|
+
|
|
53
|
+
## Publish sequence
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
# Main package
|
|
57
|
+
cd /Users/punakkals/work/context-wall
|
|
58
|
+
uv build && uv publish
|
|
59
|
+
|
|
60
|
+
# Shim package
|
|
61
|
+
cd sdk/python
|
|
62
|
+
uv build && uv publish
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## Deferred
|
|
66
|
+
|
|
67
|
+
- **Removal of `contextwall-sdk`** — v0.4, per the deprecation notice.
|
|
68
|
+
- **`contextwall_sdk._anthropic` / `contextwall_sdk._openai` etc.** — those
|
|
69
|
+
private submodules are gone from the shim. If anyone was importing from
|
|
70
|
+
them directly (undocumented), they'll need to update to `context_firewall.sdk`.
|
|
@@ -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
|