← 01 THINK어떻게 생각하는가

커밋 없이 값이 바뀌었다

자동 주입은 CSP 를 좁게 유지하는 대신, 어느 통계 사이트로 보고하는지를 대시보드에 남긴다. 저장소가 쥐지 못한 값은 알림 없이 바뀐다.

이 글은 AI 에이전트(Claude)와 함께 진행한 세션의 기록이다. 커밋 해시와 인용은 이 저장소에서 확인할 수 있다. 다만 토큰이 실제로 한 번 바뀌었다는 것은 세션에서 관찰한 사실이고, 코드에는 남아 있지 않다 — 그게 이 글의 주제다.

lib/csp.mjs 에 이렇게 적혀 있다.

connect-src deliberately gets nothing. Under Cloudflare's AUTOMATIC
injection the beacon reports to the site's own domain, which 'self'
already covers. (...) automatic injection is not a convenience here,
it is the reason the second hole stays shut.

이 사이트는 허용한 곳 외에는 아무 데도 접속하지 않는다는 CSP 를 걸고 있고, 외부 오리진은 통계 비컨의 스크립트 호스트 하나뿐이다. 비컨을 직접 내보내면 보고가 나가는 주소를 하나 더 허용해야 한다. 그래서 자동 주입을 쓴다. 정책을 한 칸이라도 좁게 유지하려고 고른 것이고, 이건 의도된 트레이드다.

그 문장이 말하지 않는 쪽이 값이다.

저장소가 쥐지 못한 값은 알림 없이 바뀐다

자동 주입에서 HTML 에 도달하는 토큰 — 어느 통계 사이트로 보고할지를 정하는 값 — 은 대시보드가 이 호스트에 연결해 둔 사이트의 것이다. 저장소에는 그 연결이 없다.

그러니까 이 값은 커밋 없이 바뀔 수 있다. 그리고 실제로 한 번 그랬다.

diff 도, 작성자도, 시각도 없다. 코드에 기록이 없으니 바뀐 것을 알 신호가 없고, 알아챈 뒤에도 원인을 물을 데가 없다. 정책은 좁게 유지됐고, 대신 값 하나가 diff 밖에 있다. 좁은 정책의 값이 그것이다.

대시보드에만 있는 상태

같은 자리에 셋이 더 있다. www 를 기본 주소로 보내는 리다이렉트 룰, 통계 사이트 연결, 그리고 그 연결이 어느 사이트를 가리키는지.

docs/PRODUCTION.md 에는 이 셋이 절차로만 적혀 있다. DNS 에 프록시된 AAAA 레코드를 100:: 로 두고, Redirect Rules 에서 301 로 보내고 — 무엇을 하면 되는지는 있다. 지금 그렇게 되어 있는지는 없다.

이건 게이트로 막을 수 있는 종류가 아니다. pnpm check:release 는 저장소가 만드는 정책과 헤더를 검사하지만, 대시보드의 토글은 저장소가 읽을 수 없다. 그래서 여기서 할 수 있는 최소한은 결론이 아니라 확인 절차를 남기는 것이다.

같은 형태가 그 주에 두 번 더 있었다

받을 수 없는 자료. 지도를 읍면동까지 쪼개려면 자료가 하나 필요한데 제공처가 계정을 요구한다. 계정 생성은 스크립트가 할 일이 아니다. 목록에서 지우는 대신 "못 받는 자료" 로 옮겨, 매 실행이 없다는 사실과 손으로 받아 둘 위치와 자동으로 못 받는 이유를 출력하게 했다(388d02c, f36d4c3).

지우면 6개월 뒤에 같은 조사를 다시 한다. 이미 두 번 했다 — 첫 번째는 대화로만 하고 어디에도 안 적어서 잃어버렸다.

되돌린 리팩터. CSS 램프가 셀의 fill 과 범례 스와치의 background 로 두 번 적혀 있어서, 아홉 색을 사용자 정의 속성으로 한 번만 선언하게 바꿨다. color-mix() 18개가 9개로 줄었고, 10,445 B — 105 B 나빠졌다. gzip 이 반복 문자열을 이미 접고 있었고, 아홉 개의 서로 다른 변수명이 압축 가능한 반복을 압축 불가능한 신규 문자열로 바꿨다. 되돌리고, 그 실측값을 perf.budget.json 에 적었다(74d469e).

숫자를 안 적으면 다음에 같은 리팩터를 한다. 중복이 추상보다 싸다는 건 아무도 추측할 수 없는 답이다.

가져갈 것

셋이 같은 형태다. 값이 저장소 밖에 있거나, 자료가 손을 거쳐야 하거나, 결과가 직관과 반대일 때 — 저장소가 쥘 수 있는 것은 결론이 아니라 확인 방법이다.

  1. 끌어올 수 있는 상태는 끌어온다. 대시보드 토글 하나가 프로덕션 HTML 을 바꿀 수 있다면 그건 설정이 아니라 코드다.
  2. 못 끌어오면 절차를 대신 둔다. 게이트가 읽을 수 없는 상태라도, 어떻게 확인하는지 한 줄은 저장소 안에 있어야 한다.
  3. 없는 것과 되돌린 것을 출력하게 한다. 손으로 받아야 하는 자료와 실패한 리팩터의 실측값은, 적어 두지 않으면 반드시 다시 조사된다.
cloudflarecspanalyticsverificationai-agent

기록

2026.09.08에 처음 커밋됐고, 이후 손대지 않았습니다.

  • 9a03509Content: 커밋 없이 값이 바뀌었다 — 네 판

전체 빌드 기록 →