Files
MBN_STOCK_WEBVIEW/docs/LIVE_CONFIRMATION_PLAN_MBNWEB-20260712-M-R2.md

98 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# MBNWEB-20260712-M-R2 기존 종료 대화상자 확인 계획
M-R1은 운영체제 정상 닫기 요청을 정확히 한 번 보낸 뒤, WinUI가 같은 제목을 dialog
Window와 제목 Text로 각각 노출하는 정상 구조를 중복 제목으로 오판해 실패 폐쇄됐다.
이 회차는 닫기 요청을 다시 보내지 않고 **이미 열린 정확한 중립 대화상자의
PrimaryButton만 한 번 확인**하기 위한 별도 confirm-only 회차다. 현재 상태는
계획·도우미 검증 완료, 승인 대기이며 UI 확인과 DISCONNECT/BYE는 실행하지 않았다.
## 고정 산출물
| 항목 | 크기 | SHA-256 |
|---|---:|---|
| `round-plan.json` | 37,950 bytes | `EEB5C9102D5A797EB459E79F29932E58E921F33C957842477FD9E0BF993E4EB4` |
| `round-m-r2-confirm.ps1` | 67,779 bytes | `DDEA4081FAECD68ADF7BA1E490FB380EE118115024AB98249FAC1CCC79F00084` |
| 운영/시험 계획 빌더(서로 byte-identical) | 33,459 bytes | `C73BEBFE52A3851F4F47DA82F1667B3412780B19A156E5225680EB956C2CE21A` |
| 승인 빌더 | 5,391 bytes | `6EDDCD19A4888447A30EABEF34B6100C31842C1986E00CF4804174A47D0647FC` |
| 정적 시험 | 9,957 bytes | `8947CEE9004C66A0239FFDCE56EA4EC12D4CA090ABAFB2DE1CAFD7793513E0C0` |
| 승인 문구 템플릿 | UTF-8 text | `11E5EEF315895C20C906ECED4DECB920CC70F04A7BF376010FDA833328210AD4` |
| 이 계획에 채워진 전체 승인 문구 | UTF-8 text | `2DA9CC53A73FC40A96269491A1E7FA29221EFFB0281BEB67B9D68A70707FDD57` |
운영 산출물은 Git 제외 경로
`artifacts/pgm-evidence/MBNWEB-20260712-M-R2`에 있다. 계획 JSON은 엄격한
UTF-8 파싱에 성공했고, Windows PowerShell 5 정적 검사와 승인 빌더·확인 도우미의
`ValidateOnly`가 모두 통과했다. 검증 전후 고정 파일 해시는 동일하고 M-R2
승인·실행·confirm dispatch·complete·result 파일 5개는 모두 없다.
감사 중 발견된 이전 계획 35,606 bytes,
`57225B876FEAD5784CE0D5F9DEF0A5885A802DEC14015AAC638E9120CB61E5AB`
승인 금지 superseded 증거로만 보존한다.
## M-R1과 현재 상태 결박
| 항목 | 기대값 |
|---|---|
| M-R1 계획 | 17,466 bytes, `E5D12936867203B83306D0B6D98AC8347DD7E5914CCAEB941528CD866569BC77` |
| M-R1 승인 | 2,707 bytes, `0019696B9354885BB9157F689AAD537E62C9AEB8A8F50C49C1D0629E26CA9B6F` |
| M-R1 실행 marker | 4,912 bytes, `E188D8E540644B94DD105D8A10CBF5A614563190A8D0FED1099AFE1BACFBE496` |
| M-R1 닫기 요청 journal | 425 bytes, `767648452A11A7BDC8B272D4BB8F9E4DC8D629228938EA682B0C4D60A4C7DE23` |
| M-R1 결과 | 1,914 bytes, `6543B53F1D5D99B707FC2E04A1F09EA61E39714FE468FA7CF029C85A720851C9` |
| M-R1 명령 | `CloseMainWindow=1`, `Invoke=0`, retry·송출·DB·직접 CDP/K3D=0 |
| 앱 / CDP | PID 37916 / 34988, 기존 시작 세대와 `127.0.0.1:9339` 유지 |
| Tornado2 | PID 6972, 기존 시작 세대와 `0.0.0.0:30001` listener 유지 |
| 앱↔Tornado TCP | `127.0.0.1:23210 <-> 127.0.0.1:30001` 정확히 두 행 |
| Network Monitoring | 142,844 chars, `839882172C79211517E4C3C81EBF95E65B322B6418B086985EE13E917A3F5A37` |
| Round M 이후 증가분 | HELLO 요청·성공 각 1회뿐, 266 chars, `3B4B7946CB345B121880CC1EF904E429A16A367F3AF6DD23FCFFDEF559EAAFF4` |
| M-R1 닫기 뒤 증가분 | 0 chars, BYE·송출 명령 0 |
| PGM | 8×8 표본 64개 RGB 최대값 0, 검은 화면 |
| 안전 부재 경로 | Round M runtime/prepare/config/capability 6개와 M-R1 confirm 파일 2개, 총 8개 |
## 정확한 UIA 구조
계획은 다음 9개 요소의 RuntimeId, PID, FrameworkId, ClassName, ControlType, Name,
AutomationId, Enabled, Offscreen, 경계 사각형과 부모·형제 관계를 모두 고정한다.
정규화된 구조의 SHA-256은
`39253843B55682066E786AA9217BA5420BC7ED97E9BBC0E38A822A36C5696E75`이다.
```text
DesktopChildSiteBridge Pane (Win32)
└─ InputSite Pane (XAML)
├─ generic Popup Window: Name=Popup
└─ dialog Window: Name=프로그램 종료
├─ ContentScrollViewer
│ ├─ Text: 프로그램 종료
│ └─ Text: 프로그램을 종료하시겠습니까?
├─ Button: 종료, AutomationId=PrimaryButton
└─ Button: 취소, AutomationId=CloseButton
```
dialog의 Button은 위 두 개, Text는 위 두 개만 허용한다. 앱 전체에서 `종료` 이름의
Button은 하나여야 하고, PrimaryButton은 활성·화면 표시·InvokePattern 지원 상태여야
한다. pending, prepared, outcome-unknown 또는 방송 경고 문자열이 나타나면 확인하지
않는다. InputSite의 전체 직접 자식 RuntimeId 집합은 정확히 9개, 그중 Window
부분집합은 generic Popup과 dialog Window 2개로 고정한다.
## 승인 후 허용되는 유일한 흐름
1. 계획, M-R1 증거, 프로세스·창·listener 세대, TCP, Network 로그, 검은 PGM과
정확한 UIA 구조를 모두 읽기 전용으로 재검증한다.
2. 승인 파일과 계획·도우미 해시를 확인하고 내구성 실행 marker를 기록한다.
3. 전체 상태와 승인 freshness를 다시 확인한 뒤 confirm may-have-issued journal을
`CreateNew`, `WriteThrough`, `Flush(true)`로 먼저 기록한다.
4. journal 뒤 M-R1/M-R2 control file, 전체 외부 상태, UIA RuntimeId와 구조 해시,
계획·도우미·승인을 다시 확인한다. 새로 얻은 정확한 PrimaryButton element의
UIA `Invoke`를 한 번만 호출한다.
5. 앱·CDP·9339 listener와 기존 active TCP가 사라지고 Tornado2 세대·창·30001
listener가 유지되는지 확인한다. Network suffix는 BYE 요청 정확히 1회와 성공
0~1회만 허용하며 PGM은 계속 검은 화면이어야 한다.
`CloseMainWindow` 재호출, 다른 UI Invoke, 좌표 클릭·키 입력, PREPARE, TAKE IN,
NEXT, Page NEXT, TAKE OUT, DB write, 재연결, 재실행, 직접 CDP/K3D 명령,
강제 종료, 재시도와 Tornado2 창 복원은 허용하지 않는다. 어느 경계든 달라지거나
결과가 불명확하면 추가 명령 없이 즉시 중단한다.
## 정확한 승인 문구
아래 한 줄을 그대로 승인해야 한다. 계획 해시가 다르면 승인 효력이 없다.
> 회차 MBNWEB-20260712-M-R2의 확인 전용 계획 SHA-256 EEB5C9102D5A797EB459E79F29932E58E921F33C957842477FD9E0BF993E4EB4을 승인한다. M-R1 close-result SHA-256 6543B53F1D5D99B707FC2E04A1F09EA61E39714FE468FA7CF029C85A720851C9가 outcome-unknown 상태이고, 운영체제 정상 닫기 요청 CloseMainWindow가 이미 정확히 1회 소비되었으며 확인 Invoke는 0회임을 확인한다. 현재 K3D 라이선스가 유효하고 Tornado2 PID 6972가 지정된 주 프로그램임을 확인하며, 현재 실행 중인 MBN_STOCK_WEBVIEW PID 37916, 시작 시각 2026-07-12T18:59:06.3837959Z에 이미 열려 있는 '프로그램 종료' 대화상자가 '프로그램을 종료하시겠습니까?'라는 중립 문구와 '종료' PrimaryButton 및 '취소' CloseButton만 정확히 표시할 때, 기존 '종료' 확인 Invoke 정확히 1회와 그 정상 종료 과정에서 발생하는 DISCONNECT/BYE 최대 1회만 승인한다. CloseMainWindow 재호출, 다른 UI Invoke, PREPARE, TAKE IN, NEXT, Page NEXT, TAKE OUT, DB write, 재연결, 재실행, 직접 CDP/K3D 명령, 프로세스 강제 종료, 재시도 및 Tornado2 창 복원은 승인하지 않는다. 사전 조건이 하나라도 달라지거나 결과가 불명확하면 추가 명령 없이 즉시 중단한다.