Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CROSS_IMPLEMENTATION_REPORT.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ these cases independently (§7 "Zweitverifier reproduziert den Conformance-Corpu
to CONFIRM a genuine relying-party-supplied anchor, which no corpus case exercises (`--bitcoin-header` is
not an allowed conformance verifyArg).

**All 14 of the 14 corpus cases are reproduced independently** (`crosscheck.py`, exit 0). Research note:
**All corpus cases are reproduced independently** (`crosscheck.py`, exit 0 — 14/14 on the recorded 3.2.0-era run this report documents; the corpus has since grown to 57 cases and the named `make conformance-crossimpl` gate re-runs the cross-check on the current corpus, 56/56 as of v3.7.0). Research note:
a SOTA review (2026) confirms OpenTimestamps-over-Bitcoin as the strongest trust-minimized long-term
*archival* anchor (permissionless, offline-verifiable, no trusted third party) — correctly used here as
an OPTIONAL layer, not the primary trust — with Sigsum / RFC 3161 / transparency logs as lower-latency
Expand Down
23 changes: 23 additions & 0 deletions INTEGRATIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,29 @@ derives from the canonical `config.tests` JSON (the test suite IS the dataset).
v1/v2 files are rejected with a clear message — re-export with a current promptfoo. In CI this
composes with the GitHub Action: run promptfoo, emit the receipt, attach both to the run.

## lm-evaluation-harness (results_*.json adapter, v0.6; sample-count provenance since v3.7.0)

EleutherAI's lm-evaluation-harness writes a results JSON per run. The adapter is file-based — no
lm_eval import:

```python
from proofbundle.adapters import from_lm_eval_results
from proofbundle.evalclaim import emit_eval_receipt
from proofbundle import generate_signer

claim, salts = from_lm_eval_results("results.json", "arc_easy", "acc", comparator=">=",
threshold="0.30", timestamp="2026-07-01T12:00:00Z")
receipt = emit_eval_receipt(claim, generate_signer())
```

Metric keys resolve with the harness suffix convention (`acc` matches `acc,none`). The signed
provenance carries `git_hash`, task version, n-shot, sibling stderr — and, since 3.7.0, the
sample counts from the harness `n-samples` block: `effective_samples`, `original_samples` and
`skipped_samples`, validated fail-closed (negative counts raise; `effective > original` clamps
`skipped_samples` to 0 with both raw counts visible; `effective = 0` keeps the honest `n`
fallback). A silently subsetted run can no longer present itself as a full run under the same
signed claim. See `examples/lm_eval_receipt.py` for a complete offline round-trip.

## Hugging Face Community Evals (`.eval_results/*.yaml`, v1.4)

HF's Community Evals accept per-benchmark result entries with an optional string `verifyToken`
Expand Down
10 changes: 7 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,10 @@ Every AI eval number you read — a safety benchmark, a capability score, a lead
**unverifiable claim**. You trust the lab. There is no portable way to check, offline, that a result
was signed by a stated party, has not been altered, and covers the samples it claims.

proofbundle is that check: a small MIT-licensed Python tool (a compact, auditable trusted core that
depends only on [`cryptography`](https://cryptography.io)) that turns a result into a signed receipt
proofbundle is that check: a small MIT-licensed Python tool (a compact, auditable trusted verify
core that depends only on [`cryptography`](https://cryptography.io); the package installs one more
hard dependency, the RFC 8785 canonicalizer [`rfc8785`](https://pypi.org/project/rfc8785/), used on
the emit and canonicalization paths) that turns a result into a signed receipt
anyone can verify from a single file. In plain terms it is the cash-register receipt of an AI test
result: it shows who claimed the number and that nobody quietly changed it, not that the test was
good. Without a receipt there is nothing to check at all.
Expand Down Expand Up @@ -133,7 +135,7 @@ version history (see also [CHANGELOG.md](https://github.com/b7n0de/proofbundle/b
## Install

```bash
pip install proofbundle # core: offline verify + plain emit (dependency-free)
pip install proofbundle # core: offline verify + plain emit (two deps: cryptography, rfc8785)
pip install "proofbundle[eval]" # + eval receipts, prereg, and the demo (RFC 8785 JCS canonicalizer)
pip install "proofbundle[inspect]" # inspect_ai adapter + hook
pip install "proofbundle[pq]" # verify ML-DSA-44 (post-quantum) witness cosignatures
Expand Down Expand Up @@ -171,6 +173,8 @@ DOI [10.5281/zenodo.21110642](https://doi.org/10.5281/zenodo.21110642); the Tech
| The demos, tier by tier | [docs/DEMO.md](https://github.com/b7n0de/proofbundle/blob/main/docs/DEMO.md) |
| The normative format + verification order | [SPEC.md](https://github.com/b7n0de/proofbundle/blob/main/SPEC.md) |
| Honest comparison to Rekor / in-toto / OMS / ValiChord | [INTEROP.md](https://github.com/b7n0de/proofbundle/blob/main/INTEROP.md) |
| What the conformance corpus does and does not establish | [CONFORMANCE.md](https://github.com/b7n0de/proofbundle/blob/main/CONFORMANCE.md) |
| The commercial boundary of the project | [docs/COMMERCIAL_BOUNDARY.md](https://github.com/b7n0de/proofbundle/blob/main/docs/COMMERCIAL_BOUNDARY.md) |
| Regulatory mapping (and what to never claim) | [COMPLIANCE.md](https://github.com/b7n0de/proofbundle/blob/main/COMPLIANCE.md) |
| Funders / role fit | [docs/PROJECT_BRIEF.md](https://github.com/b7n0de/proofbundle/blob/main/docs/PROJECT_BRIEF.md) |
| **Preview:** TEE-attestation bridge (RATS/EAT, `[experimental]`) | [docs/EXPERIMENTAL_ENCLAVE.md](https://github.com/b7n0de/proofbundle/blob/main/docs/EXPERIMENTAL_ENCLAVE.md) |
Expand Down
17 changes: 12 additions & 5 deletions RELEASE.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,9 @@ The order below is the convention, not a suggestion. A release is a fact about `

## Beta / pre-release (any future pre-release line)

Historical note: the 2.0.0b1–b3 line shipped this way until **2.0.0 final** (2026-07-09); since
then the 2.x line is the stable default and the `[experimental]` extra ships with normal releases.
Historical note: the 2.0.0b1–b3 line shipped this way until **2.0.0 final** (2026-07-09); the
stable default has since moved on to the 3.x line (current: 3.7.0) and the `[experimental]` extra
ships with normal releases.
The checklist below is the convention for any FUTURE pre-release: `pip install proofbundle` never
pulls a PEP 440 pre-release, so the current stable stays the default while a preview stabilizes.

Expand All @@ -66,15 +67,21 @@ pulls a PEP 440 pre-release, so the current stable stays the default while a pre
The version bump, changelog, and doc edits happen **on the branch, inside the PR** — the tag comes
after the merge (see *Release ordering* above).

- [ ] Bump `version` in `pyproject.toml` **and** `__version__` in `src/proofbundle/__init__.py`
(they must match — CI/pitch cite the version).
- [ ] Bump `version` in `pyproject.toml`, `__version__` in `src/proofbundle/__init__.py` **and**
`version:` in `CITATION.cff` (all three must match — `scripts/check_version_and_changelog.py`
and the release-integrity CI job enforce the three-file single-sourcing).
- [ ] Update `CHANGELOG.md` (Keep-a-Changelog + SemVer; note any breaking change explicitly).
- [ ] Update the test-count and version strings in `README.md` if they changed.
- [ ] README.md deliberately hard-codes no test-count or version strings (live badges + CI output are the source); only touch README claims that the release genuinely changes.
- [ ] `make all` green locally (lint + typecheck + tests); `make tamper-demo` exits 0;
`make mutation` reports all operators killed (documented-equivalent survivor excepted).
- [ ] Open the PR; confirm the CI matrix is green on all supported Pythons **and** the
`crypto-floor` job; **the Owner merges** the PR to the target branch (`main`, or `release/*`
then merge-back).
- [ ] Pre-tag adversarial audit (docs/PRE_TAG_AUDIT.md): run the six-lens internal audit on the
release candidate and land the real record as `audit_artifacts/<XYZ>/*.md` — the
`scripts/pre_tag_audit_gate.py --strict` step in `release.yml` **blocks the build without it**,
and the version-coupled F7 test requires the record as soon as the version is bumped (so the
audit belongs in the release-prep PR, not after the merge).
- [ ] On the **merged** target-branch HEAD (never the feature branch), confirm CI is green, then
`git tag vX.Y.Z` there and push the tag.
- [ ] Watch the `build-and-attest` job: note the printed attested wheel/sdist sha256.
Expand Down
12 changes: 7 additions & 5 deletions docs/GRANT_MILESTONES.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,13 @@ funding/OSTIF briefing for M3.

## M2 — External interop fixture — DONE 2026-07-11

Two externally produced decision-receipt vectors vendored digest-pinned and
credited under `conformance/decision/crossimpl/` (one Bitcoin-confirmed anchor,
block 957504, verified offline; canonicalization byte-identical). Honest gap
recorded: external fixture does not yet satisfy the strict v0.1 predicate schema
(12 findings, expected-fail, regeneration upstream in progress).
Externally produced decision-receipt vectors vendored digest-pinned and credited
under `conformance/decision/crossimpl/`. The upstream regeneration recorded here
as an honest gap has since completed (2026-07-19): the schema-conformant case
(`decision-crossimpl-schema-conformant`, Bitcoin block 958761) now satisfies the
strict decision-receipt/v0.1 predicate schema with zero findings, alongside the
original confirmed-anchor lifecycle case (block 957504, kept as the externally
confirmed anchor-lifecycle vector); a third historical case is marked superseded.

## M3 — Independent audit started — pending (OSTIF sourcing)

Expand Down
2 changes: 1 addition & 1 deletion docs/INSPECT_HAPPY_PATH.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,6 @@ Changing one byte of the signed payload breaks the signature. That is the whole
## 6. Attach to a paper or model card

Ship `proofbundle_receipt_<eval_id>.json` alongside the result and publish your `issuer` key. See
[examples/](../examples/) for adapter snippets, and [../INTEROP.md](../INTEROP.md) for lm-eval and
[examples/](../examples/) for adapter snippets, and [../INTEGRATIONS.md](../INTEGRATIONS.md) for lm-eval and
promptfoo. What a receipt proves and does not prove is in [../THREAT_MODEL.md](../THREAT_MODEL.md):
authorship and integrity, never that the number is true.
2 changes: 1 addition & 1 deletion docs/TESTING_STRATEGY.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ methods in use, why, and the honest state of each (SOTA references at the end).
## Layers

1. **Fixed unit + negative vectors.** Every crypto-critical verify path has malformed / tamper / wrong-key
/ boundary vectors that must fail closed. This is the baseline (~1180 tests).
/ boundary vectors that must fail closed. This is the bulk of the suite (the full suite currently counts 2041 tests).
2. **Differential / interop.** A second, independent implementation verifies the same artifact
(BBS cross-impl, the SD-JWT reference fixture, the O8 Rust verifier reproducing the conformance
corpus). Catches spec-divergence a single implementation cannot see.
Expand Down
5 changes: 5 additions & 0 deletions docs/audit/AUDIT_SCOPE.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# Audit Scope — external independent security review (pre-Stable)

> **Historical snapshot (3.2.0 era).** This file is an unmaintained earlier draft kept for
> provenance; its counts (14 conformance cases, 1121 tests) reflect that era. The maintained
> successor is [`docs/AUDIT_SCOPE.md`](../AUDIT_SCOPE.md); current counts live in
> `conformance/manifest.json` and the CI test output.

proofbundle stays classifier `4 - Beta` until an EXTERNAL, independent security audit completes (O9 +
the Stable gate). This file defines the scope that audit should cover, so the review is bounded and the
findings map to concrete modules. It is a scope document, not a claim of having been audited.
Expand Down
8 changes: 4 additions & 4 deletions docs/readiness_pack/MANIFEST.sha256
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
e6e2f1ca00c1798975005315172248db3ee8fefb02b978cd12627c526dd5dc60 AUDITOR_OPEN_POINTS.md
3d66a85ff79c0258d794e7c8d8740f8a3b7a62e6ffd9bd7dada158a939964660 OPEN_QUESTIONS.md
9a227810137e0c2321948b61737c5b4dbcc36196f017026d43a4bdb050c11445 PROGRESS.md
2c59b2de935c928140c4425ad0d402683b9482f064d760e9d9ace39cfe7b6eec README.md
292c01cf4ddb288915f46f8b234caa5583a48b6d0dfcca38d8db6d88bbe6ceb6 PROGRESS.md
6ccab20c7daef6d71c13e0dcacba24a6a18dd480b5d41418e01b5bf2983ffc9c README.md
c9ceb3f92a2f720d901affa8defb47004b58a51029317208db641ce53d90b284 REPRODUCTION_RUNBOOK.md
1b4e4316aaea6c962664fc08945c65a048147fdc4ad89a1e694818b934ef6fa2 calendar_independence.md
f0db4c1c1449001b1d25a2712148a33293863dbf92bf1dc31a34d2465c6bb647 differential_matrix.md
9a9a9e4956076c6c287dada5de82eb66cf259cec89a6e791088e1733a74c5ea3 differential_matrix.md
426a22bd91c7a7529700c06570a3e55fb4c11281992d6215fc2315b12731f9cd index.json
5d4997642f7c68b902da5f811821c306cd902589cb027d5f4bc96d593f53ebd9 rust_parity_scope.md
d1d1e04e9d2de38443ec2b953c3a9c968a303e81977cb7e128468945160b56d7 rust_parity_scope.md
f2a77cacd7fefe39450edb1857ec2ffc25a4d4c3d8d68efa094ba84ab7325708 tamper_resistance.md
6d6a4065a1e7e071819960cef8e0117ada98e931cd62fd94341b45af4865711a threat_model_delta_360.md
4 changes: 2 additions & 2 deletions docs/readiness_pack/PROGRESS.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Honest progress accounting (No-Overclaim)

The denominator is the full distance from today (3.3.0) to "4.0.0-stable, externally audited,
The denominator is the full distance from the 3.3.0 baseline (current release: 3.7.0) to "4.0.0-stable, externally audited,
trustworthy". This is a factual progress statement, not a forward promise, and it is deliberately
placed in the readiness pack so an auditor reads our own honest number before forming theirs.

Expand All @@ -26,7 +26,7 @@ placed in the readiness pack so an auditor reads our own honest number before fo
## Consequence

With the five front-loaded foundations plus the pre-tag audit discipline, the audit-candidate (3.6.0)
is reachable at ~85% of the total distance with **practically zero avoidable rework**; the remaining
was reached at ~85% of the total distance (3.6.0 tagged 2026-07-17) with **practically zero avoidable rework**; the remaining
~15% is, by definition, not anticipatable — only best-prepared, which is what this pack is.

## Where this number is enforced against drift
Expand Down
6 changes: 3 additions & 3 deletions docs/readiness_pack/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ it does not, and cannot, close on its own.
## Release evidence slots (front-loaded)

- `3.3.1-frontload` — **filled**: the five foundations (F1–F5) + the pre-tag audit discipline (F7).
- `3.4.0` — reserved: relation_signer receipts, decoy-parent F1 vectors, formal obligation O5.
- `3.5.0` — reserved: relation_statement Rust parity, formal obligation O6, F4 auto-coverage.
- `3.6.0` — reserved: fuzz-soak corpora, differential matrix, formal obligation O7, threat-model delta.
- `3.4.0` — **filled** (shipped under the 3.6.0 tag): relation_signer receipts, decoy-parent F1 vectors; formal obligation O5 remains reserved (see `index.json`).
- `3.5.0` — **filled** (shipped under the 3.6.0 tag): relation_statement Rust parity, F4 auto-coverage; formal obligation O6 remains reserved (see `index.json`).
- `3.6.0` — **filled**: fuzz-soak corpora, differential matrix, threat-model delta, 33-check acceptance matrix; formal obligation O7 remains reserved (see `index.json`).

A `reserved` slot is declared honestly; it is not evidence yet, and nothing here counts it as such.

Expand Down
4 changes: 3 additions & 1 deletion docs/readiness_pack/differential_matrix.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@ python3 tools/pb_verify_rs/crosscheck.py --matrix audit_artifacts/360/rust_diffe

The artifact carries an environment freeze (cargo / rustc / python versions) so a re-run on another box
is comparable. On the recorded run: 40 relation vectors, Python == Rust on all, and the whole 54-case
conformance corpus reproduced independently by the Rust binary.
conformance corpus of that era reproduced independently by the Rust binary (the corpus has since
grown to 57 cases; the named `make conformance-crossimpl` gate re-runs the cross-check on every
invocation, 56/56 as of v3.7.0).

## Scope of coverage

Expand Down
8 changes: 4 additions & 4 deletions docs/readiness_pack/proofbundle/readiness_pack.bundle.json
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
{
"schema": "proofbundle/v0.1",
"payload_b64": "ZTZlMmYxY2EwMGMxNzk4OTc1MDA1MzE1MTcyMjQ4ZGIzZWU4ZmVmYjAyYjk3OGNkMTI2MjdjNTI2ZGQ1ZGM2MCAgQVVESVRPUl9PUEVOX1BPSU5UUy5tZAozZDY2YTg1ZmY3OWMwMjU4ZDc5NGU3YzhkODc0MGY4YTNiN2E2MmU2ZmZkOWJkN2RhZGExNThhOTM5OTY0NjYwICBPUEVOX1FVRVNUSU9OUy5tZAo5YTIyNzgxMDEzN2UwYzIzMjE5NDhiNjE3MzdjNWI0ZGJjYzM2MTk2ZjAxNzAyNmQ0M2E0YmRiMDUwYzExNDQ1ICBQUk9HUkVTUy5tZAoyYzU5YjJkZTkzNWM5MjgxNDBjNDQyNWFkMGQ0MDI2ODNiOTQ4MmYwNjRkNzYwZTlkOWFjZTM5Y2ZlN2I2ZWVjICBSRUFETUUubWQKYzljZWIzZjkyYTJmNzIwZDkwMWFmZmE4ZGVmYjQ3MDA0YjU4YTUxMDI5MzE3MjA4ZGI2NDFjZTUzZDkwYjI4NCAgUkVQUk9EVUNUSU9OX1JVTkJPT0subWQKMWI0ZTQzMTZhYWVhNmM5NjI2NjRmYzA4OTQ1YzY1YTA0ODE0N2ZkYzRhZDg5YTFlNjk0ODE4YjkzNGVmNmZhMiAgY2FsZW5kYXJfaW5kZXBlbmRlbmNlLm1kCmYwZGI0YzFjMTQ0OTAwMWIxZDI1YTI3MTIxNDhhMzMyOTM4NjNkYmY5MmJmMWRjMzFhMzRkMjQ2NWM2YmI2NDcgIGRpZmZlcmVudGlhbF9tYXRyaXgubWQKNDI2YTIyYmQ5MWM3YTc1Mjk3MDBjMDY1NzBhM2U1NWZiNGMxMTI4MTk5MmQ2MjE1ZmMyMzE1YjEyNzMxZjljZCAgaW5kZXguanNvbgo1ZDQ5OTc2NDJmN2M2OGI5MDJkYTVmODExODIxYzMwNmNkOTAyNTg5Y2IwMjdkNWY0YmM5NmQ1OTNmNTNlYmQ5ICBydXN0X3Bhcml0eV9zY29wZS5tZApmMmE3N2NhY2Q3ZmVmZTM5NDUwZWRiMTg1N2VjMmZmYzI1YTRkNGMzZDhkNjhlZmEwOTRiYTg0YWI3MzI1NzA4ICB0YW1wZXJfcmVzaXN0YW5jZS5tZAo2ZDZhNDA2NWExZTdlMDcxODE5OTYwY2VmOGUwMTE3YWRhOThlOTMxY2Q2MmZkOTQzNDFiNDVhZjQ4NjU3MTFhICB0aHJlYXRfbW9kZWxfZGVsdGFfMzYwLm1kCg==",
"payload_b64": "ZTZlMmYxY2EwMGMxNzk4OTc1MDA1MzE1MTcyMjQ4ZGIzZWU4ZmVmYjAyYjk3OGNkMTI2MjdjNTI2ZGQ1ZGM2MCAgQVVESVRPUl9PUEVOX1BPSU5UUy5tZAozZDY2YTg1ZmY3OWMwMjU4ZDc5NGU3YzhkODc0MGY4YTNiN2E2MmU2ZmZkOWJkN2RhZGExNThhOTM5OTY0NjYwICBPUEVOX1FVRVNUSU9OUy5tZAoyOTJjMDFjZjRkZGIyODg5MTVmNDZmOGIyMzRjYWE1NTgzYTQ4YjZkMGRmY2NhMzhkOGRiNmQ4OGJiZTZjZWI2ICBQUk9HUkVTUy5tZAo2Y2NhYjIwYzdkYWVmNmQ3MWMxM2UwZGNhY2JhMjRhNmExOGRkNDgwYjVkNDE0MThlMDFiNWJmMjk4M2ZmYzljICBSRUFETUUubWQKYzljZWIzZjkyYTJmNzIwZDkwMWFmZmE4ZGVmYjQ3MDA0YjU4YTUxMDI5MzE3MjA4ZGI2NDFjZTUzZDkwYjI4NCAgUkVQUk9EVUNUSU9OX1JVTkJPT0subWQKMWI0ZTQzMTZhYWVhNmM5NjI2NjRmYzA4OTQ1YzY1YTA0ODE0N2ZkYzRhZDg5YTFlNjk0ODE4YjkzNGVmNmZhMiAgY2FsZW5kYXJfaW5kZXBlbmRlbmNlLm1kCjlhOWE5ZTQ5NTYwNzZjNmMyODdkYWRhNWRlODJlYjY2Y2YyNTljZWM4OWE2ZTc5MTA4OGUxNzMzYTc0YzVlYTMgIGRpZmZlcmVudGlhbF9tYXRyaXgubWQKNDI2YTIyYmQ5MWM3YTc1Mjk3MDBjMDY1NzBhM2U1NWZiNGMxMTI4MTk5MmQ2MjE1ZmMyMzE1YjEyNzMxZjljZCAgaW5kZXguanNvbgpkMWQxZTA0ZTlkMmRlMzg0NDNlYzJiOTUzYzNhOWM5NjhhMzAzZTgxOTc3Y2I3ZTEyODQ2ODk0NTE2MGI1NmQ3ICBydXN0X3Bhcml0eV9zY29wZS5tZApmMmE3N2NhY2Q3ZmVmZTM5NDUwZWRiMTg1N2VjMmZmYzI1YTRkNGMzZDhkNjhlZmEwOTRiYTg0YWI3MzI1NzA4ICB0YW1wZXJfcmVzaXN0YW5jZS5tZAo2ZDZhNDA2NWExZTdlMDcxODE5OTYwY2VmOGUwMTE3YWRhOThlOTMxY2Q2MmZkOTQzNDFiNDVhZjQ4NjU3MTFhICB0aHJlYXRfbW9kZWxfZGVsdGFfMzYwLm1kCg==",
"signature": {
"alg": "ed25519",
"public_key_b64": "aQDV4VkcZW9Doag0DhpOgoMlcYPFcC36S5SrpKrOnQE=",
"sig_b64": "Q0UXjBrfaA2w+pUNCQhY42UQuJRIiWkHw+iVQ/RXi3tMp7wFfjucLkcHM+Dog5WJULdgJ9A+vmXs1uxV1XNkAw=="
"public_key_b64": "m5+3/jNLkag2YWmDXlmbWsCydYmazy1PeaXLAFmqPAU=",
"sig_b64": "y+3kN124U2UKTyK2LKX7TKLotGvxrxDzvL2AVxvMbd1MtpNlrUWWR0Zws9vG1sfHLI2AYWbegi738/9qLJg5AQ=="
},
"merkle": {
"hash_alg": "sha256-rfc6962",
"leaf_index": 0,
"tree_size": 1,
"inclusion_proof_b64": [],
"root_b64": "EjSMLMOQQmTnf6b7nWcAdJoURNgBG2RgvRVt4Yfz1Po="
"root_b64": "QDxzwZlLqS5oPl2MfvUcmbL9xs25UMPNrum6X/9uEng="
}
}
2 changes: 1 addition & 1 deletion docs/readiness_pack/proofbundle/readiness_pack.pub.b64
Original file line number Diff line number Diff line change
@@ -1 +1 @@
aQDV4VkcZW9Doag0DhpOgoMlcYPFcC36S5SrpKrOnQE=
m5+3/jNLkag2YWmDXlmbWsCydYmazy1PeaXLAFmqPAU=
2 changes: 1 addition & 1 deletion docs/readiness_pack/rust_parity_scope.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ python3 tools/pb_verify_rs/crosscheck.py --matrix audit_artifacts/360/rust_diffe
negative (decoy-parent, subject-mismatch, signer, lineage tiers), Python == Rust on exit-class +
lineage on every one

The whole conformance corpus (54 cases) is reproduced independently by the Rust binary.
The whole conformance corpus (57 cases as of v3.7.0; the `make conformance-crossimpl` gate reproduces 56/56 of its corpus cases) is reproduced independently by the Rust binary.

## Deliberately PENDING (honestly not Rust-covered, never silently accepted)

Expand Down