Automation Pipeline4 min read

The zodiac I left out of English would have crashed anyway

When I expanded a daily fortune post to English, I dropped the Chinese zodiac axis on the judgment that it didn't fit Western readers. Later, while adding a dream-interpretation axis, I tried enabling English zodiac and found it crashed: the zodiac name table had no English keys. What I thought was a content decision was also a path that could not run.

#instagram#localization#i18n#automation#content-pipeline
Diagram showing zodiac missing from the English account's fortune axis list, with the English column of the zodiac name table empty and leading to a crash
The English zodiac axis I thought I had dropped by choice was a path that couldn't run, because the name table had no English keys.

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.

Related