@mikeargento/bitgraph-audit 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 (108) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +11 -0
  3. package/dist/anchors.d.ts +31 -0
  4. package/dist/anchors.d.ts.map +1 -0
  5. package/dist/anchors.js +116 -0
  6. package/dist/anchors.js.map +1 -0
  7. package/dist/anomalies.d.ts +42 -0
  8. package/dist/anomalies.d.ts.map +1 -0
  9. package/dist/anomalies.js +642 -0
  10. package/dist/anomalies.js.map +1 -0
  11. package/dist/attestation.d.ts +20 -0
  12. package/dist/attestation.d.ts.map +1 -0
  13. package/dist/attestation.js +795 -0
  14. package/dist/attestation.js.map +1 -0
  15. package/dist/audit.d.ts +19 -0
  16. package/dist/audit.d.ts.map +1 -0
  17. package/dist/audit.js +116 -0
  18. package/dist/audit.js.map +1 -0
  19. package/dist/authority.d.ts +37 -0
  20. package/dist/authority.d.ts.map +1 -0
  21. package/dist/authority.js +126 -0
  22. package/dist/authority.js.map +1 -0
  23. package/dist/aws-nitro-root-ca.d.ts +24 -0
  24. package/dist/aws-nitro-root-ca.d.ts.map +1 -0
  25. package/dist/aws-nitro-root-ca.js +44 -0
  26. package/dist/aws-nitro-root-ca.js.map +1 -0
  27. package/dist/cli.d.ts +3 -0
  28. package/dist/cli.d.ts.map +1 -0
  29. package/dist/cli.js +257 -0
  30. package/dist/cli.js.map +1 -0
  31. package/dist/contents-hash.d.ts +30 -0
  32. package/dist/contents-hash.d.ts.map +1 -0
  33. package/dist/contents-hash.js +73 -0
  34. package/dist/contents-hash.js.map +1 -0
  35. package/dist/export.d.ts +64 -0
  36. package/dist/export.d.ts.map +1 -0
  37. package/dist/export.js +192 -0
  38. package/dist/export.js.map +1 -0
  39. package/dist/index.d.ts +31 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +17 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/ingest.d.ts +36 -0
  44. package/dist/ingest.d.ts.map +1 -0
  45. package/dist/ingest.js +828 -0
  46. package/dist/ingest.js.map +1 -0
  47. package/dist/reconstruct.d.ts +40 -0
  48. package/dist/reconstruct.d.ts.map +1 -0
  49. package/dist/reconstruct.js +400 -0
  50. package/dist/reconstruct.js.map +1 -0
  51. package/dist/report-json.d.ts +3 -0
  52. package/dist/report-json.d.ts.map +1 -0
  53. package/dist/report-json.js +290 -0
  54. package/dist/report-json.js.map +1 -0
  55. package/dist/report-md.d.ts +3 -0
  56. package/dist/report-md.d.ts.map +1 -0
  57. package/dist/report-md.js +853 -0
  58. package/dist/report-md.js.map +1 -0
  59. package/dist/rlp.d.ts +37 -0
  60. package/dist/rlp.d.ts.map +1 -0
  61. package/dist/rlp.js +120 -0
  62. package/dist/rlp.js.map +1 -0
  63. package/dist/tar.d.ts +47 -0
  64. package/dist/tar.d.ts.map +1 -0
  65. package/dist/tar.js +483 -0
  66. package/dist/tar.js.map +1 -0
  67. package/dist/temporal.d.ts +55 -0
  68. package/dist/temporal.d.ts.map +1 -0
  69. package/dist/temporal.js +461 -0
  70. package/dist/temporal.js.map +1 -0
  71. package/dist/types.d.ts +1389 -0
  72. package/dist/types.d.ts.map +1 -0
  73. package/dist/types.js +3 -0
  74. package/dist/types.js.map +1 -0
  75. package/dist/validity.d.ts +21 -0
  76. package/dist/validity.d.ts.map +1 -0
  77. package/dist/validity.js +86 -0
  78. package/dist/validity.js.map +1 -0
  79. package/dist/verify-tiers.d.ts +11 -0
  80. package/dist/verify-tiers.d.ts.map +1 -0
  81. package/dist/verify-tiers.js +120 -0
  82. package/dist/verify-tiers.js.map +1 -0
  83. package/dist/witness.d.ts +25 -0
  84. package/dist/witness.d.ts.map +1 -0
  85. package/dist/witness.js +308 -0
  86. package/dist/witness.js.map +1 -0
  87. package/package.json +42 -0
  88. package/src/anchors.ts +168 -0
  89. package/src/anomalies.ts +773 -0
  90. package/src/attestation.ts +878 -0
  91. package/src/audit.ts +136 -0
  92. package/src/authority.ts +165 -0
  93. package/src/aws-nitro-root-ca.ts +47 -0
  94. package/src/cli.ts +284 -0
  95. package/src/contents-hash.ts +95 -0
  96. package/src/export.ts +278 -0
  97. package/src/index.ts +122 -0
  98. package/src/ingest.ts +967 -0
  99. package/src/reconstruct.ts +491 -0
  100. package/src/report-json.ts +331 -0
  101. package/src/report-md.ts +1067 -0
  102. package/src/rlp.ts +142 -0
  103. package/src/tar.ts +587 -0
  104. package/src/temporal.ts +629 -0
  105. package/src/types.ts +1528 -0
  106. package/src/validity.ts +90 -0
  107. package/src/verify-tiers.ts +137 -0
  108. package/src/witness.ts +407 -0
