docs: prepare Round M live validation

This commit is contained in:
2026-07-13 03:48:13 +09:00
parent 4e9ae44789
commit ff6126610c
4 changed files with 212 additions and 4 deletions

View File

@@ -121,3 +121,42 @@ Gate B 문구는 Gate A 성공과 command-free preflight 뒤에만 사용한다.
source, package, installed runtime, Live 설정, cut, selector, 대상 source, package, installed runtime, Live 설정, cut, selector, 대상
PID/start/listener/window, helper 또는 계획이 바뀌거나 승인/runtime/preflight가 15분을 PID/start/listener/window, helper 또는 계획이 바뀌거나 승인/runtime/preflight가 15분을
넘으면 승인을 사용하지 않고 새 회차로 돌아간다. 넘으면 승인을 사용하지 않고 새 회차로 돌아간다.
## 실행 결과 — 종료된 실패 회차
Round L은 재시도 없이 `FAIL_KNOWN_CLEANED`로 종료했다. 실행은
`2026-07-12T17:56:59.1576171Z`부터 `17:57:05.4284241Z`까지 6.270807초였고,
승인 나이는 시작 시점 기준 43.0371499초로 유효했다. `outcomeUnknown=false`다.
실패 원인은 frozen PGM 창이 실행 시점에 최소화돼 strict target preflight가 거부한
것이다.
> `The frozen window is hidden or minimized.`
실패는 execution marker, capability 생성과 앱 시작보다 앞에서 발생했다. 따라서 앱
launch, CONNECT/HELLO, PREPARE, TAKE IN, NEXT, Page NEXT, DB write, TAKE OUT,
DISCONNECT와 retry는 모두 0건이다. `prepareIssued=0`,
`prepareMayHaveBeenIssued=false`이며 명령 결과는 명확하다.
사후 read-only 확인에서 PGM handle 592052는 `visible=true`, `iconic=true`, owner 6972,
Network Monitoring handle 79286은 `visible=true`, `iconic=false`, owner 6972였다.
Tornado PID/start ticks/30001 listener는 계획과 같았다. 비명령 cleanup은 성공했고
앱/CDP listener, Live 설정, 임시 설정, DPAPI capability는 남지 않았다.
승인 회차 종료 뒤 송출 명령 없이 표준 Win32 동기 `ShowWindow(SW_RESTORE)`를 PGM에
한 번 적용해 `visible=true`, `iconic=false`, owner 6972를 확인했다. 비동기 restore가
최소화 플래그를 해제하지 못한 사실도 후속 회귀에 보존한다.
| 증거 | bytes | SHA-256 |
|---|---:|---|
| Round L 계획 | 15,987 | `23E3A6A5400166A47835E146DCC2D19C181E2100D1485DB428F1B10718D89928` |
| Gate A 승인 | 1,085 | `A361843C2E810CEAA2F838F4AA953C4D9910670BD458C3974BBA915DA8B73962` |
| Gate A 결과 | 3,421 | `F57BEA9E5F4A215DBB944DCFDC22D8989A5418BDC3910B19B2A11ED9B795FE4D` |
Round L 승인과 명령 예산은 폐기했다. 같은 계획이나 승인을 재사용하지 않는다. 후속
회차는 frozen window identity를 먼저 검증하고 command-free synchronous restore를
수행한 뒤 strict visible/non-iconic 검사를 통과해야 한다.
이 교정은 새 계획
[`LIVE_VALIDATION_PLAN_MBNWEB-20260712-M.md`](LIVE_VALIDATION_PLAN_MBNWEB-20260712-M.md)에
고정했다. Round M 역시 별도 승인 전에는 실행하지 않는다.

View File

