# MBNWEB-20260712-J 실제 PGM 검증 계획

최종 계획 작성 시각: 2026-07-12 22:47 KST

계획 JSON SHA-256:
`8B51E43AFC5F0E330A8DEF3B38DF071B071E5814FC96258AA9505935D1B43956`

계획 원본은 Git 제외 로컬 파일
`artifacts\pgm-evidence\MBNWEB-20260712-J\round-plan.json`이다. 최종 계획을
고정한 시점까지 Round J의 실제 앱·Tornado2 명령은 0건이며, 회차 전용 Live 설정과
일회용 capability도 설치하지 않았다.

기존 Round I 계획 SHA-256
`D221841A15593A987FB944648F0ACE0AC5940936AEE16C74DC9B901A2F45B332`에
대한 승인은 Round J에서 재사용하지 않는다. Round I은 자동 갱신 상한 위반으로 이미
실패 처리됐고, 이 문서의 새 계획에는 수정된 1.0.5 package와 별도 승인 두 단계가 적용된다.

## 고정 입력

| 항목 | 값 |
|---|---|
| package source | `df60e09884acac2e9cb47d50ba902fa13cf7e154` |
| signed MSIX | `1.0.5.0`, x64 |
| MSIX SHA-256 | `1B0BA713619CC3BD7CB3E03D78FD1EB1CEAF49E7D50F5C00DDFB483917BA5437` |
| installed runtime SHA-256 | `168D1FB8D6487C41C8CEAA828B4D9515A38DB3A970F8EB44FA930ABDD577B8E9` |
| installed 289-file manifest | `9234575267F7D1A8A1045246E5128BD755CE9A3976DA83EE00A1AF4ABEE51552` |
| Live 설정 SHA-256 | `63C6F386D73D8740B7B10994668ED14D95C3D7B68025B0DF034C3F18D660E582` |
| 자동 refresh 상한 | `maximumAutomaticRefreshesPerTakeIn=1` |
| scene | 5001/page 1, KOSPI 삼성전자 `1열판기본 / CURRENT / 005930` |
| cut SHA-256 | `99CE3B689A42D8C42BEB09A86FA10C2D7C1AEF4F50D324D81276C1A1E4C4D8A7` |
| reconnect/retry | 비활성 / 0 |

최종 계획 시점의 대상은 PID 6972, start ticks `639193655349284515`, PGM handle
592052, Network Monitoring handle 79286, TCP 30001 listener owner PID 6972 한 개다.
Tornado2 실행 파일은 59,915,776 bytes, SHA-256
`BCB192063DF485D0CAD03C91B4698936F0DB9F7B2F19B8EB52DF309A78F313C4`,
`NotSigned`로 고정했다. 이 값 중 하나라도 바뀌면 승인을 재사용하지 않는다.

## 동결된 자동화

독립 정적 감사 결과 P0/P1은 0건이다. PowerShell 5.1 AST와 Node 구문, 교정된 selector,
PREPARE permit, Gate B 이중 permit, terminal correlation, DPAPI capability, config/cut read
lease, OutcomeUnknown/no-close, NODE/WebView override 차단을 검증했다.

| 파일 | SHA-256 |
|---|---|
| `round-j-gate-a.ps1` | `3A5A36EED94C4B85AE580FE61FEF102FE83D208575CD159B389788E3E79C172A` |
| `round-j-gate-a-cdp.mjs` | `5B89152ABF688FC6439095B2E7B906E937530BF7E182BCB2C16BD593DA141274` |
| `round-j-gate-b.ps1` | `D7FD8C40B97AF6BC1C3314D7364EAB0007E66F402135E1F01E81ACA8846C8CAE` |
| `round-j-gate-b.mjs` | `BD7102E49B7DF5B11AD774BB32B2CA8EA7506A44E6A7350E205CC8DC1BF9BB6E` |
| `round-j-window-arm.ps1` | `D6A939859424982A32A711F101162796493652335209D11C2F35802954F70798` |
| `round-j-desktop.ps1` | `1E3ABAE50B1337AEA5CCE05CC8125D04F4D6AA0FC2441FD98381B5165032175A` |
| `round-j-monitor.ps1` | `B1CFEBC4A35347ADE5B1B402641EEA19A6975997C05C2726C74D1F4E72694B30` |

