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