@@ -0,0 +1,131 @@
# MBNWEB-20260712-M 실제 PGM 검증 계획
이 문서는 Round L의 명령 송신 전 창 상태 실패를 교정한 새 Gate A 회차를 고정한다.
현재 상태는 **계획 생성 완료·승인 대기**다. 앱, CDP, K3D/Tornado2 명령은 아직
실행하지 않았다.
| 항목 | 고정값 |
|---|---|
| 계획 파일 | `artifacts\pgm-evidence\MBNWEB-20260712-M\round-plan.json` |
| 계획 | 19,042 bytes, `7A1141C5F276729E340227CEEAA48B0E6018632BBA51F43AA94636084AA3C301` |
| schema | `4` |
| 생성 시각 | `2026-07-12T18:44:01.0754197Z` |
| source HEAD / origin main | `4e9ae447897b17862dedb3bc6906963b1793d0cb` |
| 계획 생성 시 실제 명령 | 앱·벤더·창 조작·CONNECT·PREPARE 모두 0건 |
Round M은 Round L의 retry나 남은 예산 사용이 아니다. 새 계획, 새 승인, 새 one-shot
예산을 사용하는 별도 회차다.
## Round L 종료 근거
| 항목 | 값 |
|---|---|
| 상태 | `FAIL_KNOWN_CLEANED`, `outcomeUnknown=false` |
| 계획 | `23E3A6A5400166A47835E146DCC2D19C181E2100D1485DB428F1B10718D89928` |
| Gate A 승인 | `A361843C2E810CEAA2F838F4AA953C4D9910670BD458C3974BBA915DA8B73962` |
| 결과 | 3,421 bytes, `F57BEA9E5F4A215DBB944DCFDC22D8989A5418BDC3910B19B2A11ED9B795FE4D` |
| 실패 | frozen PGM handle 592052가 `visible=true`, `iconic=true` |
| 앱 launch / 벤더 명령 | 0 / 0 |
| CONNECT / PREPARE / DISCONNECT | 0 / 0 / 0 |
| execution marker | 생성되지 않음 |
L 승인은 폐기됐고 재사용하지 않는다. L 종료 뒤 수행한 read-only 확인과 표준 Win32
동기 restore 관측은 후속 설계 근거일 뿐 L 실행 결과로 소급하지 않는다.
## 창 사전복원 교정
Gate A는 실행 marker, capability, 앱, CDP와 벤더 명령보다 앞에서 다음 순서를
강제한다.
1. 설치 package, vendor 등록, Live 설정과 cut을 read-only로 검증한다.
2. MBN 앱과 CDP 9339 listener가 없음을 확인한다.
3. 승인 유효성을 확인한다.
4. Tornado PID/start ticks, 실행 파일·서명, `0.0.0.0:30001` 단일 listener와
PGM/Network Monitoring의 유일한 exact top-level handle/title/owner를 검증한다.
5. 두 창의 원래 visible/iconic/cloaked/placement를 첫 UI 변경 전에 모두 캡처한다.
6. 필요한 창에만 동기 `ShowWindow``SW_RESTORE` 또는 `SW_SHOW`를 창별 최대 1회
호출한다.
7. API 반환값을 성공으로 간주하지 않고 최대 5초 동안 실제
visible/non-iconic/non-cloaked 사후 상태를 확인한다.
8. helper 내부 중간 실패는 두 창을 즉시 원상복구하고 exact placement까지 확인한다.
9. 성공한 원본 상태는 execution marker 전까지 Gate A 메모리에 보존한다. 이후
`pre-round-window-visibility.json`은 복원 후 상태가 아니라 이 원본을 저장한다.
10. 다시 승인 유효성과 strict desktop target을 검증하고 운영 폴더 closed set을
확인한 뒤 execution marker를 쓴다. capability는 marker 뒤에 초기화한다.
preflight 자체의 파일 생성, capability, 앱 명령과 벤더 명령은 모두 0건이다. 파일
기반 snapshot 전 실패는 메모리 원본으로, 이후 실패는 authoritative snapshot으로
원복한다. `ShowWindowAsync` fallback과 같은 창에 대한 반복 호출은 없다.
첫 identity 검사 자체가 helper evidence를 반환하기 전에 실패하면 결과의
`windowsRemainArmed`는 실제 mutation 여부를 추정하지 않고 보수적으로 `true`가 될 수
있다. 이는 명령 발행 증거가 아니라 수동 reconciliation 필요 표시로 해석한다.
## 고정 대상과 입력
계획 생성 직전 read-only 관측 시각은 `2026-07-12T18:44:00.9005006Z`다. 이 관측은
정보성 기록이며 실행 시 helper가 전부 다시 검증한다.
| 항목 | 값 |
|---|---|
| Tornado | PID 6972, start ticks `639193655349284515` |
| listener | `0.0.0.0:30001`, 1개, owner 6972 |
| PGM | handle 592052, owner 6972, visible, non-iconic, uncloaked |
| Network Monitoring | handle 79286, owner 6972, visible, non-iconic, uncloaked |
| MBN app / CDP 9339 | 0 / 0 |
| MSIX | `1B0BA713619CC3BD7CB3E03D78FD1EB1CEAF49E7D50F5C00DDFB483917BA5437` |
| installed runtime | `168D1FB8D6487C41C8CEAA828B4D9515A38DB3A970F8EB44FA930ABDD577B8E9` |
| installed manifest | 76,119 bytes, `9631E8188E10F23970F43593B705957A215AE01E2760FE714B08518DB0571A9B` |
| Live 설정 | 895 bytes, `63C6F386D73D8740B7B10994668ED14D95C3D7B68025B0DF034C3F18D660E582` |
| cut | `5001.t2s`, 895,922 bytes, `99CE3B689A42D8C42BEB09A86FA10C2D7C1AEF4F50D324D81276C1A1E4C4D8A7` |
| selector | `KOSPI / 삼성전자 / 1열판기본 / CURRENT / 005930`, page 1, fade 6 |
## 고정 helper와 command-free 시험
| 파일 | bytes | SHA-256 |
|---|---:|---|
| `round-m-gate-a.ps1` | 154,026 | `37340B4B74BE856F109A13D037217951CAF741212CD32F1CEE374647A9AC38EF` |
| `round-m-gate-a-cdp.mjs` | 73,292 | `1D118202CDB9D37315683063BD4DB1083F4EBAC822BE2B3E60A1A08226091BEF` |
| `round-m-gate-b.ps1` | 104,988 | `4DD6F4C7DF1768058E090FA492339EF022A6E6C7A5D1C637C2544E182C44A02C` |
| `round-m-gate-b.mjs` | 98,253 | `FE5CBF1E13004022AA25174BC8828CE5A1953D249CBECD388D4F4AE99AFF41DB` |
| `round-m-window-arm.ps1` | 28,525 | `21D403BC8EA6569C19734E6DE017B4C3DEB5389A9BE0D4E0D17775D2C27D32CD` |
| `round-m-desktop.ps1` | 31,248 | `1E3ABAE50B1337AEA5CCE05CC8125D04F4D6AA0FC2441FD98381B5165032175A` |
| `round-m-monitor.ps1` | 29,900 | `B1CFEBC4A35347ADE5B1B402641EEA19A6975997C05C2726C74D1F4E72694B30` |
| 시험 | bytes | SHA-256 |
|---|---:|---|
| PowerShell 정적·manifest·window 계약 | 22,651 | `A3E425530119FBE758BE96303C4FB256CD1D901B28243571C0D9B815E441B6F5` |
| Node 시간·Int64 계약 | 2,782 | `5141DC0AE0BB3220C7EBB464F4023E838BCF096BE4C11A9B844632C31C8A7935` |
| 계획 생성기 | 17,624 | `F4ABF9E1906EE9AC69140EF534553447DCBAFE0326FD8742D5910775BFADAED8` |
Windows PowerShell 5.1 AST 5개와 Node 구문 3개, identifier-aware 이관,
`backgroundKind` 보존, L iconic 실패, API false여도 사후 상태 성공, already-shown 0회,
5초 timeout, identity drift 0회, 부분 실패 self-rollback, maximized `showCmd=3` 원복과
snapshot 이후 ShowWindow 0회 계약이 통과했다.
K manifest ordinal 역전 41개와 M 기준 0개, 의미 집합 289/289, 3개 문화권 불변성도
통과했다. 계획 원문에는 start ticks가 정확히 한 번 있고 반올림 값은 없다.
## 폐쇄 집합과 명령 예산
승인 전 운영 폴더는 helper 7개, installed manifest, Live 설정, 계획의 정확한 10개
파일이다. `gate-a.json` 생성 뒤 Gate A 시작 시에는 정확한 11개만 허용한다.
preflight는 파일을 만들지 않으므로 두 번째 closed-set 검사도 11개다.
Gate A 예산은 CONNECT 1회, PREPARE 5001/page 1 1회와 명확한 known-outcome
중단 시 정상 DISCONNECT 최대 1회다. TAKE IN, NEXT, Page NEXT, DB write와 retry는
0회다. timeout이나 결과 불명확 상태에서는 어떤 명령도 반복하지 않는다.
## 승인 문구
Gate A는 다음 한 문장을 그대로 승인받은 뒤에만 실행한다.
> 회차 MBNWEB-20260712-M의 계획 SHA-256 7A1141C5F276729E340227CEEAA48B0E6018632BBA51F43AA94636084AA3C301을 승인한다. 현재 K3D 라이선스가 유효함을 확인하며, 현재 PGM 대상 Live CONNECT 1회와 PREPARE 5001 page 1 실행, Gate A가 명확한 known-outcome 상태에서 중단될 때 DISCONNECT 1회를 승인한다. TAKE IN, NEXT, DB write는 아직 승인하지 않는다.
Gate B는 Gate A가 `PASS_PREPARED`로 끝나고 command-free preflight가 새로 통과한
뒤에만 별도로 승인받는다.
> 회차 MBNWEB-20260712-M의 계획 SHA-256 7A1141C5F276729E340227CEEAA48B0E6018632BBA51F43AA94636084AA3C301을 다시 확인했다. 현재 PGM 대상 TAKE IN 5001 page 1 정확히 1회, OnScenePlayed 확인 후 자동 갱신 최대 1회, TAKE OUT All 정확히 1회와 DISCONNECT 1회를 승인한다. NEXT와 DB write 및 결과 불명확 시 재시도는 승인하지 않는다.
source, package, manifest, 설정, cut, selector, PID/start/listener/window, helper, 계획이
바뀌거나 승인 또는 preflight가 허용 시간을 넘으면 승인과 예산을 폐기하고 새 회차로
돌아간다.

