File size: 1,649 Bytes
662ceed
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import type { ReverseProof, ReverseProofEntry } from './twins/types.js';

export function buildReverseProof(

  artifacts: string[],

  instructionMap: Record<string, string>,

  deedClauseMap: Record<string, string>,

  agentMap: Record<string, string>,

  stateMap: Record<string, string>,

  wormMap: Record<string, string>

): ReverseProof {
  const entries: ReverseProofEntry[] = [];
  const orphanArtifacts: string[] = [];

  for (const artifact of artifacts) {
    const instruction = instructionMap[artifact];
    const clause = deedClauseMap[artifact];
    const agent = agentMap[artifact];
    const state = stateMap[artifact];
    const worm = wormMap[artifact];

    if (!instruction || !clause || !agent || !state || !worm) {
      orphanArtifacts.push(artifact);
      entries.push({
        artifact,
        originatingInstruction: instruction || 'UNKNOWN',
        trustDeedClause: clause || 'UNKNOWN',
        agent: agent || 'UNKNOWN',
        stateTransition: state || 'UNKNOWN',
        wormEvent: worm || 'UNKNOWN',
        verified: false
      });
    } else {
      entries.push({
        artifact,
        originatingInstruction: instruction,
        trustDeedClause: clause,
        agent,
        stateTransition: state,
        wormEvent: worm,
        verified: true
      });
    }
  }

  return {
    entries,
    allVerified: entries.every(e => e.verified),
    orphanArtifacts
  };
}

export function verifyTraceability(proof: ReverseProof): { valid: boolean; orphans: string[] } {
  return {
    valid: proof.allVerified,
    orphans: proof.orphanArtifacts
  };
}