docs: record external close audit and window prerequisites

This commit is contained in:
2026-07-13 11:20:08 +09:00
parent 607ee1b4c9
commit e468f43886
2 changed files with 126 additions and 2 deletions

View File

@@ -3,8 +3,63 @@
M-R1은 운영체제 정상 닫기 요청을 정확히 한 번 보낸 뒤, WinUI가 같은 제목을 dialog
Window와 제목 Text로 각각 노출하는 정상 구조를 중복 제목으로 오판해 실패 폐쇄됐다.
이 회차는 닫기 요청을 다시 보내지 않고 **이미 열린 정확한 중립 대화상자의
PrimaryButton만 한 번 확인**하기 위한 별도 confirm-only 회차다. 현재 상태는
계획·도우미 검증 완료, 승인 대기이며 UI 확인과 DISCONNECT/BYE는 실행하지 않았다.
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으로 남겼다.
## 고정 산출물

View File

@@ -0,0 +1,69 @@
# MBNWEB-20260712-M-R1-W 창 복원 선행 조건
이 문서는 Round M 전 Tornado2 창 배치를 복원하기 위한 읽기 전용 설계 결과다.
현재 환경에서는 안전한 정확 복원의 선행 조건이 충족되지 않아 **NO-GO**이며,
Gate W 계획·승인·실행 파일은 만들지 않았다.
## 고정 원본과 목표
| 원본 | 크기 | SHA-256 |
|---|---:|---|
| `pre-round-window-visibility.json` | 2,023 bytes | `76E528EFB8B859E203EB72AF6A0471F0A26B3050233296D2541B764896FA0409` |
| `window-state.json` | 2,862 bytes | `AF9270B1EE109D7D2337FD18C505D3FA416E2DBACD584B98FFAAC68B6065FAC7` |
두 파일은 Tornado2 PID 6972, 시작 세대 `639193655349284515`, PGM HWND 592052,
Network HWND 79286과 아래 목표를 동일하게 기록한다.
| 창 | 표시 | 최소화 | Cloaked | 목표 사각형 | Topmost band |
|---|---|---|---:|---|---|
| PGM | true | false | 0 | `(2306,776)-(3402,1410)`, 1096×634 | true |
| Network | true | false | 0 | `(0,0)-(843,566)`, 843×566 | false |
저장 증거에는 전역 z-order ordinal이나 anchor가 없다. 따라서 복원 가능한 의미는
각 창의 사각형·표시·최소화·cloaked·topmost band와 PGM이 Network보다 위인 상대
순서까지다. 증거에 없는 절대 전역 z-order를 재현했다고 주장하지 않는다.
## 현재 NO-GO 원인
현재 단일 primary monitor와 virtual desktop은 모두 `(0,0)-(2560,1440)`이고 work
area bottom은 1392다. PGM 목표 right 3402 중 842px가 가상 화면 밖이므로 기존
Round M의 화면 포함 조건을 통과하지 못한다. 좌표를 clamp하거나 다른 위치로
대체하면 원본 복원이 아니다.
또한 Network HWND 79286의 owner는 동일 Tornado2 프로세스의 HWND 264638이며,
현재 owner가 visible이지만 최소화된 상태다. Windows owned-window 동작상 owner가
최소화된 동안 Network 창을 표시해도 다시 숨겨질 수 있다. 원본 증거에는 owner
상태가 동결돼 있지 않고 Gate W 범위는 PGM과 Network 두 대상만이므로, 도우미가
owner를 복원하는 것은 범위 밖이다.
기존 live 세션 PID 37916과 CDP PID 34988, 30001 established TCP는 제거됐고
Tornado2의 `0.0.0.0:30001` listener만 유지된다. 새 앱 PID 10868은 Tornado/30001
및 9339에 연결되지 않았고 DB 연결만 보유한다. 이는 방송 안전의 직접 blocker는
아니지만 이후 모든 창 조작 경계에서 비연결 상태를 다시 확인해야 한다.
## 사용자가 먼저 복구해야 하는 조건
1. 원래 모니터 토폴로지를 복구해 virtual desktop이 PGM과 Network 목표 사각형을
완전히 포함해야 한다. 최소한 virtual right는 3402 이상, bottom은 1410 이상이어야
한다.
2. Tornado2 본 프로그램 owner 창을 사용자가 직접 일반 표시 상태로 복원해야 한다.
Gate W preflight에서 HWND 264638이 visible=true, iconic=false인지 읽기 전용으로
확인한다.
3. 위 조건을 만족한 새 snapshot으로 별도 계획·SHA-256·승인을 생성한다. 현재
문서는 승인 계획이 아니며 어떤 창 조작도 허가하지 않는다.
## 조건 충족 뒤의 제한된 실행 계약
창별 synchronous `SetWindowPos` 호출만 정확히 한 번 허용하는 것이 권고안이다.
- Network 먼저: `HWND_NOTOPMOST`, `(0,0,843×566)`
- PGM 다음: `HWND_TOPMOST`, `(2306,776,1096×634)`
- 공통 flags: `SWP_NOACTIVATE | SWP_SHOWWINDOW | SWP_NOOWNERZORDER`
- `ShowWindow`, `SetWindowPlacement`, `MoveWindow`, `DeferWindowPos`, 키·마우스·UIA,
AppActivate, 앱 실행과 K3D 명령은 0
실행 순서는 strict source/hash/schema 검증, Tornado/listener/창 owner/모니터/비연결
경계, 최신 승인, 내구성 execution journal, Network may-have-issued journal, 전체
재검증, Network 1회 호출·완료·후조건, PGM에 동일한 흐름, terminal result다.
어느 창이든 호출 실패·timeout·사후 drift가 발생하면 outcome-unknown으로 기록하고
다음 창 호출, rollback과 재시도를 하지 않는다.