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
@@ -0,0 +1,281 @@
1
+ "use strict";
2
+
3
+ // Forgery-resistance checks for the xoonya proof engine.
4
+ //
5
+ // This script talks to proof_sdk.js directly (no HTTP server) and pins down:
6
+ // (a) key substitution: a proof signed by key B that claims key A's identity
7
+ // self-verifies WITHOUT a trust root (known limitation, documented here)
8
+ // and is rejected WITH a trust root pinned to key A;
9
+ // (b) external methods are structural-only and fail under strict mode;
10
+ // (c) the default digest method is digest-only and fails under strict mode;
11
+ // (d) hybrid ed25519+ml-dsa-65: tampered PQ signature is rejected, and a
12
+ // wrong pinned PQ ref yields native_hybrid_public_key_not_trusted;
13
+ // (e) results are deterministic across repeated runs for the same inputs.
14
+
15
+ const assert = require("assert");
16
+ const crypto = require("crypto");
17
+ const sdk = require("../proof_sdk.js");
18
+
19
+ function canonicalize(value) {
20
+ if (Array.isArray(value)) {
21
+ return `[${value.map((item) => canonicalize(item)).join(",")}]`;
22
+ }
23
+ if (value && typeof value === "object") {
24
+ const keys = Object.keys(value).sort();
25
+ return `{${keys.map((key) => `${JSON.stringify(key)}:${canonicalize(value[key])}`).join(",")}}`;
26
+ }
27
+ return JSON.stringify(value);
28
+ }
29
+
30
+ function pem(key, type) {
31
+ return key.export({ type, format: "pem" });
32
+ }
33
+
34
+ function tamperBase64url(value) {
35
+ const last = value.slice(-1);
36
+ return `${value.slice(0, -1)}${last === "A" ? "B" : "A"}`;
37
+ }
38
+
39
+ const event = {
40
+ version: "canonical-event-bundle/v1",
41
+ domain_id: "forgery.resistance",
42
+ sequence: "1",
43
+ actor_id: "alice",
44
+ adapter_source: "verify_forgery_resistance",
45
+ event_type: "proof.forgery.probe",
46
+ event_hash: "cd".repeat(32)
47
+ };
48
+ const ALICE_IDENTITY_REF = "did:xoonya:alice";
49
+
50
+ function signedReceiptFor(keyPair) {
51
+ return sdk.emitReceipt(event, {
52
+ agent_identity: "alice",
53
+ algorithm: "xoonya-native-signed-v1",
54
+ identity_ref: ALICE_IDENTITY_REF,
55
+ signature_suite: "ed25519",
56
+ private_key_pem: pem(keyPair.privateKey, "pkcs8"),
57
+ public_key_pem: pem(keyPair.publicKey, "spki")
58
+ });
59
+ }
60
+
61
+ function bundleFor(receipt) {
62
+ return sdk.buildProofBundle({ ceb: event, receipt });
63
+ }
64
+
65
+ function checkKeySubstitution() {
66
+ const keyA = crypto.generateKeyPairSync("ed25519");
67
+ const keyB = crypto.generateKeyPairSync("ed25519");
68
+ const receiptA = signedReceiptFor(keyA);
69
+ const receiptB = signedReceiptFor(keyB);
70
+ const refA = receiptA.native_proof.public_key_ref;
71
+ const refB = receiptB.native_proof.public_key_ref;
72
+ assert.notStrictEqual(refA, refB, "distinct keys must produce distinct public_key_ref values");
73
+ assert.strictEqual(receiptB.native_proof.identity_ref, ALICE_IDENTITY_REF, "key B proof claims alice's identity_ref");
74
+
75
+ // Known limitation: without a verifier-supplied trust root, public_key_ref is only
76
+ // self-bound to the carried key material, so key B can claim alice's identity.
77
+ const substitutionWithoutRoot = sdk.verifyProofBundle(bundleFor(receiptB));
78
+ assert.strictEqual(substitutionWithoutRoot.valid, true, "key substitution self-verifies without a trust root (documented limitation)");
79
+ assert.strictEqual(substitutionWithoutRoot.verification_class, "cryptographic", "native signed class must be cryptographic");
80
+ assert.strictEqual(substitutionWithoutRoot.cryptographically_verified, true, "native signed proof must report cryptographic verification");
81
+ assert.strictEqual(substitutionWithoutRoot.trust_root_applied, false, "trust_root_applied must be false without a trust root");
82
+ assert.strictEqual(substitutionWithoutRoot.public_key_ref, refB, "verify result must surface the signing key ref so callers can pin it");
83
+
84
+ const trustRoot = { trusted_public_key_refs: { [ALICE_IDENTITY_REF]: refA } };
85
+ const substitutionWithRoot = sdk.verifyProofBundle(bundleFor(receiptB), trustRoot);
86
+ assert.strictEqual(substitutionWithRoot.valid, false, "key substitution must be rejected with a pinned trust root");
87
+ assert.strictEqual(substitutionWithRoot.reason, "native_public_key_not_trusted", "key substitution rejection reason mismatch");
88
+ assert.strictEqual(substitutionWithRoot.trust_root_applied, true, "trust_root_applied must be true with a trust root");
89
+ assert.strictEqual(substitutionWithRoot.cryptographically_verified, false, "rejected result must not claim cryptographic verification");
90
+
91
+ const genuineWithRoot = sdk.verifyProofBundle(bundleFor(receiptA), trustRoot);
92
+ assert.strictEqual(genuineWithRoot.valid, true, "genuine key A proof must verify with trust root pinned to key A");
93
+ assert.strictEqual(genuineWithRoot.trust_root_applied, true, "genuine trust_root_applied mismatch");
94
+
95
+ const genuineArrayRoot = sdk.verifyProofBundle(bundleFor(receiptA), { trusted_public_key_refs: { [ALICE_IDENTITY_REF]: [refB, refA] } });
96
+ assert.strictEqual(genuineArrayRoot.valid, true, "array-valued trust root must accept any listed ref");
97
+
98
+ const expectedRefRoot = sdk.verifyProofBundle(bundleFor(receiptB), { expected_public_key_ref: refA });
99
+ assert.strictEqual(expectedRefRoot.reason, "native_public_key_not_trusted", "expected_public_key_ref must reject key B");
100
+ assert.strictEqual(sdk.verifyProofBundle(bundleFor(receiptA), { expected_public_key_ref: refA }).valid, true, "expected_public_key_ref must accept key A");
101
+
102
+ const unknownIdentityRoot = sdk.verifyProofBundle(bundleFor(receiptA), { trusted_public_key_refs: { "did:xoonya:bob": refA } });
103
+ assert.strictEqual(unknownIdentityRoot.reason, "native_public_key_not_trusted", "identity absent from trust root must fail closed");
104
+
105
+ const hybridOnlyRoot = sdk.verifyProofBundle(bundleFor(receiptA), { expected_pq_public_key_ref: "ml-dsa-65-spki-sha256:" + "00".repeat(32) });
106
+ assert.strictEqual(hybridOnlyRoot.reason, "native_public_key_not_trusted", "a PQ-only pin against a classical-only proof must fail closed");
107
+
108
+ const strictGenuine = sdk.verifyProofBundle(bundleFor(receiptA), { ...trustRoot, strict: true });
109
+ assert.strictEqual(strictGenuine.valid, true, "cryptographic class must pass strict mode");
110
+ return { refA, refB };
111
+ }
112
+
113
+ function checkExternalStructural() {
114
+ const methods = ["jwt-assertion-v1", "did-vc-v1", "sd-jwt-vc-v1", "signed-envelope-v1", "partner-proof-envelope-v1", "detached-assertion-v1"];
115
+ for (const methodId of methods) {
116
+ const receipt = sdk.emitReceipt(event, {
117
+ agent_identity: "alice",
118
+ algorithm: methodId,
119
+ signature: `garbage-signature-${crypto.randomBytes(8).toString("hex")}`
120
+ });
121
+ const relaxed = sdk.verifyProofBundle(bundleFor(receipt));
122
+ assert.strictEqual(relaxed.valid, true, `${methodId} garbage signature is accepted structurally by default`);
123
+ assert.strictEqual(relaxed.verification_class, "structural", `${methodId} class must be structural`);
124
+ assert.strictEqual(relaxed.cryptographically_verified, false, `${methodId} must not claim cryptographic verification`);
125
+ const strict = sdk.verifyProofBundle(bundleFor(receipt), { strict: true });
126
+ assert.strictEqual(strict.valid, false, `${methodId} must fail under strict verification`);
127
+ assert.strictEqual(strict.reason, "external_verification_required", `${methodId} strict rejection reason mismatch`);
128
+ assert.strictEqual(strict.verification_class, "structural", `${methodId} strict class mismatch`);
129
+ }
130
+ }
131
+
132
+ function checkDigestDefault() {
133
+ const receipt = sdk.emitReceipt(event, { agent_identity: "alice" });
134
+ assert.strictEqual(receipt.algorithm, "xoonya-native-sha256-v1", "default receipt method mismatch");
135
+ const relaxed = sdk.verifyProofBundle(bundleFor(receipt));
136
+ assert.strictEqual(relaxed.valid, true, "digest bundle verifies by default");
137
+ assert.strictEqual(relaxed.verification_class, "digest", "digest class mismatch");
138
+ assert.strictEqual(relaxed.cryptographically_verified, false, "digest must not claim cryptographic verification");
139
+
140
+ // Anyone can forge a digest receipt for any identity: there is no key involved.
141
+ const forged = sdk.emitReceipt(event, { agent_identity: "alice" });
142
+ assert.strictEqual(forged.signature, receipt.signature, "digest receipts are reproducible by anyone who knows the event");
143
+
144
+ const strict = sdk.verifyProofBundle(bundleFor(receipt), { strict: true });
145
+ assert.strictEqual(strict.valid, false, "digest bundle must fail under strict verification");
146
+ assert.strictEqual(strict.reason, "digest_only_not_cryptographically_verified", "strict digest reason mismatch");
147
+
148
+ const previous = process.env.XOONYA_STRICT_VERIFY;
149
+ process.env.XOONYA_STRICT_VERIFY = "1";
150
+ try {
151
+ const envStrict = sdk.verifyProofBundle(bundleFor(receipt));
152
+ assert.strictEqual(envStrict.valid, false, "XOONYA_STRICT_VERIFY=1 must enable strict mode globally");
153
+ assert.strictEqual(envStrict.strict, true, "env strict flag must echo in the result");
154
+ } finally {
155
+ if (previous === undefined) delete process.env.XOONYA_STRICT_VERIFY;
156
+ else process.env.XOONYA_STRICT_VERIFY = previous;
157
+ }
158
+ }
159
+
160
+ function checkHybrid() {
161
+ const classical = crypto.generateKeyPairSync("ed25519");
162
+ const pq = crypto.generateKeyPairSync("ml-dsa-65");
163
+ const receipt = sdk.emitReceipt(event, {
164
+ agent_identity: "alice",
165
+ algorithm: "xoonya-native-hybrid-v1",
166
+ identity_ref: ALICE_IDENTITY_REF,
167
+ classical_signature_suite: "ed25519",
168
+ pq_signature_suite: "ml-dsa-65",
169
+ classical_public_key_pem: pem(classical.publicKey, "spki"),
170
+ classical_private_key_pem: pem(classical.privateKey, "pkcs8"),
171
+ pq_public_key_pem: pem(pq.publicKey, "spki"),
172
+ pq_private_key_pem: pem(pq.privateKey, "pkcs8")
173
+ });
174
+ const bundle = bundleFor(receipt);
175
+ const genuine = sdk.verifyProofBundle(bundle);
176
+ assert.strictEqual(genuine.valid, true, "hybrid bundle must verify");
177
+ assert.strictEqual(genuine.verification_class, "cryptographic", "hybrid class must be cryptographic");
178
+ assert.strictEqual(genuine.cryptographically_verified, true, "hybrid must report cryptographic verification");
179
+ assert.strictEqual(genuine.classical_public_key_ref, receipt.native_proof.classical_public_key_ref, "hybrid classical ref surfaced");
180
+ assert.strictEqual(genuine.pq_public_key_ref, receipt.native_proof.pq_public_key_ref, "hybrid pq ref surfaced");
181
+
182
+ const tamperedPqSignature = tamperBase64url(receipt.native_proof.proof_material.pq_signature);
183
+ const tamperedReceipt = {
184
+ ...receipt,
185
+ native_proof: {
186
+ ...receipt.native_proof,
187
+ proof_material: { ...receipt.native_proof.proof_material, pq_signature: tamperedPqSignature }
188
+ },
189
+ signature: `xoonya-native-hybrid-v1:${receipt.native_proof.hybrid_suite}:${receipt.native_proof.proof_material.classical_signature}.${tamperedPqSignature}`
190
+ };
191
+ const tampered = sdk.verifyProofBundle(bundleFor(tamperedReceipt));
192
+ assert.strictEqual(tampered.valid, false, "tampered PQ signature must be rejected");
193
+ assert.strictEqual(tampered.reason, "native_hybrid_pq_signature_invalid", "tampered PQ signature reason mismatch");
194
+ assert.strictEqual(tampered.cryptographically_verified, false, "tampered hybrid must not claim cryptographic verification");
195
+
196
+ const wrongPqRef = `ml-dsa-65-spki-sha256:${"11".repeat(32)}`;
197
+ const wrongPqPinned = sdk.verifyProofBundle(bundle, {
198
+ trusted_public_key_refs: { [ALICE_IDENTITY_REF]: { classical: genuine.classical_public_key_ref, pq: wrongPqRef } }
199
+ });
200
+ assert.strictEqual(wrongPqPinned.valid, false, "wrong pinned PQ ref must be rejected");
201
+ assert.strictEqual(wrongPqPinned.reason, "native_hybrid_public_key_not_trusted", "wrong PQ pin reason mismatch");
202
+ assert.strictEqual(wrongPqPinned.trust_root_applied, true, "hybrid trust_root_applied mismatch");
203
+
204
+ const wrongExpectedPq = sdk.verifyProofBundle(bundle, { expected_pq_public_key_ref: wrongPqRef });
205
+ assert.strictEqual(wrongExpectedPq.reason, "native_hybrid_public_key_not_trusted", "expected_pq_public_key_ref mismatch must be rejected");
206
+
207
+ const rightPinned = sdk.verifyProofBundle(bundle, {
208
+ trusted_public_key_refs: { [ALICE_IDENTITY_REF]: { classical: genuine.classical_public_key_ref, pq: genuine.pq_public_key_ref } },
209
+ strict: true
210
+ });
211
+ assert.strictEqual(rightPinned.valid, true, "correctly pinned hybrid must verify under strict mode");
212
+
213
+ const classicalOnlyPin = sdk.verifyProofBundle(bundle, { trusted_public_key_refs: { [ALICE_IDENTITY_REF]: genuine.classical_public_key_ref } });
214
+ assert.strictEqual(classicalOnlyPin.valid, true, "string-valued trust root pins the classical lane of a hybrid proof");
215
+
216
+ const otherClassical = crypto.generateKeyPairSync("ed25519");
217
+ const otherClassicalRef = sdk.emitReceipt(event, {
218
+ agent_identity: "alice",
219
+ algorithm: "xoonya-native-signed-v1",
220
+ identity_ref: ALICE_IDENTITY_REF,
221
+ signature_suite: "ed25519",
222
+ private_key_pem: pem(otherClassical.privateKey, "pkcs8"),
223
+ public_key_pem: pem(otherClassical.publicKey, "spki")
224
+ }).native_proof.public_key_ref;
225
+ const wrongClassicalPin = sdk.verifyProofBundle(bundle, { trusted_public_key_refs: { [ALICE_IDENTITY_REF]: otherClassicalRef } });
226
+ assert.strictEqual(wrongClassicalPin.reason, "native_hybrid_public_key_not_trusted", "wrong classical pin on hybrid must be rejected");
227
+ return bundle;
228
+ }
229
+
230
+ function checkDeterminism(hybridBundle, refs) {
231
+ const keyA = crypto.generateKeyPairSync("ed25519");
232
+ const signedBundle = bundleFor(signedReceiptFor(keyA));
233
+ const digestBundle = bundleFor(sdk.emitReceipt(event, { agent_identity: "alice" }));
234
+ const externalBundle = bundleFor(sdk.emitReceipt(event, { agent_identity: "alice", algorithm: "jwt-assertion-v1", signature: "garbage" }));
235
+ const cases = [
236
+ [signedBundle, {}],
237
+ [signedBundle, { strict: true }],
238
+ [signedBundle, { trusted_public_key_refs: { [ALICE_IDENTITY_REF]: refs.refA } }],
239
+ [digestBundle, {}],
240
+ [digestBundle, { strict: true }],
241
+ [externalBundle, { strict: true }],
242
+ [hybridBundle, {}],
243
+ [hybridBundle, { expected_pq_public_key_ref: "nope" }]
244
+ ];
245
+ for (const [bundle, options] of cases) {
246
+ const first = canonicalize(sdk.verifyProofBundle(bundle, options));
247
+ const second = canonicalize(sdk.verifyProofBundle(bundle, options));
248
+ assert.strictEqual(first, second, `verification result must be deterministic for options ${JSON.stringify(options)}`);
249
+ }
250
+ }
251
+
252
+ function main() {
253
+ const classes = sdk.listProofVerificationClasses().map((entry) => entry.id).sort();
254
+ assert.deepStrictEqual(classes, ["anchored_binding", "cryptographic", "digest", "structural"], "verification class registry mismatch");
255
+ assert.deepStrictEqual(
256
+ sdk.PROOF_VERIFICATION_STRICT_REJECTION_CODES.slice(),
257
+ ["digest_only_not_cryptographically_verified", "external_verification_required"],
258
+ "strict rejection code registry mismatch"
259
+ );
260
+ assert.deepStrictEqual(
261
+ sdk.PROOF_VERIFICATION_TRUST_ROOT_REJECTION_CODES.slice(),
262
+ ["native_public_key_not_trusted", "native_hybrid_public_key_not_trusted"],
263
+ "trust root rejection code registry mismatch"
264
+ );
265
+
266
+ const refs = checkKeySubstitution();
267
+ checkExternalStructural();
268
+ checkDigestDefault();
269
+ const hybridBundle = checkHybrid();
270
+ checkDeterminism(hybridBundle, refs);
271
+
272
+ console.log("xoonya verify:forgery-resistance passed");
273
+ console.log("key substitution without trust root: accepted (documented limitation; pin with trusted_public_key_refs)");
274
+ console.log("key substitution with trust root: native_public_key_not_trusted");
275
+ console.log("external methods under strict: external_verification_required");
276
+ console.log("digest method under strict: digest_only_not_cryptographically_verified");
277
+ console.log("hybrid tampered pq signature: native_hybrid_pq_signature_invalid");
278
+ console.log("hybrid wrong pq pin: native_hybrid_public_key_not_trusted");
279
+ }
280
+
281
+ main();
@@ -1,170 +1,170 @@
1
- "use strict";
2
-
3
- const assert = require("assert");
4
- const stagedPartnerVerifierRegistrationRecord = require("../integrations/examples/example-third-party-verifier-registration.record.json");
5
- const root = require("../index.js");
6
-
7
- async function main() {
8
- const integrations = root.listIntegrations();
9
- assert.ok(Array.isArray(integrations), "proof integrations list missing");
10
- assert.ok(integrations.length >= 4, "proof integration breadth missing");
11
- assert.ok(integrations.some((integration) => integration.integration_id === "builtin.identity.legacy_material"), "legacy identity integration missing");
12
- assert.ok(integrations.some((integration) => integration.integration_id === "builtin.verifier.registry_profile"), "registry verifier integration missing");
13
- assert.ok(integrations.some((integration) => integration.integration_id === stagedPartnerVerifierRegistrationRecord.integration_id), "staged proof verifier integration missing");
14
- assert.ok(integrations.some((integration) => integration.certification_state === "certified"), "proof integration certification metadata missing");
15
-
16
- const summary = root.summarizeIntegrations();
17
- assert.strictEqual(summary.ok, true, "proof integration summary ok mismatch");
18
- assert.ok(summary.integration_count >= integrations.length, "proof integration count mismatch");
19
- assert.strictEqual(summary.certified_integration_count >= 5, true, "proof integration certified count mismatch");
20
- assert.strictEqual(summary.production_default_count >= 5, true, "proof integration production-default count mismatch");
21
- assert.strictEqual(summary.staged_registration_count >= 1, true, "proof integration staged registration count mismatch");
22
-
23
- const detail = root.getIntegration("builtin.verifier.economic_profile");
24
- assert.ok(detail, "proof integration detail missing");
25
- assert.strictEqual(detail.integration_class, "verification_helper_adapter", "proof integration class mismatch");
26
- assert.strictEqual(detail.integration_maturity, "production_default", "proof integration maturity mismatch");
27
-
28
- const bundledFiltered = root.listIntegrations({
29
- source: "builtin",
30
- certification_state: "certified",
31
- integration_maturity: "production_default",
32
- bundled: "true"
33
- });
34
- assert.ok(bundledFiltered.length >= 5, "proof builtin integration filtering mismatch");
35
-
36
- const stagedFiltered = root.listIntegrations({
37
- source: "third_party_example",
38
- registration_state: "staging_registered",
39
- proof_scope: "profile_verification",
40
- bundled: "false"
41
- });
42
- assert.strictEqual(stagedFiltered.length, 1, "proof staged integration filtering mismatch");
43
- assert.strictEqual(stagedFiltered[0].registration.requires_explicit_selection, true, "proof staged integration explicit-selection mismatch");
44
-
45
- const validation = root.validateIntegrationRegistration({
46
- integration_id: stagedPartnerVerifierRegistrationRecord.integration_id,
47
- integration_class: stagedPartnerVerifierRegistrationRecord.integration_class,
48
- proof_scope: stagedPartnerVerifierRegistrationRecord.proof_scope
49
- }, stagedPartnerVerifierRegistrationRecord);
50
- assert.strictEqual(validation.ok, true, "proof integration registration validation failed");
51
-
52
- const imported = root.importRegisteredIntegration({
53
- integration_id: "partner.verifier.memory_canary",
54
- integration_class: "verification_helper_adapter",
55
- display_name: "Memory Canary Verifier",
56
- description: "Imported proof-side verifier used to validate normalization.",
57
- proof_scope: "profile_verification",
58
- capabilities: ["memory_canary.verify"],
59
- public_surfaces: ["sdk"],
60
- required_inputs: ["profile"],
61
- emitted_artifacts: [],
62
- verification_targets: ["memory_canary_profile"]
63
- }, {
64
- integration_id: "partner.verifier.memory_canary",
65
- integration_class: "verification_helper_adapter",
66
- proof_scope: "profile_verification",
67
- registration_state: "local_only",
68
- integration_maturity: "reference_example",
69
- certification_state: "reference_example",
70
- bundled: false,
71
- default_selection_enabled: false,
72
- requires_explicit_selection: true,
73
- registered_at: "2026-03-20T00:00:00Z"
74
- }, {
75
- source: "verification_import_test",
76
- certification_scope: ["contract_shape"],
77
- operational_readiness: "reference"
78
- });
79
- assert.strictEqual(imported.integration_id, "partner.verifier.memory_canary", "proof imported integration id mismatch");
80
- assert.strictEqual(imported.registration.registration_state, "local_only", "proof imported integration registration state mismatch");
81
-
82
- const snapshot = root.exportIntegrationRegistrySnapshot({
83
- registration_state: "staging_registered"
84
- });
85
- assert.strictEqual(snapshot.integration_count >= 1, true, "proof integration snapshot count mismatch");
86
- assert.strictEqual(root.validateIntegrationRegistrySnapshot(snapshot).ok, true, "proof integration snapshot validation mismatch");
87
-
88
- const builtinPromotion = root.summarizeIntegrationPromotionReadiness("builtin.verifier.registry_profile");
89
- assert.strictEqual(builtinPromotion.ok, true, "proof builtin promotion readiness mismatch");
90
- assert.strictEqual(builtinPromotion.promotion_readiness.default_eligible, true, "proof builtin default eligibility mismatch");
91
- assert.strictEqual(builtinPromotion.promotion_readiness.production_default_ready, true, "proof builtin production-default readiness mismatch");
92
-
93
- const stagedPromotion = root.summarizeIntegrationPromotionReadiness("partner.verifier.lattice_notary");
94
- assert.strictEqual(stagedPromotion.ok, true, "proof staged promotion readiness mismatch");
95
- assert.strictEqual(stagedPromotion.promotion_readiness.review_ready, true, "proof staged review-ready mismatch");
96
- assert.strictEqual(stagedPromotion.promotion_readiness.default_eligible, false, "proof staged default eligibility mismatch");
97
- assert.strictEqual(stagedPromotion.promotion_readiness.production_default_ready, false, "proof staged production-default readiness mismatch");
98
- assert.ok(stagedPromotion.promotion_readiness.blockers.includes("not_certified"), "proof staged certification blocker missing");
99
-
100
- const builtinPromotionWorkflow = root.summarizeIntegrationPromotionWorkflow("builtin.verifier.registry_profile");
101
- assert.strictEqual(builtinPromotionWorkflow.ok, true, "proof builtin promotion workflow mismatch");
102
- assert.strictEqual(
103
- builtinPromotionWorkflow.next_transition.action,
104
- "maintain_production_default",
105
- "proof builtin promotion workflow next-transition mismatch"
106
- );
107
- assert.strictEqual(
108
- builtinPromotionWorkflow.promotion_recommendation.recommendation,
109
- "eligible_for_production_default",
110
- "proof builtin promotion workflow recommendation mismatch"
111
- );
112
-
113
- const stagedPromotionWorkflow = root.summarizeIntegrationPromotionWorkflow("partner.verifier.lattice_notary");
114
- assert.strictEqual(stagedPromotionWorkflow.ok, true, "proof staged promotion workflow mismatch");
115
- assert.strictEqual(
116
- stagedPromotionWorkflow.next_transition.action,
117
- "complete_certification",
118
- "proof staged promotion workflow next-transition mismatch"
119
- );
120
- assert.strictEqual(
121
- stagedPromotionWorkflow.next_transition.later_actions.includes("promote_maturity"),
122
- true,
123
- "proof staged promotion workflow later-actions mismatch"
124
- );
125
- assert.strictEqual(
126
- stagedPromotionWorkflow.promotion_recommendation.recommendation,
127
- "keep_staged_until_requirements_clear",
128
- "proof staged promotion workflow recommendation mismatch"
129
- );
130
- assert.strictEqual(
131
- stagedPromotionWorkflow.certification_gaps.missing_requirements.includes("certification_state"),
132
- true,
133
- "proof staged promotion workflow certification gap mismatch"
134
- );
135
- assert.strictEqual(
136
- stagedPromotionWorkflow.blocker_categories.some((entry) => entry.category === "certification"),
137
- true,
138
- "proof staged promotion workflow blocker-category mismatch"
139
- );
140
-
141
- const promotionWorkflowList = root.summarizeIntegrationPromotionWorkflowList({
142
- source: "third_party_example",
143
- registration_state: "staging_registered",
144
- bundled: "false"
145
- });
146
- assert.strictEqual(promotionWorkflowList.ok, true, "proof promotion workflow list mismatch");
147
- assert.strictEqual(promotionWorkflowList.integration_count >= 1, true, "proof promotion workflow list breadth mismatch");
148
- assert.strictEqual(
149
- promotionWorkflowList.next_actions.some((entry) => entry.action === "complete_certification"),
150
- true,
151
- "proof promotion workflow list next-action mismatch"
152
- );
153
- assert.strictEqual(
154
- promotionWorkflowList.recommendations.some((entry) => entry.recommendation === "keep_staged_until_requirements_clear"),
155
- true,
156
- "proof promotion workflow list recommendation mismatch"
157
- );
158
- assert.strictEqual(
159
- promotionWorkflowList.blocker_categories.some((entry) => entry.category === "certification"),
160
- true,
161
- "proof promotion workflow list blocker-category mismatch"
162
- );
163
-
164
- console.log("xoonya verify:integrations passed");
165
- }
166
-
167
- main().catch((error) => {
168
- console.error(error);
169
- process.exit(1);
170
- });
1
+ "use strict";
2
+
3
+ const assert = require("assert");
4
+ const stagedPartnerVerifierRegistrationRecord = require("../integrations/examples/example-third-party-verifier-registration.record.json");
5
+ const root = require("../index.js");
6
+
7
+ async function main() {
8
+ const integrations = root.listIntegrations();
9
+ assert.ok(Array.isArray(integrations), "proof integrations list missing");
10
+ assert.ok(integrations.length >= 4, "proof integration breadth missing");
11
+ assert.ok(integrations.some((integration) => integration.integration_id === "builtin.identity.legacy_material"), "legacy identity integration missing");
12
+ assert.ok(integrations.some((integration) => integration.integration_id === "builtin.verifier.registry_profile"), "registry verifier integration missing");
13
+ assert.ok(integrations.some((integration) => integration.integration_id === stagedPartnerVerifierRegistrationRecord.integration_id), "staged proof verifier integration missing");
14
+ assert.ok(integrations.some((integration) => integration.certification_state === "certified"), "proof integration certification metadata missing");
15
+
16
+ const summary = root.summarizeIntegrations();
17
+ assert.strictEqual(summary.ok, true, "proof integration summary ok mismatch");
18
+ assert.ok(summary.integration_count >= integrations.length, "proof integration count mismatch");
19
+ assert.strictEqual(summary.certified_integration_count >= 5, true, "proof integration certified count mismatch");
20
+ assert.strictEqual(summary.production_default_count >= 5, true, "proof integration production-default count mismatch");
21
+ assert.strictEqual(summary.staged_registration_count >= 1, true, "proof integration staged registration count mismatch");
22
+
23
+ const detail = root.getIntegration("builtin.verifier.economic_profile");
24
+ assert.ok(detail, "proof integration detail missing");
25
+ assert.strictEqual(detail.integration_class, "verification_helper_adapter", "proof integration class mismatch");
26
+ assert.strictEqual(detail.integration_maturity, "production_default", "proof integration maturity mismatch");
27
+
28
+ const bundledFiltered = root.listIntegrations({
29
+ source: "builtin",
30
+ certification_state: "certified",
31
+ integration_maturity: "production_default",
32
+ bundled: "true"
33
+ });
34
+ assert.ok(bundledFiltered.length >= 5, "proof builtin integration filtering mismatch");
35
+
36
+ const stagedFiltered = root.listIntegrations({
37
+ source: "third_party_example",
38
+ registration_state: "staging_registered",
39
+ proof_scope: "profile_verification",
40
+ bundled: "false"
41
+ });
42
+ assert.strictEqual(stagedFiltered.length, 1, "proof staged integration filtering mismatch");
43
+ assert.strictEqual(stagedFiltered[0].registration.requires_explicit_selection, true, "proof staged integration explicit-selection mismatch");
44
+
45
+ const validation = root.validateIntegrationRegistration({
46
+ integration_id: stagedPartnerVerifierRegistrationRecord.integration_id,
47
+ integration_class: stagedPartnerVerifierRegistrationRecord.integration_class,
48
+ proof_scope: stagedPartnerVerifierRegistrationRecord.proof_scope
49
+ }, stagedPartnerVerifierRegistrationRecord);
50
+ assert.strictEqual(validation.ok, true, "proof integration registration validation failed");
51
+
52
+ const imported = root.importRegisteredIntegration({
53
+ integration_id: "partner.verifier.memory_canary",
54
+ integration_class: "verification_helper_adapter",
55
+ display_name: "Memory Canary Verifier",
56
+ description: "Imported proof-side verifier used to validate normalization.",
57
+ proof_scope: "profile_verification",
58
+ capabilities: ["memory_canary.verify"],
59
+ public_surfaces: ["sdk"],
60
+ required_inputs: ["profile"],
61
+ emitted_artifacts: [],
62
+ verification_targets: ["memory_canary_profile"]
63
+ }, {
64
+ integration_id: "partner.verifier.memory_canary",
65
+ integration_class: "verification_helper_adapter",
66
+ proof_scope: "profile_verification",
67
+ registration_state: "local_only",
68
+ integration_maturity: "reference_example",
69
+ certification_state: "reference_example",
70
+ bundled: false,
71
+ default_selection_enabled: false,
72
+ requires_explicit_selection: true,
73
+ registered_at: "2026-03-20T00:00:00Z"
74
+ }, {
75
+ source: "verification_import_test",
76
+ certification_scope: ["contract_shape"],
77
+ operational_readiness: "reference"
78
+ });
79
+ assert.strictEqual(imported.integration_id, "partner.verifier.memory_canary", "proof imported integration id mismatch");
80
+ assert.strictEqual(imported.registration.registration_state, "local_only", "proof imported integration registration state mismatch");
81
+
82
+ const snapshot = root.exportIntegrationRegistrySnapshot({
83
+ registration_state: "staging_registered"
84
+ });
85
+ assert.strictEqual(snapshot.integration_count >= 1, true, "proof integration snapshot count mismatch");
86
+ assert.strictEqual(root.validateIntegrationRegistrySnapshot(snapshot).ok, true, "proof integration snapshot validation mismatch");
87
+
88
+ const builtinPromotion = root.summarizeIntegrationPromotionReadiness("builtin.verifier.registry_profile");
89
+ assert.strictEqual(builtinPromotion.ok, true, "proof builtin promotion readiness mismatch");
90
+ assert.strictEqual(builtinPromotion.promotion_readiness.default_eligible, true, "proof builtin default eligibility mismatch");
91
+ assert.strictEqual(builtinPromotion.promotion_readiness.production_default_ready, true, "proof builtin production-default readiness mismatch");
92
+
93
+ const stagedPromotion = root.summarizeIntegrationPromotionReadiness("partner.verifier.lattice_notary");
94
+ assert.strictEqual(stagedPromotion.ok, true, "proof staged promotion readiness mismatch");
95
+ assert.strictEqual(stagedPromotion.promotion_readiness.review_ready, true, "proof staged review-ready mismatch");
96
+ assert.strictEqual(stagedPromotion.promotion_readiness.default_eligible, false, "proof staged default eligibility mismatch");
97
+ assert.strictEqual(stagedPromotion.promotion_readiness.production_default_ready, false, "proof staged production-default readiness mismatch");
98
+ assert.ok(stagedPromotion.promotion_readiness.blockers.includes("not_certified"), "proof staged certification blocker missing");
99
+
100
+ const builtinPromotionWorkflow = root.summarizeIntegrationPromotionWorkflow("builtin.verifier.registry_profile");
101
+ assert.strictEqual(builtinPromotionWorkflow.ok, true, "proof builtin promotion workflow mismatch");
102
+ assert.strictEqual(
103
+ builtinPromotionWorkflow.next_transition.action,
104
+ "maintain_production_default",
105
+ "proof builtin promotion workflow next-transition mismatch"
106
+ );
107
+ assert.strictEqual(
108
+ builtinPromotionWorkflow.promotion_recommendation.recommendation,
109
+ "eligible_for_production_default",
110
+ "proof builtin promotion workflow recommendation mismatch"
111
+ );
112
+
113
+ const stagedPromotionWorkflow = root.summarizeIntegrationPromotionWorkflow("partner.verifier.lattice_notary");
114
+ assert.strictEqual(stagedPromotionWorkflow.ok, true, "proof staged promotion workflow mismatch");
115
+ assert.strictEqual(
116
+ stagedPromotionWorkflow.next_transition.action,
117
+ "complete_certification",
118
+ "proof staged promotion workflow next-transition mismatch"
119
+ );
120
+ assert.strictEqual(
121
+ stagedPromotionWorkflow.next_transition.later_actions.includes("promote_maturity"),
122
+ true,
123
+ "proof staged promotion workflow later-actions mismatch"
124
+ );
125
+ assert.strictEqual(
126
+ stagedPromotionWorkflow.promotion_recommendation.recommendation,
127
+ "keep_staged_until_requirements_clear",
128
+ "proof staged promotion workflow recommendation mismatch"
129
+ );
130
+ assert.strictEqual(
131
+ stagedPromotionWorkflow.certification_gaps.missing_requirements.includes("certification_state"),
132
+ true,
133
+ "proof staged promotion workflow certification gap mismatch"
134
+ );
135
+ assert.strictEqual(
136
+ stagedPromotionWorkflow.blocker_categories.some((entry) => entry.category === "certification"),
137
+ true,
138
+ "proof staged promotion workflow blocker-category mismatch"
139
+ );
140
+
141
+ const promotionWorkflowList = root.summarizeIntegrationPromotionWorkflowList({
142
+ source: "third_party_example",
143
+ registration_state: "staging_registered",
144
+ bundled: "false"
145
+ });
146
+ assert.strictEqual(promotionWorkflowList.ok, true, "proof promotion workflow list mismatch");
147
+ assert.strictEqual(promotionWorkflowList.integration_count >= 1, true, "proof promotion workflow list breadth mismatch");
148
+ assert.strictEqual(
149
+ promotionWorkflowList.next_actions.some((entry) => entry.action === "complete_certification"),
150
+ true,
151
+ "proof promotion workflow list next-action mismatch"
152
+ );
153
+ assert.strictEqual(
154
+ promotionWorkflowList.recommendations.some((entry) => entry.recommendation === "keep_staged_until_requirements_clear"),
155
+ true,
156
+ "proof promotion workflow list recommendation mismatch"
157
+ );
158
+ assert.strictEqual(
159
+ promotionWorkflowList.blocker_categories.some((entry) => entry.category === "certification"),
160
+ true,
161
+ "proof promotion workflow list blocker-category mismatch"
162
+ );
163
+
164
+ console.log("xoonya verify:integrations passed");
165
+ }
166
+
167
+ main().catch((error) => {
168
+ console.error(error);
169
+ process.exit(1);
170
+ });