1. 요약 Summary
- 날짜별 자동 인증 확정 이벤트를 받아 성공 축과 미달 축의 정수 카운트를 갱신하고, 정수 산식
f(k)의 차이만 계정 점수에 반영한다. 소수 누적값·부동소수점을 쓰지 않는다(정책 §4.5).
- 사이클 시작 시 실제 티어를 스냅샷해 해당 사이클의 배점
W를 고정한다.
- 사용자 단위 직렬화, 원본 단위 멱등성, 점수 원장으로 중복·동시 처리·복구 문제를 제어한다.
- 사이클 마감 시 3단계 결과 판정과 챌린지별 연속 보너스·추가 감점만 처리한다.
f(N) = W가 항상 성립하므로 반올림 잔여 오차 보정은 없다.
- 루틴 점수는 챌린지별 각 사이클의 순변동을 −20 ~ +20점으로 클램핑해 반영한다. 달력 주차도 계정 합산도 아니며, 상승·하락을 따로 세지 않는다(정책 §4.7). 사건성 감점은 한도에서 제외한다.
- 이의 인용은 원본 기록을 덮어쓰지 않고 최초 영향 시점 이후 이벤트를 재생해 최종 상태를 교체한다.
- 업무 테이블은
user_score_summaries·cycle_score_states·score_transactions 3개다. 연속 성공/실패 결과는 사이클 상태에, 정정 관계·처리 완료는 원장에 통합하고 요약·사이클 상태·원장·공통 아웃박스를 사용자별 한 트랜잭션으로 확정한다.
2. 전제 및 현재 시스템
- 영향받는 서비스/모듈
- 인증 모듈 — 날짜별 자동 인증 최종 판정과 정정 전달
- 챌린지 모듈 — 사이클·목표 횟수·인증 가능일·사이클 마감 전달
- 티어·점수 모듈 — 점수 상태·사이클 누적·연속 기록·원장 관리
- 라이프사이클 모듈 — 부정행위·강퇴·중도 탈퇴 사건 전달
- 챌린지 가입 모듈 — 표시 티어 기준 최소 입장 티어 집행
- 알림 모듈 — 승급·강등·경계 이벤트 소비
- 예상 트래픽
- 사용자 2만 명 × 참여 챌린지 3개 기준 일 최대 약 6만 건의 날짜별 판정 입력을 가정한다.
- 다음 날 03시 전후에 입력이 집중될 수 있다.
- 사이클 마감은 사용자·챌린지별 주 1회이며, 이의 정정과 사건성 감점은 상대적으로 저빈도다.
- 외부 의존성
- 외부 서비스 직접 의존성 없음.
- 내부 인증·챌린지·회원 도메인의 최종 확정 결과에 의존한다.
- 공개 API 계약은 별도 API 명세가 원본이다.
3. 목표 Goals / 목표가 아닌 것 Non-Goals
Goals
- 같은 날짜 판정이 재시도·중복 이벤트·동시 처리로 두 번 반영되는 경우를 0건으로 유지한다.
- 성공·미달 반영 누계가 정책 표의 주간 총 배점과 정확히 일치하도록 한다 —
f(N) = W 불변식을 테스트로 고정한다.
- 사용자 한 명의 점수 상태, 사이클 누적, 연속 기록, 점수 원장이 서로 다른 버전으로 저장되지 않게 한다.