fleetproof 0.1.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.
- fleetproof-0.1.0/LICENSE +21 -0
- fleetproof-0.1.0/PKG-INFO +231 -0
- fleetproof-0.1.0/README.md +210 -0
- fleetproof-0.1.0/pyproject.toml +40 -0
- fleetproof-0.1.0/setup.cfg +4 -0
- fleetproof-0.1.0/src/fleetproof/__init__.py +46 -0
- fleetproof-0.1.0/src/fleetproof/__main__.py +6 -0
- fleetproof-0.1.0/src/fleetproof/checker.py +280 -0
- fleetproof-0.1.0/src/fleetproof/checks.py +218 -0
- fleetproof-0.1.0/src/fleetproof/cli.py +293 -0
- fleetproof-0.1.0/src/fleetproof/hookgate.py +166 -0
- fleetproof-0.1.0/src/fleetproof/report.py +384 -0
- fleetproof-0.1.0/src/fleetproof/runlog.py +500 -0
- fleetproof-0.1.0/src/fleetproof.egg-info/PKG-INFO +231 -0
- fleetproof-0.1.0/src/fleetproof.egg-info/SOURCES.txt +23 -0
- fleetproof-0.1.0/src/fleetproof.egg-info/dependency_links.txt +1 -0
- fleetproof-0.1.0/src/fleetproof.egg-info/entry_points.txt +2 -0
- fleetproof-0.1.0/src/fleetproof.egg-info/requires.txt +3 -0
- fleetproof-0.1.0/src/fleetproof.egg-info/top_level.txt +1 -0
- fleetproof-0.1.0/tests/test_checker.py +155 -0
- fleetproof-0.1.0/tests/test_checks.py +76 -0
- fleetproof-0.1.0/tests/test_cli.py +64 -0
- fleetproof-0.1.0/tests/test_hookgate.py +196 -0
- fleetproof-0.1.0/tests/test_report.py +131 -0
- fleetproof-0.1.0/tests/test_runlog.py +203 -0
fleetproof-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Gathrazio
|
|
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.
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: fleetproof
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Independent, out-of-band verification for agent fleets.
|
|
5
|
+
Author: Gathrazio
|
|
6
|
+
License: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/Gathrazio/fleetproof
|
|
8
|
+
Project-URL: Repository, https://github.com/Gathrazio/fleetproof
|
|
9
|
+
Keywords: agents,verification,claude-code,audit,run-log
|
|
10
|
+
Classifier: Development Status :: 3 - Alpha
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
15
|
+
Requires-Python: >=3.10
|
|
16
|
+
Description-Content-Type: text/markdown
|
|
17
|
+
License-File: LICENSE
|
|
18
|
+
Provides-Extra: dev
|
|
19
|
+
Requires-Dist: pytest>=7; extra == "dev"
|
|
20
|
+
Dynamic: license-file
|
|
21
|
+
|
|
22
|
+
# FleetProof
|
|
23
|
+
|
|
24
|
+
Independent, out-of-band verification for agent fleets — *what did my agents actually do, and what did they claim was done when it wasn't?*
|
|
25
|
+
|
|
26
|
+
FleetProof is a Claude Code plugin plus a small stdlib-only Python package. It
|
|
27
|
+
records what your agents do to a durable run log, and — critically — grades that
|
|
28
|
+
work with a checker that runs in a separate process from the agent that did
|
|
29
|
+
it. An agent may author the checks; it never executes and grades its own work.
|
|
30
|
+
|
|
31
|
+
## Why this exists
|
|
32
|
+
|
|
33
|
+
The failure mode this targets is the false "done": an agent reports a task
|
|
34
|
+
complete when it isn't. A recent characterization study
|
|
35
|
+
([arXiv:2606.09863](https://arxiv.org/abs/2606.09863)) measured it directly:
|
|
36
|
+
45–48% of failures in single-control tau2-bench domains are exactly this —
|
|
37
|
+
the agent confidently claims success. Among self-assessing coding-agent
|
|
38
|
+
trajectories on AppWorld, it's 75.8%. And in the study's one *dual-control*
|
|
39
|
+
setting — where a second, independent control point contradicts the agent's
|
|
40
|
+
claims — false success collapses to 3%.
|
|
41
|
+
|
|
42
|
+
FleetProof is built on that comparison: it gives any repo a second, independent
|
|
43
|
+
control point. (To be precise: the 3% is a measured property of that
|
|
44
|
+
benchmark setting, not a measured result of installing this tool — the study
|
|
45
|
+
motivates the design; it didn't test it.)
|
|
46
|
+
|
|
47
|
+
The word doing the work there is *independent*. A verifier that is the same agent
|
|
48
|
+
(or a sub-agent prompted by it) inherits the same blind spots and the same
|
|
49
|
+
incentive to declare victory. The only way to escape that is to move verification
|
|
50
|
+
out of the agent's own process and make it deterministic. That is the entire
|
|
51
|
+
design of FleetProof:
|
|
52
|
+
|
|
53
|
+
- the agent writes the run records and authors `checks.json`;
|
|
54
|
+
- a different process — the plugin's Stop hook, a `type: "command"` hook,
|
|
55
|
+
never an LLM — executes those checks and grades them;
|
|
56
|
+
- if a blocking check fails, the hook returns `{"decision": "block", ...}` and
|
|
57
|
+
Claude Code refuses to let the agent stop on the false "done".
|
|
58
|
+
|
|
59
|
+
No language model sits in the grading path. Grading is comparison.
|
|
60
|
+
|
|
61
|
+
> Verifying one machine is free, forever. A hosted team tier — shared
|
|
62
|
+
> evidence chains, approval queues, compliance export — is coming:
|
|
63
|
+
> [join the waitlist](https://forms.gle/FcuBTYyoV4x2z8Hm8).
|
|
64
|
+
|
|
65
|
+
## What's in the box
|
|
66
|
+
|
|
67
|
+
| Piece | What it does |
|
|
68
|
+
|---|---|
|
|
69
|
+
| `@recorded` / `record()` | Durable per-invocation run records under `.fleetproof/runs/`. |
|
|
70
|
+
| `fleetproof check` | The independent checker: runs each declared check in its own subprocess, records the verdict. |
|
|
71
|
+
| Stop hook | Runs the checker when an agent claims done; blocks on a blocking-check failure. |
|
|
72
|
+
| PostToolUse hook | Accretes a per-tool evidence trail into the run log. |
|
|
73
|
+
| `fleetproof report` | One self-contained HTML file: per run, claimed-done vs. independently-verified. |
|
|
74
|
+
|
|
75
|
+
Runtime dependencies: none (Python standard library only). A tool whose job is
|
|
76
|
+
being trustworthy should add as little dependency and supply-chain surface as it can.
|
|
77
|
+
|
|
78
|
+
## Install (each line is one command in Claude Code)
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
/plugin marketplace add Gathrazio/fleetproof
|
|
82
|
+
/plugin install fleetproof@fleetproof
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Then install the Python package so the CLI and hooks can run:
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
pip install fleetproof
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Requires Python 3.10+. The plugin's hook commands invoke `python`, so `python`
|
|
92
|
+
must be on your `PATH` (see *Scope and limitations*).
|
|
93
|
+
|
|
94
|
+
## 10-minute quickstart
|
|
95
|
+
|
|
96
|
+
1. Install the plugin and the package (three commands above).
|
|
97
|
+
2. Declare what "done" means for your repo:
|
|
98
|
+
```
|
|
99
|
+
fleetproof init
|
|
100
|
+
```
|
|
101
|
+
This writes a starter `.fleetproof/checks.json`. Edit it — each entry is
|
|
102
|
+
`{ "id", "run", "expect", "block" }`:
|
|
103
|
+
```json
|
|
104
|
+
{
|
|
105
|
+
"checks": [
|
|
106
|
+
{ "id": "tests-pass", "run": "python -m pytest -q", "expect": "exit0", "block": true },
|
|
107
|
+
{ "id": "artifact-built", "expect": { "file_exists": "dist/app.zip" }, "block": true }
|
|
108
|
+
]
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
`expect` is one of `"exit0"`, `{ "exit": N }`, `{ "regex": "..." }`, or
|
|
112
|
+
`{ "file_exists": "path" }`. `block: true` gates "done"; `block: false` is advisory.
|
|
113
|
+
3. Run any Claude Code agent task as usual. When it claims done, the Stop hook
|
|
114
|
+
runs `fleetproof check` in its own process. If a blocking check fails, Claude is
|
|
115
|
+
blocked from stopping and told exactly which check disagreed.
|
|
116
|
+
4. See what actually happened:
|
|
117
|
+
```
|
|
118
|
+
fleetproof list # runs, newest first
|
|
119
|
+
fleetproof report # writes .fleetproof/fleetproof-report.html
|
|
120
|
+
```
|
|
121
|
+
The report marks each run *verified*, *contradicted* (claimed done, but a
|
|
122
|
+
blocking check failed), or *unverified* (no out-of-band verdict on record).
|
|
123
|
+
|
|
124
|
+
You can also run the checker yourself at any time — `fleetproof check` — or on
|
|
125
|
+
demand via the bundled `/fleetproof:verify-fleet` skill.
|
|
126
|
+
|
|
127
|
+
## The check-spec format
|
|
128
|
+
|
|
129
|
+
`.fleetproof/checks.json` is deliberately small and declarative. It is a contract
|
|
130
|
+
you (or an agent, under your review) write *before* work is graded, kept in the
|
|
131
|
+
repo where it is versioned and diffable. JSON, not YAML, on purpose: there is no
|
|
132
|
+
third-party parser in the runtime.
|
|
133
|
+
|
|
134
|
+
An agent is welcome to propose or edit checks. The guarantee FleetProof makes is
|
|
135
|
+
narrower and firmer than "the agent verified its work": it is that *something
|
|
136
|
+
other than the agent* ran the checks and recorded the result.
|
|
137
|
+
|
|
138
|
+
## Writing richer checks
|
|
139
|
+
|
|
140
|
+
The grading vocabulary is deliberately small — exit codes, a regex, a file
|
|
141
|
+
existing — but `run` is an arbitrary command, so the *predicate* can be any
|
|
142
|
+
program. The pattern: encode "done" as a script that exits non-zero when it
|
|
143
|
+
isn't, and let FleetProof gate on the exit code.
|
|
144
|
+
|
|
145
|
+
```json
|
|
146
|
+
{
|
|
147
|
+
"checks": [
|
|
148
|
+
{ "id": "dataset-valid",
|
|
149
|
+
"run": "python scripts/validate_dataset.py out/rows.csv --min-rows 1000",
|
|
150
|
+
"expect": "exit0", "block": true,
|
|
151
|
+
"description": "Output CSV exists, parses, has >=1000 rows, no nulls in key columns." },
|
|
152
|
+
{ "id": "citations-resolve",
|
|
153
|
+
"run": "python scripts/check_links.py report/draft.md",
|
|
154
|
+
"expect": "exit0", "block": true },
|
|
155
|
+
{ "id": "full-suite-advisory",
|
|
156
|
+
"run": "python -m pytest tests/slow -q",
|
|
157
|
+
"expect": "exit0", "block": false,
|
|
158
|
+
"description": "Slow suite is advisory: recorded, never gates the stop." }
|
|
159
|
+
]
|
|
160
|
+
}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Anything a program can decide, a check can gate: schema conformance, row
|
|
164
|
+
counts, API health, diffs, wordcounts, link resolution. FleetProof's claim is
|
|
165
|
+
never that the predicate language is rich — it's that *whatever predicate you
|
|
166
|
+
choose runs outside the agent's process*.
|
|
167
|
+
|
|
168
|
+
Guidance that keeps the gate honest: keep blocking checks fast and
|
|
169
|
+
deterministic (flaky checks flap the gate; slow ones tax every stop) and demote
|
|
170
|
+
heavy suites to `block: false`. For fleets doing varied tasks in one repo,
|
|
171
|
+
the working convention is to have the agent author task-specific checks at task
|
|
172
|
+
start — authoring is a feature — and let the spec-drift flag make any later
|
|
173
|
+
revision loud. Per-task check scoping as a first-class mechanism is on the
|
|
174
|
+
roadmap.
|
|
175
|
+
|
|
176
|
+
## Scope and limitations (v0.1)
|
|
177
|
+
|
|
178
|
+
This is an early release. Honest boundaries:
|
|
179
|
+
|
|
180
|
+
- **`python` must be on `PATH`.** The plugin hooks invoke the checker via
|
|
181
|
+
`python "${CLAUDE_PLUGIN_ROOT}/scripts/..."`. Environments where the interpreter
|
|
182
|
+
is only reachable as `python3`, or not on `PATH`, need a shim — any wrapper on
|
|
183
|
+
`PATH` named `python` works, e.g. `sudo ln -s $(which python3) /usr/local/bin/python`.
|
|
184
|
+
- **Checks are shell commands.** Their portability is your responsibility — a
|
|
185
|
+
check that shells out to `grep` won't behave identically on every OS. And
|
|
186
|
+
because a repo's `checks.json` runs shell commands on the Stop event, treat a
|
|
187
|
+
cloned repo's `checks.json` with the same trust you give its `Makefile` or
|
|
188
|
+
pre-commit config: it is executable code. FleetProof adds no network surface of
|
|
189
|
+
its own, and first-run consent-per-spec-hash is on the roadmap.
|
|
190
|
+
- **The gate is only as good as the checks.** FleetProof enforces that an
|
|
191
|
+
independent process runs your checks; it cannot know whether your checks capture
|
|
192
|
+
what "done" really means. Weak checks give false confidence.
|
|
193
|
+
- **An agent can weaken its own checks.** Authoring `checks.json` is a feature, so
|
|
194
|
+
nothing stops an agent from editing it mid-session to slip the gate. FleetProof
|
|
195
|
+
does not (yet) forbid spec edits; instead it records the SHA-256 of the spec on
|
|
196
|
+
every verdict and flags mid-session *spec drift* loudly — in the Stop-gate
|
|
197
|
+
output, the CLI, and the report — when a verdict's spec hash differs from the
|
|
198
|
+
session's first. Drift does not by itself block a passing verdict in v0.1; spec
|
|
199
|
+
pinning and consent-on-change are on the roadmap.
|
|
200
|
+
- **Fail-open when unconfigured.** With no `.fleetproof/checks.json`, the Stop hook
|
|
201
|
+
does nothing (and says so on stderr) rather than blocking every task. A missing
|
|
202
|
+
spec is not a passing grade — it is an absent one.
|
|
203
|
+
- **Blocking can repeat.** If a blocking check keeps failing, the Stop hook keeps
|
|
204
|
+
blocking. That is intended (don't stop on a false done), but it means a check
|
|
205
|
+
that can never pass needs operator intervention.
|
|
206
|
+
|
|
207
|
+
## FleetProof for teams (coming — waitlist open)
|
|
208
|
+
|
|
209
|
+
The plugin verifies one machine. The hosted tier turns those local verdicts into
|
|
210
|
+
shared, durable evidence chains, team approval queues for gating agent
|
|
211
|
+
work a human signs off on, and a compliance export a non-engineer can
|
|
212
|
+
inspect — relevant as EU AI Act Article 14 human-oversight obligations become
|
|
213
|
+
enforceable (2026-08-02).
|
|
214
|
+
|
|
215
|
+
**[Join the waitlist →](https://forms.gle/FcuBTYyoV4x2z8Hm8)** — and tell us
|
|
216
|
+
which piece you'd want first.
|
|
217
|
+
|
|
218
|
+
The free plugin never sends anything anywhere: no telemetry, no network calls in
|
|
219
|
+
the runtime, your run data stays on your disk. The hosted tier is opt-in and
|
|
220
|
+
separate.
|
|
221
|
+
|
|
222
|
+
## Development
|
|
223
|
+
|
|
224
|
+
```
|
|
225
|
+
pip install -e ".[dev]"
|
|
226
|
+
python -m pytest -q
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
## License
|
|
230
|
+
|
|
231
|
+
MIT. Author: Gathrazio.
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
# FleetProof
|
|
2
|
+
|
|
3
|
+
Independent, out-of-band verification for agent fleets — *what did my agents actually do, and what did they claim was done when it wasn't?*
|
|
4
|
+
|
|
5
|
+
FleetProof is a Claude Code plugin plus a small stdlib-only Python package. It
|
|
6
|
+
records what your agents do to a durable run log, and — critically — grades that
|
|
7
|
+
work with a checker that runs in a separate process from the agent that did
|
|
8
|
+
it. An agent may author the checks; it never executes and grades its own work.
|
|
9
|
+
|
|
10
|
+
## Why this exists
|
|
11
|
+
|
|
12
|
+
The failure mode this targets is the false "done": an agent reports a task
|
|
13
|
+
complete when it isn't. A recent characterization study
|
|
14
|
+
([arXiv:2606.09863](https://arxiv.org/abs/2606.09863)) measured it directly:
|
|
15
|
+
45–48% of failures in single-control tau2-bench domains are exactly this —
|
|
16
|
+
the agent confidently claims success. Among self-assessing coding-agent
|
|
17
|
+
trajectories on AppWorld, it's 75.8%. And in the study's one *dual-control*
|
|
18
|
+
setting — where a second, independent control point contradicts the agent's
|
|
19
|
+
claims — false success collapses to 3%.
|
|
20
|
+
|
|
21
|
+
FleetProof is built on that comparison: it gives any repo a second, independent
|
|
22
|
+
control point. (To be precise: the 3% is a measured property of that
|
|
23
|
+
benchmark setting, not a measured result of installing this tool — the study
|
|
24
|
+
motivates the design; it didn't test it.)
|
|
25
|
+
|
|
26
|
+
The word doing the work there is *independent*. A verifier that is the same agent
|
|
27
|
+
(or a sub-agent prompted by it) inherits the same blind spots and the same
|
|
28
|
+
incentive to declare victory. The only way to escape that is to move verification
|
|
29
|
+
out of the agent's own process and make it deterministic. That is the entire
|
|
30
|
+
design of FleetProof:
|
|
31
|
+
|
|
32
|
+
- the agent writes the run records and authors `checks.json`;
|
|
33
|
+
- a different process — the plugin's Stop hook, a `type: "command"` hook,
|
|
34
|
+
never an LLM — executes those checks and grades them;
|
|
35
|
+
- if a blocking check fails, the hook returns `{"decision": "block", ...}` and
|
|
36
|
+
Claude Code refuses to let the agent stop on the false "done".
|
|
37
|
+
|
|
38
|
+
No language model sits in the grading path. Grading is comparison.
|
|
39
|
+
|
|
40
|
+
> Verifying one machine is free, forever. A hosted team tier — shared
|
|
41
|
+
> evidence chains, approval queues, compliance export — is coming:
|
|
42
|
+
> [join the waitlist](https://forms.gle/FcuBTYyoV4x2z8Hm8).
|
|
43
|
+
|
|
44
|
+
## What's in the box
|
|
45
|
+
|
|
46
|
+
| Piece | What it does |
|
|
47
|
+
|---|---|
|
|
48
|
+
| `@recorded` / `record()` | Durable per-invocation run records under `.fleetproof/runs/`. |
|
|
49
|
+
| `fleetproof check` | The independent checker: runs each declared check in its own subprocess, records the verdict. |
|
|
50
|
+
| Stop hook | Runs the checker when an agent claims done; blocks on a blocking-check failure. |
|
|
51
|
+
| PostToolUse hook | Accretes a per-tool evidence trail into the run log. |
|
|
52
|
+
| `fleetproof report` | One self-contained HTML file: per run, claimed-done vs. independently-verified. |
|
|
53
|
+
|
|
54
|
+
Runtime dependencies: none (Python standard library only). A tool whose job is
|
|
55
|
+
being trustworthy should add as little dependency and supply-chain surface as it can.
|
|
56
|
+
|
|
57
|
+
## Install (each line is one command in Claude Code)
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
/plugin marketplace add Gathrazio/fleetproof
|
|
61
|
+
/plugin install fleetproof@fleetproof
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Then install the Python package so the CLI and hooks can run:
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
pip install fleetproof
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Requires Python 3.10+. The plugin's hook commands invoke `python`, so `python`
|
|
71
|
+
must be on your `PATH` (see *Scope and limitations*).
|
|
72
|
+
|
|
73
|
+
## 10-minute quickstart
|
|
74
|
+
|
|
75
|
+
1. Install the plugin and the package (three commands above).
|
|
76
|
+
2. Declare what "done" means for your repo:
|
|
77
|
+
```
|
|
78
|
+
fleetproof init
|
|
79
|
+
```
|
|
80
|
+
This writes a starter `.fleetproof/checks.json`. Edit it — each entry is
|
|
81
|
+
`{ "id", "run", "expect", "block" }`:
|
|
82
|
+
```json
|
|
83
|
+
{
|
|
84
|
+
"checks": [
|
|
85
|
+
{ "id": "tests-pass", "run": "python -m pytest -q", "expect": "exit0", "block": true },
|
|
86
|
+
{ "id": "artifact-built", "expect": { "file_exists": "dist/app.zip" }, "block": true }
|
|
87
|
+
]
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
`expect` is one of `"exit0"`, `{ "exit": N }`, `{ "regex": "..." }`, or
|
|
91
|
+
`{ "file_exists": "path" }`. `block: true` gates "done"; `block: false` is advisory.
|
|
92
|
+
3. Run any Claude Code agent task as usual. When it claims done, the Stop hook
|
|
93
|
+
runs `fleetproof check` in its own process. If a blocking check fails, Claude is
|
|
94
|
+
blocked from stopping and told exactly which check disagreed.
|
|
95
|
+
4. See what actually happened:
|
|
96
|
+
```
|
|
97
|
+
fleetproof list # runs, newest first
|
|
98
|
+
fleetproof report # writes .fleetproof/fleetproof-report.html
|
|
99
|
+
```
|
|
100
|
+
The report marks each run *verified*, *contradicted* (claimed done, but a
|
|
101
|
+
blocking check failed), or *unverified* (no out-of-band verdict on record).
|
|
102
|
+
|
|
103
|
+
You can also run the checker yourself at any time — `fleetproof check` — or on
|
|
104
|
+
demand via the bundled `/fleetproof:verify-fleet` skill.
|
|
105
|
+
|
|
106
|
+
## The check-spec format
|
|
107
|
+
|
|
108
|
+
`.fleetproof/checks.json` is deliberately small and declarative. It is a contract
|
|
109
|
+
you (or an agent, under your review) write *before* work is graded, kept in the
|
|
110
|
+
repo where it is versioned and diffable. JSON, not YAML, on purpose: there is no
|
|
111
|
+
third-party parser in the runtime.
|
|
112
|
+
|
|
113
|
+
An agent is welcome to propose or edit checks. The guarantee FleetProof makes is
|
|
114
|
+
narrower and firmer than "the agent verified its work": it is that *something
|
|
115
|
+
other than the agent* ran the checks and recorded the result.
|
|
116
|
+
|
|
117
|
+
## Writing richer checks
|
|
118
|
+
|
|
119
|
+
The grading vocabulary is deliberately small — exit codes, a regex, a file
|
|
120
|
+
existing — but `run` is an arbitrary command, so the *predicate* can be any
|
|
121
|
+
program. The pattern: encode "done" as a script that exits non-zero when it
|
|
122
|
+
isn't, and let FleetProof gate on the exit code.
|
|
123
|
+
|
|
124
|
+
```json
|
|
125
|
+
{
|
|
126
|
+
"checks": [
|
|
127
|
+
{ "id": "dataset-valid",
|
|
128
|
+
"run": "python scripts/validate_dataset.py out/rows.csv --min-rows 1000",
|
|
129
|
+
"expect": "exit0", "block": true,
|
|
130
|
+
"description": "Output CSV exists, parses, has >=1000 rows, no nulls in key columns." },
|
|
131
|
+
{ "id": "citations-resolve",
|
|
132
|
+
"run": "python scripts/check_links.py report/draft.md",
|
|
133
|
+
"expect": "exit0", "block": true },
|
|
134
|
+
{ "id": "full-suite-advisory",
|
|
135
|
+
"run": "python -m pytest tests/slow -q",
|
|
136
|
+
"expect": "exit0", "block": false,
|
|
137
|
+
"description": "Slow suite is advisory: recorded, never gates the stop." }
|
|
138
|
+
]
|
|
139
|
+
}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Anything a program can decide, a check can gate: schema conformance, row
|
|
143
|
+
counts, API health, diffs, wordcounts, link resolution. FleetProof's claim is
|
|
144
|
+
never that the predicate language is rich — it's that *whatever predicate you
|
|
145
|
+
choose runs outside the agent's process*.
|
|
146
|
+
|
|
147
|
+
Guidance that keeps the gate honest: keep blocking checks fast and
|
|
148
|
+
deterministic (flaky checks flap the gate; slow ones tax every stop) and demote
|
|
149
|
+
heavy suites to `block: false`. For fleets doing varied tasks in one repo,
|
|
150
|
+
the working convention is to have the agent author task-specific checks at task
|
|
151
|
+
start — authoring is a feature — and let the spec-drift flag make any later
|
|
152
|
+
revision loud. Per-task check scoping as a first-class mechanism is on the
|
|
153
|
+
roadmap.
|
|
154
|
+
|
|
155
|
+
## Scope and limitations (v0.1)
|
|
156
|
+
|
|
157
|
+
This is an early release. Honest boundaries:
|
|
158
|
+
|
|
159
|
+
- **`python` must be on `PATH`.** The plugin hooks invoke the checker via
|
|
160
|
+
`python "${CLAUDE_PLUGIN_ROOT}/scripts/..."`. Environments where the interpreter
|
|
161
|
+
is only reachable as `python3`, or not on `PATH`, need a shim — any wrapper on
|
|
162
|
+
`PATH` named `python` works, e.g. `sudo ln -s $(which python3) /usr/local/bin/python`.
|
|
163
|
+
- **Checks are shell commands.** Their portability is your responsibility — a
|
|
164
|
+
check that shells out to `grep` won't behave identically on every OS. And
|
|
165
|
+
because a repo's `checks.json` runs shell commands on the Stop event, treat a
|
|
166
|
+
cloned repo's `checks.json` with the same trust you give its `Makefile` or
|
|
167
|
+
pre-commit config: it is executable code. FleetProof adds no network surface of
|
|
168
|
+
its own, and first-run consent-per-spec-hash is on the roadmap.
|
|
169
|
+
- **The gate is only as good as the checks.** FleetProof enforces that an
|
|
170
|
+
independent process runs your checks; it cannot know whether your checks capture
|
|
171
|
+
what "done" really means. Weak checks give false confidence.
|
|
172
|
+
- **An agent can weaken its own checks.** Authoring `checks.json` is a feature, so
|
|
173
|
+
nothing stops an agent from editing it mid-session to slip the gate. FleetProof
|
|
174
|
+
does not (yet) forbid spec edits; instead it records the SHA-256 of the spec on
|
|
175
|
+
every verdict and flags mid-session *spec drift* loudly — in the Stop-gate
|
|
176
|
+
output, the CLI, and the report — when a verdict's spec hash differs from the
|
|
177
|
+
session's first. Drift does not by itself block a passing verdict in v0.1; spec
|
|
178
|
+
pinning and consent-on-change are on the roadmap.
|
|
179
|
+
- **Fail-open when unconfigured.** With no `.fleetproof/checks.json`, the Stop hook
|
|
180
|
+
does nothing (and says so on stderr) rather than blocking every task. A missing
|
|
181
|
+
spec is not a passing grade — it is an absent one.
|
|
182
|
+
- **Blocking can repeat.** If a blocking check keeps failing, the Stop hook keeps
|
|
183
|
+
blocking. That is intended (don't stop on a false done), but it means a check
|
|
184
|
+
that can never pass needs operator intervention.
|
|
185
|
+
|
|
186
|
+
## FleetProof for teams (coming — waitlist open)
|
|
187
|
+
|
|
188
|
+
The plugin verifies one machine. The hosted tier turns those local verdicts into
|
|
189
|
+
shared, durable evidence chains, team approval queues for gating agent
|
|
190
|
+
work a human signs off on, and a compliance export a non-engineer can
|
|
191
|
+
inspect — relevant as EU AI Act Article 14 human-oversight obligations become
|
|
192
|
+
enforceable (2026-08-02).
|
|
193
|
+
|
|
194
|
+
**[Join the waitlist →](https://forms.gle/FcuBTYyoV4x2z8Hm8)** — and tell us
|
|
195
|
+
which piece you'd want first.
|
|
196
|
+
|
|
197
|
+
The free plugin never sends anything anywhere: no telemetry, no network calls in
|
|
198
|
+
the runtime, your run data stays on your disk. The hosted tier is opt-in and
|
|
199
|
+
separate.
|
|
200
|
+
|
|
201
|
+
## Development
|
|
202
|
+
|
|
203
|
+
```
|
|
204
|
+
pip install -e ".[dev]"
|
|
205
|
+
python -m pytest -q
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## License
|
|
209
|
+
|
|
210
|
+
MIT. Author: Gathrazio.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=68"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "fleetproof"
|
|
7
|
+
version = "0.1.0"
|
|
8
|
+
description = "Independent, out-of-band verification for agent fleets."
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.10"
|
|
11
|
+
license = { text = "MIT" }
|
|
12
|
+
authors = [{ name = "Gathrazio" }]
|
|
13
|
+
keywords = ["agents", "verification", "claude-code", "audit", "run-log"]
|
|
14
|
+
classifiers = [
|
|
15
|
+
"Development Status :: 3 - Alpha",
|
|
16
|
+
"Intended Audience :: Developers",
|
|
17
|
+
"License :: OSI Approved :: MIT License",
|
|
18
|
+
"Programming Language :: Python :: 3",
|
|
19
|
+
"Topic :: Software Development :: Quality Assurance",
|
|
20
|
+
]
|
|
21
|
+
# Runtime is stdlib-only on purpose: a verification tool should add as little
|
|
22
|
+
# dependency (and supply-chain) surface as it can get away with.
|
|
23
|
+
dependencies = []
|
|
24
|
+
|
|
25
|
+
[project.optional-dependencies]
|
|
26
|
+
dev = ["pytest>=7"]
|
|
27
|
+
|
|
28
|
+
[project.urls]
|
|
29
|
+
Homepage = "https://github.com/Gathrazio/fleetproof"
|
|
30
|
+
Repository = "https://github.com/Gathrazio/fleetproof"
|
|
31
|
+
|
|
32
|
+
[project.scripts]
|
|
33
|
+
fleetproof = "fleetproof.cli:main"
|
|
34
|
+
|
|
35
|
+
[tool.setuptools.packages.find]
|
|
36
|
+
where = ["src"]
|
|
37
|
+
|
|
38
|
+
[tool.pytest.ini_options]
|
|
39
|
+
testpaths = ["tests"]
|
|
40
|
+
pythonpath = ["src"]
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"""FleetProof — independent, out-of-band verification for agent fleets.
|
|
2
|
+
|
|
3
|
+
The agent may author the checks; it never executes and grades its own work.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from __future__ import annotations
|
|
7
|
+
|
|
8
|
+
__version__ = "0.1.0"
|
|
9
|
+
|
|
10
|
+
from .runlog import (
|
|
11
|
+
RunRecord,
|
|
12
|
+
SubInvocation,
|
|
13
|
+
child_run_id,
|
|
14
|
+
current_run_id,
|
|
15
|
+
list_run_records,
|
|
16
|
+
load_run,
|
|
17
|
+
project_root,
|
|
18
|
+
record,
|
|
19
|
+
recorded,
|
|
20
|
+
runs_dir,
|
|
21
|
+
set_runs_dir,
|
|
22
|
+
)
|
|
23
|
+
from .checks import Check, CheckSpecError, load_checks
|
|
24
|
+
from .checker import CheckReport, CheckResult, run_check, run_checks
|
|
25
|
+
|
|
26
|
+
__all__ = [
|
|
27
|
+
"__version__",
|
|
28
|
+
"recorded",
|
|
29
|
+
"record",
|
|
30
|
+
"current_run_id",
|
|
31
|
+
"child_run_id",
|
|
32
|
+
"project_root",
|
|
33
|
+
"runs_dir",
|
|
34
|
+
"set_runs_dir",
|
|
35
|
+
"list_run_records",
|
|
36
|
+
"load_run",
|
|
37
|
+
"RunRecord",
|
|
38
|
+
"SubInvocation",
|
|
39
|
+
"Check",
|
|
40
|
+
"CheckSpecError",
|
|
41
|
+
"load_checks",
|
|
42
|
+
"CheckReport",
|
|
43
|
+
"CheckResult",
|
|
44
|
+
"run_check",
|
|
45
|
+
"run_checks",
|
|
46
|
+
]
|