@@ -121,7 +121,7 @@ def _diagnose_deferred_event(
121121 source_event_kind : str ,
122122 workflow_runs : list [dict ] | None ,
123123) -> None :
124- existing_gap = gap_bookkeeping ._deferred_gaps (review_data ). get ( source_event_key , {} )
124+ existing_gap = gap_bookkeeping ._get_deferred_gap (review_data , source_event_key )
125125 run_correlation = deferred_gap_diagnosis .correlate_candidate_observer_runs (
126126 source_event_key ,
127127 source_event_kind = source_event_kind ,
@@ -275,11 +275,9 @@ def _purge_bot_authored_comment_gap(bot, review_data: dict, source_event_key: st
275275 live_comment = _fetch_live_issue_comment (bot , comment_id )
276276 if not isinstance (live_comment , dict ) or not _is_automation_comment (live_comment ):
277277 return False
278- deferred_gaps = gap_bookkeeping ._deferred_gaps (review_data )
279- if source_event_key not in deferred_gaps :
278+ if source_event_key not in gap_bookkeeping ._deferred_gap_keys (review_data ):
280279 return False
281- deferred_gaps .pop (source_event_key , None )
282- return True
280+ return gap_bookkeeping ._clear_source_event_key (review_data , source_event_key )
283281
284282
285283def _maybe_fetch_single_candidate_run_detail (bot , run_correlation : dict , artifact_correlation : dict | None ) -> dict | None :
@@ -488,28 +486,28 @@ def _record_gap_diagnostics(
488486 reason ,
489487 f"Trusted sweeper diagnostics for { source_event_key } : { diagnostic_reason } . See { bot .REVIEW_FRESHNESS_RUNBOOK_PATH } ." ,
490488 )
491- gap = gap_bookkeeping ._deferred_gaps (review_data )[source_event_key ]
492- gap ["full_scan_complete" ] = bool (run_correlation .get ("full_scan_complete" ))
493- gap ["later_recheck_complete" ] = bool (run_correlation .get ("later_recheck_complete" ))
494- gap ["correlated_run_found" ] = bool (run_correlation .get ("correlated_run" ))
489+ gap_fields = {
490+ "full_scan_complete" : bool (run_correlation .get ("full_scan_complete" )),
491+ "later_recheck_complete" : bool (run_correlation .get ("later_recheck_complete" )),
492+ "correlated_run_found" : bool (run_correlation .get ("correlated_run" )),
493+ }
495494 raw_candidate_run_ids = run_correlation .get ("candidate_run_ids" )
496495 if isinstance (raw_candidate_run_ids , list ):
497- gap ["candidate_run_ids" ] = raw_candidate_run_ids
496+ gap_fields ["candidate_run_ids" ] = raw_candidate_run_ids
498497 if isinstance (run_detail , dict ):
499- gap ["run_created_at" ] = run_detail .get ("created_at" )
498+ gap_fields ["run_created_at" ] = run_detail .get ("created_at" )
500499 if isinstance (artifact_correlation , dict ):
501500 prior_visibility = artifact_correlation .get ("prior_visibility" , {}).get (run_correlation .get ("correlated_run" ), {})
502501 if isinstance (prior_visibility , dict ):
503- gap .update (prior_visibility )
502+ gap_fields .update (prior_visibility )
503+ gap_bookkeeping ._update_deferred_gap_fields (review_data , source_event_key , gap_fields )
504504
505505
506506def _should_skip_discovered_key (bot , review_data : dict , source_event_key : str , channels : tuple [str , ...]) -> bool :
507507 if gap_bookkeeping ._was_reconciled_source_event (review_data , source_event_key ):
508508 return True
509- deferred_gaps = gap_bookkeeping ._deferred_gaps (review_data )
510- if source_event_key in deferred_gaps :
511- existing_gap = deferred_gaps .get (source_event_key )
512- if isinstance (existing_gap , dict ) and existing_gap .get ("reason" ) in {
509+ if source_event_key in gap_bookkeeping ._deferred_gap_keys (review_data ):
510+ if gap_bookkeeping ._deferred_gap_reason (review_data , source_event_key ) in {
513511 "awaiting_observer_run" ,
514512 "awaiting_observer_approval" ,
515513 "observer_in_progress" ,
@@ -538,8 +536,7 @@ def sweep_deferred_gaps(bot, state: dict) -> bool:
538536 pull_request , _ = _read_api_payload (bot , f"pulls/{ issue_number } " )
539537 if not isinstance (pull_request , dict ) or str (pull_request .get ("state" , "" )).lower () != "open" :
540538 continue
541- deferred_gaps = gap_bookkeeping ._deferred_gaps (review_data )
542- for source_event_key in list (deferred_gaps ):
539+ for source_event_key in gap_bookkeeping ._deferred_gap_keys (review_data ):
543540 if _purge_bot_authored_comment_gap (bot , review_data , source_event_key ):
544541 changed = True
545542 discovered_comments , comments_complete = _discover_visible_comment_events (bot , issue_number , review_data )
@@ -572,7 +569,7 @@ def sweep_deferred_gaps(bot, state: dict) -> bool:
572569 submitted_at = discovered ["source_created_at" ]
573570 if _should_skip_discovered_key (bot , review_data , source_event_key , ("reviewer_review" ,)):
574571 continue
575- existing_gap = gap_bookkeeping ._deferred_gaps (review_data ). get ( source_event_key , {} )
572+ existing_gap = gap_bookkeeping ._get_deferred_gap (review_data , source_event_key )
576573 workflow_file = ".github/workflows/reviewer-bot-pr-review-submitted-observer.yml"
577574 workflow_runs = _fetch_workflow_runs_for_file (bot , workflow_file , "pull_request_review" )
578575 run_correlation = deferred_gap_diagnosis .correlate_candidate_observer_runs (
0 commit comments