항해 기록
7/31 ~ 8/11 — KRWC. 원화 담보 스테이블코인을 실었다. 페그를 "믿어달라"가 아니라 네 값의 일치 — 총 발행량 == 준비금 잔고 == 감사원장 재합산 == 온체인 totalSupply — 로 정의하고, 거래소 코어의 복식부기 원장과 커스터디 상태머신을 그대로 재사용했다. 화면에는 [1원 어긋나게] 버튼을 뒀다 — 실패시킬 수 없는 검증은 아무것도 증명하지 않는다. 테스트 260 → 577.
8월 — 점검 일곱 번과 데이터 게이트. 인증 없는 GET 한 번이 테이블을 DROP하던 것, 퀴즈가 오답에도 정답을 돌려주던 것 같은 결함들을 회차별 점검으로 걷어내며 코드베이스의 규칙 7가지를 명문화했다("설정에 적힌 정책은 강제하는 코드가 있을 때만 정책이다" 등). 데이터 쪽은 출처 레지스트리와 게이트 G1~G7 — MVRV는 무료 벤더 두 곳 교차검증(평균 절대차 0.87%)으로 들이고, SOPR은 출처가 하나뿐이라 검증 불가로, 공포탐욕지수는 방법론 비공개로 떨어뜨렸다. OI 이력은 남이 안 주니 직접 쌓기 시작했다 — 첫 실행 25종 × 200일 백필.
8/24 — 일일 수집이 7일간 멈춰 있었다. MySQL이 TEXT 컬럼에 유니크 인덱스를 못 세워 수집 가드가 적재를 중단했다 — 가드는 설계대로 동작했고, 문제는 그 사실이 7일간 아무에게도 도달하지 않았다는 것이다. 테스트는 SQLite로 돌아 이 제약을 잡을 수 없었다. 후속으로 "수집을 돌린 뒤에도 데이터가 낡았는가" 하나만 판정하는 알림을 붙였는데, 그 배선에서 compose 환경변수 누락을 세 번째로 반복했고(바로 그 줄 위 주석이 앞의 두 번을 기록하고 있었다), 알림 첫 프로덕션 전송은 Discord가 urllib 기본 UA를 403으로 막아 실패했다 — 모킹한 테스트로는 절대 드러나지 않는 종류다.
9/4 — 디자인 시스템, 그리고 사용자 제보. 등급 체계(등급 차 50 = AA)·차트 팔레트(이색각 ΔE를 8만 회 탐색으로 최대화)·색 하드코딩 린트·라이트 테마를 깔았다. 그리고 라이트 모드가 깨진 채 배포됐다 — 사용자가 알려 왔다. 히어로 제목 대비 1.33:1. 토큰 대비 검사는 전부 통과했었다 — 팔레트가 기준을 만족하는지만 봤지, 화면이 그 팔레트를 쓴다는 보장이 아니었다. 렌더된 화면을 26라우트 × 두 테마로 실측하는 대비 E2E를 만들어 위반 82건을 0으로.
9/5 — 반증. 이 두 달의 중심 사건이다. 추천 엔진의 선별·가중 경로를 그대로 import해 업비트 KRW 전 287종목 3년치, 33회 리밸런싱으로 아웃오브샘플을 쟀다. 결과 — 공격형 −99.1% vs BTC 매수보유 +75.5%. 같은 코인을 골라 놓고 비중만 최적화한 결과가 균등분할보다 나빴고, 자기 폴백인 역변동성 가중에도 졌다. 원인은 한 줄이다: mu = returns.mean() * 365 — 공분산에는 수축을 걸어 두고 오차가 훨씬 큰 μ는 손대지 않았다. 화면의 「연환산 기대수익률」은 라이브에서 공격형 +998.64%를 띄우고 있었고, 실현 수익률과의 순위상관은 ρ=−0.09 — 예측력이 없다. 조치: 지표를 눌러 보여주는 게 아니라 내렸고(연환산하지 않는 창 수익률로 교체, 재발 방지 테스트 3건), 가중은 후보 대결에서 5개 성향 전부 승자였던 역변동성으로 바꿨으며, 동결 픽스처 워크포워드 회귀 게이트(로컬 8초)를 매 CI에 넣었다 — 코드는 '정상 동작'하면서 돈을 잃는 회귀는 단위 테스트로 안 잡힌다.
시장이 요구하는 것은 다른 쪽이었다. 거래대금은 상위 5종목이 48.1%, 1년 보유로 BTC를 이긴 종목은 3.4%, 상위 10%를 정확히 골라도 −50.6%, 종목 MDD 중앙값 −93.2%. "무엇을 살까"에 답하는 제품은 알고리즘 품질이 아니라 모집단 분포 때문에 상단이 낮다. 반면 확실성 있는 수요가 하나 있다 — 2027-01-01 가상자산 과세. 그리고 KRWC에서 만든 해시 체인·감사원장·출처 게이트가 정확히 거기에 쓰인다. 그 길에서 tax.py의 산정 방식이 법과 다른 것도 발견했다 — 시행령 제88조①은 총평균법인데 코드는 FIFO였다. 상승장에서 법보다 많은 세금을 보여주던 셈이다.
9/5 ~ 9/9 — 새 항로의 첫 화물. P0 취득가액 기준선 스냅샷에 착수했다 — 숫자가 아니라 관측(원본 응답·요청시각)을 keccak 체인으로 봉인하고, 라이브·일봉 두 경로로 단일 실패점을 없앤다. 리허설 실측은 482종목 = 요청 5건·1.0초. 근거도 정정을 거쳐 더 단단해졌다 — "지나가면 되돌릴 수 없다"는 과장이었고, 실제로 사라지는 것은 상장폐지 종목의 이력이다(KRW-LUNA → 404). 취득가액 입증이 가장 절실한 종목이 바로 상장폐지될 종목이다. 곁들여 PWA(서비스워커가 /api/*를 아예 건드리지 않는 설계 — 오프라인 캐시는 이 서비스에선 낡은 시세를 보여주는 것이 된다)와 크롬 사이드 패널 낙폭 프로토타입(#56~#58)을 실었다 — 추천하지 않고, 페이지를 읽지 않고, 주소만 본다. 그 약속은 문장이 아니라 권한 목록 증가를 막는 테스트로 지킨다.
판단
두 달을 관통한 규율은 규칙 ⑤의 반복 확장이다 — 정책은 강제하는 코드가 있을 때만 정책이다. 환경변수 배선은 AST 스캔 테스트로, CSP 커버리지는 사이트맵 포함 검사로, 화면 대비는 렌더된 DOM 실측으로, 성능 회귀는 워크포워드 게이트로, 문서의 수치는 픽스처 재계산 대조로. 주석과 문서는 세 번 반복된 compose 누락을 막지 못했다 — 테스트만 막았다.
남은 항로
- 11/30·12/15 두 번의 스냅샷 리허설, 그리고 12/31 0시 본번 — 리허설이 재는 것은 코드가 아니라 "0시를 맞출 수 있는가"다
- 「시가고시가상자산사업자」의 정의 확인(국세청 126 문의) — 추측으로 만들지 않는다
- 사이드 패널은 스토어에 올리지 않고 며칠 써 본다 — 답할 질문은 하나, "켜 두고 실제로 보게 되는가"