# 구 프로그램 ↔ 신규 프로그램 송출 비교 (2026-07-19)

## 결론

외부 제작 자산에 의존하지 않는 30개 운영 route를 구 프로그램과 신규 프로그램에서 같은
저장 편성표 순서로 각각 실행했다. 두 프로그램 모두 실제 Windows 포인터 입력으로 행을 선택하고
TAKE IN/TAKE OUT을 수행했으며, Tornado2 Network Monitoring과 PGM 화면을 보존했다.

- 신규 프로그램: 30/30이 정확한 scene code로 PROGRAM에 진입하고 화면이 표시됐다.
- 신규 명령: LOAD 30/30, PREPARE 56/56, PLAY 56/56, UNLOAD 30/30,
  `FAILURE=0`, `ERROR=0`, `OutcomeUnknown=false`.
- 신규 UI 상태 증거: 120개(행 활성화·PROGRAM 조기 확인·갱신 완료·IDLE 복귀 각 30개).
- 신규 PGM 화면 증거: 30개. 최저 밝기 `50160`도 실제 농산물 2열판이며 검은 화면이 아니다.
  최고 밝기 `5032`는 흰 배경이 넓은 지수/선물 2열판의 정상 화면이다.
- 구 프로그램: 동일 30개 입력을 모두 시도했다. 현재 데이터와 저장 identity에서 PGM 오류 없이
  PROGRAM에 진입한 route는 11개, PGM 오류를 동반한 route는 4개, 데이터·매핑 단계에서 차단된
  route는 15개였다. 오류 없는 11개도 mutation을 대조하니 8개가 동등했고, 2개는 구 프로그램의
  기간 제목 복원 오류, 1개는 구 프로그램의 두 필드 갱신 누락이었다.

따라서 30개를 모두 **입력·결과 기준으로 비교**할 수는 있었지만, 30개 모두를 픽셀 대 픽셀로
비교할 수 있었던 것은 아니다. 구 프로그램이 이번 환경에서 깨끗한 PGM 화면을 만들지 못한
19개는 신규 화면만 실제 확인했으며, 이는 신규 프로그램의 실패가 아니라 구 프로그램 측의
현행 데이터 복원·PGM 오류 경계다.

## 장면별 결과

아래의 구 프로그램 결과는 이번 동일 저장 편성표 재생 회차에서 관찰한 결과다. 구 프로그램의
모든 과거 운영 가능성을 부정하는 판정으로 확대하지 않는다.

