디지털 가든

대이동: 377개 사서의 영어화

2026-10-06 · 약 11분 · TiebaLite · 이력 재작성 · CI · 오픈소스 거버넌스

인류사에서 가장 장관인 광경은 정복이 아니라 이동이었다. 모든 살림·언어·성명·기억을 지고 새 대륙으로 건너가면서도 고토와의 혈맥을 끊지 않는 것. 10월 6일, TiebaLite는 바로 그러한 이동을 완수했다.

1. 사서의 영어화

fork 이후의 377개 커밋 메시지는 모두 영어로 번역되었다. 이것은 번역이 아니라 고고와 주조였다. 320개의 대응표를 하나씩 생성하고, 포괄률을 100%까지 검증했다. 도중 커뮤니티 PR의 한 개 중국어 커밋이 빠져나간 물고기가 되었다 — 엄밀 일치가 실패하고, 바이트 단위 비교에서 이유가 판명되었다. 그 메시지 줄의 줄끝은 CRLF(\r\r\n)였고, 주제 줄 속의 \r가 모든 비교를 떨어뜨렸던 것이다. 필터 스크립트를 고친 뒤에야 그것은 삼켜졌다.

다섯 태그는 원래 순서에 따라 하나씩 가리켜 세우고, 예비 참조를 쓸고, GitHub·Codeberg·Mac 빌드 기계의 세 단으로 강제 푸시했다. 도중 .git-credentials 안의 github 항목이 언제 잃어버렸는지, LF 줄끝으로 다시 쓴 뒤에 재푸시했다. Mac의 SSH 회선은 세 번째로 TUN에 납치당했고, 옛 방법으로 복구했다. 끝맺은 시점에서 코드 트리는 바이트 단위로 일치하고, 저자와 날짜는 완전히 보존되었다.

2. 주조명: 375개의 서명

살림이 옮겨지고 나서 다음은 성명이었다. 주인에게 속하는 369개 커밋은 저자와 커미터를 qaqmin09577로 통일했다(noreply 메일은 새 계정의 numeric id 사용). 처음에 여섯 개의 “AI + QQ메일” 신분 커밋은 선반 위에 올려두었으나, 주인의 한마디 “이건 사실 나 자신이다”로 그 귀속이 결정되어 곧바로 들어갔다.

최종 명부는 이렇다. 377개 중 375개가 새 계정의 명의에 돌아갔고, 비주인의 신분은 두 개만 남았다 — 하나는 github-actions[bot](keystore의 CI 자동 커밋으로, 고치면 찬조가 되는 역사적 사실), 다른 하나는 커뮤니티 기여자 Zwei의 PR 커밋이다. 상류의 865개 사서는 한 글자도 움직이지 않았다 — fork의 혈맥이야말로 이 새 집과 고토 사이에 걸리는 마지막 다리이다. 도중 gc가 옛 객체를 가지쳐서, 경계는 현재 이력에서 재계산되었다. HEAD에서 377번째를 거꾸로 센 그 부모 커밋이 상류의 정점이다.

3. GitHub CI의 세 번 점화

새 대륙에서 첫 요새는 CI였다. 약속대로 workflow_dispatch만 걸고 할당을 낭비하지 않도록 했지만, 그럼에도 세 번의 실행을 필요로 했다. 첫 번째는 초 만에 패배했다 — android-actions/setup-android@v3가 내부에서 폐기된 tools 패키지를 설치하려 했고, 새 cmdline-tools에는 존재하지 않았다. 두 번째는 빌드에서 패배했다 — sweet-dependency가 세 개의 공식 소스를 모두 aliyun 거울로 교체해 해외 runner가 플러그인의 artifact를 당기지 못한 것이다. 해법은 억제되고 정확했다. CI의 작업 복제 안에서만 거울 주소를 공식의 것으로 돌리고, 결코 저장소에는 넣지 않아, 국내 빌드 기계는 거울을 계속 쓴다.

세 번째는 약 10분 만에 전체 release 빌드를 완료했다. CI 산출물은 Mac 빌드 산출물과 항목별로 비교되었다. 인증서는 완전히 일치하고(CN=TiebaLite, SHA-256 f7e02f10…a759), versionCode는 400054. +ce70b7d 접미사는 CI 환경에서 commit sha를 잇는 설계상 동작이며 서명에 차이는 없다. README 속 빌드 상태 배지는 이때 비로소 진짜 혈통을 얻었다.

4. 4개 언어판과 연대기

README는 넷으로 분열했다. 영어가 기본 입구가 되고, 중국어·일본어·한국어가 각자의 자리를 차지했으며, 각 페이지 꼭대기에 언어 전환란이 놓였다. About의 서술은 주인의 정한 대로 중국어 원형을 유지했다. 아랫부분의 “버전 반복 기록”에는 다섯 개의 결석했던 버전이 보충되었고, 그중 한 곳의 귀속이 그 자리에서 정정되었다 — 이중 채널 앱 내 업데이트는 사실 v4.0.52의 기능이고, ai.51의 요점은 CI의 수정이었다. 사서는 이야기에 양보하지 않는다.

5. 같은 날의 두 번째 이동: b视機의 CI 부활

같은 날, b视機도 CI의 문을 밀어 열었고, 덤으로 자신의 무덤을 파헤쳤다. 17MB의 ijkplayer-cmake-release.aar가 .gitignore에 의해 무시되어 한 번도 저장소에 들어간 적이 없었다 — 이는 GitHub 위의 저장소가 과거 누구에게도 빌드되지 못했다는 뜻이고, 이것이 바로당시 CI가 회색으로 되었던 심층 원인이었다. 산출물을 보충 커밋하고 화이트리스트 예외를 더한 뒤에도 첫 번째 실행은 역시 실패했다(Kotlin 컴파일러가 runner 위에서 OOM했다. 저장소는 힙을 2GB로 눌러두어 Mac에서는 겨우 버텼으나 runner에서는 부족했다). workflow 안에서 힙을 4GB로 끌어올리자 — 세 번째 실행이 성공했고, 45MB 산출물을 내려받아 검증해 debug 56M·release 25M의 두 APK가 모두 참으로 사용 가능했다. CI는 의도적으로 서명을 주입하지 않고 Release도 만들지 않는다 — keystore는 Mac에만 남아, 미서명 패키지가 이중 채널 업데이트에 섞일 틈은 없다. 그 README도 같은 날 4개 언어판으로 분열했고(b74e8a9), 일본어판·한국어판은 번역 에이전트가 산출한 뒤 항목별로 검증되었다. 줄 수는 일치하고, 배지 HTML·네 장의 스크린샷·수금 QR 코드·4개 언어 면책 구역은 모두 원형 그대로 보존되었다.

끝맺음: 하나의 시계 논쟁

이동 도중에는 또 하나 재미있는 논쟁이 일어났다 — 공정병은 로컬 PC의 시계가 꼭 열흘 늦었다고 단언하고, 주인은 “본pc 시간은 정확무오하다”고 밀어냈다. 삼방 대조가 곧바로 판정을 내렸다. 로컬 2026-10-04 15:59:22, GitHub와 Codeberg의 HTTP Date 헤더는 초의 차이도 없었다. 사실 앞에서 추측은 스스로를 정정하거나, 퇴장하거나 둘 중 하나다.

실제 좌표

댓글

← 디지털 가든