docs: record round j gate failure and round k plan

This commit is contained in:
2026-07-13 00:12:50 +09:00
parent 5cb1aaca8f
commit 9f5be13a05
4 changed files with 212 additions and 14 deletions

View File

@@ -97,16 +97,52 @@ TAKE IN, 둘째 PLAY는 자동 갱신 한 번이다. 최종 callback을 drain한
`completed=1`, `maximum=1`, `limitReached=true`, `refreshActive=false`,
`playCompletionPending=false`, Web `CAPPED · 1/1`을 확인해야 한다.
## 승인 문구
## 승인 문구 — 역사 기록, 재사용 금지
Gate A 승인 문구는 아래 한 문장을 그대로 사용한다. 승인 시각은 15분 이내의 canonical
UTC로 별도 기록되며 K3D license가 현재 유효하다는 사용자 확인을 포함한다.
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 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) 회차에서만
검증한다.

View File

@@ -0,0 +1,120 @@
# 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분을
넘으면 승인을 사용하지 않고 새 회차로 돌아간다.

View File

@@ -14,7 +14,7 @@
| `s5025` trusted 수동 파일 | 외부 CP949 source 통합 검증 통과; 실제 파일/환경은 계속 Git 밖에서 회차별 preflight |
| `s5006` `Video\큐브배경.vrv` | 현재 승인 Cuts root에서 누락 |
| `s6001` 해외지수 영상 | 국가별 `Video\20201008_<국가>.vrv` 13개가 현재 승인 Cuts root에서 누락; 외부자산 필요 |
| 이번 마이그레이션 WebView workflow의 실제 Tornado2 검증 | **승인된 5001/5074 범위에서 Round H 실제 PGM 완료; 35개 전체의 실제 PGM 검증으로 확대 해석하지 않음** |
| 이번 마이그레이션 WebView workflow의 실제 Tornado2 검증 | **최신 성공은 승인된 5001/5074 범위 Round H. Round J는 pre-dispatch 명령 0건으로 종료됐고 수정된 Round K는 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 실제 명령은 보내지 않았다.
@@ -90,6 +90,32 @@ 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 승인이 필요하다.
### Round J pre-dispatch 실패와 Round K 시간 검증
Round J `MBNWEB-20260712-J`는 계획 SHA-256
`8B51E43AFC5F0E330A8DEF3B38DF071B071E5814FC96258AA9505935D1B43956`에 대한
Gate A 승인을 정확히 한 번 사용했지만, Windows PowerShell 5.1에서 승인 나이를
`System.DateTime - System.DateTimeOffset`으로 계산하면서 execution marker 전에
실패했다. 결과는 `FAIL_KNOWN_CLEANED`, `OutcomeUnknown=false`다. 앱 launch,
CONNECT, PREPARE, TAKE IN, NEXT, Page NEXT, DB write, TAKE OUT, DISCONNECT와
retry는 모두 0건이다. Gate A 결과 SHA-256은
`BC6FBD867A7BAC01E5785AD6A3B488709FDBC5E778BDF4479D35CA73A02C19F1`이다.
비명령 cleanup은 성공했고 앱/CDP/설정/capability/lease가 남지 않았다. J 승인과
명령 예산은 폐기하며 같은 계획으로 재시도하지 않는다.
Round K `MBNWEB-20260712-K`는 별도 회차이며 계획 SHA-256은
`8B25D2E9987AECF90526752CD9CF9BAB769D2DA4F689064334BE4039FC2E0BC6`이다.
승인 나이는 `[DateTimeOffset]::UtcNow`와 UTC `DateTimeOffset`끼리 계산하고,
`Math.Max`에는 `double` 인수를 명시해 소수초를 보존한다. Windows PowerShell 5.1
회귀시험은 `+5.000초` 허용/`+5.001초` 거부, `900.000초` 허용/`900.001초`
거부와 `60.125초` 보존을 확인한다. Gate A는 승인 파일 생성 뒤 정확히 계획·승인·
Live 설정·installed manifest·계획에 SHA로 묶인 helper 7개만 있는지 계획 해석 전과
capability 생성 직전에 검사한다. 폴더, reparse, 미지·임시·partial·static-test 파일,
누락과 중복은 모두 fail-closed다. K는 새 Gate A 승인을 받기 전에는 어떤 앱이나
Tornado 명령도 실행하지 않는다. 현재 승인 전 운영 폴더는 정확히 10개 파일이며,
Gate A 예산은 CONNECT 1회, PREPARE 5001/page 1 1회, 명확한 known-outcome 중단의
DISCONNECT 최대 1회다. TAKE IN, NEXT, Page NEXT, DB write와 retry는 0이다.
이 실제 Live PGM 증거는 회차에 허용된 5001과 5074에 한정된다. 35개 scene builder 전체 동등성은 자동 테스트, 55-query 실데이터 smoke와 [`SCENE_EQUIVALENCE.md`](SCENE_EQUIVALENCE.md) 매트릭스로 유지하며, 나머지 scene이 실제 PGM에서 각각 송출됐다는 의미로 기록하지 않는다.
## 화면/계약과 운영 검증의 분리

