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

최종 계획 작성 시각: 2026-07-13 00:02 KST

계획 JSON: 14,794 bytes
계획 SHA-256:
`8B25D2E9987AECF90526752CD9CF9BAB769D2DA4F689064334BE4039FC2E0BC6`

계획 원본은 Git 제외 로컬 파일
`artifacts\pgm-evidence\MBNWEB-20260712-K\round-plan.json`이다. 계획 고정 시점의
Round K 실제 앱·Tornado2 명령은 0건이며 승인, 앱, CDP listener, 설치된 Live 설정,
DPAPI capability도 없다.

Round K는 Round J의 retry나 남은 예산 사용이 아니다. 새 회차·새 계획·새 one-shot
예산이며 새 승인을 요구한다.

## 이전 회차 결박

| 항목 | 값 |
|---|---|
| Round J status | `FAIL_KNOWN_CLEANED`, `outcomeUnknown=false` |
| Round J 계획 | `8B51E43AFC5F0E330A8DEF3B38DF071B071E5814FC96258AA9505935D1B43956` |
| Round J Gate A | `F7337D737A9675F06E1B82EA3503C3445014E2DF2527453B4183560A4E6620FF` |
| Round J 결과 | `BC6FBD867A7BAC01E5785AD6A3B488709FDBC5E778BDF4479D35CA73A02C19F1` |
| J 실제 앱 launch/vendor command | `0 / 0` |

J는 Windows PowerShell 5.1의 `DateTime - DateTimeOffset` 연산 오류로 execution marker
전에 끝났다. J 승인과 결과는 K authorization으로 복사하거나 재사용하지 않는다.

## 수정 및 명령 없는 회귀시험

Gate A 승인 나이 계산을 같은 형식끼리 수행하고 `Math.Max`의 `double` overload를
명시했다.

```powershell
$age = [DateTimeOffset]::UtcNow - $approvalAtUtc.ToUniversalTime()
return [Math]::Max([double]0, [Math]::Round([double]$age.TotalSeconds, 3))
```

실제 Windows PowerShell 5.1에서 다음을 검증했다.

| 경계 | 결과 |
|---|---|
| 기존 혼합 형식 연산 | J와 같은 `MethodException` 재현 |
| 기존 `Math.Max(0, 60.125)` | `Int32 60` 손실 재현 |
| 미래 `+5.000초` | 허용, `double 0`으로 clamp |
| 미래 `+5.001초` | 거부 |
| 승인 나이 `900.000초` | 허용, `double 900` |
| 승인 나이 `900.001초` | 거부 |
| 승인 나이 `60.125초` | `double 60.125` 보존 |

정적 시험은 운영 회차 폴더 밖에 보관한다.

- PowerShell: `E9118D2FDCF0D79EA8D67EBF4D8F30B9478D4CA7C7EA8D9C61DB7BD25AA5F1AC`
- Node temporal: `EB81A5F3EA69CA9B8D80507694673D84B78DE9E57C73CBF3EE9775C274FE50D9`

## 동결된 입력과 helper

package, Live 설정, 설치 manifest, cut과 selector는 J의 승인된 값과 같다.

- MSIX: `1B0BA713619CC3BD7CB3E03D78FD1EB1CEAF49E7D50F5C00DDFB483917BA5437`
- 설치 runtime: `168D1FB8D6487C41C8CEAA828B4D9515A38DB3A970F8EB44FA930ABDD577B8E9`
- 설치 289-file manifest: `9234575267F7D1A8A1045246E5128BD755CE9A3976DA83EE00A1AF4ABEE51552`
- Live 설정: `63C6F386D73D8740B7B10994668ED14D95C3D7B68025B0DF034C3F18D660E582`
- cut: 5001.t2s, 895,922 bytes,
  `99CE3B689A42D8C42BEB09A86FA10C2D7C1AEF4F50D324D81276C1A1E4C4D8A7`
- selector: `KOSPI / 삼성전자 / 1열판기본 / CURRENT / 005930`, page 1, fade 6

| helper | SHA-256 |
|---|---|
| `round-k-gate-a.ps1` | `F45D4506F988A8C01051C94D505E9C26536C9ADF197864FB0B77D75A1E167A13` |
| `round-k-gate-a-cdp.mjs` | `A337C3A7EA1A087BBBA135F64E257A2CD01A4109033CE78CC6FB36F1C3D6BC25` |
| `round-k-gate-b.ps1` | `9B26968D7A28E8AAD0DB3F7806225D3FE5A9D4B28E3658DDB6781D5F5A2418BF` |
| `round-k-gate-b.mjs` | `28F87538BB0CBC285322CA08BC691C97601F0F7AFCC8AC93DCD2919E14F6EA69` |
| `round-k-window-arm.ps1` | `EFB649F804727BAD9D1FD31E48DB48D3BEF65E885E1355BB611390F2A2C5B07B` |
| `round-k-desktop.ps1` | `1E3ABAE50B1337AEA5CCE05CC8125D04F4D6AA0FC2441FD98381B5165032175A` |
| `round-k-monitor.ps1` | `B1CFEBC4A35347ADE5B1B402641EEA19A6975997C05C2726C74D1F4E72694B30` |

