말로 요청(스킬 막음) 2회차 · Claude Code · Opus 5.5 · 클로드의 마지막 답 원문 · 목록
재현 스크립트로 확인을 마쳤습니다. 아직 main에 합치면 안 됩니다. 손님 포인트가 잘못 계산되는 버그가 여러 개 있습니다. 아래 문제들은 모두 feature 브랜치 코드를 직접 실행해서 확인했습니다.
반드시 고쳐야 할 문제
1. 생일 2배가 끝나지 않고, 결제할 때마다 계속 2배로 늘어남 (earn)
self.rate = self.rate * 2가 지갑에 저장된 적립률 자체를 바꿔 버립니다.
- 생일 당일에 1만 원씩 세 번 결제하면 적립률이 5% → 10% → 20% → 40%로 커집니다. 실행 결과 마지막 적립률이 0.4였습니다.
- 생일 다음 날에도 원래대로 돌아가지 않습니다. 1만 원을 결제했는데 500이 아니라 1,000이 적립됐습니다.
- 고치는 방법: self.rate를 아예 없애고, 계산할 때만 rate = POINT_RATE * 2 if 생일 else POINT_RATE로 정하면 됩니다.
2. 이미 만료된 포인트에서 먼저 깎임 (use)
balance()는 만료된 적립분을 빼고 잔액을 계산합니다. 그런데 use()는 만료 여부를 보지 않고 가장 오래된 적립분부터 차감합니다. 그래서 손님이 포인트를 써도 실제로는 이미 죽은 포인트만 줄어듭니다.
- 재현: 작년에 5,000을 적립했고(만료), 올해 1,000을 적립한 상태에서 1,000을 사용. 사용 뒤에도 잔액이 1,000 그대로입니다. 결과적으로 공짜 결제가 됩니다.
- 고치는 방법: 차감 루프에서도 balance()와 같은 기준으로 유효한 적립분만 고르면 됩니다.
3. 음수를 넣으면 포인트가 생겨남 (use)
use(-1000)을 호출하면 잔액 검사를 통과하고, entry[1] -= -1000이 실행되어 포인트가 늘어납니다. 실제로 500이던 잔액이 1,500이 됐습니다.
- 고치는 방법: points <= 0이면 거절해야 합니다. earn도 마찬가지로 amount가 음수인지 확인하는 게 좋습니다.
4. 포인트를 쓰면 하루 한도가 다시 차오름 (earn)
earned_today는 '오늘 적립한 양'이 아니라 '오늘 적립분 중 남은 양'을 더합니다. use()가 적립 기록의 숫자를 직접 깎기 때문입니다.
- 재현: 하루에 5,000을 적립해 한도에 도달 → 5,000 사용 → 같은 날 다시 5,000이 적립됐습니다. 한도가 사실상 무력화됩니다.
- 고치는 방법: 적립 원금과 남은 양을 따로 저장하거나, 오늘 적립한 총량을 별도로 기록해야 합니다.
기존 코드에 원래 있던 문제 (이번 변경 전부터, 같이 고치길 권장)
5. 유효기간이 하루 일찍 끝남 (balance)
규칙은 "적립한 날을 1일째로 쳐서 365일째까지 사용 가능"입니다. 하지만 (today - d).days < EXPIRE_DAYS - 1 조건 때문에 365일째에 잔액이 0이 됩니다. 실제로 364일째는 500, 365일째는 0이 나왔습니다. 조건을 < EXPIRE_DAYS로 바꿔야 합니다. main에도 있는 버그지만, 이번에 추가된 use()가 이 잔액을 기준으로 동작하므로 함께 고치는 게 좋습니다.
사소한 점
- 2월 29일생은 평년에는 생일 적립을 받지 못합니다. 사장님께 정책을 확인할 필요가 있습니다.
- 한도에 걸려 0포인트가 될 때도
[today, 0]기록이 남습니다. - 테스트가 하나도 없습니다. 위 1~4번 시나리오는 테스트로 추가해 두길 권합니다.
- 반올림 걱정은 없습니다. 1원부터 20만 원까지 5%와 10% 모두 버림 계산이 정확하게 나왔습니다.
결론: 1~4번을 고치기 전에는 머지하지 않는 게 좋습니다. 특히 1, 2, 3번은 사장님이 포인트를 실제로 손해 보는 버그입니다.