Why my hard interval is stuck at 2 days?

I like to keep hitting hard for all my cards, but for some of them, the hard button is stuck at 2 days:


So if I keep pressing it, it comes back again in 2 days. And the hard button will be 2 days again.

Why some cards have a hard button which keeps increasing while few others are stuck at 2 days?

These are my deck settings:

  1. image

  2. image

1, image

Is your case related to this one?

The code is supposed to ensure the next interval is always one day longer than the previous one - at least with the v2 scheduler, this should happen after any fuzzing is applied. I presume the card history reflects repeated 2 day delays, and you have ruled out add-ons?

I am already using Scheduler v2. I do not think I have any addons which change a card history.

I tried to reproduce this problem by exporting those cards with history, but when I import them, they do not show this behavior.

I forgot the check the card history, to confirm they were repeating two days. I think this is the right card:

It looks like I had hit good (3) too many times before starting hitting hard (2). Next time I see a card as the one on the first post, I will look into their history.

Off-topic, I found that card where I keep hitting hard, but the hard interval does not increase:

That card, was my last card for reviewing today. So, it keeps repeatedly show up. Making it easy to hit hard (2) too many times in a row.

Is there something to make the button hard (2) not to repeat itself and increase to a day instead of repeating the same 15 minutes period?

I tried reading your solution but it looks like it requires an Addon to be installed. I rather have no addons messing with my review history/scheduling.

The hard button in (re)learning mode repeats the current learning step, so that is not unexpected.

I just found this card giving me 2 days:

After answering it, this was its history:

Then, I moved that card to a new deck ttt and created a filtered deck to review its cards ahead. And when the card showed up, it was with a hard (2) interval of 1 day:

After answering it with hard(2), the card showed up with this history:

Then, I rebuild the filtered deck and the card again showed up with a hard(2) interval of 1:

After answering it with hard(2), the card showed up with this history:

I repeated the process, and card still showing up with hard(2) as 1 day:

I am not sure if it helps but the card has 6 siblings:

This looks normal to me. You’ve reviewed the card ahead of schedule, and even with the shorter delay, you found it hard. You can see the code in question in _earlyReviewIvl()

I just found another card with 2 days hard(2):

After answering hard (2), this was the history of the card:

After seeing another card with a hard (2 days), it also looks normal. Because my last interval was 1 day.

I am used to seeing a hard interval of 2 days, an easy interval of something like 5 or 7 days with an easy interval of something like 15 or 20 days, perhaps a month.

It just looks scary drop into a card and to see that my hard interval is 2 days, while my good interval is 1.2 months, and the easy interval is 3.3 months.

    # next interval for card when answered early+correctly
    def _earlyReviewIvl(self, card: Card, ease: int) -> int:
        assert card.odid and card.type == CARD_TYPE_REV
        assert card.factor
        assert ease > 1

        elapsed = card.ivl - (card.odue - self.today)

        conf = self._revConf(card)

        easyBonus = 1
        # early 3/4 reviews shouldn't decrease previous interval
        minNewIvl = 1

        if ease == BUTTON_TWO:
            factor = conf.get("hardFactor", 1.2)
            # hard cards shouldn't have their interval decreased by more than 50%
            # of the normal factor
            minNewIvl = factor / 2
        elif ease == BUTTON_THREE:
            factor = card.factor / 1000
        else:  # ease == BUTTON_FOUR:
            factor = card.factor / 1000
            ease4 = conf["ease4"]
            # 1.3 -> 1.15
            easyBonus = ease4 - (ease4 - 1) / 2

        ivl = max(elapsed * factor, 1)

        # cap interval decreases
        ivl = max(card.ivl * minNewIvl, ivl) * easyBonus

        ivl = self._constrainedIvl(ivl, conf, prev=0, fuzz=False)

        return ivl