fix: complete legacy operator parity workflows
This commit is contained in:
@@ -53,12 +53,15 @@ RAR이다. 파일 경로와 용도가 이번 MBN 송출 자산과 무관하므
|
||||
임시 폴더에서 발견된 대상명 1-byte 파일 14개는 자동 테스트 fixture이므로 운영
|
||||
자산으로 사용할 수 없다.
|
||||
|
||||
이에 따라 현재 외부 의존성 판정은 그대로다.
|
||||
이 2026-07-12 디스크 검색 결과 자체는 그대로 유지된다. 현행 실행 판정은 이후 검증 범위를
|
||||
반영해 다음처럼 자산 의존 action 단위로 적용한다.
|
||||
|
||||
- `s5006`: 승인 Cuts의 `Video\큐브배경.vrv` 제공 전 차단
|
||||
- `s6001`: 승인 Cuts의 국가별 `Video\20201008_<국가>.vrv` 13개 제공 전 차단
|
||||
- F2/F3 기본 배경: 별도 신뢰 배경 root의 `기본.vrv` 제공 전 차단
|
||||
- `s5006`: 승인 Cuts의 `Video\큐브배경.vrv`를 쓰는 action은 제공 전 차단
|
||||
- `s6001`: 국가별 `Video\20201008_<국가>.vrv`를 쓰는 13 action만 제공 전 차단. 영상
|
||||
비의존 두바이유·WTI·브렌트유·금 4 action은 실제 PGM 검증 완료
|
||||
- F2/F3 기본 배경: `None` 또는 검증된 신뢰 배경 선택은 가능하며, 누락된 `기본.vrv`를
|
||||
선택한 동작만 제공 전 차단
|
||||
|
||||
자산은 원 제작/운영 보관처에서 승인된 원본으로 제공받아야 하며, 제공 후 기존
|
||||
cut coverage와 opened-handle/reparse/hardlink 검사를 다시 통과해야 한다.
|
||||
외부에서 승인된 원본이 제공되기 전에는 위 세 경로를 모두 fail closed로 유지한다.
|
||||
외부에서 승인된 원본이 제공되기 전에는 위 자산을 요구하는 action만 fail closed로 유지한다.
|
||||
|
||||
@@ -566,7 +566,7 @@ mouse/keyboard 입력으로 DryRun 종단 검증을 완료했다. Tornado 연결
|
||||
- 결과: `PASS`, DryRun playout `PASS`, playlist count `3 -> 3`, blocked outbound `0`,
|
||||
state violation `0`, DB write `0`, 앱 PID의 Tornado `:30001` 연결 `0`, 정상 종료 및 port 해제 확인.
|
||||
|
||||
회귀 결과:
|
||||
당시 회귀 결과(최신 기준선은 `MIGRATION_STATUS.md` 참조):
|
||||
|
||||
- JavaScript: 502/502
|
||||
- .NET solution: 2817/2817
|
||||
|
||||
@@ -169,7 +169,8 @@ checkbox 클릭을 거부하지만, `PlayList_KeyPress`의 Space와 `checkBox1_C
|
||||
변경은 같은 guard가 없어 다음 송출 행을 건너뛰는 데 쓰일 수 있다. 새 앱은 PROGRAM 중 이미
|
||||
진행한 prefix와 현재 on-air 행을 고정하고 **미래 행만** Space/전체 enabled 변경을 허용한다.
|
||||
원본의 운영 편의는 보존하면서 재생 이력과 현재 행을 바꾸지 않는 안전 적응이며 자동 계약 검증은
|
||||
완료됐다. 이 변경을 포함한 최신 AppX의 물리 입력 재검증은 아직 대기 중이다.
|
||||
완료됐다. 이 변경을 포함한 최신 등록 AppX에서도 실제 키보드 입력으로 PROGRAM 중 현재 행 고정과
|
||||
미래 행 enabled 변경을 최종 재검증했다.
|
||||
|
||||
## Designer 밖 동적 활성 이벤트
|
||||
|
||||
|
||||
@@ -20,19 +20,19 @@ WebView2에 표시하는 x64 Windows 데스크톱/MSIX 앱이다.
|
||||
없음”은 현재 구현 상태가 아니다. 원본 UI 이벤트는 LegacyParityApp → strict bridge →
|
||||
C# workflow로 연결된다. 2026-07-18에는 Designer가 아닌 `MainForm` 생성자에서 동적으로
|
||||
구독되던 10초 DB 상태 감시를 LegacyParityApp 수명주기에 연결했고, 개발 MSIX 전체 UI/DB와
|
||||
실제 PGM runtime route 32/34를 검증했다.
|
||||
실제 PGM runtime route를 검증하기 시작했다.
|
||||
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·로컬 상태 회차는 아직 재실행 전이다.
|
||||
2026-07-22에는 최신 등록 개발 패키지에서 실제 Windows 입력 일곱 회차, 합계 1,838입력을
|
||||
실행해 UC1~UC7 전체 버튼, 350ms double-click, drag, 키보드/검색, 즉시 행 선택, PROGRAM 중
|
||||
미래 행 Space/전체 enabled 변경, DB CRUD·fresh read·cleanup과 선택 행 기준 DryRun NEXT를
|
||||
확인했다. 설정 폴더 picker 3종 취소와 비교쌍 명시적 import/재실행 멱등성도 별도 로컬 상태
|
||||
회차로 확인했다. blocked·state violation·warning은 모두 0이다.
|
||||
최신 결합 코드의 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개를
|
||||
실제 PGM 재검증을 마쳤다. `S6001-04`도 영상 비의존 4 action을 18/18로 완료해 현재
|
||||
33/34 runtime route code가 승인된 action 범위의 실제 PGM 증거를 갖는다. `s5006` 큐브 배경과
|
||||
`s6001` 국가 영상 13개를
|
||||
쓰는 action은 원본에도 없는 외부 제작 자산 때문에 fail closed한다. 기본 송출 모드는 계속
|
||||
`DryRun`이다.
|
||||
|
||||
@@ -50,26 +50,26 @@ PASS지만 실제 PGM은 아직 실행하지 않았다. `s5006` 큐브 배경과
|
||||
|
||||
| ID | 우선순위 | 기능 | 상태 | 현재 판정과 증적 | 남은 경계 |
|
||||
|---|---|---|---|---|---|
|
||||
| LF-001 | P0 | `s6001` 해외지수/원자재 | 최종 재검증 대기 | 국가 영상 13개 action은 외부자산 필요. 두바이유·WTI·브렌트유·금 4 action은 필수 built-in 이미지 2개를 쓰는 18-stage workflow 구현·static PASS | 영상 비의존 4 action 실제 PGM. 국가 영상 action은 자산 제공 후 별도 PGM |
|
||||
| LF-001 | P0 | `s6001` 해외지수/원자재 | 부분 실측 | `S6001-04` 18/18에서 두바이유·WTI·브렌트유·금 4 action의 이미지·단위·수치, 자동 갱신과 TAKE OUT/IDLE을 실제 PGM으로 확인. 원본도 무시하는 보조 `wonText`/`pattern` 누락 로그 제한을 명시 | 국가 영상 13 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-005 | P0 | 개발 Tornado2/PGM 최종 통합 | 부분 실측 | 최신 Core 6/6, 자산 비의존 30 route 30/30, Paged 24/24, `S6001-04` 영상 비의존 4 action 18/18을 실제 PGM에서 확인해 33/34 runtime route code 실측. 모두 retry 0, `OutcomeUnknown=false`, 최종 IDLE. 기존 32 route 회차는 `FAILURE=0`/`ERROR=0`; s6001은 필수 명령 성공과 별개로 상속된 보조 오브젝트 누락 24 FAILURE를 명시 | 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-010 | P1 | 10개 탭과 action inventory | 완료 | 10탭, fixed 328, 업종 44, 종목 31, 비교 target 24/action 9를 폐쇄형으로 고정. 최신 `screens` 675입력 회차에서 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과 pending action lock을 실제 입력으로 확인 | 없음 |
|
||||
| LF-012 | P1 | GraphE/FSell/VI | 완료 | GraphE 7,776행 전체 raw 조회·편집·삭제, strict-ready 7,726/송출 보류 50 분리. 기존 이름 기반 GraphE 36행은 36/36 fresh 복원됐다. 최신 `graphe` 501입력과 `screens` 675입력에서 GraphE 4화면 CRUD/cleanup, FSell edit/save/restore/fresh read, VI save/fresh read가 PASS. OperatorData 4파일은 원본과 length·SHA-256 exact equal | 보류 50행은 fresh PREPARE gate 유지 |
|
||||
| LF-013 | P1 | PList/AList | 완료 | 최신 `plist` 106입력에서 recovery delete, create/save, 물리 double-click fresh readback, delete/absence/cleanup을 확인. `program-playlist-db` 65입력에서 PROGRAM 상태 create/save/fresh readback/delete/absence와 최종 IDLE을 확인. 미래 행 enabled 변경도 자동·DryRun 물리 검증 PASS | 없음 |
|
||||
| LF-014 | P1 | ThemeA/EList | 완료 | ThemeA 1,747개 전체 조회와 raw `SB_ITEM` 보존 경계를 유지한다. 최신 `catalog` 299입력에서 KRX/NXT ThemeA 및 EList create/edit/save/fresh readback/delete/absence/cleanup, 빈 검색 전체 조회, 즉시 선택과 행 조작을 확인 | 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-018 | P1 | 원본 비교쌍/수동 파일 | 완료 | 최신 AppX 로컬 상태 smoke에서 trusted 원본 `종목비교.dat` 8쌍을 현재 1쌍 뒤에 atomic 병합해 9쌍, 재실행 추가 0, 원본 SHA-256 불변을 확인. OperatorData 4파일도 원본 bin\Debug\Data와 length·SHA-256 exact equal | 원본은 계속 읽기 전용 |
|
||||
| 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-020 | P2 | FarPoint 대체 | 완료 | 최신 패키지 read-only/DryRun/UI·DB 회차에서 종목 검색·키보드, 컷 다중 drag, 플레이리스트 이동/drag, drag feedback, 송출 뒤 컷 선택 표시, focus/IME draft 보존, GraphE/ThemeA/비교/VI 즉시 선택과 pending lock을 실제 입력으로 검증. 350ms double-click도 한 동작으로 처리 | 활성 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 추정 금지 |
|
||||
@@ -141,27 +141,29 @@ write는 자동 재시도하지 않는다. `OutcomeUnknown`이면 cleanup mutati
|
||||
보내지 않는 구현·테스트 경계를 유지한다. 이 결과는 개발 DB 검증이며 운영 DB에 임의 쓰기를
|
||||
허용하거나 수행했다는 뜻이 아니다.
|
||||
|
||||
## 직전 등록 패키지 실제 입력 증거 (2026-07-22)
|
||||
## 최신 등록 패키지 실제 입력 증거 (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의
|
||||
물리 회차는 아직 실행 전이므로 아래 증거를 최신 코드 최종 실측으로 확대하지 않는다.
|
||||
등록된 Development Mode AppX의 Web 자산·핵심 DLL을 최신 빌드와 hash 대조한 뒤 실제
|
||||
Windows 포인터·키보드 입력으로 일곱 회차와 로컬 설정·비교 가져오기 회차를 실행했다.
|
||||
총 1,838개 입력이 모두 `PASS`였고 blocked outbound, state violation, warning은 각각 0이었다.
|
||||
DB 쓰기 회차는 승인된 임시 식별자만 사용해 fresh readback·delete·absence와 cleanup을
|
||||
확인했다. 앱은 정상 종료했고 Tornado2/PGM은 강제 종료하거나 변경하지 않았다.
|
||||
|
||||
| 증거 | 입력 | 화면/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 |
|
||||
| 증거 | 입력 | 핵심 경계 |
|
||||
|---|---:|---|
|
||||
| [`latest-readonly`](../artifacts/package-input-smoke/legacy-package-input-20260722T113449758Z.json) | 84 | DB write 0, playout intent 0, 포인터·키보드 기본 동작 |
|
||||
| [`latest-dryrun-playout`](../artifacts/package-input-smoke/legacy-package-input-20260722T115610505Z.json) | 108 | 선택 행 NEXT·drag 상태·PROGRAM 선택·tail append, DB write/Tornado2 연결 0 |
|
||||
| [`latest-plist`](../artifacts/package-input-smoke/legacy-package-input-20260722T123711141Z.json) | 106 | create/save→fresh readback→delete/absence, cleanup |
|
||||
| [`latest-program-playlist`](../artifacts/package-input-smoke/legacy-package-input-20260722T124248490Z.json) | 65 | PROGRAM named playlist 저장·재조회·삭제·absence, cleanup |
|
||||
| [`latest-graphe`](../artifacts/package-input-smoke/legacy-package-input-20260722T124550096Z.json) | 501 | GraphE 4종 fresh reopen·double-click·delete/absence, cleanup |
|
||||
| [`latest-catalog`](../artifacts/package-input-smoke/legacy-package-input-20260722T124717969Z.json) | 299 | ThemeA KRX/NXT·EList 검색/double-click/reorder/drag/delete, cleanup |
|
||||
| [`latest-screens`](../artifacts/package-input-smoke/legacy-package-input-20260722T124819923Z.json) | 675 | UC1~UC7 전체 버튼·parent batch·GraphE/FSell/VI·모달, cleanup |
|
||||
| [`latest-local-state`](../artifacts/package-input-smoke/legacy-package-local-state-20260722T021114553Z-final-r3.json) | — | 디자인·리소스·배경 폴더 선택 취소, 설정 불변, 비교 9행·두 번째 import 추가 0 |
|
||||
|
||||
DryRun 송출 회차는 3행 중 `legacy-stock-00000003`을 선택한 상태에서 NEXT가
|
||||
`legacy-stock-00000001`로 이동함을 확인했다. PROGRAM 뒤 컷 선택은 0번이고, 안전한 마지막
|
||||
double-click만 `legacy-stock-00000004` 한 행을 append해 playlist가 3→4행이 됐다.
|
||||
DryRun 송출 회차는 staging이 `legacy-stock-00000002`, 선택 행이
|
||||
`legacy-stock-00000003`인 상태에서 NEXT가 `legacy-stock-00000001`로 이동함을 확인했다.
|
||||
PROGRAM 뒤 컷 선택은 0번이고, 안전한 마지막 double-click만
|
||||
`legacy-stock-00000008` 한 행을 append해 playlist가 3→4행이 됐다.
|
||||
|
||||
## 현행 PList operator 로드 경계 (2026-07-21)
|
||||
|
||||
@@ -262,14 +264,13 @@ redacted 형태로 보고한다.
|
||||
## 최종 증적 기록
|
||||
|
||||
현재 구현 증적과 최종 검증 범위는 [`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 재검증 대기다.
|
||||
최종 Release x64 전체 .NET solution 3,182/3,182, LegacyParityWeb 150/150,
|
||||
WebPlayout JavaScript 424/424, scene 기준선 35/35와 staged PGM 정적 계약이 실패 0으로
|
||||
통과했다. 최신 등록 개발 패키지의 일곱 물리 입력 회차 1,838입력과 설정/비교 로컬 상태
|
||||
회차도 PASS다. 실제 PGM은 최신 Core 6/6, 30 route 30/30, Paged 24/24와
|
||||
`S6001-04` 영상 비의존 4 action 18/18을 확보해 승인된 action 범위에서 33/34 runtime
|
||||
route code를 실측했다. 고객 서명 MSIX는 현재 범위에서 보류한다. `s5006` 큐브와 `s6001`
|
||||
국가 영상 action은 외부자산 제공 전까지 fail closed한다.
|
||||
2026-07-15의 상세 package 증적은
|
||||
[`LEGACY_PARITY_VALIDATION_20260715.md`](LEGACY_PARITY_VALIDATION_20260715.md)에 역사 기록으로
|
||||
보존한다.
|
||||
|
||||
@@ -71,5 +71,6 @@ UI-only와 실제 입력 증거는 Git 제외 경로 `artifacts\package-ui-only-
|
||||
|
||||
현재 원본 `Cuts\Video`가 비어 있어 `s5006`의 큐브 배경 1개와 `s6001` 국가별 영상
|
||||
13개는 이 배치만으로 제공되지 않는다. 일부 기본/스튜디오 `.vrv` 배경도 원본 제작
|
||||
자산이 필요하다. 임의 파일로 대체하지 않으며 제공 전까지 해당 장면의 자산 preflight가
|
||||
명시적으로 차단해야 한다.
|
||||
자산이 필요하다. 임의 파일로 대체하지 않으며 제공 전까지 해당 자산을 요구하는 action의
|
||||
preflight만 명시적으로 차단해야 한다. `s6001`의 영상 비의존 두바이유·WTI·브렌트유·금
|
||||
4 action은 별도 최신 회차에서 실제 PGM 검증을 완료했다.
|
||||
|
||||
@@ -35,16 +35,16 @@ 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 · 최신 코드 물리 재검증 대기** | 등록 개발 패키지에서 실제 Windows 입력으로 UC1~UC7, GraphE, FSell, VIList, ThemeA, EList, PList 모달, 검색·키보드·컷/플레이리스트 drag를 검증했다. `readonly` 73, `graphe` 491, `catalog` 264, `screens` 664, `plist` 91, `dryrun-playout` 83 입력은 모두 PASS이고 blocked·state violation·warning은 전 회차 0이다. 그 뒤 즉시 행 선택, PROGRAM 중 미래 행 Space/전체 enabled 변경, ThemeA/UC6 빈 검색 전체 조회, 비교쌍 명시적 import와 설정 UI를 교정했으며 자동 검증은 통과했다. 이 변경을 포함한 새 AppX의 물리 입력·DB cleanup·로컬 상태 회차는 아직 최종 재실행 전이다. |
|
||||
| 개발 Tornado2/PGM | **32/34 route 최신 실측 · s6001 4-action 실측 대기** | 최신 `LATEST-CORE-01`에서 `5001 → 선택 행 NEXT 5074 → Page NEXT → TAKE OUT` 6/6, 분할한 30-route 회차에서 30/30, 최신 `LATEST-PAGED-04`에서 5077/5088 경계 24/24를 실제 PGM으로 확인했다. 명령 실패·오류·retry·`OutcomeUnknown`은 0이다. `s6001`의 영상 비의존 4 action/18-stage workflow는 구현·static PASS지만 실제 PGM은 아직 실행하지 않았다. |
|
||||
| 개발 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 이탈은 거부한다. 폴더 picker 취소와 최신 AppX 물리 검증은 최종 재실행 대기다. |
|
||||
| 자동 회귀 | 완료, 최종 합계 갱신 대기 | 마지막 전체 .NET solution 실행은 3,115/3,115였다. 그 뒤 GraphE storage compatibility, 즉시 선택, PROGRAM 미래 행 enabled, ThemeA/UC6 빈 검색, 설정 validator, 비교 importer와 s6001 staged workflow의 focused/static 검증도 통과했다. 전체 solution 합계는 최종 재실행 뒤 갱신한다. 직전 별도 스크립트는 LegacyParityWeb 127/127, WebPlayout JavaScript 424/424이고 Debug build/rebuild는 warning 0, error 0이다. |
|
||||
| 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으로 실행해
|
||||
실제 Oracle/MariaDB를 read-only로 다시 조회하고 최신 등록 개발 패키지를 DryRun으로 실행해
|
||||
다음을 확인했다. 아래 목록 조회와 편집 화면 확인 중 DB write 및 Tornado2/PGM 명령은 0건이다.
|
||||
|
||||
| 화면/경로 | 실제 DB 및 패키지 결과 | 송출 경계 |
|
||||
@@ -59,30 +59,30 @@ legacy 행까지 숨기던 경로를 제거하고, 불완전한 개별 행만
|
||||
| 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행은
|
||||
최신 패키지 실제 클릭 결과는 C# snapshot과 DOM 행 수가 모두 일치했고, 검수 전 편성표 58행은
|
||||
끝까지 58행으로 유지됐다. ThemeA와 GraphE의 기존 원문을 단순 조회하거나 편집 화면에 여는 행위가
|
||||
곧 송출 가능 승인을 뜻하지는 않는다.
|
||||
|
||||
## 2026-07-22 직전 등록 패키지 실제 입력 기준선
|
||||
## 2026-07-22 최신 등록 패키지 실제 입력 기준선
|
||||
|
||||
당시 등록된 Development Mode 패키지의 Web 자산과 핵심 DLL이 당시 빌드 산출물과 같은지 hash로
|
||||
확인한 뒤 여섯 회차를 실행했다. 패키지 입력 도구에도 빌드 AppX와 등록 AppX가 다르면 시작 전에
|
||||
fail closed하는 검사를 추가했다. 모든 회차는 앱을 정상 종료했으며, 종료 뒤 Tornado2 연결은 0이었다.
|
||||
아래 결과는 유효한 직전 물리 입력 기준선이지만, 이후 교정 사항을 포함한 최신 AppX의 최종 물리
|
||||
재검증 결과로 확대하지 않는다.
|
||||
최신 Development Mode 패키지의 Web 자산과 핵심 DLL을 빌드 AppX와 hash로 고정한 뒤 일곱
|
||||
패키지 입력 회차와 한 로컬 상태 회차를 실행했다. 빌드 AppX와 등록 AppX가 다르면 시작 전에
|
||||
fail closed한다. 모든 패키지 입력 회차는 앱을 정상 종료했고 Tornado2 연결 없이 수행했다.
|
||||
|
||||
| 회차 | 실제 입력과 검사 | 결과 |
|
||||
|---|---|---|
|
||||
| `latest-readonly` | 73입력, outbound 29건, DB write 0, playout intent 0, 최종 playlist 3행 | PASS, blocked/violation/warning 0 |
|
||||
| `latest-graphe` | 491입력, 5 화면 검사, 12 DB 검사, 승인 write 12건 | PASS, cleanup 확인, blocked/violation/warning 0 |
|
||||
| `latest-catalog` | 264입력, ThemeA KRX/NXT와 EList 3 화면 검사, 11 DB 검사, 승인 write 7건 | PASS, cleanup 확인, blocked/violation/warning 0 |
|
||||
| `latest-screens` | 664입력, UC1~UC7·GraphE·FSell·VI 등 15 화면/15 DB 검사, 승인 변경 22건 | PASS, cleanup 확인, blocked/violation/warning 0 |
|
||||
| `latest-plist` | 91입력, create/save→fresh readback→delete/absence 3 DB 검사, 승인 write 3건 | PASS, cleanup 확인, blocked/violation/warning 0 |
|
||||
| `latest-dryrun-playout` | 83입력, 3행 중 선택 행 기준 NEXT, drag feedback/state, PROGRAM 중 컷 선택, 안전한 tail double-click append | PASS, DB write 0, Tornado2 연결 0, blocked/violation/warning 0 |
|
||||
| `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 |
|
||||
|
||||
`latest-dryrun-playout`의 식별 결과는 staged `legacy-stock-00000002`, 선택
|
||||
최신 `dry-run-playout`의 식별 결과는 staged `legacy-stock-00000002`, 선택
|
||||
`legacy-stock-00000003`, NEXT `legacy-stock-00000001`, 안전 append
|
||||
`legacy-stock-00000004`였다. PROGRAM 뒤 컷 선택은 0번이고 playlist는 3행에서 4행으로 정확히
|
||||
`legacy-stock-00000008`이었다. PROGRAM 뒤 컷 선택은 0번이고 playlist는 3행에서 4행으로 정확히
|
||||
한 행만 늘었다.
|
||||
|
||||
## 실제 PGM 검증 경계
|
||||
@@ -107,8 +107,15 @@ fail closed하는 검사를 추가했다. 모든 회차는 앱을 정상 종료
|
||||
`5088` 전환, 이전 scene unload와 최종 TAKE OUT/UNLOAD/IDLE을 24/24로 재검증했다. 결함이
|
||||
있던 최초 실행과 이전 `PAGED-01`은 최신 승인 근거로 사용하지 않는다.
|
||||
- `s6001` 중 국가 영상이 필요 없는 두바이유·WTI·브렌트유·금 4 action은 global
|
||||
`images\주유기merge.png`, `images\35752913_l.jpg`를 고정 검증하는 18-stage staged workflow로
|
||||
구현했고 static audit가 통과했다. 실제 PGM 회차는 아직 실행 전이므로 성공 증거에 포함하지 않는다.
|
||||
`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개가 현재 남은 외부 제작 자산 경계다.
|
||||
|
||||
@@ -119,13 +126,16 @@ fail closed하는 검사를 추가했다. 모든 회차는 앱을 정상 종료
|
||||
- [`8001 known-state TAKE OUT`](../artifacts/pgm-evidence/MBNWEB-20260722-RECOVERY8001-01)
|
||||
- [`30 route 20~29 PGM`](../artifacts/pgm-evidence/MBNWEB-20260722-THIRTY20-29-01)
|
||||
- [`최신 5077/5088 20-page PGM`](../artifacts/pgm-evidence/MBNWEB-20260722-LATEST-PAGED-04)
|
||||
- [`s6001 영상 비의존 4 action PGM`](../artifacts/pgm-evidence/MBNWEB-20260722-S6001-04)
|
||||
- [`구/신규 30개 송출 비교`](LEGACY_NEW_PLAYOUT_COMPARISON_20260719.md)
|
||||
- [`직전 read-only 입력 PASS`](../artifacts/package-input-smoke/legacy-package-input-20260721T221024787Z-latest-readonly.json)
|
||||
- [`직전 GraphE 입력/DB PASS`](../artifacts/package-input-smoke/legacy-package-input-20260721T221122292Z-latest-graphe.json)
|
||||
- [`직전 ThemeA/EList 입력/DB PASS`](../artifacts/package-input-smoke/legacy-package-input-20260721T221252795Z-latest-catalog.json)
|
||||
- [`직전 전체 화면/DB PASS`](../artifacts/package-input-smoke/legacy-package-input-20260721T221352946Z-latest-screens.json)
|
||||
- [`직전 PList 입력/DB PASS`](../artifacts/package-input-smoke/legacy-package-input-20260721T221553250Z-latest-plist.json)
|
||||
- [`직전 DryRun 송출 입력 PASS`](../artifacts/package-input-smoke/legacy-package-input-20260721T221635626Z-latest-dryrun-playout.json)
|
||||
- [`최신 read-only 입력 PASS`](../artifacts/package-input-smoke/legacy-package-input-20260722T113449758Z.json)
|
||||
- [`최신 DryRun 송출 입력 PASS`](../artifacts/package-input-smoke/legacy-package-input-20260722T115610505Z.json)
|
||||
- [`최신 PList CRUD/recovery PASS`](../artifacts/package-input-smoke/legacy-package-input-20260722T123711141Z.json)
|
||||
- [`최신 PROGRAM 재생목록 CRUD PASS`](../artifacts/package-input-smoke/legacy-package-input-20260722T124248490Z.json)
|
||||
- [`최신 GraphE 입력/DB PASS`](../artifacts/package-input-smoke/legacy-package-input-20260722T124550096Z.json)
|
||||
- [`최신 ThemeA/EList 입력/DB PASS`](../artifacts/package-input-smoke/legacy-package-input-20260722T124717969Z.json)
|
||||
- [`최신 전체 화면/DB PASS`](../artifacts/package-input-smoke/legacy-package-input-20260722T124819923Z.json)
|
||||
- [`설정 picker·비교 import 로컬 상태 PASS`](../artifacts/package-input-smoke/legacy-package-local-state-20260722T021114553Z-final-r3.json)
|
||||
|
||||
`artifacts`의 개발 장비 증거에는 로컬 실행 상태가 포함될 수 있으므로 고객 MSIX나 Git 배포물에
|
||||
넣지 않는다.
|
||||
@@ -139,8 +149,8 @@ fail closed하는 검사를 추가했다. 모든 회차는 앱을 정상 종료
|
||||
|
||||
현재 authoritative 원본 Cuts에도 없다. 자산 없이 진행한다는 사용자 결정에 따라 제공 전에는
|
||||
관련 action만 안전하게 차단하며, 이는 현재 작업 전체의 차단 사유가 아니다. `s6001`의 영상
|
||||
비의존 4 action은 별도 실제 PGM 검증 대상으로 계속 진행한다. 나중에 자산을 받으면 trusted
|
||||
root·빈 파일·reparse·경로 이탈 검사를 통과시킨 뒤 `s5006`과 국가 영상 action을 실제 PGM에서 검증한다.
|
||||
비의존 4 action은 실제 PGM 검증을 완료했다. 나중에 자산을 받으면 trusted root·빈 파일·reparse·
|
||||
경로 이탈 검사를 통과시킨 뒤 `s5006`과 국가 영상 action을 실제 PGM에서 검증한다.
|
||||
|
||||
### 2. 기존 플레이리스트 데이터 정합성
|
||||
|
||||
@@ -156,8 +166,8 @@ materialization하여 `1,617 복원 / 596 보류`로 갱신됐다. 596행은 KRX
|
||||
|
||||
원본 `종목비교.dat` 8쌍을 현재 로컬 순서 뒤에 중복 없이 병합하는 명시적 importer도 구현했다.
|
||||
원본 파일은 고정된 trusted path에서 읽기 전용으로 열고 8쌍을 모두 resolve한 뒤에만 atomic하게
|
||||
저장하며, 실패 시 현재 파일을 보존한다. 실제 최신 AppX에서 `현재 1쌍 + 원본 8쌍 = 9쌍`과 두 번째
|
||||
실행의 `추가 0`을 확인하는 로컬 상태 smoke는 아직 실행 전이다.
|
||||
저장하며, 실패 시 현재 파일을 보존한다. 실제 최신 AppX 로컬 상태 smoke에서 `현재 1쌍 + 원본
|
||||
8쌍 = 9쌍`, 두 번째 실행의 `추가 0`, 원본 SHA-256 불변을 확인했다.
|
||||
|
||||
### 3. 고객 배포
|
||||
|
||||
@@ -168,8 +178,8 @@ allowlist, vendor hash, STA 직렬화와 대상 identity 검사는 그대로 유
|
||||
|
||||
## 완료 조건
|
||||
|
||||
최신 AppX의 전체 물리 입력/DB cleanup/설정·비교 import 로컬 상태 재검증, `s6001` 영상 비의존
|
||||
4 action의 실제 PGM 검증, 기존 보류 행의 payload/asset/PGM 경계 판정을 마치면 현재 개발 장비의
|
||||
대체 운영 기준선을 확정한다. 외부 제작 자산 14개가 없는 action은 제공 전까지 명시적으로 차단한
|
||||
상태가 정상 기준이다. 고객 서명 MSIX의 clean 설치·업데이트·새 PC 설정 검증은 사용자가 배포를
|
||||
재개할 때 별도 완료 조건으로 적용한다.
|
||||
최신 AppX의 전체 물리 입력/DB cleanup/설정·비교 import와 `s6001` 영상 비의존 4 action의
|
||||
실제 PGM 검증까지 완료했으므로, 현재 개발 장비에서 검증 가능한 범위의 대체 운영 기준선은
|
||||
확정됐다. 외부 제작 자산 14개가 없는 action과 fresh identity를 증명할 수 없는 596행은 제공·DBA
|
||||
결정 전까지 명시적으로 차단한 상태가 정상 기준이다. 고객 서명 MSIX의 clean 설치·업데이트·새 PC
|
||||
설정 검증은 사용자가 배포를 재개할 때 별도 완료 조건으로 적용한다.
|
||||
|
||||
@@ -7,10 +7,11 @@
|
||||
> 자체의 로드 성공/실패 수치가 아니다. 최신 operator 호환 감사에서는 활성 정의 23개와
|
||||
> 2,213행을 모두 로드했고(`wholeListRejected=0`), 2,213행 모두 기존 scene alias로
|
||||
> 식별됐다. 최신 실제 DB compatibility projection은 GraphE 36행을 36/36 복원해 현재
|
||||
> `1,617 복원 / 596 보류`다. 직전 개발 패키지에서도 `DB 불러오기 → 첫 목록 선택 →
|
||||
> 불러오기`를 실제 마우스로 실행해 58행, 팝업 0, scene 미식별 0을 확인했다. 다만 이
|
||||
> `1,617 복원 / 596 보류`다. 최신 등록 개발 AppX에서도 `DB 불러오기 → 첫 목록 선택 →
|
||||
> 불러오기`를 실제 마우스로 실행해 목록 로드·선택·스케줄 추가와 관련 화면/DB 동작을
|
||||
> 최종 물리 입력 회차에 포함해 확인했다. 다만 이
|
||||
> 감사는 각 행의 asset·Tornado2 PREPARE/PGM 성공까지 주장하지 않는다
|
||||
> (`playoutPreflightAsserted=false`). 최신 코드 포함 AppX 물리 재검증은 별도 대기 중이다.
|
||||
> (`playoutPreflightAsserted=false`).
|
||||
|
||||
원본(읽기 전용): `C:\Users\MD\source\repos\MBN_STOCK_N\MBN_STOCK_N\Form\PList.cs`
|
||||
감사 구현:
|
||||
|
||||
@@ -151,10 +151,10 @@ fixed-075 금 지수 Gold
|
||||
```
|
||||
|
||||
These actions use only the two globally pinned image assets. They do not exercise
|
||||
or claim parity for the 13 country-video actions. The workflow is implemented and
|
||||
its static audit passes, but as of this baseline it has **not** been run against
|
||||
actual PGM. Do not record it as completed until all 18 one-shot stages succeed in a
|
||||
new evidence directory.
|
||||
or claim parity for the 13 country-video actions. The workflow's static audit and
|
||||
the accepted `MBNWEB-20260722-S6001-04` actual-PGM run both pass. Record completion
|
||||
only when one evidence directory contains all 18 ordered one-shot stages, no
|
||||
`STOPPED.json`, final IDLE, and the limitations described below.
|
||||
|
||||
`Recovery8001` contains one TAKE OUT stage. It is valid only after read-only
|
||||
inspection proves the interrupted `ThirtyRoutes` run stopped in the exact known,
|
||||
@@ -188,18 +188,39 @@ preserved directories:
|
||||
- `MBNWEB-20260722-LATEST-PAGED-04`: latest combined `PagedBoundary` 24/24,
|
||||
including 5077 page 1/20,
|
||||
all 19 Page NEXT inputs through 20/20, playlist NEXT to 5088 page 1/20, and
|
||||
final TAKE OUT/UNLOAD/IDLE.
|
||||
final TAKE OUT/UNLOAD/IDLE;
|
||||
- `MBNWEB-20260722-S6001-04`: `S6001AssetIndependent` 18/18. One physical build
|
||||
created the Dubai, WTI, Brent, and Gold rows; each row completed activate,
|
||||
TAKE IN, settled PROGRAM observation, and TAKE OUT exactly once. The final state
|
||||
is IDLE with no retry, timeout, `OutcomeUnknown`, probe block, or violation.
|
||||
|
||||
The older `CORE5001-05` and `PAGED-01` directories remain historical evidence but
|
||||
are not the latest combined-code approval. The split thirty-route evidence verifies
|
||||
all 30 entries in that workflow, and `LATEST-CORE-01` verifies the additional
|
||||
`5001`/`5074` pair, yielding 32 of 34 active runtime routes with actual PGM evidence.
|
||||
Network request/success counts match and
|
||||
`FAILURE`, `ERROR`, safety-probe `blocked`, `violation`, and `OutcomeUnknown` are
|
||||
all zero; no command was retried. `LATEST-PAGED-04` independently fixes the current
|
||||
PageN/long-run boundary. `s5006` remains blocked by its cube video. In `s6001`, the
|
||||
13 country-video actions remain asset-blocked, while the four image-only actions
|
||||
remain actual-PGM pending rather than asset-blocked.
|
||||
all 30 entries in that workflow, `LATEST-CORE-01` verifies the additional
|
||||
`5001`/`5074` pair, and `S6001-04` verifies the approved image-only scope of route
|
||||
code `6001`. This yields 33 of 34 active runtime route codes with actual PGM evidence
|
||||
within the stated action scope. `LATEST-PAGED-04` independently fixes the current
|
||||
PageN/long-run boundary. `s5006` remains blocked by its cube video, and the 13
|
||||
`s6001` country-video actions remain asset-blocked.
|
||||
|
||||
The Core, thirty-route, and Paged accepted runs have matching Network
|
||||
request/success counts and zero `FAILURE`, `ERROR`, probe block, violation,
|
||||
`OutcomeUnknown`, or retry. `S6001-04` has matching required LOAD 4, PREPARE 8,
|
||||
PLAY 8, and UNLOAD 4 successes. Its 24 `FAILURE` lines are exactly eight each for
|
||||
`VALUE_SET wonText`, `FACE_COLOR wonText`, and `VALUE_SET pattern`; the 120 `ERROR`
|
||||
lines are the associated engine cause text rather than 120 distinct failures. The
|
||||
authoritative `6001.t2s` lacks those helper objects, while the original `s6001.cs`
|
||||
attempts the same calls and swallows their exceptions. Required movie, unit, title,
|
||||
quote, direction-color, PREPARE, and PLAY operations succeed and the four PGM
|
||||
captures are correct. Keep this inherited template limitation explicit rather than
|
||||
claiming an error-free `s6001` Network log.
|
||||
|
||||
The diagnostic `S6001-01`, `S6001-02`, and `S6001-03` evidence remains preserved
|
||||
and is not combined with the accepted count. The first exposed a hidden catalog
|
||||
workspace, the second refused initialization while the exact PGM window was
|
||||
minimized, and the third exposed a missing fixed-action probe allowlist entry. None
|
||||
is an accepted partial completion. Only `S6001-04` supplies the complete 18/18
|
||||
baseline.
|
||||
|
||||
The suspected approximately 65-second 5077 Page NEXT transition was an observation
|
||||
artifact, not a runtime defect. Each of the 19 Page NEXT stages emitted exactly one
|
||||
|
||||
@@ -354,7 +354,7 @@ CLI용 Test JSON은 위처럼 앱 기본 경로인 `playout.local.json`과 다
|
||||
3. 잘못된 설정 또는 엔진 부재가 앱 종료가 아니라 연결 상태와 안전한 오류 메시지로 표시됩니다.
|
||||
4. x64 MSIX를 설치해도 같은 dry-run 흐름이 동작합니다.
|
||||
|
||||
2026-07-18 현재 unsigned 개발 MSIX에서 실제 Oracle/MariaDB를 사용하는 전체 UI/DB 검증을 완료했습니다. 이어 지정 개발 Tornado2/PGM에서 `5001 → 5074 Page NEXT → TAKE OUT`을 재검증하고 자산 비의존 30개 route를 순차 검증했습니다. 실제 PGM 완료 범위는 32/34 route이며, 미검증은 원본 Cuts에도 영상이 없는 `s5006`과 `s6001`뿐입니다. `5077`은 fresh DB 120건을 6행씩 1/20부터 20/20까지 이동했고 마지막 페이지에서 `5088` 12행 1/20으로 전환했습니다. 이전 scene unload와 최종 TAKE OUT/UNLOAD/IDLE, `FAILURE=0`, `ERROR=0`, retry 0, `OutcomeUnknown=false`를 확인했습니다.
|
||||
2026-07-22 현재 최신 등록 개발 AppX에서 실제 Oracle/MariaDB를 사용하는 전체 UI/DB 검증을 완료했습니다. 실제 Windows 입력 1,838건과 설정·비교 가져오기 로컬 상태가 모두 통과했고 DB write 회차의 cleanup도 확인했습니다. 이어 지정 개발 Tornado2/PGM에서 `5001 → 5074 Page NEXT → TAKE OUT`, 자산 비의존 30개 route와 `s6001` 영상 비의존 두바이유·WTI·브렌트유·금 4 action을 순차 검증했습니다. 실제 PGM 완료 범위는 33/34 runtime route code이며, route code 미검증은 원본 Cuts에도 큐브 배경이 없는 `s5006`뿐입니다. `s6001` 국가 영상 13 action은 외부자산 대기 상태입니다. `5077`은 fresh DB 120건을 6행씩 1/20부터 20/20까지 이동했고 마지막 페이지에서 `5088` 12행 1/20으로 전환했습니다. 각 승인 회차의 이전 scene unload와 최종 TAKE OUT/UNLOAD/IDLE, retry 0, `OutcomeUnknown=false`를 확인했습니다. 기존 32 route 회차의 `FAILURE`/`ERROR`는 0이며, s6001은 필수 송출 명령이 모두 성공했지만 원본도 무시하는 보조 `wonText`/`pattern` 오브젝트 누락 로그가 남는 제한을 별도 증거에 기록했습니다.
|
||||
|
||||
WebView 상태 wire는 `Disconnected`, `Connecting`, `Connected`, `Reconnecting`, `Faulted`, `OutcomeUnknown` 등 native connection state를 별도로 전달합니다. Web catalog는 35개 builder와 도달 가능한 45개 alias, row별 `enabled`를 보존하고 PREPARE 성공 뒤 playlist snapshot을 freeze합니다. pending command, `OutcomeUnknown`과 timeout quarantine 중에도 snapshot 편집 잠금을 유지합니다. native status의 current entry/builder/page size/current rows/last-page와 bounded preview가 authoritative 값이며 asset path는 preview에서 숨깁니다. refresh active/next/last-success/fault도 전달하고 refresh fault는 TAKE OUT 외 mutation 명령을 막습니다. 성공한 TAKE OUT 뒤에는 전용 refresh error marker만 reset하며 다른 unknown latch를 지우지 않습니다. `OutcomeUnknown`과 timeout은 `retryable: false`이며 오류 창을 닫아도 native 잠금은 유지됩니다. 브라우저 응답 제한 시간은 검증된 native operation timeout에 5초 전달 여유를 더해 사용하며, 상관 응답이 오지 않으면 strict `ParseTimeoutQuarantine` 요청을 native에 보냅니다. MainWindow는 await 전에 process-lifetime latch를 세우고 vendor session을 quarantine하므로 WebView reload로도 해제되지 않습니다. 명령 진행 중 trusted navigation, reload 또는 WebView2 process failure로 JavaScript 상관관계가 사라지는 경우도 같은 native latch를 먼저 세웁니다. 늦은 응답이나 UI 재시도로 같은 명령을 다시 보내지 않으며 native 명령이 끝나면 authoritative status를 다시 게시합니다. NEXT는 원본의 `m_TakeIn` 조건처럼 on-air 장면이 있을 때만 native와 Web 양쪽에서 허용됩니다. Test on-air 배지는 실제 PROGRAM과 구분해 `TEST ON AIR`로 표시합니다.
|
||||
|
||||
@@ -367,8 +367,8 @@ On-air 표식이 남은 상태에서는 프로세스 감시, 연결 해제, 앱
|
||||
- ThemeA 기존 편집은 활성 종목 preview가 아니라 raw `SB_ITEM` 전체를 읽어 비활성 종목, 교차 prefix와 동일 순번 중복을 보존한다. 이 완화는 편집용 raw 행에만 적용되며 송출용 active preview와 신규 테마 시장 prefix 검증에는 적용하지 않는다.
|
||||
- 개발 MSIX에서 PList create/save→fresh readback→delete/absence, ThemeA KRX/NXT와 EList create/edit/save→fresh readback→delete/absence를 실제 입력으로 검증하고 cleanup했다. 운영 DB에 대한 포괄적 쓰기 허가는 이 결과에 포함하지 않는다.
|
||||
- 원본 `종목비교.dat`는 signed package에서 8쌍 one-time import와 재시작 marker를 확인했다. FSell/VI는 격리 fixture의 marker-last와 production opened-handle read를 통과했지만, 현재 운영 profile의 기존 동일 파일을 덮어쓰거나 marker를 새로 만들지 않았다.
|
||||
- `s5006`의 `Video\큐브배경.vrv`와 `s6001` 해외지수 국가 영상 13개는 현재 승인 Cuts에 없으며, alias-only `Missing=0`은 asset-ready 증거가 아니다.
|
||||
- 개발 PGM 32/34 route가 검증됐고, `s5006`/`s6001`은 외부자산 제공 전까지 fail closed한다. 아래 Round H 기록은 현재 결과가 아니라 역사적 증거로 보존한다.
|
||||
- `s5006`의 `Video\큐브배경.vrv`와 `s6001` 해외지수 국가 영상 13개는 현재 승인 Cuts에 없으며, alias-only `Missing=0`은 asset-ready 증거가 아니다. 관련 action만 fail closed한다.
|
||||
- 개발 PGM 33/34 runtime route code가 검증됐다. route code 미검증은 `s5006`이고, `s6001`은 영상 비의존 4 action을 완료했으며 국가 영상 action만 외부자산 제공 전까지 제한한다. 아래 Round H 기록은 현재 결과가 아니라 역사적 증거로 보존한다.
|
||||
|
||||
### 역사적 Round 기록
|
||||
|
||||
|
||||
@@ -15,14 +15,14 @@
|
||||
| 항목 | 상태 |
|
||||
|---|---|
|
||||
| 기본 모드 | `DryRun`; COM 객체와 `KTAPConnect`를 만들지 않음 |
|
||||
| 자동 테스트 | 최신 .NET solution 2,817/2,817, LegacyWeb 117/117, JavaScript 502/502 통과; 실패·skip 0건. Release 빌드 warning 0, error 0 |
|
||||
| 개발 MSIX UI/DB | 실제 Windows 입력으로 UC1~UC7, GraphE, FSell, VIList, ThemeA, EList, PList 모달과 개발 DB 저장→fresh readback→delete/absence를 검증하고 cleanup 완료 |
|
||||
| 자동 테스트 | 최신 Release x64 .NET solution 3,182/3,182, LegacyParityWeb 150/150, WebPlayout JavaScript 424/424, 원본 scene 기준선 35/35와 staged PGM 정적 계약 통과; 실패·skip 0건 |
|
||||
| 개발 MSIX UI/DB | 최신 등록 AppX에서 실제 Windows 입력 1,838건으로 UC1~UC7, GraphE, FSell, VIList, ThemeA, EList, PList 모달, 설정·비교 가져오기와 개발 DB 저장→fresh readback→delete/absence를 검증하고 cleanup 완료 |
|
||||
| 고객 배포 MSIX | 현재 범위에서 보류. 고객용 version·Publisher·서명 인증서·업데이트와 새 PC 로컬 설정 배포는 사용자가 재개할 때 결정 |
|
||||
| 실제 DB read→DTO→mutation smoke | 34개 도달 가능 data route 통과: 33개 DB + `s5025` trusted 외부 CP949 파일. `s8086` diagnostic과 NXT restore audit를 포함한 Oracle/MariaDB query 58건 통과. 종속 asset·운영 DB-W·PGM 검증은 포함하지 않음 |
|
||||
| `s5025` trusted 수동 파일 | 외부 CP949 source 통합 검증 통과; 실제 파일/환경은 계속 Git 밖에서 회차별 preflight |
|
||||
| `s5006` `Video\큐브배경.vrv` | 현재 승인 Cuts root에서 누락 |
|
||||
| `s6001` 해외지수 영상 | 국가별 `Video\20201008_<국가>.vrv` 13개가 현재 승인 Cuts root에서 누락; 외부자산 필요 |
|
||||
| 이번 마이그레이션 WebView workflow의 실제 Tornado2 검증 | **32/34 runtime route 완료. 5001/5074 재검증, 자산 비의존 30개 route, 5077 20페이지 전체, 5088 전환, retired/final unload 완료. 미검증은 외부자산이 없는 s5006/s6001뿐** |
|
||||
| `s6001` 해외지수 영상 | 국가별 `Video\20201008_<국가>.vrv` 13개가 현재 승인 Cuts root에서 누락해 해당 action만 제한. 영상 비의존 두바이유·WTI·브렌트유·금 4 action은 실제 PGM 완료 |
|
||||
| 이번 마이그레이션 WebView workflow의 실제 Tornado2 검증 | **33/34 runtime route code 완료. 5001/5074, 자산 비의존 30개 route, 5077 20페이지 전체, 5088 전환, s6001 영상 비의존 4 action, retired/final unload 완료. route code 미검증은 s5006뿐이며 s6001 국가 영상 action은 외부자산 대기** |
|
||||
|
||||
1.0.2 Visual Studio 개발 등록본을 signed 1.0.3으로 교체할 때 `Remove-AppxPackage -PreserveApplicationData`를 사용했다. 재등록 구간에서 바뀐 파일은 Windows package Settings transaction log `settings.dat.LOG1/LOG2`뿐이었고, WebView LocalState와 외부 `%LOCALAPPDATA%\MBN_STOCK_WEBVIEW` 운영 데이터는 삭제·덮어쓰지 않았다. 이 패키지 검증 회차는 기본 설정 부재와 환경 override 0건을 확인한 `DryRun`으로만 실행했으며 Tornado 실제 명령은 보내지 않았다.
|
||||
|
||||
@@ -167,20 +167,20 @@ SHA-256 `7A1141C5F276729E340227CEEAA48B0E6018632BBA51F43AA94636084AA3C301`이며
|
||||
## 화면/계약과 운영 검증의 분리
|
||||
|
||||
- 화면·native bridge·DTO·mutation·identity 상관 계약이 존재하고 자동 테스트가 통과한 상태를 화면/계약 구현으로 기록한다.
|
||||
- PList의 기존 한국어 `DC_TITLE`/`LIST_TEXT` 2,213행은 read-only 무손상 대조를 마쳤고 통합 `selectionMapped=1,603`/차단 610이다. 이는 scene/asset/PREPARE/PGM 완료가 아니며 manual named 운영 write→reload는 미검증이다.
|
||||
- ThemeA/EList의 expected identity 계약은 구현됐지만 실제 운영 DB에서 KRX/NXT·동명이름·코드 경계와 정확한 selected-row replace/delete를 확인하지 않았다.
|
||||
- PList의 기존 한국어 `DC_TITLE`/`LIST_TEXT` 2,213행은 모두 목록과 scene alias로 로드된다. 최신 fresh typed selection은 1,617행, 식별정보 부족 보류는 596행이며, PList와 PROGRAM named playlist의 개발 DB create/save→fresh readback→delete/absence를 최신 AppX 실제 입력으로 확인했다. 이는 보류 행의 asset/PREPARE/PGM 완료나 운영 DB 포괄 쓰기 허가를 뜻하지 않는다.
|
||||
- ThemeA/EList는 최신 `catalog` 299입력 회차에서 KRX/NXT·동명이름·코드 경계, selected-row 편집·저장·fresh readback·삭제·absence와 cleanup을 개발 DB에서 확인했다.
|
||||
- 원본 `종목비교.dat` 8쌍은 signed package에서 one-time 실행·재시작 영속성을 확인했다. FSell/VI는 격리 import fixture와 현재 운영 파일 read-only 불변 검증을 마쳤지만 기존 운영 파일은 덮어쓰지 않았다.
|
||||
- GraphE·PList/AList·ThemeA·EList의 실제 운영 DB-W와 승인된 `5001`/`5074` 밖의 PGM은 미검증이다. 이 작업은 승인된 테스트 데이터·rollback과 장면별 별도 회차가 있어야 한다.
|
||||
- GraphE·PList/AList·ThemeA·EList의 개발 DB CRUD는 승인된 임시 식별자로 완료했다. 실제 PGM은 승인된 action 범위에서 33/34 runtime route code를 검증했고 route code 미검증은 `s5006`뿐이다. `s6001`은 영상 비의존 4 action을 완료했으며 국가 영상 action은 외부자산 대기다. 운영 DB 포괄 write와 고객 환경은 별도 범위다.
|
||||
|
||||
## 절대 안전 규칙
|
||||
|
||||
1. 앱의 기본값은 항상 `DryRun`으로 유지한다.
|
||||
2. `DryRun`, `--probe`, `--dry-run`, `--test-plan`은 `KTAPConnect`를 호출하지 않는다. 이때 Tornado2 Network Monitoring에 기록이 없는 것이 정상이다.
|
||||
3. 실제 출력은 승인된 테스트 scene, 지정된 PGM, 지정된 회차에서만 허용한다.
|
||||
4. Connect/PREPARE를 시작하기 전에 회차 범위 승인이 있어야 한다. **현재 PGM에 TAKE IN을 보내기 직전에는 같은 회차의 별도 명시적 승인을 다시 받아야 한다.**
|
||||
5. 승인에 없는 NEXT, Page NEXT, TAKE OUT 이외 명령 또는 다른 scene으로 범위를 넓히지 않는다.
|
||||
3. 실제 출력은 허용된 테스트 scene, 지정된 PGM, 지정된 회차 범위에서만 수행한다.
|
||||
4. 운영·방송 또는 비지정 환경은 아래 Gate A/B의 회차별 승인을 적용한다. 현재 지정 개발 PC는 [개발 환경 상시 권한](DEVELOPMENT_ENVIRONMENT_AUTHORIZATION.md)의 범위·대상 확인·기술적 중단 조건을 적용하며 별도 대화 승인을 반복하지 않는다.
|
||||
5. 회차 범위에 없는 NEXT, Page NEXT, TAKE OUT 이외 명령 또는 다른 scene으로 범위를 넓히지 않는다.
|
||||
6. timeout, `OutcomeUnknown`, `WEB_TIMEOUT`, refresh fault, 응답/화면 불일치, 대상 프로세스 변경, callback 누락 상태에서는 같은 명령을 자동 또는 수동으로 반복하지 않는다.
|
||||
7. 실제 검증 회차에는 `reconnectEnabled=false`, `maximumReconnectAttempts=0`을 사용한다. 재접속은 새 회차와 새 승인으로만 수행한다.
|
||||
7. 실제 검증 회차에는 `reconnectEnabled=false`, `maximumReconnectAttempts=0`을 사용한다. 재접속은 기존 회차를 재사용하지 않고 대상과 상태를 다시 확인한 새 회차로만 수행한다.
|
||||
8. 안전 게이트, x64 vendor hash pin, scene allowlist, process/window/port ownership 검사를 완화하지 않는다.
|
||||
9. Web 입력으로 object 이름, 파일 경로, K3D method, 임의 SQL을 받지 않는다.
|
||||
10. 실제 on-air일 수 있는 scene을 수동으로 unload하거나 COM RCW를 강제 release하지 않는다.
|
||||
@@ -192,7 +192,7 @@ SHA-256 `7A1141C5F276729E340227CEEAA48B0E6018632BBA51F43AA94636084AA3C301`이며
|
||||
|
||||
- 원본 test Cuts root: `C:\Users\MD\source\repos\MBN_STOCK_N\MBN_STOCK_N\bin\Debug\Cuts`
|
||||
- 실제 `.t2s`, image, texture, video와 기타 scene 자산
|
||||
- `s5006`의 상대 자산 `Video\큐브배경.vrv`와 `s6001` 해외지수의 국가별 영상 13개; 현재 위 Cuts root에는 없으므로 제공 전 해당 장면의 실제 PREPARE 금지
|
||||
- `s5006`의 상대 자산 `Video\큐브배경.vrv`와 `s6001` 해외지수의 국가별 영상 13개; 현재 위 Cuts root에는 없으므로 제공 전 해당 자산 의존 action의 실제 PREPARE 금지
|
||||
- 정상 앱의 FSell/VI private 저장소 `%LOCALAPPDATA%\MBN_STOCK_WEBVIEW\OperatorData`. 원본 `Data`를 strict CP949·hash·durable intent로 검증해 이 위치로 이전하는 one-time importer는 구현했지만, 현재 운영 profile의 기존 파일을 덮어쓰거나 marker를 임의 생성하지 않음
|
||||
- Oracle/MariaDB host, SID/service, database, user, password와 운영 query selector
|
||||
- K3D/Tornado vendor DLL, Interop, license와 설치 경로
|
||||
@@ -201,9 +201,13 @@ SHA-256 `7A1141C5F276729E340227CEEAA48B0E6018632BBA51F43AA94636084AA3C301`이며
|
||||
- 실제 Tornado host/port, output channel, PGM 창 정보와 운영 설정
|
||||
- Network Monitoring/PGM screenshot·영상·manifest 등 실제 방송 증거
|
||||
|
||||
Cuts root는 이번 작업에서 읽기 전용으로 취급한다. 현재 작업 트리의 [`Test-LegacyCutCoverage.ps1`](../scripts/Test-LegacyCutCoverage.ps1) 보강은 기존 45개 active alias 결과와 [`LegacyCutRequirements.json`](../scripts/LegacyCutRequirements.json)의 builder 소유 image·texture·video 23개를 함께 검사하는 단계다. 절대 경로, root 탈출, 누락·빈 파일과 root부터 파일까지의 reparse point를 실패로 보고하도록 구성했지만 최종 전체 회귀·패키지 반영 전에는 `적용 중`으로 판정한다. 현재 승인 Cuts에서는 `s6001`의 서로 다른 국가 영상 13개와 `s5006`의 `Video\큐브배경.vrv`가 `Missing`으로 명시되어야 정상이며, 누락 상태에서는 해당 장면의 PREPARE로 진행하지 않는다.
|
||||
Cuts root는 이번 작업에서 읽기 전용으로 취급한다. [`Test-LegacyCutCoverage.ps1`](../scripts/Test-LegacyCutCoverage.ps1)은 기존 45개 active alias와 [`LegacyCutRequirements.json`](../scripts/LegacyCutRequirements.json)의 builder 소유 image·texture·video를 함께 검사하며 전체 회귀와 최신 패키지에 반영됐다. 절대 경로, root 탈출, 누락·빈 파일과 root부터 파일까지의 reparse point를 실패로 보고한다. 현재 승인 Cuts에서는 `s6001`의 서로 다른 국가 영상 13개와 `s5006`의 `Video\큐브배경.vrv`만 optional `Missing`으로 명시되는 것이 정상이며, 누락 상태에서는 해당 자산 의존 action의 PREPARE로 진행하지 않는다.
|
||||
|
||||
## 승인 게이트
|
||||
## 운영·비지정 환경 승인 게이트
|
||||
|
||||
아래 Gate A/B는 운영·방송 대상 또는 현재 지정 개발 PC가 아닌 환경에 적용한다. 지정 개발
|
||||
Tornado2/PGM의 마이그레이션·동등성 검증은 [개발 환경 상시 권한](DEVELOPMENT_ENVIRONMENT_AUTHORIZATION.md)을
|
||||
사용해 회차 범위와 대상 식별을 증거에 고정하되, 사용자에게 동일 범위의 대화 승인을 다시 요구하지 않는다.
|
||||
|
||||
### Gate A: 회차 범위 승인
|
||||
|
||||
|
||||
@@ -16,15 +16,16 @@
|
||||
| 원본 inventory와 hash 기준선 | 완료 | 35/35 builder, 원본 기준선 스크립트 35/35 |
|
||||
| DTO와 mutation builder | 완료 | registry가 정확히 35개 builder를 발견하고 catalog와 1:1 대조 |
|
||||
| loader와 runtime route | 완료 | MainForm 도달 가능 builder 34개, active alias 45개를 fail-closed route로 등록; `s8086`은 원본과 같이 무alias 진단 전용 |
|
||||
| 자동 테스트 | 완료, 최종 합계 갱신 대기 | 마지막 전체 .NET solution 3,115/3,115, 별도 LegacyParityWeb 127/127, WebPlayout JavaScript 424/424 통과. 그 뒤 즉시 선택·PROGRAM enabled·빈 검색·설정·비교 import 및 s6001 staged workflow의 focused/static 검증도 통과했으며, 전체 solution 최종 합계는 재실행 뒤 갱신 |
|
||||
| 개발 MSIX UI/DB | **직전 패키지 PASS · 최신 코드 물리 재검증 대기** | 직전 등록 AppX에서 실제 Windows 입력으로 UC1~UC7, GraphE, FSell, VIList, ThemeA, EList, PList 모달, 검색·키보드·drag와 개발 DB 저장→fresh readback→delete/absence를 검증하고 cleanup 완료. 이후 교정 사항과 설정/비교 local-state를 포함한 최신 AppX 회차는 실행 전 |
|
||||
| 자동 테스트 | 완료 | Release x64 전체 .NET solution 3,182/3,182, 별도 LegacyParityWeb 150/150, WebPlayout JavaScript 424/424, 원본 scene 기준선 35/35와 staged PGM 정적 계약이 모두 실패 0으로 통과 |
|
||||
| 개발 MSIX UI/DB | **최신 패키지 실측 PASS** | 최신 등록 AppX에서 실제 Windows 입력으로 read-only 84, DryRun 108, PList 106, PROGRAM 재생목록 65, GraphE 501, ThemeA/EList catalog 299, UC1~UC7·FSell·VIList screens 675, 합계 1,838입력을 검증했다. DB create/save→fresh readback→delete/absence, cleanup, 설정 폴더 picker 취소와 비교쌍 1+8 병합/재실행 추가 0도 PASS이며 warning·blocked·state violation은 0이다. |
|
||||
| 고객 배포 MSIX | 현재 범위에서 보류 | 현재 결과는 unsigned 개발 패키지. 고객용 version·Publisher·서명 인증서·업데이트와 새 PC 로컬 설정 배포는 사용자가 재개할 때 결정 |
|
||||
| 실제 DB read→DTO→mutation smoke | 완료 | 34개 도달 가능 builder의 data route 통과: 33개 Oracle/MariaDB loader와 `s5025` trusted 외부 CP949 파일. 무alias `s8086` diagnostic과 NXT restore audit를 포함한 실제 Oracle/MariaDB query 58건이 성공했다. 종속 asset 또는 PGM 준비 상태는 이 행의 범위가 아니다. |
|
||||
| 종속 asset preflight | **필수 통과 · optional 외부자산 14개 제한** | 설정 Cuts root는 active `.t2s` alias 45개와 필수 built-in asset 9개를 모두 요구한다. `s5006`의 `Video\큐브배경.vrv`와 `s6001` 국가 영상 13개만 optional missing으로 수용하며 관련 action만 fail closed한다. 빈 파일·root 탈출·reparse·중간 junction 검사는 유지한다. |
|
||||
| 이번 마이그레이션의 실제 Tornado2/PGM | **32/34 runtime route 최신 실측 · s6001 4-action 대기** | 최신 `LATEST-CORE-01` 6/6, `THIRTY-02`+`RECOVERY8001-01`+`THIRTY20-29-01`의 30 route 30/30, 최신 `LATEST-PAGED-04` 24/24를 실제 PGM에서 확인했다. 5077 6행 1/20→20/20, 5088 12행 1/20 전환, 이전 scene unload와 최종 TAKE OUT/IDLE도 포함한다. `s6001` 영상 비의존 4 action/18-stage workflow는 구현·static PASS이나 실제 PGM은 실행 전이다. |
|
||||
| 이번 마이그레이션의 실제 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은 계속 자산 차단이다. 각 완료 회차의 최종 TAKE OUT/UNLOAD/IDLE, retry 0, `OutcomeUnknown=false`를 확인했다. |
|
||||
|
||||
2026-07-11 Round H, `CORE5001-05`, `PAGED-01`과 기존 중단 회차는 역사적 증거로
|
||||
보존한다. 현재 32개 route 및 PageN 판정의 기준선은 다음 2026-07-22 staged evidence다.
|
||||
보존한다. 현재 33개 runtime route code의 승인된 action 범위와 PageN 판정 기준선은 다음
|
||||
2026-07-22 staged evidence다.
|
||||
|
||||
- `MBNWEB-20260722-LATEST-CORE-01`: 6/6. 5001 TAKE IN → 5074 playlist NEXT →
|
||||
5074 Page NEXT 2/2 → TAKE OUT/IDLE을 확인했다.
|
||||
@@ -39,17 +40,26 @@
|
||||
- `MBNWEB-20260722-LATEST-PAGED-04`: 24/24. 5077 page 1/20에서 19회 Page NEXT로
|
||||
20/20까지 전환하고, playlist NEXT로 5088 page 1/20을 출력한 뒤
|
||||
TAKE OUT/UNLOAD/IDLE을 확인했다.
|
||||
- `MBNWEB-20260722-S6001-04`: 18/18. 물리 double-click으로 영상 비의존 4행을 만든 뒤
|
||||
두바이유·WTI·브렌트유·금마다 activate → TAKE IN → settled PROGRAM → TAKE OUT을
|
||||
한 번씩 수행하고 최종 IDLE을 확인했다.
|
||||
|
||||
자산 비의존 30개 route의 실제 PGM 결과는 모두 성공이며 Network Monitoring
|
||||
request/success가 일치한다. 완료 기준선의 `FAILURE`, `ERROR`, safety-probe
|
||||
`blocked`, `violation`, `OutcomeUnknown`은 모두 0이고 명령 retry도 0이다.
|
||||
|
||||
staged runner의 authoritative cut inventory는 기존 32개에 `6001`을 추가한 33개다.
|
||||
`s6001`의 두바이유·WTI·브렌트유·금 action은 필수 built-in
|
||||
`images\주유기merge.png`, `images\35752913_l.jpg`를 source/runtime hash로 고정하고
|
||||
물리 double-click으로 4행을 만든 뒤 action마다 activate→TAKE IN→read-only wait→TAKE OUT을
|
||||
한 번씩 수행하도록 구현했다. 전체 18 stage와 static audit는 통과했지만, 아직 실제 PGM 회차를
|
||||
실행하지 않았으므로 `TOR-22` 또는 route 완료로 표기하지 않는다.
|
||||
`S6001-04`는 필수 built-in `images\주유기merge.png`, `images\35752913_l.jpg`를
|
||||
source/runtime hash로 고정하고 18/18을 완료했다. 합산 LOAD 4, PREPARE 8, PLAY 8,
|
||||
UNLOAD 4가 성공했고 네 장면의 이미지·단위·제목·수치를 PGM capture로 확인했다.
|
||||
|
||||
`6001.t2s`에는 원본 코드가 호출하는 보조 오브젝트 `wonText`와 `pattern`이 없어 최초 송출과
|
||||
자동 갱신 8회에 `VALUE_SET wonText`, `FACE_COLOR wonText`, `VALUE_SET pattern`이 각각
|
||||
8회씩 실패했다. Network Monitoring의 24개 `FAILURE`와 이에 딸린 120개 원인 `ERROR` 줄은
|
||||
이 세 보조 호출뿐이다. 원본 `s6001.cs`도 같은 호출을 하고 빈 `catch`로 무시한다. 필수
|
||||
`movie`, `unit`, 제목·가격·등락 값과 방향 색, PREPARE/PLAY는 모두 성공했고 실제 화면도
|
||||
정상이며 safety-probe blocked/violation, retry, `OutcomeUnknown`은 0이다. 따라서 이 제한을
|
||||
명시한 영상 비의존 4 action 범위만 `TOR-22`로 판정한다.
|
||||
|
||||
5077 Page NEXT가 약 65초 동안 완성되지 않는다는 의심은 PGM 결함이 아니다.
|
||||
19회 Page NEXT는 각각 effect/`Prepare(10)`/`Play(10)`을 한 번씩만 수행했고,
|
||||
@@ -92,7 +102,7 @@ Mutation 약어는 실제 COM 메서드를 Web 입력에 노출하지 않는 COM
|
||||
|
||||
## 자동 테스트 묶음
|
||||
|
||||
아래 묶음은 마지막 전체 Core Debug/Release x64 실행에 포함돼 실패 0건으로 통과했다. 이후 변경의 focused 검증도 통과했으며 최종 전체 합계는 재실행 뒤 갱신한다. 모든 행에는 공통으로 `LegacySceneCatalogTests`, `LegacySceneMutationBuilderRegistryTests`, `LegacySceneRuntimeCoverageTests`, `LegacySceneDataSourceRouterTests`가 적용된다.
|
||||
아래 묶음은 최종 Release x64 전체 solution 3,182/3,182 실행에 포함돼 실패 0건으로 통과했다. 모든 행에는 공통으로 `LegacySceneCatalogTests`, `LegacySceneMutationBuilderRegistryTests`, `LegacySceneRuntimeCoverageTests`, `LegacySceneDataSourceRouterTests`가 적용된다.
|
||||
|
||||
| 코드 | 테스트 파일 |
|
||||
|---|---|
|
||||
@@ -138,7 +148,7 @@ Mutation 약어는 실제 COM 메서드를 Web 입력에 노출하지 않는 COM
|
||||
| `s50860` / `50860` / — | 국내·해외 지수/종목/업종 line 시계열과 path-shape | `S50860SceneMutationBuilder` → `S50860SceneDataLoader` → `ComparisonAndYieldLegacyRequestResolver` | `V, Vis, C, Pos, Shape` | `T-COMP` 통과 | `DB-P` | `TOR-22` |
|
||||
| `s5087` / `5087` / — | 두 국내 종목 candle·수익률 비교와 두 line shape | `S5087SceneMutationBuilder` → `S5087SceneDataLoader` → `ComparisonAndYieldLegacyRequestResolver` | `V, Vis, Pos, Shape` | `T-COMP` 통과 | `DB-P` | `TOR-22` |
|
||||
| `s5088` / `5088` / 12 | Oracle/MariaDB/DataManager 계열의 최대 12행 시세·수익률 목록 | `S5088SceneMutationBuilder` → `S5088SceneDataLoader` → typed paged 직접 route | `V, Vis, A` | `T-PAGED` 통과 | `DB-P` | `TOR-22` (5077 뒤 1/20) |
|
||||
| `s6001` / `6001` / — | 해외지수와 유가·금 단일 plate, 연계 이미지·영상/방향 상태 | `S6001SceneMutationBuilder` → `S6001SceneDataLoader` → closed target 직접 route | `V, A, Vis, C` | `T-PANEL` 통과 | `DB-P`; 유가·금 built-in 이미지 2개 통과, 해외지수 국가별 영상 13개 `ASSET-X` | 유가·금 4 action `TOR-PENDING`; 국가 영상 action `TOR-X` |
|
||||
| `s6001` / `6001` / — | 해외지수와 유가·금 단일 plate, 연계 이미지·영상/방향 상태 | `S6001SceneMutationBuilder` → `S6001SceneDataLoader` → closed target 직접 route | `V, A, Vis, C` | `T-PANEL` 통과 | `DB-P`; 유가·금 built-in 이미지 2개 통과, 해외지수 국가별 영상 13개 `ASSET-X` | 유가·금 4 action `TOR-22` (보조 `wonText`/`pattern` 누락 로그 제한); 국가 영상 action `TOR-X` |
|
||||
| `s6067` / `6067` / — | 기관 순매수 grid와 부호 색상 | `S6067SceneMutationBuilder` → `S6067SceneDataLoader` → `LegacyGridMarketSceneRequestResolver` | `V, C` | `T-GRID`, `T-FOUND` 통과 | `DB-P` | `TOR-22` |
|
||||
| `s8001` / `8001`, `8002` / — | 코스피·코스닥 업종 square chart와 cube 색상 | `S8001SceneMutationBuilder` → `S8001SceneDataLoader` → `LegacyParameterizedSceneRequestResolver` | `V, C` | `T-PARAM` 통과 | `DB-P` | `TOR-22` |
|
||||
| `s8003` / `8003` / — | 국내 종목 호가·시세와 매수·매도 잔량 막대 | `S8003SceneMutationBuilder` → `S8003SceneDataLoader` → `LegacyGridMarketSceneRequestResolver` | `V, Vis, C, Scale` | `T-GRID` 통과 | `DB-P` | `TOR-22` |
|
||||
@@ -205,16 +215,16 @@ TAKE IN은 PREPARE 때의 오래된 DTO를 그대로 재생하지 않는다. 원
|
||||
## 구현 판정과 실제 송출 범위
|
||||
|
||||
35개 builder, 45개 active alias, DTO/mutation, 실제 DB read, 5·6·12행 PageN 경계와
|
||||
마지막 페이지 자동 계약은 완료됐다. 직전 개발 MSIX UI/DB 검증도 PASS지만 이후 UI 교정을
|
||||
포함한 최신 AppX 물리 회차는 대기 중이다. 실제 PGM은 34개 runtime route 가운데 32개를
|
||||
검증했다. 최신 `5001`/`5074` 6/6과 자산 비의존 30개 route 30/30을 완료했고,
|
||||
최신 `5077` 20페이지 전체와 `5088` 전환 24/24, retired scene unload 및 최종
|
||||
TAKE OUT/IDLE을 포함한다.
|
||||
마지막 페이지 자동 계약은 완료됐다. 최신 개발 MSIX UI/DB·로컬 상태 물리 회차도 PASS다.
|
||||
실제 PGM은 34개 runtime route code 가운데 33개가 승인된 action 범위의 증거를 갖는다.
|
||||
최신 `5001`/`5074` 6/6, 자산 비의존 30개 route 30/30, `5077` 20페이지 전체와
|
||||
`5088` 전환 24/24, `s6001` 영상 비의존 4 action 18/18, retired scene unload와
|
||||
최종 TAKE OUT/IDLE을 포함한다.
|
||||
|
||||
이 완료 판정에는 다음 범위 제한이 있다.
|
||||
|
||||
1. 실제 PGM 미검증 route는 `s5006`과 `s6001`이다. 다만 `s6001`의 영상 비의존 4 action은
|
||||
외부자산 없이 검증 가능하며 18-stage workflow의 실제 실행만 남았다.
|
||||
1. 실제 PGM 미검증 runtime route code는 `s5006`이다. `s6001` route code의 실측 범위는
|
||||
영상 비의존 4 action뿐이며 국가 영상 13 action은 외부자산 부재로 `TOR-X`다.
|
||||
2. `s5025`의 trusted 외부 CP949 파일·경로는 Git과 고객 MSIX에 포함하지 않는다.
|
||||
3. `s5006`의 background video와 `s6001` 해외지수 국가 영상 13개는 승인된 asset root와
|
||||
preflight가 준비된 뒤에만 실제 송출한다.
|
||||
|
||||
Reference in New Issue
Block a user