Files
MBN_STOCK_WEBVIEW/docs/MIGRATION_STATUS.md

18 KiB

MBN_STOCK_WEBVIEW 이관 현재 기준선

기준 시각: 2026-07-22

기준 소스: main 브랜치의 이 문서 포함 최신 기준선

원본: C:\Users\MD\source\repos\MBN_STOCK_N (계속 읽기 전용)

이 문서는 현재 이관 완료 범위와 남은 차단 항목의 우선 기준이다. 날짜가 더 이른 감사·회차 문서와 충돌하면 이 문서의 판정을 따른다. 과거 문서는 당시 패키지와 당시 실행 회차의 증거로만 보존한다.

활성 기준선

  • 개발·실행·패키징 대상은 src/MBN_STOCK_WEBVIEW.LegacyParityApp 하나다.
  • 루트 MBN_STOCK_WEBVIEW.csproj와 루트 MainWindow*/Web은 이전 비교 프로토타입이다. 현행 솔루션과 기본 F5에서는 제외했으며, 연결된 과거 비교 테스트 정리 전까지 참고용으로 보존한다.
  • 원본 MBN_STOCK_N은 비교 기준으로만 사용하며 계속 읽기 전용이다.
  • 이 문서 외의 작업 기록, 날짜별 감사와 실행 회차 문서는 당시 증거다.

현재 결론

전체 이관은 기능·개발 검증 기준으로 거의 완료됐다. 없는 외부 제작 자산은 관련 action만 fail closed로 제한한 채 진행하고, 고객 배포는 사용자가 다시 결정할 때까지 현재 범위에서 보류한다. 기존 DB 재생목록은 활성 정의 23개/2,213행 모두 목록과 scene alias까지 로드하도록 복원했다. 최신 실제 DB 호환 감사에서는 1,617행을 fresh typed selection으로 복원했고, 남은 596행만 추정 없이 보류한다. 보류 사유는 KRX 테마 493행, NXT 테마 48행, 비교 시장 identity 유실 25행, unique closed mapper 없음 30행이다. 따라서 전체 목록은 열되, 개별 행의 payload·asset·송출 전 검증은 계속 분리한다. 2026-07-21에는 같은 원칙을 모든 동적 DB 목록에 적용해, 기존 행의 조회·편집과 실제 송출 가능 판정을 분리했다. 고정 개수 상한, 제목 trim, 중복 제목 제거, 활성 preview 전용 읽기 때문에 정상 legacy 행까지 숨기던 경로를 제거하고, 불완전한 개별 행만 표시·편집 또는 비활성 상태로 격리한다.

범위 현재 판정 검증 범위
원본 Scene 구현 완료 builder 35/35, 실제 운영 runtime route 34개, 무alias 진단 전용 s8086 1개
원본 DB 연결 상태 감시 구현·자동 회귀 완료 LegacyParityApp 시작 후 10초 간격으로 Oracle/MariaDB 상태를 확인하고 상태 전이 때만 native 로그를 남긴다. 운영자 입력·송출·자동 갱신이 시작되면 진단 조회를 취소하고 DB activity gate를 양보한다. 종료 시 monitor도 취소한다. 실제 DB 서버를 강제로 끊는 장애 주입은 하지 않았다.
개발 MSIX 전체 UI/DB 최신 패키지 실측 PASS 최신 등록 AppX에서 실제 Windows 입력으로 read-only 84, dry-run-playout 108, plist 106, program-playlist-db 65, graphe 501, catalog 299, screens 675, 합계 1,838입력을 검증했다. UC1~UC7, GraphE, FSell, VIList, ThemeA, EList, PList 모달, 검색·키보드·drag, 즉시 선택, PROGRAM 미래 행 enabled 변경과 DB create/save→fresh readback→delete/absence/cleanup이 모두 PASS다. 설정 picker 3종 취소와 비교쌍 1+8 병합/재실행 추가 0 로컬 상태도 PASS이며 warning·blocked·state violation은 0이다.
개발 Tornado2/PGM 33/34 runtime route code 최신 실측 LATEST-CORE-01 6/6, 자산 비의존 30 route 30/30, LATEST-PAGED-04 24/24와 S6001-04 18/18을 실제 PGM으로 확인했다. s6001은 두바이유·WTI·브렌트유·금 4 action 범위이고 국가 영상 13 action은 제외한다. 모든 승인 회차는 retry 0, OutcomeUnknown=false, 최종 TAKE OUT/IDLE이다. s6001의 원본도 무시하는 wonText/pattern 보조 오브젝트 누락 로그는 아래에 별도 기록한다.
PageN/장기 실행 경계 최신 결합 코드 실측 완료 LATEST-PAGED-04에서 5077 6행을 1/20부터 20/20까지 실제 Page NEXT하고, 마지막 페이지에서 playlist NEXT로 5088 12행 1/20으로 전환했다. 이전 scene unload와 최종 TAKE OUT/UNLOAD/IDLE도 확인했다. LATEST-CORE-01의 5074 page 1→2도 포함한다.
runtime 폴더/자산 설정 구현·물리 검증 완료 선택한 Cuts root는 active .t2s alias 45개와 필수 built-in asset 9개를 모두 요구한다. 외부 제작 asset 14개는 없어도 설정을 수용하되 영향 경로만 제한한다. 빈 파일·reparse·중간 junction·root 이탈은 거부한다. 최신 AppX에서 디자인·리소스·배경 picker를 실제 클릭하고 취소했으며 설정 파일 불변을 확인했다.
자동 회귀 완료 Release x64 전체 .NET solution 3,182/3,182, LegacyParityWeb 150/150, WebPlayout JavaScript 424/424, 원본 scene 기준선 35/35와 staged PGM 정적 계약이 모두 실패 0으로 통과했다.
고객 배포 MSIX 현재 범위에서 보류 현재 결과는 unsigned 개발 패키지다. 고객용 version, Publisher, 서명 인증서, 업데이트 방식과 새 PC의 DB/Development Live 로컬 설정 배포안은 사용자가 배포 작업을 재개할 때 결정한다.

