feat: consolidate legacy parity migration baseline

This commit is contained in:
2026-07-20 22:06:12 +09:00
parent 5eb4054120
commit 4a54977341
66 changed files with 5391 additions and 460 deletions

105
docs/MIGRATION_STATUS.md Normal file
View File

@@ -0,0 +1,105 @@
# MBN_STOCK_WEBVIEW 이관 현재 기준선
기준 시각: 2026-07-20
기준 소스: `main` 브랜치의 이 문서 포함 최신 기준선
원본: `C:\Users\MD\source\repos\MBN_STOCK_N` (계속 읽기 전용)
이 문서는 현재 이관 완료 범위와 남은 차단 항목의 우선 기준이다. 날짜가 더 이른 감사·회차
문서와 충돌하면 이 문서의 판정을 따른다. 과거 문서는 당시 패키지와 당시 실행 회차의 증거로만
보존한다.
## 활성 기준선
- 개발·실행·패키징 대상은 `src/MBN_STOCK_WEBVIEW.LegacyParityApp` 하나다.
- 루트 `MBN_STOCK_WEBVIEW.csproj`와 루트 `MainWindow*`/`Web`은 이전 비교 프로토타입이다.
현행 솔루션과 기본 F5에서는 제외했으며, 연결된 과거 비교 테스트 정리 전까지 참고용으로 보존한다.
- 원본 `MBN_STOCK_N`은 비교 기준으로만 사용하며 계속 읽기 전용이다.
- 이 문서 외의 작업 기록, 날짜별 감사와 실행 회차 문서는 당시 증거다.
## 현재 결론
전체 이관은 기능·개발 검증 기준으로 거의 완료됐다. 없는 외부 제작 자산은 관련 두 route만
fail closed로 제한한 채 진행하고, 고객 배포는 사용자가 다시 결정할 때까지 현재 범위에서 보류한다.
기존 플레이리스트 610행은 코드 결함이 아니라 과거 identity/현재 DB 식별정보 부족에 따른 외부
데이터 결정 대기 항목이다.
| 범위 | 현재 판정 | 검증 범위 |
|---|---|---|
| 원본 Scene 구현 | 완료 | builder 35/35, 실제 운영 runtime route 34개, 무alias 진단 전용 `s8086` 1개 |
| 원본 DB 연결 상태 감시 | 구현·자동 회귀 완료 | LegacyParityApp 시작 후 10초 간격으로 Oracle/MariaDB 상태를 확인하고 상태 전이 때만 native 로그를 남긴다. 운영자 입력·송출·자동 갱신이 시작되면 진단 조회를 취소하고 DB activity gate를 양보한다. 종료 시 monitor도 취소한다. 실제 DB 서버를 강제로 끊는 장애 주입은 하지 않았다. |
| 개발 MSIX 전체 UI/DB | 완료 | 실제 Windows 입력으로 UC1~UC7, GraphE, FSell, VIList, ThemeA, EList, PList 모달, 검색·키보드·컷/플레이리스트 drag를 검증했다. `screens` 15 화면/15 데이터·파일 검사, `graphe` 5 화면/12 DB 검사, `catalog` 3 화면/11 DB 검사, PList create→fresh read→delete가 모두 PASS였고 잔여 테스트 데이터는 0이다. 2026-07-20에는 선택 행 기준 NEXT, drag 피드백, 송출 후 컷 선택 표시를 실제 입력으로 재검증했다. |
| 개발 Tornado2/PGM | **32/34 runtime route 완료** | `5001 → 5074 Page NEXT → TAKE OUT` 재검증과 자산 비의존 30개 route의 LOAD/PREPARE/PLAY/UNLOAD를 실제 PGM에서 확인했다. 30개는 구/신규 프로그램의 동일 저장 편성표 사용자 입력으로도 비교했고, 신규는 실제 PGM 화면 30/30을 보존했다. 확인된 명령은 request/success가 일치하고 `FAILURE=0`, `ERROR=0`, retry 0, `OutcomeUnknown=false`다. |
| PageN/장기 실행 경계 | 완료 | `5077` 6행을 1/20부터 20/20까지 실제 Page NEXT하고, 마지막 페이지에서 playlist NEXT로 `5088` 12행 1/20으로 전환했다. 이전 scene unload와 최종 TAKE OUT/UNLOAD/IDLE을 확인했다. |
| 자동 회귀 | 완료 | 최신 .NET solution 2,817/2,817, LegacyWeb 117/117, JavaScript 502/502; 실패·skip 0. Release 빌드 warning 0, error 0 |
| 고객 배포 MSIX | 현재 범위에서 보류 | 현재 결과는 unsigned 개발 패키지다. 고객용 version, Publisher, 서명 인증서, 업데이트 방식과 새 PC의 DB/Development Live 로컬 설정 배포안은 사용자가 배포 작업을 재개할 때 결정한다. |
## 실제 PGM 검증 경계
- `5001``5074`는 현재 작업 트리 기준으로 다시 검증했다. 2026-07-11 Round H의 과거 결과에
의존하지 않는다.
- 이어서 외부자산에 의존하지 않는 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`](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`을 고정하도록
수정했고, 이후 `5077` 20페이지 전체와 `5088` 전환을 재검증했다. 결함이 있던 최초 실행 결과는
성공 증거로 사용하지 않는다.
- `s5006``s6001`은 asset preflight가 fail closed하므로 PREPARE/PLAY를 보내지 않았다.
로컬 상세 증거는 다음 위치에 있다.
- [`MBNWEB-20260718-DEV-LIVE-01`](../artifacts/pgm-evidence/MBNWEB-20260718-DEV-LIVE-01)
- [`MBNWEB-20260718-DEV-LIVE-02`](../artifacts/pgm-evidence/MBNWEB-20260718-DEV-LIVE-02)
- [`MBNWEB-20260718-DEV-LIVE-05`](../artifacts/pgm-evidence/MBNWEB-20260718-DEV-LIVE-05)
- [`구/신규 30개 송출 비교`](LEGACY_NEW_PLAYOUT_COMPARISON_20260719.md)
- [`최종 MSIX 화면/DB PASS`](../artifacts/package-input-smoke/legacy-package-input-20260718T194130241Z.json)
- [`PList DB PASS`](../artifacts/package-input-smoke/legacy-package-input-20260718T193931554Z.json)
- [`GraphE DB PASS`](../artifacts/package-input-smoke/legacy-package-input-20260718T194003350Z.json)
- [`ThemeA/EList DB PASS`](../artifacts/package-input-smoke/legacy-package-input-20260718T194054981Z.json)
- [`최종 read-only 회귀 PASS`](../artifacts/package-input-smoke/legacy-package-input-20260718T194240167Z.json)
- [`2026-07-20 실제 입력 보정 PASS`](../artifacts/package-input-smoke/legacy-package-input-20260720T032627652Z.json)
`artifacts`의 개발 장비 증거에는 로컬 실행 상태가 포함될 수 있으므로 고객 MSIX나 Git 배포물에
넣지 않는다.
## 현재 코드 작업과 분리된 외부 항목
### 1. 제작 자산
- `s5006\Video\큐브배경.vrv`
- `s6001` 국가 영상 13개
- `배경\기본.vrv`
- 필요한 스튜디오 `.vrv` 배경 원본
현재 authoritative 원본 Cuts에도 없다. 자산 없이 진행한다는 사용자 결정에 따라 제공 전에는
관련 경로만 안전하게 차단하며, 이는 현재 작업 전체의 차단 사유가 아니다. 나중에 자산을 받으면
trusted root·빈 파일·reparse·경로 이탈 검사를 통과시킨 뒤 `s5006`/`s6001`을 실제 PGM에서 검증한다.
### 2. 기존 플레이리스트 데이터 정합성
총 2,213행 가운데 1,581행은 현재 식별자로 즉시 복원할 수 있고, GraphE fresh read로 22행을 더
복원할 수 있다. 최종 610행은 과거 저장 identity 또는 현재 DB 식별정보가 부족해 차단한다. 이 중
KRX 테마 493행과 NXT 테마 48행은 DBA의 데이터 정합성 결정이 필요하다. 이름이나 유사 scene으로
추정 복원하지 않는다.
### 3. 고객 배포
현재 작업 범위에서는 보류한다. 사용자가 배포를 재개하면
고객용 version, Publisher, 서명 인증서, 인증서 보관·갱신 절차, 업데이트 방식, 새 PC의 DB 및
Development Live 로컬 설정 배포 방식이 확정돼야 한다. Release/default `DryRun`, scene/path
allowlist, vendor hash, STA 직렬화와 대상 identity 검사는 그대로 유지한다.
## 완료 조건
외부 자산 두 scene의 PGM 검증, 610행에 대한 DBA 결정 또는 명시적 영구 차단 승인, 고객 서명
MSIX의 clean 설치·업데이트·새 PC 설정 검증이 끝나면 이관을 고객 배포 기준의 완전 완료로 올린다.