버그 박물관
고치기 전 상태를 직접 만져 보는 곳입니다. 개발 글은 대개 '이런 버그가 있었고 이렇게 고쳤다'로 끝나는데, 읽는 사람은 그 버그를 겪어 본 적이 없어서 남는 게 없습니다.
첫 번째 전시 — 눌러 보세요
아래는 배포됐던 그 판정입니다. 초록 구역을 정확히 눌러 보세요. 실패로 처리됩니다. 스위치를 누르면 같은 화면이 수정본으로 바뀝니다. 화면은 둘이 완전히 같습니다 — 다른 것은 부등호 하나입니다.
판정이 뒤집힌 채 배포된 게임
무슨 일이 났나
초록 구역을 정확히 눌러도 실패하고, 정반대를 눌러야 성공했습니다.
왜
각도 차이를 −π..π 로 접은 뒤 '구역 반폭보다 작은가'를 봐야 하는데 부등호를 반대로 썼습니다. 화면에는 구역이 제대로 그려지고 바늘도 제대로 돌기 때문에, 눌러 보면 '내가 못 맞혔나' 로 보입니다.
어떻게 잡았나
브라우저로는 못 잡았습니다. 확인용 창이 가려져 있으면 애니메이션이 멈춰서, 그 화면에서 확인할 수 있는 것은 '첫 프레임이 그려졌다'까지였습니다. 규칙만 떼어 node 에서 재 보고 나왔습니다.
고친 방법
부등호를 뒤집고, 0도를 넘는 자리까지 포함해 판정 검사 10항목을 남겼습니다.
고치자마자 다른 버튼이 사라진 CSS
무슨 일이 났나
고스트 버튼이 흰 배경에 흰 글자로 안 보였습니다. 고쳤더니 이번에는 기본 버튼이 까만 배경에 까만 글자가 됐습니다.
왜
<button> 에 남는 브라우저 기본 배경을 지우려고 button.btn 규칙을 넣었는데, 그 선택자의 특이도가 .btn-primary 보다 높아서 primary 의 배경색까지 함께 지웠습니다.
어떻게 잡았나
둘 다 사용자가 먼저 봤습니다. 첫 번째는 캐시된 옛 CSS 때문에 고쳐 배포한 뒤에도 화면이 그대로였고, 그래서 '고쳤다'고 잘못 말할 뻔했습니다.
고친 방법
:where() 로 감싸 특이도를 0 으로 만들었습니다. 그리고 게이트에 button.btn 원시 선택자 금지 검사를 넣고, 일부러 되돌려서 실제로 잡히는지 확인했습니다.
판이 오를 때마다 생기던 빈 칸
무슨 일이 났나
우측 하단에 블록도 장애물도 없는 빈 칸 세 개가 남았습니다.
왜
판이 오를 때 침식을 한 겹 벗기는데, 그 뒤에 블록을 내려 채우지 않았습니다. 매치로 벗길 때는 지우기 → 중력 → 리필 경로를 타지만 판 상승은 그 경로를 타지 않았습니다.
어떻게 잡았나
실기기 제보로 알았습니다. 그리고 잡는 과정에서 검증에서 세 번 틀렸습니다 — 검사가 210초 동안 단 한 번만 돌았고(통과 횟수를 안 세면 0회 통과도 통과로 보입니다), 실패한 패치를 성공으로 보고했고, 엉뚱한 곳을 의심했습니다.
고친 방법
'빈 칸에는 반드시 침식이 있어야 한다'는 불변식을 세우고, 자동 플레이 중 계속 확인하는 모드를 만들었습니다. 시드 세 개 × 600여 회 통과, 수정 전에는 세 시드 모두 위반했습니다.