2026-07-21~22 기존 DB 로드·편집 호환 재검수

실제 Oracle/MariaDB를 read-only로 다시 조회하고 최신 등록 개발 패키지를 DryRun으로 실행해 다음을 확인했다. 아래 목록 조회와 편집 화면 확인 중 DB write 및 Tornado2/PGM 명령은 0건이다.

화면/경로 실제 DB 및 패키지 결과 송출 경계
국내 종목/비교/VI 빈 검색 4,599/4,599, KODEX 238/238 표시 선택한 typed identity만 사용
해외 비교 종목 raw 1,490, 표시 1,474, 선택 가능 1,473, 이름 없음 16행 격리, 쉼표 직렬화가 모호한 1행은 표시하되 비활성 비활성 행은 선택·저장·송출 거부
UC5 해외 업종 53, 종목 1,474와 이름 없음 16행 격리 업종은 이름뿐 아니라 input name·symbol·nation·FDTC exact identity 사용
Theme/ThemeA 전체 1,747(KRX 1,571/NXT 176), 경계 공백 제목과 중복 제목도 보존 NXT preview가 빈 4개 테마는 목록에는 보이되 action 차단
ThemeA 기존 편집 SB_ITEM 원문 전체 읽기. KRX/NXT 교차 prefix 5/3행, 동일 순번 2그룹·4행 보존. 대표 중복순번 테마 14행과 후행 공백 제목 11행을 실제로 열어 확인 활성 종목 기반 strict preview는 송출용으로 별도 유지; 새로 추가한 종목만 current master 검증
EList/전문가 전문가 6명, 추천 32행, 매수가 NULL 5행을 빈 값으로 보존 NULL 매수가 포함 행은 편집 가능하지만 숫자 송출 전 차단
FSell/VI 로컬 데이터 %LOCALAPPDATA%\MBN_STOCK_WEBVIEW\OperatorData의 개인·외국인·기관·VI발동 4파일이 authoritative 원본 bin\Debug\Data와 각각 length·SHA-256 exact equal 미이관 파일이 아니며 현재 앱에서 사용 가능. 실제 파일은 Git/MSIX 밖에서 trusted 검사 유지
GraphE 4개 테이블 7,776행 모두 raw 조회·편집 가능. Revenue 1,960/1, Growth 1,114/5, Sales 2,329/20, OperatingProfit 2,323/24(strict-ready/deferred), 합계 strict-ready 7,726행·deferred 50행 원본 저장 의미와 같은 정수 공백·TAB, 분기명 후행 TAB 및 완전히 동등한 중복행을 수용한다. conflicting 중복과 실제 불완전 payload는 계속 차단한다. 기존 이름 기반 GraphE 재생목록 36행은 36/36 fresh materialization됐다.
PList 정의 23개/2,213행 전체 로드, scene alias 2,213/2,213, whole-list reject 0. fresh selection 1,617, 보류 596 행별 fresh payload·asset·PGM 검증은 사용할 때 별도 수행

최신 패키지 실제 클릭 결과는 C# snapshot과 DOM 행 수가 모두 일치했고, 검수 전 편성표 58행은 끝까지 58행으로 유지됐다. ThemeA와 GraphE의 기존 원문을 단순 조회하거나 편집 화면에 여는 행위가 곧 송출 가능 승인을 뜻하지는 않는다.

2026-07-22 최신 등록 패키지 실제 입력 기준선

