From aa351f86d913df8ebba11a5372e2bd2e1cdc0d3d Mon Sep 17 00:00:00 2001 From: user1823 <92206575+user1823@users.noreply.github.com> Date: Thu, 25 Sep 2025 19:01:32 +0530 Subject: [PATCH] Fix/Ensure fuzz doesn't go backward during rescheduling Fixes https://github.com/ankitects/anki/issues/2694 --- rslib/src/scheduler/fsrs/memory_state.rs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/rslib/src/scheduler/fsrs/memory_state.rs b/rslib/src/scheduler/fsrs/memory_state.rs index 420ead5a3..ce918c5c4 100644 --- a/rslib/src/scheduler/fsrs/memory_state.rs +++ b/rslib/src/scheduler/fsrs/memory_state.rs @@ -136,6 +136,15 @@ impl Collection { let deckconfig_id = deck.config_id().unwrap(); // reschedule it let original_interval = card.interval; + // This should ideally use lastIvl from the latest revlog entry. + // days_elapsed is used for performance reasons. + let greater_than_last = |interval: u32| { + if interval > days_elapsed { + days_elapsed + 1 + } else { + 0 + } + }; let interval = fsrs.next_interval( Some(state.stability), desired_retention, @@ -146,7 +155,7 @@ impl Collection { .and_then(|r| { r.find_interval( interval, - 1, + greater_than_last(interval as u32).max(1), req.max_interval, days_elapsed as u32, deckconfig_id, @@ -157,7 +166,7 @@ impl Collection { with_review_fuzz( card.get_fuzz_factor(true), interval, - 1, + greater_than_last(interval as u32).max(1), req.max_interval, ) });