기존 유저 보호 장치를 넣고 엿새도 안 돼 그 장치가 소진됐다 — 타누비 여우 해금
선을 올리면 이미 넘은 사람의 발밑도 같이 움직입니다. 2026년 7월 25일, 여우 해금 조건을 1500에서 2500으로 올렸습니다. 이 글의 숫자는 그때 값이고 지금은 더 높습니다.
작성일: 2026-07-25
최종 개정일: 2026-08-21
마지막 한 명을 "특별한 마지막"으로 만들고 싶었다 💭
여우는 타누비에서 마지막으로 열리는 영웅입니다.
마지막이라면 도달했을 때의 무게가 좀 더 있었으면 했어요.
그래서 해금 조건을 1500에서 2500으로 올리기로 했습니다.
더하기로 치면 쉬운 변경입니다. 상수 하나 고쳐 쓰면 되니까요.
다만 이 변경에는 받는 사람이 두 종류였습니다.
선을 옮기면 이미 넘은 사람의 발밑도 움직인다 ⚠️
앞으로 할 사람에게는 조건이 조금 멀어지는 것뿐입니다.
문제는 다른 쪽이었습니다. 누적 1500에서 2499 사이에 있는 사람들이요.
그 사람들은 이미 여우를 갖고 있습니다. 조건을 채웠으니까요.
상수만 고치면, 다음에 접속했을 때 여우에 다시 잠금이 걸립니다.
제 커밋에는 이렇게 적혀 있습니다. 리텐션 배신이라고요.
기능 조정이라고 한 일이 기존 플레이어에게는 회귀로 도착합니다. 😖

한 번 열린 건 다시 빼앗지 않는다 🔒
그래서 해금 판정을 점수만으로 하는 걸 그만뒀습니다.
영구 해금 목록을 진척 데이터에 두고, 점수 조건이거나 목록에 있으면 열리게 했어요.
옛 조건 값도 상수로 남겼습니다. 1500이라는 숫자를 버리지 않고 들고 있어야 했거든요.
시작할 때, 옛 조건을 이미 채웠던 캐릭터를 그 목록으로 한 번만 흡수합니다.
다음 목표 표시도 같이 고쳤습니다. 이미 가진 캐릭터는 다음 목표로 안 잡히게요.
해금은 로컬 메타 정보입니다. 시드도 판정도 리더보드도 건드리지 않았습니다.

"한 번만"을 보장하는 플래그 🏷️
흡수가 여러 번 돌면 안 됩니다. 돌 때마다 조건이 느슨해지는 동작이 되니까요.
그래서 이관 완료 플래그를 하나 뒀습니다.
플래그가 안 서 있으면 흡수하고 세운다. 서 있으면 아무것도 안 한다.
로드와 흡수와 저장을 한 함수로 묶어서, 몇 번 불러도 결과가 같게 만들었습니다.
진입점은 세 곳입니다. 허브, 게임, 도감. 어디로 들어와도 한 번이면 끝나요.
호출부는 여덟 곳을 갱신했습니다.
경계를 테스트로 못 박았다 ✅
무손실은 주장이 아니라 증명이었으면 했습니다.
딱 1500인 기존 유저는 흡수돼서 영구히 유지된다.
같은 1500이어도 신규면 아직 잠겨 있다. 2500이 필요하다.
1499는 흡수되지 않는다. 경계 한 칸 앞에서 선이 그어진다는 걸 고정했습니다.
다시 돌려도 결과는 같다. 누적이 바뀌어도 재흡수는 안 일어난다.
저장 후 다시 읽어도 유지되고, 그 뒤에 누적이 0이 돼도 안 사라진다.
진척 바 비율이 범위를 벗어나지 않는 것까지 봤습니다.
그리고 엿새도 안 돼서, 선을 또 옮겼다 📈
7월 25일에 2500으로 올렸습니다.
7월 31일, WS20에서 5500으로 다시 올렸어요.
간격은 닷새하고 스물세 시간쯤. 엿새에도 못 미칩니다.
이때 그 지키는 장치는 쓰이지 않았습니다.
"한 번만"을 보장하던 플래그가 첫 상향에서 이미 서 있었기 때문입니다.
안전하게 만든 그 성질이 그대로 일회성이 됐다 🙃
플래그는 흡수가 폭주하는 걸 막으려고 넣었습니다. 그 역할은 하고 있어요.
다만 그 플래그는 전역으로 딱 한 번이었습니다.
즉 "이 이관을 마쳤는가"가 아니라 "이관이라는 걸 마쳤는가"를 들고 있었던 겁니다.
두 번째 상향에 대한 보호는 자동으로 걸리지 않습니다.
이 한계는 코드 주석에 적혀 있습니다.
버전을 갖는 플래그로 다시 만드는 건 별도 작업으로 제안만 남아 있는 상태예요.
아직 안 고쳤습니다. 🙇

마무리하며 🏁
기존 유저를 지키는 장치를 만든 것 자체는 옳았다고 생각합니다.
배운 건 그 장치 자체도 버전을 가졌어야 했다는 겁니다.
한 번이면 충분하다고 정한 시점에, 두 번째 변경을 상정에서 뺐던 거죠.
선을 옮길 일이 딱 한 번뿐인 기능은 아마 그렇게 많지 않을 겁니다.
지키는 쪽 장치야말로 반복을 전제로 설계한다. 다음엔 거기서 시작합니다! 🛡️