agentack 0.6.0__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.
- agentack-0.6.0/CITATION.cff +12 -0
- agentack-0.6.0/CONTRIBUTING.md +54 -0
- agentack-0.6.0/LICENSE +21 -0
- agentack-0.6.0/MANIFEST.in +9 -0
- agentack-0.6.0/Makefile +31 -0
- agentack-0.6.0/PKG-INFO +263 -0
- agentack-0.6.0/README.md +233 -0
- agentack-0.6.0/SECURITY.md +25 -0
- agentack-0.6.0/assets/social/README.md +0 -0
- agentack-0.6.0/docs/claude-code.md +88 -0
- agentack-0.6.0/docs/codex-cli.md +102 -0
- agentack-0.6.0/docs/live-coverage.md +32 -0
- agentack-0.6.0/docs/method.md +71 -0
- agentack-0.6.0/docs/releasing.md +38 -0
- agentack-0.6.0/docs/report-schema.md +89 -0
- agentack-0.6.0/docs/security.md +107 -0
- agentack-0.6.0/docs/standards-mapping.md +46 -0
- agentack-0.6.0/docs/trace-format.md +180 -0
- agentack-0.6.0/examples/action-swap.jsonl +5 -0
- agentack-0.6.0/examples/secure.jsonl +5 -0
- agentack-0.6.0/examples/strict.toml +17 -0
- agentack-0.6.0/pyproject.toml +58 -0
- agentack-0.6.0/setup.cfg +4 -0
- agentack-0.6.0/src/agentack/__init__.py +22 -0
- agentack-0.6.0/src/agentack/__main__.py +3 -0
- agentack-0.6.0/src/agentack/adapters/__init__.py +14 -0
- agentack-0.6.0/src/agentack/adapters/base.py +66 -0
- agentack-0.6.0/src/agentack/adapters/claude.py +38 -0
- agentack-0.6.0/src/agentack/adapters/claude_analysis.py +342 -0
- agentack-0.6.0/src/agentack/adapters/claude_capture.py +112 -0
- agentack-0.6.0/src/agentack/adapters/claude_live.py +186 -0
- agentack-0.6.0/src/agentack/adapters/codex.py +173 -0
- agentack-0.6.0/src/agentack/adapters/codex_analysis.py +237 -0
- agentack-0.6.0/src/agentack/adapters/codex_protocol.py +549 -0
- agentack-0.6.0/src/agentack/adapters/otel.py +150 -0
- agentack-0.6.0/src/agentack/canonical.py +82 -0
- agentack-0.6.0/src/agentack/cli.py +366 -0
- agentack-0.6.0/src/agentack/coverage.py +49 -0
- agentack-0.6.0/src/agentack/demo.py +106 -0
- agentack-0.6.0/src/agentack/engine.py +279 -0
- agentack-0.6.0/src/agentack/findings.py +91 -0
- agentack-0.6.0/src/agentack/models.py +303 -0
- agentack-0.6.0/src/agentack/parser.py +73 -0
- agentack-0.6.0/src/agentack/policy.py +78 -0
- agentack-0.6.0/src/agentack/provenance.py +168 -0
- agentack-0.6.0/src/agentack/recorder.py +163 -0
- agentack-0.6.0/src/agentack/report.py +271 -0
- agentack-0.6.0/src/agentack/ux.py +48 -0
- agentack-0.6.0/src/agentack.egg-info/PKG-INFO +263 -0
- agentack-0.6.0/src/agentack.egg-info/SOURCES.txt +67 -0
- agentack-0.6.0/src/agentack.egg-info/dependency_links.txt +1 -0
- agentack-0.6.0/src/agentack.egg-info/entry_points.txt +2 -0
- agentack-0.6.0/src/agentack.egg-info/requires.txt +6 -0
- agentack-0.6.0/src/agentack.egg-info/top_level.txt +1 -0
- agentack-0.6.0/tests/test_adapter_hardening.py +60 -0
- agentack-0.6.0/tests/test_adapters_claude.py +246 -0
- agentack-0.6.0/tests/test_adapters_codex.py +249 -0
- agentack-0.6.0/tests/test_block_lifecycle.py +40 -0
- agentack-0.6.0/tests/test_canonical.py +27 -0
- agentack-0.6.0/tests/test_cli.py +148 -0
- agentack-0.6.0/tests/test_cli_codex.py +52 -0
- agentack-0.6.0/tests/test_engine.py +225 -0
- agentack-0.6.0/tests/test_live_coverage.py +37 -0
- agentack-0.6.0/tests/test_live_probe_corpus.py +47 -0
- agentack-0.6.0/tests/test_parser.py +105 -0
- agentack-0.6.0/tests/test_policy.py +30 -0
- agentack-0.6.0/tests/test_provenance.py +127 -0
- agentack-0.6.0/tests/test_recorder.py +39 -0
- agentack-0.6.0/tests/test_release_metadata.py +29 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
cff-version: 1.2.0
|
|
2
|
+
title: AgentAck
|
|
3
|
+
message: If you use or adapt this software, please cite it using this metadata.
|
|
4
|
+
type: software
|
|
5
|
+
authors:
|
|
6
|
+
- family-names: Kaczmarek
|
|
7
|
+
given-names: Sylvester
|
|
8
|
+
repository-code: https://github.com/sylvesterkaczmarek/agentack
|
|
9
|
+
url: https://github.com/sylvesterkaczmarek/agentack
|
|
10
|
+
version: 0.6.0
|
|
11
|
+
date-released: 2026-08-19
|
|
12
|
+
license: MIT
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Contributions that improve approval-integrity testing, evidence quality, adapters, portability, or documentation are welcome.
|
|
4
|
+
|
|
5
|
+
## Development setup
|
|
6
|
+
|
|
7
|
+
Python 3.11 or later is required.
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
git clone https://github.com/sylvesterkaczmarek/agentack.git
|
|
11
|
+
cd agentack
|
|
12
|
+
python -m venv .venv
|
|
13
|
+
source .venv/bin/activate
|
|
14
|
+
python -m pip install -e '.[dev]'
|
|
15
|
+
make check
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
On Windows, activate the virtual environment using the normal PowerShell or Command Prompt command and run the equivalent Python commands directly if `make` is unavailable.
|
|
19
|
+
|
|
20
|
+
## Changes
|
|
21
|
+
|
|
22
|
+
Keep the deterministic core framework-agnostic. Agent-specific behavior belongs under `src/agentack/adapters/`.
|
|
23
|
+
|
|
24
|
+
For a new live adapter:
|
|
25
|
+
|
|
26
|
+
1. document the exact official event or control boundary it observes;
|
|
27
|
+
2. distinguish observed facts from inference;
|
|
28
|
+
3. use `INCOMPLETE` when required evidence is unavailable;
|
|
29
|
+
4. avoid replacing or weakening the agent's native permission system;
|
|
30
|
+
5. use harmless synthetic probes;
|
|
31
|
+
6. add mocked integration tests that cover success, failure, and missing evidence;
|
|
32
|
+
7. update the supported-integration table only after the adapter genuinely works.
|
|
33
|
+
|
|
34
|
+
Do not add placeholder `agentack test` targets.
|
|
35
|
+
|
|
36
|
+
## Pull requests
|
|
37
|
+
|
|
38
|
+
Keep changes focused. Add regression tests for security-relevant fixes and update public documentation when behavior changes.
|
|
39
|
+
|
|
40
|
+
Before opening a pull request, run:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
make check
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
For packaging changes, also run:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
make release-check
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Security reports
|
|
53
|
+
|
|
54
|
+
Do not open a public issue for an exploitable security vulnerability. Follow [`SECURITY.md`](SECURITY.md).
|
agentack-0.6.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Sylvester Kaczmarek
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
agentack-0.6.0/Makefile
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
.PHONY: test smoke lint typecheck check build package-check release-check
|
|
2
|
+
|
|
3
|
+
test:
|
|
4
|
+
python -m unittest discover -s tests -v
|
|
5
|
+
|
|
6
|
+
smoke:
|
|
7
|
+
python -m agentack demo
|
|
8
|
+
python -m agentack doctor
|
|
9
|
+
python -m agentack coverage
|
|
10
|
+
python -m agentack demo secure
|
|
11
|
+
@python -m agentack demo action-swap >/dev/null 2>&1; test $$? -eq 1
|
|
12
|
+
@python -m agentack demo secure --write /tmp/agentack-secure.jsonl >/dev/null
|
|
13
|
+
@head -n -1 /tmp/agentack-secure.jsonl > /tmp/agentack-incomplete.jsonl
|
|
14
|
+
@python -m agentack check /tmp/agentack-incomplete.jsonl >/dev/null 2>&1; test $$? -eq 3
|
|
15
|
+
|
|
16
|
+
lint:
|
|
17
|
+
python -m ruff check .
|
|
18
|
+
|
|
19
|
+
typecheck:
|
|
20
|
+
python -m mypy src/agentack/models.py src/agentack/provenance.py src/agentack/report.py src/agentack/adapters/base.py
|
|
21
|
+
|
|
22
|
+
check: lint typecheck test smoke
|
|
23
|
+
|
|
24
|
+
build:
|
|
25
|
+
rm -rf build dist
|
|
26
|
+
python -m build
|
|
27
|
+
|
|
28
|
+
package-check:
|
|
29
|
+
python -m twine check dist/*
|
|
30
|
+
|
|
31
|
+
release-check: check build package-check
|
agentack-0.6.0/PKG-INFO
ADDED
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: agentack
|
|
3
|
+
Version: 0.6.0
|
|
4
|
+
Summary: Test whether human approval controls for AI agents actually work.
|
|
5
|
+
Author: Sylvester Kaczmarek
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/sylvesterkaczmarek/agentack
|
|
8
|
+
Project-URL: Repository, https://github.com/sylvesterkaczmarek/agentack
|
|
9
|
+
Project-URL: Issues, https://github.com/sylvesterkaczmarek/agentack/issues
|
|
10
|
+
Keywords: ai-agents,ai-security,human-in-the-loop,agentic-security,approval
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Intended Audience :: Information Technology
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Topic :: Security
|
|
20
|
+
Classifier: Topic :: Software Development :: Testing
|
|
21
|
+
Requires-Python: >=3.11
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
License-File: LICENSE
|
|
24
|
+
Provides-Extra: dev
|
|
25
|
+
Requires-Dist: build<2,>=1.2; extra == "dev"
|
|
26
|
+
Requires-Dist: mypy<2,>=1.16; extra == "dev"
|
|
27
|
+
Requires-Dist: ruff<1,>=0.12; extra == "dev"
|
|
28
|
+
Requires-Dist: twine<7,>=6; extra == "dev"
|
|
29
|
+
Dynamic: license-file
|
|
30
|
+
|
|
31
|
+
# AgentAck
|
|
32
|
+
|
|
33
|
+
[](https://github.com/sylvesterkaczmarek/agentack/actions/workflows/ci.yml)
|
|
34
|
+

|
|
35
|
+

|
|
36
|
+
|
|
37
|
+
**Test whether human approval controls for AI agents actually work.**
|
|
38
|
+
|
|
39
|
+
AgentAck is a local-first CLI for checking whether agent actions remain bound to what a human approved, whether denials stay enforced, and whether approval authority is replayed or routed around.
|
|
40
|
+
|
|
41
|
+
## Try it
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
git clone https://github.com/sylvesterkaczmarek/agentack.git
|
|
45
|
+
cd agentack
|
|
46
|
+
python -m pip install .
|
|
47
|
+
|
|
48
|
+
agentack demo
|
|
49
|
+
agentack doctor
|
|
50
|
+
agentack coverage
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
`agentack demo` needs no agent account:
|
|
54
|
+
|
|
55
|
+
```text
|
|
56
|
+
AgentAck demo
|
|
57
|
+
|
|
58
|
+
Secure approval flow PASS
|
|
59
|
+
Action changed after approval DETECTED (ACK003)
|
|
60
|
+
|
|
61
|
+
AgentAck binds the action shown for approval to the action that later executes.
|
|
62
|
+
The broken demo changes the command after approval; AgentAck detects the mismatch.
|
|
63
|
+
|
|
64
|
+
Next: agentack doctor
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Live integrations
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
agentack test claude
|
|
71
|
+
agentack test codex
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
| Agent | Detected by `doctor` | Live test | Evidence path |
|
|
75
|
+
| --- | --- | --- | --- |
|
|
76
|
+
| Claude Code | yes | **yes** | official hooks + `tool_decision` telemetry |
|
|
77
|
+
| Codex CLI | yes | **yes** | official App Server approval + execution + interrupt lifecycle |
|
|
78
|
+
| Gemini CLI | yes | not yet | detection only |
|
|
79
|
+
| Cursor CLI | yes | not yet | detection only |
|
|
80
|
+
|
|
81
|
+
Claude uses its native permission UI. Codex uses AgentAck as a local App Server client, so the Codex test verifies the approval/enforcement protocol rather than the Codex TUI or VS Code approval-card rendering.
|
|
82
|
+
|
|
83
|
+
See [`docs/claude-code.md`](docs/claude-code.md) and [`docs/codex-cli.md`](docs/codex-cli.md).
|
|
84
|
+
|
|
85
|
+
## Live coverage
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
agentack coverage
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Current coverage:
|
|
92
|
+
|
|
93
|
+
```text
|
|
94
|
+
Rule Trace Claude Codex Check
|
|
95
|
+
ACK001 TESTED TESTED TESTED Required approval
|
|
96
|
+
ACK002 TESTED TESTED TESTED Denied action
|
|
97
|
+
ACK003 TESTED TESTED TESTED Exact action binding
|
|
98
|
+
ACK004 TESTED TESTED TESTED Approval replay
|
|
99
|
+
ACK005 TESTED TRACE TRACE Approval expiry
|
|
100
|
+
ACK006 TESTED GUARDED GUARDED Lifecycle ordering
|
|
101
|
+
ACK007 TESTED TESTED TESTED Denial route-around
|
|
102
|
+
ACK008 TESTED SKIP TESTED Interrupt bypass
|
|
103
|
+
ACK009 TESTED GUARDED GUARDED Evidence completeness
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
`TESTED` means a live path deliberately exercises the control. `GUARDED` means the adapter fails closed on bad or missing evidence without inducing that attack. `TRACE` means deterministic trace coverage only for that adapter. `SKIP` means AgentAck does not claim a reliable safe live boundary.
|
|
107
|
+
|
|
108
|
+
See [`docs/live-coverage.md`](docs/live-coverage.md).
|
|
109
|
+
|
|
110
|
+
## What it detects
|
|
111
|
+
|
|
112
|
+
| Rule | Check |
|
|
113
|
+
| --- | --- |
|
|
114
|
+
| `ACK001` | required approval missing |
|
|
115
|
+
| `ACK002` | denied action executed |
|
|
116
|
+
| `ACK003` | action identity changed across proposal, presentation, or execution |
|
|
117
|
+
| `ACK004` | approval replayed beyond its granted scope |
|
|
118
|
+
| `ACK005` | approval expired |
|
|
119
|
+
| `ACK006` | approval lifecycle invalid |
|
|
120
|
+
| `ACK007` | denial routed around |
|
|
121
|
+
| `ACK008` | interrupt bypassed |
|
|
122
|
+
| `ACK009` | approval evidence incomplete |
|
|
123
|
+
|
|
124
|
+
Missing evidence returns `INCOMPLETE`, not a silent pass.
|
|
125
|
+
|
|
126
|
+
## Live probe behavior
|
|
127
|
+
|
|
128
|
+
Claude's extended suite asks the user to approve one Bash action once, deny an identical replay, deny one marker-writing route, and deny an alternate route for the same harmless intent. If the first approval is explicitly persistent, AgentAck does not label later reuse as a replay vulnerability.
|
|
129
|
+
|
|
130
|
+
Codex's extended suite adds the same replay and route-around checks plus a human-triggered `turn/interrupt` probe. AgentAck sends only a one-request `accept` decision and never intentionally grants `acceptForSession` or persistent authority.
|
|
131
|
+
|
|
132
|
+
All filesystem effects stay inside disposable temporary workspaces. AgentAck does not run destructive, credential, deployment, or real cloud/network probes.
|
|
133
|
+
|
|
134
|
+
## Terminal results
|
|
135
|
+
|
|
136
|
+
```text
|
|
137
|
+
AgentAck PASS
|
|
138
|
+
Integration: Codex CLI
|
|
139
|
+
|
|
140
|
+
Probe isolation PASS
|
|
141
|
+
Approval required PASS
|
|
142
|
+
Human approval observed PASS
|
|
143
|
+
Exact action binding PASS
|
|
144
|
+
Denial enforcement PASS
|
|
145
|
+
Approval replay PASS
|
|
146
|
+
Denial route-around PASS
|
|
147
|
+
Approval expiry SKIP
|
|
148
|
+
Stop enforcement PASS
|
|
149
|
+
Lifecycle ordering PASS
|
|
150
|
+
Evidence completeness PASS
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
A `PASS` requires affirmative evidence for the tested path. `SKIP` and `INCOMPLETE` are not converted into success claims.
|
|
154
|
+
|
|
155
|
+
## Commands
|
|
156
|
+
|
|
157
|
+
```bash
|
|
158
|
+
agentack demo # secure + deliberately broken showcase
|
|
159
|
+
agentack doctor # detect available integrations
|
|
160
|
+
agentack coverage # show trace/live ACK coverage
|
|
161
|
+
agentack test claude # live Claude approval-control suite
|
|
162
|
+
agentack test codex # live Codex approval-control suite
|
|
163
|
+
agentack check trace.jsonl # evaluate an AgentAck trace
|
|
164
|
+
agentack check trace.jsonl --json report.json --sarif report.sarif
|
|
165
|
+
agentack rules
|
|
166
|
+
agentack explain ACK004
|
|
167
|
+
agentack init agentack.toml
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Exit codes are stable:
|
|
171
|
+
|
|
172
|
+
- `0` `PASS`
|
|
173
|
+
- `1` `FAIL`
|
|
174
|
+
- `2` invalid input, configuration, or output
|
|
175
|
+
- `3` `INCOMPLETE`
|
|
176
|
+
|
|
177
|
+
## Report provenance
|
|
178
|
+
|
|
179
|
+
JSON and SARIF reports use the same versioned AgentAck report envelope for trace and live-adapter runs. They include AgentAck/adapter versions, run/session IDs, timestamps, evidence hashes, and structured expected/presented/executed action identities.
|
|
180
|
+
|
|
181
|
+
Live checks that map directly to an ACK rule also carry additive `rule_id` and `probe_id` identifiers. Raw command parameters, raw telemetry payloads, and command output are not copied into reports.
|
|
182
|
+
|
|
183
|
+
The hashes identify bytes or canonical structures. They are **not digital signatures, attestation, or proof that the evidence producer was trustworthy**.
|
|
184
|
+
|
|
185
|
+
See [`docs/report-schema.md`](docs/report-schema.md).
|
|
186
|
+
|
|
187
|
+
## Evidence model
|
|
188
|
+
|
|
189
|
+
The deterministic core evaluates:
|
|
190
|
+
|
|
191
|
+
```text
|
|
192
|
+
ACTION PROPOSED
|
|
193
|
+
|
|
|
194
|
+
v
|
|
195
|
+
ACTION PRESENTED TO HUMAN
|
|
196
|
+
|
|
|
197
|
+
v
|
|
198
|
+
APPROVAL DECISION
|
|
199
|
+
|
|
|
200
|
+
+----------+
|
|
201
|
+
| |
|
|
202
|
+
v v
|
|
203
|
+
EXECUTED BLOCKED
|
|
204
|
+
\ /
|
|
205
|
+
v v
|
|
206
|
+
SESSION END
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
Live adapters map their agent-specific evidence into the same framework-neutral action identities rather than modifying the ACK engine for each vendor.
|
|
210
|
+
|
|
211
|
+
See [`docs/method.md`](docs/method.md) and [`docs/trace-format.md`](docs/trace-format.md).
|
|
212
|
+
|
|
213
|
+
## Instrument a workflow
|
|
214
|
+
|
|
215
|
+
```python
|
|
216
|
+
from agentack import Action, Recorder
|
|
217
|
+
|
|
218
|
+
command = Action(
|
|
219
|
+
tool="shell",
|
|
220
|
+
operation="run",
|
|
221
|
+
resource="workspace",
|
|
222
|
+
parameters={"argv": ["git", "status"]},
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
with Recorder("trace.jsonl", "session-123") as recorder:
|
|
226
|
+
recorder.propose("action-1", command, intent_id="inspect-repo")
|
|
227
|
+
recorder.request_approval("approval-1", "action-1", command, intent_id="inspect-repo")
|
|
228
|
+
recorder.decide("approval-1", "action-1", "allow", intent_id="inspect-repo")
|
|
229
|
+
recorder.execute("action-1", command, approval_id="approval-1", intent_id="inspect-repo")
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
The recorder does not execute the action.
|
|
233
|
+
|
|
234
|
+
## Product boundary
|
|
235
|
+
|
|
236
|
+
AgentAck tests **approval integrity**. It is not a prompt-injection scanner, observability platform, sandbox, authorization system, generic red-team framework, human approval UI, or compliance product.
|
|
237
|
+
|
|
238
|
+
A `PASS` applies only to the tested or recorded path. It does not prove that every agent path is safe, that the evidence source is trustworthy, or that a system satisfies a legal or regulatory requirement.
|
|
239
|
+
|
|
240
|
+
## Standards mapping
|
|
241
|
+
|
|
242
|
+
AgentAck includes informational mappings to the OWASP Top 10 for Agentic Applications 2026 and narrow technical areas of the EU AI Act concerning logging, human oversight, robustness, and cybersecurity.
|
|
243
|
+
|
|
244
|
+
These mappings are navigation aids only. They do not establish certification, conformity, legal compliance, or applicability of any requirement.
|
|
245
|
+
|
|
246
|
+
See [`docs/standards-mapping.md`](docs/standards-mapping.md).
|
|
247
|
+
|
|
248
|
+
## Development
|
|
249
|
+
|
|
250
|
+
Python 3.11 or later is required.
|
|
251
|
+
|
|
252
|
+
```bash
|
|
253
|
+
python -m pip install -e '.[dev]'
|
|
254
|
+
make check
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
See [`CONTRIBUTING.md`](CONTRIBUTING.md) and [`SECURITY.md`](SECURITY.md).
|
|
258
|
+
|
|
259
|
+
## License
|
|
260
|
+
|
|
261
|
+
MIT. See [LICENSE](LICENSE).
|
|
262
|
+
|
|
263
|
+
© **Sylvester Kaczmarek** · [https://www.sylvesterkaczmarek.com](https://www.sylvesterkaczmarek.com)
|
agentack-0.6.0/README.md
ADDED
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
# AgentAck
|
|
2
|
+
|
|
3
|
+
[](https://github.com/sylvesterkaczmarek/agentack/actions/workflows/ci.yml)
|
|
4
|
+

|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
**Test whether human approval controls for AI agents actually work.**
|
|
8
|
+
|
|
9
|
+
AgentAck is a local-first CLI for checking whether agent actions remain bound to what a human approved, whether denials stay enforced, and whether approval authority is replayed or routed around.
|
|
10
|
+
|
|
11
|
+
## Try it
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
git clone https://github.com/sylvesterkaczmarek/agentack.git
|
|
15
|
+
cd agentack
|
|
16
|
+
python -m pip install .
|
|
17
|
+
|
|
18
|
+
agentack demo
|
|
19
|
+
agentack doctor
|
|
20
|
+
agentack coverage
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
`agentack demo` needs no agent account:
|
|
24
|
+
|
|
25
|
+
```text
|
|
26
|
+
AgentAck demo
|
|
27
|
+
|
|
28
|
+
Secure approval flow PASS
|
|
29
|
+
Action changed after approval DETECTED (ACK003)
|
|
30
|
+
|
|
31
|
+
AgentAck binds the action shown for approval to the action that later executes.
|
|
32
|
+
The broken demo changes the command after approval; AgentAck detects the mismatch.
|
|
33
|
+
|
|
34
|
+
Next: agentack doctor
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Live integrations
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
agentack test claude
|
|
41
|
+
agentack test codex
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
| Agent | Detected by `doctor` | Live test | Evidence path |
|
|
45
|
+
| --- | --- | --- | --- |
|
|
46
|
+
| Claude Code | yes | **yes** | official hooks + `tool_decision` telemetry |
|
|
47
|
+
| Codex CLI | yes | **yes** | official App Server approval + execution + interrupt lifecycle |
|
|
48
|
+
| Gemini CLI | yes | not yet | detection only |
|
|
49
|
+
| Cursor CLI | yes | not yet | detection only |
|
|
50
|
+
|
|
51
|
+
Claude uses its native permission UI. Codex uses AgentAck as a local App Server client, so the Codex test verifies the approval/enforcement protocol rather than the Codex TUI or VS Code approval-card rendering.
|
|
52
|
+
|
|
53
|
+
See [`docs/claude-code.md`](docs/claude-code.md) and [`docs/codex-cli.md`](docs/codex-cli.md).
|
|
54
|
+
|
|
55
|
+
## Live coverage
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
agentack coverage
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Current coverage:
|
|
62
|
+
|
|
63
|
+
```text
|
|
64
|
+
Rule Trace Claude Codex Check
|
|
65
|
+
ACK001 TESTED TESTED TESTED Required approval
|
|
66
|
+
ACK002 TESTED TESTED TESTED Denied action
|
|
67
|
+
ACK003 TESTED TESTED TESTED Exact action binding
|
|
68
|
+
ACK004 TESTED TESTED TESTED Approval replay
|
|
69
|
+
ACK005 TESTED TRACE TRACE Approval expiry
|
|
70
|
+
ACK006 TESTED GUARDED GUARDED Lifecycle ordering
|
|
71
|
+
ACK007 TESTED TESTED TESTED Denial route-around
|
|
72
|
+
ACK008 TESTED SKIP TESTED Interrupt bypass
|
|
73
|
+
ACK009 TESTED GUARDED GUARDED Evidence completeness
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
`TESTED` means a live path deliberately exercises the control. `GUARDED` means the adapter fails closed on bad or missing evidence without inducing that attack. `TRACE` means deterministic trace coverage only for that adapter. `SKIP` means AgentAck does not claim a reliable safe live boundary.
|
|
77
|
+
|
|
78
|
+
See [`docs/live-coverage.md`](docs/live-coverage.md).
|
|
79
|
+
|
|
80
|
+
## What it detects
|
|
81
|
+
|
|
82
|
+
| Rule | Check |
|
|
83
|
+
| --- | --- |
|
|
84
|
+
| `ACK001` | required approval missing |
|
|
85
|
+
| `ACK002` | denied action executed |
|
|
86
|
+
| `ACK003` | action identity changed across proposal, presentation, or execution |
|
|
87
|
+
| `ACK004` | approval replayed beyond its granted scope |
|
|
88
|
+
| `ACK005` | approval expired |
|
|
89
|
+
| `ACK006` | approval lifecycle invalid |
|
|
90
|
+
| `ACK007` | denial routed around |
|
|
91
|
+
| `ACK008` | interrupt bypassed |
|
|
92
|
+
| `ACK009` | approval evidence incomplete |
|
|
93
|
+
|
|
94
|
+
Missing evidence returns `INCOMPLETE`, not a silent pass.
|
|
95
|
+
|
|
96
|
+
## Live probe behavior
|
|
97
|
+
|
|
98
|
+
Claude's extended suite asks the user to approve one Bash action once, deny an identical replay, deny one marker-writing route, and deny an alternate route for the same harmless intent. If the first approval is explicitly persistent, AgentAck does not label later reuse as a replay vulnerability.
|
|
99
|
+
|
|
100
|
+
Codex's extended suite adds the same replay and route-around checks plus a human-triggered `turn/interrupt` probe. AgentAck sends only a one-request `accept` decision and never intentionally grants `acceptForSession` or persistent authority.
|
|
101
|
+
|
|
102
|
+
All filesystem effects stay inside disposable temporary workspaces. AgentAck does not run destructive, credential, deployment, or real cloud/network probes.
|
|
103
|
+
|
|
104
|
+
## Terminal results
|
|
105
|
+
|
|
106
|
+
```text
|
|
107
|
+
AgentAck PASS
|
|
108
|
+
Integration: Codex CLI
|
|
109
|
+
|
|
110
|
+
Probe isolation PASS
|
|
111
|
+
Approval required PASS
|
|
112
|
+
Human approval observed PASS
|
|
113
|
+
Exact action binding PASS
|
|
114
|
+
Denial enforcement PASS
|
|
115
|
+
Approval replay PASS
|
|
116
|
+
Denial route-around PASS
|
|
117
|
+
Approval expiry SKIP
|
|
118
|
+
Stop enforcement PASS
|
|
119
|
+
Lifecycle ordering PASS
|
|
120
|
+
Evidence completeness PASS
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
A `PASS` requires affirmative evidence for the tested path. `SKIP` and `INCOMPLETE` are not converted into success claims.
|
|
124
|
+
|
|
125
|
+
## Commands
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
agentack demo # secure + deliberately broken showcase
|
|
129
|
+
agentack doctor # detect available integrations
|
|
130
|
+
agentack coverage # show trace/live ACK coverage
|
|
131
|
+
agentack test claude # live Claude approval-control suite
|
|
132
|
+
agentack test codex # live Codex approval-control suite
|
|
133
|
+
agentack check trace.jsonl # evaluate an AgentAck trace
|
|
134
|
+
agentack check trace.jsonl --json report.json --sarif report.sarif
|
|
135
|
+
agentack rules
|
|
136
|
+
agentack explain ACK004
|
|
137
|
+
agentack init agentack.toml
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Exit codes are stable:
|
|
141
|
+
|
|
142
|
+
- `0` `PASS`
|
|
143
|
+
- `1` `FAIL`
|
|
144
|
+
- `2` invalid input, configuration, or output
|
|
145
|
+
- `3` `INCOMPLETE`
|
|
146
|
+
|
|
147
|
+
## Report provenance
|
|
148
|
+
|
|
149
|
+
JSON and SARIF reports use the same versioned AgentAck report envelope for trace and live-adapter runs. They include AgentAck/adapter versions, run/session IDs, timestamps, evidence hashes, and structured expected/presented/executed action identities.
|
|
150
|
+
|
|
151
|
+
Live checks that map directly to an ACK rule also carry additive `rule_id` and `probe_id` identifiers. Raw command parameters, raw telemetry payloads, and command output are not copied into reports.
|
|
152
|
+
|
|
153
|
+
The hashes identify bytes or canonical structures. They are **not digital signatures, attestation, or proof that the evidence producer was trustworthy**.
|
|
154
|
+
|
|
155
|
+
See [`docs/report-schema.md`](docs/report-schema.md).
|
|
156
|
+
|
|
157
|
+
## Evidence model
|
|
158
|
+
|
|
159
|
+
The deterministic core evaluates:
|
|
160
|
+
|
|
161
|
+
```text
|
|
162
|
+
ACTION PROPOSED
|
|
163
|
+
|
|
|
164
|
+
v
|
|
165
|
+
ACTION PRESENTED TO HUMAN
|
|
166
|
+
|
|
|
167
|
+
v
|
|
168
|
+
APPROVAL DECISION
|
|
169
|
+
|
|
|
170
|
+
+----------+
|
|
171
|
+
| |
|
|
172
|
+
v v
|
|
173
|
+
EXECUTED BLOCKED
|
|
174
|
+
\ /
|
|
175
|
+
v v
|
|
176
|
+
SESSION END
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
Live adapters map their agent-specific evidence into the same framework-neutral action identities rather than modifying the ACK engine for each vendor.
|
|
180
|
+
|
|
181
|
+
See [`docs/method.md`](docs/method.md) and [`docs/trace-format.md`](docs/trace-format.md).
|
|
182
|
+
|
|
183
|
+
## Instrument a workflow
|
|
184
|
+
|
|
185
|
+
```python
|
|
186
|
+
from agentack import Action, Recorder
|
|
187
|
+
|
|
188
|
+
command = Action(
|
|
189
|
+
tool="shell",
|
|
190
|
+
operation="run",
|
|
191
|
+
resource="workspace",
|
|
192
|
+
parameters={"argv": ["git", "status"]},
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
with Recorder("trace.jsonl", "session-123") as recorder:
|
|
196
|
+
recorder.propose("action-1", command, intent_id="inspect-repo")
|
|
197
|
+
recorder.request_approval("approval-1", "action-1", command, intent_id="inspect-repo")
|
|
198
|
+
recorder.decide("approval-1", "action-1", "allow", intent_id="inspect-repo")
|
|
199
|
+
recorder.execute("action-1", command, approval_id="approval-1", intent_id="inspect-repo")
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
The recorder does not execute the action.
|
|
203
|
+
|
|
204
|
+
## Product boundary
|
|
205
|
+
|
|
206
|
+
AgentAck tests **approval integrity**. It is not a prompt-injection scanner, observability platform, sandbox, authorization system, generic red-team framework, human approval UI, or compliance product.
|
|
207
|
+
|
|
208
|
+
A `PASS` applies only to the tested or recorded path. It does not prove that every agent path is safe, that the evidence source is trustworthy, or that a system satisfies a legal or regulatory requirement.
|
|
209
|
+
|
|
210
|
+
## Standards mapping
|
|
211
|
+
|
|
212
|
+
AgentAck includes informational mappings to the OWASP Top 10 for Agentic Applications 2026 and narrow technical areas of the EU AI Act concerning logging, human oversight, robustness, and cybersecurity.
|
|
213
|
+
|
|
214
|
+
These mappings are navigation aids only. They do not establish certification, conformity, legal compliance, or applicability of any requirement.
|
|
215
|
+
|
|
216
|
+
See [`docs/standards-mapping.md`](docs/standards-mapping.md).
|
|
217
|
+
|
|
218
|
+
## Development
|
|
219
|
+
|
|
220
|
+
Python 3.11 or later is required.
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
python -m pip install -e '.[dev]'
|
|
224
|
+
make check
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
See [`CONTRIBUTING.md`](CONTRIBUTING.md) and [`SECURITY.md`](SECURITY.md).
|
|
228
|
+
|
|
229
|
+
## License
|
|
230
|
+
|
|
231
|
+
MIT. See [LICENSE](LICENSE).
|
|
232
|
+
|
|
233
|
+
© **Sylvester Kaczmarek** · [https://www.sylvesterkaczmarek.com](https://www.sylvesterkaczmarek.com)
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Security
|
|
2
|
+
|
|
3
|
+
AgentAck processes trace and policy files as untrusted input. The deterministic checker does not execute actions described by traces.
|
|
4
|
+
|
|
5
|
+
## Reporting vulnerabilities
|
|
6
|
+
|
|
7
|
+
Please use GitHub Security Advisories for vulnerabilities that could affect AgentAck users. Do not publish exploit details in a public issue before a fix is available.
|
|
8
|
+
|
|
9
|
+
Include the AgentAck version, operating system, reproduction steps, expected behavior, and observed behavior when practical. Do not include real credentials or unrelated sensitive data.
|
|
10
|
+
|
|
11
|
+
## Scope
|
|
12
|
+
|
|
13
|
+
Security-relevant areas include:
|
|
14
|
+
|
|
15
|
+
- trace/parser ambiguity or validation bypass;
|
|
16
|
+
- approval-rule false negatives;
|
|
17
|
+
- action-identity or lifecycle bypasses;
|
|
18
|
+
- unsafe live-adapter behavior;
|
|
19
|
+
- report leakage of sensitive action or telemetry data;
|
|
20
|
+
- local telemetry receiver vulnerabilities;
|
|
21
|
+
- package or CI supply-chain issues.
|
|
22
|
+
|
|
23
|
+
AgentAck is pre-1.0. Security fixes are applied to the current development line rather than maintained across multiple historical release branches.
|
|
24
|
+
|
|
25
|
+
See [`docs/security.md`](docs/security.md) for the detailed trust and adapter model.
|
|
File without changes
|