From 57b4dc0ce9874ac1325bd967d4c2213eef86df5f Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 5 Nov 2025 17:56:44 +0000 Subject: [PATCH] CLAUDE: Fix critical bug preventing Monday freeze/thaw from executing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Problem The weekly freeze/thaw system had a state flag initialization bug that prevented both Monday freeze operations and Saturday thaw operations from executing. ## Root Cause (Introduced in commit 07f69eb on Oct 25, 2025) The `weekly_warning_sent` boolean flag was being used for TWO different purposes: 1. Preventing duplicate freeze/thaw operations (state machine) 2. Preventing duplicate error notifications The flag was initialized to `False`, but the Monday freeze condition required it to be `True`: - Line 205: `if ... and self.weekly_warning_sent:` (required True) - Line 160: `self.weekly_warning_sent = False` (initialized to False) This created a deadlock: - Monday freeze: Never ran (flag was False, needed True) - Saturday thaw: Never ran (freeze flag in DB never set to True) ## Impact - First failure: Monday October 27, 2025 - Affected weeks: 2+ weeks of missed freeze/thaw operations - Result: Week did NOT increment, transactions did NOT execute ## Solution Separated the two concerns and replaced boolean flag with week tracking: 1. **Deduplication**: Track `last_freeze_week` and `last_thaw_week` (int | None) - Monday: Execute if `last_freeze_week != current.week` - Saturday: Execute if `last_thaw_week != current.week` - Prevents duplicate operations during same hour (loop runs every minute) 2. **Error notifications**: Separate `error_notification_sent` boolean flag - Only used for preventing duplicate error notifications - Clear separation of concerns ## Validation Created and ran validation script simulating 7 scenarios across multiple weeks: - ✅ Monday freeze executes on first check - ✅ Monday freeze skips on subsequent checks same hour - ✅ Saturday thaw executes on first check - ✅ Saturday thaw skips on subsequent checks same hour - ✅ Next Monday freeze executes for new week - ✅ Week numbers increment correctly (19→20→21→22) - ✅ All state transitions work as expected ## Files Changed - tasks/transaction_freeze.py:157-167 - Separated state tracking from error flags - tasks/transaction_freeze.py:211-231 - Fixed freeze/thaw conditions with week tracking - tasks/transaction_freeze.py:248-250 - Updated error notification flag name 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- tasks/transaction_freeze.py | 40 +++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/tasks/transaction_freeze.py b/tasks/transaction_freeze.py index 18f5c16..9b4951f 100644 --- a/tasks/transaction_freeze.py +++ b/tasks/transaction_freeze.py @@ -157,7 +157,14 @@ class TransactionFreezeTask: def __init__(self, bot: commands.Bot): self.bot = bot self.logger = get_contextual_logger(f'{__name__}.TransactionFreezeTask') - self.weekly_warning_sent = False # Prevent duplicate error notifications + + # Track last execution to prevent duplicate operations + self.last_freeze_week: int | None = None + self.last_thaw_week: int | None = None + + # Track error notifications separately + self.error_notification_sent = False + self.logger.info("Transaction freeze/thaw task initialized") # Start the weekly loop @@ -202,16 +209,27 @@ class TransactionFreezeTask: ) # BEGIN FREEZE: Monday at 00:00, not already frozen - if now.weekday() == 0 and now.hour == 0 and not current.freeze and self.weekly_warning_sent: - self.logger.info("Triggering freeze begin") - await self._begin_freeze(current) - self.weekly_warning_sent = False + if now.weekday() == 0 and now.hour == 0 and not current.freeze: + # Only run if we haven't already frozen this week + # Track the week we're freezing FROM (before increment) + if self.last_freeze_week != current.week: + self.logger.info("Triggering freeze begin", current_week=current.week) + await self._begin_freeze(current) + self.last_freeze_week = current.week # Track the week we froze (before increment) + self.error_notification_sent = False # Reset error flag for new cycle + else: + self.logger.debug("Freeze already executed for week", week=current.week) # END FREEZE: Saturday at 00:00, currently frozen - elif now.weekday() == 5 and now.hour == 0 and current.freeze and not self.weekly_warning_sent: - self.logger.info("Triggering freeze end") - await self._end_freeze(current) - self.weekly_warning_sent = True + elif now.weekday() == 5 and now.hour == 0 and current.freeze: + # Only run if we haven't already thawed this week + if self.last_thaw_week != current.week: + self.logger.info("Triggering freeze end", current_week=current.week) + await self._end_freeze(current) + self.last_thaw_week = current.week + self.error_notification_sent = False # Reset error flag for new cycle + else: + self.logger.debug("Thaw already executed for week", week=current.week) else: self.logger.debug("No freeze/thaw action needed at this time") @@ -228,9 +246,9 @@ class TransactionFreezeTask: ) try: - if not self.weekly_warning_sent: + if not self.error_notification_sent: await self._send_owner_notification(error_message) - self.weekly_warning_sent = True + self.error_notification_sent = True except Exception as notify_error: self.logger.error(f"Failed to send error notification: {notify_error}")