An axis I thought I had dropped by choice
When I expanded my daily fortune post to publish simultaneously to Korean, English, and Japanese accounts, I gave each locale a different set of content axes. Korean got all of them, Japanese got star signs and the Chinese zodiac, English got star signs only. I judged that the zodiac and saju didn't fit Western readers, so I left them out of English.
At the time I treated that purely as a content call. I knew it was a judgment, not a measurement, and I assumed it was something I could reverse later once data came in.
Then, while adding a new dream-interpretation axis, I opened up English zodiac at the same time, and it turned out the situation was different. Publishing zodiac content on the English account crashed. The zodiac name table (ZOD_NAME) had no English keys, and the caption strings (STR) and hashtags (TAGS) had no English entries for the zodiac axis either.
If your project has places where you decided "this locale doesn't use this feature," is that really a decision not to use it, or is it a place that breaks the moment you try?
Why nothing had happened until now
Since zodiac wasn't in the English account's publishing set, the normal loop never walked that path. A per-locale name table with a missing key says nothing until something actually looks the key up. Missing mappings are quiet, and the only reason they're quiet is that nobody calls them.
So the sentence "English doesn't do zodiac" carried two meanings at once. On the surface it was a content decision. Underneath, it was a code state: English zodiac could not run. If I had looked at performance later and decided to reverse the call, the first thing I would have met was a crash.
Why the dream axis was cheap
The actual purpose of this commit was a new content axis: dream interpretation. I picked 8 high-search symbols (snake, teeth, water, money, poop, fire, baby, pig) as DREAM_KEYS and added interpretations for each in ko/en/ja to the dataset. The content is framed as for fun and reference only.
I didn't build a new render. spec_dream reuses the existing fortune layout: the interpretation goes where the fortune phrase used to be, and the lucky chips hold the interpretation plus a conventional "today's luck" expression. Targeting works as dream:<symbol> for a specific symbol or dream:rotate to cycle, and I added a dream axis to STR/TAGS. I also added dream handling to _disp_name so the caption label shows the locale's own name.
The change came to 64 added lines in generate.py and a 10-line edit in post_daily.py. Because the layout was reused, almost all of the new axis's cost was in the data.
Opening English zodiac in the same spot
Adding the dream axis meant touching the axis lists in STR/TAGS anyway. Right there, the empty English slot for the zodiac axis was visible.
What would you do: add only the dream axis since zodiac is out of scope, or take the chance to bring the axis you'd blocked by judgment into a state where it can at least run?
I chose the latter. I added English names to ZOD_NAME (all 12, Rat through Pig) and added en to the zodiac axis in STR/TAGS. With that, the English account can publish zodiac content, and the earlier crash is resolved. Whether English should actually post zodiac is still a separate judgment, but now that judgment can be made on content grounds alone, not on what the code happens to support.
Verification was 19 tests passing plus rendering the 4 combinations of en/ja × zodiac/dream and checking them by eye.
Self-check
- For each place where you decided a locale "doesn't use" a feature, have you forced that combination once to confirm it renders end to end?
- Do you have anything that checks that locale mapping tables (names, labels, hashtags) have keys for every axis × every locale?
- When you add a new content axis, can you swap data into existing spec slots (phrase, chips) instead of building a new layout?
The honest part
This commit touched only two files, generate.py and post_daily.py, and the test count is the same 19 as before. So I did not add a test that would catch the English zodiac crash again; the check stops at eyeballing 4 combinations. I haven't exhaustively checked whether other axis × locale combinations have the same kind of empty keys. The criterion for the 8 dream symbols was "high-search symbols" and nothing more. As of this record, I don't know how the dream axis will do on the real accounts, or whether I'll turn zodiac back on for English.