# 원본 기능 재감사 기준표 감사 기준일: 2026-07-15 원본(읽기 전용): `C:\Users\MD\source\repos\MBN_STOCK_N` 마이그레이션 대상: `C:\Users\MD\source\repos\MBN_STOCK_WEBVIEW` ## 감사 결론 현재 실행 대상은 `.NET 8 / C# / WinUI 3 / Windows App SDK 1.8 / WebView2` 기반 `MBN_STOCK_WEBVIEW.LegacyParityApp`이다. 이는 웹사이트가 아니라 로컬 Web 자산을 WebView2에 표시하는 x64 Windows 데스크톱/MSIX 앱이다. 초기 프로토타입 문서의 “미이관 버튼 disabled”, “Tornado2에 연결하지 않음”, “DB write 없음”은 현재 구현 상태가 아니다. 원본 UI 이벤트는 LegacyParityApp → strict bridge → C# workflow로 연결되고 개발 DB write 9개 시나리오의 기존 증적도 있다. 다만 현재 병렬 변경이 합쳐진 signed Release MSIX 설치·DryRun 실행, 실제 마우스/CDP UI와 제한된 HELLO/BYE 연결은 2026-07-15에 확인했다. scene/PREPARE/TAKE/PGM은 실행하지 않았으므로 전체 방송 송출 성공으로 판정하지 않는다. 기본 송출 모드는 계속 `DryRun`이다. ## 상태 정의 | 상태 | 의미 | |---|---| | `완료` | 현재 LegacyParityApp 코드와 표에 명시한 자동/통합 검증에 반영됨. package/Live 여부는 각 행의 증적 범위로 별도 판정 | | `부분 실측` | 현재 package 또는 Live의 표에 명시한 범위만 실제 확인했으며 scene/PGM 전체 통합으로 확대할 수 없음 | | `현재 빌드 실측 제외` | 구현 경로는 있으나 현재 병렬 변경을 합친 package-context/CDP/PGM 결과를 아직 이 감사의 성공 증거로 채택하지 않음 | | `외부자산 필요` | 코드로 만들 수 없는 Git/MSIX 밖의 승인 영상·배경이 제공되지 않음 | | `외부 데이터 정합성` | 현재 DB view/data가 원본 규칙의 fresh identity를 공급하지 않아 추정 없이 차단함 | ## 우선순위별 결과 | ID | 우선순위 | 기능 | 상태 | 현재 판정과 증적 | 남은 경계 | |---|---|---|---|---|---| | LF-001 | P0 | `s6001` 해외지수 영상 | 외부자산 필요 | builder와 trusted asset 검사는 완료. 승인 Cuts에 국가 영상 13개가 없음 | 제공 후 asset preflight와 해당 scene PGM | | LF-002 | P0 | cut/asset coverage | 완료 | active alias 45개 `.t2s` 존재. alias missing/unsafe 0, asset unsafe 0, asset missing 14를 분리 보고 | 누락 자산 자체는 LF-001/LF-003 | | LF-003 | P0 | `s5006` 큐브 배경 | 외부자산 필요 | `Video\큐브배경.vrv` 1개가 승인 Cuts에 없음. builder 누락이 아님 | 제공 후 s5006 DryRun/PGM | | LF-004 | P0 | 실제 개발 DB write | 완료 | GraphE 4 + PList/AList 2 + ThemeA KRX/NXT 2 + EList 1, 총 9개가 create/save→fresh readback→delete→absence PASS, 잔여 0 | 운영 DB write를 뜻하지 않음 | | LF-005 | P0 | 개발 Tornado2/PGM 최종 통합 | 부분 실측 | 현재 signed Release 설치·DryRun 실행과 실제 UI를 확인. 별도 Live에서 HELLO request/success 각 1회와 BYE 1회만 확인했고 scene/PREPARE/TAKE/DB write는 0 | scene PREPARE/TAKE/PGM 전체 통합과 14개 외부 영상 자산 scene은 별도 | | LF-006 | P0 | 원본 35 scene | 완료 | 원본 inventory와 source 기준선 35/35, DTO→mutation→runtime matrix 통과 | 모든 scene의 실제 PGM 완료로 확대 해석 금지 | | LF-007 | P0 | PageN/NEXT | 완료 | 5·6·12개 단위, 최대 20페이지, 빈/경계/마지막 부분 페이지와 같은 scene/다음 행 구분을 자동 테스트로 검증 | 현재 package/PGM 실측은 LF-005와 함께 판정 | | LF-008 | P0 | 원클릭 TAKE IN | 완료 | 보이는 TAKE IN/F8 한 번으로 fresh page load 후 PREPARE 1회→TAKE IN 1회. native PREPARE는 진단용으로 유지하되 hidden | unknown에서 재시도 금지 | | LF-009 | P0 | C# 권위/strict bridge | 완료 | Web은 intent만 전송. `LegacyBridgeProtocol` allowlist와 `LegacyOperatorController` snapshot이 DB identity·playlist·scene·송출 상태의 권위 | 새 intent에도 동일 경계 유지 | | LF-010 | P1 | 10개 탭과 action inventory | 완료 | 10탭, fixed 328, 업종 44, 종목 31, 비교 target 24/action 9를 폐쇄형으로 고정 | 동적 DB 행은 별도 검증 | | LF-011 | P1 | UC4/UC6/UC7 클릭 | 완료 | 테마·전문가·거래정지는 원본 단일 클릭. UC4/UC6 행은 fixed tree handler와 독립, stale generation 거부 | 없음 | | LF-012 | P1 | GraphE/FSell/VI | 완료 | GraphE CRUD·찾기·정렬·행 double-click, FSell/VI 확인 시 save+playlist append+close, 취소 경계 이관 | s5025/VI 전용 PGM은 LF-005 | | LF-013 | P1 | PList/AList | 완료 | 목록·생성·save/load/delete·행 double-click 이관, 개발 DB write/readback/cleanup PASS | 기존 blocked raw row는 추정 복원 금지 | | LF-014 | P1 | ThemeA/EList | 완료 | 검색·신규·편집·삭제·종목 구성·Delete key, ThemeA exact-title 중복확인, EList opaque `rowId` drag 재정렬 이관. 실제 UI에서 ThemeA 500건 중복 read와 EList 5행 reorder 확인 | scene PGM은 LF-005 | | LF-015 | P1 | UC5 해외 | 완료 | 해외업종·해외종목·해외지수 조회와 playlist 경로 이관 | s6001 13개 영상은 LF-001 | | LF-016 | P1 | F2/F3 기본 배경 | 외부자산 필요 | sibling background root, picker, background-none와 trusted path 검사는 완료. 이 장비에 `기본.vrv`가 없음 | 제공 전 fail closed | | LF-017 | P1 | 시스템 종료 확인 | 완료 | 기본 취소 확인창, 중립 문구, 종료/취소 두 버튼과 자동 TAKE OUT/반대 명령 금지 경계를 코드·자동 테스트로 유지 | 현재 Release package-context 회귀는 LF-005와 함께 판정 | | LF-018 | P1 | 원본 비교쌍/수동 파일 | 완료 | `종목비교.dat` 8쌍 1회 import·재시작 marker, FSell 3×5행과 VI 9항목 trusted parser/store 검증 | 원본 파일은 계속 읽기 전용 | | LF-019 | P1 | 실제 DB read→DTO→mutation | 완료 | Oracle/MariaDB 필수 scene selector 33/33, 전체 query 58건 PASS | 외부 asset/PGM 성공과 별도 | | LF-020 | P2 | FarPoint 대체 | 완료 | 실제 마우스로 playlist 다중행 reorder·checkbox 차단·탭 release 전 dragover 교환·EList reorder 확인. row drop 버블링의 cut append와 Chromium checkbox-origin target 문제를 수정하고 DOM 회귀로 고정 | 활성 Print/Excel export는 원본에도 없음 | | LF-021 | P2 | 패키지 단일 인스턴스·모달 격리 | 완료 | 두 번째 activation 전달, 강제 종료 없음. modal에서 F2/F3/F8/Escape와 playlist key 격리 | 새 MSIX 전체 회귀 | | LF-022 | P2 | 영구 운영 로그/bridge 오류 | 완료 | bounded/redacted log와 toast, malformed payload가 송출 상태를 바꾸지 않음 | authoritative Network Monitoring과 함께 판독 | | LF-023 | P1 | NXT 저장 playlist restore | 외부 데이터 정합성 | stale code를 제목/current identity로 재검증하는 닫힌 경로는 완료. 현재 `v_all_stock` 결과가 비어 preview를 fail closed | DBA/data 정합성 없이는 direct-table 추정 금지 | | LF-024 | P0 | Designer 이벤트 전수 감사 | 완료 | 원본 Designer 구독 **186개**, 화면별 고유 핸들러 **171개**를 IMPL 131/DEAD 20/VISUAL 10/DRAG 9/SAFETY 1로 전수 분류 | 상세 줄 단위 근거는 `LEGACY_DESIGNER_EVENT_PARITY_AUDIT.md` | | LF-025 | P0 | VS Development Live 시작 구성 | 완료 | `.slnLaunch`와 패키지 프로필이 LegacyParityApp을 시작 대상으로 고정. 실제 Release에서 `--development-live`가 무시돼 DryRun, TCP/Network 변경 0임을 확인 | Live는 exact argument + Debug + strict local authorization을 계속 요구 | ## 이벤트·drag 감사 상세 [`LEGACY_DESIGNER_EVENT_PARITY_AUDIT.md`](LEGACY_DESIGNER_EVENT_PARITY_AUDIT.md)는 원본 커밋의 `*.Designer.cs`를 읽기 전용으로 조사해 186개 구독과 171개 고유 핸들러를 줄 단위로 대조한다. 선언만 있고 구독하지 않는 메서드는 제외하며, `DEAD`/`VISUAL`은 새 활성 업무 intent를 만들지 않는 것이 원본과 동등하다. 종료의 자동 `StopAll`만 기존 안전 정책 때문에 의도적으로 이관하지 않는 `SAFETY` 항목이다. 현재 `DRAG` 구현은 다음 세 C# 권위 경로를 포함한다. - playlist 행 drag는 선택된 비연속 행도 현재 표시 순서를 보존한 한 블록으로 임의 before/after 위치에 옮긴다. 체크박스에서 시작한 drag와 PREPARED/PROGRAM/pending/unknown 상태의 변경은 차단한다. - 시장 탭은 drop 때가 아니라 dragover 대상에 들어갈 때 교환한다. source/target identity와 예상 두 인덱스가 C# 현재 순서와 일치할 때만 적용해 중복 메시지가 순서를 되돌리지 않는다. - 원본 UC6 `FpSpread2.AllowDragDrop`은 ThemeA/EList 편집행의 opaque `rowId` drag로 이관했다. Web은 play index나 DB identity를 결정하지 않는다. ThemeA의 원본 `중복확인`도 이름만 담은 strict intent로 연결했다. C#이 현재 KRX/NXT를 결정하고 선택 provider의 `SB_LIST`에 exact title parameterized read를 한 번 수행한다. 결과 불명은 `Indeterminate`이며 write나 추정 fallback이 없다. 원본처럼 edit 자기 행을 제외하지 않아 변경하지 않은 이름은 중복으로 판정된다. ## Development Live strict local authorization [`DEVELOPMENT_LIVE_VISUAL_STUDIO.md`](DEVELOPMENT_LIVE_VISUAL_STUDIO.md)의 시작 구성은 정확한 `--development-live` 인자와 Debug 빌드에서만 Git 제외 로컬 승인 파일을 읽는다. 승인 파일은 `%LOCALAPPDATA%` 아래에서 reparse가 아닌 경로, 최대 4096바이트, 정확한 다섯 속성, canonical JSON, exact authorization 문자열과 독립 승인된 native/Interop SHA-256을 모두 만족해야 한다. Live authorization은 환경 설정의 마지막 단계이며 일부 적용 실패 시 기존 값을 복구한다. Release, 인자 불일치, 파일 없음/오류/알 수 없는 속성은 Live를 구성하지 않는다. 기존 `trustedLiveOutputEnabled`, alias allowlist, asset 검사와 송출 안전 게이트는 그대로 중첩된다. ## DB 검증 상세 ### Read-only scene smoke 실제 Oracle/MariaDB에서 필수 scene selector **33/33**과 전체 query 58건이 성공했다. 이 검증은 실제 DB → 명시 DTO → scene mutation 경로를 증명한다. `.t2s`, 영상·배경 자산, K3D 명령 또는 PGM 화면 검증을 대신하지 않는다. ### 개발 DB write smoke production service/executor와 충돌 격리된 임시 식별자를 사용했다. | 시나리오 | 개수 | 검증 | |---|---:|---| | GraphE `INPUT_PIE`, `INPUT_GROW`, `INPUT_SELL`, `INPUT_PROFIT` | 4 | create, fresh readback, delete, absence | | PList/AList named playlist | 2 | definition/items save, fresh readback, delete, absence | | ThemeA KRX | 1 | create, preview/readback, delete, absence | | ThemeA NXT | 1 | create, preview/readback, delete, absence | | EList expert | 1 | create, preview/readback, delete, absence | | 합계 | **9** | **PASS**, 잔여 0 | write는 자동 재시도하지 않는다. `OutcomeUnknown`이면 cleanup mutation이나 다음 시나리오를 보내지 않는 구현·테스트 경계를 유지한다. 이 결과는 개발 DB 검증이며 운영 DB에 임의 쓰기를 허용하거나 수행했다는 뜻이 아니다. ## 기존 PLAY_LIST read-only 재분류 실제 Oracle 활성 정의 23개와 연결된 2,213행은 원문의 7필드, 한국어, enabled, ITEM_INDEX와 원본의 page 공백 제거 규칙을 보존했다. | route | 건수 | 결과 | |---|---:|---| | 기존 닫힌 매퍼 | 1,250 | selection 1,250 | | 업종 | 24 | selection 24 | | 비교 | 99 | selection 74, 시장 identity 유실 25 차단 | | 해외지수 candle | 61 | selection 61 | | NXT theme | 48 | current preview empty 48 차단 | | KRX theme | 587 | current-code 94, 나머지 identity/preview/문법/지원 경계로 차단 | | 해외종목 | 78 | selection 78 | | GraphE | 36 | fresh materialization 22, 값/identity 14 차단 | | unique closed mapper 없음 | 30 | nearest-scene 추정 없이 차단 | | 합계 | **2,213** | 통합 selection 1,603 / 명시 차단 610 | `selectionMapped`는 scene asset, PREPARE나 PGM 성공 수치가 아니다. 상세는 [`NAMED_PLAYLIST_READ_AUDIT.md`](NAMED_PLAYLIST_READ_AUDIT.md)를 따른다. ## 외부자산 목록 45개 active alias의 `.t2s`는 존재한다. 별도 종속 asset 14개만 제공되지 않았다. - `s5006`: `Video\큐브배경.vrv` - `s6001`: - `Video\20201008_미국.vrv` - `Video\20201008_독일.vrv` - `Video\20201008_영국.vrv` - `Video\20201008_프랑스.vrv` - `Video\20201008_일본.vrv` - `Video\20201008_중국.vrv` - `Video\20201008_홍콩.vrv` - `Video\20201008_대만.vrv` - `Video\20201008_싱가포르.vrv` - `Video\20201008_태국.vrv` - `Video\20201008_필리핀.vrv` - `Video\20201008_말레이시아.vrv` - `Video\20201008_인도네시아.vrv` - 기본 배경: sibling `배경\기본.vrv` 이 파일들의 부재는 code/build 실패가 아니라 **외부자산 미제공**이다. 검사기는 존재, 0바이트, root escape, reparse와 manifest 중복을 검사하고 누락 경로와 영향 builder만 redacted 형태로 보고한다. ## 원본 I/O에서 의도적으로 제외한 항목 - 활성 Print/Excel/FarPoint export/import 호출은 원본에서 발견되지 않았다. - CSV playlist save/load, thumbnail watcher와 `SaveImageFile`은 주석 또는 미호출 경로다. - `s8086`은 builder는 있으나 원본 MainForm active alias가 없는 diagnostic route다. - 위 dead/hidden 경로를 새 활성 기능으로 만들지 않는다. ## 최종 증적 기록 현재 구현 증적과 최종 검증 범위는 [`LEGACY_PARITY_VALIDATION_20260715.md`](LEGACY_PARITY_VALIDATION_20260715.md)에 기록한다. 병렬 변경을 모두 합친 .NET Debug/Release x64는 각각 2,446/2,446, Web Node는 438/438이며 Visual Studio 2026 Debug/Release x64 빌드는 경고 0·오류 0이다. 새 signed Release x64 MSIX의 hash·서명·설치 실행, 실제 CDP UI와 제한된 HELLO/BYE 결과도 현재 값으로 기록했다. 단, scene/PREPARE/TAKE/PGM을 실행하지 않은 현재 연결 회차를 전체 방송 송출 성공으로 확대하지 않으며 과거 package hash나 PGM 로그를 현재 결과로 재사용하지 않는다. 원본 저장소는 최종 검증과 배포 이후에도 계속 읽기 전용으로 유지한다.