View File

@@ -14,7 +14,7 @@
| `s5025` trusted 수동 파일 | 외부 CP949 source 통합 검증 통과; 실제 파일/환경은 계속 Git 밖에서 회차별 preflight | | `s5025` trusted 수동 파일 | 외부 CP949 source 통합 검증 통과; 실제 파일/환경은 계속 Git 밖에서 회차별 preflight |
| `s5006` `Video\큐브배경.vrv` | 현재 승인 Cuts root에서 누락 | | `s5006` `Video\큐브배경.vrv` | 현재 승인 Cuts root에서 누락 |
| `s6001` 해외지수 영상 | 국가별 `Video\20201008_<국가>.vrv` 13개가 현재 승인 Cuts root에서 누락; 외부자산 필요 | | `s6001` 해외지수 영상 | 국가별 `Video\20201008_<국가>.vrv` 13개가 현재 승인 Cuts root에서 누락; 외부자산 필요 |
| 이번 마이그레이션 WebView workflow의 실제 Tornado2 검증 | **최신 성공은 승인된 5001/5074 범위의 Round H. Round J/K 각각 pre-dispatch 명령 0건으로 종료됐고 수정된 Round L은 Gate A 승인 대기; 35개 전체의 실제 PGM 검증으로 확대 해석하지 않음** | | 이번 마이그레이션 WebView workflow의 실제 Tornado2 검증 | **최신 성공은 승인된 5001/5074 범위의 Round H. Round J/K/L은 각각 pre-dispatch 명령 0건으로 종료됐고 창 preflight를 교정한 Round M은 Gate A 승인 대기; 35개 전체의 실제 PGM 검증으로 확대 해석하지 않음** |
1.0.2 Visual Studio 개발 등록본을 signed 1.0.3으로 교체할 때 `Remove-AppxPackage -PreserveApplicationData`를 사용했다. 재등록 구간에서 바뀐 파일은 Windows package Settings transaction log `settings.dat.LOG1/LOG2`뿐이었고, WebView LocalState와 외부 `%LOCALAPPDATA%\MBN_STOCK_WEBVIEW` 운영 데이터는 삭제·덮어쓰지 않았다. 이 패키지 검증 회차는 기본 설정 부재와 환경 override 0건을 확인한 `DryRun`으로만 실행했으며 Tornado 실제 명령은 보내지 않았다. 1.0.2 Visual Studio 개발 등록본을 signed 1.0.3으로 교체할 때 `Remove-AppxPackage -PreserveApplicationData`를 사용했다. 재등록 구간에서 바뀐 파일은 Windows package Settings transaction log `settings.dat.LOG1/LOG2`뿐이었고, WebView LocalState와 외부 `%LOCALAPPDATA%\MBN_STOCK_WEBVIEW` 운영 데이터는 삭제·덮어쓰지 않았다. 이 패키지 검증 회차는 기본 설정 부재와 환경 override 0건을 확인한 `DryRun`으로만 실행했으며 Tornado 실제 명령은 보내지 않았다.
@@ -90,7 +90,7 @@ range에는 그 추가 PREPARE/PLAY를 반영하지 않은 불일치가 있었
이 실패 뒤 `maximumAutomaticRefreshesPerTakeIn` trusted JSON-only 상한을 추가했다. 기본 `null`은 원본 연속 갱신을 유지하고, 실제 검증 설정의 `1`은 scheduler와 실제 refresh dispatch 경계에서 두 번째 실행을 이중 차단한다. 상태는 `refreshCompletedCount`, `refreshMaximumCount`, `refreshLimitReached`를 제공하며, 마지막 refresh `OnScenePlayed`가 drain되기 전에는 count가 상한에 도달해도 `refreshLimitReached=false`를 유지한다. 검증은 `completed=1`, `maximum=1`, `limitReached=true`, `refreshActive=false`, `playCompletionPending=false`를 모두 확인해야 한다. 변경된 package는 Round I 승인/계획을 재사용할 수 없으며 새 package hash, 새 회차 계획과 새 CONNECT/PREPARE/TAKE IN 승인이 필요하다. 이 실패 뒤 `maximumAutomaticRefreshesPerTakeIn` trusted JSON-only 상한을 추가했다. 기본 `null`은 원본 연속 갱신을 유지하고, 실제 검증 설정의 `1`은 scheduler와 실제 refresh dispatch 경계에서 두 번째 실행을 이중 차단한다. 상태는 `refreshCompletedCount`, `refreshMaximumCount`, `refreshLimitReached`를 제공하며, 마지막 refresh `OnScenePlayed`가 drain되기 전에는 count가 상한에 도달해도 `refreshLimitReached=false`를 유지한다. 검증은 `completed=1`, `maximum=1`, `limitReached=true`, `refreshActive=false`, `playCompletionPending=false`를 모두 확인해야 한다. 변경된 package는 Round I 승인/계획을 재사용할 수 없으며 새 package hash, 새 회차 계획과 새 CONNECT/PREPARE/TAKE IN 승인이 필요하다.
### Round J/K pre-dispatch 실패와 Round L 교정 ### Round J/K/L pre-dispatch 실패와 Round M 교정
Round J `MBNWEB-20260712-J`는 계획 SHA-256 Round J `MBNWEB-20260712-J`는 계획 SHA-256
`8B51E43AFC5F0E330A8DEF3B38DF071B071E5814FC96258AA9505935D1B43956`에 대한 `8B51E43AFC5F0E330A8DEF3B38DF071B071E5814FC96258AA9505935D1B43956`에 대한
@@ -135,6 +135,25 @@ TAKE IN, NEXT, Page NEXT, DB write와 retry는 0이다. 세부 계획은
[`LIVE_VALIDATION_PLAN_MBNWEB-20260712-L.md`](LIVE_VALIDATION_PLAN_MBNWEB-20260712-L.md)에 [`LIVE_VALIDATION_PLAN_MBNWEB-20260712-L.md`](LIVE_VALIDATION_PLAN_MBNWEB-20260712-L.md)에
고정했다. 고정했다.
승인된 Round L Gate A는 manifest와 시간·Int64 검사를 통과했지만 frozen PGM
handle 592052가 `visible=true`, `iconic=true`여서 strict desktop target 검사에서
execution marker 전에 종료됐다. 결과는 `FAIL_KNOWN_CLEANED`,
`outcomeUnknown=false`이며 앱 launch, CONNECT, PREPARE, TAKE IN, NEXT, DB write,
DISCONNECT와 retry는 모두 0건이다. Gate A 결과 SHA-256은
`F57BEA9E5F4A215DBB944DCFDC22D8989A5418BDC3910B19B2A11ED9B795FE4D`다. L 승인과
예산은 폐기했고 재사용하지 않는다.
새 Round M은 PID/start/exe/signature/listener와 유일한 exact 창 identity를 먼저
검증한 뒤, 필요한 창에만 동기 `ShowWindow`를 창별 최대 1회 적용한다. 성공 판정은
API 반환값이 아니라 5초 이내 visible/non-iconic/non-cloaked 사후 상태다. 두 창의
원본 placement는 첫 변경 전에 메모리에 보존하며 helper 내부 부분 실패, execution
marker 전 Gate A 실패와 marker 이후 실패 모두 exact 원상복구 경로가 있다. preflight
동안 파일, capability, 앱 명령과 벤더 명령은 0건이다. schema 4 계획은 19,042 bytes,
SHA-256 `7A1141C5F276729E340227CEEAA48B0E6018632BBA51F43AA94636084AA3C301`이며
승인 전 실제 명령은 0건이다. 세부 계획과 정확한 승인문은
[`LIVE_VALIDATION_PLAN_MBNWEB-20260712-M.md`](LIVE_VALIDATION_PLAN_MBNWEB-20260712-M.md)에
고정했다.
이 실제 Live PGM 증거는 회차에 허용된 5001과 5074에 한정된다. 35개 scene builder 전체 동등성은 자동 테스트, 55-query 실데이터 smoke와 [`SCENE_EQUIVALENCE.md`](SCENE_EQUIVALENCE.md) 매트릭스로 유지하며, 나머지 scene이 실제 PGM에서 각각 송출됐다는 의미로 기록하지 않는다. 이 실제 Live PGM 증거는 회차에 허용된 5001과 5074에 한정된다. 35개 scene builder 전체 동등성은 자동 테스트, 55-query 실데이터 smoke와 [`SCENE_EQUIVALENCE.md`](SCENE_EQUIVALENCE.md) 매트릭스로 유지하며, 나머지 scene이 실제 PGM에서 각각 송출됐다는 의미로 기록하지 않는다.
## 화면/계약과 운영 검증의 분리 ## 화면/계약과 운영 검증의 분리
@@ -358,7 +377,9 @@ COM 명령 전 validation에서 명시적으로 거부됐고 Network Monitoring/
### 출력이 명확히 active이고 엔진이 정상인 경우 ### 출력이 명확히 active이고 엔진이 정상인 경우
Gate A에 포함된 TAKE OUT을 한 번 실행한다. 성공 callback과 PGM 종료 화면을 확인한 뒤 Disconnect한다. 같은 TAKE OUT을 확인용으로 반복하지 않는다. 해당 회차에서 명시적으로 승인된 TAKE OUT을 한 번 실행한다. 현재 M 계열에서는 이
권한이 Gate B에만 있다. 성공 callback과 PGM 종료 화면을 확인한 뒤 승인 범위의
Disconnect를 실행하며, 같은 TAKE OUT을 확인용으로 반복하지 않는다.
### 결과가 불명확한 경우 ### 결과가 불명확한 경우

