xoonya 3.1.0 → 3.1.2

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 (248) hide show
  1. package/.env.example +10 -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/PARTNER_READY_PATH.md +67 -67
  10. package/PUBLIC_DEMO_SCRIPT.md +79 -79
  11. package/README.md +843 -808
  12. package/RELEASE_NOTES.md +10 -15
  13. package/SERVICE_CONTRACT.md +207 -207
  14. package/START_HERE.md +159 -159
  15. package/TERMINOLOGY.md +55 -55
  16. package/WHY_XYTARA_XOONYA.md +43 -43
  17. package/XNYA_CONFORMANCE_MARK.md +78 -78
  18. package/XNYA_REFERENCE_IMPLEMENTATIONS.md +157 -157
  19. package/XOONYA_DEFAULT_PATH_MODEL.md +63 -63
  20. package/XOONYA_FOLLOWTHROUGH_TRUTH_MODEL.md +63 -63
  21. package/XOONYA_NATIVE_ATOM_SPEC.md +184 -184
  22. package/XOONYA_NATIVE_PROOF_FORMAT.md +570 -527
  23. package/XOONYA_NATIVE_STANDARD_GOVERNANCE.md +119 -119
  24. package/XOONYA_PROOF_TRUTH_MODEL.md +58 -58
  25. package/bin/xoonya-first-run.js +184 -184
  26. package/bin/xoonya-release.js +1367 -1367
  27. package/bin/xoonya-review.js +70 -70
  28. package/bin/xoonya.js +82 -82
  29. package/examples/integration_boundary_walkthrough.js +37 -37
  30. package/examples/package_quickstart.js +1007 -1007
  31. package/examples/partner_proof_walkthrough.js +68 -68
  32. package/examples/proof_review_walkthrough.js +66 -66
  33. package/examples/review_carried_handoff.js +72 -72
  34. package/index.js +31 -31
  35. package/integrations/PROOF_INTEGRATION_PROCESS.md +45 -45
  36. package/integrations/examples/example-third-party-verifier-registration.record.json +22 -22
  37. package/integrations/registration-record.schema.json +99 -99
  38. package/integrations/registry-snapshot.schema.json +36 -36
  39. package/integrations/registry.js +636 -636
  40. package/integrations/views.js +36 -36
  41. package/lib/adapter_certification_contract.js +90 -90
  42. package/lib/announcement_pack.js +61 -61
  43. package/lib/artifact_distribution_lane_contract.js +54 -54
  44. package/lib/asyncapi_contract.js +135 -135
  45. package/lib/auth_interop_contract.js +69 -69
  46. package/lib/authority_binding_lifecycle_contract.js +182 -182
  47. package/lib/bridge_intelligence.js +102 -102
  48. package/lib/cloudevents_contract.js +79 -79
  49. package/lib/crypto_agility_matrix.js +125 -125
  50. package/lib/default_path_contract.js +380 -380
  51. package/lib/ecosystem_entry.js +64 -64
  52. package/lib/erc8004_proof_lane_contract.js +64 -64
  53. package/lib/event_system_lane_contract.js +76 -76
  54. package/lib/external_proof_import_lane_contract.js +87 -87
  55. package/lib/feature_control_lane_contract.js +54 -54
  56. package/lib/followthrough_truth_contract.js +214 -214
  57. package/lib/framework_lane_contract.js +76 -76
  58. package/lib/governance_disputes_summary.js +36 -36
  59. package/lib/governance_intelligence.js +108 -108
  60. package/lib/identity_interop_contract.js +83 -83
  61. package/lib/integration_matrix_contract.js +81 -81
  62. package/lib/launch_narrative.js +53 -53
  63. package/lib/machine_identity_registry_contract.js +199 -199
  64. package/lib/major_rails_proof_lane_contract.js +87 -87
  65. package/lib/offline_verifiability_recovery_contract.js +155 -155
  66. package/lib/openapi_contract.js +227 -227
  67. package/lib/operational_receipt_contract.js +165 -165
  68. package/lib/outreach_proof.js +71 -71
  69. package/lib/phase_10_closeout_pack.js +45 -45
  70. package/lib/phase_10_completion_pack.js +76 -76
  71. package/lib/phase_10_decision_record_pack.js +54 -54
  72. package/lib/phase_10_decision_resolution_pack.js +53 -53
  73. package/lib/phase_10_demand_signal_adapters_proof_pack.js +74 -74
  74. package/lib/phase_10_ecosystem_backlog_triage_proof_pack.js +74 -74
  75. package/lib/phase_10_freeze_baseline_pack.js +67 -67
  76. package/lib/phase_10_freeze_review_pack.js +64 -64
  77. package/lib/phase_10_gate_pack.js +57 -57
  78. package/lib/phase_10_long_tail_continuity_pack.js +80 -80
  79. package/lib/phase_10_long_tail_ecosystem_pack.js +68 -68
  80. package/lib/phase_10_niche_extension_registry_proof_pack.js +74 -74
  81. package/lib/phase_1_claude_mcp_pack.js +60 -60
  82. package/lib/phase_1_claude_mcp_proof_pack.js +57 -57
  83. package/lib/phase_1_ecosystem_pack.js +51 -51
  84. package/lib/phase_1_openai_codex_pack.js +60 -60
  85. package/lib/phase_1_openai_codex_proof_pack.js +57 -57
  86. package/lib/phase_2_base_proof_pack.js +71 -71
  87. package/lib/phase_2_base_usdc_proof_pack.js +72 -72
  88. package/lib/phase_2_closeout_pack.js +65 -65
  89. package/lib/phase_2_completion_pack.js +113 -113
  90. package/lib/phase_2_decision_record_pack.js +66 -66
  91. package/lib/phase_2_decision_resolution_pack.js +69 -69
  92. package/lib/phase_2_eth_proof_pack.js +70 -70
  93. package/lib/phase_2_evm_base_proof_pack.js +73 -73
  94. package/lib/phase_2_evm_proof_pack.js +71 -71
  95. package/lib/phase_2_flip_preview_pack.js +60 -60
  96. package/lib/phase_2_freeze_review_pack.js +99 -99
  97. package/lib/phase_2_gate_pack.js +77 -77
  98. package/lib/phase_2_payment_rails_pack.js +71 -71
  99. package/lib/phase_2_usdc_proof_pack.js +71 -71
  100. package/lib/phase_3_brc_proof_pack.js +81 -81
  101. package/lib/phase_3_bsv_teranode_proof_pack.js +81 -81
  102. package/lib/phase_3_closeout_pack.js +62 -62
  103. package/lib/phase_3_completion_pack.js +92 -92
  104. package/lib/phase_3_decision_record_pack.js +64 -64
  105. package/lib/phase_3_decision_resolution_pack.js +69 -69
  106. package/lib/phase_3_freeze_baseline_pack.js +67 -67
  107. package/lib/phase_3_freeze_review_pack.js +80 -80
  108. package/lib/phase_3_gate_pack.js +76 -76
  109. package/lib/phase_3_metanet_proof_pack.js +81 -81
  110. package/lib/phase_3_native_bsv_pack.js +89 -89
  111. package/lib/phase_3_native_continuity_pack.js +82 -82
  112. package/lib/phase_4_attestation_proof_pack.js +75 -75
  113. package/lib/phase_4_closeout_pack.js +45 -45
  114. package/lib/phase_4_completion_pack.js +82 -82
  115. package/lib/phase_4_decision_record_pack.js +54 -54
  116. package/lib/phase_4_decision_resolution_pack.js +45 -45
  117. package/lib/phase_4_erc8004_proof_pack.js +76 -76
  118. package/lib/phase_4_freeze_baseline_pack.js +67 -67
  119. package/lib/phase_4_freeze_review_pack.js +68 -68
  120. package/lib/phase_4_gate_pack.js +58 -58
  121. package/lib/phase_4_identity_registry_proof_pack.js +75 -75
  122. package/lib/phase_4_identity_trust_pack.js +73 -73
  123. package/lib/phase_4_trust_continuity_pack.js +86 -86
  124. package/lib/phase_5_antelope_proof_pack.js +76 -76
  125. package/lib/phase_5_closeout_pack.js +44 -44
  126. package/lib/phase_5_completion_pack.js +82 -82
  127. package/lib/phase_5_decision_record_pack.js +54 -54
  128. package/lib/phase_5_decision_resolution_pack.js +45 -45
  129. package/lib/phase_5_freeze_baseline_pack.js +67 -67
  130. package/lib/phase_5_freeze_review_pack.js +68 -68
  131. package/lib/phase_5_gate_pack.js +58 -58
  132. package/lib/phase_5_major_rails_continuity_pack.js +86 -86
  133. package/lib/phase_5_major_rails_pack.js +74 -74
  134. package/lib/phase_5_proton_xpr_proof_pack.js +76 -76
  135. package/lib/phase_5_solana_proof_pack.js +76 -76
  136. package/lib/phase_6_autogen_proof_pack.js +74 -74
  137. package/lib/phase_6_closeout_pack.js +46 -46
  138. package/lib/phase_6_completion_pack.js +77 -77
  139. package/lib/phase_6_decision_record_pack.js +54 -54
  140. package/lib/phase_6_decision_resolution_pack.js +53 -53
  141. package/lib/phase_6_framework_continuity_pack.js +81 -81
  142. package/lib/phase_6_framework_runtime_pack.js +68 -68
  143. package/lib/phase_6_freeze_baseline_pack.js +68 -68
  144. package/lib/phase_6_freeze_review_pack.js +65 -65
  145. package/lib/phase_6_gate_pack.js +59 -59
  146. package/lib/phase_6_langchain_proof_pack.js +74 -74
  147. package/lib/phase_6_langgraph_proof_pack.js +74 -74
  148. package/lib/phase_6_semantic_kernel_proof_pack.js +74 -74
  149. package/lib/phase_7_closeout_pack.js +45 -45
  150. package/lib/phase_7_completion_pack.js +85 -85
  151. package/lib/phase_7_decision_record_pack.js +53 -53
  152. package/lib/phase_7_decision_resolution_pack.js +53 -53
  153. package/lib/phase_7_event_system_continuity_pack.js +89 -89
  154. package/lib/phase_7_event_system_pack.js +76 -76
  155. package/lib/phase_7_freeze_baseline_pack.js +74 -74
  156. package/lib/phase_7_freeze_review_pack.js +65 -65
  157. package/lib/phase_7_gate_pack.js +58 -58
  158. package/lib/phase_7_kafka_proof_pack.js +76 -76
  159. package/lib/phase_7_mqtt_proof_pack.js +76 -76
  160. package/lib/phase_7_nats_proof_pack.js +76 -76
  161. package/lib/phase_7_webhook_event_bus_proof_pack.js +76 -76
  162. package/lib/phase_8_closeout_pack.js +46 -46
  163. package/lib/phase_8_completion_pack.js +82 -82
  164. package/lib/phase_8_decision_record_pack.js +54 -54
  165. package/lib/phase_8_decision_resolution_pack.js +53 -53
  166. package/lib/phase_8_external_receipt_import_proof_pack.js +74 -74
  167. package/lib/phase_8_external_result_import_proof_pack.js +74 -74
  168. package/lib/phase_8_freeze_baseline_pack.js +71 -71
  169. package/lib/phase_8_freeze_review_pack.js +64 -64
  170. package/lib/phase_8_gate_pack.js +58 -58
  171. package/lib/phase_8_proof_bridge_continuity_pack.js +86 -86
  172. package/lib/phase_8_proof_bridges_pack.js +72 -72
  173. package/lib/phase_8_proof_bundle_normalization_proof_pack.js +74 -74
  174. package/lib/phase_9_closeout_pack.js +46 -46
  175. package/lib/phase_9_completion_pack.js +82 -82
  176. package/lib/phase_9_custody_refs_proof_pack.js +74 -74
  177. package/lib/phase_9_decision_record_pack.js +54 -54
  178. package/lib/phase_9_decision_resolution_pack.js +53 -53
  179. package/lib/phase_9_freeze_baseline_pack.js +71 -71
  180. package/lib/phase_9_freeze_review_pack.js +64 -64
  181. package/lib/phase_9_gate_pack.js +58 -58
  182. package/lib/phase_9_operator_accounting_bridges_proof_pack.js +74 -74
  183. package/lib/phase_9_treasury_connectivity_pack.js +72 -72
  184. package/lib/phase_9_treasury_continuity_pack.js +86 -86
  185. package/lib/phase_9_treasury_destinations_proof_pack.js +74 -74
  186. package/lib/phase_program_pack.js +47 -47
  187. package/lib/proof_bridge_lane_contract.js +82 -82
  188. package/lib/proof_truth_contract.js +224 -224
  189. package/lib/provenance_lane_contract.js +54 -54
  190. package/lib/provider_lane_contract.js +67 -67
  191. package/lib/public_surface_policy_contract.js +111 -111
  192. package/lib/publish_plan.js +51 -51
  193. package/lib/release_candidate.js +50 -50
  194. package/lib/release_center.js +1037 -1037
  195. package/lib/release_history.js +206 -206
  196. package/lib/release_manifest.js +114 -114
  197. package/lib/release_pack.js +391 -391
  198. package/lib/result_package_trust_lane_contract.js +74 -74
  199. package/lib/review_intelligence.js +100 -100
  200. package/lib/role_freeze.js +436 -436
  201. package/lib/shared_signals_lane_contract.js +54 -54
  202. package/lib/signed_audit_provenance_contract.js +93 -93
  203. package/lib/telemetry_lane_contract.js +54 -54
  204. package/lib/treasury_proof_lane_contract.js +83 -83
  205. package/lib/trust_intelligence.js +106 -106
  206. package/lib/trust_portability_boundary_contract.js +66 -66
  207. package/lib/trust_portability_pack.js +224 -224
  208. package/lib/verification_service_pack.js +149 -149
  209. package/package.json +98 -97
  210. package/proof_sdk.js +6561 -6265
  211. package/reference/python/README.md +35 -35
  212. package/reference/python/__pycache__/xnya_reference.cpython-314.pyc +0 -0
  213. package/reference/python/requirements-optional.txt +1 -1
  214. package/reference/python/verify_vectors.py +223 -223
  215. package/reference/python/xnya_reference.py +810 -810
  216. package/reference/rust/Cargo.toml +11 -11
  217. package/reference/rust/README.md +28 -28
  218. package/reference/rust/src/lib.rs +87 -87
  219. package/scripts/registry_cli.js +157 -157
  220. package/scripts/verify_all.js +603 -603
  221. package/scripts/verify_control_plane_contracts.js +34 -34
  222. package/scripts/verify_control_plane_routes.js +70 -70
  223. package/scripts/verify_examples.js +19 -19
  224. package/scripts/verify_external_proof_import_gate.js +84 -84
  225. package/scripts/verify_forgery_resistance.js +281 -0
  226. package/scripts/verify_integrations.js +170 -170
  227. package/scripts/verify_native_hybrid_design_gate.js +114 -114
  228. package/scripts/verify_reference_promotion_gate.js +74 -74
  229. package/scripts/verify_reference_python.js +49 -49
  230. package/scripts/verify_reference_python_crypto.js +87 -87
  231. package/scripts/verify_reference_rust_scaffold.js +50 -50
  232. package/scripts/verify_release_candidate.js +131 -131
  233. package/scripts/verify_service.js +3038 -2940
  234. package/scripts/verify_tooling.js +1251 -1251
  235. package/scripts/verify_trust_portability.js +56 -56
  236. package/scripts/verify_vectors.js +192 -192
  237. package/scripts/verify_verification_services.js +56 -56
  238. package/server.js +4223 -4099
  239. package/vectors/adversarial-vectors.json +552 -552
  240. package/vectors/conformance-vectors.json +446 -446
  241. package/vectors/native-atom-vectors.json +101 -101
  242. package/vectors/native-payload-profile-vectors.json +50 -50
  243. package/OPERATIONS_RUNBOOK.md +0 -50
  244. package/OPERATOR_START_HERE.md +0 -67
  245. package/PROGRAM_COMPLETE_RELEASE.md +0 -52
  246. package/PROGRAM_STATUS.md +0 -57
  247. package/PUBLISH_PLAN.md +0 -25
  248. package/RELEASE_CHECKLIST.md +0 -16
@@ -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())