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.
@@ -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
+ ]