mirror of
https://github.com/KeygraphHQ/shannon.git
synced 2026-06-09 08:53:57 +02:00
feat: implement unified audit system v3.0 with crash-safety and self-healing
## Unified Audit System (v3.0)
- Implemented crash-safe, append-only logging to audit-logs/{hostname}_{sessionId}/
- Added session.json with comprehensive metrics (timing, cost, attempts)
- Agent execution logs with turn-by-turn detail
- Prompt snapshots saved to audit-logs/.../prompts/{agent}.md
- SessionMutex prevents race conditions during parallel execution
- Self-healing reconciliation before every CLI command
## Session Metadata Standardization
- Fixed critical bug: standardized on 'id' field (not 'sessionId') throughout codebase
- Updated: shannon.mjs (recon, report), src/phases/pre-recon.js
- Added validation in AuditSession to fail fast on incorrect field usage
- JavaScript shorthand syntax was causing wrong field names
## Schema Improvements
- session.json: Added cost_usd per phase, removed redundant final_cost_usd
- Renamed 'percentage' -> 'duration_percentage' for clarity
- Simplified agent metrics to single total_cost_usd field
- Removed unused validation object from schema
## Legacy System Removal
- Removed savePromptSnapshot() - prompts now only saved by audit system
- Removed target repo pollution (prompt-snapshots/ no longer created)
- Single source of truth: audit-logs/{hostname}_{sessionId}/prompts/
## Export Script Simplification
- Removed JSON export mode (session.json already exists)
- CSV-only export with clean columns: agent, phase, status, attempts, duration_ms, cost_usd
- Tested on real session data
## Documentation
- Updated CLAUDE.md with audit system architecture
- Added .gitignore entry for audit-logs/
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -79,7 +79,7 @@ const rollbackGitToCommit = async (targetRepo, commitHash) => {
|
||||
export const runSingleAgent = async (agentName, session, pipelineTestingMode, runClaudePromptWithRetry, loadPrompt, allowRerun = false, skipWorkspaceClean = false) => {
|
||||
// Validate agent first
|
||||
const agent = validateAgent(agentName);
|
||||
|
||||
|
||||
console.log(chalk.cyan(`\n🤖 Running agent: ${agent.displayName}`));
|
||||
|
||||
// Reload session to get latest state (important for agent ranges)
|
||||
@@ -191,7 +191,7 @@ export const runSingleAgent = async (agentName, session, pipelineTestingMode, ru
|
||||
AGENTS[agentName].displayName,
|
||||
agentName, // Pass agent name for snapshot creation
|
||||
getAgentColor(agentName), // Pass color function for this agent
|
||||
{ webUrl: session.webUrl, sessionId: session.id } // Session metadata for logging
|
||||
{ id: session.id, webUrl: session.webUrl, repoPath: session.repoPath } // Session metadata for audit logging
|
||||
);
|
||||
|
||||
if (!result.success) {
|
||||
@@ -616,13 +616,35 @@ export const rollbackTo = async (targetAgent, session) => {
|
||||
}
|
||||
|
||||
const commitHash = session.checkpoints[targetAgent];
|
||||
|
||||
|
||||
// Rollback git workspace
|
||||
await rollbackGitToCommit(session.targetRepo, commitHash);
|
||||
|
||||
// Update session state
|
||||
|
||||
// Update session state (removes agents from completedAgents)
|
||||
await rollbackToAgent(session.id, targetAgent);
|
||||
|
||||
|
||||
// Mark rolled-back agents in audit system (for forensic trail)
|
||||
try {
|
||||
const { AuditSession } = await import('./audit/index.js');
|
||||
const auditSession = new AuditSession(session);
|
||||
await auditSession.initialize();
|
||||
|
||||
// Find agents that were rolled back (agents after targetAgent)
|
||||
const targetOrder = AGENTS[targetAgent].order;
|
||||
const rolledBackAgents = Object.values(AGENTS)
|
||||
.filter(agent => agent.order > targetOrder)
|
||||
.map(agent => agent.name);
|
||||
|
||||
// Mark them as rolled-back in audit system
|
||||
if (rolledBackAgents.length > 0) {
|
||||
await auditSession.markMultipleRolledBack(rolledBackAgents);
|
||||
console.log(chalk.gray(` Marked ${rolledBackAgents.length} agents as rolled-back in audit logs`));
|
||||
}
|
||||
} catch (error) {
|
||||
// Non-critical: rollback succeeded even if audit update failed
|
||||
console.log(chalk.yellow(` ⚠️ Failed to update audit logs: ${error.message}`));
|
||||
}
|
||||
|
||||
console.log(chalk.green(`✅ Successfully rolled back to agent '${targetAgent}'`));
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user