| 순번 | code | 장면 | 구 프로그램 관찰 | 신규 프로그램 |
|---:|---:|---|---|---|
| 1 | 5016 | 미국 지수 3열판 | 데이터 단계 차단 | PASS, 실제 PGM |
| 2 | 50160 | 농산물 2열판 | 데이터 단계 차단 | PASS, 실제 PGM |
| 3 | 5078 | 다우 미국업종 | 정상 PROGRAM | PASS, 실제 PGM |
| 4 | 8067 | 글로벌 증시 지도 | 정상 PROGRAM | PASS, 실제 PGM |
| 5 | 5086 | 원달러 5일 수익률 | PROGRAM, 저장 행 제목/기간 복원 차이 | PASS, canonical 제목·기간 PGM |
| 6 | 50860 | 원달러 5일 라인 | PROGRAM, 저장 행 제목/기간 복원 차이 | PASS, canonical 제목·기간 PGM |
| 7 | 5023 | 코스피 매매동향 표 | 저장 매핑 차단 | PASS, 실제 PGM |
| 8 | 5024 | 코스피 매매동향 막대 | 저장 매핑 차단 | PASS, 실제 PGM |
| 9 | 5077 | 시가총액 6종목 | 데이터 단계 차단 | PASS, 실제 PGM |
| 10 | 5082 | 주체별 매매동향 표 | 정상 PROGRAM | PASS, 실제 PGM |
| 11 | 5083 | 개인 매매동향 라인 | 데이터 단계 차단 | PASS, 실제 PGM |
| 12 | 5084 | 코스피 매매동향 라인 | 50860으로 잘못 매핑되어 실패 | PASS, 정확한 5084 PGM |
| 13 | 5085 | 프로그램 매매 표 | PROGRAM, 베이시스·선물 mutation 누락 | PASS, 6개 항목 fresh PGM |
| 14 | 5088 | 시가총액 12종목 | 데이터 단계 차단 | PASS, 실제 PGM |
| 15 | 6067 | 기관 순매수 표 | 정상 PROGRAM | PASS, 실제 PGM |
| 16 | 8035 | 일봉 캔들 | 데이터 단계 차단 | PASS, 실제 PGM |
| 17 | 5011 | 삼성전자 1열판 상세 | PROGRAM, PGM 오류 포함 | PASS, 실제 PGM |
| 18 | 8003 | 삼성전자 호가창 | PROGRAM, PGM 오류 포함 | PASS, 실제 PGM |
| 19 | 5037 | 삼성전자 거래원 | PROGRAM, PGM 오류 포함 | PASS, 실제 PGM |
| 20 | 8001 | 코스피 업종 네모그래프 | PROGRAM, PGM 오류 포함 | PASS, 실제 PGM |
| 21 | 5026 | 종목 비교 캔들 | 데이터 단계 차단 | PASS, 실제 PGM |
| 22 | 5087 | 종목 비교 라인 | 데이터 단계 차단 | PASS, 실제 PGM |
| 23 | 5029 | 종목 비교 5일 수익률 | 저장 매핑 차단 | PASS, 실제 PGM |
| 24 | 8032 | 코스닥 ↔ 코스피 지수 | 데이터 단계 차단 | PASS, 실제 PGM |
| 25 | 5032 | 선물 ↔ 코스피 지수 | 데이터 단계 차단 | PASS, 실제 PGM |
| 26 | 5076 | 주요매출 구성 | 정상 PROGRAM | PASS, 실제 PGM |
| 27 | 5079 | 성장성 지표 | 정상 PROGRAM | PASS, 실제 PGM |
| 28 | 5080 | 매출액 | 정상 PROGRAM | PASS, 실제 PGM |
| 29 | 5081 | 영업이익 | 정상 PROGRAM | PASS, 실제 PGM |
| 30 | 5025 | 개인 순매도 수동 목록 | 데이터 단계 차단 | PASS, 실제 PGM |

## 구 프로그램이 실제 송출한 11개의 mutation 대조

PGM 화면은 같은 scene이라도 캡처한 애니메이션 프레임에 따라 일부 행·막대가 덜 보일 수 있다.
따라서 화면 육안 비교와 함께 각 route의 첫 transaction mutation을 직접 대조했다.

- 순서와 값까지 동일: `5078`, `5082`, `6067`, `5076`, `5080`, `5081` (6개)
- 값·오브젝트 집합은 동일하고 설정 순서만 다름: `8067`, `5079` (2개)
- `5086`: 날짜·가격·기준가·수익률·그래프 23개 mutation은 같았다. 구 프로그램은 저장 행의
  `원달러_5일`을 그대로 제목에 넣어 `원달러_5일 수익률`, 빈 subtitle을 보냈다. 신규는 원본
  scene의 닫힌 5일 동작에 맞게 `원달러 수익률`, `1주일`을 보냈다.
- `50860`: 시세·등락·날짜·그래프 25개 mutation은 같았다. 구 프로그램은
  `원/달러_5일`, 빈 subtitle을 보냈고 신규는 `원/달러`, `1주일`을 보냈다.
- `5085`: 구 프로그램은 4개 데이터 항목에 해당하는 12개 mutation만 보냈고 `베이시스`와
  `선물`을 갱신하지 않았다. 그 결과 PGM에는 이전 scene 잔존값처럼 `57,800`이 두 칸에 보였다.
  신규는 `순매수`, `차익`, `비차익`, `베이시스`, `코스피200`, `선물` 6개 항목의 18개
  mutation을 보내 fresh DB 값으로 표시했다.

