# MBNWEB-20260712-M-R1 연결 정리 계획

Round M은 CONNECT 뒤 PREPARE 전에 증거 감시기 회귀로 중단됐고, 앱과 Tornado2의
TCP 연결만 남았다. 이 회차는 그 연결을 **프로그램의 정상 종료 경로로 한 번만
정리**하기 위한 별도 fail-closed 회차다. M-R1은 승인 후 정확히 한 번 실행됐고,
**정상 닫기 요청 뒤 중립 종료 대화상자를 탐지하는 단계에서 실패 폐쇄**됐다.
확인 버튼·DISCONNECT/BYE는 실행되지 않았으며 같은 회차는 재시도하지 않는다.

## 실행 결과

| 항목 | 값 |
|---|---|
| 승인 | 2,707 bytes, `0019696B9354885BB9157F689AAD537E62C9AEB8A8F50C49C1D0629E26CA9B6F` |
| 실행 marker | 4,912 bytes, `E188D8E540644B94DD105D8A10CBF5A614563190A8D0FED1099AFE1BACFBE496` |
| 닫기 요청 journal | 425 bytes, `767648452A11A7BDC8B272D4BB8F9E4DC8D629228938EA682B0C4D60A4C7DE23` |
| 결과 | 1,914 bytes, `6543B53F1D5D99B707FC2E04A1F09EA61E39714FE468FA7CF029C85A720851C9` |
| 상태 | `OUTCOME_UNKNOWN_CLOSE_REQUEST_MAY_HAVE_OCCURRED` |
| 정상 닫기 요청 / 종료 확인 | `1 / 0` |
| DISCONNECT/BYE 관측 | 확인 전 단계라 미발행·미관측 |
| 송출·DB·직접 CDP/K3D·재시도·강제 종료·창 복원 | 모두 `0` |

실제 WinUI Automation 트리에는 `프로그램 종료` 이름이 Popup 내부 dialog Window와
제목 Text에 각각 한 번씩 노출되고, 본문 Text와 `PrimaryButton` 종료 버튼은 각각
한 번씩 정확하게 존재했다. M-R1 도우미는 control type을 구분하지 않고 제목 이름의
전체 개수를 1개로 제한해 정상적인 두 요소를 모호한 중복으로 판정했다. 따라서
대화상자는 열린 채 보존됐고 앱 PID 37916과 기존 Tornado TCP도 유지됐다. 후속
확인은 현재 열린 대화상자의 control type·AutomationId·계층을 명시적으로 결박한
새 회차와 새 승인을 사용한다.

## 고정 산출물

| 항목 | 크기 | SHA-256 |
|---|---:|---|
| `round-plan.json` | 17,466 bytes | `E5D12936867203B83306D0B6D98AC8347DD7E5914CCAEB941528CD866569BC77` |
| `round-m-r1-close.ps1` | 61,839 bytes | `FE01F8720DE9331B1B45F7FE3B66E17CD13B26E628967D785C74F890EA12D835` |
| 운영/시험 계획 빌더(서로 byte-identical) | 21,942 bytes | `A1A44651A757C988658DA1D20495F0F84A9A5C16EB51885490B1FC1A70008013` |
| 승인 빌더 | 5,389 bytes | `C242AC302166D20E4EEECEF7922B54674326D5E4AE10B194F7E706435472A24D` |
| 정적 시험 | 12,459 bytes | `705853EDCD8352F19C373793F3A9AE146CECE18F89238DE43C601CC173B074B1` |
| 승인 문구 템플릿 | UTF-8 text | `50A162618AB602745F4030F583E8F21F2366518266B19956335707C655748420` |
| 이 계획에 채워진 전체 승인 문구 | UTF-8 text | `0BC9B11EC90DA030A86F0240C92DFDB5585C504B69727959BD408608691C83C1` |

운영 산출물은 Git 제외 경로
`artifacts/pgm-evidence/MBNWEB-20260712-M-R1`에 있다. 이전 후보 계획
`C3212E15...`와 `6B8BC3A8...`은 감사용으로 보존하지만 승인 또는 실행에 사용하지
않는다.

## 실행 전 고정 상태

| 경계 | 기대값 |
|---|---|
| Round M 결과 | 32,877 bytes, `019826B736B80A6C0DB696A5DF55DA68432D314B68EC79A4138E64DDB20870FC` |
| 앱 | PID 37916, 시작 `2026-07-12T18:59:06.3837959Z`, HWND 1128632, responsive |
| WebView2 CDP listener | PID 34988, 앱의 자식, `127.0.0.1:9339` |
| Tornado2 | PID 6972, 시작 `2026-07-11T11:18:54.9284515Z`, `0.0.0.0:30001` listener |
| PGM / Network HWND | 592052 / 79286 |
| 앱↔Tornado TCP | `127.0.0.1:23210 <-> 127.0.0.1:30001`, 생성 세대 고정 |
| Round M 이후 Network 증가분 | 266 chars, `3B4B7946CB345B121880CC1EF904E429A16A367F3AF6DD23FCFFDEF559EAAFF4` |
| 신규 명령 | `HELLO` 요청 1회와 성공 1회만 존재 |
| PGM | 8×8 표본 64개 RGB 최대값 0, 검은 화면 |
| 금지 파일 | Round M runtime/prepare journal/local live config/capability 6개 모두 없음 |

