@veraanchor/verifier 0.0.0-stage → 0.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 (214) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/CONTRIBUTING.md +33 -0
  3. package/LICENSE +21 -0
  4. package/NOTICE +4 -0
  5. package/README.md +263 -2
  6. package/SECURITY.md +21 -0
  7. package/dist/cli/commandV1.d.ts +5 -0
  8. package/dist/cli/commandV1.d.ts.map +1 -0
  9. package/dist/cli/commandV1.js +440 -0
  10. package/dist/cli/commandV1.js.map +1 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +5 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/contracts/verification.d.ts +77 -0
  16. package/dist/contracts/verification.d.ts.map +1 -0
  17. package/dist/contracts/verification.js +6 -0
  18. package/dist/contracts/verification.js.map +1 -0
  19. package/dist/crypto/sha3.d.ts +15 -0
  20. package/dist/crypto/sha3.d.ts.map +1 -0
  21. package/dist/crypto/sha3.js +27 -0
  22. package/dist/crypto/sha3.js.map +1 -0
  23. package/dist/crypto/streamSha3.d.ts +26 -0
  24. package/dist/crypto/streamSha3.d.ts.map +1 -0
  25. package/dist/crypto/streamSha3.js +52 -0
  26. package/dist/crypto/streamSha3.js.map +1 -0
  27. package/dist/hf/hashContractV1.d.ts +48 -0
  28. package/dist/hf/hashContractV1.d.ts.map +1 -0
  29. package/dist/hf/hashContractV1.js +185 -0
  30. package/dist/hf/hashContractV1.js.map +1 -0
  31. package/dist/index.d.ts +80 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +57 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/merkle/membership.d.ts +30 -0
  36. package/dist/merkle/membership.d.ts.map +1 -0
  37. package/dist/merkle/membership.js +105 -0
  38. package/dist/merkle/membership.js.map +1 -0
  39. package/dist/policy/contractV1.d.ts +37 -0
  40. package/dist/policy/contractV1.d.ts.map +1 -0
  41. package/dist/policy/contractV1.js +2 -0
  42. package/dist/policy/contractV1.js.map +1 -0
  43. package/dist/policy/evaluateV1.d.ts +24 -0
  44. package/dist/policy/evaluateV1.d.ts.map +1 -0
  45. package/dist/policy/evaluateV1.js +320 -0
  46. package/dist/policy/evaluateV1.js.map +1 -0
  47. package/dist/profiles/dataset/sourceV1.d.ts +22 -0
  48. package/dist/profiles/dataset/sourceV1.d.ts.map +1 -0
  49. package/dist/profiles/dataset/sourceV1.js +73 -0
  50. package/dist/profiles/dataset/sourceV1.js.map +1 -0
  51. package/dist/profiles/dataset/v1.d.ts +39 -0
  52. package/dist/profiles/dataset/v1.d.ts.map +1 -0
  53. package/dist/profiles/dataset/v1.js +362 -0
  54. package/dist/profiles/dataset/v1.js.map +1 -0
  55. package/dist/profiles/execution/contractV1.d.ts +279 -0
  56. package/dist/profiles/execution/contractV1.d.ts.map +1 -0
  57. package/dist/profiles/execution/contractV1.js +364 -0
  58. package/dist/profiles/execution/contractV1.js.map +1 -0
  59. package/dist/profiles/execution/independentStandardsV1.d.ts +44 -0
  60. package/dist/profiles/execution/independentStandardsV1.d.ts.map +1 -0
  61. package/dist/profiles/execution/independentStandardsV1.js +336 -0
  62. package/dist/profiles/execution/independentStandardsV1.js.map +1 -0
  63. package/dist/profiles/execution/reasonCodesV1.d.ts +30 -0
  64. package/dist/profiles/execution/reasonCodesV1.d.ts.map +1 -0
  65. package/dist/profiles/execution/reasonCodesV1.js +20 -0
  66. package/dist/profiles/execution/reasonCodesV1.js.map +1 -0
  67. package/dist/profiles/execution/recomputationV1.d.ts +11 -0
  68. package/dist/profiles/execution/recomputationV1.d.ts.map +1 -0
  69. package/dist/profiles/execution/recomputationV1.js +144 -0
  70. package/dist/profiles/execution/recomputationV1.js.map +1 -0
  71. package/dist/profiles/execution/rulesV1.d.ts +6 -0
  72. package/dist/profiles/execution/rulesV1.d.ts.map +1 -0
  73. package/dist/profiles/execution/rulesV1.js +855 -0
  74. package/dist/profiles/execution/rulesV1.js.map +1 -0
  75. package/dist/profiles/execution/standardsPlanV1.d.ts +18 -0
  76. package/dist/profiles/execution/standardsPlanV1.d.ts.map +1 -0
  77. package/dist/profiles/execution/standardsPlanV1.js +16 -0
  78. package/dist/profiles/execution/standardsPlanV1.js.map +1 -0
  79. package/dist/profiles/execution/verificationV1.d.ts +28 -0
  80. package/dist/profiles/execution/verificationV1.d.ts.map +1 -0
  81. package/dist/profiles/execution/verificationV1.js +188 -0
  82. package/dist/profiles/execution/verificationV1.js.map +1 -0
  83. package/dist/profiles/ingest/sourceV1.d.ts +36 -0
  84. package/dist/profiles/ingest/sourceV1.d.ts.map +1 -0
  85. package/dist/profiles/ingest/sourceV1.js +99 -0
  86. package/dist/profiles/ingest/sourceV1.js.map +1 -0
  87. package/dist/profiles/ingest/v1.d.ts +65 -0
  88. package/dist/profiles/ingest/v1.d.ts.map +1 -0
  89. package/dist/profiles/ingest/v1.js +477 -0
  90. package/dist/profiles/ingest/v1.js.map +1 -0
  91. package/dist/profiles/sourceV1Helpers.d.ts +48 -0
  92. package/dist/profiles/sourceV1Helpers.d.ts.map +1 -0
  93. package/dist/profiles/sourceV1Helpers.js +141 -0
  94. package/dist/profiles/sourceV1Helpers.js.map +1 -0
  95. package/dist/reports/coreV1.d.ts +7 -0
  96. package/dist/reports/coreV1.d.ts.map +1 -0
  97. package/dist/reports/coreV1.js +195 -0
  98. package/dist/reports/coreV1.js.map +1 -0
  99. package/dist/reports/portableV1.d.ts +48 -0
  100. package/dist/reports/portableV1.d.ts.map +1 -0
  101. package/dist/reports/portableV1.js +279 -0
  102. package/dist/reports/portableV1.js.map +1 -0
  103. package/dist/reports/validationV1.d.ts +19 -0
  104. package/dist/reports/validationV1.d.ts.map +1 -0
  105. package/dist/reports/validationV1.js +441 -0
  106. package/dist/reports/validationV1.js.map +1 -0
  107. package/dist/resolvers/executionMirrorV1.d.ts +15 -0
  108. package/dist/resolvers/executionMirrorV1.d.ts.map +1 -0
  109. package/dist/resolvers/executionMirrorV1.js +206 -0
  110. package/dist/resolvers/executionMirrorV1.js.map +1 -0
  111. package/dist/resolvers/explorerExecutionV1.d.ts +17 -0
  112. package/dist/resolvers/explorerExecutionV1.d.ts.map +1 -0
  113. package/dist/resolvers/explorerExecutionV1.js +61 -0
  114. package/dist/resolvers/explorerExecutionV1.js.map +1 -0
  115. package/dist/resolvers/explorerPublicV1.d.ts +37 -0
  116. package/dist/resolvers/explorerPublicV1.d.ts.map +1 -0
  117. package/dist/resolvers/explorerPublicV1.js +210 -0
  118. package/dist/resolvers/explorerPublicV1.js.map +1 -0
  119. package/dist/resolvers/explorerPublicationV1.d.ts +20 -0
  120. package/dist/resolvers/explorerPublicationV1.d.ts.map +1 -0
  121. package/dist/resolvers/explorerPublicationV1.js +195 -0
  122. package/dist/resolvers/explorerPublicationV1.js.map +1 -0
  123. package/dist/resolvers/explorerTransportV1.d.ts +17 -0
  124. package/dist/resolvers/explorerTransportV1.d.ts.map +1 -0
  125. package/dist/resolvers/explorerTransportV1.js +112 -0
  126. package/dist/resolvers/explorerTransportV1.js.map +1 -0
  127. package/dist/resolvers/hcs11MirrorV1.d.ts +49 -0
  128. package/dist/resolvers/hcs11MirrorV1.d.ts.map +1 -0
  129. package/dist/resolvers/hcs11MirrorV1.js +293 -0
  130. package/dist/resolvers/hcs11MirrorV1.js.map +1 -0
  131. package/dist/resolvers/hcs13MirrorV1.d.ts +35 -0
  132. package/dist/resolvers/hcs13MirrorV1.d.ts.map +1 -0
  133. package/dist/resolvers/hcs13MirrorV1.js +72 -0
  134. package/dist/resolvers/hcs13MirrorV1.js.map +1 -0
  135. package/dist/resolvers/hcs1MirrorV1.d.ts +28 -0
  136. package/dist/resolvers/hcs1MirrorV1.d.ts.map +1 -0
  137. package/dist/resolvers/hcs1MirrorV1.js +220 -0
  138. package/dist/resolvers/hcs1MirrorV1.js.map +1 -0
  139. package/dist/resolvers/hcs26MirrorV1.d.ts +67 -0
  140. package/dist/resolvers/hcs26MirrorV1.d.ts.map +1 -0
  141. package/dist/resolvers/hcs26MirrorV1.js +218 -0
  142. package/dist/resolvers/hcs26MirrorV1.js.map +1 -0
  143. package/dist/resolvers/hcs26RegistryMirrorV1.d.ts +26 -0
  144. package/dist/resolvers/hcs26RegistryMirrorV1.d.ts.map +1 -0
  145. package/dist/resolvers/hcs26RegistryMirrorV1.js +200 -0
  146. package/dist/resolvers/hcs26RegistryMirrorV1.js.map +1 -0
  147. package/dist/resolvers/hcs2MirrorV1.d.ts +26 -0
  148. package/dist/resolvers/hcs2MirrorV1.d.ts.map +1 -0
  149. package/dist/resolvers/hcs2MirrorV1.js +196 -0
  150. package/dist/resolvers/hcs2MirrorV1.js.map +1 -0
  151. package/dist/resolvers/hederaMirrorV1.d.ts +22 -0
  152. package/dist/resolvers/hederaMirrorV1.d.ts.map +1 -0
  153. package/dist/resolvers/hederaMirrorV1.js +338 -0
  154. package/dist/resolvers/hederaMirrorV1.js.map +1 -0
  155. package/dist/standards/hcs/hcs11V1.d.ts +51 -0
  156. package/dist/standards/hcs/hcs11V1.d.ts.map +1 -0
  157. package/dist/standards/hcs/hcs11V1.js +289 -0
  158. package/dist/standards/hcs/hcs11V1.js.map +1 -0
  159. package/dist/standards/hcs/hcs13V1.d.ts +39 -0
  160. package/dist/standards/hcs/hcs13V1.d.ts.map +1 -0
  161. package/dist/standards/hcs/hcs13V1.js +114 -0
  162. package/dist/standards/hcs/hcs13V1.js.map +1 -0
  163. package/dist/standards/hcs/hcs14V1.d.ts +35 -0
  164. package/dist/standards/hcs/hcs14V1.d.ts.map +1 -0
  165. package/dist/standards/hcs/hcs14V1.js +168 -0
  166. package/dist/standards/hcs/hcs14V1.js.map +1 -0
  167. package/dist/standards/hcs/hcs1V1.d.ts +30 -0
  168. package/dist/standards/hcs/hcs1V1.d.ts.map +1 -0
  169. package/dist/standards/hcs/hcs1V1.js +140 -0
  170. package/dist/standards/hcs/hcs1V1.js.map +1 -0
  171. package/dist/standards/hcs/hcs26V1.d.ts +58 -0
  172. package/dist/standards/hcs/hcs26V1.d.ts.map +1 -0
  173. package/dist/standards/hcs/hcs26V1.js +339 -0
  174. package/dist/standards/hcs/hcs26V1.js.map +1 -0
  175. package/dist/standards/hcs/hcs2V1.d.ts +36 -0
  176. package/dist/standards/hcs/hcs2V1.d.ts.map +1 -0
  177. package/dist/standards/hcs/hcs2V1.js +181 -0
  178. package/dist/standards/hcs/hcs2V1.js.map +1 -0
  179. package/dist/standards/hcs/jsonCanonicalV1.d.ts +15 -0
  180. package/dist/standards/hcs/jsonCanonicalV1.d.ts.map +1 -0
  181. package/dist/standards/hcs/jsonCanonicalV1.js +160 -0
  182. package/dist/standards/hcs/jsonCanonicalV1.js.map +1 -0
  183. package/dist/triangulation/compareV1.d.ts +50 -0
  184. package/dist/triangulation/compareV1.d.ts.map +1 -0
  185. package/dist/triangulation/compareV1.js +236 -0
  186. package/dist/triangulation/compareV1.js.map +1 -0
  187. package/dist/triangulation/executionPlanV1.d.ts +39 -0
  188. package/dist/triangulation/executionPlanV1.d.ts.map +1 -0
  189. package/dist/triangulation/executionPlanV1.js +208 -0
  190. package/dist/triangulation/executionPlanV1.js.map +1 -0
  191. package/dist/triangulation/executionPublicV1.d.ts +22 -0
  192. package/dist/triangulation/executionPublicV1.d.ts.map +1 -0
  193. package/dist/triangulation/executionPublicV1.js +39 -0
  194. package/dist/triangulation/executionPublicV1.js.map +1 -0
  195. package/dist/triangulation/messageObservationV1.d.ts +26 -0
  196. package/dist/triangulation/messageObservationV1.d.ts.map +1 -0
  197. package/dist/triangulation/messageObservationV1.js +69 -0
  198. package/dist/triangulation/messageObservationV1.js.map +1 -0
  199. package/dist/triangulation/publicV1.d.ts +29 -0
  200. package/dist/triangulation/publicV1.d.ts.map +1 -0
  201. package/dist/triangulation/publicV1.js +170 -0
  202. package/dist/triangulation/publicV1.js.map +1 -0
  203. package/dist/verification/sourceIntentV1.d.ts +15 -0
  204. package/dist/verification/sourceIntentV1.d.ts.map +1 -0
  205. package/dist/verification/sourceIntentV1.js +206 -0
  206. package/dist/verification/sourceIntentV1.js.map +1 -0
  207. package/docs/cli-v0.1.md +237 -0
  208. package/docs/conformance.md +38 -0
  209. package/docs/threat-model.md +37 -0
  210. package/docs/verification-semantics.md +65 -0
  211. package/examples/README.md +35 -0
  212. package/examples/dataset-offline.mjs +58 -0
  213. package/examples/dataset-policy.mjs +59 -0
  214. package/package.json +65 -4
