diff --git a/SodaLive/Sources/V2/Component/CapsuleTabBar.swift b/SodaLive/Sources/V2/Component/CapsuleTabBar.swift index 130431b3..f3fa7aad 100644 --- a/SodaLive/Sources/V2/Component/CapsuleTabBar.swift +++ b/SodaLive/Sources/V2/Component/CapsuleTabBar.swift @@ -42,16 +42,16 @@ private struct CapsuleTabBarItem: View { } label: { Text(title) .appFont(.body5) - .foregroundColor(Color.white) + .foregroundColor(isSelected ? Color.black : Color.white) .lineLimit(1) .padding(.horizontal, SodaSpacing.s12) .padding(.vertical, SodaSpacing.s8) .frame(height: 34) - .background(isSelected ? Color.soda400 : Color.black) + .background(isSelected ? Color.white : Color.black) .clipShape(Capsule()) .overlay( Capsule() - .stroke(isSelected ? Color.soda400 : Color.gray700, lineWidth: 1) + .stroke(isSelected ? Color.white : Color.gray700, lineWidth: 1) ) } .buttonStyle(.plain) diff --git a/docs/20260818_CapsuleTabBar_선택_색상_변경/plan-task.md b/docs/20260818_CapsuleTabBar_선택_색상_변경/plan-task.md new file mode 100644 index 00000000..7ad85fc0 --- /dev/null +++ b/docs/20260818_CapsuleTabBar_선택_색상_변경/plan-task.md @@ -0,0 +1,217 @@ +# CapsuleTabBar 선택 색상 변경 계획 + +| 문서 항목 | 내용 | +|---|---| +| 상태 | 구현 및 사용자 수동 검증 완료 | +| 작성일 | 2026-08-18 | +| 요구사항 기준 | `docs/20260818_CapsuleTabBar_선택_색상_변경/prd.md` | +| API 기준 | 해당 없음 | +| 현재 Phase | Phase 2 완료 | +| 현재 활성 Goal | 없음 | + +## 목표 + +공유 `CapsuleTabBar`를 사용하는 세 화면과 Preview에서 선택 탭을 흰색 배경, 검은색 텍스트, 흰색 테두리로 일관되게 표시한다. + +## 현재 상태 + +| Phase | 상태 | 완료 Task | 활성/다음 Goal | 차단 또는 남은 조건 | +|---:|---|---:|---|---| +| 1 | 완료 | `1/1` | 없음 | 문서 작성만 완료 | +| 2 | 완료 | `1/1` | 없음 | 없음 | + +## 범위 + +### 포함 + +- 공유 `CapsuleTabBar`의 선택 상태 배경, 텍스트, 테두리 색상 변경 +- `CreatorChannelAudioTabView`, `MainChatView`, `MainContentAllView`, `CapsuleTabBar_Previews`에서의 수동 확인 +- focused 정적 확인과 `SodaLive` Debug 빌드 + +### 제외 + +- 미선택 상태의 배경 `Color.black`, 텍스트 `Color.white`, 테두리 `Color.gray700` 변경 +- 크기, 간격, typography, 가로 스크롤, 선택 바인딩, action 변경 +- API, 데이터 동작, 프로젝트 파일, 의존성, 테스트 타깃, 디자인 토큰, 공통 abstraction, 기존 기능 문서 변경 + +## 기술적 제약 + +- 수정 파일은 `SodaLive/Sources/V2/Component/CapsuleTabBar.swift` 하나다. +- 현재 테스트 번들 타깃이 없으므로 XCTest 파일이나 타깃을 새로 만들지 않는다. +- 공식 빌드 명령은 `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build`다. +- 공식 lint와 formatter 실행 스크립트는 없다. 구현 검증은 focused 정적 확인, 빌드, 수동 확인으로 한다. +- Phase 1 문서화 세션에서는 Swift source, 프로젝트 파일, API, 기존 기능 문서를 변경하지 않는다. + +## Phase 1 문서화 + +**Phase 결과:** 승인된 선택 색상, 적용 화면, 제외 범위, 미래 구현 파일과 검증 기준이 결정됐다. + +**선행조건:** 없음. + +**Phase 완료 조건:** `P1-T1` 완료와 문서 생성 검증 기록 누적. + +### 구현 항목 + +#### Task 1.1 문서 기준 확정 + +**Goal 실행 `P1-T1`:** 코드 변경 없이 구현 가능한 PRD와 계획을 작성한다. + +- **시작 조건:** 승인된 선택 상태 색상과 적용 범위가 제공됨. +- **완료 증거:** `prd.md`와 `plan-task.md`가 생성되고, 요구사항과 계획에 placeholder가 없으며 문서 생성 검증 기록이 남음. +- **범위 밖:** Swift source, 프로젝트 파일, API, 기존 기능 문서 수정. +- **TDD 예외 사유:** production 동작을 변경하지 않는 문서화 Task다. +- **대체 검증 방법:** 생성 파일 경로와 필수 문구를 확인하고 `git diff --check`로 문서 diff 공백 오류를 확인한다. + +**Files:** + +- Create: `docs/20260818_CapsuleTabBar_선택_색상_변경/prd.md` +- Create: `docs/20260818_CapsuleTabBar_선택_색상_변경/plan-task.md` +- Confirm: `docs/agent-guides/documentation-policy.md` +- Confirm: `docs/sample/sample-prd.md` +- Confirm: `docs/sample/sample-plan-task.md` + +- [x] 승인된 범위와 현재 공유 컴포넌트 호출부를 확인한다. +- [x] PRD에 선택 상태 세 색상, 유지 항목, 세 화면과 Preview 수용 기준을 기록한다. +- [x] 계획에 문서 완료 Task, 미래 구현 Task, 완료 증거, 검증 방법과 미시작 상태를 기록한다. +- [x] 문서 생성만 검증하고 검증 기록을 누적한다. + +### 완료 조건 + +- [x] `P1-T1`의 완료 증거를 충족했다. +- [x] 문서가 구현 범위를 벗어나지 않는다. + +## Phase 2 미래 구현 + +**Phase 결과:** 세 production 화면과 Preview의 선택 탭이 승인된 세 색상으로 표시되고, 미선택 상태와 기존 동작은 유지된다. + +**선행조건:** `P1-T1` 완료. + +**Phase 완료 조건:** `P2-T1`과 `P2-GATE` 완료, 구현 검증 기록 누적. + +### 구현 항목 + +#### Task 2.1 공유 선택 상태 색상 변경 + +**Goal 실행 `P2-T1`:** `CapsuleTabBarItem`의 선택 상태 색상만 승인된 값으로 교체한다. + +- **시작 조건:** `P1-T1` 완료와 `CTB-001`~`CTB-004` 확인. +- **완료 증거:** 선택 상태가 배경 `Color.white`, 텍스트 `Color.black`, 테두리 `Color.white`이고 focused 정적 확인과 Debug 빌드가 성공함. +- **범위 밖:** 호출부 파일 수정, 미선택 색상 변경, 레이아웃과 상호작용 변경, 테스트 타깃 추가. +- **TDD 예외 사유:** 현재 저장소에 XCTest 번들 타깃이 없어 focused XCTest를 실행할 수 없다. 이 Task에서 테스트 인프라를 추가하지 않는다. +- **대체 검증 방법:** 선택과 미선택 색상 표현식을 정적으로 확인하고 빌드 및 네 화면 수동 확인으로 결과를 판정한다. + +**Files:** + +- Modify: `SodaLive/Sources/V2/Component/CapsuleTabBar.swift` +- Confirm: `SodaLive/Sources/V2/CreatorChannel/Audio/CreatorChannelAudioTabView.swift` +- Confirm: `SodaLive/Sources/V2/Main/Chat/MainChatView.swift` +- Confirm: `SodaLive/Sources/V2/Main/Content/All/MainContentAllView.swift` +- Confirm: `SodaLive/Sources/V2/Component/CapsuleTabBar.swift`의 `CapsuleTabBar_Previews` +- Confirm: `docs/agent-guides/build-test-verification.md` + +**Interfaces:** + +- Consumes: 기존 `items`, `selectedItem`, `title`, `action` 계약. +- Produces: 기존 API와 동작을 유지한 선택 상태 색상 표현. + +- [x] **RED:** 임시 정적 계약 검사에서 선택 상태의 배경·텍스트·테두리와 미선택 상태를 함께 검증한다. +- [x] **RED 확인:** 변경 전 검사에서 `.foregroundColor(isSelected ? Color.black : Color.white)`가 없어 `FAIL [selected-text]`로 종료됨을 확인한다. +- [x] **GREEN:** `SodaLive/Sources/V2/Component/CapsuleTabBar.swift`에서 선택 상태 표현식만 `Color.white` 배경, `Color.black` 텍스트, `Color.white` 테두리로 바꾼다. +- [x] **GREEN 확인:** 같은 정적 계약 검사가 `PASS: CapsuleTabBar selected and unselected color contract`로 종료됨을 확인한다. +- [x] **REFACTOR:** 변경이 세 색상 표현식에 한정되어 리팩터링하지 않았다. `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build`에서 `** BUILD SUCCEEDED **`를 확인했다. + +### 검증 방법 + +#### Phase 2 Gate + +**Goal 실행 `P2-GATE`:** 승인된 색상, 유지 범위, 세 production 화면과 Preview를 최종 판정한다. + +- **시작 조건:** `P2-T1`의 모든 체크박스 완료. +- **완료 증거:** focused 정적 확인, Debug 빌드, 아래 수동 확인이 모두 성공하고 Progress에 기록됨. +- **범위 밖:** 실패를 숨기기 위한 test 삭제, 호출부별 예외 스타일, 관련 없는 코드 수정. + +```bash +rg -n 'Color\.(white|black|gray700|soda400)' SodaLive/Sources/V2/Component/CapsuleTabBar.swift +xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build +``` + +**Expected:** 선택 상태는 `Color.white`, `Color.black`, `Color.white`이고, 미선택 상태는 `Color.black`, `Color.white`, `Color.gray700`이다. 빌드는 `** BUILD SUCCEEDED **`로 끝난다. + +수동 검증: + +- [x] `CreatorChannelAudioTabView`에서 테마를 선택하고 선택 탭의 세 색상과 미선택 탭 색상을 확인한다. +- [x] `MainChatView`에서 채팅 필터를 전환하고 선택 탭의 세 색상과 기존 필터 전환 동작을 확인한다. +- [x] `MainContentAllView`에서 콘텐츠 유형을 전환하고 선택 탭의 세 색상과 기존 목록 전환 동작을 확인한다. +- [x] `CapsuleTabBar_Previews`에서 선택 탭의 세 색상을 확인한다. + +`visual-qa`는 사용자 요청에 따라 수행하지 않았다. 위 네 항목은 사용자의 실제 앱 또는 Preview 수동 확인 결과를 반영해 완료 처리했다. + +## 실행 순서와 의존성 + +| 순서 | Goal | 선행조건 | 병행 가능 | 차단 시 다음 행동 | +|---:|---|---|---|---| +| 1 | `P1-T1` | 없음 | 아니요 | 없음 | +| 2 | `P2-T1` | `P1-T1` | 아니요 | 실패한 색상 표현식만 원복하고 PRD 기준과 대조 | +| 3 | `P2-GATE` | `P2-T1` | 아니요 | 실패 소유 Task의 회귀 수정 Task를 추가 | + +```text +P1-T1 → P2-T1 → P2-GATE +``` + +## 변경 금지 항목 + +- `SodaLive/Sources/V2/Component/CapsuleTabBar.swift` 외의 Swift source를 수정하지 않는다. +- Swift source와 무관한 프로젝트 파일, API, 기존 기능 문서를 수정하지 않는다. +- 미선택 상태 색상, 크기, 간격, typography, 가로 스크롤, 선택 바인딩, action을 변경하지 않는다. +- 새 테스트 타깃, 의존성, 디자인 토큰, abstraction을 추가하지 않는다. + +## 검증 기록 + +### `P1-T1` 1차 실행, 2026-08-18 + +- 상태: 완료 +- 무엇을: `docs/20260818_CapsuleTabBar_선택_색상_변경/prd.md`와 `docs/20260818_CapsuleTabBar_선택_색상_변경/plan-task.md`를 생성했다. +- 왜: 승인된 선택 상태 색상 변경을 코드 구현 전에 결정 완료된 PRD와 실행 가능한 계획으로 남기기 위해서다. +- 어떻게: + - `rg --files docs/20260818_CapsuleTabBar_선택_색상_변경` — `prd.md`, `plan-task.md` 두 경로 확인. + - `rg -n 'Color.white|Color.black|Color.gray700|CreatorChannelAudioTabView|MainChatView|MainContentAllView|CapsuleTabBar_Previews' docs/20260818_CapsuleTabBar_선택_색상_변경` — 필수 색상 결정, 세 production 사용처와 Preview 수용 기준 확인. + - `rg -n 'TBD|TODO|<[^>]+>|적절한|필요 시|추후 결정' docs/20260818_CapsuleTabBar_선택_색상_변경 | rg -v 'rg -n'` — 출력 없음. + - `rg -n '[[:blank:]]+$' docs/20260818_CapsuleTabBar_선택_색상_변경` — 출력 없음. + - `xcodebuild -workspace "SodaLive.xcworkspace" -list` — 종료 코드 0, `SodaLive`와 `SodaLive-dev` 스킴 확인. +- 결과: placeholder와 줄 끝 공백 없이 문서 두 개를 생성했다. Swift source, 프로젝트 파일, API, 기존 기능 문서는 변경하지 않았다. +- 남은 항목: `P2-T1`, `P2-GATE`의 모든 체크박스. +- 다음 행동: 미래 구현 세션에서 `P2-T1`을 시작한다. + +### `P2-T1` 1차 실행, 2026-08-18 + +- 상태: 완료 +- 무엇을: 공유 `CapsuleTabBarItem`의 선택 상태만 배경 `Color.white`, 텍스트 `Color.black`, 테두리 `Color.white`로 변경했다. +- 왜: 모든 `CapsuleTabBar` 사용 화면에서 승인된 선택 상태를 일관되게 적용하기 위해서다. +- 어떻게: + - 임시 정적 계약 검사 변경 전 실행 — `FAIL [selected-text]`로 RED 확인. + - 같은 검사 변경 후 실행 — `PASS: CapsuleTabBar selected and unselected color contract`로 GREEN 확인. + - `rg -n "CapsuleTabBar\\(" SodaLive/Sources/V2/CreatorChannel/Audio/CreatorChannelAudioTabView.swift SodaLive/Sources/V2/Main/Chat/MainChatView.swift SodaLive/Sources/V2/Main/Content/All/MainContentAllView.swift` — 세 production 사용처 확인. + - `git diff --check` — 출력 없이 종료 코드 0. + - `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build` — `** BUILD SUCCEEDED **`. +- 남은 항목: `P2-GATE`의 사용자 수동 검증 4개. +- 다음 행동: 사용자가 세 production 화면과 `CapsuleTabBar_Previews`에서 선택·미선택 색상과 기존 탭 전환 동작을 확인한다. + +### `P2-GATE` 1차 실행, 2026-08-18 + +- 상태: 완료 +- 무엇을: 세 production 화면과 `CapsuleTabBar_Previews`의 선택·미선택 색상 및 기존 탭 전환 동작을 최종 확인했다. +- 왜: `CTB-001`~`CTB-004`의 화면 수용 기준을 완료 판정하기 위해서다. +- 어떻게: + - 자동 검증: 정적 색상 계약 통과, `SodaLive` Debug 빌드 성공, `git diff --check` 성공. + - 수동 검증: 사용자가 네 수동 검증 항목의 완료를 확인했다. +- 남은 항목: 없음. +- 다음 행동: 없음. + +## Decision Log + +| 날짜 | ID | 상태 | 결정 | 근거 | 영향 Goal/문서 | +|---|---|---|---|---|---| +| 2026-08-18 | `DEC-CTB-PLAN-001` | 확정 | 문서 작성 Task만 완료 처리하고 코드 구현 Task는 모두 미완료로 둔다. | 이번 세션은 문서 생성만 승인됨. | `P1-T1`, `P2-T1`, `P2-GATE` | +| 2026-08-18 | `DEC-CTB-PLAN-002` | 확정 | 미래 구현은 공유 컴포넌트 파일 하나만 수정하고, 세 화면과 Preview는 검증 대상으로 둔다. | `CapsuleTabBar`의 확인된 호출 관계. | `P2-T1`, `P2-GATE` | +| 2026-08-18 | `DEC-CTB-PLAN-003` | 확정 | 현재 브랜치에서 구현하고 `visual-qa` 대신 사용자 수동 검증을 남긴다. | 사용자 실행 지시. | `P2-T1`, `P2-GATE` | +| 2026-08-18 | `DEC-CTB-PLAN-004` | 확정 | 사용자 수동 확인 결과를 반영해 `P2-GATE`를 완료 처리한다. | 사용자 수동 확인 완료 결과. | `P2-GATE` | diff --git a/docs/20260818_CapsuleTabBar_선택_색상_변경/prd.md b/docs/20260818_CapsuleTabBar_선택_색상_변경/prd.md new file mode 100644 index 00000000..4fb0e26b --- /dev/null +++ b/docs/20260818_CapsuleTabBar_선택_색상_변경/prd.md @@ -0,0 +1,90 @@ +# PRD: CapsuleTabBar 선택 색상 변경 + +## 문서 정보 + +| 항목 | 내용 | +|---|---| +| 문서 상태 | 구현 및 사용자 수동 검증 완료 | +| 작성일 | 2026-08-18 | +| 최종 수정일 | 2026-08-18 | +| 대상 기능 | 공유 `CapsuleTabBar` 선택 상태 색상 | +| 관련 구현 계획 | `docs/20260818_CapsuleTabBar_선택_색상_변경/plan-task.md` | +| 관련 API Contract | 해당 없음 | +| 관련 review | 해당 없음 | + +## 1. Overview + +공유 `CapsuleTabBar`의 선택 상태를 흰색 배경, 검은색 텍스트, 흰색 테두리로 변경한다. 이 컴포넌트를 사용하는 `CreatorChannelAudioTabView`, `MainChatView`, `MainContentAllView`와 `CapsuleTabBar_Previews`에 같은 선택 상태가 적용된다. + +## 2. Problem Statement + +변경 전 선택 상태는 `Color.soda400` 배경과 테두리, `Color.white` 텍스트를 사용했다. 승인된 화면 기준에 맞춰 공유 컴포넌트의 선택 상태만 변경해야 하며, 호출 화면마다 별도 스타일을 추가하면 상태가 달라질 위험이 있다. + +## 3. Goals + +- 선택된 탭은 배경 `Color.white`, 텍스트 `Color.black`, 테두리 `Color.white`로 표시한다. +- 모든 production 호출부와 `CapsuleTabBar_Previews`에서 같은 선택 상태를 확인할 수 있다. +- 기존 선택 바인딩과 탭 동작을 유지한다. + +## 4. Non-Goals + +- 선택되지 않은 탭의 배경 `Color.black`, 텍스트 `Color.white`, 테두리 `Color.gray700`를 변경하지 않는다. +- 크기, 간격, typography, 가로 스크롤, 선택 바인딩과 action을 변경하지 않는다. +- API, 데이터 처리, 화면별 별도 색상, 디자인 토큰, 새 abstraction, 리팩터링을 추가하지 않는다. +- Swift source, 프로젝트 파일, API, 기존 기능 문서는 이 문서 작성 세션에서 변경하지 않는다. + +## 5. Core Requirements + +| ID | 상태 | 요구사항 | 수용 기준 | 계획 연결 | +|---|---|---|---|---| +| `CTB-001` | 확정 | `CapsuleTabBar`의 선택 상태 배경은 `Color.white`다. | 선택 항목의 배경 표현식이 `Color.white`이고 세 화면과 Preview에서 선택 탭이 흰색 배경으로 보인다. | `P2-T1` | +| `CTB-002` | 확정 | `CapsuleTabBar`의 선택 상태 텍스트는 `Color.black`이다. | 선택 항목의 텍스트 표현식이 `Color.black`이고 세 화면과 Preview에서 선택 탭 텍스트가 검은색으로 보인다. | `P2-T1` | +| `CTB-003` | 확정 | `CapsuleTabBar`의 선택 상태 테두리는 `Color.white`다. | 선택 항목의 테두리 표현식이 `Color.white`이고 세 화면과 Preview에서 선택 탭 테두리가 흰색으로 보인다. | `P2-T1` | +| `CTB-004` | 확정 | 선택되지 않은 상태와 기존 상호작용은 유지한다. | 미선택 항목은 `Color.black`, `Color.white`, `Color.gray700`을 유지하고 탭 선택 시 기존 `Binding`과 action이 그대로 동작한다. | `P2-GATE` | + +## 6. 대상 화면과 적용 범위 + +| 구분 | 경로 | 확인 내용 | +|---|---|---| +| 크리에이터 채널 오디오 | `SodaLive/Sources/V2/CreatorChannel/Audio/CreatorChannelAudioTabView.swift` | 테마 탭의 선택 상태 | +| 메인 채팅 | `SodaLive/Sources/V2/Main/Chat/MainChatView.swift` | 채팅 필터 탭의 선택 상태 | +| 메인 콘텐츠 전체 | `SodaLive/Sources/V2/Main/Content/All/MainContentAllView.swift` | 콘텐츠 유형 탭의 선택 상태 | +| SwiftUI Preview | `SodaLive/Sources/V2/Component/CapsuleTabBar.swift` | `CapsuleTabBar_Previews`의 선택 상태 | + +모든 production 사용은 위 세 화면이며, 구현 변경 대상은 공유 컴포넌트 파일 하나다. + +## 7. Technical Constraints + +- 미래 구현 수정 파일은 `SodaLive/Sources/V2/Component/CapsuleTabBar.swift`만 사용한다. +- 현재 확인된 호출부와 Preview는 수정하지 않고 공유 컴포넌트 변경 결과를 검증하는 대상이다. +- CocoaPods 의존성과 기존 SwiftUI, `Color`, `SodaSpacing` 사용 방식을 유지한다. +- 현재 테스트 번들 타깃이 확인되지 않았으므로 새 테스트 타깃, 테스트 파일, 의존성을 추가하지 않는다. + +## 8. Acceptance Criteria + +- [x] `CreatorChannelAudioTabView`에서 선택된 테마 탭의 배경, 텍스트, 테두리가 각각 `Color.white`, `Color.black`, `Color.white`다. +- [x] `MainChatView`에서 선택된 채팅 필터 탭의 배경, 텍스트, 테두리가 각각 `Color.white`, `Color.black`, `Color.white`다. +- [x] `MainContentAllView`에서 선택된 콘텐츠 유형 탭의 배경, 텍스트, 테두리가 각각 `Color.white`, `Color.black`, `Color.white`다. +- [x] `CapsuleTabBar_Previews`에서 선택된 탭의 배경, 텍스트, 테두리가 각각 `Color.white`, `Color.black`, `Color.white`다. +- [x] 미선택 탭은 배경 `Color.black`, 텍스트 `Color.white`, 테두리 `Color.gray700`을 유지한다. +- [x] 탭을 선택하면 기존 선택 바인딩과 action으로 선택 항목이 바뀐다. +- [x] `SodaLive` Debug 빌드가 성공한다. + +## 9. Related Existing Documents + +- `docs/20260704_크리에이터_채널_오디오_탭/prd.md` +- `docs/20260708_홈_채팅_탭/prd.md` +- `docs/plan-task/20260519_재사용타이틀탭텍스트바컴포넌트.md` + +## 10. Open Questions + +현재 없음. 선택 상태의 세 색상과 수정 파일 범위는 승인됐다. + +## 11. Decision Log + +| 날짜 | ID | 상태 | 결정 | 근거 | 영향 | +|---|---|---|---|---|---| +| 2026-08-18 | `DEC-CTB-001` | 확정 | 선택 상태를 배경 `Color.white`, 텍스트 `Color.black`, 테두리 `Color.white`로 변경한다. | 승인된 요구사항 | `CTB-001`~`CTB-003`, `P2-T1` | +| 2026-08-18 | `DEC-CTB-002` | 확정 | 선택되지 않은 색상, 레이아웃, 스크롤, 바인딩, action, API와 데이터 동작은 유지한다. | 승인된 제외 범위 | `CTB-004`, `P2-GATE` | +| 2026-08-18 | `DEC-CTB-003` | 확정 | 미래 구현은 `SodaLive/Sources/V2/Component/CapsuleTabBar.swift`만 수정한다. | 공유 컴포넌트가 세 production 호출부와 Preview를 제공한다. | `P2-T1` | +| 2026-08-18 | `DEC-CTB-004` | 확정 | 세 production 화면과 Preview의 수동 검증을 완료 처리한다. | 사용자 수동 확인 완료 결과. | `CTB-001`~`CTB-004`, `P2-GATE` |