xoonya 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. package/.env.example +2 -2
  2. package/CARRIED_HANDOFF_DEMO.md +60 -60
  3. package/COMPATIBILITY_NOTE.md +27 -27
  4. package/CROSS_RUNTIME_POSTURE.md +77 -77
  5. package/EXAMPLE_PATHS.md +53 -53
  6. package/FINAL_CONTRACT.md +445 -445
  7. package/LICENSE +201 -201
  8. package/NOTICE +3 -3
  9. package/OPERATIONS_RUNBOOK.md +50 -0
  10. package/OPERATOR_START_HERE.md +67 -0
  11. package/PARTNER_READY_PATH.md +67 -67
  12. package/PROGRAM_COMPLETE_RELEASE.md +52 -0
  13. package/PROGRAM_STATUS.md +57 -0
  14. package/PUBLIC_DEMO_SCRIPT.md +79 -79
  15. package/PUBLISH_PLAN.md +25 -0
  16. package/README.md +807 -732
  17. package/RELEASE_CHECKLIST.md +16 -0
  18. package/RELEASE_NOTES.md +15 -15
  19. package/SERVICE_CONTRACT.md +207 -195
  20. package/START_HERE.md +159 -150
  21. package/TERMINOLOGY.md +55 -55
  22. package/WHY_XYTARA_XOONYA.md +43 -43
  23. package/XNYA_CONFORMANCE_MARK.md +78 -78
  24. package/XNYA_REFERENCE_IMPLEMENTATIONS.md +157 -157
  25. package/XOONYA_DEFAULT_PATH_MODEL.md +63 -63
  26. package/XOONYA_FOLLOWTHROUGH_TRUTH_MODEL.md +63 -63
  27. package/XOONYA_NATIVE_ATOM_SPEC.md +184 -184
  28. package/XOONYA_NATIVE_PROOF_FORMAT.md +527 -527
  29. package/XOONYA_NATIVE_STANDARD_GOVERNANCE.md +119 -119
  30. package/XOONYA_PROOF_TRUTH_MODEL.md +58 -58
  31. package/bin/xoonya-first-run.js +184 -184
  32. package/bin/xoonya-release.js +1367 -1367
  33. package/bin/xoonya-review.js +70 -70
  34. package/bin/xoonya.js +82 -82
  35. package/examples/integration_boundary_walkthrough.js +37 -37
  36. package/examples/package_quickstart.js +1007 -1007
  37. package/examples/partner_proof_walkthrough.js +68 -68
  38. package/examples/proof_review_walkthrough.js +66 -66
  39. package/examples/review_carried_handoff.js +72 -72
  40. package/index.js +31 -22
  41. package/integrations/PROOF_INTEGRATION_PROCESS.md +45 -45
  42. package/integrations/examples/example-third-party-verifier-registration.record.json +22 -22
  43. package/integrations/registration-record.schema.json +99 -99
  44. package/integrations/registry-snapshot.schema.json +36 -36
  45. package/integrations/registry.js +636 -636
  46. package/integrations/views.js +36 -36
  47. package/lib/adapter_certification_contract.js +90 -0
  48. package/lib/announcement_pack.js +61 -61
  49. package/lib/artifact_distribution_lane_contract.js +54 -54
  50. package/lib/asyncapi_contract.js +135 -135
  51. package/lib/auth_interop_contract.js +69 -69
  52. package/lib/authority_binding_lifecycle_contract.js +182 -0
  53. package/lib/bridge_intelligence.js +102 -102
  54. package/lib/cloudevents_contract.js +79 -79
  55. package/lib/crypto_agility_matrix.js +125 -0
  56. package/lib/default_path_contract.js +380 -380
  57. package/lib/ecosystem_entry.js +64 -64
  58. package/lib/erc8004_proof_lane_contract.js +64 -64
  59. package/lib/event_system_lane_contract.js +76 -76
  60. package/lib/external_proof_import_lane_contract.js +87 -87
  61. package/lib/feature_control_lane_contract.js +54 -54
  62. package/lib/followthrough_truth_contract.js +214 -214
  63. package/lib/framework_lane_contract.js +76 -76
  64. package/lib/governance_disputes_summary.js +36 -36
  65. package/lib/governance_intelligence.js +108 -108
  66. package/lib/identity_interop_contract.js +83 -83
  67. package/lib/integration_matrix_contract.js +81 -81
  68. package/lib/launch_narrative.js +53 -53
  69. package/lib/machine_identity_registry_contract.js +199 -0
  70. package/lib/major_rails_proof_lane_contract.js +87 -87
  71. package/lib/offline_verifiability_recovery_contract.js +155 -0
  72. package/lib/openapi_contract.js +227 -227
  73. package/lib/operational_receipt_contract.js +165 -0
  74. package/lib/outreach_proof.js +71 -71
  75. package/lib/phase_10_closeout_pack.js +45 -45
  76. package/lib/phase_10_completion_pack.js +76 -76
  77. package/lib/phase_10_decision_record_pack.js +54 -54
  78. package/lib/phase_10_decision_resolution_pack.js +53 -53
  79. package/lib/phase_10_demand_signal_adapters_proof_pack.js +74 -74
  80. package/lib/phase_10_ecosystem_backlog_triage_proof_pack.js +74 -74
  81. package/lib/phase_10_freeze_baseline_pack.js +67 -67
  82. package/lib/phase_10_freeze_review_pack.js +64 -64
  83. package/lib/phase_10_gate_pack.js +57 -57
  84. package/lib/phase_10_long_tail_continuity_pack.js +80 -80
  85. package/lib/phase_10_long_tail_ecosystem_pack.js +68 -68
  86. package/lib/phase_10_niche_extension_registry_proof_pack.js +74 -74
  87. package/lib/phase_1_claude_mcp_pack.js +60 -60
  88. package/lib/phase_1_claude_mcp_proof_pack.js +57 -57
  89. package/lib/phase_1_ecosystem_pack.js +51 -51
  90. package/lib/phase_1_openai_codex_pack.js +60 -60
  91. package/lib/phase_1_openai_codex_proof_pack.js +57 -57
  92. package/lib/phase_2_base_proof_pack.js +71 -71
  93. package/lib/phase_2_base_usdc_proof_pack.js +72 -72
  94. package/lib/phase_2_closeout_pack.js +65 -65
  95. package/lib/phase_2_completion_pack.js +113 -113
  96. package/lib/phase_2_decision_record_pack.js +66 -66
  97. package/lib/phase_2_decision_resolution_pack.js +69 -69
  98. package/lib/phase_2_eth_proof_pack.js +70 -70
  99. package/lib/phase_2_evm_base_proof_pack.js +73 -73
  100. package/lib/phase_2_evm_proof_pack.js +71 -71
  101. package/lib/phase_2_flip_preview_pack.js +60 -60
  102. package/lib/phase_2_freeze_review_pack.js +99 -99
  103. package/lib/phase_2_gate_pack.js +77 -77
  104. package/lib/phase_2_payment_rails_pack.js +71 -71
  105. package/lib/phase_2_usdc_proof_pack.js +71 -71
  106. package/lib/phase_3_brc_proof_pack.js +81 -81
  107. package/lib/phase_3_bsv_teranode_proof_pack.js +81 -81
  108. package/lib/phase_3_closeout_pack.js +62 -62
  109. package/lib/phase_3_completion_pack.js +92 -92
  110. package/lib/phase_3_decision_record_pack.js +64 -64
  111. package/lib/phase_3_decision_resolution_pack.js +69 -69
  112. package/lib/phase_3_freeze_baseline_pack.js +67 -67
  113. package/lib/phase_3_freeze_review_pack.js +80 -80
  114. package/lib/phase_3_gate_pack.js +76 -76
  115. package/lib/phase_3_metanet_proof_pack.js +81 -81
  116. package/lib/phase_3_native_bsv_pack.js +89 -89
  117. package/lib/phase_3_native_continuity_pack.js +82 -82
  118. package/lib/phase_4_attestation_proof_pack.js +75 -75
  119. package/lib/phase_4_closeout_pack.js +45 -45
  120. package/lib/phase_4_completion_pack.js +82 -82
  121. package/lib/phase_4_decision_record_pack.js +54 -54
  122. package/lib/phase_4_decision_resolution_pack.js +45 -45
  123. package/lib/phase_4_erc8004_proof_pack.js +76 -76
  124. package/lib/phase_4_freeze_baseline_pack.js +67 -67
  125. package/lib/phase_4_freeze_review_pack.js +68 -68
  126. package/lib/phase_4_gate_pack.js +58 -58
  127. package/lib/phase_4_identity_registry_proof_pack.js +75 -75
  128. package/lib/phase_4_identity_trust_pack.js +73 -73
  129. package/lib/phase_4_trust_continuity_pack.js +86 -86
  130. package/lib/phase_5_antelope_proof_pack.js +76 -76
  131. package/lib/phase_5_closeout_pack.js +44 -44
  132. package/lib/phase_5_completion_pack.js +82 -82
  133. package/lib/phase_5_decision_record_pack.js +54 -54
  134. package/lib/phase_5_decision_resolution_pack.js +45 -45
  135. package/lib/phase_5_freeze_baseline_pack.js +67 -67
  136. package/lib/phase_5_freeze_review_pack.js +68 -68
  137. package/lib/phase_5_gate_pack.js +58 -58
  138. package/lib/phase_5_major_rails_continuity_pack.js +86 -86
  139. package/lib/phase_5_major_rails_pack.js +74 -74
  140. package/lib/phase_5_proton_xpr_proof_pack.js +76 -76
  141. package/lib/phase_5_solana_proof_pack.js +76 -76
  142. package/lib/phase_6_autogen_proof_pack.js +74 -74
  143. package/lib/phase_6_closeout_pack.js +46 -46
  144. package/lib/phase_6_completion_pack.js +77 -77
  145. package/lib/phase_6_decision_record_pack.js +54 -54
  146. package/lib/phase_6_decision_resolution_pack.js +53 -53
  147. package/lib/phase_6_framework_continuity_pack.js +81 -81
  148. package/lib/phase_6_framework_runtime_pack.js +68 -68
  149. package/lib/phase_6_freeze_baseline_pack.js +68 -68
  150. package/lib/phase_6_freeze_review_pack.js +65 -65
  151. package/lib/phase_6_gate_pack.js +59 -59
  152. package/lib/phase_6_langchain_proof_pack.js +74 -74
  153. package/lib/phase_6_langgraph_proof_pack.js +74 -74
  154. package/lib/phase_6_semantic_kernel_proof_pack.js +74 -74
  155. package/lib/phase_7_closeout_pack.js +45 -45
  156. package/lib/phase_7_completion_pack.js +85 -85
  157. package/lib/phase_7_decision_record_pack.js +53 -53
  158. package/lib/phase_7_decision_resolution_pack.js +53 -53
  159. package/lib/phase_7_event_system_continuity_pack.js +89 -89
  160. package/lib/phase_7_event_system_pack.js +76 -76
  161. package/lib/phase_7_freeze_baseline_pack.js +74 -74
  162. package/lib/phase_7_freeze_review_pack.js +65 -65
  163. package/lib/phase_7_gate_pack.js +58 -58
  164. package/lib/phase_7_kafka_proof_pack.js +76 -76
  165. package/lib/phase_7_mqtt_proof_pack.js +76 -76
  166. package/lib/phase_7_nats_proof_pack.js +76 -76
  167. package/lib/phase_7_webhook_event_bus_proof_pack.js +76 -76
  168. package/lib/phase_8_closeout_pack.js +46 -46
  169. package/lib/phase_8_completion_pack.js +82 -82
  170. package/lib/phase_8_decision_record_pack.js +54 -54
  171. package/lib/phase_8_decision_resolution_pack.js +53 -53
  172. package/lib/phase_8_external_receipt_import_proof_pack.js +74 -74
  173. package/lib/phase_8_external_result_import_proof_pack.js +74 -74
  174. package/lib/phase_8_freeze_baseline_pack.js +71 -71
  175. package/lib/phase_8_freeze_review_pack.js +64 -64
  176. package/lib/phase_8_gate_pack.js +58 -58
  177. package/lib/phase_8_proof_bridge_continuity_pack.js +86 -86
  178. package/lib/phase_8_proof_bridges_pack.js +72 -72
  179. package/lib/phase_8_proof_bundle_normalization_proof_pack.js +74 -74
  180. package/lib/phase_9_closeout_pack.js +46 -46
  181. package/lib/phase_9_completion_pack.js +82 -82
  182. package/lib/phase_9_custody_refs_proof_pack.js +74 -74
  183. package/lib/phase_9_decision_record_pack.js +54 -54
  184. package/lib/phase_9_decision_resolution_pack.js +53 -53
  185. package/lib/phase_9_freeze_baseline_pack.js +71 -71
  186. package/lib/phase_9_freeze_review_pack.js +64 -64
  187. package/lib/phase_9_gate_pack.js +58 -58
  188. package/lib/phase_9_operator_accounting_bridges_proof_pack.js +74 -74
  189. package/lib/phase_9_treasury_connectivity_pack.js +72 -72
  190. package/lib/phase_9_treasury_continuity_pack.js +86 -86
  191. package/lib/phase_9_treasury_destinations_proof_pack.js +74 -74
  192. package/lib/phase_program_pack.js +47 -47
  193. package/lib/proof_bridge_lane_contract.js +82 -82
  194. package/lib/proof_truth_contract.js +224 -224
  195. package/lib/provenance_lane_contract.js +54 -54
  196. package/lib/provider_lane_contract.js +67 -67
  197. package/lib/public_surface_policy_contract.js +111 -0
  198. package/lib/publish_plan.js +51 -51
  199. package/lib/release_candidate.js +50 -50
  200. package/lib/release_center.js +1037 -1037
  201. package/lib/release_history.js +206 -206
  202. package/lib/release_manifest.js +114 -114
  203. package/lib/release_pack.js +391 -391
  204. package/lib/result_package_trust_lane_contract.js +74 -74
  205. package/lib/review_intelligence.js +100 -100
  206. package/lib/role_freeze.js +436 -436
  207. package/lib/shared_signals_lane_contract.js +54 -54
  208. package/lib/signed_audit_provenance_contract.js +93 -0
  209. package/lib/telemetry_lane_contract.js +54 -54
  210. package/lib/treasury_proof_lane_contract.js +83 -83
  211. package/lib/trust_intelligence.js +106 -106
  212. package/lib/trust_portability_boundary_contract.js +66 -0
  213. package/lib/trust_portability_pack.js +224 -224
  214. package/lib/verification_service_pack.js +149 -149
  215. package/package.json +97 -95
  216. package/proof_sdk.js +6265 -6265
  217. package/reference/python/README.md +35 -35
  218. package/reference/python/requirements-optional.txt +1 -1
  219. package/reference/python/verify_vectors.py +223 -223
  220. package/reference/python/xnya_reference.py +810 -810
  221. package/reference/rust/Cargo.toml +11 -11
  222. package/reference/rust/README.md +28 -28
  223. package/reference/rust/src/lib.rs +87 -87
  224. package/scripts/registry_cli.js +157 -157
  225. package/scripts/verify_all.js +603 -603
  226. package/scripts/verify_control_plane_contracts.js +34 -0
  227. package/scripts/verify_control_plane_routes.js +70 -0
  228. package/scripts/verify_examples.js +19 -19
  229. package/scripts/verify_external_proof_import_gate.js +84 -84
  230. package/scripts/verify_integrations.js +170 -170
  231. package/scripts/verify_native_hybrid_design_gate.js +114 -114
  232. package/scripts/verify_reference_promotion_gate.js +74 -74
  233. package/scripts/verify_reference_python.js +49 -49
  234. package/scripts/verify_reference_python_crypto.js +87 -87
  235. package/scripts/verify_reference_rust_scaffold.js +50 -50
  236. package/scripts/verify_release_candidate.js +131 -131
  237. package/scripts/verify_service.js +2940 -2940
  238. package/scripts/verify_tooling.js +1251 -1251
  239. package/scripts/verify_trust_portability.js +56 -56
  240. package/scripts/verify_vectors.js +192 -192
  241. package/scripts/verify_verification_services.js +56 -56
  242. package/server.js +4099 -3997
  243. package/vectors/adversarial-vectors.json +552 -552
  244. package/vectors/conformance-vectors.json +446 -446
  245. package/vectors/native-atom-vectors.json +101 -101
  246. package/vectors/native-payload-profile-vectors.json +50 -50
