# 운영자 워크플로우 마이그레이션

## 결론

장면 엔진 35개와 운영 화면은 같은 범위가 아니다. 35개 builder가 DB DTO와 K3D mutation을 만들 수 있어도, 원본 운영자가 선택하던 종목·업종·비교 대상과 수동 입력을 Web UI가 만들지 못하면 실제 방송 업무는 시작할 수 없다.

이번 단계에서 캡처의 핵심 종목 흐름은 다음과 같이 복구했다.

`종목명 검색 → Oracle/MariaDB 결과 선택 → 종목용 컷 선택 → 플레이리스트 → F8 PREPARE/TAKE IN → NEXT/TAKE OUT`

## 복구된 종목 흐름

- KOSPI `T_STOCK`, KOSDAQ `T_KOSDAQ_STOCK`, NXT KOSPI `N_STOCK/N_ONLINE`, NXT KOSDAQ `N_KOSDAQ_STOCK/N_KOSDAQ_ONLINE`을 매개변수 쿼리로 검색한다.
- LIKE의 `%`, `_`, `!`는 escape하고 검색어·결과 수·열 스키마·종목 코드 형식을 제한한다.
- 검색 결과는 시장, 종목명, 종목 코드를 함께 보존하므로 원본처럼 이름을 다시 훑어 코드를 추정하지 않는다.
- MSIX에서도 수정 가능한 `%LOCALAPPDATA%/MBN_STOCK_WEBVIEW/Res/종목.ini`를 먼저 읽고, 외부 파일이 없을 때만 패키지 실행 폴더의 CP949 `Res/종목.ini`를 확인한다. 유효한 파일은 원본 물리 순서와 `-` 구분행을 그대로 표시한다.
- 외부 파일이 존재하지만 잘못됐거나, 두 후보가 모두 없거나 유효하지 않으면 부분 목록을 사용하지 않는다. 실행 자산 SHA-256 `45DFB1804828F0E4A45F73D681AF0709CE5662872FAA49CFC9F7A0B940409E20`에서 고정한 31개 내장 목록으로 폴백하며 경로 없는 경고를 표시한다. 실제 파일은 Git/MSIX에 넣지 않는다.
- NXT 종목은 원본과 같이 `1열판기본_현재가`와 `N5001`만 허용한다.
- 5일선·20일선은 컷 추가 시점의 사본이 아니라 현재 전역 체크 상태를 모든 캔들 항목에 동기화하고 PREPARE 직전에 다시 고정한다.
- 저장된 typed 종목 항목은 builder, alias, selection, 종목, 이동평균선이 모두 재생성 결과와 같을 때만 복원한다. 실패한 항목은 일반 catalog 경로로 우회하지 못한다.
- 플레이리스트 첫 열은 원본 의미와 같은 `송출` 여부다. 행 클릭은 삭제·이동 선택이며 Ctrl+클릭으로 복수 선택한다.
- 현재 장면 행은 네이티브가 보낸 실제 page index/page count를 표시한다.
- F8은 IDLE에서 PREPARE 성공을 받은 뒤 TAKE IN을 정확히 한 번 요청한다. Live/Test TAKE IN 승인이 잠겨 있으면 PREPARE도 자동 실행하지 않는다.
- 원본 F2는 trusted scene-root 안의 배경 파일 선택을 열고, F3은 배경 없음 상태를 토글한다. PREPARE 단축키로 재사용하지 않는다.

## 현재 사용법

1. 대시보드, 코스피 또는 코스닥 메뉴에서 왼쪽 `종목 검색`에 종목명을 입력한다.
2. 결과에서 정확한 종목과 시장을 선택한다.
3. `종목용 컷`의 `+`를 누르거나 행을 더블클릭한다.
4. 플레이리스트 첫 열의 `송출` 체크와 순서를 확인한다.
5. DryRun에서 F8 또는 TAKE IN 버튼으로 PREPARE→TAKE IN을 검증한다.
6. 실제 Test/Live에서는 회차별 안전 게이트가 TAKE IN을 허용한 경우에만 같은 버튼이 활성화된다.
7. 종목 입력 영역의 `접기`를 누르면 전체 장면 catalog와 시장 데이터 영역을 사용할 수 있다.

## 실제 검증 결과

2026-07-11 로컬 운영 DB에서 다음을 확인했다.

- Oracle 21c 및 MariaDB health 정상
- `삼성` 검색 63건: KOSPI 42, KOSDAQ 9, NXT KOSPI 12
- `삼성전자`/`KR7005930003` 선택
- `1열판기본_현재가` → builder `s5001`, alias `5001`, KOSPI/CURRENT selection 생성
- 패키지 컨텍스트 DryRun의 PREPARE → TAKE IN, mutation preview 32개, TAKE OUT, 최종 편집 잠금 해제
- COM 및 `KTAPConnect` 호출 없음

## 전체 운영 화면 구현 범위

35개 scene builder와 별개였던 원본 운영자 선택 표면을 모두 닫힌 workflow와 전용 화면으로 연결했다. 정확한 실행 action 분해는 다음과 같다.

| 범위 | 수량 | 상태 |
|---|---:|---|
| 해외·환율·지수 등 고정 action | 328 | 화면 통합 완료. 이 중 수동 placeholder 6개는 FSell/VIList 화면으로만 연다. |
| 코스피·코스닥 업종 action | 44 | 화면 통합 완료 |
| 종목 action | 31 | 화면 통합 완료 |
| 비교 action | 9 | 화면 통합 완료 |
| 합계 | **412** | 명령 생성·strict restore 자동 매트릭스 완료 |
| UC3 고정 비교 선택지 | 24 | 비교 화면의 typed target으로 통합 완료 |

추가 전용 화면도 연결됐다.

- GraphE: 주요매출 구성, 성장성 지표, 매출액, 영업이익의 조회·편집·삭제·playlist 추가
- FSell/VIList: trusted local store의 저장·재조회·버전 검증 뒤 `s5025`/`s5074` 추가
- ThemeA/EList: 테마·전문가와 구성 종목의 생성·교체·삭제
- PList/AList: Oracle `DC_LIST`/`PLAY_LIST` 이름 있는 저장·불러오기·삭제
- F2/F3: trusted 배경 선택과 배경 없음 토글

수동 입력 DB 쓰기와 이름 있는 플레이리스트 저장은 read-only query executor와 분리된 매개변수 repository/transaction 경계를 사용한다. 송출이 IDLE임을 네이티브 engine과 workflow 양쪽에서 확인할 수 없거나, browser 상관관계·commit 결과가 불명확하면 모든 operator write를 프로세스 수명 동안 차단하고 자동 재시도하지 않는다.

## 완료 판정

412개 실행 명령, UC3 비교 선택지, 수동 입력, 배경, 이름 있는 저장·불러오기까지 Web 화면 연결과 자동 계약 검증은 완료됐다. 다만 실제 운영 DB write와 각 경로의 Tornado2 PGM 확인은 UI 구현 완료와 별도다. 승인된 테스트 데이터·롤백 계획·회차별 PGM 승인이 없는 실환경 mutation이나 TAKE IN은 완료 증거를 만들기 위해 임의로 실행하지 않는다.
