# 원본 기능 재감사 기준표

감사 기준일: 2026-07-15
현행 판정 갱신: 2026-07-22

> 현재 완료·차단·외부 입력 범위는 [`MIGRATION_STATUS.md`](MIGRATION_STATUS.md)가
> 우선한다. 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로 연결된다. 2026-07-18에는 Designer가 아닌 `MainForm` 생성자에서 동적으로
구독되던 10초 DB 상태 감시를 LegacyParityApp 수명주기에 연결했고, 개발 MSIX 전체 UI/DB와
실제 PGM runtime route 32/34를 검증했다.
2026-07-21에는 실제 DB의 전체 동적 목록을 다시 대조해 고정 결과 상한, 과도한 문자열 정규화,
활성 preview와 원문 편집의 혼용을 제거했다. 기존 행은 목록과 편집 화면에 보존하고, 송출 직전
fresh identity·payload 검증은 별도 경계로 유지한다.
2026-07-22에는 당시 등록 개발 패키지에서 실제 Windows 입력 여섯 회차를 실행해
UC1~UC7 전체 버튼, 350ms double-click, drag, 키보드/검색, DB CRUD·fresh read·cleanup과
선택 행 기준 DryRun NEXT를 확인했다. blocked·state violation·warning은 전 회차 0이다.
그 뒤 즉시 행 선택, PROGRAM 중 미래 행 Space/전체 enabled 변경, ThemeA/UC6 빈 검색 전체
조회, 비교쌍 명시적 import와 설정 폴더 검사를 교정해 자동 검증을 통과했다. 이 변경을 포함한
최신 AppX의 실제 물리 입력·DB cleanup·로컬 상태 회차는 아직 재실행 전이다.
최신 결합 코드의 Core/Paged는 각각 `LATEST-CORE-01` 6/6과 `LATEST-PAGED-04` 24/24로
실제 PGM 재검증을 마쳤다. `s6001` 영상 비의존 4 action/18-stage workflow는 구현·static
PASS지만 실제 PGM은 아직 실행하지 않았다. `s5006` 큐브 배경과 `s6001` 국가 영상 13개를
쓰는 action은 원본에도 없는 외부 제작 자산 때문에 fail closed한다. 기본 송출 모드는 계속
`DryRun`이다.

## 상태 정의

| 상태 | 의미 |
|---|---|
| `완료` | 현재 LegacyParityApp 코드와 표에 명시한 자동/통합 검증에 반영됨. package/Live 여부는 각 행의 증적 범위로 별도 판정 |
| `부분 실측` | 현재 package 또는 Live의 표에 명시한 범위만 실제 확인했으며 scene/PGM 전체 통합으로 확대할 수 없음 |
| `최종 재검증 대기` | 구현·자동 검증 또는 고정된 이전 실측은 있으나 최신 결합 AppX/PGM의 물리 실행을 아직 성공 증거로 채택하지 않음 |
| `외부자산 필요` | 코드로 만들 수 없는 Git/MSIX 밖의 승인 영상·배경이 제공되지 않음 |
| `외부 데이터 정합성` | 현재 DB view/data가 원본 규칙의 fresh identity를 공급하지 않아 추정 없이 차단함 |

## 우선순위별 결과

