Metadata-Version: 2.4
Name: bluefox-verify-receipt
Version: 0.0.4
Summary: The BlueFox Edge offline receipt checker as a pip-installable package: the exact published bytes, one command, no client, no account.
Author-email: BlueFox AI <ethan@bluefoxedge.ai>
License: MIT
Project-URL: Homepage, https://www.bluefoxedge.ai
Project-URL: Verify a receipt, https://www.bluefoxedge.ai/docs/verify-a-receipt
Project-URL: Published checker, https://api.bluefoxedge.ai/verify_receipt.py
Project-URL: npm twin, https://www.npmjs.com/package/bluefox-verify-receipt
Project-URL: Contact, https://www.bluefoxedge.ai/contact
Project-URL: Security, https://www.bluefoxedge.ai/.well-known/security.txt
Keywords: bluefox,receipt,verification,ed25519,rfc8785,jcs,offline,agents
Classifier: Development Status :: 2 - Pre-Alpha
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Operating System :: OS Independent
Classifier: Topic :: Security :: Cryptography
Requires-Python: >=3.8
Description-Content-Type: text/markdown
License-File: LICENSE
Dynamic: license-file

# bluefox-verify-receipt (Python)

**0.0.4 — the Python twin of the npm checker, installable, re-vendored from the street and gated on its conformance corpus.** This is the BlueFox Edge
offline receipt checker — the exact bytes the street served at
<https://api.bluefoxedge.ai/verify_receipt.py> on 2026-09-18 (sha256 `a79ddd8b…b6fb2`,
45,166 B, the bytes it has served since the API's 2026-09-16 deploy; the served copy may
move ahead of this package again — compare
<https://api.bluefoxedge.ai/verify_receipt.py.sha256> with
`bluefox_verify_receipt.checker_sha256()` any time) — as a package you can pin with pip,
with one command on PATH:

```bash
pip install bluefox-verify-receipt
bluefox-verify-receipt my-receipt.json
```

Same steps, same order, same one-sentence verdicts as `npx bluefox-verify-receipt@1.2.0` on
npm; every passing run prints the ten `NOT VERIFIED by this run` lines before the pass
sentence, and `--bind-record my-record.json` also checks that the receipt names your record.
Before any release of this package is published, the vendored checker must match every row of
the npm checker's 19-row conformance corpus (two receipts that must pass, seventeen that must be
refused, shipped under `conformance/` in `npx bluefox-verify-receipt`). Exit 0 means the check
passed.

## What it checks

A BlueFox Edge receipt is a signed record of one API answer: the envelope is
canonicalized (RFC 8785 / JCS), hashed (SHA-256), chained, and signed (Ed25519) with a
published key. The checker recomputes every signed field from the file's own bytes and
refuses — in a sentence, never a traceback — on any disagreement. It reads the key set
from the published JWKS, or fully offline from a file you saved:

```bash
curl -sSo pinned-jwks.json https://api.bluefoxedge.ai/.well-known/jwks.json
bluefox-verify-receipt --jwks pinned-jwks.json my-receipt.json
```

The receipt never names its own key source; the `--jwks` flag is the operator's hand.
How to read what a receipt does and does not say: <https://www.bluefoxedge.ai/docs/verify-a-receipt>.

## Relation to `bluefox-edge`

`bluefox-edge` on PyPI ships this same checker under the SDK name and grows the API
client at 0.6+. This package stays what it is: the checker — one file, no client, no
account. Pick this one when all you need is to check a receipt.

## What changed since 0.0.1

- **0.0.4 (this release).** Re-vendored again, for a reason that matters: the checker 0.0.3 shipped
  (sha256 `239c3634…f1337`, 42,797 B, the street's bytes of 2026-09-15) PASSES a receipt whose
  unsigned top-level `chain_prev` mirror was edited while the signed envelope's `chain_prev` is
  untouched — the served `.py`, the served `.js` and `npx bluefox-verify-receipt@1.2.0` all refuse
  it in one sentence (conformance row N09). The API's 2026-09-16 deploy moved the served file to
  `a79ddd8b…b6fb2` (45,166 B), which compares that mirror too. 0.0.4 ships those served bytes, so
  `bluefox_verify_receipt.checker_sha256()` and the street's `.sha256` agree again on the day of
  release, and every release from here on is gated on the full conformance corpus before it is
  published. Nothing else changes.
- **0.0.3 (2026-09-15).** The vendored checker is re-vendored from the street. 0.0.1 shipped
  the bytes served on 2026-09-12 (sha256 `50dd2124…711d8`, 24,801 B); the API's 2026-09-14 deploy
  moved the served file to `239c3634…f1337` (42,797 B), which prints what a run did not verify
  and takes `--bind-record`. 0.0.3 ships those served bytes, so
  `bluefox_verify_receipt.checker_sha256()` and the street's `.sha256` agree again on the day of
  release. The command's usage line names `--bind-record`. Nothing else changes.
- **0.0.2 (staged 2026-09-13, never reached PyPI; its changes ride here).** The 0.0.1 bytes
  carried an internal review banner in this README and in the `bluefox_verify_receipt` module
  docstring; it is gone, and `Contact` and `Security` project URLs are present. 0.0.1 carried no
  repository URL, and none is added.

License: MIT. Author: BlueFox AI (Format Dynamics, Inc.). Questions and issues:
<support@bluefoxedge.ai> · <https://www.bluefoxedge.ai/contact> · security reports per
<https://www.bluefoxedge.ai/.well-known/security.txt>.