View File

@@ -107,13 +107,29 @@ Round I 계획에는 자동 refresh 1회가 허용됐지만 일부 예상 native
회차의 Gate B 승인 전에는 TAKE IN을 보내지 않는다. 결과 불명확 상태에서는
어떤 명령도 반복하지 않는다.
새 회차 계획은 [`LIVE_VALIDATION_PLAN_MBNWEB-20260712-J.md`](LIVE_VALIDATION_PLAN_MBNWEB-20260712-J.md)에 고정했다. 최종 계획 SHA-256은
`8B51E43AFC5F0E330A8DEF3B38DF071B071E5814FC96258AA9505935D1B43956`이다.
실제 operator workflow에서 다시 확인한 5001 입력
`KOSPI / 삼성전자 / 1열판기본 / CURRENT / 005930`, page 1, fade 6이다.
Round J 계획과 종료 결과는
[`LIVE_VALIDATION_PLAN_MBNWEB-20260712-J.md`](LIVE_VALIDATION_PLAN_MBNWEB-20260712-J.md)에
보존했다. 계획 SHA-256
`8B51E43AFC5F0E330A8DEF3B38DF071B071E5814FC96258AA9505935D1B43956`이고,
Gate A 승인 SHA-256은
`F7337D737A9675F06E1B82EA3503C3445014E2DF2527453B4183560A4E6620FF`,
Gate A 결과 SHA-256은
`BC6FBD867A7BAC01E5785AD6A3B488709FDBC5E778BDF4479D35CA73A02C19F1`이다.
J는 Windows PowerShell 5.1에서 `DateTime - DateTimeOffset` 승인 나이 계산이
실패해 execution marker와 앱 시작 전에 `FAIL_KNOWN_CLEANED`로 종료했다.
앱 launch, CONNECT, PREPARE와 금지 명령은 모두 0건이며 `outcomeUnknown=false`다.
비명령 cleanup은 성공했고 앱/CDP/설정/capability/lease가 남지 않았다. J 승인과
명령 예산은 폐기했고 재사용하지 않는다.
Gate A/B 자동화는 독립 정적 감사 P0/P1 0건, PowerShell 5.1/Node 구문,
교정된 selector 통합 모의시험, PREPARE·TAKE IN·TAKE OUT 이중 one-shot guard,
terminal correlation, DPAPI capability, config/cut read lease, exact Network Monitoring
39/117 marker multiset 검사를 통과했다. 계획을 고정한 시점에는 실제 Round J 명령
0건, Live 설정·capability 미설치, 앱/CDP listener 0 상태다.
수정된 새 회차는
[`LIVE_VALIDATION_PLAN_MBNWEB-20260712-K.md`](LIVE_VALIDATION_PLAN_MBNWEB-20260712-K.md)에
고정했다. 계획 SHA-256은
`8B25D2E9987AECF90526752CD9CF9BAB769D2DA4F689064334BE4039FC2E0BC6`이다.
승인 나이 산술을 `DateTimeOffset`끼리 수행하고 `Math.Max``double` overload를
명시했다. Windows PowerShell 5.1에서 미래 시각 `+5.000/+5.001초`, 승인 나이
`900.000/900.001초`, 소수 나이 `60.125초` 경계를 command-free로 검증했다.
이는 기존 구문 검사만으로 발견하지 못한 런타임 형식 의미를 직접 검증한다.
K Gate A는 승인 파일 생성 시 운영 폴더의 정확한 11개 allowlist를 두 번 검사하며,
정적 시험 파일·미지 파일·폴더·reparse·누락·중복을 capability 생성 전에 거부한다.
실제 operator workflow 입력은
`KOSPI / 삼성전자 / 1열판기본 / CURRENT / 005930`, page 1, fade 6으로 유지한다.