@@ -1,35 +1,35 @@
1
- # XNYA Python Candidate Reference
2
-
3
- This folder contains an independent Python candidate for the XNYA atom, payload profile, and line-rate frame vector floor.
4
-
5
- It does not import the JavaScript implementation. It is not yet a full `XNYA-compatible` reference implementation because full promotion also requires proof-envelope parity, round-trip generation, and conformance-mark review.
6
-
7
- Run:
8
-
9
- ```bash
10
- python reference/python/verify_vectors.py
11
- ```
12
-
13
- Current boundary:
14
-
15
- - implemented: XNYA atom v1/v2 creation, parsing, verification, deterministic reject codes
16
- - implemented: XNYP payload profile encoding/parsing
17
- - implemented: line-rate frame checksum vector
18
- - implemented: canonical event hash parity
19
- - implemented: receipt emission for external assertion, native digest, legacy OP_RETURN, and native anchored methods
20
- - implemented: proof-bundle build/verify parity for non-signed native methods
21
- - implemented: adversarial reason parity for non-signed proof-bundle checks
22
- - implemented when optional dependency exists: Ed25519 native signed verification with `cryptography`
23
- - implemented without optional dependency: deterministic `native_signature_crypto_dependency_missing` gate
24
- - not claimed: always-on native signed cryptographic verification
25
- - not claimed: secp256k1 or P-256 Python signature-suite verification
26
- - not claimed: PQ/hybrid verification
27
- - not claimed: external issuer, chain, custody, auth, or settlement truth
28
-
29
- Optional Ed25519 suite check:
30
-
31
- ```bash
32
- npm run verify:reference-python-crypto
33
- ```
34
-
35
- The crypto-enabled command creates a temporary isolated virtual environment, installs `requirements-optional.txt`, and requires the Ed25519 vector to verify.
1
+ # XNYA Python Candidate Reference
2
+
3
+ This folder contains an independent Python candidate for the XNYA atom, payload profile, and line-rate frame vector floor.
4
+
5
+ It does not import the JavaScript implementation. It is not yet a full `XNYA-compatible` reference implementation because full promotion also requires proof-envelope parity, round-trip generation, and conformance-mark review.
6
+
7
+ Run:
8
+
9
+ ```bash
10
+ python reference/python/verify_vectors.py
11
+ ```
12
+
13
+ Current boundary:
14
+
15
+ - implemented: XNYA atom v1/v2 creation, parsing, verification, deterministic reject codes
16
+ - implemented: XNYP payload profile encoding/parsing
17
+ - implemented: line-rate frame checksum vector
18
+ - implemented: canonical event hash parity
19
+ - implemented: receipt emission for external assertion, native digest, legacy OP_RETURN, and native anchored methods
20
+ - implemented: proof-bundle build/verify parity for non-signed native methods
21
+ - implemented: adversarial reason parity for non-signed proof-bundle checks
22
+ - implemented when optional dependency exists: Ed25519 native signed verification with `cryptography`
23
+ - implemented without optional dependency: deterministic `native_signature_crypto_dependency_missing` gate
24
+ - not claimed: always-on native signed cryptographic verification
25
+ - not claimed: secp256k1 or P-256 Python signature-suite verification
26
+ - not claimed: PQ/hybrid verification
27
+ - not claimed: external issuer, chain, custody, auth, or settlement truth
28
+
29
+ Optional Ed25519 suite check:
30
+
31
+ ```bash
32
+ npm run verify:reference-python-crypto
33
+ ```
34
+
35
+ The crypto-enabled command creates a temporary isolated virtual environment, installs `requirements-optional.txt`, and requires the Ed25519 vector to verify.
@@ -1 +1 @@
1
- cryptography>=42.0.0
1
+ cryptography>=42.0.0
@@ -1,223 +1,223 @@
1
- #!/usr/bin/env python3
2
- """Verify Python XNYA candidate helpers against the published vector floor."""
3
-
4
- from __future__ import annotations
5
-
6
- import json
7
- import pathlib
8
- import sys
9
-
10
- from xnya_reference import (
11
- XnyaReferenceError,
12
- build_proof_bundle,
13
- canonicalize_event,
14
- create_atom_v1,
15
- create_atom_v2,
16
- emit_receipt,
17
- encode_payload_profile,
18
- hash_event,
19
- line_rate_frame_checksum,
20
- parse_atom,
21
- parse_payload_profile,
22
- verify_proof_bundle,
23
- verify_atom,
24
- _ed25519_crypto_available,
25
- )
26
-
27
-
28
- ROOT = pathlib.Path(__file__).resolve().parents[2]
29
-
30
-
31
- def load_json(relative_path: str) -> dict:
32
- with (ROOT / relative_path).open("r", encoding="utf-8") as handle:
33
- return json.load(handle)
34
-
35
-
36
- def assert_equal(actual, expected, message: str) -> None:
37
- if actual != expected:
38
- raise AssertionError(f"{message}: expected {expected!r}, got {actual!r}")
39
-
40
-
41
- def verify_atom_vectors() -> tuple[int, int]:
42
- vectors_doc = load_json("vectors/native-atom-vectors.json")
43
- identity = vectors_doc["identity_material_hex"]
44
- payload = vectors_doc["payload_ascii"].encode("ascii")
45
- positive_count = 0
46
- adversarial_count = 0
47
- for vector in vectors_doc["vectors"]:
48
- actual = (
49
- create_atom_v1(identity, payload if "with-payload" in vector["id"] else None)
50
- if vector["atom_version"] == "xoonya-native-atom/v1"
51
- else create_atom_v2(identity, payload if "with-payload" in vector["id"] else None)
52
- )
53
- assert_equal(actual["atom_hex"], vector["atom_hex"], f"{vector['id']} atom hex")
54
- assert_equal(actual["agent_id"], vector["agent_id"], f"{vector['id']} agent id")
55
- assert_equal(actual["payload_hash_sha256"], vector["payload_hash_sha256"], f"{vector['id']} payload hash")
56
- parsed = parse_atom(vector["atom_hex"])
57
- assert_equal(parsed.byte_length, vector["byte_length"], f"{vector['id']} byte length")
58
- if "atom_hash_sha256" in vector:
59
- assert_equal(parsed.atom_hash_sha256, vector["atom_hash_sha256"], f"{vector['id']} atom hash")
60
- verification = verify_atom(vector["atom_hex"], identity_material_hex=identity)
61
- assert_equal(verification["valid"], True, f"{vector['id']} verify")
62
- positive_count += 1
63
-
64
- for vector in vectors_doc["adversarial"]:
65
- try:
66
- result = verify_atom(
67
- vector["atom_hex"],
68
- identity_material_hex=vector.get("identity_material_hex"),
69
- payload=vector.get("payload_ascii", "").encode("ascii") if "payload_ascii" in vector else None,
70
- )
71
- if result["valid"]:
72
- raise AssertionError(f"{vector['id']} unexpectedly passed")
73
- assert_equal(result["error_code"], vector["expected_error_code"], f"{vector['id']} error code")
74
- except XnyaReferenceError as error:
75
- assert_equal(error.code, vector["expected_error_code"], f"{vector['id']} error code")
76
- adversarial_count += 1
77
- return positive_count, adversarial_count
78
-
79
-
80
- def verify_payload_profile_vectors() -> tuple[int, int]:
81
- vectors_doc = load_json("vectors/native-payload-profile-vectors.json")
82
- profile_vector = vectors_doc["profile_vector"]
83
- encoded = encode_payload_profile(profile_vector["input"])
84
- expected = profile_vector["expected"]
85
- assert_equal(encoded["canonical_bytes_hex"], expected["canonical_bytes_hex"], "payload profile canonical bytes")
86
- assert_equal(encoded["payload_hash_sha256"], expected["payload_hash_sha256"], "payload profile hash")
87
- assert_equal(encoded["schema_hash_sha256"], expected["schema_hash_sha256"], "payload profile schema hash")
88
- assert_equal(encoded["field_order"], expected["field_order"], "payload profile field order")
89
- parsed = parse_payload_profile(expected["canonical_bytes_hex"])
90
- assert_equal(parsed["payload_hash_sha256"], expected["payload_hash_sha256"], "payload profile parsed hash")
91
-
92
- frame_vector = vectors_doc["line_rate_frame_vector"]
93
- checksum = line_rate_frame_checksum(bytes.fromhex(frame_vector["atom_hex"]))
94
- assert_equal(checksum, frame_vector["checksum_hex"], "line-rate frame checksum")
95
- assert_equal(frame_vector["atom_hex"] + checksum, frame_vector["frame_hex"], "line-rate frame hex")
96
- return 1, 1
97
-
98
-
99
- def verify_proof_vectors() -> tuple[int, int, int, int]:
100
- vectors_doc = load_json("vectors/conformance-vectors.json")
101
- positive_count = 0
102
- verified_count = 0
103
- signed_crypto_gated_count = 0
104
- signed_crypto_verified_count = 0
105
- signed_dependency_missing_count = 0
106
- anchored_count = 0
107
- ed25519_available = _ed25519_crypto_available()
108
- for vector in vectors_doc["vectors"]:
109
- event = vector["event"]
110
- expected = vector["expected"]
111
- canonical_event = canonicalize_event(event)
112
- assert_equal(hash_event(canonical_event), expected["event_commitment"], f"{vector['id']} event commitment")
113
- options = dict(vector.get("receipt_options", {}))
114
- if expected["receipt"].get("algorithm") == "xoonya-native-hybrid-v1":
115
- assert_equal(expected["receipt"]["native_proof"]["method"], "xoonya-native-hybrid-v1", f"{vector['id']} native hybrid method")
116
- bundle = {
117
- "version": expected["proof_bundle_version"],
118
- "ceb": canonical_event,
119
- "receipt": expected["receipt"],
120
- }
121
- verification = verify_proof_bundle(bundle)
122
- assert_equal(verification["valid"], False, f"{vector['id']} python hybrid boundary")
123
- assert_equal(verification["reason"], "native_hybrid_runtime_unavailable_in_python_candidate", f"{vector['id']} python hybrid reason")
124
- positive_count += 1
125
- continue
126
- if expected["receipt"].get("algorithm") == "xoonya-native-signed-v1":
127
- assert_equal(expected["receipt"]["native_proof"]["method"], "xoonya-native-signed-v1", f"{vector['id']} native signed method")
128
- assert_equal(expected["receipt"]["native_proof"]["signature_suite"], options.get("signature_suite"), f"{vector['id']} native signed suite")
129
- bundle = {
130
- "version": expected["proof_bundle_version"],
131
- "ceb": canonical_event,
132
- "receipt": expected["receipt"],
133
- }
134
- verification = verify_proof_bundle(bundle)
135
- if ed25519_available:
136
- assert_equal(verification["valid"], True, f"{vector['id']} native signed verification")
137
- assert_equal(verification["verification_state"], "verified_native_signature", f"{vector['id']} native signed state")
138
- signed_crypto_verified_count += 1
139
- verified_count += 1
140
- else:
141
- assert_equal(verification["valid"], False, f"{vector['id']} native signed dependency gate")
142
- assert_equal(verification["reason"], "native_signature_crypto_dependency_missing", f"{vector['id']} native signed dependency reason")
143
- signed_dependency_missing_count += 1
144
- signed_crypto_gated_count += 1
145
- positive_count += 1
146
- continue
147
- if expected["receipt"].get("algorithm") == "xoonya-native-anchored-v1":
148
- options["anchors"] = vector["anchors"]
149
- receipt = emit_receipt(canonical_event, options)
150
- assert_equal(receipt, expected["receipt"], f"{vector['id']} emitted receipt")
151
- bundle_input = {"event": event, "receipt_options": options}
152
- if "anchors" in vector:
153
- bundle_input["anchors"] = vector["anchors"]
154
- bundle = build_proof_bundle(bundle_input)
155
- assert_equal(bundle["version"], expected["proof_bundle_version"], f"{vector['id']} proof bundle version")
156
- assert_equal(bundle["receipt"], expected["receipt"], f"{vector['id']} proof bundle receipt")
157
- verification = verify_proof_bundle(bundle)
158
- assert_equal(verification["valid"], True, f"{vector['id']} proof bundle verification")
159
- if expected["receipt"].get("algorithm") == "xoonya-native-anchored-v1":
160
- anchored_count += 1
161
- verified_count += 1
162
- positive_count += 1
163
-
164
- adversarial_doc = load_json("vectors/adversarial-vectors.json")
165
- adversarial_count = 0
166
- for vector in adversarial_doc["vectors"]:
167
- if vector["kind"] == "canonicalize_event_error":
168
- try:
169
- canonicalize_event(vector["event"])
170
- raise AssertionError(f"{vector['id']} unexpectedly passed")
171
- except ValueError as error:
172
- assert_equal(str(error), vector["expected_reason"], f"{vector['id']} reason")
173
- adversarial_count += 1
174
- continue
175
- if vector["kind"] != "verify_bundle_reason":
176
- continue
177
- result = verify_proof_bundle(vector["bundle"])
178
- expected_reason = vector["expected_reason"]
179
- if vector["bundle"].get("receipt", {}).get("algorithm") == "xoonya-native-hybrid-v1":
180
- expected_reason = "native_hybrid_runtime_unavailable_in_python_candidate"
181
- if expected_reason == "native_signature_invalid" and not ed25519_available:
182
- expected_reason = "native_signature_crypto_dependency_missing"
183
- assert_equal(result["valid"], False, f"{vector['id']} adversarial should fail")
184
- assert_equal(result["reason"], expected_reason, f"{vector['id']} adversarial reason")
185
- adversarial_count += 1
186
- return positive_count, verified_count, signed_crypto_gated_count, adversarial_count + anchored_count, signed_crypto_verified_count, signed_dependency_missing_count
187
-
188
-
189
- def main() -> int:
190
- atom_positive, atom_adversarial = verify_atom_vectors()
191
- payload_positive, frame_positive = verify_payload_profile_vectors()
192
- (
193
- proof_positive,
194
- proof_verified,
195
- signed_crypto_gated,
196
- proof_adversarial_and_anchor,
197
- signed_crypto_verified,
198
- signed_dependency_missing,
199
- ) = verify_proof_vectors()
200
- summary = {
201
- "ok": True,
202
- "product": "xoonya",
203
- "category": "xnya-python-reference-vector-parity",
204
- "status": "candidate_atom_payload_and_proof_bundle_vector_parity_passed",
205
- "atom_vector_count": atom_positive,
206
- "atom_adversarial_count": atom_adversarial,
207
- "payload_profile_vector_count": payload_positive,
208
- "line_rate_frame_vector_count": frame_positive,
209
- "proof_bundle_vector_count": proof_positive,
210
- "proof_bundle_verified_vector_count": proof_verified,
211
- "native_signed_crypto_gated_vector_count": signed_crypto_gated,
212
- "native_signed_crypto_verified_vector_count": signed_crypto_verified,
213
- "native_signature_crypto_dependency_missing_count": signed_dependency_missing,
214
- "verified_signature_suite_count": 1 if signed_crypto_verified else 0,
215
- "proof_adversarial_and_anchor_check_count": proof_adversarial_and_anchor,
216
- "boundary": "python_candidate_verifies_ed25519_native_signed_vectors_when_cryptography_dependency_is_available_other_signature_suites_stay_gated"
217
- }
218
- print(json.dumps(summary, indent=2, sort_keys=True))
219
- return 0
220
-
221
-
222
- if __name__ == "__main__":
223
- sys.exit(main())
1
+ #!/usr/bin/env python3
2
+ """Verify Python XNYA candidate helpers against the published vector floor."""
3
+
4
+ from __future__ import annotations
5
+
6
+ import json
7
+ import pathlib
8
+ import sys
9
+
10
+ from xnya_reference import (
11
+ XnyaReferenceError,
12
+ build_proof_bundle,
13
+ canonicalize_event,
14
+ create_atom_v1,
15
+ create_atom_v2,
16
+ emit_receipt,
17
+ encode_payload_profile,
18
+ hash_event,
19
+ line_rate_frame_checksum,
20
+ parse_atom,
21
+ parse_payload_profile,
22
+ verify_proof_bundle,
23
+ verify_atom,
24
+ _ed25519_crypto_available,
25
+ )
26
+
27
+
28
+ ROOT = pathlib.Path(__file__).resolve().parents[2]
29
+
30
+
31
+ def load_json(relative_path: str) -> dict:
32
+ with (ROOT / relative_path).open("r", encoding="utf-8") as handle:
33
+ return json.load(handle)
34
+
35
+
36
+ def assert_equal(actual, expected, message: str) -> None:
37
+ if actual != expected:
38
+ raise AssertionError(f"{message}: expected {expected!r}, got {actual!r}")
39
+
40
+
41
+ def verify_atom_vectors() -> tuple[int, int]:
42
+ vectors_doc = load_json("vectors/native-atom-vectors.json")
43
+ identity = vectors_doc["identity_material_hex"]
44
+ payload = vectors_doc["payload_ascii"].encode("ascii")
45
+ positive_count = 0
46
+ adversarial_count = 0
47
+ for vector in vectors_doc["vectors"]:
48
+ actual = (
49
+ create_atom_v1(identity, payload if "with-payload" in vector["id"] else None)
50
+ if vector["atom_version"] == "xoonya-native-atom/v1"
51
+ else create_atom_v2(identity, payload if "with-payload" in vector["id"] else None)
52
+ )
53
+ assert_equal(actual["atom_hex"], vector["atom_hex"], f"{vector['id']} atom hex")
54
+ assert_equal(actual["agent_id"], vector["agent_id"], f"{vector['id']} agent id")
55
+ assert_equal(actual["payload_hash_sha256"], vector["payload_hash_sha256"], f"{vector['id']} payload hash")
56
+ parsed = parse_atom(vector["atom_hex"])
57
+ assert_equal(parsed.byte_length, vector["byte_length"], f"{vector['id']} byte length")
58
+ if "atom_hash_sha256" in vector:
59
+ assert_equal(parsed.atom_hash_sha256, vector["atom_hash_sha256"], f"{vector['id']} atom hash")
60
+ verification = verify_atom(vector["atom_hex"], identity_material_hex=identity)
61
+ assert_equal(verification["valid"], True, f"{vector['id']} verify")
62
+ positive_count += 1
63
+
64
+ for vector in vectors_doc["adversarial"]:
65
+ try:
66
+ result = verify_atom(
67
+ vector["atom_hex"],
68
+ identity_material_hex=vector.get("identity_material_hex"),
69
+ payload=vector.get("payload_ascii", "").encode("ascii") if "payload_ascii" in vector else None,
70
+ )
71
+ if result["valid"]:
72
+ raise AssertionError(f"{vector['id']} unexpectedly passed")
73
+ assert_equal(result["error_code"], vector["expected_error_code"], f"{vector['id']} error code")
74
+ except XnyaReferenceError as error:
75
+ assert_equal(error.code, vector["expected_error_code"], f"{vector['id']} error code")
76
+ adversarial_count += 1
77
+ return positive_count, adversarial_count
78
+
79
+
80
+ def verify_payload_profile_vectors() -> tuple[int, int]:
81
+ vectors_doc = load_json("vectors/native-payload-profile-vectors.json")
82
+ profile_vector = vectors_doc["profile_vector"]
83
+ encoded = encode_payload_profile(profile_vector["input"])
84
+ expected = profile_vector["expected"]
85
+ assert_equal(encoded["canonical_bytes_hex"], expected["canonical_bytes_hex"], "payload profile canonical bytes")
86
+ assert_equal(encoded["payload_hash_sha256"], expected["payload_hash_sha256"], "payload profile hash")
87
+ assert_equal(encoded["schema_hash_sha256"], expected["schema_hash_sha256"], "payload profile schema hash")
88
+ assert_equal(encoded["field_order"], expected["field_order"], "payload profile field order")
89
+ parsed = parse_payload_profile(expected["canonical_bytes_hex"])
90
+ assert_equal(parsed["payload_hash_sha256"], expected["payload_hash_sha256"], "payload profile parsed hash")
91
+
92
+ frame_vector = vectors_doc["line_rate_frame_vector"]
93
+ checksum = line_rate_frame_checksum(bytes.fromhex(frame_vector["atom_hex"]))
94
+ assert_equal(checksum, frame_vector["checksum_hex"], "line-rate frame checksum")
95
+ assert_equal(frame_vector["atom_hex"] + checksum, frame_vector["frame_hex"], "line-rate frame hex")
96
+ return 1, 1
97
+
98
+
99
+ def verify_proof_vectors() -> tuple[int, int, int, int]:
100
+ vectors_doc = load_json("vectors/conformance-vectors.json")
101
+ positive_count = 0
102
+ verified_count = 0
103
+ signed_crypto_gated_count = 0
104
+ signed_crypto_verified_count = 0
105
+ signed_dependency_missing_count = 0
106
+ anchored_count = 0
107
+ ed25519_available = _ed25519_crypto_available()
108
+ for vector in vectors_doc["vectors"]:
109
+ event = vector["event"]
110
+ expected = vector["expected"]
111
+ canonical_event = canonicalize_event(event)
112
+ assert_equal(hash_event(canonical_event), expected["event_commitment"], f"{vector['id']} event commitment")
113
+ options = dict(vector.get("receipt_options", {}))
114
+ if expected["receipt"].get("algorithm") == "xoonya-native-hybrid-v1":
115
+ assert_equal(expected["receipt"]["native_proof"]["method"], "xoonya-native-hybrid-v1", f"{vector['id']} native hybrid method")
116
+ bundle = {
117
+ "version": expected["proof_bundle_version"],
118
+ "ceb": canonical_event,
119
+ "receipt": expected["receipt"],
120
+ }
121
+ verification = verify_proof_bundle(bundle)
122
+ assert_equal(verification["valid"], False, f"{vector['id']} python hybrid boundary")
123
+ assert_equal(verification["reason"], "native_hybrid_runtime_unavailable_in_python_candidate", f"{vector['id']} python hybrid reason")
124
+ positive_count += 1
125
+ continue
126
+ if expected["receipt"].get("algorithm") == "xoonya-native-signed-v1":
127
+ assert_equal(expected["receipt"]["native_proof"]["method"], "xoonya-native-signed-v1", f"{vector['id']} native signed method")
128
+ assert_equal(expected["receipt"]["native_proof"]["signature_suite"], options.get("signature_suite"), f"{vector['id']} native signed suite")
129
+ bundle = {
130
+ "version": expected["proof_bundle_version"],
131
+ "ceb": canonical_event,
132
+ "receipt": expected["receipt"],
133
+ }
134
+ verification = verify_proof_bundle(bundle)
135
+ if ed25519_available:
136
+ assert_equal(verification["valid"], True, f"{vector['id']} native signed verification")
137
+ assert_equal(verification["verification_state"], "verified_native_signature", f"{vector['id']} native signed state")
138
+ signed_crypto_verified_count += 1
139
+ verified_count += 1
140
+ else:
141
+ assert_equal(verification["valid"], False, f"{vector['id']} native signed dependency gate")
142
+ assert_equal(verification["reason"], "native_signature_crypto_dependency_missing", f"{vector['id']} native signed dependency reason")
143
+ signed_dependency_missing_count += 1
144
+ signed_crypto_gated_count += 1
145
+ positive_count += 1
146
+ continue
147
+ if expected["receipt"].get("algorithm") == "xoonya-native-anchored-v1":
148
+ options["anchors"] = vector["anchors"]
149
+ receipt = emit_receipt(canonical_event, options)
150
+ assert_equal(receipt, expected["receipt"], f"{vector['id']} emitted receipt")
151
+ bundle_input = {"event": event, "receipt_options": options}
152
+ if "anchors" in vector:
153
+ bundle_input["anchors"] = vector["anchors"]
154
+ bundle = build_proof_bundle(bundle_input)
155
+ assert_equal(bundle["version"], expected["proof_bundle_version"], f"{vector['id']} proof bundle version")
156
+ assert_equal(bundle["receipt"], expected["receipt"], f"{vector['id']} proof bundle receipt")
157
+ verification = verify_proof_bundle(bundle)
158
+ assert_equal(verification["valid"], True, f"{vector['id']} proof bundle verification")
159
+ if expected["receipt"].get("algorithm") == "xoonya-native-anchored-v1":
160
+ anchored_count += 1
161
+ verified_count += 1
162
+ positive_count += 1
163
+
164
+ adversarial_doc = load_json("vectors/adversarial-vectors.json")
165
+ adversarial_count = 0
166
+ for vector in adversarial_doc["vectors"]:
167
+ if vector["kind"] == "canonicalize_event_error":
168
+ try:
169
+ canonicalize_event(vector["event"])
170
+ raise AssertionError(f"{vector['id']} unexpectedly passed")
171
+ except ValueError as error:
172
+ assert_equal(str(error), vector["expected_reason"], f"{vector['id']} reason")
173
+ adversarial_count += 1
174
+ continue
175
+ if vector["kind"] != "verify_bundle_reason":
176
+ continue
177
+ result = verify_proof_bundle(vector["bundle"])
178
+ expected_reason = vector["expected_reason"]
179
+ if vector["bundle"].get("receipt", {}).get("algorithm") == "xoonya-native-hybrid-v1":
180
+ expected_reason = "native_hybrid_runtime_unavailable_in_python_candidate"
181
+ if expected_reason == "native_signature_invalid" and not ed25519_available:
182
+ expected_reason = "native_signature_crypto_dependency_missing"
183
+ assert_equal(result["valid"], False, f"{vector['id']} adversarial should fail")
184
+ assert_equal(result["reason"], expected_reason, f"{vector['id']} adversarial reason")
185
+ adversarial_count += 1
186
+ return positive_count, verified_count, signed_crypto_gated_count, adversarial_count + anchored_count, signed_crypto_verified_count, signed_dependency_missing_count
187
+
188
+
189
+ def main() -> int:
190
+ atom_positive, atom_adversarial = verify_atom_vectors()
191
+ payload_positive, frame_positive = verify_payload_profile_vectors()
192
+ (
193
+ proof_positive,
194
+ proof_verified,
195
+ signed_crypto_gated,
196
+ proof_adversarial_and_anchor,
197
+ signed_crypto_verified,
198
+ signed_dependency_missing,
199
+ ) = verify_proof_vectors()
200
+ summary = {
201
+ "ok": True,
202
+ "product": "xoonya",
203
+ "category": "xnya-python-reference-vector-parity",
204
+ "status": "candidate_atom_payload_and_proof_bundle_vector_parity_passed",
205
+ "atom_vector_count": atom_positive,
206
+ "atom_adversarial_count": atom_adversarial,
207
+ "payload_profile_vector_count": payload_positive,
208
+ "line_rate_frame_vector_count": frame_positive,
209
+ "proof_bundle_vector_count": proof_positive,
210
+ "proof_bundle_verified_vector_count": proof_verified,
211
+ "native_signed_crypto_gated_vector_count": signed_crypto_gated,
212
+ "native_signed_crypto_verified_vector_count": signed_crypto_verified,
213
+ "native_signature_crypto_dependency_missing_count": signed_dependency_missing,
214
+ "verified_signature_suite_count": 1 if signed_crypto_verified else 0,
215
+ "proof_adversarial_and_anchor_check_count": proof_adversarial_and_anchor,
216
+ "boundary": "python_candidate_verifies_ed25519_native_signed_vectors_when_cryptography_dependency_is_available_other_signature_suites_stay_gated"
217
+ }
218
+ print(json.dumps(summary, indent=2, sort_keys=True))
219
+ return 0
220
+
221
+
222
+ if __name__ == "__main__":
223
+ sys.exit(main())