snapkitty
agents
python
File size: 1,520 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
import type { RepentanceRecord, FailureScenario } from './twins/types.js';
import { appendEntry } from './worm.js';

export function initiateRepentance(failure: FailureScenario, violatedClause: string): RepentanceRecord {
  const record: RepentanceRecord = {
    id: `REP-${Date.now().toString(36)}`,
    timestamp: new Date().toISOString(),
    originalFailure: `${failure.id}: ${failure.question} — ${failure.answer}`,
    violatedClause,
    rollbackComplete: false,
    reDerivationComplete: false,
    twinsReAudited: false,
    ledgeSealed: false
  };

  appendEntry(record.id, 'SENTINEL', `repentance:initiate:${failure.id}`, 'repent', [violatedClause]);

  return record;
}

export function completeRepentance(record: RepentanceRecord): RepentanceRecord {
  const completed = {
    ...record,
    rollbackComplete: true,
    reDerivationComplete: true,
    twinsReAudited: true,
    ledgeSealed: true
  };

  appendEntry(completed.id, 'LEDGE', `repentance:complete:${record.id}`, 'approve', [record.violatedClause]);

  return completed;
}

export function verifyRepentance(record: RepentanceRecord): { valid: boolean; missing: string[] } {
  const missing: string[] = [];
  if (!record.rollbackComplete) missing.push('rollback');
  if (!record.reDerivationComplete) missing.push('re_derivation');
  if (!record.twinsReAudited) missing.push('twins_re_audit');
  if (!record.ledgeSealed) missing.push('ledge_seal');
  return { valid: missing.length === 0, missing };
}