Files
MBN_STOCK_WEBVIEW/docs/LEGACY_PARITY_VALIDATION_20260715.md

8.2 KiB

LegacyParityApp 이관 검증 증적 — 2026-07-15

이 문서는 현재 MBN_STOCK_WEBVIEW.LegacyParityApp의 구현·통합 최종 검증 결과를 한곳에 모은다. 원본 C:\Users\MD\source\repos\MBN_STOCK_N은 모든 조사와 테스트에서 읽기 전용으로 취급했다.

제품 형태와 권위 경계

항목 결과
제품 형태 .NET 8 / C# / WinUI 3 / Windows App SDK 1.8 / WebView2 / x64 / MSIX Windows 데스크톱 앱
웹사이트 여부 웹사이트가 아님. WinUI 3 프로세스가 패키지의 로컬 Web 자산을 WebView2로 표시
업무 권위 LegacyOperatorController의 C# 상태와 검증된 DTO가 권위
Web 경계 LegacyBridgeProtocol의 strict JSON intent allowlist; Web은 DB identity, scene alias, playlist 또는 송출 상태를 확정하지 않음
벤더 경계 COM/K3D/Tornado 구현은 IPlayoutEngine 뒤에 격리하고 STA 큐와 안전 게이트 유지
기본 송출 모드 DryRun; Live는 별도 개발 설정, 프로세스별 승인, allowlist와 명령 예산 필요
불명확 결과 timeout/OutcomeUnknown에서 자동 재시도·반대 명령·추측 cleanup 금지

원본 UI와 클릭 이벤트

범위 현재 증적
업무 탭 원본 10개 탭, identity 기반 활성화와 순서 변경
종목 영역 모든 탭에서 유지되는 종목 검색, 결과, 31개 컷과 playlist 추가
고정/업종/비교 fixed 328개, 업종 44개, 비교 대상 24개와 action 9개를 폐쇄형 inventory로 고정
독립 클릭 UC4 테마, UC6 전문가, UC7 거래정지의 원본 단일 클릭과 UC4/UC6 행별 독립 처리
전용 입력 GraphE, FSell, VI, PList, AList, ThemeA, EList를 WebView 화면과 C# intent로 연결
해외 UC5 해외업종·해외종목·해외지수 조회와 playlist 생성
playlist 단일/Ctrl/Shift 선택, enabled, 위/아래, 선택/전체 삭제, drag/batch 경계
FarPoint 대체 Web table로 표현하되 원본 클릭·더블클릭·정렬·이동·저장 이벤트 의미 유지

상세 이벤트 대조는 OPERATOR_UI_PARITY.md를 따른다.

송출 흐름과 장면

항목 결과
원클릭 TAKE IN idle에서 보이는 TAKE IN/F8 한 번으로 PrepareAndTakeInAsync가 page load 1회, PREPARE 1회, TAKE IN 1회를 같은 게이트에서 수행
native PREPARE 엔지니어링 진단용 control/intent는 유지하되 운영자 UI에서는 hidden
실패 경계 PREPARE 후 TAKE IN 실패/unknown 시 prepared state 보존, 자동 재시도 없음
장면 기준선 원본 builder 35/35 inventory와 mutation/runtime 자동 기준선 통과
active alias 45개 alias의 대응 .t2s가 승인된 읽기 전용 Cuts에 존재
PageN 5·6·12개 단위, 최대 20페이지, 경계·마지막 부분 페이지·21페이지 거부 테스트
NEXT 같은 scene의 Page NEXT와 다음 enabled playlist 행 NEXT를 원본 조건으로 구분

실제 DB 검증

검증 결과
Oracle/MariaDB read-only PASS — 필수 scene selector 33/33, 전체 query 58건
GraphE write PASSINPUT_PIE, INPUT_GROW, INPUT_SELL, INPUT_PROFIT 각 create, fresh readback, delete, absence
PList/AList write PASS — named playlist 정의·항목 create/save, fresh readback, delete, absence
ThemeA KRX write PASS — create, preview/readback, delete, absence
ThemeA NXT write PASS — create, preview/readback, delete, absence
EList write PASS — expert create, preview/readback, delete, absence

개발 DB write는 총 9개 충돌 격리 시나리오다. production service/executor를 사용했으며 인증정보나 DB 원문을 출력하지 않았다. write 결과가 불명확한 경우에는 재시도와 cleanup을 하지 않는 구현·테스트 경계를 유지한다.

외부자산 판정

자산 상태 판정
45 active alias .t2s 존재 alias 준비 완료
s5006 Video\큐브배경.vrv 1개 없음 외부자산 미제공; 코드 실패 아님
s6001 국가별 영상 13개 없음 외부자산 미제공; 코드 실패 아님
sibling 배경\기본.vrv 없음 외부자산 미제공; F2/F3/default background는 fail closed

