Add conformance page reconciliation test and off-page vector sets#957
Merged
Conversation
…DIT review Precision pass over the conformance page and the claims around it ahead of external standards-reviewer scrutiny. Conformance page + counts: - Add a Unicode-normalisation canon vector (string_no_unicode_normalization): NFD "e + U+0301" must canonicalise verbatim (65 CC 81), not fold to NFC U+00E9. Confirmed all three SDKs preserve it (no bug). \u escapes keep the fixture bytes ASCII so the source cannot itself be NFC-folded. Canon set 43 -> 44. - Wire the page counts so they cannot silently drift: new CI-run reconciliation test (cross-sdk-tests/conformance_page_test.go) execs count.py and asserts every matrix cell and the exact prose figures equal its output. count.py gains an on_page flag; the page copy now cites the reconciliation test. - Tighten "independent implementations" language: state the real property (three languages, no shared code) and its limit (catches serialisation drift, not spec-interpretation ambiguity; single author). No claim of independent authorship/interpretation remains. - did:key row was all dashes (no SDK implements resolution). Removed it from the matrix, kept the fixtures counted (on_page=False), noted out-of-scope in the honesty callout, and filed #956 for the real wiring. ADR hygiene: - ADR-0015 header was stale (Rotate()/anchor sink "not implemented", Phase B "deferred"/"unstarted"). Updated Status + implementation-status to match the shipped state (offline rotation, anchor-first writes, Phase B checkpoint anchoring end-to-end) and ADR-0019; index status updated to agree. - Pin checkpoint anchoring to ADR-0015 Phase B (the mechanism) instead of ADR-0008, in the daemon flag help, threat-model.md, and daemon emission comments. ADR-0008 retained for the truncation gap, the anchoring freeze, and the --against-anchor verifier check.
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").
Contributor
There was a problem hiding this comment.
Pull request overview
Adds CI reconciliation between the published Conformance page and the authoritative vector-count generator (scripts/conformance_matrix/count.py), and introduces an “off-page” classification for reference-only vector sets so they remain reproducible/countable without appearing in the public matrix.
Changes:
- Added an integration Go test that runs
count.py --format json, parsessite/src/content/docs/conformance.mdx, and asserts matrix + prose figures match the computed counts. - Extended
count.py’sVectorSetwithon_pageand updated Markdown/JSON rendering + unit tests to omit off-page sets from the paste-ready Markdown output while still counting them in totals. - Updated the Conformance page and related docs/ADRs to clarify the “independence” claim, reconcile updated vector counts, and refresh ADR cross-references; added a new canonicalization vector.
Reviewed changes
Copilot reviewed 17 out of 17 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
site/src/content/docs/conformance.mdx |
Updates conformance narrative, matrix count(s), and explains the reconciliation gate + omits off-page did:key row. |
scripts/conformance_matrix/count.py |
Adds on_page flag, omits off-page sets from --format md, and includes onPage in JSON. |
scripts/conformance_matrix/test_count.py |
Updates/extends tests for on-page-only markdown output and did:key off-page behavior. |
scripts/conformance_matrix/AGENTS.md |
Documents the reconciliation test and the on_page flag semantics. |
cross-sdk-tests/conformance_page_test.go |
New integration test reconciling count.py JSON vs conformance page matrix + prose figures. |
cross-sdk-tests/canonicalization_vectors.json |
Adds a Unicode normalization-related canonicalization vector (no NFC folding). |
README.md |
Clarifies “separate codebases” / what interop proves vs doesn’t. |
cross-sdk-tests/README.md |
Same clarification for the cross-sdk test corpus README. |
docs/threat-model.md |
Updates anchoring references from ADR-0008 framing toward ADR-0015 Phase B checkpoint anchoring. |
docs/adr/README.md |
Updates ADR-0015 status summary to reflect shipped phases. |
docs/adr/0015-key-rotation-byok-anchoring.md |
Updates ADR status and adds explicit Phase B checkpoint anchoring “landed” update details. |
daemon/internal/verifycli/anchor.go |
Comment updates to reference ADR-0015 Phase B + ADR-0008 §3 framing. |
daemon/internal/pipeline/build.go |
Comment updates for checkpoint anchoring terminology. |
daemon/internal/checkpoint/checkpoint.go |
Comment updates for ADR references around checkpoint types. |
daemon/internal/anchor/anchor.go |
Comment updates for checkpoint event-type ADR reference. |
daemon/daemon.go |
Comment updates for checkpoint anchoring ADR reference and wiring description. |
daemon/cmd/obsigna-daemon/main.go |
Flag help text updated to reference ADR-0015 Phase B checkpoint anchoring. |
ojongerius
force-pushed
the
claude/conformance-page-ietf-audit-uluf3h
branch
from
July 2, 2026 22:34
938c49d to
c2e2f51
Compare
- Reword the md renderer's "paste-ready" claim in count.py and test_count.py: the published matrix splits its combined Consumers column into separate Go/Py/TS columns, so it's a reference table, not a drop-in paste. - Widen cross-sdk-tests.yml's path filter to include the conformance page and scripts/conformance_matrix/**, so a direct edit to either can no longer bypass the reconciliation gate. Update the test's header comment and the page copy to match.
ojongerius
added a commit
that referenced
this pull request
Jul 3, 2026
Merges origin/main, which landed the on_page mechanism and CI reconciliation test (cross-sdk-tests/conformance_page_test.go) that issue #956's did:key row was meant to flip. Resolves conflicts by: - count.py: flip did:key resolution's on_page back to True (default) now that all three SDKs consume it. - test_count.py: replace test_did_key_is_off_page with test_did_key_is_on_page, asserting the flip. - conformance.mdx: re-add the did:key resolution row to the matrix with real Go/Py/TS checkmarks; adopt main's count-agnostic honesty callout (44 canonicalization / 7 MUST-reject, matching the reconciliation test's regexes) and drop the now-resolved "no SDK implements did:key resolution yet" caveat.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Adds a CI-enforced reconciliation test that binds the published conformance page's matrix and prose figures to the authoritative
count.pyscript, preventing stale numbers from reachingmain. Introduces anon_pageflag toVectorSetto distinguish reference fixtures (currentlydid:key resolution) that are counted for reproducibility but omitted from the published matrix.Why
The conformance page claims its vector counts are "generated, not asserted," but nothing enforced that the hand-typed table cells and prose figures matched
count.py's output. A change to a vector file could silently desync the two — worse than no number on a page cited to a standards body.The
did:key resolutionvectors are reference fixtures that no SDK suite currently consumes. They should be counted (corpus reproducibility) but shown as an all-dashes row invites the wrong question. Theon_pageflag lets them stay in the count while being excluded from the published matrix.Changes
cross-sdk-tests/conformance_page_test.go(new): Integration test that runscount.py --format json, parses the conformance page, and asserts:count.pyappears as a matrix row with the exact countcount.pydoes not know aboutcount.pypython3is not available (local dev); CI runners have itscripts/conformance_matrix/count.py:on_page: bool = Truefield toVectorSetdid:key resolutionwithon_page=False_render_md()to skip off-page sets (paste-ready for the published matrix)_render_json()to includeonPagein outputscripts/conformance_matrix/test_count.py:did:key resolutionis marked off-pagescripts/conformance_matrix/AGENTS.md: Documented the reconciliation test andon_pageflagsite/src/content/docs/conformance.mdx: Minor prose clarifications ("independent" → "separate codebases that share no code")cross-sdk-tests/canonicalization_vectors.json: Added Unicode normalization test vectorADR and daemon references: Updated cross-references from ADR-0008 to ADR-0015 Phase B checkpoint anchoring where applicable
Checklist
test_count.py)on_pageflag)Security