Files
MBN_STOCK_WEBVIEW/docs/LEGACY_FEATURE_AUDIT.md

150 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 원본 기능 재감사 기준표
감사 기준일: 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개 시나리오와 설치된 MSIX의 개발 PGM 최종
통합까지 검증했다. 기본 송출 모드는 계속 `DryRun`이다.
## 상태 정의
| 상태 | 의미 |
|---|---|
| `완료` | 현재 LegacyParityApp 코드와 해당 자동/통합 검증에 반영됨 |
| `외부자산 필요` | 코드로 만들 수 없는 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 최종 통합 | 완료 | 설치된 최신 MSIX에서 `5001` PREPARE/TAKE IN/자동 갱신 → playlist NEXT `5074` 1/2 → Page NEXT 2/2 → TAKE OUT, Network Monitoring·PGM·BYE 확인 | 14개 외부 영상 자산 scene은 제공 후 별도 PGM |
| LF-006 | P0 | 원본 35 scene | 완료 | 원본 inventory와 source 기준선 35/35, DTO→mutation→runtime matrix 통과 | 모든 scene의 실제 PGM 완료로 확대 해석 금지 |
| LF-007 | P0 | PageN/NEXT | 완료 | 5·6·12개 단위, 최대 20페이지, 빈/경계/마지막 부분 페이지 테스트와 개발 PGM에서 `5074` 9종목의 5+4 Page NEXT·다음 행 NEXT 확인 | 없음 |
| 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 이관, KRX/NXT/expert 개발 DB 시나리오 PASS | 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 | 시스템 종료 확인 | 완료 | package-context에서 기본 취소 확인창의 중립 문구·종료/취소 두 버튼을 대조하고 종료 1회, BYE 1회, 자동 TAKE OUT/반대 명령 없음 확인 | 없음 |
| 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 대체 | 완료 | Web table로 바꾸되 선택·정렬·이동·single/double-click·저장 이벤트를 strict C# intent로 재현 | 활성 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 추정 금지 |
## 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)다.
다음 값은 추측하거나 이전 package 결과를 재사용하지 않는다.
| 항목 | 상태 |
|---|---|
| Debug/Release x64 전체 테스트 개수 | **PASS** — .NET 각 2,394/2,394, Web 435/435 |
| 새 Release x64 MSIX SHA-256·서명 | `FC4EEE1509675E643D2B4CB435E279CAC4611B28534048D9B9EE611E361E0E1F`, Valid, `CN=Comtrophy` |
| 새 package-context 실행 | **PASS** — DryRun과 개발 Live, 정상 종료 |
| 개발 Tornado2 Network Monitoring/PGM 결과 | **PASS**`5001``5074` 1/2 → 2/2 → TAKE OUT/BYE |
| Gitea 반영 commit | **PASS** — 최종 이관·검증 문서 포함 commit을 `origin/main`에 fast-forward push |
원본 저장소는 최종 검증과 배포 이후에도 계속 읽기 전용으로 유지한다.