11 KiB
MBNWEB-20260712-M-R2 기존 종료 대화상자 확인 계획
M-R1은 운영체제 정상 닫기 요청을 정확히 한 번 보낸 뒤, WinUI가 같은 제목을 dialog
Window와 제목 Text로 각각 노출하는 정상 구조를 중복 제목으로 오판해 실패 폐쇄됐다.
이 회차는 닫기 요청을 다시 보내지 않고 이미 열린 정확한 중립 대화상자의
PrimaryButton만 한 번 확인하기 위한 별도 confirm-only 회차다. M-R2는 승인 후
정확히 한 번 시작됐지만, 사전 검사에서 기존 앱이 이미 종료된 것을 확인해
FAIL_KNOWN_NO_COMMAND로 실패 폐쇄됐다. M-R2가 실행한 UI 확인, DISCONNECT/BYE,
송출 명령은 모두 0이며 재시도하지 않는다.
실행 결과와 외부 정상 종료
| 항목 | 값 |
|---|---|
| M-R2 승인 | 2,804 bytes, 2ACF4393E67CF482A14810ED8CAD213866E1567EF180B3E0AC4CCA5895EBFB53 |
| M-R2 결과 | 1,755 bytes, 4BC8F0B230DA0CB00784BD2F408FC6840F5BDC6AEBDA721890CD70AF5E120CED |
| 상태 | FAIL_KNOWN_NO_COMMAND, outcomeUnknown=false |
| 실행 / confirm dispatch / complete journal | 모두 생성되지 않음 |
| M-R2 CloseMainWindow / Invoke / DISCONNECT / 송출 | 모두 0 |
| 기존 앱·CDP | PID 37916 / 34988 모두 종료 |
| 기존 Tornado TCP | 제거됨 |
| Tornado2 | PID 6972와 0.0.0.0:30001 listener 유지 |
| PGM | 64표본 최대 RGB 0, 144×81 검은 화면 |
M-R2 승인 기록은 2026-07-13T01:40:15.5163471Z에 생성됐다. 기존 세션은
01:40:19.877Z에 Network Monitoring에 [R] BYE Bye 요청 한 줄을 남겼고,
Windows AppModel은 01:40:20.2324722Z에 기존 MSIX 컨테이너를 제거했다. M-R2
도우미는 그보다 늦은 01:40:23.3721293Z에 시작해 약 0.05초 뒤 앱 부재로
중단됐으므로 BYE와 앱 종료는 M-R2에서 발생하지 않았다.
종료 전 Network 기준은 142,844 chars,
839882172C79211517E4C3C81EBF95E65B322B6418B086985EE13E917A3F5A37이고,
종료 뒤에는 142,969 chars,
5773CD65CFCAA08D0112775AB39CA9E3E034086EAD87F0E0D424E3BF876A38F7이다.
신규 suffix 125 chars의 SHA-256은
0316ED8228677624A7C557F506577EC6830B3EE3F1FB41C61761BC4C0F5910E2이며 BYE 요청
1회만 포함하고 성공·실패·오류·scene·송출 명령은 없다. 코드의 정상 종료 경로와
일치하므로 기존 live 세션은 외부 동작으로 정상 종료된 것으로 기록하되, 사람의
클릭인지 다른 UI 자동화인지는 단정하지 않는다.
M-R2 결과 뒤 2026-07-13T01:40:24.1318444Z에 Explorer를 부모로 하는 새 앱
PID 10868과 새 WebView 루트 PID 35328이 시작됐다. 이는 기존 세대와 분리해
취급한다. 새 세대는 MariaDB/Oracle DB 소켓만 가지고 Tornado/30001 연결,
9339 debug listener와 신규 HELLO는 없다. 후속 live 검증은 이 새 세대를 기준으로
다시 계획·승인해야 한다.
위 상태는 별도 읽기 전용 회차 MBNWEB-20260712-M-R2-AUDIT로 고정했다.
외부 시스템 조작 예산과 실제 조작은 모두 0이다.
| 감사 산출물 | 크기 | SHA-256 |
|---|---|---|
| 감사 계획 | 18,716 bytes | 686631F6F8BF518F2B15FC10B46E8F8F9BD6337A42560D035E8E82CDDADE597C |
| collector | 21,256 bytes | FB44C78612697A5000432BEB47B6F5EF0FD2F1998B04EBB4D678ABF71C5B5817 |
| 운영/시험 계획 빌더 | 13,916 bytes | 737440149D5B23845770E15C8D0430D3490878222E20B3CA9A32222881CB4713 |
external-close-audit.json |
12,042 bytes | 4466C7131D9D6D2BFBABC1B11D8BA685085EC8D9FE6D2393AE2F69E6A6F90955 |
| 정적 시험 | 6,031 bytes | 0FD7C5DAB33268FF5BB4048C7036B50CF418F245734FA67B857D741CB3F5864D |
감사 상태는
PASS_OLD_SESSION_KNOWN_CLOSED_EXTERNAL_NORMAL_BYE_NEW_GENERATION_UNCONNECTED다.
수집 전후 ValidateOnly, PS5 AST와 정적 시험이 통과했고 고정 파일 해시는 변하지
않았다. 새 세대의 DB 원격 주소·IP·로컬 임시 포트는 기록하지 않았고, 허용된 DB
포트 종류와 30001/9339 부재만 안전 projection으로 남겼다.
고정 산출물
| 항목 | 크기 | 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이다.
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개로 고정한다.
승인 후 허용되는 유일한 흐름
- 계획, M-R1 증거, 프로세스·창·listener 세대, TCP, Network 로그, 검은 PGM과 정확한 UIA 구조를 모두 읽기 전용으로 재검증한다.
- 승인 파일과 계획·도우미 해시를 확인하고 내구성 실행 marker를 기록한다.
- 전체 상태와 승인 freshness를 다시 확인한 뒤 confirm may-have-issued journal을
CreateNew,WriteThrough,Flush(true)로 먼저 기록한다. - journal 뒤 M-R1/M-R2 control file, 전체 외부 상태, UIA RuntimeId와 구조 해시,
계획·도우미·승인을 다시 확인한다. 새로 얻은 정확한 PrimaryButton element의
UIA
Invoke를 한 번만 호출한다. - 앱·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 창 복원은 승인하지 않는다. 사전 조건이 하나라도 달라지거나 결과가 불명확하면 추가 명령 없이 즉시 중단한다.