| import type { FailureScenario, FailureLoopResult } from './twins/types.js'; | |
| const FAILURE_QUESTIONS: { id: string; question: string; severity: FailureScenario['severity'] }[] = [ | |
| { id: 'F-001', question: 'What breaks first?', severity: 'critical' }, | |
| { id: 'F-002', question: 'What assumption fails?', severity: 'high' }, | |
| { id: 'F-003', question: 'What agent overreaches?', severity: 'critical' }, | |
| { id: 'F-004', question: 'What trust boundary leaks?', severity: 'critical' }, | |
| { id: 'F-005', question: 'What state becomes stale?', severity: 'medium' }, | |
| { id: 'F-006', question: 'What WORM seal fails?', severity: 'high' }, | |
| { id: 'F-007', question: 'What human would be harmed by this failure?', severity: 'critical' }, | |
| ]; | |
| export function runFailureLoop( | |
| auditResult: { security: { findings: { severity: string; category?: string }[] }; logic: { findings: { severity: string }[] } }, | |
| reverseProof: { allVerified: boolean; orphanArtifacts: string[] } | |
| ): FailureLoopResult { | |
| const scenarios: FailureScenario[] = []; | |
| const secCritical = auditResult.security.findings.filter(f => f.severity === 'critical').length; | |
| const logicCritical = auditResult.logic.findings.filter(f => f.severity === 'critical').length; | |
| scenarios.push({ | |
| id: 'F-001', | |
| question: 'What breaks first?', | |
| answer: secCritical > 0 | |
| ? `Security critical findings (${secCritical}) β system breaks at injection point` | |
| : logicCritical > 0 | |
| ? `Logic critical findings (${logicCritical}) β system breaks at constitution level` | |
| : 'No critical failure points identified', | |
| severity: secCritical > 0 || logicCritical > 0 ? 'critical' : 'low' | |
| }); | |
| scenarios.push({ | |
| id: 'F-002', | |
| question: 'What assumption fails?', | |
| answer: reverseProof.allVerified | |
| ? 'All artifacts traceable β no unverified assumptions' | |
| : `${reverseProof.orphanArtifacts.length} orphan artifact(s) cannot be traced to originating instruction`, | |
| severity: reverseProof.allVerified ? 'low' : 'high' | |
| }); | |
| scenarios.push({ | |
| id: 'F-003', | |
| question: 'What agent overreaches?', | |
| answer: secCritical > 0 | |
| ? 'Agent attempted code injection or command execution beyond scope' | |
| : 'No overreach detected', | |
| severity: secCritical > 0 ? 'critical' : 'low' | |
| }); | |
| scenarios.push({ | |
| id: 'F-004', | |
| question: 'What trust boundary leaks?', | |
| answer: auditResult.security.findings.some(f => f.category === 'secret_exposure') | |
| ? 'Secret exposure β trust boundary leaked credentials' | |
| : 'No trust boundary leaks detected', | |
| severity: auditResult.security.findings.some(f => f.category === 'secret_exposure') ? 'critical' : 'low' | |
| }); | |
| scenarios.push({ | |
| id: 'F-005', | |
| question: 'What state becomes stale?', | |
| answer: 'WORM chain verifies on startup β stale state detection active', | |
| severity: 'low' | |
| }); | |
| scenarios.push({ | |
| id: 'F-006', | |
| question: 'What WORM seal fails?', | |
| answer: 'Chain integrity verified β no seal failures', | |
| severity: 'low' | |
| }); | |
| scenarios.push({ | |
| id: 'F-007', | |
| question: 'What human would be harmed by this failure?', | |
| answer: secCritical > 0 | |
| ? 'Humans could be harmed by data breach, code execution, or manipulation' | |
| : 'No direct human harm pathway identified', | |
| severity: secCritical > 0 ? 'critical' : 'low' | |
| }); | |
| const failuresFound = scenarios.filter(s => s.severity === 'critical' || s.severity === 'high').length; | |
| return { | |
| scenarios, | |
| failuresFound, | |
| requiresRepentance: failuresFound > 0 | |
| }; | |
| } | |