2026.08.26 작업일지 v1.0.0
08:55, 훅 등록을 노드마다 손으로 하던 마지막 수작업이 끊겼다. 20:39, 세 번째 맥이 재부팅됐다 — 6분 사이에 세 대가 전부 꺼졌다 켜졌다. 00:1x, 아침에 첫 커밋을 찍은 앱이 스토어 심사장에 들어갔다.
오늘은 두 가닥이 꼬였다. 한 가닥은 새 앱 밥먹자 — 아침 스캐폴드부터 자정 넘어 비공개 테스트 심사 제출까지, 페이즈 여섯 개를 하루에 통과했다. 다른 가닥은 함대 쪽 — 아침엔 가짜 경보 셋을 정리했고, 저녁엔 정전으로 보이는 동시 재부팅이 세 대를 흔들었고, 밤엔 테스트가 진짜 텔레그램으로 새는 구멍과 배차가 두 번 사라지는 구멍이 연달아 드러났다. 전부 그날 안에 코드로 닫혔다.
1. 잔소리 셋을 지우지 않고 좁혔다
아침 한 시간(10:17~10:53)에 가짜 경보 세 종이 연속으로 닫혔다. 지시는 「소음 다 없애자」였지만, 세 건 모두 알림을 삭제하는 대신 발생 조건만 좁히는 방향으로 갔다.
배차 카드 중복은 사람이 직접 시킨 턴의 자기 배차만 생략하고, 기계가 스스로 만든 일감의 카드는 남겼다 — 그걸 지우면 안 보이는 구멍이 생긴다. 「메시 발신 무착지」 경보는 「원래 목적지가 없는 경로(정상)」와 「있어야 하는데 설정이 빠진 경우(진짜 고장)」를 갈라 전자만 침묵시켰다. 세 번째는 진단기가 터미널 상자의 테두리 문자 │ 를 “남은 텍스트”로 오독하던 것 — 판정을 고치되 진짜 미전달 감지는 살렸다.
배운 것 — 소음 정리의 정답은 알림 삭제가 아니라 판정력 향상이다. 지우면 조용해지지만, 좁히면 정확해진다.
2. 밥먹자 — 아침에 시작해 자정에 심사장까지
16:42 첫 스캐폴드 커밋에서 다음 날 00:1x 심사 제출까지, PR 일곱 개(#2~#8)가 전부 머지됐다. 백엔드(Workers/D1), 화면 실서버 연결, 웹뷰·약관 3종 분리동의·신고 UI, 광고 스택 + 광고제거 구매(₩3,300), 실 광고 ID 배선, 스토어 자산까지.
반전이 둘 있었다. 첫째, P1 을 다 만들고 나서야 원격 저장소가 한 달 전에 이미 있었다는 게 드러났다. 로컬에 클론이 없어 실측에서 빠진 것. 오늘 만든 스캐폴드는 통째로 중복이 돼 보존 브랜치로 치우고, 원격 정본 위에 다시 쌓았다.
둘째가 무거웠다. 밤 23:1x, 심사 제출 직전 에뮬레이터 검증에서 릴리즈 빌드가 켜자마자 죽었다. 코드 압축기(R8)가 광고 SDK 가 쓰는 백그라운드 부품의 생성 경로를 “안 쓰는 코드”로 오판해 잘라낸 것. 이미 트랙에 올려둔 첫 빌드는 실기기에서 죽는 산출물이었고, 에뮬레이터 실측이 없었다면 그대로 심사에 갔다. keep 두 줄로 수리하고 재빌드해, 파일 지문(sha256)이 콘솔과 일치하는 걸 확인한 뒤에야 제출 버튼을 눌렀다.
배운 것 — 빌드가 성공했다는 사실은 앱이 켜진다는 증거가 아니다. 산출물은 실행해 본 뒤에만 배송한다.
3. 한장궁합에 진짜 돈이 흘렀다
저녁 사이 한장궁합 결제 라인이 처음으로 실돈을 통과시켰다. 19,900원 실결제 승인(confirm 200) → 결과 화면과 메일이 안 나오던 구멍 복구 → 영수증에 이름이 실리게 손질 → 그리고 지시대로 전액 환불(취소 완료, 잔액 0원 실측)까지 한 바퀴. 테스트 결제였지만, 주문·승인·리포트·취소가 실서버에서 왕복한 첫 날이다.
4. 정전이 만든 시험 — 신뢰 질문과 낡은 브랜치의 이중 결박
20:37:42, 20:38:02, 20:39:43. 세 맥의 부팅 시각이다. 6분 안에 함대 전체가 꺼졌다 켜졌고(정전 추정), 워커 두 대의 답장 라인이 죽었다.
원인은 예상 밖이었다. 재부팅 후 첫 기동에서 두 노드의 Claude 가 “이 폴더를 신뢰합니까?” 확인 질문에 걸려 세션 자체를 시작하지 못하고 있었다. 감시견은 정확히 짖었지만, 감시견의 처방(창 재생성)은 이 병에 원리적으로 무효다 — 재생성해도 같은 질문이 또 뜬다.
한 대는 결박이 하나 더 있었다. 프로그램 사본이 이미 머지돼 원격에서 삭제된 옛 작업 브랜치에 남아 있었고, 무결성 게이트가 “정본 위치가 아니다”라며 모든 복구 재시작을 막았다. 워킹트리는 깨끗했다. 더러워서 막힌 게 아니라 낡아서 막힌 것이다. git switch main 한 줄과 확인 버튼 하나로 두 대가 살아났고, 세 대의 감시 로그가 같은 기준선으로 수렴하며 상황이 닫혔다.
배운 것 — 자동 복구는 “다시 시작하면 낫는 병”만 고친다. 시작 전에 사람 질문에 걸리는 병은 그 바깥에 있고, 그런 클래스가 있다는 것 자체를 알아야 대비가 된다.
5. 유령 카드, 그리고 바쁘면 삼켜지고 한가하면 안 먹히는 배차
21:47 과 21:55, 폰에 배차 카드 두 장이 떨어졌다. 한 달 전 티켓 번호가 박힌, 오늘 아무도 쏜 적 없는 카드였다. 추적해 보니 낮의 로스터 복귀 작업이 돌린 픽스처(테스트 대본)가 스텁 없이 라이브로 실행돼 진짜 텔레그램 발신을 한 것. 장부의 발신자 필드가 실행 노드가 아닌 다른 노드 이름으로 찍혀 있었다 — 테스트가 신원까지 오염시키고 있었다는 뜻이다. 「테스트는 부작용이 없어야 한다」는 규칙은 있었지만 강제 게이트가 없었고, 그날 밤 봉인 코드가 붙었다: 픽스처 경로 실토큰 차단 + 신원 오염 시 발신 거부.
같은 밤, 새 배차가 두 번 사라졌다. 1차는 대상 노드가 긴 턴을 도는 중에 끼어들어 삼켜졌고, 2차는 반대로 노드가 한가해서 — 전달은 됐는데 그걸 집어들 턴이 아예 없어서 — 영영 안 먹혔다. 바쁘면 삼켜지고 한가하면 안 먹힌다. 결국 터미널에 한 줄 쳐서 깨우는 사람 손이 이겼고, 그 손동작이 그대로 코드가 됐다: 주입 후 60초 미소비면 채널이 스스로 한 번 깨운다. 야간 워커가 그 수리를 맡아 자정 넘어 머지까지 끝냈다.
6. 그래서 뭐가 남았나
티켓 서른네 건 종결, 자동화 저장소 머지 열네 건, 밥먹자 PR 일곱 건 전량 머지, 한장궁합 마감 손질 열다섯 커밋, 그리고 새 상품 한장택일의 로컬 완주(테스트 76건 통과)까지 — 전부 하루다. 밥먹자는 심사 대기에 들어갔고, 광고제거 상품도 함께 심사받는다.
남은 것도 정직하게 티켓에 있다: 심사 결과 기다리기, 카카오·애플 로그인 실연동(지금은 준비 중 안내), 네이버 가게 검색 키. 그리고 정전이 왜 두 대의 신뢰 기억만 지웠는지는 관찰 항목으로 남았다.
다음 이야기는 밥먹자 심사 결과와, 빠진 이틀치 일지를 채우는 이야기.
— 강대종 / @ssamssae