최신 Development Mode 패키지의 Web 자산과 핵심 DLL을 빌드 AppX와 hash로 고정한 뒤 일곱 패키지 입력 회차와 한 로컬 상태 회차를 실행했다. 빌드 AppX와 등록 AppX가 다르면 시작 전에 fail closed한다. 모든 패키지 입력 회차는 앱을 정상 종료했고 Tornado2 연결 없이 수행했다.

회차 실제 입력과 검사 결과
read-only 84입력, 검색·키보드·컷/playlist drag와 모달·선택 상태 PASS, blocked/violation/warning 0
dry-run-playout 108입력, 선택 행 기준 NEXT, PROGRAM 미래 행 enabled, F2/F3, F8/Escape, drag/double-click append PASS, DB write 0, Tornado2 연결 0, blocked/violation/warning 0
plist 106입력, recovery exact delete와 create/save→물리 double-click fresh readback→delete/absence PASS, cleanup 확인, blocked/violation/warning 0
program-playlist-db 65입력, PROGRAM 상태 named playlist create/save/fresh readback/delete/absence와 최종 IDLE PASS, cleanup 확인, blocked/violation/warning 0
graphe 501입력, 4 화면 identity/action/double-click과 각 create/save→fresh readback→delete/absence PASS, cleanup 확인, blocked/violation/warning 0
catalog 299입력, ThemeA KRX/NXT·EList 빈 검색/행 조작과 create/edit/save→fresh readback→delete/absence PASS, cleanup 확인, blocked/violation/warning 0
screens 675입력, UC1~UC7·GraphE·FSell·VIList 15 화면과 15 DB 검사 PASS, cleanup 확인, blocked/violation/warning 0
local-state 설정 폴더 picker 3종 실제 클릭/취소, 설정 파일 불변, 비교쌍 1+8=9와 재실행 추가 0 PASS, playout intent 0, retry 0

최신 dry-run-playout의 식별 결과는 staged legacy-stock-00000002, 선택 legacy-stock-00000003, NEXT legacy-stock-00000001, 안전 append legacy-stock-00000008이었다. PROGRAM 뒤 컷 선택은 0번이고 playlist는 3행에서 4행으로 정확히 한 행만 늘었다.

실제 PGM 검증 경계

  • 최신 결합 코드의 MBNWEB-20260722-LATEST-CORE-01에서 5001 → 5074 playlist NEXT → 5074 Page NEXT → TAKE OUT/IDLE 6/6을 검증했다. 2026-07-11 Round H와 CORE5001-05는 역사적 증거로만 보존한다.
  • 이어서 외부자산에 의존하지 않는 30개 route를 순차 검증했다. 마지막 5025 TAKE OUT 뒤 UNLOAD 1/1, FAILURE 0, ERROR 0, 정확한 IDLE을 확인했다.
  • 같은 30개를 구 프로그램과 신규 프로그램에서 동일한 저장 편성표 순서와 실제 포인터 입력으로 각각 실행했다. 신규는 UI 상태 증거 120개와 PROGRAM 직후 PGM 화면 30개를 남겼고, 장면별 합산은 LOAD 30/30, PREPARE 56/56, PLAY 56/56, UNLOAD 30/30, FAILURE=0, ERROR=0이다. 구 프로그램은 이번 현재 데이터 회차에서 PGM 오류 없는 PROGRAM 11개, PGM 오류 포함 4개, 데이터·매핑 차단 15개였다. 오류 없는 11개의 mutation 대조에서는 8개가 동등했고, 2개는 저장 기간 제목 복원 차이, 1개는 베이시스·선물 갱신 누락이었다. 상세 판정은 LEGACY_NEW_PLAYOUT_COMPARISON_20260719.md에 고정했다.
  • 5032는 authoritative asset에 실제로 존재하지 않는 장식 오브젝트와 pattern 자산을 보내지 않도록 계약을 교정한 뒤 다시 검증했다. 선물 좌·우 plate가 정상 표시되고 관련 명령 실패는 0이다.
  • 최초 5077 경계 검증에서 실제 데이터 120건임에도 행의 page count가 1/1로 고정되는 결함을 발견했다. 첫 PREPARE/TAKE IN 전에 전체 PageN 행을 read-only preflight하여 1/N을 고정하도록 수정했다. 최신 결합 코드의 MBNWEB-20260722-LATEST-PAGED-04에서 5077 20페이지 전체, 5088 전환, 이전 scene unload와 최종 TAKE OUT/UNLOAD/IDLE을 24/24로 재검증했다. 결함이 있던 최초 실행과 이전 PAGED-01은 최신 승인 근거로 사용하지 않는다.
  • s6001 중 국가 영상이 필요 없는 두바이유·WTI·브렌트유·금 4 action은 global images\주유기merge.png, images\35752913_l.jpg를 고정 검증하는 S6001-04에서 18/18을 완료했다. 물리 double-click 4행 생성, 각 action의 activate→TAKE IN→settled PROGRAM→TAKE OUT과 최종 IDLE을 확인했다. 합산 LOAD 4, PREPARE 8, PLAY 8, UNLOAD 4가 성공했고 안전 차단·위반·retry·OutcomeUnknown은 0이다.
  • authoritative 6001.t2s에는 원본 코드가 호출하는 보조 wonText/pattern 오브젝트가 없다. 최초 송출과 자동 갱신 8회에서 VALUE_SET wonText, FACE_COLOR wonText, VALUE_SET pattern이 각각 8회 실패했고 관련 원인 ERROR 줄은 120개다. 원본 s6001.cs도 같은 호출을 빈 catch로 무시한다. 필수 movie/unit/수치/색/PREPARE/PLAY와 실제 네 장면 화면은 정상이라, 이 상속된 template 제한을 명시한 4 action만 성공으로 채택한다.
  • s5006의 큐브 배경 1개와 s6001의 국가 영상 13개는 asset preflight에서 관련 action만 fail closed한다. 이 14개가 현재 남은 외부 제작 자산 경계다.

