docs: record M-R1 outcome and confirm-only gate
This commit is contained in:
97
docs/LIVE_CONFIRMATION_PLAN_MBNWEB-20260712-M-R2.md
Normal file
97
docs/LIVE_CONFIRMATION_PLAN_MBNWEB-20260712-M-R2.md
Normal file
@@ -0,0 +1,97 @@
|
||||
# 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 창 복원은 승인하지 않는다. 사전 조건이 하나라도 달라지거나 결과가 불명확하면 추가 명령 없이 즉시 중단한다.
|
||||
@@ -2,8 +2,30 @@
|
||||
|
||||
Round M은 CONNECT 뒤 PREPARE 전에 증거 감시기 회귀로 중단됐고, 앱과 Tornado2의
|
||||
TCP 연결만 남았다. 이 회차는 그 연결을 **프로그램의 정상 종료 경로로 한 번만
|
||||
정리**하기 위한 별도 fail-closed 회차다. 현재 상태는 **계획·도우미 검증 완료,
|
||||
승인 대기**이며, 종료 요청·대화상자 확인·DISCONNECT/BYE는 아직 실행하지 않았다.
|
||||
정리**하기 위한 별도 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·계층을 명시적으로 결박한
|
||||
새 회차와 새 승인을 사용한다.
|
||||
|
||||
## 고정 산출물
|
||||
|
||||
|
||||
Reference in New Issue
Block a user