누락 자산은 Git 또는 MSIX에 임의로 넣지 않는다. 제공되면 같은 trusted-root, 0-byte, reparse, root-escape 검사를 통과한 뒤 해당 scene만 다시 검증한다.

개발 Tornado2와 PGM 실측

2026-07-15 개발 Tornado2 2.7.5.49 x64 DSX10.0 S.R2의 단일 30001/tcp listener와 K3D x64 등록·라이선스를 고정한 뒤, 설치된 MSIX package-context 앱에서 다음 시퀀스를 실행했다.

  1. 삼성전자 검색 → 5001 playlist 추가
  2. 원본과 같은 fixed leaf 더블클릭으로 VI 수동 목록 9종목 조회 → 5074 2페이지 추가
  3. PREPARE 5001 page 1TAKE INOnScenePlayed → 자동 갱신 정확히 1회
  4. NEXT로 다음 playlist 항목 5074 page 1/2 → 자동 갱신 정확히 1회
  5. 같은 scene Page NEXT5074 page 2/2의 마지막 4종목 송출
  6. TAKE OUT AllIDLE → 정상 종료 확인 → BYE

첫 실측과 화면 증적용 known-outcome 재현은 모두 OutcomeUnknown=false로 끝났다. 불명확 결과 뒤 명령 재시도는 없었다. Network Monitoring 최종 원문은 1,863줄, 299,616문자, SHA-256 7CDB183A2518EF47E5CC3819C2EB14C06492DE0C8E018350A0633E0FBBB5B994다. 두 실측을 합쳐 LOAD_SCENE 4/4, BEGIN_TRANSACTION 12/12, VALUE_SET 258/258, VISIBLE 568/568, SCENE_PREPARE 12/12, PLAY 10/10, STOPAL 2/2, UNLOAD_SCENE 4/4가 요청/성공으로 일치했고 SCENE_PLAYED 10회를 수신했다. 정상 종료에서는 BYE 요청 1회가 기록됐고 이후 established 연결과 앱/CDP process는 0개다.

화면 증적은 300프레임 중 72프레임이 검은 기준 화면과 달랐다. 5001 삼성전자 화면, 5074 page 1의 5종목, page 2의 4종목을 직접 확인했고 TAKE OUT 뒤 기준 검은 화면으로 복귀했다. 프레임 원본과 Network Monitoring 원문은 실제 컷·운영자료를 Git에 넣지 않는 정책에 따라 로컬 artifacts/final-validation-20260715에만 보관한다.

최종 전체 회귀 기록

아래 값은 모든 병렬 변경과 fixed-leaf 더블클릭 회귀 테스트가 합쳐진 뒤 다시 실행한 최종값이다.

항목 최종 결과
Debug x64 전체 빌드·테스트 PASS — .NET 2,394/2,394, VS 2026 `ParityDebug
Release x64 전체 빌드·테스트 PASS — .NET 2,394/2,394, VS 2026 `Release
Web/LegacyParity 전체 테스트 PASS — 47파일, 435/435 (Test-WebPlayout 415 + thin-client 20)
Release x64 MSIX 경로·버전 artifacts/final-validation-20260715/package/MBN_STOCK_WEBVIEW.LegacyParityApp_0.1.0.0_x64_Test/MBN_STOCK_WEBVIEW.LegacyParityApp_0.1.0.0_x64.msix, 0.1.0.0, 15,200,545 bytes
새 MSIX SHA-256·서명 FC4EEE1509675E643D2B4CB435E279CAC4611B28534048D9B9EE611E361E0E1F, Valid, CN=Comtrophy
설치된 package-context 실행 PASSWickedness.MBNStockWebView.LegacyParity_0.1.0.0_x64__qbv3jkvsn3aj0, DryRun 전체 흐름과 Live 개발 PGM 실행, 정상 종료
개발 Tornado2 Network Monitoring PASS — HELLO, transaction/mutation/query/prepare/play, event, unload, STOPAL, BYE와 연결 해제 확인
개발 PGM PREPARE → TAKE IN → NEXT/Page NEXT → TAKE OUT PASS50015074 1/2 → 5074 2/2 → 검은 화면 복귀
Gitea main commit/push PASS — 이 최종 검증 문서를 포함한 커밋을 origin/main에 fast-forward push

판정 경계

  • 35/35 자동 장면 동등성은 모든 장면의 실제 PGM 출력 완료를 뜻하지 않는다.
  • 33/33 DB selector 통과는 외부 영상/배경 자산 준비를 뜻하지 않는다.
  • 개발 DB 9개 write 시나리오 통과는 운영 DB에 쓰기를 허용하거나 수행했다는 뜻이 아니다.
  • 개발 Tornado2/PGM은 안전 게이트를 유지한 별도 통합 검증 대상이다.
  • 원본 저장소, 실제 Cuts, 라이선스와 인증정보는 계속 읽기 전용 또는 Git 외부로 유지한다.