@@ -0,0 +1,461 @@
1
+ // Copyright (c) 2024-2026 Mike Argento. Licensed under the MIT License. See LICENSE.
2
+ import { byCounterThenHash, parseCounter, pushMap } from "./validity.js";
3
+ // ---------------------------------------------------------------------------
4
+ // Public API
5
+ // ---------------------------------------------------------------------------
6
+ export function deriveTemporalBounds(ingest, reconstruction, identification, witnessAnalysis) {
7
+ const byHash = new Map(ingest.proofs.map((p) => [p.proofHash, p]));
8
+ // Verified wall-clock evidence per anchor. Multiple verified witnesses
9
+ // for one anchor are necessarily identical (the hash comparison pins
10
+ // the exact header bytes); the first is kept.
11
+ const evidence = new Map();
12
+ for (const outcome of witnessAnalysis.outcomes) {
13
+ if (!outcome.verified || outcome.anchorProofHash === undefined)
14
+ continue;
15
+ if (evidence.has(outcome.anchorProofHash))
16
+ continue;
17
+ evidence.set(outcome.anchorProofHash, {
18
+ anchorProofHash: outcome.anchorProofHash,
19
+ timestamp: outcome.timestamp,
20
+ blockHash: outcome.computedBlockHash,
21
+ ...(outcome.blockNumber !== undefined ? { blockNumber: outcome.blockNumber } : {}),
22
+ });
23
+ }
24
+ const verifiedAnchorProofHashes = [...evidence.keys()].sort();
25
+ const unverifiedAnchorProofHashes = identification.anchors
26
+ .map((a) => a.proofHash)
27
+ .filter((h) => !evidence.has(h))
28
+ .sort();
29
+ // Per-partition segments.
30
+ const segments = [];
31
+ for (const partition of reconstruction.partitions) {
32
+ segments.push(...buildPartitionSegments(partition, byHash, evidence));
33
+ }
34
+ // Epoch-level aggregation and cross-epoch ordering.
35
+ const anchorOrderedPairs = aggregateEpochs(reconstruction, segments);
36
+ return {
37
+ segments,
38
+ anchorOrderedPairs,
39
+ verifiedAnchorProofHashes,
40
+ unverifiedAnchorProofHashes,
41
+ };
42
+ }
43
+ function buildPartitionSegments(partition, byHash, evidence) {
44
+ const members = partition.memberProofHashes.map((h) => byHash.get(h));
45
+ const memberSet = new Map(members.map((m) => [m.proofHash, m]));
46
+ const anchors = members.filter((m) => evidence.has(m.proofHash));
47
+ // Hash-link structure within the partition.
48
+ const successors = new Map();
49
+ for (const m of members) {
50
+ if (m.prevB64 === undefined)
51
+ continue;
52
+ const pred = memberSet.get(m.prevB64);
53
+ if (pred === undefined || pred.proofHash === m.proofHash)
54
+ continue;
55
+ pushMap(successors, pred.proofHash, m);
56
+ }
57
+ // For each verified anchor: members causally after it (descendants via
58
+ // hash links) and causally before it (ancestors via the prevB64 walk).
59
+ const chainAfter = new Map();
60
+ const chainBefore = new Map();
61
+ for (const anchor of anchors) {
62
+ chainAfter.set(anchor.proofHash, collectDescendants(anchor, successors));
63
+ chainBefore.set(anchor.proofHash, collectAncestors(anchor, memberSet));
64
+ }
65
+ // Candidate bounds per member.
66
+ const memberBounds = members.map((member) => {
67
+ const lowerCandidates = new Map();
68
+ const upperCandidates = new Map();
69
+ const memberCounter = parseCounter(member.counter);
70
+ for (const anchor of anchors) {
71
+ const anchorHash = anchor.proofHash;
72
+ const anchorCounter = parseCounter(anchor.counter);
73
+ // Lower (not-before): the anchor itself consumed the block hash, so
74
+ // it is its own strongest lower bound; descendants inherit through
75
+ // the chain; counter ordering is the weaker fallback.
76
+ if (member.proofHash === anchorHash || chainAfter.get(anchorHash).has(member.proofHash)) {
77
+ lowerCandidates.set(anchorHash, "chain-link");
78
+ }
79
+ else if (memberCounter !== undefined &&
80
+ anchorCounter !== undefined &&
81
+ memberCounter > anchorCounter) {
82
+ if (!lowerCandidates.has(anchorHash))
83
+ lowerCandidates.set(anchorHash, "counter-order");
84
+ }
85
+ // Upper (not-after): members the anchor's chain state commits to;
86
+ // counter ordering as the weaker fallback. Never from the anchor to
87
+ // itself.
88
+ if (chainBefore.get(anchorHash).has(member.proofHash)) {
89
+ upperCandidates.set(anchorHash, "chain-link");
90
+ }
91
+ else if (member.proofHash !== anchorHash &&
92
+ memberCounter !== undefined &&
93
+ anchorCounter !== undefined &&
94
+ memberCounter < anchorCounter) {
95
+ if (!upperCandidates.has(anchorHash))
96
+ upperCandidates.set(anchorHash, "counter-order");
97
+ }
98
+ }
99
+ return {
100
+ member,
101
+ lower: selectBounds("not-before", lowerCandidates, evidence),
102
+ upper: selectBounds("not-after", upperCandidates, evidence),
103
+ };
104
+ });
105
+ // Group members sharing an identical bound set into segments.
106
+ const groups = new Map();
107
+ for (const mb of memberBounds) {
108
+ pushMap(groups, boundSetKey(mb), mb);
109
+ }
110
+ const segments = [];
111
+ for (const group of groups.values()) {
112
+ const groupMembers = group.map((g) => g.member).sort(byCounterThenHash);
113
+ const first = group[0];
114
+ const lowerBounds = first.lower;
115
+ const upperBounds = first.upper;
116
+ const status = lowerBounds.length > 0 && upperBounds.length > 0
117
+ ? "bracketed"
118
+ : lowerBounds.length > 0
119
+ ? "lower-bounded"
120
+ : upperBounds.length > 0
121
+ ? "upper-bounded"
122
+ : "ordered-but-unanchored";
123
+ const range = positionRange(groupMembers);
124
+ segments.push({
125
+ partition: partition.key,
126
+ memberProofHashes: groupMembers.map((m) => m.proofHash),
127
+ ...(range !== undefined ? { positionRange: range } : {}),
128
+ status,
129
+ lowerBounds,
130
+ upperBounds,
131
+ });
132
+ }
133
+ segments.sort(compareSegments);
134
+ return segments;
135
+ }
136
+ /**
137
+ * Select the reported bounds from the candidate set: the tightest bound
138
+ * overall (max timestamp for not-before, min for not-after), plus the
139
+ * tightest chain-link bound when the overall tightest rests only on
140
+ * counter ordering. At most two entries, tightest first.
141
+ */
142
+ function selectBounds(kind, candidates, evidence) {
143
+ if (candidates.size === 0)
144
+ return [];
145
+ const entries = [...candidates.entries()].map(([anchorHash, evidenceKind]) => ({
146
+ anchorHash,
147
+ evidenceKind,
148
+ info: evidence.get(anchorHash),
149
+ }));
150
+ const better = (a, b) => {
151
+ if (b === undefined)
152
+ return true;
153
+ if (a.info.timestamp !== b.info.timestamp) {
154
+ return kind === "not-before"
155
+ ? a.info.timestamp > b.info.timestamp
156
+ : a.info.timestamp < b.info.timestamp;
157
+ }
158
+ // Tie: prefer chain-link evidence, then the lower anchor hash.
159
+ if (a.evidenceKind !== b.evidenceKind)
160
+ return a.evidenceKind === "chain-link";
161
+ return a.anchorHash < b.anchorHash;
162
+ };
163
+ let best;
164
+ let bestChain;
165
+ for (const entry of entries) {
166
+ if (better(entry, best))
167
+ best = entry;
168
+ if (entry.evidenceKind === "chain-link" && better(entry, bestChain))
169
+ bestChain = entry;
170
+ }
171
+ const bounds = [makeBound(kind, best)];
172
+ if (bestChain !== undefined &&
173
+ (best.anchorHash !== bestChain.anchorHash ||
174
+ best.evidenceKind !== "chain-link")) {
175
+ bounds.push(makeBound(kind, bestChain));
176
+ }
177
+ return bounds;
178
+ }
179
+ function makeBound(kind, entry) {
180
+ const { info, evidenceKind } = entry;
181
+ const iso = new Date(info.timestamp * 1000).toISOString();
182
+ const blockName = info.blockNumber !== undefined ? `Ethereum block ${info.blockNumber}` : "an Ethereum block";
183
+ const evidenceSentence = evidenceKind === "chain-link"
184
+ ? "Evidence: a verified hash-link path connects these proofs and the anchor."
185
+ : "Evidence: commit-counter ordering within the partition only, which relies on the " +
186
+ "authority's counter discipline rather than verifiable hash links (weaker).";
187
+ const claim = kind === "not-before"
188
+ ? `These proofs were committed no earlier than ${iso} (unix ${info.timestamp}), the ` +
189
+ `timestamp of ${blockName}: the block hash was unpredictable before that time and the ` +
190
+ `anchor commit consumed it. Reading this as a wall-clock floor additionally assumes the ` +
191
+ `anchored header is a genuine, publicly published Ethereum block: this offline audit checks ` +
192
+ `the header's structure and hash binding, not proof-of-work, consensus, or chain membership, ` +
193
+ `so it cannot confirm the block is real. ${evidenceSentence}`
194
+ : `These proofs existed before the anchor commit that consumed the hash of ${blockName} ` +
195
+ `(block timestamp ${iso}, unix ${info.timestamp}). The block timestamp proves the anchor ` +
196
+ `commit came at or after it, not how promptly; reading it as a wall-clock ceiling ` +
197
+ `additionally assumes the anchor consumed a recently published block. ${evidenceSentence}`;
198
+ return {
199
+ kind,
200
+ anchorProofHash: entry.anchorHash,
201
+ ...(info.blockNumber !== undefined ? { blockNumber: info.blockNumber } : {}),
202
+ blockHash: info.blockHash,
203
+ timestamp: info.timestamp,
204
+ evidence: evidenceKind,
205
+ weaker: evidenceKind === "counter-order",
206
+ basis: kind === "not-before" ? "block-hash-unpredictability" : "causal-precedence",
207
+ claim,
208
+ };
209
+ }
210
+ function boundSetKey(mb) {
211
+ const part = (bounds) => bounds.map((b) => `${b.anchorProofHash}:${b.evidence}`).join(",");
212
+ return `${part(mb.lower)}|${part(mb.upper)}`;
213
+ }
214
+ function collectDescendants(anchor, successors) {
215
+ const reached = new Set();
216
+ const stack = [...(successors.get(anchor.proofHash) ?? [])];
217
+ while (stack.length > 0) {
218
+ const node = stack.pop();
219
+ if (reached.has(node.proofHash))
220
+ continue;
221
+ reached.add(node.proofHash);
222
+ for (const next of successors.get(node.proofHash) ?? [])
223
+ stack.push(next);
224
+ }
225
+ return reached;
226
+ }
227
+ function collectAncestors(anchor, memberSet) {
228
+ const reached = new Set();
229
+ let cursor = anchor;
230
+ while (cursor !== undefined && cursor.prevB64 !== undefined) {
231
+ const pred = memberSet.get(cursor.prevB64);
232
+ if (pred === undefined || reached.has(pred.proofHash) || pred.proofHash === anchor.proofHash) {
233
+ break;
234
+ }
235
+ reached.add(pred.proofHash);
236
+ cursor = pred;
237
+ }
238
+ return reached;
239
+ }
240
+ function positionRange(members) {
241
+ let min;
242
+ let max;
243
+ for (const m of members) {
244
+ for (const value of [m.counter, m.slotCounter]) {
245
+ const n = parseCounter(value);
246
+ if (n === undefined)
247
+ continue;
248
+ if (min === undefined || n < min)
249
+ min = n;
250
+ if (max === undefined || n > max)
251
+ max = n;
252
+ }
253
+ }
254
+ return min !== undefined && max !== undefined
255
+ ? { min: String(min), max: String(max) }
256
+ : undefined;
257
+ }
258
+ function compareSegments(a, b) {
259
+ const ma = a.positionRange?.min;
260
+ const mb = b.positionRange?.min;
261
+ if (ma !== undefined && mb !== undefined && ma !== mb) {
262
+ return BigInt(ma) < BigInt(mb) ? -1 : 1;
263
+ }
264
+ if (ma !== undefined && mb === undefined)
265
+ return -1;
266
+ if (ma === undefined && mb !== undefined)
267
+ return 1;
268
+ const ha = a.memberProofHashes[0] ?? "";
269
+ const hb = b.memberProofHashes[0] ?? "";
270
+ return ha < hb ? -1 : ha > hb ? 1 : 0;
271
+ }
272
+ /**
273
+ * Populate EpochRecord.anchorBounds and derive covered-portion ordering
274
+ * pairs.
275
+ *
276
+ * The epoch-level not-before is the MINIMUM timestamp over the members'
277
+ * lower bounds (every covered member is not-before at least that), and
278
+ * the epoch-level not-after is the MAXIMUM over the members' upper bounds
279
+ * (every covered member existed before an anchor commit at or after that).
280
+ * These conservative representatives make the cross-epoch comparison
281
+ * sound for the covered portions: epoch A's not-after strictly below
282
+ * epoch B's not-before orders the covered portion of A before the covered
283
+ * portion of B, subject to the not-after freshness assumption.
284
+ */
285
+ /** Sentence appended to an epoch-level claim when its representative bound rests on counter-order evidence. */
286
+ function weakerCaveat(weaker) {
287
+ return weaker
288
+ ? " The representative bound rests on commit-counter ordering rather than a verified hash-link " +
289
+ "path, which relies on the authority's counter discipline (weaker evidence)."
290
+ : "";
291
+ }
292
+ function aggregateEpochs(reconstruction, segments) {
293
+ const coverage = new Map();
294
+ for (const epoch of reconstruction.epochRelationships.epochs) {
295
+ coverage.set(epoch.epochId, {
296
+ totalProofCount: epoch.proofCount,
297
+ lowerCovered: new Set(),
298
+ upperCovered: new Set(),
299
+ });
300
+ }
301
+ for (const segment of segments) {
302
+ const epochId = segment.partition.epochId;
303
+ if (epochId === undefined)
304
+ continue;
305
+ const cov = coverage.get(epochId);
306
+ if (cov === undefined)
307
+ continue;
308
+ // The tightest bound is entry 0 by construction; every listed bound
309
+ // covers the members, so the conservative representative scans all.
310
+ // Conservative representative: minimum timestamp for not-before. At an
311
+ // equal timestamp, prefer chain-link evidence so the epoch bound is
312
+ // never marked weaker when a hash-link bound justifies the same time.
313
+ for (const bound of segment.lowerBounds) {
314
+ for (const h of segment.memberProofHashes)
315
+ cov.lowerCovered.add(h);
316
+ if (cov.lowerMin === undefined ||
317
+ bound.timestamp < cov.lowerMin.timestamp ||
318
+ (bound.timestamp === cov.lowerMin.timestamp && cov.lowerMin.weaker && !bound.weaker)) {
319
+ cov.lowerMin = {
320
+ timestamp: bound.timestamp,
321
+ anchorProofHash: bound.anchorProofHash,
322
+ blockHash: bound.blockHash,
323
+ ...(bound.blockNumber !== undefined ? { blockNumber: bound.blockNumber } : {}),
324
+ evidence: bound.evidence,
325
+ weaker: bound.weaker,
326
+ };
327
+ }
328
+ }
329
+ // Maximum timestamp for not-after, same chain-link tie preference.
330
+ for (const bound of segment.upperBounds) {
331
+ for (const h of segment.memberProofHashes)
332
+ cov.upperCovered.add(h);
333
+ if (cov.upperMax === undefined ||
334
+ bound.timestamp > cov.upperMax.timestamp ||
335
+ (bound.timestamp === cov.upperMax.timestamp && cov.upperMax.weaker && !bound.weaker)) {
336
+ cov.upperMax = {
337
+ timestamp: bound.timestamp,
338
+ anchorProofHash: bound.anchorProofHash,
339
+ blockHash: bound.blockHash,
340
+ ...(bound.blockNumber !== undefined ? { blockNumber: bound.blockNumber } : {}),
341
+ evidence: bound.evidence,
342
+ weaker: bound.weaker,
343
+ };
344
+ }
345
+ }
346
+ }
347
+ // Populate EpochRecord.anchorBounds (the Phase 4c extension point).
348
+ for (const epoch of reconstruction.epochRelationships.epochs) {
349
+ const cov = coverage.get(epoch.epochId);
350
+ const bounds = [];
351
+ if (cov.lowerMin !== undefined) {
352
+ bounds.push({
353
+ kind: "not-before",
354
+ anchorProofHash: cov.lowerMin.anchorProofHash,
355
+ ...(cov.lowerMin.blockNumber !== undefined ? { blockNumber: cov.lowerMin.blockNumber } : {}),
356
+ blockHash: cov.lowerMin.blockHash,
357
+ witnessTimestamp: cov.lowerMin.timestamp,
358
+ coverage: "members-after-anchor",
359
+ coveredProofCount: cov.lowerCovered.size,
360
+ totalProofCount: cov.totalProofCount,
361
+ basis: "block-hash-unpredictability",
362
+ evidence: cov.lowerMin.evidence,
363
+ weaker: cov.lowerMin.weaker,
364
+ claim: `${cov.lowerCovered.size} of ${cov.totalProofCount} observed proofs of this epoch were ` +
365
+ `committed no earlier than unix ${cov.lowerMin.timestamp}, grounded in block-hash ` +
366
+ `unpredictability through verified anchor witnesses. This additionally assumes the anchored ` +
367
+ `header is a genuine, publicly published Ethereum block, which this offline audit cannot ` +
368
+ `confirm.` +
369
+ weakerCaveat(cov.lowerMin.weaker) +
370
+ ` The remaining proofs sit causally before the covering anchors and carry no lower bound ` +
371
+ `from this evidence.`,
372
+ });
373
+ }
374
+ if (cov.upperMax !== undefined) {
375
+ bounds.push({
376
+ kind: "not-after",
377
+ anchorProofHash: cov.upperMax.anchorProofHash,
378
+ ...(cov.upperMax.blockNumber !== undefined ? { blockNumber: cov.upperMax.blockNumber } : {}),
379
+ blockHash: cov.upperMax.blockHash,
380
+ witnessTimestamp: cov.upperMax.timestamp,
381
+ coverage: "members-before-anchor",
382
+ coveredProofCount: cov.upperCovered.size,
383
+ totalProofCount: cov.totalProofCount,
384
+ basis: "causal-precedence",
385
+ evidence: cov.upperMax.evidence,
386
+ weaker: cov.upperMax.weaker,
387
+ claim: `${cov.upperCovered.size} of ${cov.totalProofCount} observed proofs of this epoch ` +
388
+ `existed before an anchor commit that consumed a block published at unix ` +
389
+ `${cov.upperMax.timestamp}. Reading that timestamp as a wall-clock ceiling additionally ` +
390
+ `assumes the anchor consumed a recently published block; the causal precedence itself ` +
391
+ `is verified.` +
392
+ weakerCaveat(cov.upperMax.weaker) +
393
+ ` Proofs after the covering anchors are not covered.`,
394
+ });
395
+ }
396
+ if (bounds.length > 0)
397
+ epoch.anchorBounds = bounds;
398
+ }
399
+ // Covered-portion ordering pairs. Strict inequality: equal timestamps
400
+ // order nothing. Overlaps produce no pair (concurrent-or-unordered),
401
+ // never divergence.
402
+ const pairs = [];
403
+ const epochs = reconstruction.epochRelationships.epochs;
404
+ for (const before of epochs) {
405
+ const covA = coverage.get(before.epochId);
406
+ if (covA.upperMax === undefined)
407
+ continue;
408
+ for (const after of epochs) {
409
+ if (after.epochId === before.epochId)
410
+ continue;
411
+ const covB = coverage.get(after.epochId);
412
+ if (covB.lowerMin === undefined)
413
+ continue;
414
+ if (covA.upperMax.timestamp >= covB.lowerMin.timestamp)
415
+ continue;
416
+ const upperEvidence = covA.upperMax.evidence;
417
+ const lowerEvidence = covB.lowerMin.evidence;
418
+ const weaker = covA.upperMax.weaker || covB.lowerMin.weaker;
419
+ pairs.push({
420
+ beforeEpochId: before.epochId,
421
+ afterEpochId: after.epochId,
422
+ upperAnchorProofHash: covA.upperMax.anchorProofHash,
423
+ upperBoundTimestamp: covA.upperMax.timestamp,
424
+ lowerAnchorProofHash: covB.lowerMin.anchorProofHash,
425
+ lowerBoundTimestamp: covB.lowerMin.timestamp,
426
+ basis: "anchor-bounds",
427
+ assumptionDependent: true,
428
+ upperEvidence,
429
+ lowerEvidence,
430
+ weaker,
431
+ beforeCoveredProofCount: covA.upperCovered.size,
432
+ beforeTotalProofCount: covA.totalProofCount,
433
+ afterCoveredProofCount: covB.lowerCovered.size,
434
+ afterTotalProofCount: covB.totalProofCount,
435
+ note: `The anchor-covered portion of epoch ${before.epochId} ` +
436
+ `(${covA.upperCovered.size} of ${covA.totalProofCount} proofs) precedes the ` +
437
+ `anchor-covered portion of epoch ${after.epochId} ` +
438
+ `(${covB.lowerCovered.size} of ${covB.totalProofCount} proofs): the first is bounded ` +
439
+ `not-after unix ${covA.upperMax.timestamp} and the second not-before unix ` +
440
+ `${covB.lowerMin.timestamp}. One-sided evidence about the covered portions only; the ` +
441
+ `not-after side rests on the anchor-freshness assumption documented on its bound.` +
442
+ (weaker
443
+ ? ` At least one side rests on commit-counter ordering rather than a verified hash-link ` +
444
+ `path (weaker evidence), which relies on the authority's counter discipline.`
445
+ : "") +
446
+ ` This is ordering evidence, never divergence.`,
447
+ });
448
+ }
449
+ }
450
+ pairs.sort((a, b) => a.beforeEpochId !== b.beforeEpochId
451
+ ? a.beforeEpochId < b.beforeEpochId
452
+ ? -1
453
+ : 1
454
+ : a.afterEpochId < b.afterEpochId
455
+ ? -1
456
+ : a.afterEpochId > b.afterEpochId
457
+ ? 1
458
+ : 0);
459
+ return pairs;
460
+ }
461
+ //# sourceMappingURL=temporal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temporal.js","sourceRoot":"","sources":["../src/temporal.ts"],"names":[],"mappings":"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"}