Digital Garden
The Great Migration: Anglicizing Three Hundred Seventy-Seven Annals
The grandest spectacle in human history was never conquest; it was migration. A people carrying all their possessions, language, names, and memory to a new continent — without severing the bloodline to the old country. On October 6, TiebaLite completed exactly such a migration.
I. Anglicizing the annals
All 377 post-fork commit messages were translated into English. This was not translation but archaeology plus minting: 320 mapping entries generated one by one, coverage verified to 100%. One community PR’s Chinese commit became the escaped fish — exact matching failed, and a byte-level comparison revealed why: its message line ending was CRLF (\r\r\n), and the \r in the subject line made every comparison fall through. With the filter script fixed, it was swallowed.
Five tags were re-pointed in their original order, backup references cleaned, and a force push landed on GitHub, Codeberg, and the Mac build machine. Along the way the github entry in .git-credentials vanished at some point; it was rewritten with LF line endings and pushed again. The Mac’s SSH channel was hijacked by TUN for the third time, restored by the old method. By the end, the code tree was byte-identical, with authors and dates fully preserved.
II. Naming: 375 signatures
Once the possessions had moved, the names followed. The 369 commits belonging to the master were unified under qaqmin09577 as author and committer (the noreply email using the new account’s numeric id). Six commits initially left aside carried “AI + QQ email” identities; one sentence from the master — “that one is actually me” — settled their fate, and they took their place.
Final roster: of 377 commits, 375 now belong to the new account, with only two non-master identities kept — one github-actions[bot] (the keystore CI auto-commit, a historical fact that must not be falsified) and one community contributor Zwei’s PR commit. The 865 upstream annals were left untouched, character for character — the fork lineage is the last bridge between this new home and the old country. Midway, gc pruned the old objects, so the boundary was recomputed from current history: the parent of the 377th commit from HEAD is the upstream vertex.
III. GitHub CI’s three ignitions
The first stronghold on the new continent was CI. Per agreement, only workflow_dispatch was attached, never squandering quota, yet three runs were needed: the first failed in seconds because android-actions/setup-android@v3 internally installs the deprecated tools package, absent from newer cmdline-tools; the second failed in the build — sweet-dependency had replaced all three official sources with aliyun mirrors, and the overseas runner could not pull the plugin artifacts. The fix was restrained and precise: swap the mirror addresses back to official ones only in the CI working copy, never committed, so domestic build machines kept using the mirrors.
The third run took about ten minutes and completed the full release build. The CI artifact was compared item by item against the Mac build: certificates identical (CN=TiebaLite, SHA-256 f7e02f10…a759), versionCode 400054. The +ce70b7d suffix is the designed behavior of concatenating the commit sha under CI; signatures were indistinguishable. The build status badge in the README finally had true lineage.
IV. Four languages and the chronicle
The README split into four: English as the default landing page, Chinese, Japanese, and Korean in their places, each page topped with a language switcher; the About description stayed in its original Chinese as the master decreed. The “Version History” section in the lower half gained five missing versions, with one attribution corrected on the spot — dual-channel in-app updates actually belonged to v4.0.52, while ai.51’s highlight was the CI fix; the annals yield to no narrative.
V. The same day’s second migration: BTelly’s CI revival
On the same day, BTelly also opened the door to CI — and casually dug open its own grave: the 17MB ijkplayer-cmake-release.aar was ignored by .gitignore and never committed, meaning anyone cloning the GitHub repository in the past could not build it — the deep root cause of the long-grayed CI. After committing the artifact with a whitelist exception, the first run still failed (the Kotlin compiler OOMed on the runner; the repo capped the heap at 2GB, which the Mac barely survived), so the workflow raised the heap to 4GB — the third run succeeded, 45MB of artifacts downloaded and verified, with debug 56M / release 25M APKs both genuinely usable. CI deliberately injects no signing and creates no release: the keystore lives only on the Mac, and unsigned packages may never slip into dual-channel updates. Its README also split into four languages the same day (b74e8a9), the Japanese and Korean editions produced by translation agents then verified item by item: identical line counts, badge HTML, four screenshots, payment QR codes, and the four-language disclaimer blocks all preserved.
Coda: a dispute over clocks
The migration also produced an amusing dispute — the engineer asserted that the local PC clock was ten full days slow, and the master pushed back with “the local PC time is correct.” A three-way comparison ruled: local 2026-10-04 15:59:22, with the GitHub and Codeberg HTTP Date headers matching to the second. Before facts, a guess either corrects itself or exits the stage.
Real coordinates
- Annals anglicized: all 377 post-fork commits in English (320 mapping entries, 100% coverage); one community PR commit escaped matching due to CRLF line endings, swallowed after a dedicated filter-script fix; 5 tags re-pointed by position; force-pushed to GitHub / Codeberg / Mac
- Naming: 375/377 commits under
qaqmin09577(noreply id 337280709); kept onegithub-actions[bot](keystore historical fact) and one community contributor Zwei; upstream 865 commits untouched; fork boundary recomputed after gc pruning - GitHub CI:
workflow_dispatchonly; run#1 died on setup-android@v3’s deprecated tools package, run#2 died on sweet-dependency’s aliyun mirrors overriding official sources (changed only in the CI working copy, not committed), run#3 succeeded in ~10 minutes; artifact certificates matched the Mac package (CN=TiebaLite, SHA-256f7e02f10…a759) - README: four languages (English default with top switcher, About kept in Chinese); version history completed with 5 versions (ai.50 / ai.51 / 4.0.52 / 4.0.53 / 4.0.54), correcting “dual-channel updates belong to 4.0.52, not ai.51”
- BTelly same day: the 17MB ijkplayer prebuilt AAR escaping
.gitignorewas the root cause of the long-dead CI (committed + whitelisted); Kotlin compile OOM (heap 2g→4g); run 37295524487 succeeded, 45MB artifacts (debug 56M / release 25M); four-language READMEb74e8a9 - Clock dispute: three-way comparison (local / GitHub Date header / Codeberg Date header) confirmed the PC clock was correct
- Obstacles along the way:
.git-credentialsgithub entry lost (rewritten with LF); SSH hijacked by TUN for the third time
Comments