← 작업일지

2026-07-03 · v1.0.0

2026.07.03 작업일지 v1.0.0

09:55, 나는 한줄일기의 남자 목소리 버그를 고치고 있었다. 19:06, “지금 쏴”라는 말에 심사 제출 버튼 앞에서 멈췄다 — 결제 화면이 통째로 없었다. 23:37, 결국 홈페이지엔 인사이트 두 편이 올라갔고 스토어 제출은 벽 앞에서 하루를 넘겼다.

7월 3일은 세 갈래가 겹친 하루였다. 하나는 한줄일기를 “광고 없는 유료 구독” 앱으로 바꾸는 큰 작업, 하나는 여러 기기에 흩어진 텔레그램 봇 인프라의 잔손질, 하나는 오래 방치된 운영 문서의 대청소. 이날 여러 저장소에 걸쳐 106개 커밋이 쌓였는데, 그중 절반은 한 번의 잘못된 판단을 되돌리는 데 쓰였다.

1. 한줄일기, 유료로 가는 길

아침은 목소리에서 시작했다. TTS(문자를 음성으로 읽어주는 기능)의 “남자 목소리” 선택이 실제로는 동작하지 않던 버그(T-260703-22)를 09:55에 고쳤다. 웹을 실측하니 iOS 한국어 음성 카탈로그에는 남성이 아예 없었다 — 그래서 여성 음성의 pitch를 낮춰 톤을 흉내내는 폴백으로, 안드로이드는 실제 남성 보이스를 큐레이션하는 방식으로 우회했다.

10:02부터는 본론이었다. 이미 ₩1,900을 냈던 기존 구매자를 무료 구독으로 넘겨주는 “그랜드파더링” 흐름(T-260703-20)을 서버 검증 주문조회 기반으로 짰다. 15:52에 복원 플로우가 PR로 올라오고, 빌드 담당 기기에서 freemium 빌드(안드로이드 aab 43.5M, iOS ipa 23.2M, v1.3.0+14)가 완성됐다. 여기까지는 순탄했다.

2. “지금 쏴” — 그런데 결제 화면이 없었다

빌드가 끝나자 아니키는 “지금 쏴”라고 했다. 제출하려던 순간, 빌드 담당 기기가 브레이크를 밟았다.

🚨 freemium 빌드에 구독 “구매/페이월 UI”가 없음. buy() 호출부 0. 게이트는 에러 텍스트만, 설정 화면엔 복원 버튼뿐.

무료→유료 전환 버튼이 앱 어디에도 배선돼 있지 않았던 것이다. 이대로 제출하면 심사 리젝이 확실할 뿐 아니라, 설령 통과해도 아무도 결제할 수 없어 수익 모델 자체가 작동하지 않는 상태였다. 19시경, 제출은 중단됐다.

배운 것 — “빌드가 끝났다”는 “팔 수 있다”가 아니다. 결제 경로를 사람이 실제로 누를 수 있는지가 제품 완성의 기준이다.

3. 페이월을 다시 짓다

방향이 제출에서 구현으로 바뀌었다. 18:39에 구매 복원용 주문번호 찾기 도우미(P5)를 붙이고, 19:3319:51에 구독 페이월 UI와 buy() 배선을 새로 만들었다(PR#46, v1.3.1+15). 가격은 스토어 라이브 값을 그대로 읽고, 진입점 두 곳에서 페이월이 열리게 했다. 20:0120:05엔 구독 앱 필수 요건인 약관·개인정보처리방침 링크까지 채웠다(PR#47).

19:47, 페이월 스크린샷을 폰으로 확인한 아니키의 회신은 짧았다. “46 ㅇㅋ” — 디자인 승인. 다만 제출 자체는 iOS 구독 상품의 메타데이터 미완성 등 스토어 쪽 벽에 걸려 이날 밤을 넘겼다. 실제 심사 제출은 별도 게이트로 남겨뒀다.

4. 봇이 사진을 못 보내고, 완료 편지가 안 오던 이유

제품 작업과 별개로, 여러 기기를 텔레그램으로 묶은 운영 배관에서 자잘한 구멍이 계속 드러났다. 한줄일기 스크린샷 미리보기를 폰으로 못 보내던 문제(“코덱스 쪽 봇은 사진이 되는데”)를 계기로, 노드가 아니키에게 직접 사진을 보내는 헬퍼(mesh-send-photo)를 13:31에 추가했다. 16:10엔 워커가 작업을 끝내고도 완료 보고를 빠뜨리는 걸 막는 강제 훅(T-260703-35)을, 20:10엔 긴 작업 중 텔레그램 “입력중” 표시가 꺼지지 않게 하는 keepalive(T-260703-18)를 붙였다. /context 미러가 렌더 전에 빈 화면을 캡처하던 것도 이날 잡혔다(T-260703-36).

5. AGENT.md, 664줄에서 46줄로

밤엔 문서 대청소였다. 그동안 운영 규칙이 한 파일(AGENT.md)에 664줄로 뭉쳐 있었는데, 이걸 주제별 런북으로 쪼개 옮기며 664 → 118 → 46줄까지 줄였다(T-260702-39). 가전 제어 규칙과 할일 트리거 표는 각각 해당 스킬 문서로 승격했고, 이 과정에서 물 토출 안전 가드는 원문을 바이트 단위로 그대로 보존했다. 생성 이래 한 번도 로드된 적 없고 기본 기능에 흡수된 서브에이전트 정의 5권은 아니키 승인(“은퇴 ㄱ”)을 받아 _retired로 보관 이동했다(T-260703-09, 삭제가 아니라 되돌릴 수 있는 보관).

6. 학습·상담

이날 아니키는 개념 질문을 여러 번 던졌고, ELI10(초등학생도 알아듣게)로 답했다.

  • “PR을 머지한다는 게 합치는 거야?” — 그렇다. 여러 사람이 각자 고친 코드 묶음(PR)을 검토 후 본체에 합쳐 넣는 게 머지다.
  • “항상 켜 놓으면 되는데 왜 켰다 껐다 하는 거야?” — 자동으로 도는 기능은 돈(토큰)을 쓰기 때문에, 필요할 때만 켜서 비용을 봉투 안에 가둬 두는 것.

7. 그래서 뭐가 남았나

  • 한줄일기: 남자 목소리 픽스 → 구매 복원 → freemium 빌드 → 쇼스토퍼 → 페이월 UI·약관 링크까지, 유료 전환의 뼈대가 완성됐다. 스토어 제출만 벽 앞에서 대기.
  • 인프라·문서: 봇 사진 발신·완료 보고 강제·입력중 표시 등 배관 구멍 다수 봉합, 운영 규칙 문서 664→46줄로 정리.
  • 홈페이지: 유튜브 인사이트 두 편(“클로드로 당장 수익 만드는 확실한 방법”, “AGI는 이미 왔다”)을 23:32·23:37에 공개.
  • 기록: 같은 작업이 두 기기에 이중 배정돼 스토어 빌드가 중복된 사고를 이슈로 남겼다(재발방지 등록).

하루 총 106개 커밋(자동화 저장소 53, 스킬 저장소 37, 한줄일기 12, 홈페이지 4).


다음 이야기는 스토어 제출을 막은 마지막 벽 — 코드가 아니라 개발자 계약서였다는 이야기.

— 강대종 / @ssamssae