View File

@@ -149,5 +149,22 @@ K 역전 41개를 재현하고 L 역전 0, exact/대소문자 중복 0, 3개 문
command-free로 검증했다. Gate A/B에 exact schema·NFC·안전 경로·ordinal 재검증을 command-free로 검증했다. Gate A/B에 exact schema·NFC·안전 경로·ordinal 재검증을
추가했다. Node 계획 생성기의 18자리 Tornado start ticks 반올림도 승인 전에 폐기하고 추가했다. Node 계획 생성기의 18자리 Tornado start ticks 반올림도 승인 전에 폐기하고
Int64 보존 회귀를 추가했다. 최종 L 계획 SHA-256은 Int64 보존 회귀를 추가했다. 최종 L 계획 SHA-256은
`23E3A6A5400166A47835E146DCC2D19C181E2100D1485DB428F1B10718D89928`이다. 계획 고정 `23E3A6A5400166A47835E146DCC2D19C181E2100D1485DB428F1B10718D89928`이다.
승인된 L Gate A는 위 교정을 통과했지만 PGM 창이 최소화된 상태여서 strict desktop
target 검사에서 execution marker 전에 `FAIL_KNOWN_CLEANED`로 종료했다.
`outcomeUnknown=false`이고 앱 launch, CONNECT, PREPARE, TAKE IN, NEXT, DB write,
DISCONNECT와 retry는 모두 0건이다. Gate A 승인 SHA-256은
`A361843C2E810CEAA2F838F4AA953C4D9910670BD458C3974BBA915DA8B73962`, 결과 3,421 bytes의
SHA-256은 `F57BEA9E5F4A215DBB944DCFDC22D8989A5418BDC3910B19B2A11ED9B795FE4D`다.
L 승인과 예산은 폐기했고 재사용하지 않는다.
새 [`LIVE_VALIDATION_PLAN_MBNWEB-20260712-M.md`](LIVE_VALIDATION_PLAN_MBNWEB-20260712-M.md)은
창 identity를 먼저 검증한 뒤 필요한 창에만 동기 `ShowWindow`를 창별 최대 1회
적용하고, 5초 actual postcondition과 exact 원상복구를 요구한다. 원래 두 창의
placement는 첫 변경 전에 메모리에 보존돼 helper 내부 부분 실패, execution marker 전
실패와 이후 실패를 모두 복구한다. preflight 동안 파일, capability, 앱·벤더 명령은
0건이다. Gate A/CDP/Gate B는 동일한 schema 4와 16-field preflight 계약을 검증한다.
최종 M 계획은 19,042 bytes, SHA-256
`7A1141C5F276729E340227CEEAA48B0E6018632BBA51F43AA94636084AA3C301`다. 계획 고정
시점의 앱/Tornado 명령은 0건이며 새 Gate A 승인 전에는 실행하지 않는다. 시점의 앱/Tornado 명령은 0건이며 새 Gate A 승인 전에는 실행하지 않는다.