실행 runtime도 Visual Studio 2026 Node v24.12.0
`2FFE3ACC0458FDDE999F50D11809BBE7C9B7EF204DCF17094E325D26ACE101D8`와
Windows PowerShell 5.1
`0FF6F2C94BC7E2833A5F7E16DE1622E5DBA70396F31C7D5F56381870317E8C46`의
정확한 절대 경로·크기·해시로 고정했다.

## 명령 예산과 단계

Gate A는 CONNECT 1회와 PREPARE 5001/page 1 1회만 허용한다. TAKE IN, NEXT,
Page NEXT, DB write는 허용하지 않는다. Gate A가 명확한 known-outcome 상태에서 중단될
때만 fresh native/CDP/Tornado 상태를 다시 확인하고 정상 종료에 의한 DISCONNECT 1회를
사용할 수 있다. timeout 또는 모순이면 앱을 닫지 않고 비명령 정리만 한다.

Gate A 성공 후에는 다음 조건을 모두 만족해야 Gate B preflight를 만든다.

1. `gate-a-runtime.json`이 exact PREPARED 5001/page 1과 동일 guard nonce를 기록한다.
2. Gate A 이후 15분 이내이고 계획·source·package·target·config·cut이 그대로다.
3. command-free preflight가 Gate A inner guard를 default-disarmed 상태로 복원한다.
4. Gate B 승인 파일이 runtime manifest와 preflight 양쪽 SHA-256을 참조한다.
5. DPAPI CurrentUser 일회용 capability를 소비하고 두 guard가 같은 permit을 동기 소비한다.

Gate B의 단일 observer는 제어권을 반환하지 않고 TAKE IN 1회, 최초 OnScenePlayed 확인,
자동 갱신 최대 1회, CAPPED 1/1 확인, TAKE OUT All 1회, 정상 종료/DISCONNECT 1회를
수행한다. NEXT, DB write, retry 예산은 모두 0이다.

## 예상 Network Monitoring multiset

Gate A PREPARE 완료 시 `[R]` marker는 정확히 39개다.

- HELLO 1, LOAD 5001 1, CHANGE_EFFECT_SET 5001 1, BACKGROUND 5001 1
- BEGIN 1, VALUE_SET 8, VISIBLE 23, QUERY 5001 표시 marker 2, PREPARE 5001 1
- PLAY, STOPAL, UNLOAD, BYE, 다른 scene, NEXT, DB write는 0

Gate B 종료 후 누적 `[R]` marker는 정확히 117개다.

- HELLO 1, LOAD 5001 1, CHANGE_EFFECT_SET 5001 2, BACKGROUND 5001 3
- BEGIN 3, VALUE_SET 24, VISIBLE 69, QUERY 5001 표시 marker 6, PREPARE 5001 3
- PLAY 2, STOPAL 1, UNLOAD 5001 1, BYE 1
- 의미상 vendor request는 114개이며 다른 scene, NEXT, DB write, retry는 0

Gate B cap 도달 전 누적 PREPARE/PLAY/OnScenePlayed는 3/2/2다. 첫 PLAY는 initial
TAKE IN, 둘째 PLAY는 자동 갱신 한 번이다. 최종 callback을 drain한 뒤
`completed=1`, `maximum=1`, `limitReached=true`, `refreshActive=false`,
`playCompletionPending=false`, Web `CAPPED · 1/1`을 확인해야 한다.

## 승인 문구 — 역사 기록, 재사용 금지

Round J는 이미 종료됐다. 아래 문구와 실제 승인은 모두 폐기했으며 어떤 실행에도
다시 사용하지 않는다.