로컬 상세 증거는 다음 위치에 있다.

artifacts의 개발 장비 증거에는 로컬 실행 상태가 포함될 수 있으므로 고객 MSIX나 Git 배포물에 넣지 않는다.

현재 코드 작업과 분리된 외부 항목

1. 제작 자산

  • s5006\Video\큐브배경.vrv
  • s6001 국가 영상 13개

현재 authoritative 원본 Cuts에도 없다. 자산 없이 진행한다는 사용자 결정에 따라 제공 전에는 관련 action만 안전하게 차단하며, 이는 현재 작업 전체의 차단 사유가 아니다. s6001의 영상 비의존 4 action은 실제 PGM 검증을 완료했다. 나중에 자산을 받으면 trusted root·빈 파일·reparse· 경로 이탈 검사를 통과시킨 뒤 s5006과 국가 영상 action을 실제 PGM에서 검증한다.

2. 기존 플레이리스트 데이터 정합성

현행 operator 경로는 총 2,213행을 모두 DB에서 읽어 화면과 스케줄에 복원하고, 2,213행 모두 기존 scene alias로 식별한다. 직전 개발 패키지에서도 DB 불러오기 → 첫 목록 → 불러오기를 실제 마우스로 실행해 58행, 팝업 0, scene 미식별 0을 확인했다. 이 결과는 목록 로드/alias 복원 근거다.

2026-07-12 감사의 1,603 selectionMapped / 610 보류는 당시 raw 저장값에서 현재 DB identity를 fresh하게 다시 증명한 역사적 수치다. 최신 실제 DB 재감사에서는 GraphE 36행을 모두 fresh materialization하여 1,617 복원 / 596 보류로 갱신됐다. 596행은 KRX 테마 493행, NXT 테마 48행, 비교 시장 identity 유실 25행, unique closed mapper 없음 30행이다. 목록 로드 차단으로 해석하지 않으며, 이름이나 유사 scene으로 추정하지 않는다.

원본 종목비교.dat 8쌍을 현재 로컬 순서 뒤에 중복 없이 병합하는 명시적 importer도 구현했다. 원본 파일은 고정된 trusted path에서 읽기 전용으로 열고 8쌍을 모두 resolve한 뒤에만 atomic하게 저장하며, 실패 시 현재 파일을 보존한다. 실제 최신 AppX 로컬 상태 smoke에서 현재 1쌍 + 원본 8쌍 = 9쌍, 두 번째 실행의 추가 0, 원본 SHA-256 불변을 확인했다.

3. 고객 배포

현재 작업 범위에서는 보류한다. 사용자가 배포를 재개하면 고객용 version, Publisher, 서명 인증서, 인증서 보관·갱신 절차, 업데이트 방식, 새 PC의 DB 및 Development Live 로컬 설정 배포 방식이 확정돼야 한다. Release/default DryRun, scene/path allowlist, vendor hash, STA 직렬화와 대상 identity 검사는 그대로 유지한다.

완료 조건

최신 AppX의 전체 물리 입력/DB cleanup/설정·비교 import와 s6001 영상 비의존 4 action의 실제 PGM 검증까지 완료했으므로, 현재 개발 장비에서 검증 가능한 범위의 대체 운영 기준선은 확정됐다. 외부 제작 자산 14개가 없는 action과 fresh identity를 증명할 수 없는 596행은 제공·DBA 결정 전까지 명시적으로 차단한 상태가 정상 기준이다. 고객 서명 MSIX의 clean 설치·업데이트·새 PC 설정 검증은 사용자가 배포를 재개할 때 별도 완료 조건으로 적용한다.