# PLAY_LIST 비교 행 안전 복원

원본 `UC1`은 비교 장면을 `PLAY_LIST.LIST_TEXT`의 7필드로 저장한다. 새 구현은 이 행을 바로 송출 가능한 값으로 취급하지 않고, 원본 행이 보존한 identity만 현재 master DB에서 다시 확인한다.

## 원본 서명과 복원 규칙

| 원본 장면 | 저장된 group | 자동 복원 |
|---|---|---|
| 2열판 현재/예상체결 | `지수` 또는 `종목` | 두 이름이 닫힌 고정 지수 target이고 group이 `지수`인 경우만 복원 |
| 비교 캔들/라인 | `시장1,시장2` | 각 이름을 지정 시장의 Oracle master에서 exact match한 경우만 복원 |
| 종목별 수익률 비교 | `시장1,시장2` | 각 이름과 5일/1·3·6·12개월 subtype이 모두 exact match한 경우만 복원 |

`종목` 2열판은 각 target의 KOSPI/KOSDAQ/NXT/해외 구분과 종목 코드를 저장하지 않았다. 현재 이름 검색이 우연히 하나만 나오더라도 저장 당시 시장을 증명하지 못하므로 `MISSING_MARKET_IDENTITY`로 남긴다. 임의 KOSPI 기본값이나 가짜 코드를 만들지 않는다.

NXT 캔들·라인·수익률은 identity 조회 전에 `UNSUPPORTED_ACTION`으로 차단한다. 원본 `UC1`이 이 action을 명시적으로 거부하고, 현재 comparison workflow 및 Core scene loader도 KRX Oracle pair만 지원하기 때문이다.

## 2026-07-12 실제 DB 읽기 전용 분류

- `DC_LIST`: 23개, 잘못된 정의 0개
- `PLAY_LIST`: 2,213행
- 비교 후보: 99행
- 고정 지수쌍: 33행, 33행 복원
- KRX 시장쌍 보존: 41행, 41행 exact master match 및 복원
- 시장 유실 `종목` 2열판: 25행, 25행 차단
- 실제 DB에서 확인된 NXT graph 행: 0행

총 74행이 명시적 comparison pair/action으로 복원되고 25행은 계속 PREPARE 차단 상태로 남는다. 이 검수는 bound `SELECT`만 실행했으며 원본 파일, Oracle/MariaDB, Tornado2에 쓰기나 송출 명령을 보내지 않았다.

## 실행 경계

named playlist load 결과가 Web에 먼저 표시된 뒤 같은 load correlation으로 native exact-identity 결과를 받는다. 결과가 오기 전에는 DB 작업과 PREPARE를 잠근다. 응답 순서, request id, action, target 형식 또는 현재 raw row가 다르면 결과 전체를 적용하지 않는다. playout 우선 취소나 DB 오류는 자동 재시도하지 않으며 해당 행은 untrusted 상태로 유지한다.