당시 Gate A가 요구했던 문장은 아래와 같다. 승인 시각은 15분 이내의 canonical UTC로
별도 기록됐고 K3D license가 현재 유효하다는 사용자 확인을 포함했다.

> 회차 MBNWEB-20260712-J의 계획 SHA-256 8B51E43AFC5F0E330A8DEF3B38DF071B071E5814FC96258AA9505935D1B43956을 승인한다. 현재 K3D 라이선스가 유효함을 확인하며, 현재 PGM 대상 Live CONNECT 1회와 PREPARE 5001 page 1 실행, Gate A가 명확한 known-outcome 상태에서 중단될 때 DISCONNECT 1회를 승인한다. TAKE IN, NEXT, DB write는 아직 승인하지 않는다.

Gate B 문구는 Gate A 성공과 command-free preflight 후에만 사용할 예정이었으나,
Gate A가 실패했으므로 승인받거나 사용하지 않았다.

> 회차 MBNWEB-20260712-J의 계획 SHA-256 8B51E43AFC5F0E330A8DEF3B38DF071B071E5814FC96258AA9505935D1B43956을 다시 확인했다. 현재 PGM 대상 TAKE IN 5001 page 1 정확히 1회, OnScenePlayed 확인 후 자동 갱신 최대 1회, TAKE OUT All 정확히 1회와 DISCONNECT 1회를 승인한다. NEXT와 DB write 및 결과 불명확 시 재시도는 승인하지 않는다.

계획·helper·source·package·target 중 하나라도 바뀌거나 승인/preflight/runtime이 15분을
넘으면 해당 승인을 사용하지 않고 새 계획 또는 별도 cleanup 판단으로 돌아간다.

## 실행 결과 — 종료된 실패 회차

Round J는 재시도 없이 `FAIL_KNOWN_CLEANED`로 종료했다. 실행은
`2026-07-12T14:37:47.4048219Z`부터 `14:37:47.7401332Z`까지 0.3353113초였고,
승인 나이는 59.8392524초로 유효했다. `outcomeUnknown=false`다.

실패 원인은 Windows PowerShell 5.1에서 승인 시각을 검사할 때 `System.DateTime`과
`System.DateTimeOffset`을 직접 뺀 것이다.

> `Cannot find an overload for "op_Subtraction" and the argument count: "2".`

실패는 execution marker와 앱 시작보다 앞에서 발생했다. 따라서 앱 launch/CONNECT,
HELLO/native request, PREPARE, TAKE IN, NEXT, Page NEXT, DB write, TAKE OUT,
DISCONNECT, retry는 모두 0건이다. `gate-a-execution.json`, PREPARE journal,
runtime manifest, Network Monitoring delta, screenshot, Gate B 파일이 없는 것은
pre-launch 실패와 일치한다.

비명령 cleanup은 모두 성공했다. 앱/CDP listener, 설치된 Live 설정, 임시 설정,
DPAPI capability, read lease, armed window 상태는 남지 않았다. 사후 대상 확인에서도
Tornado PID/start ticks/30001 listener/실행 파일은 계획과 같았지만, 이는 Gate A runtime
증거가 아니라 실패 후 읽기 전용 관찰이다.

| 증거 | SHA-256 |
|---|---|
| Round J 계획 | `8B51E43AFC5F0E330A8DEF3B38DF071B071E5814FC96258AA9505935D1B43956` |
| Gate A 승인 | `F7337D737A9675F06E1B82EA3503C3445014E2DF2527453B4183560A4E6620FF` |
| Gate A 결과 | `BC6FBD867A7BAC01E5785AD6A3B488709FDBC5E778BDF4479D35CA73A02C19F1` |

Round J 승인과 명령 예산은 폐기했다. 같은 계획이나 승인을 재사용하지 않으며 수정본은
별도 [`MBNWEB-20260712-K`](LIVE_VALIDATION_PLAN_MBNWEB-20260712-K.md) 회차에서만
검증한다.
