Switch streak bonus to capped per-day ramp

- 스트릭 보너스를 마일스톤 계단(+2/+5/+10/+20)에서 min(스트릭 일수, 15) 일별 점증 구조로 교체
- 적중일 기본 적립 대비 보너스 비중을 30~50%까지 높여 스트릭 유지 유인 강화 (포인트 경제 리서치 결론 반영)
- 상한 15로 시즌 이월 장기 스트릭의 이득을 초반 램프업 생략(~105pt) 수준으로 제한 — 이월은 의도적 허용
- judgmentService 테스트의 포인트 기대값을 새 공식으로 갱신
This commit is contained in:
윤정민 2026-07-23 14:37:09 +09:00
parent da8ecf6d4f
commit a38d7ade28
2 changed files with 14 additions and 9 deletions

View File

@ -33,14 +33,19 @@ export function judgeByCounts(correct: number, t: Thresholds): DailyJudgment {
return "fail";
}
/**
* · .
*
* "초반 램프업 생략" ( ~105pt) .
*/
export const STREAK_BONUS_CAP = 15;
/**
* · .
* .
* [STREAK_BONUS_CAP]
* ( × 10) 30~50% .
*/
export function streakBonus(streakAfter: number): number {
if (streakAfter >= 30) return 20;
if (streakAfter >= 14) return 10;
if (streakAfter >= 7) return 5;
if (streakAfter >= 3) return 2;
return 0;
if (streakAfter <= 0) return 0;
return Math.min(streakAfter, STREAK_BONUS_CAP);
}

View File

@ -135,7 +135,7 @@ describe("judgmentService (Firestore emulator)", () => {
expect(hist.streakAfter).toBe(1);
expect(user.currentStreak).toBe(1);
expect(user.highestStreak).toBe(1);
expect(user.tierPoints).toBe(50); // 5 * 10, streak 1이라 보너스 0
expect(user.tierPoints).toBe(51); // 5 * 10 + 스트릭 보너스 min(1, 15)
expect(user.lastJudgedDate).toBe(TUE);
});
@ -157,7 +157,7 @@ describe("judgmentService (Firestore emulator)", () => {
expect(hist.judgment).toBe("success");
expect(user.currentStreak).toBe(1);
expect(user.tierPoints).toBe(30);
expect(user.tierPoints).toBe(31); // 3 * 10 + 스트릭 보너스 1
});
it("5경기·2적중은 fail, 스트릭 0 유지, 포인트 불변", async () => {
@ -382,7 +382,7 @@ describe("judgmentService (Firestore emulator)", () => {
const user = await readUser();
expect(user.currentStreak).toBe(1);
expect(user.tierPoints).toBe(50);
expect(user.tierPoints).toBe(51);
});
});