Contract-to-outcome verification with tamper-evident evidence bundles for AI-built web apps
Project description
E2EProof
Verify what an application actually did — not only what its interface claimed.
E2EProof is a local-first command-line tool and GitHub Action for AI-built web apps and automations. A YAML contract describes a promised outcome such as:
Submitting this form stores exactly one lead and then shows a confirmation.
E2EProof executes the user flow, checks independent side effects, and writes a tamper-evident evidence bundle with an HTML report, JSON result, JUnit XML, optional browser traces/screenshots, a SHA-256 manifest, and a hash-chained event log.
Two-command proof
After the package is published:
python -m pip install e2eproof
e2eproof quickstart
quickstart checks for Chromium, asks permission to install it when missing, starts a real local web app, submits a form in a real browser, reads the backend independently, and opens the report.
Non-interactive CI:
e2eproof quickstart --yes --no-open --json
Other browsers:
e2eproof quickstart --browser firefox
e2eproof quickstart --browser webkit
Verify your own app
e2eproof init e2eproof.yaml
e2eproof validate e2eproof.yaml
e2eproof run e2eproof.yaml
A strong contract combines independent observations:
- perform the user action;
- assert what the user sees;
- assert the exact network request and response;
- read the real backend state through a second interface;
- fail when the result is absent, duplicated, mocked, or silently handled by a fallback.
GitHub Action
Replace abubakarfaisal804-wq with the repository owner after publication:
name: outcome proof
on: [push, pull_request]
jobs:
verify:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: abubakarfaisal804-wq/e2eproof@v1
with:
contract: e2eproof.yaml
browser: chromium
The action installs Python and the selected browser, runs the contract, uploads the evidence bundle, and fails the job when a required claim fails.
Contract example
version: 1
name: Lead is stored exactly once
base_url: https://staging.example.com
variables:
email: test+{{run_id}}@example.com
policy:
allowed_hosts: [staging.example.com]
fail_on_console_error: true
fail_on_page_error: true
fail_on_request_failure: true
forbidden_visible_markers: [demo mode, fallback active]
flows:
- id: lead-capture
claim: The submitted lead is stored exactly once.
steps:
- type: browser.goto
url: /contact
- type: browser.fill
target: {label: Email}
value: "{{email}}"
- type: browser.click
target: {role: button, name: Send}
- type: browser.assert_text
target: "#status"
contains: Received
- type: network.assert
kind: response
url_contains: /api/leads
method: POST
status: 201
minimum: 1
maximum: 1
- type: http.poll
method: GET
url: /api/test/leads?email={{email}}
assertions:
status: 200
json:
- {path: $.count, equals: 1}
Commands
e2eproof quickstart install/check Chromium and run a real proof
e2eproof demo --browser firefox run the packaged demo without installation logic
e2eproof install-browser webkit install a Playwright browser
e2eproof doctor --browser chromium check prerequisites
e2eproof init create a conservative starter contract
e2eproof validate validate a contract without executing it
e2eproof run execute a contract
e2eproof verify verify evidence hashes, chain, and signature
e2eproof keygen create an Ed25519 keypair
e2eproof schema export the contract JSON Schema
e2eproof ai-draft optionally draft a contract with OpenAI
e2eproof ai-diagnose optionally explain a redacted failure with OpenAI
Exit codes:
0: all required claims passed;1: a claim failed or was flaky under a fail-on-flaky policy;2: configuration, runtime, or API error;3: evidence integrity verification failed.
Evidence integrity
e2eproof keygen .e2eproof-keys
e2eproof run e2eproof.yaml --sign-key .e2eproof-keys/e2eproof-private.pem
e2eproof verify evidence/<run-id> --public-key .e2eproof-keys/e2eproof-public.pem
A signature only establishes identity when the public key is obtained through an independent trusted channel.
Optional GPT-5.6 Sol integration
The deterministic runner works without AI. GPT-5.6 Sol is optional for drafting conservative contracts and diagnosing redacted failures:
export OPENAI_API_KEY="sk-proj-..."
e2eproof ai-draft \
--base-url https://staging.example.com \
--claim "Submitting checkout creates one paid order" \
--output checkout.yaml
e2eproof ai-diagnose evidence/<run-id>/result.json --output diagnosis.md
Generated contracts are validated before being written. AI output never decides whether a test passed.
Security defaults
- browser and HTTP targets are scheme/host allowlisted;
- HTTP redirects are not followed automatically;
- browser requests outside the allowlist are blocked by default;
- credentials embedded in URLs are rejected;
- environment secrets are redacted from text and JSON artifacts;
- screenshots and traces are disabled for secret-bearing runs unless explicitly enabled;
- evidence paths cannot escape the run directory;
- signatures use Ed25519 and listed artifacts use SHA-256.
Read SECURITY.md and docs/THREAT_MODEL.md before using production credentials.
Development
python -m venv .venv
# Windows: .venv\Scripts\activate
# macOS/Linux: source .venv/bin/activate
python -m pip install --upgrade pip setuptools wheel
python -m pip install --no-build-isolation -e ".[dev]"
e2eproof install-browser chromium
python -m pytest --cov=e2eproof --cov-report=term-missing
python -m ruff check .
python -m mypy src/e2eproof
The repository contains CI definitions for Python 3.11–3.13 on Ubuntu, Windows, and macOS, plus real Chromium, Firefox, and WebKit browser-to-backend proofs. These jobs still need to run in the public repository before their status may be claimed as passing.
Current status
E2EProof is an alpha developer tool, not a hosted SaaS and not a guarantee for every application. It requires an explicit contract and does not replace a complete security audit, accessibility audit, or human review.
License
MIT. See LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file e2eproof-0.2.0.tar.gz.
File metadata
- Download URL: e2eproof-0.2.0.tar.gz
- Upload date:
- Size: 88.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3936c4811f1a431fa1ac46d3ae83551bfe0f02962858a25bdab370dc5e744390
|
|
| MD5 |
fe7795d6c88b38d280a047b952ae3b9f
|
|
| BLAKE2b-256 |
f8004d9e0b4850dc601af84264394e63e0b280d8bac4fb5ec09391ef4b443ee2
|
Provenance
The following attestation bundles were made for e2eproof-0.2.0.tar.gz:
Publisher:
release.yml on abubakarfaisal804-wq/e2eproof
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
e2eproof-0.2.0.tar.gz -
Subject digest:
3936c4811f1a431fa1ac46d3ae83551bfe0f02962858a25bdab370dc5e744390 - Sigstore transparency entry: 2316495229
- Sigstore integration time:
-
Permalink:
abubakarfaisal804-wq/e2eproof@b24b7899183e248429a3dcb3609255765b93827e -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/abubakarfaisal804-wq
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@b24b7899183e248429a3dcb3609255765b93827e -
Trigger Event:
release
-
Statement type:
File details
Details for the file e2eproof-0.2.0-py3-none-any.whl.
File metadata
- Download URL: e2eproof-0.2.0-py3-none-any.whl
- Upload date:
- Size: 43.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
76732669b0d2a55903099201e1be5ac8ed2e616e2fa7fce80548a63d0d6ea5eb
|
|
| MD5 |
8eb3a77c9a6b2ad8d1c515bd5f7228a1
|
|
| BLAKE2b-256 |
512a3b0ea7af9dac21ec72b6e639ebe4ea94b8d75a9a204e7ee3feda371fae55
|
Provenance
The following attestation bundles were made for e2eproof-0.2.0-py3-none-any.whl:
Publisher:
release.yml on abubakarfaisal804-wq/e2eproof
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
e2eproof-0.2.0-py3-none-any.whl -
Subject digest:
76732669b0d2a55903099201e1be5ac8ed2e616e2fa7fce80548a63d0d6ea5eb - Sigstore transparency entry: 2316495568
- Sigstore integration time:
-
Permalink:
abubakarfaisal804-wq/e2eproof@b24b7899183e248429a3dcb3609255765b93827e -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/abubakarfaisal804-wq
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@b24b7899183e248429a3dcb3609255765b93827e -
Trigger Event:
release
-
Statement type: