You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
docs(conformance): address code-review findings on the interop hardening
Follow-up to the IETF-audit hardening pass, fixing 8 review findings:
- Page copy no longer claims counts "cannot silently drift" absolutely: the
reconciliation test runs in cross-sdk-tests.yml, which triggers on the vector
corpus / spec (not site/** or scripts/**), so the copy now states what is
actually enforced (a corpus edit that outdates a number turns CI red). Test
header comment records the same trigger-scope caveat.
- Retract the "independent implementations" overclaim in the two docs the page
links to (README.md, cross-sdk-tests/README.md); state the real property
(separate, no-shared-code, single author; serialisation-drift detector, not
spec-ambiguity detector).
- ADR-0015: the dated 2026-05-12 snapshot's "Phase B ... deferred" line now
forward-points to the update where Phase B checkpoint anchoring landed, so it
no longer contradicts the header.
- Reconciliation test: scope the matrix regex to the "## Results matrix"
section and the prose regexes to the honesty callout, so an unrelated table
or stray figure elsewhere on the page can't be misread; surface count.py's
stderr on failure; load count.py output + page once and share across
subtests (was exec'd/read twice).
- Remove the unpinned "2-3 pinned receipt/chain vectors per spec version" prose
figure, pointing to the (pinned) matrix instead.
- Pin the verifier-side checkpoint reference to "ADR-0008 §3 out-of-band check
over ADR-0015 Phase B checkpoints" (was bare "ADR-0008 follow-through").
Copy file name to clipboardExpand all lines: README.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -49,7 +49,7 @@
49
49
50
50
## Conformance
51
51
52
-
Anyone can implement the protocol — so interoperability is the property that matters. The three SDKs (Go, Python, TypeScript) are independent implementations that **verify one another's receipts**: every conformance vector is signed once with a shared Ed25519 keypair, and each SDK re-verifies the signatures, canonical JSON, and hashes the other two produced — across a positive corpus, a MUST-reject corpus, and four pinned spec versions. This cross-language verification is enforced in CI.
52
+
Anyone can implement the protocol — so interoperability is the property that matters. The three SDKs (Go, Python, TypeScript) are separate, no-shared-code implementations that **verify one another's receipts**: every conformance vector is signed once with a shared Ed25519 keypair, and each SDK re-verifies the signatures, canonical JSON, and hashes the other two produced — across a positive corpus, a MUST-reject corpus, and four pinned spec versions. This cross-language verification is enforced in CI (it catches serialisation drift between the languages, not spec-interpretation ambiguity — the SDKs share one author).
53
53
54
54
The **[Conformance page](https://agentreceipts.ai/conformance/)** is the citeable summary: the interop claim, a results matrix with per-set vector counts, permanent links to every frozen vector set, and how to reproduce the checks. The shared corpus lives in [`cross-sdk-tests/`](cross-sdk-tests/).
Copy file name to clipboardExpand all lines: cross-sdk-tests/README.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
# Cross-SDK Tests
2
2
3
-
Three independent implementations of the Agent Receipt Protocol — the Go, Python, and TypeScript SDKs— verify one another's receipts. The vectors in this directory are the shared corpus that makes that claim checkable: each is signed once with a single shared Ed25519 keypair, and every SDK re-verifies the signatures, canonical JSON (RFC 8785), and receipt hashes the other two produced. Verification runs in both directions, over a **positive corpus** every implementation must accept and a **MUST-reject corpus** every implementation must refuse, across four pinned spec versions (v0.2.0–v0.5.0).
3
+
Three separate implementations of the Agent Receipt Protocol — the Go, Python, and TypeScript SDKs, one per language with no shared code — verify one another's receipts. The vectors in this directory are the shared corpus that makes that claim checkable: each is signed once with a single shared Ed25519 keypair, and every SDK re-verifies the signatures, canonical JSON (RFC 8785), and receipt hashes the other two produced. Verification runs in both directions, over a **positive corpus** every implementation must accept and a **MUST-reject corpus** every implementation must refuse, across four pinned spec versions (v0.2.0–v0.5.0). This catches cross-language serialisation drift; because the SDKs share a single author, it does not catch a spec-interpretation ambiguity encoded identically into all three (see the [Conformance page](https://agentreceipts.ai/conformance/) for the full statement of what this does and does not prove).
4
4
5
5
For the published, citeable summary of this suite — the interop claim, the results matrix with per-set vector counts, and CI-enforcement status — see the [Conformance page](https://agentreceipts.ai/conformance/).
Copy file name to clipboardExpand all lines: docs/adr/0015-key-rotation-byok-anchoring.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -138,7 +138,7 @@ What has **not** landed and is in scope for Phase A:
138
138
-`Rotate()` currently returns `ErrNotImplemented`. No rotation event schema, no `key_rotated` synthetic receipt emission path, no verifier-side rotation traversal.
139
139
- The external anchor write contract for rotation events. Until the anchor sink exists, **the post-compromise integrity guarantee is not honoured** and any rotation work that lands before it is partial.
140
140
141
-
Phase B (checkpoint anchoring) and Phase C (HSM/KMS adapters) are explicitly deferred and not on a schedule.
141
+
Phase B (checkpoint anchoring) and Phase C (HSM/KMS adapters) are explicitly deferred and not on a schedule*at this snapshot* — see the updates below, where Phase B checkpoint anchoring has since landed end-to-end. Phase C remains deferred.
142
142
143
143
### Update (2026-06-10): rotation verification and offline rotation landed
Copy file name to clipboardExpand all lines: site/src/content/docs/conformance.mdx
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -23,7 +23,7 @@ The three SDKs share no code: each is a separate implementation of the same spec
23
23
24
24
## Results matrix
25
25
26
-
Each row is a frozen vector set. The **Go / Py / TS** columns mark which implementations consume and verify that set in their test suites. Vector counts are generated from the committed JSON by [`scripts/conformance_matrix/count.py`](https://github.com/agent-receipts/obsigna/blob/main/scripts/conformance_matrix/count.py), and a CI [reconciliation test](https://github.com/agent-receipts/obsigna/blob/main/cross-sdk-tests/conformance_page_test.go) asserts every count in this table equals that script's output — so a number here cannot silently drift from the corpus.
26
+
Each row is a frozen vector set. The **Go / Py / TS** columns mark which implementations consume and verify that set in their test suites. Vector counts are generated from the committed JSON by [`scripts/conformance_matrix/count.py`](https://github.com/agent-receipts/obsigna/blob/main/scripts/conformance_matrix/count.py), and a CI [reconciliation test](https://github.com/agent-receipts/obsigna/blob/main/cross-sdk-tests/conformance_page_test.go) asserts every count in this table — and the figures in the callout below — equal that script's output. It re-runs whenever the vector corpus or the spec changes, so a corpus edit that outdates a number here turns the check red before merge.
27
27
28
28
| Vector set | Purpose | Go | Py | TS | Spec version(s) | Vectors |
29
29
| --- | --- | :-: | :-: | :-: | --- | ---: |
@@ -40,7 +40,7 @@ Each row is a frozen vector set. The **Go / Py / TS** columns mark which impleme
40
40
Each linked vector set above is pinned to an immutable commit, so a citation stays valid as the corpus grows.
41
41
42
42
<Asidetype="caution"title="Honest coverage — these are seed-level counts">
43
-
The counts are the real sizes of the frozen corpora today, not a coverage claim. They are seed-level and growing: 44 canonicalization/receipt-hash vectors, a 7-case MUST-reject corpus, and 2–3 pinned receipt/chain vectors per spec version. They are **not** exhaustive — they pin the shapes that mattered enough to freeze, and the corpus is extended as the specification evolves. Separately, the `did:key` resolution vectors ([`spec/test-vectors/did-key/`](https://github.com/agent-receipts/obsigna/tree/main/spec/test-vectors/did-key)) fix the `did:key` v0.7 wire shape (ADR-0007) as reference fixtures, but **no SDK implements `did:key` resolution yet**, so no suite consumes them. Rather than show an all-dashes row, that set is out-of-scope-for-now and omitted from the matrix above; wiring it into a cross-language suite is tracked in [#956](https://github.com/agent-receipts/obsigna/issues/956).
43
+
The counts are the real sizes of the frozen corpora today, not a coverage claim. They are seed-level and growing: 44 canonicalization/receipt-hash vectors, a 7-case MUST-reject corpus, and the per-version receipt/chain counts shown in the matrix above. They are **not** exhaustive — they pin the shapes that mattered enough to freeze, and the corpus is extended as the specification evolves. Separately, the `did:key` resolution vectors ([`spec/test-vectors/did-key/`](https://github.com/agent-receipts/obsigna/tree/main/spec/test-vectors/did-key)) fix the `did:key` v0.7 wire shape (ADR-0007) as reference fixtures, but **no SDK implements `did:key` resolution yet**, so no suite consumes them. Rather than show an all-dashes row, that set is out-of-scope-for-now and omitted from the matrix above; wiring it into a cross-language suite is tracked in [#956](https://github.com/agent-receipts/obsigna/issues/956).
0 commit comments