검증 모드는 위 상태를 읽기만 한다. 엄격한 UTF-8 JSON 파싱, Windows PowerShell 5
구문 검사, 정적 호출 수 검사, 승인 빌더 `ValidateOnly`, 종료 도우미
`ValidateOnly`가 모두 통과했다. 검증 전후 고정 산출물 해시는 동일했고 승인·실행·
may-have-issued 파일 6개는 생성되지 않았다. 정적 검사 결과는 정상 닫기 요청 호출
지점 1개, 중립 종료 확인 호출 지점 1개, 금지된 송출·직접 K3D/CDP·창 조작 호출
지점 0개다.

독립 감사 결과는 P0 0건, P1 0건이다. 비차단 P2 권고 1건은 원본 증거 파일을
해시한 뒤 다시 열어 파싱하는 사이의 매우 좁은 교체 경쟁이며, 이 회차에서는 원본
Round M 디렉터리를 immutable로 취급하고 모든 파일의 크기·해시를 다시 확인해
수용했다. 이 경로에는 승인 전후 어떤 작성기도 두지 않는다.

## 승인 후 허용되는 유일한 흐름

1. 계획, 원본 Round M 증거, 프로세스 세대, 창 identity, Tornado listener, TCP,
   Network 증가분, PGM 검은 화면과 금지 파일 부재를 모두 재검증한다.
2. 승인 파일이 계획 해시와 정확히 결박되고 900초 이내인지 확인한다.
3. 정상 닫기 요청의 `may-have-issued` 저널을 `WriteThrough`와 `Flush(true)`로 먼저
   기록한다. 그 뒤 전체 상태·계획·도우미·승인 freshness를 다시 확인하고 운영체제
   정상 닫기 요청을 정확히 한 번만 보낸다.
4. 제목 `프로그램 종료`, 본문 `프로그램을 종료하시겠습니까?`, 활성 기본 버튼
   `종료`인 중립 대화상자 하나만 허용한다. pending/prepared/송출 경고 문구 또는
   다른 대화상자면 확인하지 않고 중단한다.
5. 대화상자가 열린 상태에서 전체 경계를 다시 읽고 확인 요청의
   `may-have-issued` 저널을 내구성 있게 기록한다. 다시 전체 상태·계획·승인을
   확인한 다음 새 UI Automation element로 `종료`를 정확히 한 번만 누른다.
6. 앱과 CDP가 종료되고 앱 소유 active TCP가 사라지며 Tornado listener 세대가
   유지되는지 확인한다. Network 증가분은 `BYE` 요청 정확히 1회, 성공 0~1회만
   허용하고 PGM은 계속 검은 화면이어야 한다.

중간 상태가 하나라도 달라지거나 결과가 불명확하면 추가 명령 없이 즉시 중단한다.
재시도, 프로세스 강제 종료, PREPARE, TAKE IN, NEXT, Page NEXT, TAKE OUT,
DB write, 재연결, 재실행, 직접 CDP/K3D 명령과 Tornado2 창 복원은 이 회차에서
허용하지 않는다. PGM/Network 창 복원은 known-clean 연결 정리 결과를 결박한 별도
Gate W 계획과 별도 승인을 사용한다.

## 정확한 승인 문구

아래 한 줄을 그대로 승인해야 한다. 계획 해시가 다르면 승인 효력이 없다.

> 회차 MBNWEB-20260712-M-R1의 연결 정리 계획 SHA-256 E5D12936867203B83306D0B6D98AC8347DD7E5914CCAEB941528CD866569BC77을 승인한다. Round M 결과 SHA-256 019826B736B80A6C0DB696A5DF55DA68432D314B68EC79A4138E64DDB20870FC가 outcome-unknown 상태이며, 현재 PGM이 검은 화면이고 Round M 기준 신규 Network Monitoring 기록이 HELLO 요청과 성공 각 1회뿐임을 확인한다. 현재 K3D 라이선스가 유효하고 Tornado2 PID 6972가 지정된 주 프로그램임을 확인하며, 현재 실행 중인 MBN_STOCK_WEBVIEW PID 37916, 시작 시각 2026-07-12T18:59:06.3837959Z에 대해 운영체제 정상 닫기 요청 정확히 1회와, '프로그램 종료' 대화상자가 '프로그램을 종료하시겠습니까?'라는 중립 문구를 표시할 때에만 '종료' 확인 정확히 1회, 그 정상 종료 과정에서 발생하는 DISCONNECT/BYE 최대 1회만 승인한다. PREPARE, TAKE IN, NEXT, Page NEXT, TAKE OUT, DB write, 재연결, 재실행, 직접 CDP/K3D 명령, 프로세스 강제 종료, 재시도 및 Tornado2 창 복원은 승인하지 않는다. 사전 조건이 하나라도 달라지거나 결과가 불명확하면 추가 명령 없이 즉시 중단한다.
