humanbound 2.0.1__tar.gz → 2.0.2__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 (109) hide show
  1. {humanbound-2.0.1 → humanbound-2.0.2}/PKG-INFO +1 -7
  2. {humanbound-2.0.1 → humanbound-2.0.2}/README.md +0 -6
  3. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound.egg-info/PKG-INFO +1 -7
  4. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound.egg-info/SOURCES.txt +1 -0
  5. humanbound-2.0.2/humanbound_cli/templates/report_base.html +238 -0
  6. {humanbound-2.0.1 → humanbound-2.0.2}/pyproject.toml +1 -1
  7. {humanbound-2.0.1 → humanbound-2.0.2}/LICENSE +0 -0
  8. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound/__init__.py +0 -0
  9. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound/bot.py +0 -0
  10. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound/callbacks.py +0 -0
  11. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound/orchestrators.py +0 -0
  12. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound/py.typed +0 -0
  13. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound/runner.py +0 -0
  14. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound/schemas.py +0 -0
  15. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound.egg-info/dependency_links.txt +0 -0
  16. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound.egg-info/entry_points.txt +0 -0
  17. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound.egg-info/requires.txt +0 -0
  18. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound.egg-info/top_level.txt +0 -0
  19. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/__init__.py +0 -0
  20. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/adapters/__init__.py +0 -0
  21. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/adapters/promptfoo.py +0 -0
  22. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/adapters/pyrit.py +0 -0
  23. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/client.py +0 -0
  24. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/commands/__init__.py +0 -0
  25. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/commands/_report_helper.py +0 -0
  26. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/commands/api_keys.py +0 -0
  27. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/commands/assessments.py +0 -0
  28. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/commands/auth.py +0 -0
  29. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/commands/campaigns.py +0 -0
  30. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/commands/completion.py +0 -0
  31. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/commands/config_cmd.py +0 -0
  32. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/commands/connect.py +0 -0
  33. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/commands/docs.py +0 -0
  34. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/commands/experiments.py +0 -0
  35. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/commands/findings.py +0 -0
  36. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/commands/firewall.py +0 -0
  37. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/commands/guardrails.py +0 -0
  38. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/commands/logs.py +0 -0
  39. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/commands/mcp.py +0 -0
  40. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/commands/members.py +0 -0
  41. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/commands/monitor.py +0 -0
  42. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/commands/orgs.py +0 -0
  43. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/commands/posture.py +0 -0
  44. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/commands/projects.py +0 -0
  45. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/commands/providers.py +0 -0
  46. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/commands/redteam.py +0 -0
  47. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/commands/report.py +0 -0
  48. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/commands/scan.py +0 -0
  49. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/commands/sentinel.py +0 -0
  50. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/commands/test.py +0 -0
  51. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/commands/upload_logs.py +0 -0
  52. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/commands/webhooks.py +0 -0
  53. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/config.py +0 -0
  54. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/connectors/__init__.py +0 -0
  55. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/connectors/microsoft.py +0 -0
  56. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/__init__.py +0 -0
  57. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/bot.py +0 -0
  58. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/callbacks.py +0 -0
  59. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/compliance.py +0 -0
  60. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/llm/__init__.py +0 -0
  61. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/llm/azureopenai.py +0 -0
  62. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/llm/claude.py +0 -0
  63. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/llm/gemini.py +0 -0
  64. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/llm/grok.py +0 -0
  65. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/llm/ollama.py +0 -0
  66. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/llm/openai.py +0 -0
  67. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/local_runner.py +0 -0
  68. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/orchestrators/__init__.py +0 -0
  69. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/orchestrators/base.py +0 -0
  70. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/orchestrators/behavioral_qa/__init__.py +0 -0
  71. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/orchestrators/behavioral_qa/config.py +0 -0
  72. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/orchestrators/behavioral_qa/generator.py +0 -0
  73. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/orchestrators/behavioral_qa/judge.py +0 -0
  74. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/orchestrators/behavioral_qa/orchestrator.py +0 -0
  75. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/orchestrators/owasp_agentic/__init__.py +0 -0
  76. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/orchestrators/owasp_agentic/config.py +0 -0
  77. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/orchestrators/owasp_agentic/generator.py +0 -0
  78. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/orchestrators/owasp_agentic/judge.py +0 -0
  79. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/orchestrators/owasp_agentic/orchestrator.py +0 -0
  80. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/orchestrators/owasp_single_turn/__init__.py +0 -0
  81. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/orchestrators/owasp_single_turn/config.py +0 -0
  82. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/orchestrators/owasp_single_turn/generator.py +0 -0
  83. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/orchestrators/owasp_single_turn/judge.py +0 -0
  84. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/orchestrators/owasp_single_turn/orchestrator.py +0 -0
  85. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/platform_runner.py +0 -0
  86. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/presenter.py +0 -0
  87. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/runner.py +0 -0
  88. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/schemas.py +0 -0
  89. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/engine/scope.py +0 -0
  90. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/exceptions.py +0 -0
  91. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/extractors/__init__.py +0 -0
  92. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/extractors/openapi.py +0 -0
  93. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/extractors/repo.py +0 -0
  94. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/main.py +0 -0
  95. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/mcp_server.py +0 -0
  96. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/py.typed +0 -0
  97. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/pytest_plugin/__init__.py +0 -0
  98. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/pytest_plugin/fixtures.py +0 -0
  99. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/pytest_plugin/report.py +0 -0
  100. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/report.py +0 -0
  101. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/report_builder.py +0 -0
  102. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/templates/compliance/banking.yaml +0 -0
  103. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/templates/compliance/ecommerce.yaml +0 -0
  104. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/templates/compliance/eu-ai-act.yaml +0 -0
  105. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/templates/compliance/healthcare.yaml +0 -0
  106. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/templates/compliance/insurance.yaml +0 -0
  107. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/templates/compliance/legal.yaml +0 -0
  108. {humanbound-2.0.1 → humanbound-2.0.2}/humanbound_cli/templates/logo.svg +0 -0
  109. {humanbound-2.0.1 → humanbound-2.0.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: humanbound
3
- Version: 2.0.1
3
+ Version: 2.0.2
4
4
  Summary: Humanbound — open-source AI agent red-team engine, SDK, and CLI.
5
5
  Author-email: Humanbound <hello@humanbound.ai>
6
6
  Maintainer-email: Demetris Gerogiannis <hello@humanbound.ai>, Kostas Siabanis <hello@humanbound.ai>
@@ -196,9 +196,3 @@ trademark policy. The code is open; the name is not.
196
196
  The sibling project [`humanbound-firewall`](https://github.com/humanbound/humanbound-firewall)
197
197
  is dual-licensed (AGPL-3.0 + commercial) — different product, different
198
198
  license strategy.
199
-
200
- ---
201
-
202
- <p align="center">
203
- <sub><em>Humanbound is the trading name of AI and Me Single-Member Private Company, incorporated in Greece.</em></sub>
204
- </p>
@@ -134,9 +134,3 @@ trademark policy. The code is open; the name is not.
134
134
  The sibling project [`humanbound-firewall`](https://github.com/humanbound/humanbound-firewall)
135
135
  is dual-licensed (AGPL-3.0 + commercial) — different product, different
136
136
  license strategy.
137
-
138
- ---
139
-
140
- <p align="center">
141
- <sub><em>Humanbound is the trading name of AI and Me Single-Member Private Company, incorporated in Greece.</em></sub>
142
- </p>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: humanbound
3
- Version: 2.0.1
3
+ Version: 2.0.2
4
4
  Summary: Humanbound — open-source AI agent red-team engine, SDK, and CLI.
5
5
  Author-email: Humanbound <hello@humanbound.ai>
6
6
  Maintainer-email: Demetris Gerogiannis <hello@humanbound.ai>, Kostas Siabanis <hello@humanbound.ai>
@@ -196,9 +196,3 @@ trademark policy. The code is open; the name is not.
196
196
  The sibling project [`humanbound-firewall`](https://github.com/humanbound/humanbound-firewall)
197
197
  is dual-licensed (AGPL-3.0 + commercial) — different product, different
198
198
  license strategy.
199
-
200
- ---
201
-
202
- <p align="center">
203
- <sub><em>Humanbound is the trading name of AI and Me Single-Member Private Company, incorporated in Greece.</em></sub>
204
- </p>
@@ -98,6 +98,7 @@ humanbound_cli/pytest_plugin/__init__.py
98
98
  humanbound_cli/pytest_plugin/fixtures.py
99
99
  humanbound_cli/pytest_plugin/report.py
100
100
  humanbound_cli/templates/logo.svg
101
+ humanbound_cli/templates/report_base.html
101
102
  humanbound_cli/templates/compliance/banking.yaml
102
103
  humanbound_cli/templates/compliance/ecommerce.yaml
103
104
  humanbound_cli/templates/compliance/eu-ai-act.yaml
@@ -0,0 +1,238 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>$title</title>
7
+ <style>
8
+ /* ── Reset & Base ──────────────────────────────── */
9
+ * { margin: 0; padding: 0; box-sizing: border-box; }
10
+ body {
11
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", sans-serif;
12
+ color: #1a1a2e; background: #fff; line-height: 1.65; font-size: 14px;
13
+ }
14
+ .container { max-width: 900px; margin: 0 auto; padding: 40px 48px; }
15
+
16
+ /* ── Cover Page ────────────────────────────────── */
17
+ .cover {
18
+ display: flex; flex-direction: column; align-items: center;
19
+ justify-content: center; min-height: 85vh; text-align: center;
20
+ padding: 80px 48px;
21
+ }
22
+ .cover-logo {
23
+ font-size: 36px; font-weight: 800; letter-spacing: -1px; margin-bottom: 8px;
24
+ }
25
+ .cover-logo-dark { color: #1e293b; }
26
+ .cover-logo-accent { color: #f59e0b; font-weight: 700; }
27
+ .cover-title {
28
+ font-size: 28px; font-weight: 700; color: #f59e0b;
29
+ margin-bottom: 12px; margin-top: 24px; letter-spacing: -0.5px;
30
+ }
31
+ .cover-subtitle { font-size: 18px; color: #475569; margin-bottom: 40px; }
32
+ .cover-meta { font-size: 14px; color: #64748b; line-height: 2; }
33
+ .cover-meta strong { color: #1e293b; }
34
+
35
+ /* ── Typography ────────────────────────────────── */
36
+ h1 { font-size: 24px; font-weight: 700; color: #0f172a; margin-bottom: 8px; }
37
+ h2 {
38
+ font-size: 20px; font-weight: 700; color: #1e293b; margin-bottom: 16px;
39
+ padding-bottom: 8px; border-bottom: 2px solid #e2e8f0;
40
+ }
41
+ h3 { font-size: 16px; font-weight: 600; color: #334155; margin-bottom: 10px; margin-top: 20px; }
42
+ h4 { font-size: 14px; font-weight: 600; color: #475569; margin-bottom: 8px; }
43
+ p { margin-bottom: 12px; color: #374151; }
44
+ .text-muted { color: #64748b; font-size: 13px; }
45
+
46
+ /* ── Sections ──────────────────────────────────── */
47
+ .section { margin-bottom: 36px; }
48
+ .section-intro { font-size: 14px; color: #475569; margin-bottom: 16px; line-height: 1.7; }
49
+
50
+ /* ── Cards ─────────────────────────────────────── */
51
+ .card-grid {
52
+ display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
53
+ gap: 16px; margin-bottom: 20px;
54
+ }
55
+ .card {
56
+ background: #f8fafc; border: 1px solid #e2e8f0;
57
+ border-radius: 8px; padding: 20px;
58
+ }
59
+ .card .label {
60
+ font-size: 11px; color: #64748b; text-transform: uppercase;
61
+ letter-spacing: 0.5px; font-weight: 600;
62
+ }
63
+ .card .value { font-size: 32px; font-weight: 800; margin-top: 4px; line-height: 1.1; }
64
+ .card .sub { font-size: 13px; color: #64748b; margin-top: 4px; }
65
+
66
+ /* ── Posture Donut (SVG) ───────────────────────── */
67
+ .posture-row { display: flex; gap: 24px; justify-content: center; flex-wrap: wrap; margin-bottom: 24px; }
68
+ .posture-item { text-align: center; width: 140px; }
69
+ .posture-item .donut-label { font-size: 12px; color: #64748b; margin-top: 8px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.3px; }
70
+ .posture-item .donut-grade { font-size: 11px; color: #94a3b8; margin-top: 2px; }
71
+ .donut-ring { fill: none; stroke: #e2e8f0; stroke-width: 8; }
72
+ .donut-fill { fill: none; stroke-width: 8; stroke-linecap: round; transition: stroke-dasharray 0.3s; }
73
+
74
+ /* ── Severity Bar ──────────────────────────────── */
75
+ .severity-bar { display: flex; height: 24px; border-radius: 6px; overflow: hidden; margin-bottom: 12px; }
76
+ .severity-bar .seg { display: flex; align-items: center; justify-content: center; font-size: 10px; font-weight: 700; color: #fff; min-width: 24px; }
77
+ .seg-critical { background: #dc2626; }
78
+ .seg-high { background: #ea580c; }
79
+ .seg-medium { background: #ca8a04; }
80
+ .seg-low { background: #16a34a; }
81
+ .seg-info { background: #2563eb; }
82
+
83
+ /* ── Tables ────────────────────────────────────── */
84
+ table {
85
+ width: 100%; border-collapse: collapse; background: #fff;
86
+ border: 1px solid #e2e8f0; border-radius: 8px; overflow: hidden;
87
+ margin-bottom: 16px;
88
+ }
89
+ th {
90
+ background: #f1f5f9; text-align: left; padding: 12px 14px;
91
+ font-size: 11px; font-weight: 700; color: #475569;
92
+ text-transform: uppercase; letter-spacing: 0.5px;
93
+ border-bottom: 2px solid #e2e8f0;
94
+ }
95
+ td {
96
+ padding: 12px 14px; font-size: 13px; border-bottom: 1px solid #f1f5f9;
97
+ vertical-align: top;
98
+ }
99
+ tr:last-child td { border-bottom: none; }
100
+ tr.stale td { background: #fef9c3; }
101
+
102
+ /* ── Badges ────────────────────────────────────── */
103
+ .badge {
104
+ display: inline-block; padding: 3px 10px; border-radius: 4px;
105
+ font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.3px;
106
+ }
107
+ .badge-critical { background: #fef2f2; color: #dc2626; }
108
+ .badge-high { background: #fff7ed; color: #ea580c; }
109
+ .badge-medium { background: #fefce8; color: #ca8a04; }
110
+ .badge-low { background: #f0fdf4; color: #16a34a; }
111
+ .badge-info { background: #eff6ff; color: #2563eb; }
112
+ .badge-open { background: #fef2f2; color: #dc2626; }
113
+ .badge-regressed { background: #fff7ed; color: #ea580c; }
114
+ .badge-stale { background: #fefce8; color: #ca8a04; }
115
+ .badge-fixed { background: #f0fdf4; color: #16a34a; }
116
+ .badge-pass { background: #f0fdf4; color: #16a34a; }
117
+ .badge-fail { background: #fef2f2; color: #dc2626; }
118
+
119
+ /* ── Metric Table (PDF-style) ──────────────────── */
120
+ .metric-table { width: 100%; margin-bottom: 20px; }
121
+ .metric-table td { padding: 14px 16px; border-bottom: 1px solid #f1f5f9; }
122
+ .metric-table .metric-name { font-weight: 600; color: #1e293b; width: 180px; }
123
+ .metric-table .metric-desc { color: #64748b; font-size: 13px; }
124
+ .metric-table .metric-status { font-weight: 600; width: 140px; }
125
+ .metric-table .metric-value { font-weight: 700; color: #1e293b; width: 80px; text-align: right; }
126
+
127
+ /* ── Status Colors ─────────────────────────────── */
128
+ .status-good { color: #16a34a; }
129
+ .status-warning { color: #ca8a04; }
130
+ .status-danger { color: #dc2626; }
131
+ .status-info { color: #2563eb; }
132
+ .status-muted { color: #64748b; }
133
+
134
+ /* ── Callout ───────────────────────────────────── */
135
+ .callout {
136
+ background: #f8fafc; border-left: 4px solid #e2e8f0;
137
+ padding: 16px 20px; margin-bottom: 20px; border-radius: 0 8px 8px 0;
138
+ }
139
+ .callout-warning { border-left-color: #f59e0b; background: #fffbeb; }
140
+ .callout-info { border-left-color: #3b82f6; background: #eff6ff; }
141
+ .callout p { margin-bottom: 0; }
142
+
143
+ /* ── Methodology Flow ──────────────────────────── */
144
+ .flow-steps {
145
+ display: flex; flex-direction: column; gap: 0;
146
+ margin: 20px 0; max-width: 500px; margin-left: auto; margin-right: auto;
147
+ }
148
+ .flow-step {
149
+ padding: 10px 20px; font-size: 13px; font-weight: 600; color: #fff;
150
+ }
151
+ .flow-step:nth-child(1) { background: #334155; }
152
+ .flow-step:nth-child(2) { background: #475569; margin-left: 16px; }
153
+ .flow-step:nth-child(3) { background: #64748b; margin-left: 32px; }
154
+ .flow-step:nth-child(4) { background: #f59e0b; margin-left: 32px; color: #1e293b; }
155
+ .flow-step:nth-child(5) { background: #1e293b; margin-left: 16px; }
156
+
157
+ /* ── Delta Arrow ───────────────────────────────── */
158
+ .delta-up { color: #16a34a; }
159
+ .delta-down { color: #dc2626; }
160
+ .delta-neutral { color: #64748b; }
161
+
162
+ /* ── Summary Line ──────────────────────────────── */
163
+ .summary-line { font-size: 13px; color: #475569; margin-bottom: 4px; }
164
+
165
+ /* ── Divider ───────────────────────────────────── */
166
+ .divider { border: none; border-top: 1px solid #e2e8f0; margin: 32px 0; }
167
+
168
+ /* ── Footer ────────────────────────────────────── */
169
+ .footer {
170
+ border-top: 1px solid #e2e8f0; padding-top: 16px; margin-top: 40px;
171
+ display: flex; justify-content: space-between; align-items: center;
172
+ font-size: 11px; color: #94a3b8;
173
+ }
174
+ .footer-confidential {
175
+ font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px;
176
+ }
177
+
178
+ /* ── Print ─────────────────────────────────────── */
179
+ @media print {
180
+ body { background: #fff; font-size: 12px; }
181
+ .container { padding: 20px; max-width: 100%; }
182
+ .cover { min-height: auto; padding: 120px 48px; page-break-after: always; }
183
+ .section { page-break-inside: avoid; }
184
+ h2 { page-break-after: avoid; }
185
+ table { page-break-inside: avoid; }
186
+ .card { border: 1px solid #cbd5e1; }
187
+ @page { margin: 20mm 15mm; }
188
+ }
189
+ </style>
190
+ </head>
191
+ <body>
192
+ <!-- Cover Page -->
193
+ <div class="cover">
194
+ <img src="$logo_uri" alt="Humanbound" style="width:320px; margin-bottom:24px;">
195
+ <div class="cover-title">$cover_title</div>
196
+ <div class="cover-subtitle">$cover_subtitle</div>
197
+ <div class="cover-meta">
198
+ $cover_meta
199
+ </div>
200
+ </div>
201
+
202
+ <!-- Report Body -->
203
+ <div class="container">
204
+ <!-- Executive Summary (common) -->
205
+ <div class="section">
206
+ <h2>Methodology</h2>
207
+ <p class="section-intro"><strong>Testing Approach.</strong> Humanbound conducts automated contextual penetration testing and quality assurance of AI agents through multi-turn adversarial and behavioral conversations, aligned with industry-standard threat taxonomies including the OWASP Top 10 for LLM Applications, the OWASP Agentic Security Top 10, MITRE ATLAS, and NIST AI Risk Management Framework categories.</p>
208
+ <p class="section-intro"><strong>Security Posture.</strong> Posture is measured across multiple dimensions: <em>Agent Security</em> (resilience against adversarial attacks including prompt injection, data exfiltration, privilege escalation, trust boundary violations, and agentic tool misuse) and <em>Agent Quality</em> (functional accuracy, boundary management, conversational intelligence, and user experience). Each dimension produces an independent score and grade. The overall posture score is the weighted composite.</p>
209
+ <p class="section-intro"><strong>Scoring.</strong> Each score ranges from 0 to 100, computed from the severity of identified vulnerabilities weighted by their current status. Grade boundaries: A (90+), B (75&ndash;89), C (60&ndash;74), D (40&ndash;59), F (&lt;40).</p>
210
+ <p class="section-intro"><strong>Continuous Monitoring.</strong> The platform evaluates agents on a configurable schedule, automatically adjusting testing intensity based on detected signals &mdash; new vulnerabilities, regressions, behavioral drift, and coverage gaps.</p>
211
+ <p class="section-intro"><strong>Limitations.</strong> AI agents are non-deterministic systems. Results represent behavior observed at the time of testing under the specific conditions applied. Continuous monitoring is recommended to track behavioral changes over time.</p>
212
+ </div>
213
+
214
+ <hr class="divider">
215
+
216
+ $context_section
217
+
218
+ $body
219
+
220
+ <hr class="divider">
221
+
222
+ <div class="section" style="font-size:11px; color:#94a3b8; line-height:1.7;">
223
+ <h2 style="font-size:14px; color:#64748b;">Technology Disclaimer</h2>
224
+ <p>This report was generated using a methodology that incorporates Large Language Model (LLM) technology in certain components of the testing and evaluation process. LLMs are based on stochastic (probabilistic) processes and are inherently non-deterministic. As a result, there is no absolute guarantee that results are fully reproducible across identical test runs, and there may be blind spots or edge cases not captured during testing. Humanbound applies best-effort scientific standards &mdash; including multi-turn adversarial conversations, score-guided adaptation, coverage-guided test selection, and statistical drift detection &mdash; to mitigate these limitations and maximise testing coverage.</p>
225
+ <p>This report does not constitute legal, regulatory, or compliance advice. It is a technical assessment of AI agent security and quality based on automated testing at a specific point in time. Organisations should use this report as one input among others when making security and compliance decisions.</p>
226
+
227
+ <h2 style="font-size:14px; color:#64748b; margin-top:20px;">Attribution</h2>
228
+ <p>This report was generated by <a href="https://humanbound.ai" style="color:#f59e0b;">Humanbound CLI</a> &mdash; open-source AI agent security testing.</p>
229
+ <p>Humanbound is a trademark of AI and Me P.C. The testing methodology and report format are provided under the <a href="https://www.apache.org/licenses/LICENSE-2.0" style="color:#f59e0b;">Apache 2.0 license</a>. The content of this report belongs to the user who generated it.</p>
230
+ </div>
231
+
232
+ <div class="footer">
233
+ <span>$report_subject</span>
234
+ <span>Generated by <a href="https://humanbound.ai" style="color:#94a3b8;">Humanbound</a> &middot; $generated_at</span>
235
+ </div>
236
+ </div>
237
+ </body>
238
+ </html>
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "humanbound"
7
- version = "2.0.1"
7
+ version = "2.0.2"
8
8
  description = "Humanbound — open-source AI agent red-team engine, SDK, and CLI."
9
9
  readme = "README.md"
10
10
  license = "Apache-2.0"
File without changes
File without changes
File without changes