# Work Log - 2026-04-19

## Summary

이번 작업에서는 송출 큐 동작, `경력_` 컷 계열 표출 규칙, 공약 직접 입력 기능, 사전 데이터 visibility 처리, 그리고 광역단체장 컷의 정당바 색상 적용 방식을 중심으로 정리했다.

## Recorded Changes

### 1. 다음 목록 즉시 송출

- 현재 송출 중인 상태에서도 대기열의 다음 목록을 바로 다음 on-air 순서로 넘길 수 있도록 `다음 목록 즉시 송출` 동작을 추가했다.
- 운영자가 `다음컷 즉시 송출`과 구분해서 사용할 수 있도록 큐 기반 즉시 송출 흐름을 분리했다.

### 2. `경력_` 컷 공약 직접 입력

- 공약 데이터는 외부 API 수신값이 아니라 고객사가 직접 입력하는 방식으로 정리했다.
- 지역구/후보 단위로 공약을 입력할 수 있도록 편집 모델과 저장 로직을 추가했다.
- 공약 텍스트 유무에 따라 `공약그룹01`, `공약그룹02`, `공약그룹03`의 `visible` 값을 함께 제어하도록 반영했다.

관련 구현 파일:

- `Tornado3_2026Election/Domain/CareerPromiseModels.cs`
- `Tornado3_2026Election/Services/CareerPromiseService.cs`
- `Tornado3_2026Election/ViewModels/CareerPromiseEditRowViewModel.cs`
- `Tornado3_2026Election/ViewModels/DataViewModel.cs`
- `Tornado3_2026Election/ViewModels/MainViewModel.cs`
- `Tornado3_2026Election/MainWindow.xaml`

### 3. `경력_` 컷 후보 표출 규칙

- `경력_` 컷은 지역구당 1명만 나가는 방식이 아니라, 해당 지역구의 모든 후보가 순차적으로 표출되도록 수정했다.
- 후보 정렬 기준은 득표율 순이 아니라 기호 순으로 고정했다.
- `기호텍스트NN`은 고정 문자열 `기호`를 유지하고, `기호NN`에는 `01 -> 1`, `02 -> 2`처럼 정규화된 기호 번호를 사용하도록 정리했다.

관련 구현 파일:

- `Tornado3_2026Election/Domain/FormatCutDefinition.cs`
- `Tornado3_2026Election/Services/ChannelScheduleEngine.cs`
- `Tornado3_2026Election/Models/CandidateEntry.cs`
- `Tornado3_2026Election/Models/CandidateState.cs`
- `Tornado3_2026Election/Services/SbsElectionApiClient.cs`
- `Tornado3_2026Election/Services/KarismaTornado3Adapter.cs`

### 4. 사전 데이터 visibility 처리

- `사전_역대당선자` 계열은 회차 데이터가 비어 있으면 해당 회차 그룹의 `visible`을 `false`로 내리도록 반영했다.
- 예: 1대 데이터가 없으면 `그룹01 = visible false`.

### 5. 무투표 당선 처리

- 후보가 1명이고 `degree = 80`인 경우는 무투표 당선(`UnopposedElected`)으로 처리되는 흐름을 유지한다.
- 관련 판정은 `SbsElectionApiClient.MapJudgement` 기준으로 동작한다.

### 6. 광역단체장 컷 정당바 색상 적용

- `1-2위_ani_광역단체장`
- `1-2위_ani_광역단체장_loop`
- `1-2위_광역단체장`

위 컷들의 `정당바01`은 generated color asset으로 우회하지 않고, Karisma의 `Path Shape > Appearance > Face Color`에 직접 `SetStyleColor(face, order=0, ...)`를 적용하는 방식으로 정리했다.

확인 메모:

- probe 기준 `SetStyleColor(face, order=0, ...)` 호출은 `RESULT_SUCCESS`로 확인했다.
- RGB 값은 텍스트 스펙 값을 그대로 사용한다.
  - `더불어민주당 정당바 = 0,30,84`
  - `국민의힘 정당바 = 95,0,15`
- `정당판`은 현재 운영 요구에 맞춰 asset alias 경로를 유지한다.

### 7. style-bound 오브젝트 주의사항

- style color binding이 있는 오브젝트는 후보 슬롯 clear 단계에서 들어간 빈 `SetValue("")`가 최종 payload에 남지 않도록 정리해야 한다.
- 이 값이 남아 있으면 `Path Shape`의 face color가 적용되지 않은 것처럼 보일 수 있다.

## Verification Notes

- `dotnet build Tornado3_2026Election/Tornado3_2026Election.csproj -c Debug -p:Platform=x64` 빌드는 통과했다.
- 기존 경고는 `WindowsBase` 충돌 경고, 일부 미사용 이벤트, MSIX 인증서 관련 경고 수준으로 유지됐다.

## Follow-up Candidates

- 사전투표율/개표율/후보 수 조건처럼 컷별 누락되기 쉬운 예외 규칙은 별도 체크리스트 문서로 분리해 두면 운영 검수에 유리하다.
- `경력_` 계열과 광역단체장 계열은 실제 입력 데이터 샘플을 기준으로 회귀 점검 항목을 추가해 두는 것이 좋다.
