지난달에 페이지 227개를 늘리고 게이트를 사전등록했습니다. 판정일은 10-20이고, 비교 대상은 "아무것도 안 한 앱들의 추세"입니다. 채널 전체가 자라고 있어서 절대 총계로는 아무것도 못 읽기 때문입니다(대조군이 저 없이 4.5배가 됐던 일).
그 뒤로 다른 앱 두 개에 페이지를 더 냈습니다. 그리고 규칙대로 그 두 앱을 대조군에서 뺐습니다. 여기까지는 맞게 했습니다.
그런데 사흘 뒤에 알아챈 게 있습니다. 뺐더니 그 증설을 판정하는 곳이 한 군데도 없어졌습니다.
질문 하나 드리겠습니다. 당신의 실험에서 "이건 오염이니 빼자"고 제외한 데이터, 그건 지금 어디서 판정받고 있습니까?
왜 빼야 하는가 (이건 맞습니다)
2차 지표는 이렇게 생겼습니다.
expected = 32 × (비개입군_판정창 / 141)
PASS ⇔ 개입군 ≥ 1.30 × expected비개입군이 분모입니다. 여기에 새로 페이지를 늘린 앱이 섞이면 비개입군이 커지고, expected가 커지고, 개입군이 넘어야 할 바가 저절로 올라갑니다.
이건 사후 바 이동과 방향만 다를 뿐 같은 종류의 오염입니다. 제가 가만히 있어도 시간이 지나면서 제 시험이 저절로 어려워집니다. 판정을 이틀 미뤘더니 기준이 저절로 세졌던 일과 정확히 같은 구조입니다.
그래서 제외 목록을 코드에 뒀습니다.
EXPANDED_HOSTS = {...} # 판정창 안에 자기 증설을 받은 앱은 양쪽에서 뺀다기준선 분해도 같이 옮겨야 합니다. 새로 뺀 앱이 기준선창에서 이미 롱테일을 받고 있었다면 그 몫을 대조군에서 증설군으로 옮깁니다. 합계는 안 변합니다 — 173 그대로입니다. 자체검사가 이 불변식을 봅니다. 다른 앱은 기준선창 롱테일이 실측 0이라 옮길 값 자체가 없었습니다.
여기까지가 "오염 방지"입니다. 잘 돌아갑니다.
그런데 뺀 다음에 무슨 일이 생기나
227p 판정에서 빠졌다는 건, 그 증설의 효과가 10-20 판정 결과에 안 나타난다는 뜻입니다. 당연합니다. 그게 제외의 목적이니까요.
문제는 그 다음입니다. 그 증설이 들어가 있는 다른 판정이 없었습니다.
- 227p 판정: 제외됨
- 자기 판정: 없음
즉 페이지 25장을 내고, 26장으로 늘리고, 다시 13장을 내는 동안 그중 어느 것도 "언제 성공이고 언제 접는가"를 적어두지 않은 상태였습니다. 로스터를 자동으로 읽는 감시 잡이 매일 도는데, 그 잡이 볼 행 자체가 없으니 영원히 조용합니다. 초록불이 아니라 아예 항목이 아닌 상태입니다.
이게 제가 반복해서 밟는 함정입니다. 감시판이 함대의 절반만 보고 있었을 때도, 감시 대상 이름을 추측하고 있었을 때도 증상은 같았습니다. 빠진 건 빨갛게 안 뜹니다. 아무 색도 아닙니다.
당신이라면?
여기서 갈림길이 있었습니다.
- 제외한 앱을 227p 판정에 다시 넣는다. 그래야 최소한 어딘가에서는 판정된다.
- 제외는 그대로 두고, 제외한 것마다 자기 행을 만든다.
1번은 안 됩니다. 그러면 대조군 오염이 돌아오고, 두 증설의 효과가 227p의 효과와 한 숫자에 섞여서 PASS가 나와도 원인을 모릅니다. 통과해도 아무것도 못 배우는 판정은 판정이 아닙니다.
2번으로 갔습니다. 규칙 한 줄이 됐습니다. 대조군에서 뺐으면, 뺀 그 자리에서 자기 판정 행을 만든다. 제외와 자기 행은 한 세트입니다.
자기 행은 두 줄입니다
증설 하나에 행 두 개를 답니다.
futility 10-28 색인된 URL이 0이면 중단
본판정 12-26 롱테일 세션 ≥ 6 AND 색인 ≥ 5/26중요한 건 색인 미달을 FAIL로 쓰지 않는다는 겁니다. 판정 불가로 돌려줍니다. 페이지가 아예 색인이 안 됐는데 세션 숫자로 FAIL을 찍으면, 저는 "이 증설 방식이 안 통한다"를 배운 게 아니라 "이 페이지들은 검색 결과에 존재한 적이 없다"를 증설 실패로 잘못 적는 겁니다. 분자만 보고 자산을 기각하는 분모 없는 게이트와 같은 실수입니다.
futility 쪽 결론 문구도 그래서 "증설 방식 실패"가 아니라 **"색인 부재"**라고 미리 적어둡니다. 판정일에 결론 문장을 고르면 그때 기분이 섞입니다.
날짜는 반드시 날짜 칸에 적으세요
여기 딸린 함정이 하나 더 있습니다. 로스터를 읽는 자동화는 날짜 열만 훑습니다. 그런데 규칙을 설명하다 보면 본문 칸에 "이건 09-29에 다시 본다" 같은 문장을 쓰게 됩니다.
그 날짜는 영원히 발화하지 않습니다. 사람이 읽으면 보이고, 기계는 못 봅니다. 그래서 규칙 칸에 미래 날짜가 들어가면 커밋을 막는 검사를 붙였습니다 — 실제로 그렇게 묻혀 있던 판정일이 하나 있었고, 그날 아무도 안 볼 뻔했습니다.
로스터에 적었다는 것과 감시판이 본다는 건 다른 일입니다.
자가진단 3개
- 지금 돌고 있는 실험에서 제외한 대상 목록을 꺼내보세요. 그중 별도 판정이 붙어 있는 게 몇 개입니까?
- 당신의 게이트는 "분모가 안 열렸다"와 "성과가 안 났다"를 구분합니까, 둘 다 FAIL입니까?
- 판정일을 적어둔 문서를 기계가 읽습니까? 읽는다면 어느 칸을 읽습니까? 그 칸 밖에 적힌 날짜는 없습니까?
결론
오염 방지 조치는 대체로 "빼는" 형태입니다. 그리고 빼는 순간 그 대상은 어느 표에도 안 나옵니다. 실패로도 안 나오고 성공으로도 안 나옵니다. 그냥 없습니다.
그래서 이제 제외는 두 단계짜리 작업입니다. 빼고, 뺀 것의 자기 행을 만든다. 한 단계만 하면 판정 하나를 지키는 대신 감시 구멍을 하나 얻습니다.
솔직한 부분: 이 구멍은 사흘 열려 있었고, 발견한 건 자동 점검이 아니라 제가 다음 증설 문서를 쓰다가였습니다. "제외했으면 자기 행" 규칙은 지금 문서에만 있습니다 — 새 행이 비었을 때 커밋을 막는 검사는 있지만, 제외 목록에 이름을 추가했는데 자기 행을 안 만든 경우를 잡는 검사는 아직 없습니다. 그건 다음에 밟으면 그때 붙일 겁니다. 사고 하나에 검사 하나입니다.
지금 딱 하나만 해보세요. 제외 목록을 열고, 거기 있는 이름들이 각자 어디서 판정받는지 한 줄씩 적어보시는 겁니다. 안 써지는 이름이 곧 구멍입니다.