orvix-provepr 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.
- orvix_provepr-0.1.0/LICENSE +21 -0
- orvix_provepr-0.1.0/PKG-INFO +298 -0
- orvix_provepr-0.1.0/README.md +267 -0
- orvix_provepr-0.1.0/pyproject.toml +65 -0
- orvix_provepr-0.1.0/pyproject.toml.orig +56 -0
- orvix_provepr-0.1.0/src/provepr/__init__.py +0 -0
- orvix_provepr-0.1.0/src/provepr/cli.py +63 -0
- orvix_provepr-0.1.0/src/provepr/docs/guide.md +167 -0
- orvix_provepr-0.1.0/src/provepr/init.py +127 -0
- orvix_provepr-0.1.0/src/provepr/plan.py +100 -0
- orvix_provepr-0.1.0/src/provepr/report.py +109 -0
- orvix_provepr-0.1.0/src/provepr/runner.py +270 -0
- orvix_provepr-0.1.0/src/provepr/server.py +143 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Orvix Labs
|
|
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,298 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: orvix-provepr
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Make AI coding agents prove their PR claims in a real browser, and fix what fails.
|
|
5
|
+
Keywords: ai-agents,claude-code,codex,mcp,playwright,pull-request,verification
|
|
6
|
+
Author: Tirth
|
|
7
|
+
Author-email: Tirth <trhatwork@gmail.com>
|
|
8
|
+
License-Expression: MIT
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Classifier: Development Status :: 3 - Alpha
|
|
11
|
+
Classifier: Environment :: Console
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
14
|
+
Classifier: Operating System :: MacOS
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
19
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
20
|
+
Classifier: Topic :: Software Development :: Testing
|
|
21
|
+
Requires-Dist: mcp>=2.3
|
|
22
|
+
Requires-Dist: pillow>=13.0.0
|
|
23
|
+
Requires-Dist: playwright>=1.64.0
|
|
24
|
+
Requires-Dist: pyyaml>=6.0.3
|
|
25
|
+
Requires-Python: >=3.12
|
|
26
|
+
Project-URL: Homepage, https://github.com/orvixx-labs/orvix-provepr
|
|
27
|
+
Project-URL: Repository, https://github.com/orvixx-labs/orvix-provepr
|
|
28
|
+
Project-URL: Documentation, https://github.com/orvixx-labs/orvix-provepr/blob/main/src/provepr/docs/guide.md
|
|
29
|
+
Project-URL: Issues, https://github.com/orvixx-labs/orvix-provepr/issues
|
|
30
|
+
Description-Content-Type: text/markdown
|
|
31
|
+
|
|
32
|
+
# orvix-provepr
|
|
33
|
+
|
|
34
|
+
**Your coding agent says it's done. provepr makes it prove it.**
|
|
35
|
+
|
|
36
|
+
Before an agent (Claude Code, Codex, Cursor, or anything that reads `AGENTS.md`) calls a change done or
|
|
37
|
+
opens a PR, it writes down what the change claims and how to check it. provepr runs those checks in a real
|
|
38
|
+
browser and against the app's HTTP API, and hands back facts: which step failed, HTTP 5xx responses, page
|
|
39
|
+
and console errors, a screenshot after every step, and a video. The agent fixes what failed and runs the checks again. By the time a human opens
|
|
40
|
+
the PR, each claim is marked PASS, FAIL or UNVERIFIED.
|
|
41
|
+
|
|
42
|
+
provepr never calls an LLM. The agent's own model writes the plan and reads the evidence. provepr only runs
|
|
43
|
+
the browser and reports what happened.
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
$ provepr run
|
|
47
|
+
# provepr run 20261018-042535-318161
|
|
48
|
+
1 PASS · 1 FAIL · 1 UNVERIFIED (base_url http://127.0.0.1:8765)
|
|
49
|
+
|
|
50
|
+
## PASS `page-loads`: The profile page loads with a Name field and a Save button
|
|
51
|
+
- steps passed: 4/4
|
|
52
|
+
|
|
53
|
+
## FAIL `save-persists`: Clicking Save stores the name, and it is still there after a reload
|
|
54
|
+
- steps passed: 5/6
|
|
55
|
+
- FAILED step 6 `expect_value {"label": "Name", "value": "Ada Lovelace"}`: Locator expected to have Value 'Ada Lovelace' | Actual value:
|
|
56
|
+
- HTTP 500 POST http://127.0.0.1:8765/api/profile
|
|
57
|
+
|
|
58
|
+
## UNVERIFIED `name-length-limit`: The API rejects names longer than 100 characters
|
|
59
|
+
- no runnable steps (not checkable in a browser yet)
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
In that run the page showed "Saved" while the server returned a 500, so the bug would have shipped.
|
|
63
|
+
With provepr set up, Claude Code found and fixed it by itself (see [What it caught](#what-it-caught)).
|
|
64
|
+
|
|
65
|
+
## Quick start
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
uv tool install orvix-provepr # or: pipx install orvix-provepr
|
|
69
|
+
cd your-app && provepr init
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
`provepr init` sets the repo up so every agent and CI use provepr the same way:
|
|
73
|
+
|
|
74
|
+
| File | What it gets |
|
|
75
|
+
|---|---|
|
|
76
|
+
| `AGENTS.md` | A short managed block telling any agent to read `provepr docs` and follow the loop before calling a change done |
|
|
77
|
+
| `CLAUDE.md` | `@AGENTS.md`, so Claude Code reads the same rules |
|
|
78
|
+
| `.provepr/plan.yaml` | A starter plan. Set `base_url` and `start` to fit your app |
|
|
79
|
+
| `.github/workflows/provepr.yml` | A CI job that runs `provepr check`, then `provepr run`, on every PR and uploads the evidence |
|
|
80
|
+
| `.gitignore` | `.provepr/runs/` |
|
|
81
|
+
|
|
82
|
+
Running it again changes nothing. Existing files are kept, and only the marked AGENTS.md block is refreshed.
|
|
83
|
+
After that, just ask your agent for changes as usual.
|
|
84
|
+
|
|
85
|
+
## How it works
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
Coding agent (Claude Code / Codex / anything that reads AGENTS.md)
|
|
89
|
+
│ 0. AGENTS.md says: read `provepr docs` (the guide bundled with the installed version)
|
|
90
|
+
│ 1. writes the change + adds claims to .provepr/plan.yaml (the steps that prove them)
|
|
91
|
+
│ 2. runs `provepr check`, then `provepr run` (or the run_proof MCP tool)
|
|
92
|
+
▼
|
|
93
|
+
provepr
|
|
94
|
+
├─ starts the app (optional `start:` command) and waits for it
|
|
95
|
+
├─ runs each claim in headless Chromium: video, a screenshot after every step,
|
|
96
|
+
│ console errors, page errors, every HTTP 4xx/5xx and failed request,
|
|
97
|
+
│ plus `http` steps that call the app's API directly
|
|
98
|
+
├─ marks each claim PASS / FAIL / UNVERIFIED using fixed rules, no AI
|
|
99
|
+
└─ writes the evidence bundle to .provepr/runs/<run>/
|
|
100
|
+
▼
|
|
101
|
+
Agent reads a short report (about 250 tokens) and one contact sheet image
|
|
102
|
+
└─ get_frames(claim) for screenshots of the failing step → fixes the code → runs again
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**What counts as a failure.** A claim FAILs if a step fails, the page throws an uncaught error, a request
|
|
106
|
+
returns HTTP 5xx, or a request fails at the network level. Console errors and HTTP 4xx responses are listed
|
|
107
|
+
for the agent to judge but do not fail the claim. A claim with no steps is UNVERIFIED, never PASS.
|
|
108
|
+
|
|
109
|
+
**Why the plan comes first.** The agent decides what "working" looks like before it sees any evidence,
|
|
110
|
+
and the guide forbids weakening the plan to make it pass. An agent that grades its own work this way
|
|
111
|
+
is much harder to fool, including by its own optimism.
|
|
112
|
+
|
|
113
|
+
**Why the plan accumulates.** Each change adds claims and keeps the old ones, so `plan.yaml` grows into a
|
|
114
|
+
regression suite as a side effect, and CI runs all of it.
|
|
115
|
+
|
|
116
|
+
**How agents learn the rules.** The guide for coding agents ships inside the package
|
|
117
|
+
([`src/provepr/docs/guide.md`](https://github.com/orvixx-labs/orvix-provepr/blob/main/src/provepr/docs/guide.md)), so it always matches the installed version.
|
|
118
|
+
Agents reach it through `provepr docs`, the `get_guide` MCP tool, or the plugin's skill. All three point to
|
|
119
|
+
the same file. `provepr check` enforces the parts a guide can't: unknown steps, unsafe ids, and claims
|
|
120
|
+
with no checks are rejected before anything runs.
|
|
121
|
+
|
|
122
|
+
## Install
|
|
123
|
+
|
|
124
|
+
You need [uv](https://docs.astral.sh/uv/). On first run provepr downloads Chromium for Playwright by itself.
|
|
125
|
+
|
|
126
|
+
### Any agent (AGENTS.md)
|
|
127
|
+
|
|
128
|
+
```
|
|
129
|
+
uv tool install orvix-provepr
|
|
130
|
+
provepr init
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
This works with any agent that reads `AGENTS.md` and can run shell commands.
|
|
134
|
+
|
|
135
|
+
### Claude Code
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
/plugin marketplace add orvixx-labs/orvix-provepr
|
|
139
|
+
/plugin install provepr@orvix
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
To load it for a single session from a local checkout: `claude --plugin-dir /path/to/orvix-provepr`.
|
|
143
|
+
|
|
144
|
+
### Codex
|
|
145
|
+
|
|
146
|
+
```
|
|
147
|
+
codex plugin marketplace add orvixx-labs/orvix-provepr
|
|
148
|
+
codex plugin add provepr
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Or add it as a plain MCP server:
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
codex mcp add provepr -- uvx --from orvix-provepr provepr mcp
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
> Codex support has not been tested end to end yet. Claude Code has (see below). Please open an issue if it doesn't work for you.
|
|
158
|
+
|
|
159
|
+
## Use it
|
|
160
|
+
|
|
161
|
+
Ask the agent to prove its change works before it opens a PR, for example:
|
|
162
|
+
|
|
163
|
+
> Before you open the PR, prove the feature works with provepr and fix anything that's broken.
|
|
164
|
+
|
|
165
|
+
With `provepr init` done or the plugin installed, the agent learns the plan format and the loop from the
|
|
166
|
+
bundled guide: claims first, then check, run, read, fix, and run again.
|
|
167
|
+
|
|
168
|
+
### Writing a plan
|
|
169
|
+
|
|
170
|
+
```yaml
|
|
171
|
+
# .provepr/plan.yaml (commit this; ignore .provepr/runs/)
|
|
172
|
+
base_url: http://localhost:3000
|
|
173
|
+
start: npm run dev # optional; run from the project root, stopped after the run
|
|
174
|
+
|
|
175
|
+
claims:
|
|
176
|
+
- id: save-persists
|
|
177
|
+
says: "Clicking Save stores the name, and it is still there after a reload"
|
|
178
|
+
steps:
|
|
179
|
+
- goto: /settings
|
|
180
|
+
- fill: { label: Name, value: Ada }
|
|
181
|
+
- click: { role: button, name: Save }
|
|
182
|
+
- expect_text: Saved
|
|
183
|
+
- reload: true
|
|
184
|
+
- expect_value: { label: Name, value: Ada }
|
|
185
|
+
|
|
186
|
+
- id: name-too-long-rejected
|
|
187
|
+
says: "The API rejects names longer than 100 characters"
|
|
188
|
+
steps:
|
|
189
|
+
- http: { method: POST, path: /api/profile, json: { name: "..." }, expect_status: 400 }
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
The full step and locator reference is in the guide: run `provepr docs`, or read
|
|
193
|
+
[`src/provepr/docs/guide.md`](https://github.com/orvixx-labs/orvix-provepr/blob/main/src/provepr/docs/guide.md).
|
|
194
|
+
|
|
195
|
+
### MCP tools
|
|
196
|
+
|
|
197
|
+
| Tool | Returns |
|
|
198
|
+
|---|---|
|
|
199
|
+
| `get_guide()` | the guide for coding agents (plan format, steps, rules) |
|
|
200
|
+
| `run_proof(plan_path?, base_url?, claims?)` | the short report and one contact sheet image |
|
|
201
|
+
| `get_report(plan_path?, run?, include_json?)` | the latest (or a named) run's report, optionally with full JSON |
|
|
202
|
+
| `get_frames(claim_id, steps?, plan_path?, run?)` | screenshots of the failing step and the one before it, or of any steps you ask for |
|
|
203
|
+
|
|
204
|
+
### Command line
|
|
205
|
+
|
|
206
|
+
```
|
|
207
|
+
provepr init [dir] [--no-ci] # set up AGENTS.md, CLAUDE.md, plan, CI workflow, .gitignore
|
|
208
|
+
provepr docs # print the guide for coding agents
|
|
209
|
+
provepr check [--plan PATH] # validate the plan; exits 1 on problems
|
|
210
|
+
provepr run [--plan PATH] [--base-url URL] [--only ids] [--keep-evidence] # exits 1 on any FAIL
|
|
211
|
+
provepr mcp # serve the MCP tools over stdio
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
`base_url` resolves in this order: `--base-url`, then the `PROVEPR_BASE_URL` environment variable, then the plan.
|
|
215
|
+
|
|
216
|
+
### The evidence bundle
|
|
217
|
+
|
|
218
|
+
```
|
|
219
|
+
.provepr/runs/20261018-042535-318161/
|
|
220
|
+
├── report.md what the agent reads
|
|
221
|
+
├── report.json every step, error and timing
|
|
222
|
+
├── contact.png one frame per claim, captioned PASS/FAIL
|
|
223
|
+
├── frames/<claim>/NN.png
|
|
224
|
+
├── videos/<claim>.webm
|
|
225
|
+
└── app.log output of the `start` command
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
Screenshots and video are kept only for claims that FAILed, because the agent needs them to fix the
|
|
229
|
+
code. Passing claims keep their report lines and their frame in `contact.png`. Only the newest 5 runs are
|
|
230
|
+
kept. A fully passing run of 12 claims takes about 190 KB instead of 3.2 MB. Use `--keep-evidence` to
|
|
231
|
+
keep everything, e.g. to attach a video to a PR.
|
|
232
|
+
|
|
233
|
+
## CI
|
|
234
|
+
|
|
235
|
+
`provepr init` writes `.github/workflows/provepr.yml`. It installs Chromium, runs `provepr check`, runs every
|
|
236
|
+
claim, and uploads `.provepr/runs/` as a build artifact even when the job fails. The `start:` command in the
|
|
237
|
+
plan boots your app on the CI runner, so add the steps that install your app's dependencies where the
|
|
238
|
+
workflow's comment shows. Don't hand-write this file: `init` produces the same tested template everywhere.
|
|
239
|
+
|
|
240
|
+
## What it caught
|
|
241
|
+
|
|
242
|
+
`examples/demo_app` has a planted bug: the save handler reads the wrong JSON key, so every save returns
|
|
243
|
+
a 500, and the page shows "Saved" anyway. We gave Claude Code (headless, with this plugin) a fresh copy and
|
|
244
|
+
only this prompt:
|
|
245
|
+
|
|
246
|
+
> I built a profile page where you can type your name and save it. Before I open a PR, prove the feature
|
|
247
|
+
> works and fix anything that's broken.
|
|
248
|
+
|
|
249
|
+
It loaded the skill, wrote its own plan, ran it, and got a FAIL with the HTTP 500. It then fixed the server
|
|
250
|
+
**and** the UI that said "Saved" on a failed save, and ran again: `1 PASS · 0 FAIL`. In its final message
|
|
251
|
+
it listed the paths it could not check in a browser. That took 14 turns, and provepr made no LLM calls.
|
|
252
|
+
|
|
253
|
+
We repeated the test with **no plugin at all**, only the files `provepr init` writes, and a prompt that
|
|
254
|
+
never mentions provepr ("make sure it works and fix anything that's broken"). Claude Code read the rules
|
|
255
|
+
from AGENTS.md and ran `provepr docs`. It added two claims while keeping the existing one, used an `http`
|
|
256
|
+
step to check that bad input gets a 400, fixed both bugs, and finished at `3 PASS · 0 FAIL` in 13 turns.
|
|
257
|
+
|
|
258
|
+
Run the demo yourself:
|
|
259
|
+
|
|
260
|
+
```
|
|
261
|
+
cd examples/demo_app && uv run --project ../.. provepr run
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
## How it differs from other tools
|
|
265
|
+
|
|
266
|
+
- **Screen recorders for agents** capture what the agent did so a human can review it later. provepr checks
|
|
267
|
+
claims the agent committed to beforehand and returns a pass/fail result the agent acts on.
|
|
268
|
+
- **Visual regression tools** (screenshot diffing) tell you pixels changed, not whether the feature works.
|
|
269
|
+
- **AI code reviewers** read the diff. provepr runs the change.
|
|
270
|
+
|
|
271
|
+
## Limits
|
|
272
|
+
|
|
273
|
+
- Web apps only for now: browser steps plus `http` steps against the app's API. CLI tools and
|
|
274
|
+
background jobs are UNVERIFIED.
|
|
275
|
+
- There is no step yet to simulate network failures in the browser, so a UI's own error messages are
|
|
276
|
+
hard to reach.
|
|
277
|
+
- No screenshot diff against the base branch yet.
|
|
278
|
+
- Runs locally. Hosted runs on PR preview deployments (a GitHub App) are on the roadmap.
|
|
279
|
+
|
|
280
|
+
## Roadmap
|
|
281
|
+
|
|
282
|
+
- [x] Local runner, evidence bundle, CLI
|
|
283
|
+
- [x] MCP server, skill, Claude Code and Codex plugin
|
|
284
|
+
- [x] Bundled agent guide, `provepr init` (AGENTS.md, CI workflow), `provepr check`
|
|
285
|
+
- [x] Accumulating plans, `--only`, `http` steps for API claims
|
|
286
|
+
- [ ] Network mocking and failure steps in the browser
|
|
287
|
+
- [ ] `provepr check --base main`: flag claims removed or weakened compared to the base branch
|
|
288
|
+
- [ ] GitHub App: run on every PR against its preview deployment (Vercel, Netlify) and post a PR comment
|
|
289
|
+
- [ ] Screenshot diff against the base branch
|
|
290
|
+
- [ ] Terminal and CLI apps
|
|
291
|
+
|
|
292
|
+
## Contributing
|
|
293
|
+
|
|
294
|
+
See [CONTRIBUTING.md](https://github.com/orvixx-labs/orvix-provepr/blob/main/CONTRIBUTING.md).
|
|
295
|
+
|
|
296
|
+
## License
|
|
297
|
+
|
|
298
|
+
[MIT](https://github.com/orvixx-labs/orvix-provepr/blob/main/LICENSE) © Orvix Labs
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
# orvix-provepr
|
|
2
|
+
|
|
3
|
+
**Your coding agent says it's done. provepr makes it prove it.**
|
|
4
|
+
|
|
5
|
+
Before an agent (Claude Code, Codex, Cursor, or anything that reads `AGENTS.md`) calls a change done or
|
|
6
|
+
opens a PR, it writes down what the change claims and how to check it. provepr runs those checks in a real
|
|
7
|
+
browser and against the app's HTTP API, and hands back facts: which step failed, HTTP 5xx responses, page
|
|
8
|
+
and console errors, a screenshot after every step, and a video. The agent fixes what failed and runs the checks again. By the time a human opens
|
|
9
|
+
the PR, each claim is marked PASS, FAIL or UNVERIFIED.
|
|
10
|
+
|
|
11
|
+
provepr never calls an LLM. The agent's own model writes the plan and reads the evidence. provepr only runs
|
|
12
|
+
the browser and reports what happened.
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
$ provepr run
|
|
16
|
+
# provepr run 20261018-042535-318161
|
|
17
|
+
1 PASS · 1 FAIL · 1 UNVERIFIED (base_url http://127.0.0.1:8765)
|
|
18
|
+
|
|
19
|
+
## PASS `page-loads`: The profile page loads with a Name field and a Save button
|
|
20
|
+
- steps passed: 4/4
|
|
21
|
+
|
|
22
|
+
## FAIL `save-persists`: Clicking Save stores the name, and it is still there after a reload
|
|
23
|
+
- steps passed: 5/6
|
|
24
|
+
- FAILED step 6 `expect_value {"label": "Name", "value": "Ada Lovelace"}`: Locator expected to have Value 'Ada Lovelace' | Actual value:
|
|
25
|
+
- HTTP 500 POST http://127.0.0.1:8765/api/profile
|
|
26
|
+
|
|
27
|
+
## UNVERIFIED `name-length-limit`: The API rejects names longer than 100 characters
|
|
28
|
+
- no runnable steps (not checkable in a browser yet)
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
In that run the page showed "Saved" while the server returned a 500, so the bug would have shipped.
|
|
32
|
+
With provepr set up, Claude Code found and fixed it by itself (see [What it caught](#what-it-caught)).
|
|
33
|
+
|
|
34
|
+
## Quick start
|
|
35
|
+
|
|
36
|
+
```
|
|
37
|
+
uv tool install orvix-provepr # or: pipx install orvix-provepr
|
|
38
|
+
cd your-app && provepr init
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
`provepr init` sets the repo up so every agent and CI use provepr the same way:
|
|
42
|
+
|
|
43
|
+
| File | What it gets |
|
|
44
|
+
|---|---|
|
|
45
|
+
| `AGENTS.md` | A short managed block telling any agent to read `provepr docs` and follow the loop before calling a change done |
|
|
46
|
+
| `CLAUDE.md` | `@AGENTS.md`, so Claude Code reads the same rules |
|
|
47
|
+
| `.provepr/plan.yaml` | A starter plan. Set `base_url` and `start` to fit your app |
|
|
48
|
+
| `.github/workflows/provepr.yml` | A CI job that runs `provepr check`, then `provepr run`, on every PR and uploads the evidence |
|
|
49
|
+
| `.gitignore` | `.provepr/runs/` |
|
|
50
|
+
|
|
51
|
+
Running it again changes nothing. Existing files are kept, and only the marked AGENTS.md block is refreshed.
|
|
52
|
+
After that, just ask your agent for changes as usual.
|
|
53
|
+
|
|
54
|
+
## How it works
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
Coding agent (Claude Code / Codex / anything that reads AGENTS.md)
|
|
58
|
+
│ 0. AGENTS.md says: read `provepr docs` (the guide bundled with the installed version)
|
|
59
|
+
│ 1. writes the change + adds claims to .provepr/plan.yaml (the steps that prove them)
|
|
60
|
+
│ 2. runs `provepr check`, then `provepr run` (or the run_proof MCP tool)
|
|
61
|
+
▼
|
|
62
|
+
provepr
|
|
63
|
+
├─ starts the app (optional `start:` command) and waits for it
|
|
64
|
+
├─ runs each claim in headless Chromium: video, a screenshot after every step,
|
|
65
|
+
│ console errors, page errors, every HTTP 4xx/5xx and failed request,
|
|
66
|
+
│ plus `http` steps that call the app's API directly
|
|
67
|
+
├─ marks each claim PASS / FAIL / UNVERIFIED using fixed rules, no AI
|
|
68
|
+
└─ writes the evidence bundle to .provepr/runs/<run>/
|
|
69
|
+
▼
|
|
70
|
+
Agent reads a short report (about 250 tokens) and one contact sheet image
|
|
71
|
+
└─ get_frames(claim) for screenshots of the failing step → fixes the code → runs again
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
**What counts as a failure.** A claim FAILs if a step fails, the page throws an uncaught error, a request
|
|
75
|
+
returns HTTP 5xx, or a request fails at the network level. Console errors and HTTP 4xx responses are listed
|
|
76
|
+
for the agent to judge but do not fail the claim. A claim with no steps is UNVERIFIED, never PASS.
|
|
77
|
+
|
|
78
|
+
**Why the plan comes first.** The agent decides what "working" looks like before it sees any evidence,
|
|
79
|
+
and the guide forbids weakening the plan to make it pass. An agent that grades its own work this way
|
|
80
|
+
is much harder to fool, including by its own optimism.
|
|
81
|
+
|
|
82
|
+
**Why the plan accumulates.** Each change adds claims and keeps the old ones, so `plan.yaml` grows into a
|
|
83
|
+
regression suite as a side effect, and CI runs all of it.
|
|
84
|
+
|
|
85
|
+
**How agents learn the rules.** The guide for coding agents ships inside the package
|
|
86
|
+
([`src/provepr/docs/guide.md`](https://github.com/orvixx-labs/orvix-provepr/blob/main/src/provepr/docs/guide.md)), so it always matches the installed version.
|
|
87
|
+
Agents reach it through `provepr docs`, the `get_guide` MCP tool, or the plugin's skill. All three point to
|
|
88
|
+
the same file. `provepr check` enforces the parts a guide can't: unknown steps, unsafe ids, and claims
|
|
89
|
+
with no checks are rejected before anything runs.
|
|
90
|
+
|
|
91
|
+
## Install
|
|
92
|
+
|
|
93
|
+
You need [uv](https://docs.astral.sh/uv/). On first run provepr downloads Chromium for Playwright by itself.
|
|
94
|
+
|
|
95
|
+
### Any agent (AGENTS.md)
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
uv tool install orvix-provepr
|
|
99
|
+
provepr init
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
This works with any agent that reads `AGENTS.md` and can run shell commands.
|
|
103
|
+
|
|
104
|
+
### Claude Code
|
|
105
|
+
|
|
106
|
+
```
|
|
107
|
+
/plugin marketplace add orvixx-labs/orvix-provepr
|
|
108
|
+
/plugin install provepr@orvix
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
To load it for a single session from a local checkout: `claude --plugin-dir /path/to/orvix-provepr`.
|
|
112
|
+
|
|
113
|
+
### Codex
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
codex plugin marketplace add orvixx-labs/orvix-provepr
|
|
117
|
+
codex plugin add provepr
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
Or add it as a plain MCP server:
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
codex mcp add provepr -- uvx --from orvix-provepr provepr mcp
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
> Codex support has not been tested end to end yet. Claude Code has (see below). Please open an issue if it doesn't work for you.
|
|
127
|
+
|
|
128
|
+
## Use it
|
|
129
|
+
|
|
130
|
+
Ask the agent to prove its change works before it opens a PR, for example:
|
|
131
|
+
|
|
132
|
+
> Before you open the PR, prove the feature works with provepr and fix anything that's broken.
|
|
133
|
+
|
|
134
|
+
With `provepr init` done or the plugin installed, the agent learns the plan format and the loop from the
|
|
135
|
+
bundled guide: claims first, then check, run, read, fix, and run again.
|
|
136
|
+
|
|
137
|
+
### Writing a plan
|
|
138
|
+
|
|
139
|
+
```yaml
|
|
140
|
+
# .provepr/plan.yaml (commit this; ignore .provepr/runs/)
|
|
141
|
+
base_url: http://localhost:3000
|
|
142
|
+
start: npm run dev # optional; run from the project root, stopped after the run
|
|
143
|
+
|
|
144
|
+
claims:
|
|
145
|
+
- id: save-persists
|
|
146
|
+
says: "Clicking Save stores the name, and it is still there after a reload"
|
|
147
|
+
steps:
|
|
148
|
+
- goto: /settings
|
|
149
|
+
- fill: { label: Name, value: Ada }
|
|
150
|
+
- click: { role: button, name: Save }
|
|
151
|
+
- expect_text: Saved
|
|
152
|
+
- reload: true
|
|
153
|
+
- expect_value: { label: Name, value: Ada }
|
|
154
|
+
|
|
155
|
+
- id: name-too-long-rejected
|
|
156
|
+
says: "The API rejects names longer than 100 characters"
|
|
157
|
+
steps:
|
|
158
|
+
- http: { method: POST, path: /api/profile, json: { name: "..." }, expect_status: 400 }
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
The full step and locator reference is in the guide: run `provepr docs`, or read
|
|
162
|
+
[`src/provepr/docs/guide.md`](https://github.com/orvixx-labs/orvix-provepr/blob/main/src/provepr/docs/guide.md).
|
|
163
|
+
|
|
164
|
+
### MCP tools
|
|
165
|
+
|
|
166
|
+
| Tool | Returns |
|
|
167
|
+
|---|---|
|
|
168
|
+
| `get_guide()` | the guide for coding agents (plan format, steps, rules) |
|
|
169
|
+
| `run_proof(plan_path?, base_url?, claims?)` | the short report and one contact sheet image |
|
|
170
|
+
| `get_report(plan_path?, run?, include_json?)` | the latest (or a named) run's report, optionally with full JSON |
|
|
171
|
+
| `get_frames(claim_id, steps?, plan_path?, run?)` | screenshots of the failing step and the one before it, or of any steps you ask for |
|
|
172
|
+
|
|
173
|
+
### Command line
|
|
174
|
+
|
|
175
|
+
```
|
|
176
|
+
provepr init [dir] [--no-ci] # set up AGENTS.md, CLAUDE.md, plan, CI workflow, .gitignore
|
|
177
|
+
provepr docs # print the guide for coding agents
|
|
178
|
+
provepr check [--plan PATH] # validate the plan; exits 1 on problems
|
|
179
|
+
provepr run [--plan PATH] [--base-url URL] [--only ids] [--keep-evidence] # exits 1 on any FAIL
|
|
180
|
+
provepr mcp # serve the MCP tools over stdio
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
`base_url` resolves in this order: `--base-url`, then the `PROVEPR_BASE_URL` environment variable, then the plan.
|
|
184
|
+
|
|
185
|
+
### The evidence bundle
|
|
186
|
+
|
|
187
|
+
```
|
|
188
|
+
.provepr/runs/20261018-042535-318161/
|
|
189
|
+
├── report.md what the agent reads
|
|
190
|
+
├── report.json every step, error and timing
|
|
191
|
+
├── contact.png one frame per claim, captioned PASS/FAIL
|
|
192
|
+
├── frames/<claim>/NN.png
|
|
193
|
+
├── videos/<claim>.webm
|
|
194
|
+
└── app.log output of the `start` command
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
Screenshots and video are kept only for claims that FAILed, because the agent needs them to fix the
|
|
198
|
+
code. Passing claims keep their report lines and their frame in `contact.png`. Only the newest 5 runs are
|
|
199
|
+
kept. A fully passing run of 12 claims takes about 190 KB instead of 3.2 MB. Use `--keep-evidence` to
|
|
200
|
+
keep everything, e.g. to attach a video to a PR.
|
|
201
|
+
|
|
202
|
+
## CI
|
|
203
|
+
|
|
204
|
+
`provepr init` writes `.github/workflows/provepr.yml`. It installs Chromium, runs `provepr check`, runs every
|
|
205
|
+
claim, and uploads `.provepr/runs/` as a build artifact even when the job fails. The `start:` command in the
|
|
206
|
+
plan boots your app on the CI runner, so add the steps that install your app's dependencies where the
|
|
207
|
+
workflow's comment shows. Don't hand-write this file: `init` produces the same tested template everywhere.
|
|
208
|
+
|
|
209
|
+
## What it caught
|
|
210
|
+
|
|
211
|
+
`examples/demo_app` has a planted bug: the save handler reads the wrong JSON key, so every save returns
|
|
212
|
+
a 500, and the page shows "Saved" anyway. We gave Claude Code (headless, with this plugin) a fresh copy and
|
|
213
|
+
only this prompt:
|
|
214
|
+
|
|
215
|
+
> I built a profile page where you can type your name and save it. Before I open a PR, prove the feature
|
|
216
|
+
> works and fix anything that's broken.
|
|
217
|
+
|
|
218
|
+
It loaded the skill, wrote its own plan, ran it, and got a FAIL with the HTTP 500. It then fixed the server
|
|
219
|
+
**and** the UI that said "Saved" on a failed save, and ran again: `1 PASS · 0 FAIL`. In its final message
|
|
220
|
+
it listed the paths it could not check in a browser. That took 14 turns, and provepr made no LLM calls.
|
|
221
|
+
|
|
222
|
+
We repeated the test with **no plugin at all**, only the files `provepr init` writes, and a prompt that
|
|
223
|
+
never mentions provepr ("make sure it works and fix anything that's broken"). Claude Code read the rules
|
|
224
|
+
from AGENTS.md and ran `provepr docs`. It added two claims while keeping the existing one, used an `http`
|
|
225
|
+
step to check that bad input gets a 400, fixed both bugs, and finished at `3 PASS · 0 FAIL` in 13 turns.
|
|
226
|
+
|
|
227
|
+
Run the demo yourself:
|
|
228
|
+
|
|
229
|
+
```
|
|
230
|
+
cd examples/demo_app && uv run --project ../.. provepr run
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
## How it differs from other tools
|
|
234
|
+
|
|
235
|
+
- **Screen recorders for agents** capture what the agent did so a human can review it later. provepr checks
|
|
236
|
+
claims the agent committed to beforehand and returns a pass/fail result the agent acts on.
|
|
237
|
+
- **Visual regression tools** (screenshot diffing) tell you pixels changed, not whether the feature works.
|
|
238
|
+
- **AI code reviewers** read the diff. provepr runs the change.
|
|
239
|
+
|
|
240
|
+
## Limits
|
|
241
|
+
|
|
242
|
+
- Web apps only for now: browser steps plus `http` steps against the app's API. CLI tools and
|
|
243
|
+
background jobs are UNVERIFIED.
|
|
244
|
+
- There is no step yet to simulate network failures in the browser, so a UI's own error messages are
|
|
245
|
+
hard to reach.
|
|
246
|
+
- No screenshot diff against the base branch yet.
|
|
247
|
+
- Runs locally. Hosted runs on PR preview deployments (a GitHub App) are on the roadmap.
|
|
248
|
+
|
|
249
|
+
## Roadmap
|
|
250
|
+
|
|
251
|
+
- [x] Local runner, evidence bundle, CLI
|
|
252
|
+
- [x] MCP server, skill, Claude Code and Codex plugin
|
|
253
|
+
- [x] Bundled agent guide, `provepr init` (AGENTS.md, CI workflow), `provepr check`
|
|
254
|
+
- [x] Accumulating plans, `--only`, `http` steps for API claims
|
|
255
|
+
- [ ] Network mocking and failure steps in the browser
|
|
256
|
+
- [ ] `provepr check --base main`: flag claims removed or weakened compared to the base branch
|
|
257
|
+
- [ ] GitHub App: run on every PR against its preview deployment (Vercel, Netlify) and post a PR comment
|
|
258
|
+
- [ ] Screenshot diff against the base branch
|
|
259
|
+
- [ ] Terminal and CLI apps
|
|
260
|
+
|
|
261
|
+
## Contributing
|
|
262
|
+
|
|
263
|
+
See [CONTRIBUTING.md](https://github.com/orvixx-labs/orvix-provepr/blob/main/CONTRIBUTING.md).
|
|
264
|
+
|
|
265
|
+
## License
|
|
266
|
+
|
|
267
|
+
[MIT](https://github.com/orvixx-labs/orvix-provepr/blob/main/LICENSE) © Orvix Labs
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "orvix-provepr"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "Make AI coding agents prove their PR claims in a real browser, and fix what fails."
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
requires-python = ">=3.12"
|
|
7
|
+
license = "MIT"
|
|
8
|
+
license-files = ["LICENSE"]
|
|
9
|
+
classifiers = [
|
|
10
|
+
"Development Status :: 3 - Alpha",
|
|
11
|
+
"Environment :: Console",
|
|
12
|
+
"Intended Audience :: Developers",
|
|
13
|
+
"Operating System :: POSIX :: Linux",
|
|
14
|
+
"Operating System :: MacOS",
|
|
15
|
+
"Programming Language :: Python :: 3",
|
|
16
|
+
"Programming Language :: Python :: 3.12",
|
|
17
|
+
"Programming Language :: Python :: 3.13",
|
|
18
|
+
"Programming Language :: Python :: 3.14",
|
|
19
|
+
"Topic :: Software Development :: Quality Assurance",
|
|
20
|
+
"Topic :: Software Development :: Testing",
|
|
21
|
+
]
|
|
22
|
+
keywords = [
|
|
23
|
+
"ai-agents",
|
|
24
|
+
"claude-code",
|
|
25
|
+
"codex",
|
|
26
|
+
"mcp",
|
|
27
|
+
"playwright",
|
|
28
|
+
"pull-request",
|
|
29
|
+
"verification",
|
|
30
|
+
]
|
|
31
|
+
dependencies = [
|
|
32
|
+
"mcp>=2.3",
|
|
33
|
+
"pillow>=13.0.0",
|
|
34
|
+
"playwright>=1.64.0",
|
|
35
|
+
"pyyaml>=6.0.3",
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
[[project.authors]]
|
|
39
|
+
name = "Tirth"
|
|
40
|
+
email = "trhatwork@gmail.com"
|
|
41
|
+
|
|
42
|
+
[project.urls]
|
|
43
|
+
Homepage = "https://github.com/orvixx-labs/orvix-provepr"
|
|
44
|
+
Repository = "https://github.com/orvixx-labs/orvix-provepr"
|
|
45
|
+
Documentation = "https://github.com/orvixx-labs/orvix-provepr/blob/main/src/provepr/docs/guide.md"
|
|
46
|
+
Issues = "https://github.com/orvixx-labs/orvix-provepr/issues"
|
|
47
|
+
|
|
48
|
+
[project.scripts]
|
|
49
|
+
provepr = "provepr.cli:main"
|
|
50
|
+
|
|
51
|
+
[build-system]
|
|
52
|
+
requires = ["uv_build>=0.12.19,<0.13.0"]
|
|
53
|
+
build-backend = "uv_build"
|
|
54
|
+
|
|
55
|
+
[tool.uv.build-backend]
|
|
56
|
+
module-name = "provepr"
|
|
57
|
+
|
|
58
|
+
[tool.ruff]
|
|
59
|
+
line-length = 120
|
|
60
|
+
|
|
61
|
+
[dependency-groups]
|
|
62
|
+
dev = [
|
|
63
|
+
"pytest>=9.1.1",
|
|
64
|
+
"ruff>=0.17.1",
|
|
65
|
+
]
|