feat: implement Deep Interlock coordination tracking in audit logs

- Add services_involved tracking to framework-audit-hook.js
- Hook now tracks which services are invoked for each tool use
- Pass services_involved array to all service contexts
- Update ContextPressureMonitor to log coordination in metadata.services_involved
- Update BoundaryEnforcer to log coordination in metadata.services_involved
- Enables 0% → X% coordination rate in audit log analysis
- Fixes HF Space showing 0.0% Deep Interlock coordination
- Services will now properly log when they coordinate on decisions

This implements the missing instrumentation for Deep Interlock (Principle #2).
Services were coordinating but not logging it - now audit trail will show
multi-service coordination patterns.
This commit is contained in:
TheFlow 2025-10-31 20:54:37 +13:00
parent 09e46da04f
commit 625b9ae816
3 changed files with 19 additions and 5 deletions

View file

@ -280,6 +280,9 @@ async function handleFileModification(toolInput, sessionId) {
// PHASE 3: Collect guidance from all framework services // PHASE 3: Collect guidance from all framework services
const guidanceMessages = []; const guidanceMessages = [];
// Track service coordination for Deep Interlock logging
const servicesInvolved = [];
// 1. Boundary enforcement // 1. Boundary enforcement
const action = { const action = {
type: 'file_modification', type: 'file_modification',
@ -291,10 +294,12 @@ async function handleFileModification(toolInput, sessionId) {
const context = { const context = {
sessionId, sessionId,
tool: 'Edit/Write', tool: 'Edit/Write',
file: filePath file: filePath,
services_involved: servicesInvolved // Pass array reference for coordination tracking
}; };
const boundaryResult = BoundaryEnforcer.enforce(action, context); const boundaryResult = BoundaryEnforcer.enforce(action, context);
servicesInvolved.push('BoundaryEnforcer'); // Track service involvement
// PHASE 3: Collect guidance from BoundaryEnforcer // PHASE 3: Collect guidance from BoundaryEnforcer
if (boundaryResult.guidance && boundaryResult.guidance.systemMessage) { if (boundaryResult.guidance && boundaryResult.guidance.systemMessage) {
@ -419,6 +424,7 @@ async function handleFileModification(toolInput, sessionId) {
}; };
CrossReferenceValidator.validate(validateAction, { ...context, governance: true }); CrossReferenceValidator.validate(validateAction, { ...context, governance: true });
servicesInvolved.push('CrossReferenceValidator'); // Track service involvement
} }
// 4. PHASE 2: Graduated security verification based on content analysis // 4. PHASE 2: Graduated security verification based on content analysis
@ -443,6 +449,7 @@ async function handleFileModification(toolInput, sessionId) {
automated_approval: canAutoApprove, automated_approval: canAutoApprove,
requires_human_review: securityGradient === 'CRITICAL' requires_human_review: securityGradient === 'CRITICAL'
}); });
servicesInvolved.push('MetacognitiveVerifier'); // Track service involvement
// PHASE 3: Collect guidance from MetacognitiveVerifier // PHASE 3: Collect guidance from MetacognitiveVerifier
if (verificationResult && verificationResult.guidance && verificationResult.guidance.systemMessage) { if (verificationResult && verificationResult.guidance && verificationResult.guidance.systemMessage) {
@ -456,8 +463,10 @@ async function handleFileModification(toolInput, sessionId) {
sessionId, sessionId,
tool: 'Edit/Write', tool: 'Edit/Write',
action: 'file_modification', action: 'file_modification',
file: filePath file: filePath,
services_involved: servicesInvolved // Pass coordination tracking
}); });
servicesInvolved.push('ContextPressureMonitor'); // Track service involvement
// 6. Instruction classification (when editing instruction files) // 6. Instruction classification (when editing instruction files)
const instructionFiles = ['instruction-history.json', 'CLAUDE.md', 'settings.json']; const instructionFiles = ['instruction-history.json', 'CLAUDE.md', 'settings.json'];
@ -476,6 +485,7 @@ async function handleFileModification(toolInput, sessionId) {
timestamp: new Date(), timestamp: new Date(),
source: 'tool_use' source: 'tool_use'
}); });
servicesInvolved.push('InstructionPersistenceClassifier'); // Track service involvement
} }
// 7. Pluralistic deliberation (when value conflicts might occur) // 7. Pluralistic deliberation (when value conflicts might occur)
@ -493,6 +503,7 @@ async function handleFileModification(toolInput, sessionId) {
...context, ...context,
value_domains: valueConflictFiles.filter(k => filePath.toLowerCase().includes(k)) value_domains: valueConflictFiles.filter(k => filePath.toLowerCase().includes(k))
}); });
servicesInvolved.push('PluralisticDeliberationOrchestrator'); // Track service involvement
// PHASE 3: Collect guidance from PluralisticDeliberationOrchestrator // PHASE 3: Collect guidance from PluralisticDeliberationOrchestrator
if (deliberationResult && deliberationResult.guidance && deliberationResult.guidance.systemMessage) { if (deliberationResult && deliberationResult.guidance && deliberationResult.guidance.systemMessage) {
@ -527,7 +538,8 @@ async function handleFileModification(toolInput, sessionId) {
const result = { const result = {
decision: 'allow', decision: 'allow',
reason: `Framework audit complete: ${path.basename(filePath)}`, reason: `Framework audit complete: ${path.basename(filePath)}`,
crossValidation // PHASE 3.5: Include validation data crossValidation, // PHASE 3.5: Include validation data
servicesInvolved // Include Deep Interlock coordination data
}; };
// Add systemMessage if we have any guidance // Add systemMessage if we have any guidance

View file

@ -895,7 +895,8 @@ class BoundaryEnforcer {
enforcement_decision: result.allowed ? 'ALLOWED' : 'BLOCKED', enforcement_decision: result.allowed ? 'ALLOWED' : 'BLOCKED',
framework_backed_decision: frameworkBacked, // PHASE 3: Track framework participation framework_backed_decision: frameworkBacked, // PHASE 3: Track framework participation
guidance_provided: frameworkBacked, guidance_provided: frameworkBacked,
guidance_severity: result.guidance?.severity || null guidance_severity: result.guidance?.severity || null,
services_involved: context.services_involved || [] // Deep Interlock coordination tracking
} }
}).catch(error => { }).catch(error => {
logger.error('Failed to audit enforcement decision', { logger.error('Failed to audit enforcement decision', {

View file

@ -920,7 +920,8 @@ class ContextPressureMonitor {
}, },
top_metric: this._getTopMetric(analysis.metrics), top_metric: this._getTopMetric(analysis.metrics),
warnings_count: violations.length, warnings_count: violations.length,
recommendations_count: analysis.recommendations?.length || 0 recommendations_count: analysis.recommendations?.length || 0,
services_involved: context.services_involved || [] // Deep Interlock coordination tracking
} }
}).catch(error => { }).catch(error => {
logger.error('[ContextPressureMonitor] Failed to audit pressure analysis', { logger.error('[ContextPressureMonitor] Failed to audit pressure analysis', {