Weekend Reels became daily Reels
The script that auto-posts my fortune content had a Reels slot that only ran on weekends. I judged Reels to be the highest-reach format I had, so I decided to run that slot every day.
I couldn't post the same material every day. So I alternated two kinds by date parity: on one set of days, a narrated Reel for one of the 12 zodiac animals; on the other, one of the 60 ilju (the sexagenary day-pillars). For ilju I reused the existing fortune template instead of building a new one. The generator only gained a GAPJA list (the 60-cycle), a spec_ilju, and a kind of the form ilju:<gapja>.
That part looked easy. The problem was the index that decides which sign comes up today. When you put an every-other-day filter on top of a rotation that advances once a day, have you checked whether that rotation ever completes a full cycle?
Where the parity filter collides with the modulus
Call the integer derived from the date o. The first code that comes to mind looks like this.
# simplified illustration
if o % 2 == 0:
kind = ZODIAC[o % 12]
else:
kind = GAPJA[o % 60]There is a trap here. On zodiac days o is always even, and 12 is even. An even number mod 12 is always even, so o % 12 only yields 0, 2, 4, 6, 8, 10. Six of the twelve signs never come up. Ilju has the same problem: on ilju days o is always odd, 60 is even, so o % 60 is always odd. Only 30 of the 60 day-pillars would ever rotate.
Nothing throws an error. Something posts every day, and a few days of output look nicely varied. As long as the parity filter and the rotation modulus share a factor of 2, half the content pool just silently drops out.
What would you do here: change the modulus to something odd, or change the index itself?
I split the index with o // 2
12 and 60 are content counts, so they can't change. I changed the index instead. Parity is decided by o; the rotation index is o // 2.
# simplified illustration
idx = o // 2
if o % 2 == 0:
kind = ZODIAC[idx % 12]
else:
kind = GAPJA[idx % 60]Across even days, o // 2 increases by one each time, and the same holds across odd days. Each kind gets consecutive indices whenever its turn comes, so the parity filter no longer re-filters the index. I ran it over 120 days and verified that all 12 signs and all 60 day-pillars appear at least once. 120 days gives 60 ilju days, which is the minimum span needed to cover the full 60-cycle.
I narrowed the hashtags too
The same commit changed the hashtags. I dropped mega tags like #fortune, #saju, #tarot, and #dailygram (their Korean equivalents). Instead, fortune_tags(kind) puts niche tags for that day's zodiac sign, star sign, or day-pillar at the front, and the total is capped at 12. It moved from a few broad tags attached to everything toward tags that describe that day's specific content, placed first.
Self-check
- If you pick a rotation index with
date % Nbehind a filter like every-other-day, weekday, or parity, have you confirmed the filter's period and N share no common factor? - After adding a rotation, did you stop at "a few days look varied", or did you actually simulate how many days it takes for the whole pool to appear at least once?
- Are you using the same date integer for both "which kind to post" and "which item within that kind"?
The honest part
I caught this before committing; there was no period where the half-coverage rotation actually shipped. What I verified is coverage only: every sign and day-pillar appears within 120 days. Whether daily Reels help reach, and whether dropping mega tags in favor of front-loaded niche tags raises or lowers exposure, I had no data on at the time of this commit. That Reels is my highest-reach format was my own judgment, not something this change measured.