---
title: "📓 작업일지 — 약관동의 게이트 반복 표시 수정 (웹↔구번들앱 버전 핑퐁 차단)"
category: "worklog"
parent: "Claude Code 작업일지"
updated: "2026-07-18"
priority: "Medium"
purpose: "구버전 번들 클라이언트(재빌드 전 안드로이드 앱)가 옛 버전 라벨로 동의를 append하면서 웹과 앱이 서로의 동의를 무효화해 약관동의 게이트가 반복 표시되던 문제를 수정한 기록. 최신 행 의사 판정과 현재 버전 동의 이력 판정을 분리했다."
read_when: ["약관동의 게이트 반복 표시", "consent.ts", "pickLatestConsents", "has_current_agreement", "웹앱 버전 핑퐁"]
document_type: "개발일지"
source_status: "generated"
knowledge_group: "03_history"
work_timestamp: "20260718_154910"
source_of_truth: "https://dallog-tools.hansbridge.co.kr/knowledge/"
context: "달록 본레포(ccy-hansbridge/dallog), 커밋 e406768(2026-07-18)."
---

# 작업일지 — 약관동의 게이트 반복 표시 수정

> 구버전 번들 클라이언트(예: 재빌드 전 안드로이드 앱)가 옛 버전 라벨로 동의 기록을 이어붙이면, "최신 행의 버전 = 현재 버전"으로만 판정하던 기존 로직에서는 신버전 동의가 가려져 웹↔앱이 서로의 동의를 무효화하는 핑퐁이 발생했다. Codex 4차 검수를 거쳐 반영했다.

## 1. 무엇을 했나

- `LatestConsent` 타입에 `has_current_agreement`(현재 버전 이상의 agreed=true 행이 이력에 존재하는가) 필드를 신설.
- 신규 함수 `pickLatestConsents(rows)`를 분리해, ① 최신 행이 동의 상태인가(사용자의 최종 의사표시)와 ② 현재 버전 동의 이력이 있는가를 서로 다른 기준으로 판정하도록 분리:
  - 철회 행(agreed=false)을 지난 consent_type은 그 이전 동의를 무효화된 이력으로 보고 인정하지 않음(Codex 3차 반영).
  - 버전 문자열은 `YYYY-MM-DD` 고정 포맷(`VERSION_FORMAT` 정규식)만 인정 — 형식이 다른 비정상 버전 문자열이 사전순 비교로 게이트를 우회하지 못하게 방어.
- `fetchLatestConsents()`가 새 `pickLatestConsents()`를 사용하도록 교체.
- `ConsentRow` 타입을 외부에서 재사용 가능하도록 `export`로 변경.
- `src/lib/consent.test.ts`에 관련 테스트 103줄 신규 추가.

## 2. 주요 변경 파일

| 파일 | 내용 |
|---|---|
| `src/lib/consent.ts` | `pickLatestConsents` 신설, `has_current_agreement` 필드 추가, 철회 판정 로직 |
| `src/lib/consent.test.ts` | 신규 테스트 103줄 |
| `src/components/settings/ConsentHistory.tsx` | 관련 표시 로직 수정(1줄) |

## 3. 관련 커밋

- `e406768` fix(consent): 약관동의 게이트 반복 표시 수정 — 웹↔구번들앱 버전 핑퐁 차단(최신행 의사 + 신버전 동의 이력 분리 판정, Codex 4차 검수) (2026-07-18)

## 4. 남은 이슈

커밋 기준 별도로 언급된 남은 이슈는 없음.