즉 신규 프로그램은 구 프로그램의 이번 실행 결과를 무조건 복제하지 않는다. 구 프로그램의
저장 행 인자 왜곡이나 갱신 누락은 원본 scene 계약과 현재 DB identity를 기준으로 교정한다.

## 이번 회차에서 교정한 내용

저장 편성표에는 화면에 보이는 제목·subtype만 남고 신규 내부 selection identity가 없는 행이
있었다. 신규 프로그램은 추측하지 않고 다음처럼 닫힌 규칙으로 복원하도록 교정했다.

- `5011`: 상세 분기(액면가 등)를 canonical detail selection으로 정규화
- `8001`: 업종 네모그래프를 canonical industry selection으로 정규화
- `5026`, `5087`, `5029`, `8032`, `5032`: 화면 제목과 저장된 정확한 DataCode identity로
  비교 대상·action을 복원
- `5076`, `5079`, `5080`, `5081`: 수동 재무 화면을 canonical internal selection으로 정규화

집중 회귀 53/53과 Debug x64 빌드가 통과했고, 교정 대상 11개를 먼저 재검증한 뒤 30개 전체를
다시 사용자 입력으로 실행했다. 최종 전체 회귀는 Debug/Release x64 각각 2,813/2,813,
Web Node 424/424이며 실패·skip은 0이다.

## 화면 판독과 제한

- 초기 자동 캡처 일부가 장면 자동 갱신 후 너무 늦게 찍혀 검은 PGM처럼 보였다. 이는 송출
  실패가 아니었다. PROGRAM 진입 직후 850 ms에 PGM을 캡처하도록 보정한 뒤 30개를 다시 실행했다.
- `5078`의 구/신규 mutation 값(제목, 분류, 막대 값)은 일치했다. 신규 화면도 같은 다우 업종
  그래픽을 표시했다.
- 공통 배경 자산을 사용하지 않는 현재 로컬 설정에서는 그래픽 주변이 검게 보일 수 있다.
  사용자가 외부 자산 없이 진행하도록 한 범위이며 scene 데이터 실패로 판정하지 않는다.
- `5025`는 현재 trusted 수동 파일에 두 종목만 있으므로 두 행만 채워지고 나머지는 빈 행이다.
  화면 형식과 송출 계약은 정상이다.
- 외부 자산이 실제로 없는 `s5006`, `s6001`은 이번 30개에 포함하지 않았고 계속 fail closed한다.

## 증거와 정리

- 구 프로그램: [`legacy-pgm`](../artifacts/side-by-side-playout-20260719/legacy-pgm)
- 신규 프로그램: [`new-pgm`](../artifacts/side-by-side-playout-20260719/new-pgm)
- 신규 실제 화면: `new-pgm/pgm-visual-new-v3-<순번>-<code>-result.png`
- 신규 사용자 입력 상태: `new-pgm/ui-new-v3-<순번>-<code>-*.json`

장시간 실행으로 Network Monitoring의 시작 anchor가 화면 버퍼에서 밀려났으므로 최종 단일
delta 파일을 30개 전체 집계 근거로 사용하지 않는다. 대신 시작점이 보존된 장면별 result/takeout
state JSON 60개를 합산했고, 위의 30/56/56/30 성공 수를 얻었다. 현재 남아 있는 Network
Monitoring 구간도 LOAD 16/16, PREPARE 29/29, PLAY 29/29, UNLOAD 17/17,
`FAILURE=0`, `ERROR=0`으로 일치한다.

검증용 편성표 `000_CODEX_AB_20260719_01`은 실제 UI에서 삭제했다. 삭제는
`committedFresh`, 정의 24→23이었고, 후속 read-only DB 감사에서 정의 23개·행 2,213개와
`REAL_DB_SMOKE: PASS`를 확인했다.
