NTs Apps. English 문의

버그 박물관

고치기 전 상태를 직접 만져 보는 곳입니다. 개발 글은 대개 '이런 버그가 있었고 이렇게 고쳤다'로 끝나는데, 읽는 사람은 그 버그를 겪어 본 적이 없어서 남는 게 없습니다.

첫 번째 전시 — 눌러 보세요

아래는 배포됐던 그 판정입니다. 초록 구역을 정확히 눌러 보세요. 실패로 처리됩니다. 스위치를 누르면 같은 화면이 수정본으로 바뀝니다. 화면은 둘이 완전히 같습니다 — 다른 것은 부등호 하나입니다.

버그 상태 — 초록 구역을 눌러 보세요

판정이 뒤집힌 채 배포된 게임

딱 멈추기 (4시간 게임 1회차)

무슨 일이 났나
초록 구역을 정확히 눌러도 실패하고, 정반대를 눌러야 성공했습니다.

왜
각도 차이를 −π..π 로 접은 뒤 '구역 반폭보다 작은가'를 봐야 하는데 부등호를 반대로 썼습니다. 화면에는 구역이 제대로 그려지고 바늘도 제대로 돌기 때문에, 눌러 보면 '내가 못 맞혔나' 로 보입니다.

어떻게 잡았나
브라우저로는 못 잡았습니다. 확인용 창이 가려져 있으면 애니메이션이 멈춰서, 그 화면에서 확인할 수 있는 것은 '첫 프레임이 그려졌다'까지였습니다. 규칙만 떼어 node 에서 재 보고 나왔습니다.

고친 방법
부등호를 뒤집고, 0도를 넘는 자리까지 포함해 판정 검사 10항목을 남겼습니다.

전문 읽기

고치자마자 다른 버튼이 사라진 CSS

사이트 전체

무슨 일이 났나
고스트 버튼이 흰 배경에 흰 글자로 안 보였습니다. 고쳤더니 이번에는 기본 버튼이 까만 배경에 까만 글자가 됐습니다.

왜
<button> 에 남는 브라우저 기본 배경을 지우려고 button.btn 규칙을 넣었는데, 그 선택자의 특이도가 .btn-primary 보다 높아서 primary 의 배경색까지 함께 지웠습니다.

어떻게 잡았나
둘 다 사용자가 먼저 봤습니다. 첫 번째는 캐시된 옛 CSS 때문에 고쳐 배포한 뒤에도 화면이 그대로였고, 그래서 '고쳤다'고 잘못 말할 뻔했습니다.

고친 방법
:where() 로 감싸 특이도를 0 으로 만들었습니다. 그리고 게이트에 button.btn 원시 선택자 금지 검사를 넣고, 일부러 되돌려서 실제로 잡히는지 확인했습니다.

전문 읽기

판이 오를 때마다 생기던 빈 칸

매치 시즈

무슨 일이 났나
우측 하단에 블록도 장애물도 없는 빈 칸 세 개가 남았습니다.

왜
판이 오를 때 침식을 한 겹 벗기는데, 그 뒤에 블록을 내려 채우지 않았습니다. 매치로 벗길 때는 지우기 → 중력 → 리필 경로를 타지만 판 상승은 그 경로를 타지 않았습니다.

어떻게 잡았나
실기기 제보로 알았습니다. 그리고 잡는 과정에서 검증에서 세 번 틀렸습니다 — 검사가 210초 동안 단 한 번만 돌았고(통과 횟수를 안 세면 0회 통과도 통과로 보입니다), 실패한 패치를 성공으로 보고했고, 엉뚱한 곳을 의심했습니다.

고친 방법
'빈 칸에는 반드시 침식이 있어야 한다'는 불변식을 세우고, 자동 플레이 중 계속 확인하는 모드를 만들었습니다. 시드 세 개 × 600여 회 통과, 수정 전에는 세 시드 모두 위반했습니다.

전문 읽기

왜 남겨 두나

세 건에 공통점이 있습니다. 전부 화면만 봐서는 멀쩡해 보였습니다. 판정이 뒤집힌 게임은 구역도 바늘도 제대로 그려졌고, 사라진 버튼은 자리를 차지하고 있었고, 빈 칸은 다음 매치가 그 열을 건드릴 때까지 눈에 안 띄었습니다.

그래서 고친 다음에는 검사를 하나씩 남겼습니다. 그리고 그 검사가 정말 잡는지도 확인했습니다 — 일부러 되돌려 놓고 돌려 봤는데, 처음 쓴 검사는 못 잡았습니다. 잡지 못하는 검사는 없는 것과 같습니다.

만드는 이야기는 개발 기록에, 장르별로 무엇이 필요한지는 여기에 있습니다.