| ID | 우선순위 | 기능 | 상태 | 현재 판정과 증적 | 남은 경계 |
|---|---|---|---|---|---|
| LF-001 | P0 | `s6001` 해외지수/원자재 | 최종 재검증 대기 | 국가 영상 13개 action은 외부자산 필요. 두바이유·WTI·브렌트유·금 4 action은 필수 built-in 이미지 2개를 쓰는 18-stage workflow 구현·static PASS | 영상 비의존 4 action 실제 PGM. 국가 영상 action은 자산 제공 후 별도 PGM |
| LF-002 | P0 | cut/asset coverage | 완료 | 설정 Cuts root는 active alias 45개 `.t2s`와 필수 built-in asset 9개를 모두 요구한다. optional 외부 asset 14개 누락은 수용하되 영향 action만 제한하며 빈 파일·reparse·중간 junction·root 이탈은 거부한다 | 누락 자산 자체는 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 최종 통합 | 부분 실측 | 최신 `LATEST-CORE-01`의 5001/5074 6/6, 분할 회차의 자산 비의존 30개 route 30/30, 최신 `LATEST-PAGED-04`의 5077 20페이지·5088 전환·이전/final unload 24/24를 실제 PGM에서 확인. `FAILURE=0`, `ERROR=0`, retry 0, `OutcomeUnknown=false` | s6001 영상 비의존 4 action 실제 PGM 대기. s5006과 s6001 국가 영상 action은 외부자산 제공 전 제한 |
| LF-006 | P0 | 원본 35 scene | 완료 | 원본 inventory와 source 기준선 35/35, DTO→mutation→runtime matrix 통과 | 모든 scene의 실제 PGM 완료로 확대 해석 금지 |
| LF-007 | P0 | PageN/NEXT | 완료 | 자동 테스트와 최신 `LATEST-PAGED-04` 실제 PGM에서 5077 6행 1/20→20/20, 마지막 페이지, playlist NEXT, 5088 12행 1/20 전환을 24/24로 확인. `LATEST-CORE-01`의 5074 page 1→2도 6/6 회차에 포함 | 없음 |
| 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를 폐쇄형으로 고정. 직전 `screens` 회차에서 UC1 leaf와 parent double-click을 실제 입력해 parent section action 수와 native intent 1건을 대조했다 | 동적 DB 행은 별도 검증 |
| LF-011 | P1 | UC4/UC6/UC7 클릭 | 최종 재검증 대기 | 테마 1,747개, 전문가 6명/추천 32행, 거래정지 112행을 실제 DB와 대조. 직전 `screens` 회차에서 검색·행 선택·정렬·350ms double-click·모든 action을 실제 입력으로 확인했다. UC6 빈 검색 전체 조회와 클릭 즉시 선택 표시·pending action lock은 자동 검증 완료 | 변경 포함 최신 AppX 물리 입력 |
| LF-012 | P1 | GraphE/FSell/VI | 최종 재검증 대기 | GraphE 7,776행 전체 raw 조회·편집·삭제, strict-ready 7,726/송출 보류 50 분리. 기존 이름 기반 GraphE 36행은 36/36 fresh 복원됐다. 직전 `graphe` 491입력과 FSell/VI save+append+close는 PASS. 현재 OperatorData의 개인/외국인/기관/VI발동 4파일은 원본 Data와 length·SHA-256 exact equal이다 | 즉시 선택 교정 포함 최신 AppX 물리 입력. 보류 50행은 fresh PREPARE gate 유지 |
| LF-013 | P1 | PList/AList | 최종 재검증 대기 | 목록·생성·save/load/delete·행 double-click 이관, 개발 DB write/readback/cleanup PASS. PROGRAM 중 Space/전체는 원본 의도를 보존하되 이미 진행한 prefix가 아니라 미래 행 enabled만 변경하도록 자동 검증했다 | 변경 포함 최신 AppX 물리 입력 |
| LF-014 | P1 | ThemeA/EList | 최종 재검증 대기 | ThemeA 1,747개 전체 조회. 기존 편집은 raw `SB_ITEM` 전체를 읽어 비활성·교차 prefix·동일 순번 중복·경계 공백 제목을 보존한다. EList NULL 매수가 5행도 빈 값으로 보존. ThemeA 빈 검색 전체 조회와 클릭 즉시 선택 표시·pending action lock은 자동 검증 완료 | 변경 포함 최신 AppX 물리 입력. scene PGM은 LF-005 |
| LF-015 | P1 | UC5 해외 | 완료 | 해외업종 53개·해외종목 1,474개를 표시하고 이름 없는 16행만 격리. 업종 동명 행은 exact DB tuple로 구분 | s6001 13개 영상은 LF-001 |
| LF-016 | P1 | F2/F3 배경 선택 | 완료 | background root picker, background-none와 trusted path 검사를 구현했다. 특정 `기본.vrv`가 없으면 없는 상태로 진행하며 외부자산 14개 집계에 넣지 않는다 | 사용자가 별도 배경을 지정할 때 trusted 검사를 적용 |
| LF-017 | P1 | 시스템 종료 확인 | 완료 | 원본 제목 `매일경제TV`, 중립 문구, 예/아니요와 기본 아니요를 유지하며 자동 TAKE OUT/반대 명령 금지 경계를 코드·자동 테스트로 유지 | 현재 Release package-context 회귀는 LF-005와 함께 판정 |
| LF-018 | P1 | 원본 비교쌍/수동 파일 | 최종 재검증 대기 | `원본 비교쌍 가져오기`가 trusted 원본 `종목비교.dat` 8쌍을 모두 resolve한 뒤 현재 순서를 보존해 unseen pair만 atomic 병합한다. 현재 OperatorData의 개인/외국인/기관/VI발동 4파일은 원본 bin\Debug\Data와 length·SHA-256 exact equal이며 사용 가능 | 최신 AppX에서 현재 1+원본 8=9, 재실행 추가 0의 실제 로컬 상태 smoke 대기. 원본은 계속 읽기 전용 |
| LF-019 | P1 | 실제 DB read→DTO→mutation | 완료 | Oracle/MariaDB 필수 scene selector 33/33, 전체 query 58건 PASS | 외부 asset/PGM 성공과 별도 |
| LF-020 | P2 | FarPoint 대체 | 최종 재검증 대기 | 직전 등록 패키지에서 종목 검색·키보드, 컷 다중 drag, 플레이리스트 이동/drag, drag feedback, 송출 뒤 컷 선택 표시와 focus/IME draft 보존을 Windows 입력으로 검증했다. 시스템 double-click 시간(이 장비 500ms)을 반영해 350ms 입력도 한 동작으로 처리한다. 이후 GraphE/ThemeA/비교/VI의 즉시 선택 표시와 선택 의존 action pending lock을 교정해 자동 검증했다 | 변경 포함 최신 AppX 물리 입력. 활성 Print/Excel export는 원본에도 없음 |
| LF-021 | P2 | 패키지 단일 인스턴스·모달 격리 | 완료 | 두 번째 activation, child modal Escape, 전역 키 격리, Tab trap, focus 복귀와 PList pending close lock을 자동 검증하고 PList 모달을 실제 입력으로 재검증 | 고객 서명 MSIX의 clean PC 설치 검증은 배포 단계 |
| 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개** 전수 분류. Designer 밖에서 `MainForm` 생성자가 동적으로 구독하던 `timerAliveChecker`의 10초 DB 끊김·복구 감시와 전이 로그도 LegacyParityApp 수명주기에 연결 | 상세 줄 단위 근거는 `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는 FarPoint `AllowRowMove`의 source 행 하나를 임의 before/after 위치로
  옮긴다. Ctrl/Shift 집합은 삭제 선택으로만 유지하며, 체크박스에서 시작한 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 자기 행을
제외하지 않아 변경하지 않은 이름은 중복으로 판정된다.

명백한 결함 또는 송출 안전을 해치는 동작은 동등성 예외로 유지한다. 마지막 행에 NEXT로
도착한 뒤 stale `m_ShowIndex` 때문에 같은 scene을 다시 `Play(10)`하는 동작, 실패한 Page NEXT를
성공 전에 화면 숫자에 반영하는 동작, `s_buf[100]` shadow 값 때문에 첫 Space가 실제 체크값과
어긋나는 동작은 재현하지 않는다. 마지막 NEXT는 no-wrap/no-command, Page 표시는 성공 뒤 반영,
Space는 현재 authoritative enabled 값을 반전한다.

## 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에 임의 쓰기를
허용하거나 수행했다는 뜻이 아니다.

## 직전 등록 패키지 실제 입력 증거 (2026-07-22)

당시 등록된 Development Mode AppX의 Web 자산·핵심 DLL을 당시 빌드와 hash 대조한 뒤 실제
Windows 포인터·키보드 입력으로 다음 회차를 실행했다. 여섯 회차 모두 `PASS`였고
blocked outbound, state violation, warning은 각각 0이었다. DB 쓰기 회차는 승인된 임시
식별자만 사용했고 cleanup을 확인했으며, 앱은 정상 종료되고 Tornado2 연결은 0으로 돌아왔다.
이후 교정된 즉시 선택·PROGRAM enabled·빈 검색·설정·비교 importer를 포함한 최신 AppX의
물리 회차는 아직 실행 전이므로 아래 증거를 최신 코드 최종 실측으로 확대하지 않는다.

| 증거 | 입력 | 화면/DB 검사 | 승인 write | 핵심 경계 |
|---|---:|---:|---:|---|
| [`latest-readonly`](../artifacts/package-input-smoke/legacy-package-input-20260721T221024787Z-latest-readonly.json) | 73 | 0/0 | 0 | DB write 0, playout intent 0, 최종 playlist 3 |
| [`latest-graphe`](../artifacts/package-input-smoke/legacy-package-input-20260721T221122292Z-latest-graphe.json) | 491 | 5/12 | 12 | GraphE 4종 fresh reopen·350ms double-click·delete/absence, cleanup |
| [`latest-catalog`](../artifacts/package-input-smoke/legacy-package-input-20260721T221252795Z-latest-catalog.json) | 264 | 3/11 | 7 | ThemeA KRX/NXT·EList 검색/double-click/reorder/drag/delete, cleanup |
| [`latest-screens`](../artifacts/package-input-smoke/legacy-package-input-20260721T221352946Z-latest-screens.json) | 664 | 15/15 | 22 | UC1~UC7 전체 버튼·parent batch·GraphE/FSell/VI·모달, cleanup |
| [`latest-plist`](../artifacts/package-input-smoke/legacy-package-input-20260721T221553250Z-latest-plist.json) | 91 | 0/3 | 3 | create/save→fresh readback→delete/absence, cleanup |
| [`latest-dryrun-playout`](../artifacts/package-input-smoke/legacy-package-input-20260721T221635626Z-latest-dryrun-playout.json) | 83 | 0/0 | 0 | 선택 행 NEXT·drag 상태·PROGRAM 선택·tail append, DB write/Tornado2 연결 0 |

DryRun 송출 회차는 3행 중 `legacy-stock-00000003`을 선택한 상태에서 NEXT가
`legacy-stock-00000001`로 이동함을 확인했다. PROGRAM 뒤 컷 선택은 0번이고, 안전한 마지막
double-click만 `legacy-stock-00000004` 한 행을 append해 playlist가 3→4행이 됐다.

## 현행 PList operator 로드 경계 (2026-07-21)

현행 `LegacyParityApp`은 활성 정의 23개와 연결된 2,213행을 목록 단위로 거부하지 않고
모두 로드한다. 최신 DB 감사 결과는 `rowsLoaded=2213`, `sceneAliasResolved=2213`,
`rowLevelDeferred=0`, `wholeListRejected=0`이며, 직전 개발 패키지의 실제 마우스 입력으로
첫 목록 58행을 팝업 없이 불러왔다. 이 수치는 목록/scene alias 복원 근거이고, 각 행의
최신 DB payload·asset·PGM 성공 근거는 아니다(`playoutPreflightAsserted=false`).

2026-07-22 최신 실제 DB smoke는 2,213행 가운데 1,617행을 fresh typed selection으로
복원하고 596행을 보류했다. 보류는 KRX 테마 493행, NXT 테마 48행, 비교 시장 identity
유실 25행, unique closed mapper 없음 30행이다. 기존 이름 기반 GraphE 36행은 원본 저장
의미와 같은 compatibility projection을 적용해 36/36 fresh materialization됐다.

## 동적 DB 목록 호환 경계 (2026-07-21)

원본에서 보이던 행을 목록 진입 단계의 송출 검증으로 통째로 숨기지 않는다. 실제 read-only 감사와
직전 개발 패키지 클릭 결과는 다음과 같다.

- 국내 종목 4,599/4,599, 해외 비교 raw 1,490 중 표시 1,474·선택 가능 1,473,
  UC5 업종 53·종목 1,474, UC7 거래정지 112를 확인했다.
- Theme/ThemeA는 KRX 1,571/NXT 176, 합계 1,747개다. 제목 앞뒤 공백 92행과 중복 제목
  14행도 market·code identity로 구분한다.
- ThemeA 편집은 저장된 `SB_ITEM`을 직접 읽는다. KRX/NXT 교차 prefix 5/3행과 동일
  `SB_I_INDEX` 2그룹·4행을 유실하지 않는다. 신규 테마는 계속 시장별 prefix만 허용한다.
- GraphE는 Revenue 1,961행, Growth 1,119행, Sales 2,349행, OperatingProfit 2,347행,
  합계 7,776행을 모두 raw 편집 대상으로 노출한다. 원본이 빈 항목을 저장한 `_` 슬롯과 빈
  분기명은 레거시 규칙으로 수용한다. 최신 read-only 감사 결과 strict-ready/deferred는 각각
  Revenue 1,960/1, Growth 1,114/5, Sales 2,329/20, OperatingProfit 2,323/24이며,
  합계 7,726/50이다. 정수 값의 선후행 공백·TAB, 분기명 후행 TAB과 완전히 동등한 중복 DB행은
  원본 저장 의미대로 수용하되 conflicting 중복과 내부 제어문자는 거부한다. 남은 50행도 기존 값
  조회·수정·삭제는 가능하지만 PREPARE 전에 fresh projection gate를 통과해야 한다.
- 전문가 6명의 추천 32행 중 매수가 NULL 5행은 빈 셀로 보존한다. 임의 기본값을 만들지 않으며,
  숫자 매수가가 필요한 송출 action만 사용할 수 없다.
- VI와 국내 비교는 빈 검색 4,599행, `KODEX` 238행을 실제 화면에 표시했다. 실제 상한을
  넘거나 행이 격리되면 화면에 지속 경고를 표시한다.

이 재감사에서 ThemeA raw 편집 외 추가 P0/P1 DB 로드 차이는 발견되지 않았다. `PLAY_LIST`의
정의 없는 orphan 88행은 원본 PList도 표시하지 않는 데이터이므로 회귀로 분류하지 않는다.

## 기존 PLAY_LIST read-only fresh-selection 재분류 (2026-07-12 역사적 증거)

실제 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 / fresh-selection 증명 보류 610 |

이 표의 610행은 현행 DB 목록 로드 차단 수치가 아니다. `selectionMapped`는 scene asset,
PREPARE나 PGM 성공 수치도 아니다. 상세는
[`NAMED_PLAYLIST_READ_AUDIT.md`](NAMED_PLAYLIST_READ_AUDIT.md)를 따른다.

최신 재분류는 이 역사적 표에서 GraphE 보류 14행을 모두 복원해 `1,617/596`이다. 다른 보류
사유와 수치는 바뀌지 않았으며, 이를 과거 2026-07-12 회차의 결과에 소급 적용하지 않는다.

## 외부자산 목록

설정 validator는 45개 active alias의 `.t2s`와 필수 built-in asset 9개를 요구하며 현재
검증을 통과한다. 별도 optional 외부 제작 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`

