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
};
}
|