독립 감사 결과 P0/P1은 0건이다. K helper에는 J 식별자가 없고, Gate A/B의 capability,
lease, selector, terminal correlation, OutcomeUnknown, exact target/runtime binding은 그대로
유지된다.

## 폐쇄형 prearm

승인 전 운영 K 폴더는 정확히 10개 파일이어야 한다. `gate-a.json`을 생성한 실행
시점에는 다음 11개만 허용한다.

1. `round-plan.json`, `gate-a.json`, `live-config.json`, `installed-runtime-manifest.json`
2. 위 표의 helper 7개

폴더, reparse, 미지 파일, `*.tmp`, partial, static-test, 누락·중복은 capability 생성 전에
거부한다. 이 검사는 계획/승인 해석 전과 capability 초기화 직전에 두 번 수행한다.

## 명령 예산과 예상 증거

Gate A는 CONNECT 1회와 PREPARE 5001/page 1 1회만 허용한다. TAKE IN, NEXT,
Page NEXT, DB write는 0이다. 명확한 known-outcome 중단에서만 정상 종료에 의한
DISCONNECT 최대 1회를 허용한다.

Gate B는 별도 즉시 승인 뒤 TAKE IN 1회, 자동 갱신 최대 1회, TAKE OUT All 1회,
DISCONNECT 1회를 단일 observer로 수행한다. NEXT, DB write, retry는 0이다.

- Gate A 완료 `[R]`: 정확히 39 marker
- Gate B 최종 누적 `[R]`: 정확히 117 marker, 의미상 vendor request 114
- 누적 PREPARE/PLAY/OnScenePlayed: cap 도달 전 `3 / 2 / 2`
- 최종 refresh: `completed=1`, `maximum=1`, `limitReached=true`, `CAPPED · 1/1`

## 승인 문구

Gate A는 다음 한 문장을 그대로 승인받아야 한다.

> 회차 MBNWEB-20260712-K의 계획 SHA-256 8B25D2E9987AECF90526752CD9CF9BAB769D2DA4F689064334BE4039FC2E0BC6을 승인한다. 현재 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 뒤에만 사용한다.

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

source, package, installed runtime, Live 설정, cut, selector, 대상
PID/start/listener/window, helper 또는 계획이 바뀌거나 승인/runtime/preflight가 15분을
넘으면 승인을 사용하지 않고 새 회차로 돌아간다.

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

Round K는 재시도 없이 `FAIL_KNOWN_CLEANED`로 종료했다. 실행은
`2026-07-12T15:45:34.7388928Z`부터 `15:45:36.8986737Z`까지 2.1597809초였고,
승인 나이는 시작 시점 기준 35.6419872초로 유효했다. `outcomeUnknown=false`다.

실패 원인은 설치 runtime manifest가 Gate A의 strict ordinal 정렬 규약을 만족하지
않은 것이다.

> `The installed runtime manifest is not unique and ordinally sorted.`

manifest는 289개 항목과 exact/OrdinalIgnoreCase 중복 0개를 유지하지만 PowerShell
`Sort-Object -Property path`의 문화권 정렬 결과였다. `[StringComparer]::Ordinal`로
비교하면 역전이 41개이며 첫 역전은 `clrjit.dll` 다음
`Config/appsettings.example.json`이다. 기존 manifest SHA-256은
`9234575267F7D1A8A1045246E5128BD755CE9A3976DA83EE00A1AF4ABEE51552`다.

실패는 execution marker, capability 생성과 앱 시작보다 앞에서 발생했다. 따라서 앱
launch, CONNECT/HELLO, PREPARE, TAKE IN, NEXT, Page NEXT, DB write, TAKE OUT,
DISCONNECT와 retry는 모두 0건이다. `prepareIssued=false`,
`prepareMayHaveBeenIssued=false`이며 명령 결과는 명확하다.

비명령 cleanup은 성공했다. 앱/CDP listener, 설치된 Live 설정, 임시 설정, DPAPI
capability와 관련 환경 변수는 남지 않았다. Tornado PID/start ticks와 30001 listener는
계획과 동일하게 유지됐다.

| 증거 | bytes | SHA-256 |
|---|---:|---|
| Round K 계획 | 14,794 | `8B25D2E9987AECF90526752CD9CF9BAB769D2DA4F689064334BE4039FC2E0BC6` |
| Gate A 승인 | 1,085 | `BC1A1F5D4C2CBE60DCD206F284C5CC5CB664AC9DBF576F94F139987562372ED1` |
| Gate A 결과 | 3,366 | `E17FE1EE451A5D9E2B73CCB3D039B5AA90998CC35E3E973148614D32E76D1482` |

Round K 승인과 명령 예산은 폐기했다. 같은 계획이나 승인을 재사용하지 않으며 strict
ordinal 검사는 완화하지 않는다. 수정본은 별도
[`MBNWEB-20260712-L`](LIVE_VALIDATION_PLAN_MBNWEB-20260712-L.md) 계획과 새 승인으로만
검증한다.