@@ -0,0 +1,208 @@
1
+ import { verifyExecutionV1WithIntent } from "../profiles/execution/verificationV1.js";
2
+ const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
3
+ const HASH = /^[0-9a-f]{128}$/i;
4
+ const TOPIC = /^0\.0\.[0-9]+$/;
5
+ const TX = /^(0\.0\.[0-9]+)[@-]([0-9]{1,12})[.-]([0-9]{1,9})$/;
6
+ const MESSAGE = /^(?:([1-9][0-9]*)@(0\.0\.[0-9]+)|(0\.0\.[0-9]+)@([1-9][0-9]*))$/;
7
+ const PROVIDED_ID = "execution.provided.claims";
8
+ const PUBLIC_ID = "execution.public";
9
+ export const EXECUTION_HEDERA_OBSERVATION_V1_ID = "execution.hedera";
10
+ function record(value, field) {
11
+ if (!value || typeof value !== "object" || Array.isArray(value))
12
+ throw new TypeError(`${field} must be an object`);
13
+ return value;
14
+ }
15
+ function optional(value, field, limit = 256) {
16
+ if (value == null || value === "")
17
+ return null;
18
+ if (typeof value !== "string" || value.length > limit || value !== value.trim()) {
19
+ throw new TypeError(`${field} must be a bounded canonical string`);
20
+ }
21
+ return value || null;
22
+ }
23
+ function scopedUuid(value, field, required = false) {
24
+ const str = optional(value, field, 64)?.toLowerCase() ?? null;
25
+ if ((required && !str) || (str && !UUID.test(str)))
26
+ throw new TypeError(`${field} must be a UUID`);
27
+ return str;
28
+ }
29
+ function digest(value, field) {
30
+ const str = optional(value, field, 128)?.toLowerCase() ?? null;
31
+ if (str && !HASH.test(str))
32
+ throw new TypeError(`${field} must be SHA3-512 hex`);
33
+ return str;
34
+ }
35
+ function transaction(value, field) {
36
+ const str = optional(value, field, 128);
37
+ if (!str)
38
+ return null;
39
+ const match = TX.exec(str);
40
+ if (!match)
41
+ throw new TypeError(`${field} must be a Hedera transaction identifier`);
42
+ return `${match[1]}@${match[2]}.${match[3].padStart(9, "0")}`;
43
+ }
44
+ function messageScope(value) {
45
+ const str = optional(value, "acceptance.hcs.message_id", 128);
46
+ if (!str)
47
+ return null;
48
+ const match = MESSAGE.exec(str);
49
+ if (!match)
50
+ throw new TypeError("Invalid acceptance HCS message identifier");
51
+ const number = Number(match[1] ?? match[4]);
52
+ if (!Number.isSafeInteger(number) || number < 1)
53
+ throw new TypeError("Invalid HCS message sequence");
54
+ return { topic_id: (match[2] ?? match[3]), sequence_number: number };
55
+ }
56
+ function ledgerClaim(value, source, role, network) {
57
+ if (value == null)
58
+ return null;
59
+ const hcs = record(value, `${role}.hcs`);
60
+ const tx = transaction(hcs.transaction_id, `${role}.hcs.transaction_id`);
61
+ const msg = role === "acceptance_anchor" ? messageScope(hcs.message_id) : null;
62
+ const rawTopic = optional(hcs.topic_id, `${role}.hcs.topic_id`, 64);
63
+ if (rawTopic && !TOPIC.test(rawTopic))
64
+ throw new TypeError("Invalid HCS topic identifier");
65
+ const rawSequence = hcs.sequence_number;
66
+ const seq = rawSequence == null ? null : rawSequence;
67
+ if (seq != null && (typeof seq !== "number" || !Number.isSafeInteger(seq) || seq < 1)) {
68
+ throw new TypeError("Invalid HCS sequence number");
69
+ }
70
+ if (msg && ((rawTopic && rawTopic !== msg.topic_id) || (seq && seq !== msg.sequence_number))) {
71
+ throw new TypeError("HCS message locator conflict");
72
+ }
73
+ let topic_id = rawTopic ?? msg?.topic_id ?? null;
74
+ let sequence_number = seq ?? msg?.sequence_number ?? null;
75
+ if ((topic_id === null) !== (sequence_number === null)) {
76
+ // Topic without exact message sequence is not independently resolvable.
77
+ // A separate transaction can still be observed, but never infer its sequence.
78
+ if (!tx)
79
+ throw new TypeError("Incomplete HCS message locator");
80
+ topic_id = null;
81
+ sequence_number = null;
82
+ }
83
+ if (!tx && !topic_id)
84
+ return null;
85
+ return Object.freeze({ source, role, network, transaction_id: tx, topic_id, sequence_number,
86
+ observation_fact_prefix: `ledger.${source}.${role}` });
87
+ }
88
+ function fact(key, value) {
89
+ return value === null ? Object.freeze({ key, state: "unavailable", reason_code: "EXECUTION_COMMITMENT_UNAVAILABLE" }) :
90
+ Object.freeze({ key, state: "available", value });
91
+ }
92
+ function addFact(facts, key, value) {
93
+ facts.push(fact(key, value));
94
+ }
95
+ function scopeFacts(evidence, resultId) {
96
+ const exe = evidence.execution;
97
+ const facts = [];
98
+ addFact(facts, "execution.job_id", scopedUuid(exe?.job_id, "execution.job_id"));
99
+ addFact(facts, "execution.hedera_network", optional(exe?.hedera_network, "execution.hedera_network", 16));
100
+ addFact(facts, "execution.program", optional(exe?.program, "execution.program", 128)?.toLowerCase() ?? null);
101
+ addFact(facts, "execution.pipeline_hash", digest(exe?.pipeline_hash, "execution.pipeline_hash"));
102
+ addFact(facts, "dataset.fingerprint_sha3_512", digest(exe?.dataset?.dataset_fingerprint_sha3_512, "dataset.fingerprint"));
103
+ addFact(facts, "dataset.manifest_sha3_512", digest(exe?.dataset?.dataset_manifest_sha3_512, "dataset.manifest"));
104
+ addFact(facts, "binding.digest", digest(evidence.binding?.digest, "binding.digest"));
105
+ addFact(facts, "acceptance.digest", digest(evidence.acceptance?.digest, "acceptance.digest"));
106
+ if (resultId) {
107
+ addFact(facts, "execution.result_id", scopedUuid(evidence.result_evidence?.result_id ?? exe?.result_id, "result_id"));
108
+ addFact(facts, "result_evidence.digest", digest(evidence.result_evidence?.digest, "result_evidence.digest"));
109
+ addFact(facts, "result_evidence.result_hash", digest(evidence.result_evidence?.result_hash, "result_hash"));
110
+ addFact(facts, "result_evidence.service_hash", digest(evidence.result_evidence?.service_hash, "service_hash"));
111
+ addFact(facts, "result_evidence.global_hash", digest(evidence.result_evidence?.global_hash, "global_hash"));
112
+ }
113
+ return facts;
114
+ }
115
+ function claimFacts(facts, claims, resultId) {
116
+ for (const role of ["acceptance_anchor", ...(resultId ? ["result_evidence_anchor"] : [])]) {
117
+ const claim = claims.find((candidate) => candidate.role === role);
118
+ addFact(facts, `${role}.transaction_id`, claim?.transaction_id ?? null);
119
+ addFact(facts, `${role}.topic_id`, claim?.topic_id ?? null);
120
+ addFact(facts, `${role}.sequence_number`, claim?.sequence_number?.toString() ?? null);
121
+ }
122
+ }
123
+ function observations(evidence, side, subject, resultId, targets) {
124
+ const facts = scopeFacts(evidence, resultId);
125
+ claimFacts(facts, targets, resultId);
126
+ return Object.freeze({ id: side === "public_record" ? PUBLIC_ID : PROVIDED_ID, subject,
127
+ source: side, facts: Object.freeze(facts) });
128
+ }
129
+ function targetsOf(evidence, side, network, resultId) {
130
+ const acceptance = ledgerClaim(evidence.acceptance?.hcs, side, "acceptance_anchor", network);
131
+ const result = resultId ? ledgerClaim(evidence.result_evidence?.hcs, side, "result_evidence_anchor", network) : null;
132
+ return [acceptance, result].filter((v) => v !== null);
133
+ }
134
+ function pairs(left, right) {
135
+ const rightKeys = new Set(right.facts.map((f) => f.key));
136
+ return left.facts.filter((f) => f.state === "available" && rightKeys.has(f.key))
137
+ .map((f) => Object.freeze({ key: f.key, left_key: f.key, right_key: f.key }));
138
+ }
139
+ function hederaComparisons(targets) {
140
+ return targets.flatMap((target) => {
141
+ const comparison = [];
142
+ const base = target.observation_fact_prefix;
143
+ if (target.transaction_id)
144
+ comparison.push(Object.freeze({ key: `${target.role}.transaction_id`,
145
+ left_key: `${target.role}.transaction_id`, right_key: `${base}.transaction_id` }));
146
+ if (target.topic_id && target.sequence_number) {
147
+ comparison.push(Object.freeze({ key: `${target.role}.topic_id`, left_key: `${target.role}.topic_id`, right_key: `${base}.topic_id` }));
148
+ comparison.push(Object.freeze({ key: `${target.role}.sequence_number`, left_key: `${target.role}.sequence_number`, right_key: `${base}.sequence_number` }));
149
+ }
150
+ return comparison;
151
+ });
152
+ }
153
+ /** Prepare a plan. The returned Mirror observation id is RESERVED, not populated. */
154
+ export function prepareExecutionTriangulationV1(input) {
155
+ const source = verifyExecutionV1WithIntent(input.execution);
156
+ if (source.findings.find((f) => f.check_id === "input.bounds")?.outcome !== "pass") {
157
+ throw new TypeError("Provided execution evidence failed structural bounds");
158
+ }
159
+ const subject = source.intent.subject;
160
+ const network = subject.hedera_network;
161
+ if (network !== "testnet" && network !== "mainnet")
162
+ throw new TypeError("Execution network is required");
163
+ const requestedResult = source.verification_scope.requested_result_id;
164
+ const pub = input.public_evidence;
165
+ if (!pub || pub.available !== true)
166
+ throw new TypeError("Public execution evidence is unavailable");
167
+ if (scopedUuid(pub.execution?.job_id, "public.execution.job_id", true) !== subject.id ||
168
+ pub.execution?.hedera_network !== network)
169
+ throw new TypeError("Public execution scope mismatch");
170
+ if (requestedResult) {
171
+ const actual = scopedUuid(pub.result_evidence?.result_id ?? pub.execution?.result_id, "public.result_id", true);
172
+ if (actual !== requestedResult)
173
+ throw new TypeError("Public execution result scope mismatch");
174
+ }
175
+ const provided = record(input.execution.evidence, "provided execution evidence");
176
+ const providedResult = requestedResult ? scopedUuid(provided.result_evidence?.result_id ?? provided.execution?.result_id, "provided.result_id") : null;
177
+ if (providedResult && providedResult !== requestedResult)
178
+ throw new TypeError("Provided result scope mismatch");
179
+ if (provided.execution?.job_id && scopedUuid(provided.execution.job_id, "provided.job_id") !== subject.id) {
180
+ throw new TypeError("Provided execution job scope mismatch");
181
+ }
182
+ if (provided.execution?.hedera_network && provided.execution.hedera_network !== network) {
183
+ throw new TypeError("Provided execution network scope mismatch");
184
+ }
185
+ const publicTargets = targetsOf(pub, "public_record", network, requestedResult);
186
+ const providedTargets = targetsOf(provided, "provided_evidence", network, requestedResult);
187
+ const publicObservation = observations(pub, "public_record", subject, requestedResult, publicTargets);
188
+ const providedObservation = observations(provided, "provided_evidence", subject, requestedResult, providedTargets);
189
+ const pp = pairs(providedObservation, publicObservation);
190
+ const relationships = [
191
+ Object.freeze({ id: "provided_public_record", left_observation_id: PROVIDED_ID,
192
+ right_observation_id: PUBLIC_ID, comparisons: Object.freeze(pp) }),
193
+ Object.freeze({ id: "public_record_hedera", left_observation_id: PUBLIC_ID,
194
+ right_observation_id: EXECUTION_HEDERA_OBSERVATION_V1_ID,
195
+ comparisons: Object.freeze(hederaComparisons(publicTargets)) }),
196
+ Object.freeze({ id: "provided_hedera", left_observation_id: PROVIDED_ID,
197
+ right_observation_id: EXECUTION_HEDERA_OBSERVATION_V1_ID,
198
+ comparisons: Object.freeze(hederaComparisons(providedTargets)) }),
199
+ ];
200
+ return Object.freeze({ stage: "unresolved_authority_plan",
201
+ public_record_acquisition: "not_checked", hedera_resolution: "not_checked",
202
+ source_report: source,
203
+ triangulation: Object.freeze({ source_report: source,
204
+ observations: Object.freeze([providedObservation, publicObservation]),
205
+ relationships: Object.freeze(relationships) }),
206
+ hedera_targets: Object.freeze([...publicTargets, ...providedTargets]), });
207
+ }
208
+ //# sourceMappingURL=executionPlanV1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executionPlanV1.js","sourceRoot":"","sources":["../../src/triangulation/executionPlanV1.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,2BAA2B,EAAiD,MAAM,yCAAyC,CAAC;AAGrI,MAAM,IAAI,GAAG,4EAA4E,CAAC;AAC1F,MAAM,IAAI,GAAG,kBAAkB,CAAC;AAChC,MAAM,KAAK,GAAG,gBAAgB,CAAC;AAC/B,MAAM,EAAE,GAAG,mDAAmD,CAAC;AAC/D,MAAM,OAAO,GAAG,iEAAiE,CAAC;AAClF,MAAM,WAAW,GAAG,2BAA2B,CAAC;AAChD,MAAM,SAAS,GAAG,kBAAkB,CAAC;AACrC,MAAM,CAAC,MAAM,kCAAkC,GAAG,kBAAkB,CAAC;AAwBrE,SAAS,MAAM,CAAC,KAAc,EAAE,KAAa;IAC3C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,oBAAoB,CAAC,CAAC;IACnH,OAAO,KAAgC,CAAC;AAC1C,CAAC;AACD,SAAS,QAAQ,CAAC,KAAc,EAAE,KAAa,EAAE,KAAK,GAAG,GAAG;IAC1D,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK,IAAI,KAAK,KAAK,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAChF,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,qCAAqC,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,KAAK,IAAI,IAAI,CAAC;AACvB,CAAC;AACD,SAAS,UAAU,CAAC,KAAc,EAAE,KAAa,EAAE,QAAQ,GAAG,KAAK;IACjE,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,IAAI,CAAC;IAC9D,IAAI,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,iBAAiB,CAAC,CAAC;IACnG,OAAO,GAAG,CAAC;AACb,CAAC;AACD,SAAS,MAAM,CAAC,KAAc,EAAE,KAAa;IAC3C,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,WAAW,EAAE,IAAI,IAAI,CAAC;IAC/D,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,uBAAuB,CAAC,CAAC;IACjF,OAAO,GAAG,CAAC;AACb,CAAC;AACD,SAAS,WAAW,CAAC,KAAc,EAAE,KAAa;IAChD,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IACxC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,0CAA0C,CAAC,CAAC;IACpF,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AACjE,CAAC;AACD,SAAS,YAAY,CAAC,KAAc;IAClC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAE,2BAA2B,EAAE,GAAG,CAAC,CAAC;IAC9D,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,SAAS,CAAC,2CAA2C,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,8BAA8B,CAAC,CAAC;IACrG,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAE,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC;AACxE,CAAC;AACD,SAAS,WAAW,CAClB,KAAc,EAAE,MAAY,EAAE,IAAU,EAAE,OAAsB;IAEhE,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC;IACzC,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,IAAI,qBAAqB,CAAC,CAAC;IACzE,MAAM,GAAG,GAAG,IAAI,KAAK,mBAAmB,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/E,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,IAAI,eAAe,EAAE,EAAE,CAAC,CAAC;IACpE,IAAI,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,8BAA8B,CAAC,CAAC;IAC3F,MAAM,WAAW,GAAG,GAAG,CAAC,eAAe,CAAC;IACxC,MAAM,GAAG,GAAG,WAAW,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC;IACrD,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC;QACtF,MAAM,IAAI,SAAS,CAAC,6BAA6B,CAAC,CAAC;IACrD,CAAC;IACD,IAAI,GAAG,IAAI,CAAC,CAAC,QAAQ,IAAI,QAAQ,KAAK,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,GAAG,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;QAC7F,MAAM,IAAI,SAAS,CAAC,8BAA8B,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,QAAQ,GAAG,QAAQ,IAAI,GAAG,EAAE,QAAQ,IAAI,IAAI,CAAC;IACjD,IAAI,eAAe,GAAI,GAAqB,IAAI,GAAG,EAAE,eAAe,IAAI,IAAI,CAAC;IAC7E,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,KAAK,CAAC,eAAe,KAAK,IAAI,CAAC,EAAE,CAAC;QACvD,wEAAwE;QACxE,8EAA8E;QAC9E,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,SAAS,CAAC,gCAAgC,CAAC,CAAC;QAC/D,QAAQ,GAAG,IAAI,CAAC;QAChB,eAAe,GAAG,IAAI,CAAC;IACzB,CAAC;IACD,IAAI,CAAC,EAAE,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAClC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,QAAQ,EAAE,eAAe;QACzF,uBAAuB,EAAE,UAAU,MAAM,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;AAC3D,CAAC;AACD,SAAS,IAAI,CAAC,GAAW,EAAE,KAAoB;IAC7C,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,aAAsB,EAAE,WAAW,EAAE,kCAAkC,EAAE,CAAC,CAAC,CAAC;QAC9H,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,WAAoB,EAAE,KAAK,EAAE,CAAC,CAAC;AAC/D,CAAC;AACD,SAAS,OAAO,CAAC,KAAyB,EAAE,GAAW,EAAE,KAAoB;IAC3E,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAC/B,CAAC;AACD,SAAS,UAAU,CAAC,QAA0C,EAAE,QAAuB;IACrF,MAAM,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC;IAC/B,MAAM,KAAK,GAAuB,EAAE,CAAC;IACrC,OAAO,CAAC,KAAK,EAAE,kBAAkB,EAAE,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAChF,OAAO,CAAC,KAAK,EAAE,0BAA0B,EAAE,QAAQ,CAAC,GAAG,EAAE,cAAc,EAAE,0BAA0B,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1G,OAAO,CAAC,KAAK,EAAE,mBAAmB,EAAE,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,mBAAmB,EAAE,GAAG,CAAC,EAAE,WAAW,EAAE,IAAI,IAAI,CAAC,CAAC;IAC7G,OAAO,CAAC,KAAK,EAAE,yBAAyB,EAAE,MAAM,CAAC,GAAG,EAAE,aAAa,EAAE,yBAAyB,CAAC,CAAC,CAAC;IACjG,OAAO,CAAC,KAAK,EAAE,8BAA8B,EAAE,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,4BAA4B,EAAE,qBAAqB,CAAC,CAAC,CAAC;IAC1H,OAAO,CAAC,KAAK,EAAE,2BAA2B,EAAE,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,CAAC,CAAC,CAAC;IACjH,OAAO,CAAC,KAAK,EAAE,gBAAgB,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;IACrF,OAAO,CAAC,KAAK,EAAE,mBAAmB,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAC9F,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,EAAE,qBAAqB,EAAE,UAAU,CAAC,QAAQ,CAAC,eAAe,EAAE,SAAS,IAAI,GAAG,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;QACtH,OAAO,CAAC,KAAK,EAAE,wBAAwB,EAAE,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,EAAE,wBAAwB,CAAC,CAAC,CAAC;QAC7G,OAAO,CAAC,KAAK,EAAE,6BAA6B,EAAE,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC;QAC5G,OAAO,CAAC,KAAK,EAAE,8BAA8B,EAAE,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC,CAAC;QAC/G,OAAO,CAAC,KAAK,EAAE,6BAA6B,EAAE,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC,CAAC;IAC9G,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AACD,SAAS,UAAU,CAAC,KAAyB,EAAE,MAA0C,EAAE,QAAuB;IAChH,KAAK,MAAM,IAAI,IAAK,CAAC,mBAAmB,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAY,EAAE,CAAC;QACtG,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAClE,OAAO,CAAC,KAAK,EAAE,GAAG,IAAI,iBAAiB,EAAE,KAAK,EAAE,cAAc,IAAI,IAAI,CAAC,CAAC;QACxE,OAAO,CAAC,KAAK,EAAE,GAAG,IAAI,WAAW,EAAE,KAAK,EAAE,QAAQ,IAAI,IAAI,CAAC,CAAC;QAC5D,OAAO,CAAC,KAAK,EAAE,GAAG,IAAI,kBAAkB,EAAE,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,CAAC;IACxF,CAAC;AACH,CAAC;AACD,SAAS,YAAY,CACnB,QAA0C,EAAE,IAAU,EAAE,OAA+C,EACvG,QAAuB,EAAE,OAA2C;IAEpE,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC7C,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACrC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,KAAK,eAAe,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,OAAO;QACpF,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACjD,CAAC;AACD,SAAS,SAAS,CAAC,QAA0C,EAAE,IAAU,EACvE,OAAsB,EAAE,QAAuB;IAC/C,MAAM,UAAU,GAAG,WAAW,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC;IAC7F,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACrH,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAgC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AACtF,CAAC;AACD,SAAS,KAAK,CAAC,IAA6B,EAAE,KAA8B;IAC1E,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACzD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,WAAW,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;SAC7E,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;AAClF,CAAC;AACD,SAAS,iBAAiB,CAAC,OAA2C;IACpE,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QAChC,MAAM,UAAU,GAA8B,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,MAAM,CAAC,uBAAuB,CAAC;QAC5C,IAAI,MAAM,CAAC,cAAc;YAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,IAAI,iBAAiB;gBAC7F,QAAQ,EAAE,GAAG,MAAM,CAAC,IAAI,iBAAiB,EAAE,SAAS,EAAE,GAAG,IAAI,iBAAiB,EAAE,CAAC,CAAC,CAAC;QACrF,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YAC9C,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,IAAI,WAAW,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,IAAI,WAAW,EAAE,SAAS,EAAE,GAAG,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC;YACvI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,IAAI,kBAAkB,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,IAAI,kBAAkB,EAAE,SAAS,EAAE,GAAG,IAAI,kBAAkB,EAAE,CAAC,CAAC,CAAC;QAC9J,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,+BAA+B,CAAC,KAG9C;IACA,MAAM,MAAM,GAAG,2BAA2B,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAC5D,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,cAAc,CAAC,EAAE,OAAO,KAAK,MAAM,EAAE,CAAC;QACnF,MAAM,IAAI,SAAS,CAAC,sDAAsD,CAAC,CAAC;IAC9E,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;IACtC,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC;IACvC,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS;QAAE,MAAM,IAAI,SAAS,CAAC,+BAA+B,CAAC,CAAC;IACzG,MAAM,eAAe,GAAG,MAAM,CAAC,kBAAkB,CAAC,mBAAmB,CAAC;IACtE,MAAM,GAAG,GAAG,KAAK,CAAC,eAAe,CAAC;IAClC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,KAAK,IAAI;QAAE,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;IACpG,IAAI,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,yBAAyB,EAAE,IAAI,CAAC,KAAK,OAAO,CAAC,EAAE;QACjF,GAAG,CAAC,SAAS,EAAE,cAAc,KAAK,OAAO;QAAE,MAAM,IAAI,SAAS,CAAC,iCAAiC,CAAC,CAAC;IACtG,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,eAAe,EAAE,SAAS,IAAI,GAAG,CAAC,SAAS,EAAE,SAAS,EAClF,kBAAkB,EAAE,IAAI,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,eAAe;YAAE,MAAM,IAAI,SAAS,CAAC,wCAAwC,CAAC,CAAC;IAChG,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,6BAA6B,CAAqC,CAAC;IACrH,MAAM,cAAc,GAAG,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,eAAe,EAAE,SAAS,IAAI,QAAQ,CAAC,SAAS,EAAE,SAAS,EACtH,oBAAoB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/B,IAAI,cAAc,IAAI,cAAc,KAAK,eAAe;QAAE,MAAM,IAAI,SAAS,CAAC,gCAAgC,CAAC,CAAC;IAChH,IAAI,QAAQ,CAAC,SAAS,EAAE,MAAM,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,iBAAiB,CAAC,KAAK,OAAO,CAAC,EAAE,EAAE,CAAC;QAC1G,MAAM,IAAI,SAAS,CAAC,uCAAuC,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,QAAQ,CAAC,SAAS,EAAE,cAAc,IAAI,QAAQ,CAAC,SAAS,CAAC,cAAc,KAAK,OAAO,EAAE,CAAC;QACxF,MAAM,IAAI,SAAS,CAAC,2CAA2C,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,aAAa,GAAG,SAAS,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;IAChF,MAAM,eAAe,GAAG,SAAS,CAAC,QAAQ,EAAE,mBAAmB,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;IAC3F,MAAM,iBAAiB,GAAG,YAAY,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC;IACtG,MAAM,mBAAmB,GAAG,YAAY,CAAC,QAAQ,EAAE,mBAAmB,EAAE,OAAO,EAAE,eAAe,EAAE,eAAe,CAAC,CAAC;IACnH,MAAM,EAAE,GAAG,KAAK,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAC;IACzD,MAAM,aAAa,GAAsC;QACvD,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,WAAW;YAC5E,oBAAoB,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QACpE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,SAAS;YACxE,oBAAoB,EAAE,kCAAkC;YACxD,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;QACjE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,WAAW;YACrE,oBAAoB,EAAE,kCAAkC;YACxD,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;KACpE,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,2BAAoC;QAChE,yBAAyB,EAAE,aAAsB,EAAE,iBAAiB,EAAE,aAAsB;QAC5F,aAAa,EAAE,MAAM;QACrB,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,MAAM;YAClD,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAC;YACrE,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;QAChD,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,aAAa,EAAE,GAAG,eAAe,CAAC,CAAC,GACtE,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { ExecutionV1Input } from "../profiles/execution/verificationV1.js";
2
+ import { type ExplorerExecutionV1Result } from "../resolvers/explorerExecutionV1.js";
3
+ import { type ExecutionMirrorV1Result } from "../resolvers/executionMirrorV1.js";
4
+ import type { ExplorerPublicTransportV1 } from "../resolvers/explorerTransportV1.js";
5
+ import type { HederaMirrorV1Config } from "../resolvers/hederaMirrorV1.js";
6
+ import { type TriangulationV1Result } from "./compareV1.js";
7
+ import { type ExecutionTriangulationPlanV1 } from "./executionPlanV1.js";
8
+ export type PublicExecutionTriangulationV1Config = Readonly<{
9
+ explorer: ExplorerPublicTransportV1;
10
+ mirror?: HederaMirrorV1Config;
11
+ }>;
12
+ export type PublicExecutionTriangulationV1Result = Readonly<{
13
+ status: "resolved" | "not_found" | "unavailable" | "invalid" | "conflict" | "verification_material_unavailable";
14
+ reason_code: string | null;
15
+ public_record_acquisition: ExplorerExecutionV1Result["status"];
16
+ hedera_resolution: ExecutionMirrorV1Result["status"] | "not_checked";
17
+ plan: ExecutionTriangulationPlanV1 | null;
18
+ mirror: ExecutionMirrorV1Result | null;
19
+ comparison: TriangulationV1Result | null;
20
+ }>;
21
+ export declare function triangulatePublicExecutionV1(config: PublicExecutionTriangulationV1Config, execution: ExecutionV1Input): Promise<PublicExecutionTriangulationV1Result>;
22
+ //# sourceMappingURL=executionPublicV1.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executionPublicV1.d.ts","sourceRoot":"","sources":["../../src/triangulation/executionPublicV1.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAEhF,OAAO,EAA8B,KAAK,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AACjH,OAAO,EAA4B,KAAK,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAC3G,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AACrF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAkC,KAAK,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC5F,OAAO,EAAmC,KAAK,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AAE1G,MAAM,MAAM,oCAAoC,GAAG,QAAQ,CAAC;IAC1D,QAAQ,EAAE,yBAAyB,CAAC;IACpC,MAAM,CAAC,EAAE,oBAAoB,CAAC;CAC/B,CAAC,CAAC;AACH,MAAM,MAAM,oCAAoC,GAAG,QAAQ,CAAC;IAC1D,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,aAAa,GAAG,SAAS,GAAG,UAAU,GAAG,mCAAmC,CAAC;IAChH,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,yBAAyB,EAAE,yBAAyB,CAAC,QAAQ,CAAC,CAAC;IAC/D,iBAAiB,EAAE,uBAAuB,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC;IACrE,IAAI,EAAE,4BAA4B,GAAG,IAAI,CAAC;IAC1C,MAAM,EAAE,uBAAuB,GAAG,IAAI,CAAC;IACvC,UAAU,EAAE,qBAAqB,GAAG,IAAI,CAAC;CAC1C,CAAC,CAAC;AAEH,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,oCAAoC,EAC5C,SAAS,EAAE,gBAAgB,GAC1B,OAAO,CAAC,oCAAoC,CAAC,CA+B/C"}
@@ -0,0 +1,39 @@
1
+ import { verifyExecutionV1WithIntent } from "../profiles/execution/verificationV1.js";
2
+ import { resolveExplorerExecutionV1 } from "../resolvers/explorerExecutionV1.js";
3
+ import { resolveExecutionHederaV1 } from "../resolvers/executionMirrorV1.js";
4
+ import { compareEvidenceTriangulationV1 } from "./compareV1.js";
5
+ import { prepareExecutionTriangulationV1 } from "./executionPlanV1.js";
6
+ export async function triangulatePublicExecutionV1(config, execution) {
7
+ const initial = verifyExecutionV1WithIntent(execution);
8
+ if (initial.findings.find((item) => item.check_id === "input.bounds")?.outcome !== "pass") {
9
+ throw new TypeError("Invalid execution verification input");
10
+ }
11
+ const subject = initial.intent.subject;
12
+ if (subject.kind !== "execution" || !subject.hedera_network)
13
+ throw new TypeError("Execution verification subject is required");
14
+ const publicRecord = await resolveExplorerExecutionV1(config.explorer, {
15
+ job_id: subject.id, network: subject.hedera_network,
16
+ result_id: initial.verification_scope.requested_result_id,
17
+ });
18
+ if (publicRecord.status !== "resolved" || !publicRecord.evidence) {
19
+ return Object.freeze({ status: publicRecord.status, reason_code: publicRecord.reason_code,
20
+ public_record_acquisition: publicRecord.status, hedera_resolution: "not_checked",
21
+ plan: null, mirror: null, comparison: null });
22
+ }
23
+ const plan = prepareExecutionTriangulationV1({ execution, public_evidence: publicRecord.evidence });
24
+ const mirror = await resolveExecutionHederaV1(config.mirror ?? {}, {
25
+ subject: plan.source_report.intent.subject, targets: plan.hedera_targets,
26
+ });
27
+ const comparison = compareEvidenceTriangulationV1({
28
+ ...plan.triangulation,
29
+ observations: Object.freeze([...plan.triangulation.observations, mirror.observation]),
30
+ });
31
+ const status = mirror.status === "conflict" || comparison.consistency === "conflict"
32
+ ? "conflict" : mirror.status;
33
+ const reason_code = comparison.consistency === "conflict" && mirror.status !== "conflict"
34
+ ? "EXECUTION_SOURCE_OR_COMPARISON_CONFLICT" : mirror.reason_code;
35
+ return Object.freeze({ status, reason_code,
36
+ public_record_acquisition: "resolved", hedera_resolution: mirror.status,
37
+ plan, mirror, comparison });
38
+ }
39
+ //# sourceMappingURL=executionPublicV1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executionPublicV1.js","sourceRoot":"","sources":["../../src/triangulation/executionPublicV1.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,yCAAyC,CAAC;AACtF,OAAO,EAAE,0BAA0B,EAAkC,MAAM,qCAAqC,CAAC;AACjH,OAAO,EAAE,wBAAwB,EAAgC,MAAM,mCAAmC,CAAC;AAG3G,OAAO,EAAE,8BAA8B,EAA8B,MAAM,gBAAgB,CAAC;AAC5F,OAAO,EAAE,+BAA+B,EAAqC,MAAM,sBAAsB,CAAC;AAgB1G,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,MAA4C,EAC5C,SAA2B;IAE3B,MAAM,OAAO,GAAG,2BAA2B,CAAC,SAAS,CAAC,CAAC;IACvD,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,cAAc,CAAC,EAAE,OAAO,KAAK,MAAM,EAAE,CAAC;QAC1F,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;IACvC,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,OAAO,CAAC,cAAc;QAAE,MAAM,IAAI,SAAS,CAAC,4CAA4C,CAAC,CAAC;IAC/H,MAAM,YAAY,GAAG,MAAM,0BAA0B,CAAC,MAAM,CAAC,QAAQ,EAAE;QACrE,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,cAAc;QACnD,SAAS,EAAE,OAAO,CAAC,kBAAkB,CAAC,mBAAmB;KAC1D,CAAC,CAAC;IACH,IAAI,YAAY,CAAC,MAAM,KAAK,UAAU,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;QACjE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,MAAM,EAAE,WAAW,EAAE,YAAY,CAAC,WAAW;YACvF,yBAAyB,EAAE,YAAY,CAAC,MAAM,EAAE,iBAAiB,EAAE,aAAsB;YACzF,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,MAAM,IAAI,GAAG,+BAA+B,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpG,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE;QACjE,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,cAAc;KACzE,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,8BAA8B,CAAC;QAChD,GAAG,IAAI,CAAC,aAAa;QACrB,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;KACtF,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,KAAK,UAAU,IAAI,UAAU,CAAC,WAAW,KAAK,UAAU;QAClF,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;IAC/B,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,KAAK,UAAU,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU;QACvF,CAAC,CAAC,yCAAyC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC;IACnE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW;QACxC,yBAAyB,EAAE,UAAmB,EAAE,iBAAiB,EAAE,MAAM,CAAC,MAAM;QAChF,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { VerificationObservation, VerificationSubject } from "../contracts/verification.js";
2
+ export type MirrorMessageV1Input = Readonly<{
3
+ id: string;
4
+ subject: VerificationSubject;
5
+ topic_id: string;
6
+ sequence_number: number;
7
+ message_bytes: Uint8Array;
8
+ }>;
9
+ /**
10
+ * Recompute SHA3-512 over exact supplied HCS ciphertext/message bytes.
11
+ * This is a local byte check, not proof the bytes came from Hedera; a Mirror
12
+ * resolver must separately establish and attribute the network observation.
13
+ */
14
+ export declare function observeMirrorMessageV1(input: MirrorMessageV1Input): VerificationObservation;
15
+ export type CoreMessageBindingV1Input = Readonly<{
16
+ id: string;
17
+ subject: VerificationSubject;
18
+ /** The scoped public Core decrypt service's claimed exact-message binding. */
19
+ binding: unknown;
20
+ }>;
21
+ /**
22
+ * Normalize Core's claimed ciphertext binding, not its decrypted plaintext.
23
+ * Only comparison with separately recomputed Mirror bytes can corroborate it.
24
+ */
25
+ export declare function observeCoreMessageBindingV1(input: CoreMessageBindingV1Input): VerificationObservation;
26
+ //# sourceMappingURL=messageObservationV1.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messageObservationV1.d.ts","sourceRoot":"","sources":["../../src/triangulation/messageObservationV1.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAOjG,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,mBAAmB,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,UAAU,CAAC;CAC3B,CAAC,CAAC;AAEH;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,oBAAoB,GAAG,uBAAuB,CAsB3F;AAKD,MAAM,MAAM,yBAAyB,GAAG,QAAQ,CAAC;IAC/C,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,mBAAmB,CAAC;IAC7B,8EAA8E;IAC9E,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC,CAAC;AAEH;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,yBAAyB,GAAG,uBAAuB,CA6BrG"}
@@ -0,0 +1,69 @@
1
+ import { sha3_512Hex } from "../crypto/sha3.js";
2
+ const TOPIC_ID_RE = /^0\.0\.[1-9][0-9]*$/;
3
+ const OBSERVATION_ID_RE = /^[a-z][a-z0-9._:-]{0,127}$/;
4
+ const MAX_MESSAGE_BYTES = 1024 * 1024;
5
+ /**
6
+ * Recompute SHA3-512 over exact supplied HCS ciphertext/message bytes.
7
+ * This is a local byte check, not proof the bytes came from Hedera; a Mirror
8
+ * resolver must separately establish and attribute the network observation.
9
+ */
10
+ export function observeMirrorMessageV1(input) {
11
+ if (!OBSERVATION_ID_RE.test(input.id) ||
12
+ !input.subject ||
13
+ (input.subject.hedera_network !== "mainnet" && input.subject.hedera_network !== "testnet") ||
14
+ typeof input.subject.id !== "string" || !input.subject.id ||
15
+ !TOPIC_ID_RE.test(input.topic_id) ||
16
+ !Number.isSafeInteger(input.sequence_number) || input.sequence_number < 1 ||
17
+ !(input.message_bytes instanceof Uint8Array) ||
18
+ input.message_bytes.byteLength > MAX_MESSAGE_BYTES) {
19
+ throw new TypeError("Invalid or oversized Mirror message observation");
20
+ }
21
+ return Object.freeze({
22
+ id: input.id,
23
+ source: "hedera_mirror",
24
+ subject: Object.freeze({ ...input.subject }),
25
+ facts: Object.freeze([
26
+ Object.freeze({ key: "hedera.topic_id", state: "available", value: input.topic_id }),
27
+ Object.freeze({ key: "hedera.sequence_number", state: "available", value: input.sequence_number }),
28
+ Object.freeze({ key: "publication.message_sha3_512", state: "available", value: sha3_512Hex(input.message_bytes) }),
29
+ Object.freeze({ key: "publication.message_bytes", state: "available", value: input.message_bytes.byteLength }),
30
+ ]),
31
+ });
32
+ }
33
+ const DIGEST_RE = /^[0-9a-f]{128}$/i;
34
+ const CORE_BINDING_SCHEMA = "vera.hcs-message-binding.v1";
35
+ /**
36
+ * Normalize Core's claimed ciphertext binding, not its decrypted plaintext.
37
+ * Only comparison with separately recomputed Mirror bytes can corroborate it.
38
+ */
39
+ export function observeCoreMessageBindingV1(input) {
40
+ if (!OBSERVATION_ID_RE.test(input.id) || !input.subject ||
41
+ typeof input.subject.id !== "string" || !input.subject.id) {
42
+ throw new TypeError("Invalid Core message-binding observation");
43
+ }
44
+ const raw = input.binding;
45
+ const binding = raw && typeof raw === "object" && !Array.isArray(raw)
46
+ ? raw : null;
47
+ const missing = !binding;
48
+ const schema = binding?.schema_version;
49
+ const algorithm = binding?.algorithm;
50
+ const digest = binding?.message_sha3_512;
51
+ const length = binding?.message_bytes;
52
+ const valid = schema === CORE_BINDING_SCHEMA && algorithm === "sha3-512" &&
53
+ typeof digest === "string" && DIGEST_RE.test(digest) &&
54
+ typeof length === "number" && Number.isSafeInteger(length) && length >= 0;
55
+ const reason = missing ? "CORE_MESSAGE_BINDING_UNAVAILABLE" : "CORE_MESSAGE_BINDING_INVALID";
56
+ return Object.freeze({
57
+ id: input.id,
58
+ source: "public_record",
59
+ subject: Object.freeze({ ...input.subject }),
60
+ facts: Object.freeze(valid ? [
61
+ Object.freeze({ key: "publication.message_sha3_512", state: "available", value: digest.toLowerCase() }),
62
+ Object.freeze({ key: "publication.message_bytes", state: "available", value: length }),
63
+ ] : [
64
+ Object.freeze({ key: "publication.message_sha3_512", state: "unavailable", reason_code: reason }),
65
+ Object.freeze({ key: "publication.message_bytes", state: "unavailable", reason_code: reason }),
66
+ ]),
67
+ });
68
+ }
69
+ //# sourceMappingURL=messageObservationV1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messageObservationV1.js","sourceRoot":"","sources":["../../src/triangulation/messageObservationV1.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import type { VerificationReport } from "../contracts/verification.js";
2
+ import { type ExplorerPublishedEvidenceV1 } from "../resolvers/explorerPublicationV1.js";
3
+ import type { ExplorerPublicTransportV1 } from "../resolvers/explorerTransportV1.js";
4
+ import { type HederaMirrorV1Config, type HederaPublicationObservationV1 } from "../resolvers/hederaMirrorV1.js";
5
+ import { type TriangulationV1Result } from "./compareV1.js";
6
+ import { type DatasetV1IntentInput, type IngestV1IntentInput } from "../verification/sourceIntentV1.js";
7
+ export type PublicTriangulationV1Config = Readonly<{
8
+ explorer: ExplorerPublicTransportV1;
9
+ mirror?: HederaMirrorV1Config;
10
+ }>;
11
+ export type PublicIngestTriangulationV1Input = IngestV1IntentInput & Readonly<{
12
+ /** Source identity and Core Merkle anchor identity are distinct. */
13
+ anchor_request_id: string;
14
+ }>;
15
+ export type PublicTriangulationV1Result = Readonly<{
16
+ consistency: TriangulationV1Result["consistency"];
17
+ relationships: TriangulationV1Result["relationships"];
18
+ report: VerificationReport;
19
+ resolution: Readonly<{
20
+ public_record: ExplorerPublishedEvidenceV1["public_record"]["status"];
21
+ publication_disclosure: ExplorerPublishedEvidenceV1["disclosure"]["status"];
22
+ hedera_mirror: HederaPublicationObservationV1["status"] | "not_requested";
23
+ }>;
24
+ }>;
25
+ /** Full Dataset source recomputation -> public record -> Explorer disclosure -> direct Mirror observation. */
26
+ export declare function triangulateDatasetV1(config: PublicTriangulationV1Config, input: DatasetV1IntentInput): Promise<PublicTriangulationV1Result>;
27
+ /** Full Ingest source recomputation; public anchor identity must be provided independently by caller. */
28
+ export declare function triangulateIngestV1(config: PublicTriangulationV1Config, input: PublicIngestTriangulationV1Input): Promise<PublicTriangulationV1Result>;
29
+ //# sourceMappingURL=publicV1.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publicV1.d.ts","sourceRoot":"","sources":["../../src/triangulation/publicV1.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkE,kBAAkB,EAAuB,MAAM,8BAA8B,CAAC;AAC5J,OAAO,EACL,KAAK,2BAA2B,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAErF,OAAO,EAA8B,KAAK,oBAAoB,EAC5D,KAAK,8BAA8B,EAAE,MAAM,gCAAgC,CAAC;AAC9E,OAAO,EAAkC,KAAK,qBAAqB,EAC3B,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EACL,KAAK,oBAAoB,EAAE,KAAK,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAEjG,MAAM,MAAM,2BAA2B,GAAG,QAAQ,CAAC;IACjD,QAAQ,EAAE,yBAAyB,CAAC;IACpC,MAAM,CAAC,EAAE,oBAAoB,CAAC;CAC/B,CAAC,CAAC;AACH,MAAM,MAAM,gCAAgC,GAAG,mBAAmB,GAAG,QAAQ,CAAC;IAC5E,oEAAoE;IACpE,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC,CAAC;AACH,MAAM,MAAM,2BAA2B,GAAG,QAAQ,CAAC;IACjD,WAAW,EAAE,qBAAqB,CAAC,aAAa,CAAC,CAAC;IAClD,aAAa,EAAE,qBAAqB,CAAC,eAAe,CAAC,CAAC;IACtD,MAAM,EAAE,kBAAkB,CAAC;IAC3B,UAAU,EAAE,QAAQ,CAAC;QACnB,aAAa,EAAE,2BAA2B,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,CAAC;QACtE,sBAAsB,EAAE,2BAA2B,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC5E,aAAa,EAAE,8BAA8B,CAAC,QAAQ,CAAC,GAAG,eAAe,CAAC;KAC3E,CAAC,CAAC;CACJ,CAAC,CAAC;AAsJH,8GAA8G;AAC9G,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,2BAA2B,EACnC,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,2BAA2B,CAAC,CAQtC;AAED,yGAAyG;AACzG,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,2BAA2B,EACnC,KAAK,EAAE,gCAAgC,GACtC,OAAO,CAAC,2BAA2B,CAAC,CAUtC"}
@@ -0,0 +1,170 @@
1
+ import { resolveExplorerDatasetPublicationV1, resolveExplorerIngestPublicationV1 } from "../resolvers/explorerPublicationV1.js";
2
+ import { resolveHederaPublicationV1 } from "../resolvers/hederaMirrorV1.js";
3
+ import { compareEvidenceTriangulationV1 } from "./compareV1.js";
4
+ import { verifyDatasetV1WithIntent, verifyIngestV1WithIntent } from "../verification/sourceIntentV1.js";
5
+ const PROOF_DATASET = "publication.proof.fingerprint";
6
+ const PROOF_INGEST_FINGERPRINT = "publication.proof.ingest_fingerprint";
7
+ const PROOF_INGEST_BUNDLE = "publication.proof.ingest_bundle_digest";
8
+ function requiredNetwork(subject) {
9
+ if (subject.hedera_network !== "testnet" && subject.hedera_network !== "mainnet") {
10
+ throw new TypeError("Public triangulation requires an explicit Hedera network in verification intent");
11
+ }
12
+ return subject.hedera_network;
13
+ }
14
+ function notAvailable(key, reason) {
15
+ return Object.freeze({ key, state: "unavailable", reason_code: reason });
16
+ }
17
+ function available(key, value) {
18
+ return Object.freeze({ key, state: "available", value });
19
+ }
20
+ function mergePublicFacts(profile, disclosure) {
21
+ const publicObs = disclosure.public_record.observation;
22
+ if (!publicObs)
23
+ return null;
24
+ const claims = disclosure.disclosure.receipt_observation;
25
+ const keys = profile === "dataset"
26
+ ? ["publication.proof.dataset_key", PROOF_DATASET]
27
+ : ["publication.proof.ingest_object_key", PROOF_INGEST_FINGERPRINT, PROOF_INGEST_BUNDLE];
28
+ const extra = claims?.facts ?? keys.map((key) => notAvailable(key, disclosure.disclosure.reason_code ?? "PUBLICATION_DISCLOSURE_UNAVAILABLE"));
29
+ return Object.freeze({ ...publicObs,
30
+ // Both original and disclosed receipt are Explorer-sourced; never count as two independent authorities.
31
+ facts: Object.freeze([...publicObs.facts, ...extra]),
32
+ });
33
+ }
34
+ function mergeBindingFacts(subject, pub, disclosure) {
35
+ const claim = disclosure.disclosure.message_binding_observation;
36
+ const reason = disclosure.disclosure.reason_code ?? "PUBLICATION_MESSAGE_BINDING_UNAVAILABLE";
37
+ const binding = claim?.facts ?? [
38
+ notAvailable("publication.message_sha3_512", reason),
39
+ notAvailable("publication.message_bytes", reason),
40
+ ];
41
+ return Object.freeze({
42
+ id: `${subject.kind}.core_binding`,
43
+ subject: Object.freeze({ ...subject }),
44
+ source: "public_record",
45
+ resolver_id: "explorer.publication-claims.v1",
46
+ facts: Object.freeze([
47
+ ...binding,
48
+ pub?.topic_id ? available("publication.topic_id", pub.topic_id) : notAvailable("publication.topic_id", "PUBLICATION_LOCATOR_UNAVAILABLE"),
49
+ pub?.sequence_number != null ? available("publication.sequence_number", pub.sequence_number) :
50
+ notAvailable("publication.sequence_number", "PUBLICATION_LOCATOR_UNAVAILABLE"),
51
+ ]),
52
+ });
53
+ }
54
+ function plans(profile) {
55
+ const publicComparisons = profile === "dataset"
56
+ ? [
57
+ { key: "dataset_fingerprint", left_key: "dataset_fingerprint", right_key: "dataset_fingerprint" },
58
+ { key: "publication_subject", left_key: "source_subject_id", right_key: "publication.proof.dataset_key" },
59
+ { key: "publication_fingerprint", left_key: "dataset_fingerprint", right_key: PROOF_DATASET },
60
+ ]
61
+ : [
62
+ { key: "ingest_fingerprint", left_key: "fingerprint", right_key: "fingerprint" },
63
+ { key: "ingest_bundle_digest", left_key: "bundle_digest", right_key: "bundle_digest" },
64
+ { key: "publication_subject", left_key: "source_subject_id", right_key: "publication.proof.ingest_object_key" },
65
+ { key: "publication_fingerprint", left_key: "fingerprint", right_key: PROOF_INGEST_FINGERPRINT },
66
+ { key: "publication_bundle_digest", left_key: "bundle_digest", right_key: PROOF_INGEST_BUNDLE },
67
+ ];
68
+ return Object.freeze([
69
+ Object.freeze({
70
+ id: "provided_public_record",
71
+ left_observation_id: `${profile}.bundle`,
72
+ right_observation_id: `${profile}.public_record`,
73
+ comparisons: Object.freeze(publicComparisons),
74
+ }),
75
+ Object.freeze({
76
+ id: "public_record_hedera",
77
+ left_observation_id: `${profile}.core_binding`,
78
+ right_observation_id: `${profile}.hedera_mirror`,
79
+ comparisons: Object.freeze([
80
+ { key: "publication_topic", left_key: "publication.topic_id", right_key: "hedera.topic_id" },
81
+ { key: "publication_sequence", left_key: "publication.sequence_number", right_key: "hedera.sequence_number" },
82
+ { key: "message_sha3_512", left_key: "publication.message_sha3_512", right_key: "publication.message_sha3_512" },
83
+ { key: "message_bytes", left_key: "publication.message_bytes", right_key: "publication.message_bytes" },
84
+ ]),
85
+ }),
86
+ ]);
87
+ }
88
+ async function execute(config, profile, sourceReport, publicEvidence) {
89
+ const subject = sourceReport.intent.subject;
90
+ const publicRecord = mergePublicFacts(profile, publicEvidence);
91
+ const pub = publicEvidence.public_record.publication;
92
+ const mirror = pub ? await resolveHederaPublicationV1(config.mirror ?? {}, pub, subject) : null;
93
+ const binding = mergeBindingFacts(subject, pub, publicEvidence);
94
+ const disclosureReceipt = publicEvidence.disclosure.receipt_observation;
95
+ const observations = [
96
+ ...(publicRecord ? [publicRecord] : []),
97
+ binding,
98
+ ...(disclosureReceipt ? [disclosureReceipt] : []),
99
+ ...(mirror?.observation ? [mirror.observation] : []),
100
+ ];
101
+ // Actual offline hash verification was invoked above; no caller-supplied report is accepted.
102
+ const scopedReport = Object.freeze({ ...sourceReport,
103
+ observations: Object.freeze(sourceReport.observations.map((entry) => entry.id !== `${profile}.bundle`
104
+ ? entry : Object.freeze({ ...entry, facts: Object.freeze([...entry.facts,
105
+ available("source_subject_id", subject.id),
106
+ ]) }))),
107
+ });
108
+ const compared = compareEvidenceTriangulationV1({
109
+ source_report: scopedReport,
110
+ observations,
111
+ relationships: plans(profile),
112
+ });
113
+ const check = Object.freeze({
114
+ check_id: "triangulation.plaintext_ciphertext_binding",
115
+ outcome: "indeterminate",
116
+ reason_code: disclosureReceipt ? "EXPLORER_ASSISTED_DECRYPTION" : "PUBLICATION_DISCLOSURE_UNAVAILABLE",
117
+ observation_ids: Object.freeze(disclosureReceipt ? [disclosureReceipt.id] : []),
118
+ });
119
+ const conflicts = [];
120
+ if (publicEvidence.public_record.status === "conflict")
121
+ conflicts.push(Object.freeze({
122
+ check_id: "triangulation.public_record_scope", outcome: "fail",
123
+ reason_code: publicEvidence.public_record.reason_code, observation_ids: Object.freeze([]),
124
+ }));
125
+ if (publicEvidence.disclosure.status === "conflict")
126
+ conflicts.push(Object.freeze({
127
+ check_id: "triangulation.publication_disclosure", outcome: "fail",
128
+ reason_code: publicEvidence.disclosure.reason_code, observation_ids: Object.freeze([]),
129
+ }));
130
+ if (mirror?.status === "conflict")
131
+ conflicts.push(Object.freeze({
132
+ check_id: "triangulation.mirror_transaction", outcome: "fail",
133
+ reason_code: mirror.reason_code, observation_ids: Object.freeze([]),
134
+ }));
135
+ return Object.freeze({
136
+ consistency: conflicts.length ? "conflict" : compared.consistency,
137
+ relationships: compared.relationships,
138
+ report: Object.freeze({ ...compared.report, findings: Object.freeze([...compared.report.findings, check, ...conflicts]) }),
139
+ resolution: Object.freeze({
140
+ public_record: publicEvidence.public_record.status,
141
+ publication_disclosure: publicEvidence.disclosure.status,
142
+ hedera_mirror: mirror?.status ?? "not_requested",
143
+ }),
144
+ });
145
+ }
146
+ /** Full Dataset source recomputation -> public record -> Explorer disclosure -> direct Mirror observation. */
147
+ export async function triangulateDatasetV1(config, input) {
148
+ const network = requiredNetwork(input.intent.subject);
149
+ if (input.intent.subject.kind !== "dataset")
150
+ throw new TypeError("Dataset triangulation requires dataset intent");
151
+ const source = await verifyDatasetV1WithIntent(input);
152
+ const published = await resolveExplorerDatasetPublicationV1(config.explorer, {
153
+ dataset_key: input.intent.subject.id, network,
154
+ });
155
+ return execute(config, "dataset", source, published);
156
+ }
157
+ /** Full Ingest source recomputation; public anchor identity must be provided independently by caller. */
158
+ export async function triangulateIngestV1(config, input) {
159
+ const network = requiredNetwork(input.intent.subject);
160
+ if (input.intent.subject.kind !== "ingest")
161
+ throw new TypeError("Ingest triangulation requires ingest intent");
162
+ const source = await verifyIngestV1WithIntent(input);
163
+ const published = await resolveExplorerIngestPublicationV1(config.explorer, {
164
+ ingest_object_key: input.intent.subject.id,
165
+ anchor_request_id: input.anchor_request_id,
166
+ network,
167
+ });
168
+ return execute(config, "ingest", source, published);
169
+ }
170
+ //# sourceMappingURL=publicV1.js.map