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.
Files changed (172) hide show
  1. contextwall-0.2.1/.github/ISSUE_TEMPLATE/bug-report.md +39 -0
  2. contextwall-0.2.1/.github/ISSUE_TEMPLATE/config.yml +8 -0
  3. contextwall-0.2.1/.github/ISSUE_TEMPLATE/fixture-proposal.md +70 -0
  4. contextwall-0.2.1/.github/ISSUE_TEMPLATE/grader-drift.md +63 -0
  5. contextwall-0.2.1/.github/PULL_REQUEST_TEMPLATE.md +33 -0
  6. {contextwall-0.1.5 → contextwall-0.2.1}/CHANGELOG.md +46 -0
  7. contextwall-0.2.1/CONTRIBUTING.md +113 -0
  8. {contextwall-0.1.5 → contextwall-0.2.1}/PKG-INFO +23 -2
  9. {contextwall-0.1.5 → contextwall-0.2.1}/README.md +13 -1
  10. contextwall-0.2.1/RELEASE_NOTES_v0.2.0.md +70 -0
  11. contextwall-0.2.1/SECURITY.md +67 -0
  12. contextwall-0.2.1/launch/README.md +44 -0
  13. contextwall-0.2.1/launch/mcp-discord.md +49 -0
  14. contextwall-0.2.1/launch/reddit-ai-agents.md +103 -0
  15. contextwall-0.2.1/launch/show-hn.md +169 -0
  16. contextwall-0.2.1/launch/x-thread.md +118 -0
  17. {contextwall-0.1.5 → contextwall-0.2.1}/pyproject.toml +11 -1
  18. contextwall-0.2.1/sdk/python/README.md +30 -0
  19. contextwall-0.2.1/sdk/python/pyproject.toml +42 -0
  20. contextwall-0.2.1/sdk/python/src/contextwall_sdk/__init__.py +50 -0
  21. contextwall-0.2.1/src/context_firewall/sdk/__init__.py +84 -0
  22. contextwall-0.1.5/sdk/python/README.md +0 -48
  23. contextwall-0.1.5/sdk/python/pyproject.toml +0 -39
  24. contextwall-0.1.5/sdk/python/src/contextwall_sdk/__init__.py +0 -68
  25. {contextwall-0.1.5 → contextwall-0.2.1}/.dockerignore +0 -0
  26. {contextwall-0.1.5 → contextwall-0.2.1}/.env.example +0 -0
  27. {contextwall-0.1.5 → contextwall-0.2.1}/.github/workflows/docker.yml +0 -0
  28. {contextwall-0.1.5 → contextwall-0.2.1}/.gitignore +0 -0
  29. {contextwall-0.1.5 → contextwall-0.2.1}/Dockerfile +0 -0
  30. {contextwall-0.1.5 → contextwall-0.2.1}/LICENSE +0 -0
  31. {contextwall-0.1.5 → contextwall-0.2.1}/RELEASE_NOTES_v0.1.5.md +0 -0
  32. {contextwall-0.1.5 → contextwall-0.2.1}/ctxfw.oss.yaml +0 -0
  33. {contextwall-0.1.5 → contextwall-0.2.1}/ctxfw.yaml.example +0 -0
  34. {contextwall-0.1.5 → contextwall-0.2.1}/demo/.env.example +0 -0
  35. {contextwall-0.1.5 → contextwall-0.2.1}/demo/ATTACKS.md +0 -0
  36. {contextwall-0.1.5 → contextwall-0.2.1}/demo/Dockerfile.agent +0 -0
  37. {contextwall-0.1.5 → contextwall-0.2.1}/demo/Dockerfile.cre +0 -0
  38. {contextwall-0.1.5 → contextwall-0.2.1}/demo/Dockerfile.simulator +0 -0
  39. {contextwall-0.1.5 → contextwall-0.2.1}/demo/Makefile +0 -0
  40. {contextwall-0.1.5 → contextwall-0.2.1}/demo/README.md +0 -0
  41. {contextwall-0.1.5 → contextwall-0.2.1}/demo/TESTING.md +0 -0
  42. {contextwall-0.1.5 → contextwall-0.2.1}/demo/agent/brave_search.py +0 -0
  43. {contextwall-0.1.5 → contextwall-0.2.1}/demo/agent/cre_client.py +0 -0
  44. {contextwall-0.1.5 → contextwall-0.2.1}/demo/agent/main.py +0 -0
  45. {contextwall-0.1.5 → contextwall-0.2.1}/demo/agent/requirements.txt +0 -0
  46. {contextwall-0.1.5 → contextwall-0.2.1}/demo/agent/scenarios.py +0 -0
  47. {contextwall-0.1.5 → contextwall-0.2.1}/demo/ctxfw.demo.yaml +0 -0
  48. {contextwall-0.1.5 → contextwall-0.2.1}/demo/dashboard/index.html +0 -0
  49. {contextwall-0.1.5 → contextwall-0.2.1}/demo/docker-compose.yml +0 -0
  50. {contextwall-0.1.5 → contextwall-0.2.1}/demo/simulator/main.py +0 -0
  51. {contextwall-0.1.5 → contextwall-0.2.1}/demo/simulator/requirements.txt +0 -0
  52. {contextwall-0.1.5 → contextwall-0.2.1}/docker-compose.yml +0 -0
  53. {contextwall-0.1.5 → contextwall-0.2.1}/docs/METHODOLOGY.md +0 -0
  54. {contextwall-0.1.5 → contextwall-0.2.1}/docs/PREFLIGHT_SPEC.md +0 -0
  55. {contextwall-0.1.5 → contextwall-0.2.1}/policy/packs/fedramp.yaml +0 -0
  56. {contextwall-0.1.5 → contextwall-0.2.1}/policy/packs/hipaa.yaml +0 -0
  57. {contextwall-0.1.5 → contextwall-0.2.1}/policy/packs/soc2.yaml +0 -0
  58. {contextwall-0.1.5 → contextwall-0.2.1}/publish-pypi.sh +0 -0
  59. {contextwall-0.1.5 → contextwall-0.2.1}/sdk/python/tests/test_sdk.py +0 -0
  60. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/__init__.py +0 -0
  61. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/_compat.py +0 -0
  62. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/api/__init__.py +0 -0
  63. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/api/app.py +0 -0
  64. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/api/models.py +0 -0
  65. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/classifier/__init__.py +0 -0
  66. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/classifier/classifier.py +0 -0
  67. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/cli/__init__.py +0 -0
  68. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/cli/main.py +0 -0
  69. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/compliance/__init__.py +0 -0
  70. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/compliance/baa.py +0 -0
  71. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/compliance/chain.py +0 -0
  72. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/compliance/control_mappings.py +0 -0
  73. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/compliance/export.py +0 -0
  74. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/compliance/keys.py +0 -0
  75. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/config.py +0 -0
  76. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/control_plane/__init__.py +0 -0
  77. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/control_plane/pusher.py +0 -0
  78. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/daemon/__init__.py +0 -0
  79. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/daemon/main.py +0 -0
  80. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/db/__init__.py +0 -0
  81. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/db/connection.py +0 -0
  82. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/db/migrations.py +0 -0
  83. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/mcp/__init__.py +0 -0
  84. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/mcp/server.py +0 -0
  85. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/metrics.py +0 -0
  86. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/models.py +0 -0
  87. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/policy/__init__.py +0 -0
  88. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/policy/detectors/__init__.py +0 -0
  89. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/policy/detectors/injection.py +0 -0
  90. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/policy/detectors/patterns.py +0 -0
  91. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/policy/engine.py +0 -0
  92. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/__init__.py +0 -0
  93. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/adapters/__init__.py +0 -0
  94. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/adapters/anthropic.py +0 -0
  95. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/adapters/mcp_static.py +0 -0
  96. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/adapters/openai.py +0 -0
  97. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/adapters/replay.py +0 -0
  98. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/cli.py +0 -0
  99. {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
  100. {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
  101. {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
  102. {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
  103. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-05-github-pat.yaml +0 -0
  104. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-06-jwt-token.yaml +0 -0
  105. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-07-bearer-token.yaml +0 -0
  106. {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
  107. {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
  108. {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
  109. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-11-ssn.yaml +0 -0
  110. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-12-credit-card.yaml +0 -0
  111. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-13-phone-number.yaml +0 -0
  112. {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
  113. {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
  114. {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
  115. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-17-passport-number.yaml +0 -0
  116. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/exfiltration/exf-18-driver-license.yaml +0 -0
  117. {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
  118. {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
  119. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/grounding/gnd-01-false-attribution.yaml +0 -0
  120. {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
  121. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/grounding/gnd-03-nonexistent-api.yaml +0 -0
  122. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/grounding/gnd-04-conflicting-sources.yaml +0 -0
  123. {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
  124. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/injection/inj-01-echoleak-shape.yaml +0 -0
  125. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/injection/inj-02-poisoned-rag.yaml +0 -0
  126. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/injection/inj-03-zero-width.yaml +0 -0
  127. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/injection/inj-04-spaced-letters.yaml +0 -0
  128. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/injection/inj-05-semantic-override.yaml +0 -0
  129. {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
  130. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/fixtures/standard/2026.09/injection/inj-07-tool-poisoning.yaml +0 -0
  131. {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
  132. {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
  133. {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
  134. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/grade.py +0 -0
  135. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/grader/__init__.py +0 -0
  136. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/grader/grader.py +0 -0
  137. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/models.py +0 -0
  138. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/policy.py +0 -0
  139. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/redact.py +0 -0
  140. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/report/__init__.py +0 -0
  141. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/report/json_out.py +0 -0
  142. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/report/sarif.py +0 -0
  143. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/report/terminal.py +0 -0
  144. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/suite.py +0 -0
  145. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/preflight/transport.py +0 -0
  146. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/provenance/__init__.py +0 -0
  147. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/provenance/engine.py +0 -0
  148. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/provenance/models.py +0 -0
  149. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/proxy/__init__.py +0 -0
  150. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/proxy/router.py +0 -0
  151. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/proxy/scanner.py +0 -0
  152. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/proxy/tokens.py +0 -0
  153. {contextwall-0.1.5/sdk/python/src/contextwall_sdk → contextwall-0.2.1/src/context_firewall/sdk}/_anthropic.py +0 -0
  154. {contextwall-0.1.5/sdk/python/src/contextwall_sdk → contextwall-0.2.1/src/context_firewall/sdk}/_compat.py +0 -0
  155. {contextwall-0.1.5/sdk/python/src/contextwall_sdk → contextwall-0.2.1/src/context_firewall/sdk}/_openai.py +0 -0
  156. {contextwall-0.1.5/sdk/python/src/contextwall_sdk → contextwall-0.2.1/src/context_firewall/sdk}/client.py +0 -0
  157. {contextwall-0.1.5/sdk/python/src/contextwall_sdk → contextwall-0.2.1/src/context_firewall/sdk}/exceptions.py +0 -0
  158. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/source/__init__.py +0 -0
  159. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/source/registry.py +0 -0
  160. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/source/types.py +0 -0
  161. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/synthesizer/__init__.py +0 -0
  162. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/synthesizer/synthesizer.py +0 -0
  163. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/trust/__init__.py +0 -0
  164. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/trust/engine.py +0 -0
  165. {contextwall-0.1.5 → contextwall-0.2.1}/src/context_firewall/trust/signals.py +0 -0
  166. {contextwall-0.1.5 → contextwall-0.2.1}/tests/preflight/__init__.py +0 -0
  167. {contextwall-0.1.5 → contextwall-0.2.1}/tests/preflight/test_grader_regression.py +0 -0
  168. {contextwall-0.1.5 → contextwall-0.2.1}/tests/preflight/test_mcp_static.py +0 -0
  169. {contextwall-0.1.5 → contextwall-0.2.1}/tests/preflight/test_policy_reporters_redaction.py +0 -0
  170. {contextwall-0.1.5 → contextwall-0.2.1}/tests/preflight/test_postmortem_traces.py +0 -0
  171. {contextwall-0.1.5 → contextwall-0.2.1}/tests/preflight/test_replay_adapter.py +0 -0
  172. {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.5
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