@@ -438,9 +438,9 @@ def run_multi_agent_sequential(
438438
439439 # Run each specialized agent
440440 for i , agent_name in enumerate (agents , 1 ):
441- print (f"\n { '\u2500 ' * 80 } " )
441+ print (f"\n { '─ ' * 80 } " )
442442 print (f"\U0001f50d Agent { i } /7: { agent_name .upper ()} REVIEWER" )
443- print (f"{ '\u2500 ' * 80 } " )
443+ print (f"{ '─ ' * 80 } " )
444444
445445 # Start context tracking for this agent phase
446446 context_tracker .start_phase (f"agent_{ i } _{ agent_name } " )
@@ -651,9 +651,9 @@ def run_multi_agent_sequential(
651651
652652 # NEW: Sandbox Validation (after security agents, before orchestrator)
653653 if config .get ("enable_sandbox_validation" , True ) and SANDBOX_VALIDATION_AVAILABLE :
654- print (f"\n { '\u2500 ' * 80 } " )
654+ print (f"\n { '─ ' * 80 } " )
655655 print ("\U0001f52c SANDBOX VALIDATION" )
656- print (f"{ '\u2500 ' * 80 } " )
656+ print (f"{ '─ ' * 80 } " )
657657 print (" Validating exploits in isolated containers..." )
658658
659659 try :
@@ -760,13 +760,14 @@ def run_multi_agent_sequential(
760760
761761 # NEW: Consensus Building (from real_multi_agent_review.py)
762762 # Build consensus across agent findings to reduce false positives
763- enable_consensus = config .get ("enable_consensus" , "true" ).lower () == "true"
763+ _ec = config .get ("enable_consensus" , True )
764+ enable_consensus = str (_ec ).lower () == "true" if not isinstance (_ec , bool ) else _ec
764765 consensus_results = {}
765766
766767 if enable_consensus and len (agent_reports ) >= 2 :
767- print (f"\n { '\u2500 ' * 80 } " )
768+ print (f"\n { '─ ' * 80 } " )
768769 print ("\U0001f91d CONSENSUS BUILDING" )
769- print (f"{ '\u2500 ' * 80 } " )
770+ print (f"{ '─ ' * 80 } " )
770771 print (" Aggregating findings across agents to reduce false positives..." )
771772
772773 # Parse findings from all agents
@@ -804,9 +805,9 @@ def run_multi_agent_sequential(
804805 print (" \u2139 \ufe0f Insufficient overlap for consensus building" )
805806
806807 # Run orchestrator agent
807- print (f"\n { '\u2500 ' * 80 } " )
808+ print (f"\n { '─ ' * 80 } " )
808809 print ("\U0001f3af Agent 7/7: ORCHESTRATOR" )
809- print (f"{ '\u2500 ' * 80 } " )
810+ print (f"{ '─ ' * 80 } " )
810811 print (" \U0001f504 Aggregating findings from all agents..." )
811812
812813 orchestrator_start = time .time ()
@@ -909,6 +910,18 @@ def run_multi_agent_sequential(
909910 total_cost = sum (m .get ("cost_usd" , 0 ) for m in agent_metrics .values ())
910911 total_duration = sum (m .get ("duration_seconds" , 0 ) for m in agent_metrics .values ())
911912
913+ # Build status icons (avoid backslashes in f-strings for Python 3.11 compat)
914+ def _status (name ):
915+ return "✅" if "error" not in agent_metrics .get (name , {}) else "❌"
916+
917+ sec_status = _status ("security" )
918+ exploit_status = _status ("exploit-analyst" )
919+ testgen_status = _status ("security-test-generator" )
920+ perf_status = _status ("performance" )
921+ test_status = _status ("testing" )
922+ qual_status = _status ("quality" )
923+ orch_status = _status ("orchestrator" )
924+
912925 multi_agent_summary = f"""
913926---
914927
@@ -921,13 +934,13 @@ def run_multi_agent_sequential(
921934### Agent Performance
922935| Agent | Duration | Cost | Status |
923936|-------|----------|------|--------|
924- | Security | { agent_metrics .get ("security" , {}).get ("duration_seconds" , "N/A" )} s | ${ agent_metrics .get ("security" , {}).get ("cost_usd" , 0 ):.4f} | { " \u2705 " if "error" not in agent_metrics . get ( "security" , {}) else " \u274c " } |
925- | Exploit Analyst | { agent_metrics .get ("exploit-analyst" , {}).get ("duration_seconds" , "N/A" )} s | ${ agent_metrics .get ("exploit-analyst" , {}).get ("cost_usd" , 0 ):.4f} | { " \u2705 " if "error" not in agent_metrics . get ( "exploit-analyst" , {}) else " \u274c " } |
926- | Security Test Generator | { agent_metrics .get ("security-test-generator" , {}).get ("duration_seconds" , "N/A" )} s | ${ agent_metrics .get ("security-test-generator" , {}).get ("cost_usd" , 0 ):.4f} | { " \u2705 " if "error" not in agent_metrics . get ( "security-test-generator" , {}) else " \u274c " } |
927- | Performance | { agent_metrics .get ("performance" , {}).get ("duration_seconds" , "N/A" )} s | ${ agent_metrics .get ("performance" , {}).get ("cost_usd" , 0 ):.4f} | { " \u2705 " if "error" not in agent_metrics . get ( "performance" , {}) else " \u274c " } |
928- | Testing | { agent_metrics .get ("testing" , {}).get ("duration_seconds" , "N/A" )} s | ${ agent_metrics .get ("testing" , {}).get ("cost_usd" , 0 ):.4f} | { " \u2705 " if "error" not in agent_metrics . get ( "testing" , {}) else " \u274c " } |
929- | Quality | { agent_metrics .get ("quality" , {}).get ("duration_seconds" , "N/A" )} s | ${ agent_metrics .get ("quality" , {}).get ("cost_usd" , 0 ):.4f} | { " \u2705 " if "error" not in agent_metrics . get ( "quality" , {}) else " \u274c " } |
930- | Orchestrator | { agent_metrics .get ("orchestrator" , {}).get ("duration_seconds" , "N/A" )} s | ${ agent_metrics .get ("orchestrator" , {}).get ("cost_usd" , 0 ):.4f} | { " \u2705 " if "error" not in agent_metrics . get ( "orchestrator" , {}) else " \u274c " } |
937+ | Security | { agent_metrics .get ("security" , {}).get ("duration_seconds" , "N/A" )} s | ${ agent_metrics .get ("security" , {}).get ("cost_usd" , 0 ):.4f} | { sec_status } |
938+ | Exploit Analyst | { agent_metrics .get ("exploit-analyst" , {}).get ("duration_seconds" , "N/A" )} s | ${ agent_metrics .get ("exploit-analyst" , {}).get ("cost_usd" , 0 ):.4f} | { exploit_status } |
939+ | Security Test Generator | { agent_metrics .get ("security-test-generator" , {}).get ("duration_seconds" , "N/A" )} s | ${ agent_metrics .get ("security-test-generator" , {}).get ("cost_usd" , 0 ):.4f} | { testgen_status } |
940+ | Performance | { agent_metrics .get ("performance" , {}).get ("duration_seconds" , "N/A" )} s | ${ agent_metrics .get ("performance" , {}).get ("cost_usd" , 0 ):.4f} | { perf_status } |
941+ | Testing | { agent_metrics .get ("testing" , {}).get ("duration_seconds" , "N/A" )} s | ${ agent_metrics .get ("testing" , {}).get ("cost_usd" , 0 ):.4f} | { test_status } |
942+ | Quality | { agent_metrics .get ("quality" , {}).get ("duration_seconds" , "N/A" )} s | ${ agent_metrics .get ("quality" , {}).get ("cost_usd" , 0 ):.4f} | { qual_status } |
943+ | Orchestrator | { agent_metrics .get ("orchestrator" , {}).get ("duration_seconds" , "N/A" )} s | ${ agent_metrics .get ("orchestrator" , {}).get ("cost_usd" , 0 ):.4f} | { orch_status } |
931944
932945### Exploitability Metrics
933946- **Trivial**: { metrics .metrics ["exploitability" ]["trivial" ]} (fix within 24-48 hours)
0 commit comments