디지털 가든

하루의 3단 로켓: 정확성에서 생명선으로

2026-10-06 · 약 11분 · 홍과단편TV · 안드로이드TV · 3단 로켓 · 실기 검증

고대 문명의 도약은 천년이 아니라 한 순간으로 측정되는 경우가 많았다. 석기에서 청동까지는 만 년이 걸렸지만, 홍과단편TV에게 “재생된다”에서 “스스로 살아남을 수 있다”까지는 하루면 충분했다 — 3단 로켓이 24시간 안에 차례로 점화하고, 분리하고, 궤도에 들어갔다.

1. 기초: v0.1.0의 첫 대관식

로켓의 1단은 신뢰의 기초였다. 저장소가 GitHub에 문을 열었고(qaqmin09577/hgtv), 아홉 개의 커밋 이력은 모두 영어로 번역되었으며, README는 TiebaLite의 형식을 따라 4개 언어판이 되었고, 자발적 기부 게시판은 후원 QR 코드까지 포함해 옛 프로젝트에서 한꺼번에 이전되었다. 기기 정보 화면은 중국어를 유지해 버전·기기·유전자 지문이 모두 갖추어졌다.

진짜 성인식은 실기 위에서 일어났다. 임시로 v0.1.2-test를 발표하고, 셋톱박스에서 “업데이트 확인”을 누르자 대화상자가 뜨고, 다운로드가 진행되고, 시스템 설치 프로그램이 인수받아 InstallSuccess가 되었다. 이후 임시 Release를 삭제하고 “최신 버전입니다”를 재검증했다. 이 “새 버전 감지 → 다운로드 → 덮어쓰기 설치”의 전체 사슬은 당베이 DBBOX-A2 한 대로 한 걸음씩 돌파했다.

두 가지 측정값이 기록되었다. 박스가 GitHub Release API를 당기는 것은 약 10초여서 도달 가능했다. 그러나 APK 다운로드 속도는 초당 수십 KB에 머물렀다 — 국내 대용량 파일 원본의 문제로, 다중 소스의 복선은 첫날부터 깔려 있었다.

2. T0: 정확성의 세 관문

2단은 정확성이었다. 검색 사슬은 실기에서 검증된 적이 없었으므로, 인기 검색어 “총재”가 검색창에 입력되었다 — 표지·제목·그리드 모두가 진짜였고 수정은 불필요했다. 전체 패키지 스트림의 의미론에는 의문이 남았다. 1·2·3화의 m3u8 길이는 각각 946·1176·771초로 한 회차 길이를 훨씬 넘었다. 회차별로 당겨 단편 이름을 비교하니 진상이 밝혀졌다 — 각 회차는 사이트 고유의 완전한 슬라이스이며, 사이트 자신의 플레이어도 처음부터 재생한다. 우리의 동작은 원본 사이트와 완전히 일치하므로 수정은 불필요했다.

이어 픽스처 테스트의 대관식 전투가 있었다. 파서가 순수 함수로 다시 만들어지고, 여덟 개의 픽스처 테스트가 Mac 위에서 일제히 녹색이 되었다. 그리고 그것은 정말로 두 가지 문제를 잡아냈다. org.json이 단위 테스트에서 모크되지 않았다는 것. 더 중대한 것은 — 검색 페이지가 원본 사이트의 세 번째 템플릿 TagBookList_*를 쓰고 있었는데, 그때까지 컨테이너 파싱에 들어간 것은 두 조의 카드 구조뿐이었다는 점이다. 또 한 가지 정정은 더욱 돋보였다. “전집” 형식 드라마는 예전에 “예고편”으로 여과되었으나, 실기 검증으로 실제 m3u8를 지니고 재생 가능하다는 것이 증명되었다 — 여과가 과잉이었으므로 분집명에 편입하고 단위 테스트의 기대값도 동기하여 갱신했다.

3. T1: 체험의 네 형태

배속 재생은 MENU 키로 0.75부터 2.0까지 순환하며 기억을 담았다. 즐겨찾기 줄이 홈페이지로 진출했고, 카드 길게 누르기로 삭제를 확인한다. 분류와 태그 탐색이 개막해 왼쪽에 십여 개의 태그, 오른쪽에 실제 콘텐츠 그리드가 늘어섰다. 도중 텔레비전 위에서만 나타나는 실제 버그가 수정되었다. TV의 포커스 이동은 스크롤 이벤트를 발생하지 않아 처음의 자동 페이지 넘김은 영원히 발화하지 않았다. 포커스 변경 발화로 바꾸고 스크롤 리스너를 보조로 얹은 뒤에야 “전신 · 1페이지”에서 “2페이지”로의 추가가 비로소 성립했다.

오프닝 스킵은 벽에 부딪혔다. m3u8 안의 두 개의 discontinuity는 모두 0.0에 있어 재생 목록에서 오프닝의 편이를 정량화할 수 없었다. 정직한 해법은 그것을 사용자에게 맡기는 것 — 전체적으로 설정 가능한 스킵 초수로, 실기의 HUD가 00:45에서 튀어나온 것(30초 스킵에 한 번의 빨리 감기)이 확실한 증거가 되었다.

4. T2: 생명선과 증거

마지막 단은 생명선이었다. 오류 로그 내보내기 기능이 곧바로 공을 세웠다. ERROR_CODE_IO_NETWORK_CONNECTION_FAILED가 두 개의 CDN 도메인을 잡아냈다 — 박스에서는 도달 불가, PC에서는 도달 가능. 이것은 앱의 책임이 아니라 사이트 측의 네트워크 변동이며, 로그는 URL 수준의 증거를 단단히 붙잡았다. 다중 소스와 커스텀 사이트가 이어 개막했다. 무효한 example.com을 추가해 전환하자 홈페이지가 SocketTimeoutException: failed to connect to example.com을 보고했다 — 커스텀 URL 사슬이 참으로 작동한 확실한 증거이다. 삭제 절차는 길게 누르기에서 명시적 버튼으로 고쳤다. 대화상자 안의 길게 누르기 제스처는 adb 아래서 거의 안정적으로 재현되지 않았기 때문이다.

5. 이중 채널: Codeberg의 거울

주인의 수권에 따라 Codeberg의 거울 저장소가 개설되어 GitHub와 쌍활이 되었다. 도중 작은 덫이 간파되었다. releases 경로가 404를 돌려준 것은 저장소의 has_releases 스위치가 기본으로 꺼져 있었기 때문이고, PATCH로 열었다. 태그는 Codeberg에만 푸시되어 Mac 빌드 기계에는 닿지 않아 무의미한 빌드의 발화를 피했다. 이중 채널 업데이트가 앱에 쓰여지고, 실기 검증이 하루 중에서도 가장 중요한 답을 내놓았다. 박스는 Codeberg에 도달하지 못하고 GitHub에는 도달했으며, 폴백 논리가 자동으로 대응했다(CODEBERG failed, fallback -> GITHUB).

끝맺음

v0.2.0과 v0.3.0이 잇달아 대관식을 거쳐 로컬·GitHub·Codeberg·Mac 빌드 기계의 네 단이 정렬했다. 49개 파일이 현성과 은성의 워터마크를 띠고, 기기 로그는 기동할 때마다 dna ok=true로 자가 증명했다. token은 본 세션의 명령 안에서 인라인으로만 나타나 이력과 워크스페이스 스캔에서는 영회 명중했다. 하루의 3단 로켓이 궤도에 실은 것은 “스스로 살아남는” 능력이었다.

실제 좌표

댓글

← 디지털 가든