@ -42,6 +42,7 @@ class ProactiveRunResult:
closed_count : int = 0
stale_count : int = 0
filtered_count : int = 0
engine_blocks : int = 0
errors : list [ str ] = field ( default_factory = list )
def finish ( self ) - > None :
@ -116,7 +117,7 @@ class ProactiveEngine:
f " NEW= { result . new_count } REOPENED= { result . reopened_count } "
f " STILL_OPEN= { result . still_open_count } VERIFY= { result . verify_count } "
f " CLOSED= { result . closed_count } STALE= { result . stale_count } "
f " filtered= { result . filtered_count } "
f " filtered= { result . filtered_count } blocks={ result . engine_blocks } "
)
return result
@ -131,9 +132,12 @@ class ProactiveEngine:
) - > list [ SearchResult ] :
discovered : list [ SearchResult ] = [ ]
seen_urls : set [ str ] = set ( )
blocked_engines : set [ str ] = set ( )
for query in queries :
for engine_name in plan . enabled_engines ( ) :
if engine_name in blocked_engines :
continue # circuit breaker: skip engines blocked this run
engine = build_engine ( engine_name )
cfg = plan . engine_config ( engine_name )
try :
@ -147,8 +151,13 @@ class ProactiveEngine:
seen_urls . add ( canon )
discovered . append ( r )
except EngineBlockedError as e :
logger . warning ( f " [proactive] { engine_name } blocked: { e } " )
result . errors . append ( str ( e ) )
# Engine anti-bot wall — not a real error; skip engine for rest of run
blocked_engines . add ( engine_name )
result . engine_blocks + = 1
logger . warning (
f " [proactive] { engine_name } blocked ( { e } ) — "
f " skipping it for the rest of this run "
)
except Exception as e :
logger . warning ( f " [proactive] { engine_name } query failed: { e } " )
result . errors . append ( str ( e ) [ : 200 ] )