이 파일들의 부재는 code/build 실패가 아니라 **외부자산 미제공**이다. 검사기는 존재,
0바이트, root escape, reparse·중간 junction과 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 경로를 새 활성 기능으로 만들지 않는다.

## 최종 증적 기록

현재 구현 증적과 최종 검증 범위는 [`MIGRATION_STATUS.md`](MIGRATION_STATUS.md)에 기록한다.
마지막 전체 .NET solution 실행은 3,115/3,115였다. 그 뒤 추가된 교정의 focused 자동 검증은
통과했지만 전체 solution 합계는 최종 재실행 뒤 갱신한다. 별도 LegacyParityWeb은 127/127,
WebPlayout JavaScript는 424/424이고 직전 Debug build/rebuild는 warning 0, error 0이다.
직전 등록 개발 패키지 UI/DB 여섯 회차는 모두 PASS지만 최신 변경 포함 AppX 물리 재검증은
대기 중이다. 실제 PGM은 최신 Core 6/6, 30 route 30/30, 최신 Paged 24/24 기준선을 확보했다.
`s6001` 영상 비의존 4 action/18-stage workflow는 static PASS이고 실제 PGM은 실행 전이다.
고객 서명 MSIX는 현재 범위에서 보류한다. `s5006` 큐브와 `s6001` 국가 영상 action은
외부자산 제공 전까지 fail closed하고, `s6001` 영상 비의존 4 action은 실제 PGM 재검증 대기다.
2026-07-15의 상세 package 증적은
[`LEGACY_PARITY_VALIDATION_20260715.md`](LEGACY_PARITY_VALIDATION_20260715.md)에 역사 기록으로
보존한다.

원본 저장소는 최종 검증과 배포 이후에도 계속 읽기 전용으로 유지한다.
