항해 기록
7/1의 v1.1.0 공개 이후 두 달간 이 배의 커밋은 다이어그램 문서 한 건(7/14)뿐이었다. 9/4에 돌아와 나흘 동안 22커밋, 릴리스 넷을 쌓았다.
9/4 — v1.2.0, 보안 규칙 개편. 규칙을 뜯어보니 접근 통제의 상당 부분이 클라이언트에만 있었다 — 서버가 스스로 검증하지 않는 약속은 약속이 아니다. 인증·권한 검증을 보안 규칙으로 회수하고, 민감 데이터의 읽기 경계를 다시 긋고, 방 30개·인원 30명 한도까지 규칙이 강제하게 했다. 에뮬레이터 기반 규칙 테스트 29개가 경계 시나리오를 회귀로 고정하고 CI에 들어갔다. 같은 커밋에서 v1.1.0부터 웹 로그인이 깨져 있었다는 것도 드러났다 — CSP가 apis.google.com을 차단해 팝업 로그인이 죽어 있었는데, 세션이 살아 있는 동안엔 그 경로를 타지 않아 아무도 몰랐다.
9/4 — v1.2.1, 성능과 정확도. firebase 10→12는 애플리케이션 코드 0줄 수정으로 끝났고 npm audit 11건이 1건이 됐지만, popup.js가 418KB에서 633KB로 불었다. Firestore를 동적 import 청크로 분리해 633KB → 199KB(gzip 182KB → 58KB). 그리고 프로덕션 데이터에서 720시간짜리 세션을 발견했다 — 접속 시간 기록 오류 4건(미종료 세션 상한 없음, 자정 넘긴 세션이 퇴장일에 통째 기록, 같은 구간 이중 기록, 전역 체크인이 방 수만큼 곱해짐)을 수정하고, 회귀 테스트가 프로덕션 실제 값을 재현하게 했다. 가장 아픈 건 따로 있었다 — 로그아웃 체크아웃 수정을 두 번 배포했는데 둘 다 반영되지 않아 코드 문제로 오해했다. 범인은 max-age=3600 캐시. 웹 산출물을 콘텐츠 해시 파일명으로 바꿨다.
9/5 — 2,225줄을 13개 모듈로. popup/index.js를 손이 아니라 스크립트로 분리했다 — 최상위 함수 86개의 호출 그래프로 모듈 경계를 정하고 import를 자동 생성. index.js는 286줄이 됐고 번들 증가는 2KB뿐이다. 서비스 계층 통합 테스트 13개를 안전망으로 먼저 깔았다.
9/7 — 숫자가 방향을 정했다. 읽기 전용 감사 스크립트가 내민 결과: 가입자는 아직 한 자릿수, 1인 방 81.8%, 초대에 성공한 방 18.2%. 8자리 코드를 수동으로 전달·입력하는 초대 경로는 사실상 죽어 있었고, 몇 안 되는 외부 가입자마저 가입 직후 빈 화면에서 이탈했다. v1.2.2는 그래서 초대 링크다 — "코드 복사" 대신 tatispa.web.app/join/CODE를 복사하고, 열면 로그인 뒤 방 이름이 채워진 참여 화면이 자동으로 뜬다. 빈 첫 화면에는 온보딩 버튼을 놓았다. (v1.2.1 재업로드는 스토어가 같은 버전 번호를 거부해 1.2.2로 건너뛰었다.)
9/8 — v1.2.3, 게시본의 크래시와 초대 퍼널의 3대 차단 지점. 이미 게시된 v1.2.2에서 게임 탭이 ReferenceError로 죽어 있었다 — 모듈 분리 때 escapeName 별칭이 export 없이 옮겨져 7개 참조가 끊겼는데, 빌드도 테스트도 통과했다. acorn AST로 미정의 참조를 잡는 검사를 만들어 CI에 넣었다(정규식 1차 시도는 i18n 키를 식별자로 오인해 28건 오탐 — 폐기). 이어서 초대 퍼널: 모바일에서 로그인 자체가 불가능했고(팝업 전용 → 리디렉트 전환, 카톡·인스타 인앱 웹뷰는 감지해 "다른 브라우저로 열기" 안내), 초대 코드가 새로고침 한 번에 영구 소실됐고(로그인 전에 URL에서 지워버림 → sessionStorage 보존), 복사가 실패해도 "복사됨"이라고 말했다(폴백이 항상 true 반환 → 실제 성패 반환). 접근성 전수검사도 같은 릴리스에 실었다 — 본문 대비 1.9:1 → 4.6:1, 마우스 없이는 방에 들어갈 수조차 없던 div 클릭 요소들에 키보드 활성화, 테스트 66개 통과.
판단
규칙을 사람에게서 기계로 옮기는 처방도 반복됐다. 권한 검증은 클라이언트에서 Firestore 규칙으로, "리팩터링 후 한 번 눌러보라"는 경고는 acorn 검사로. 그 경고는 리팩터링 커밋에 직접 써놓고도 나흘 뒤 게시본에서 그대로 터졌다 — 사람이 지켜야 하는 규칙은 결국 깨진다는 것을, 이번엔 스스로 증명하고서야 검사를 만들었다.
남은 항로
- v1.3.0이 작업 트리에 준비 중이다 — 작업 사이트 자동 체크인, 방 챌린지, 새 탭 재정의. 신규 권한(
tabs·idle)의 사유 기재가 심사 관문이다 - 다음 감사에서 초대 성공률 18.2%가 실제로 움직였는지 확인한다 — 퍼널을 고친 증거는 배포가 아니라 숫자다