@@ -729,6 +729,70 @@ def _effective_response_with_cadence(bot, issue_number: int, review_data: dict,
729729 return effective_response , cadence , reminder_scan
730730
731731
732+ def backfill_transition_warning_if_present (bot , state : dict , issue_number : int ) -> bool :
733+ active_reviews = state .get ("active_reviews" ) if isinstance (state , dict ) else None
734+ review_data = active_reviews .get (str (issue_number )) if isinstance (active_reviews , dict ) else None
735+ if not isinstance (review_data , dict ):
736+ return False
737+ if not isinstance (review_data .get ("current_reviewer" ), str ) or not review_data ["current_reviewer" ].strip ():
738+ return False
739+ existing_warning = review_data .get ("transition_warning_sent" )
740+ if isinstance (existing_warning , str ) and existing_warning .strip ():
741+ return False
742+ try :
743+ issue_snapshot_result = bot .github .get_issue_or_pr_snapshot_result (issue_number )
744+ except (AssertionError , AttributeError , RuntimeError ):
745+ return False
746+ issue_snapshot = issue_snapshot_result .payload if issue_snapshot_result .ok else None
747+ if not isinstance (issue_snapshot , dict ):
748+ return False
749+ if str (issue_snapshot .get ("state" , "" )).lower () == "closed" :
750+ return False
751+
752+ response_state = bot .adapters .review_state .compute_reviewer_response_state (
753+ issue_number ,
754+ review_data ,
755+ issue_snapshot = issue_snapshot ,
756+ )
757+ _effective_response , cadence , _reminder_scan = _effective_response_with_cadence (
758+ bot ,
759+ issue_number ,
760+ review_data ,
761+ response_state ,
762+ )
763+ receipt = cadence .warning_receipt
764+ if receipt is None or receipt .receipt_kind != "warning" :
765+ return False
766+ if receipt .source not in {"comment_scan" , "live_comment_scan" }:
767+ return False
768+ if not isinstance (receipt .created_at , str ) or not receipt .created_at .strip ():
769+ return False
770+
771+ changed = False
772+ if review_data .get ("transition_warning_sent" ) != receipt .created_at :
773+ review_data ["transition_warning_sent" ] = receipt .created_at
774+ changed = True
775+ delivery_result = build_reminder_delivery_persistence_result (
776+ issue_number = issue_number ,
777+ reviewer = receipt .reviewer ,
778+ head_sha = receipt .head_sha ,
779+ cycle_key = receipt .cycle_key ,
780+ scope_key = receipt .scope_key ,
781+ receipt_kind = "warning" ,
782+ comment_posted = False ,
783+ comment_id = receipt .comment_id ,
784+ comment_created_at = receipt .created_at ,
785+ state_save_attempted = False ,
786+ state_save_succeeded = False ,
787+ recovered_receipt = receipt ,
788+ diagnostic_reason = "live_warning_receipt_backfill" ,
789+ )
790+ changed = _store_reminder_delivery_result (review_data , delivery_result ) or changed
791+ if changed :
792+ bot .collect_touched_item (issue_number )
793+ return changed
794+
795+
732796def _find_existing_warning_comment (
733797 bot ,
734798 issue_number : int ,
0 commit comments