feat: make LegacyParityApp playout live-only
This commit is contained in:
@@ -14,7 +14,7 @@
|
||||
|
||||
| 항목 | 상태 |
|
||||
|---|---|
|
||||
| 기본 모드 | `DryRun`; COM 객체와 `KTAPConnect`를 만들지 않음 |
|
||||
| 지정 개발 PC 기본 모드 | 보호된 `Live`; 승인·설정 불변식 실패 시 기동 차단, 자동 `DryRun` 폴백 없음 |
|
||||
| 자동 테스트 | 최신 Release x64 .NET solution 3,182/3,182, LegacyParityWeb 150/150, WebPlayout JavaScript 424/424, 원본 scene 기준선 35/35와 staged PGM 정적 계약 통과; 실패·skip 0건 |
|
||||
| 개발 MSIX UI/DB | 최신 등록 AppX에서 실제 Windows 입력 1,838건으로 UC1~UC7, GraphE, FSell, VIList, ThemeA, EList, PList 모달, 설정·비교 가져오기와 개발 DB 저장→fresh readback→delete/absence를 검증하고 cleanup 완료 |
|
||||
| 고객 배포 MSIX | 현재 범위에서 보류. 고객용 version·Publisher·서명 인증서·업데이트와 새 PC 로컬 설정 배포는 사용자가 재개할 때 결정 |
|
||||
@@ -174,8 +174,8 @@ SHA-256 `7A1141C5F276729E340227CEEAA48B0E6018632BBA51F43AA94636084AA3C301`이며
|
||||
|
||||
## 절대 안전 규칙
|
||||
|
||||
1. 앱의 기본값은 항상 `DryRun`으로 유지한다.
|
||||
2. `DryRun`, `--probe`, `--dry-run`, `--test-plan`은 `KTAPConnect`를 호출하지 않는다. 이때 Tornado2 Network Monitoring에 기록이 없는 것이 정상이다.
|
||||
1. 지정 개발 PC의 앱은 보호된 `Live`로만 기동하고 `DryRun`으로 전환하지 않는다.
|
||||
2. `--probe`와 `--test-plan`은 `KTAPConnect`를 호출하지 않는다. 이때 Tornado2 Network Monitoring에 기록이 없는 것이 정상이다.
|
||||
3. 실제 출력은 허용된 테스트 scene, 지정된 PGM, 지정된 회차 범위에서만 수행한다.
|
||||
4. 운영·방송 또는 비지정 환경은 아래 Gate A/B의 회차별 승인을 적용한다. 현재 지정 개발 PC는 [개발 환경 상시 권한](DEVELOPMENT_ENVIRONMENT_AUTHORIZATION.md)의 범위·대상 확인·기술적 중단 조건을 적용하며 별도 대화 승인을 반복하지 않는다.
|
||||
5. 회차 범위에 없는 NEXT, Page NEXT, TAKE OUT 이외 명령 또는 다른 scene으로 범위를 넓히지 않는다.
|
||||
@@ -301,9 +301,9 @@ PREPARE 결과와 Network Monitoring 상태를 운영자가 확인한 후, TAKE
|
||||
5. K3D Registry64, AMD64 PE, TypeLib/Interop metadata, 두 SHA-256 pin, license를 확인한다. DLL을 repo 또는 앱 폴더로 복사해 우회하지 않는다.
|
||||
6. 정확히 하나의 승인 대상 Tornado2 프로세스, PGM 창, Network Server TCP port와 LISTEN 소유권을 확인한다. 매뉴얼 예시 port를 추정해 사용하지 않는다.
|
||||
7. `s5025`를 선택했다면 trusted 외부 디렉터리와 파일 preflight가 성공해야 한다. `s5006`은 `Video\큐브배경.vrv`, `s6001` 해외지수는 선택 국가에 해당하는 `Video\20201008_<국가>.vrv`가 승인 asset root 안에 있어야 한다. coverage 결과의 `MissingAssets`, `RootEscapes`, `ReparseAssets` 중 하나라도 0이 아니면 해당 장면으로 진행하지 않는다.
|
||||
8. 실제 COM을 사용하는 Test/Live playlist의 모든 cut이 로컬 폐쇄형 allowlist 안에 있고 selector가 closed enum/lookup 규칙을 통과하는지 DryRun에서 확인한다. allowlist가 비어 있으면 실제 모드 초기화 자체를 거부해야 한다.
|
||||
9. 로컬 playout 설정의 `legacySceneFadeDuration` 기본값 6과 `legacySceneBackgroundKind`를 확인한다. 공통 background를 쓸 때 `legacySceneBackgroundAssetPath`는 `sceneDirectory` 아래의 승인된 상대 경로여야 한다. `PlayoutSceneCompositionFactory`의 DryRun preflight가 파일 존재, 허용 확장자, root 탈출, 절대 경로와 reparse point를 모두 거부하는지 확인한다. Web에는 이 asset 경로를 보내지 않는다.
|
||||
10. Web DryRun에서 45개 active alias, row별 `enabled`, PREPARE 뒤 snapshot freeze, current entry/builder/page size/current rows/last-page/preview와 refresh 상태를 확인한다. pending command와 `OutcomeUnknown`/timeout quarantine에서도 playlist 편집이 잠겨야 한다. preview에 image/texture/video 경로가 나타나면 실제 회차를 중단한다.
|
||||
8. 실제 COM을 사용하는 Test/Live playlist의 모든 cut이 로컬 폐쇄형 allowlist 안에 있고 selector가 closed enum/lookup 규칙을 통과하는지 정적 계약 테스트에서 확인한다. allowlist가 비어 있으면 실제 모드 초기화 자체를 거부해야 한다.
|
||||
9. 로컬 playout 설정의 `legacySceneFadeDuration` 기본값 6과 `legacySceneBackgroundKind`를 확인한다. 공통 background를 쓸 때 `legacySceneBackgroundAssetPath`는 `sceneDirectory` 아래의 승인된 상대 경로여야 한다. `PlayoutSceneCompositionFactory` preflight가 파일 존재, 허용 확장자, root 탈출, 절대 경로와 reparse point를 모두 거부하는지 확인한다. Web에는 이 asset 경로를 보내지 않는다.
|
||||
10. Web 계약 테스트에서 45개 active alias, row별 `enabled`, PREPARE 뒤 snapshot freeze, current entry/builder/page size/current rows/last-page/preview와 refresh 상태를 확인한다. pending command와 `OutcomeUnknown`/timeout quarantine에서도 playlist 편집이 잠겨야 한다. preview에 image/texture/video 경로가 나타나면 실제 회차를 중단한다.
|
||||
|
||||
하나라도 실패하면 회차를 시작하지 않는다. 설정을 수정한 뒤 처음부터 새 preflight 결과를 만든다.
|
||||
|
||||
@@ -396,7 +396,8 @@ vendor monitor의 실제 명령 표기는 버전에 따라 다를 수 있으므
|
||||
|
||||
| 상황 | 즉시 조치 | 재시도 조건 |
|
||||
|---|---|---|
|
||||
| DB/selector/asset preflight 실패, COM 호출 전 명시적 `Rejected` | 회차 중단, DryRun으로 복귀, 원인 기록 | offline 수정과 전체 preflight 후 새 회차 승인 |
|
||||
| 승인/설정/allowlist 불변식 실패, COM 호출 전 명시적 `Rejected` | Live 엔진 기동 차단, 원인 기록 | offline 수정과 전체 preflight 후 새 실행 |
|
||||
| DB/K3D/PGM 일시 장애 | Live 엔진을 `Disconnected`/`Faulted`로 유지하고 명령 전송 중단 | 원인 수정 후 known state에서 명시적 CONNECT |
|
||||
| Connect timeout 또는 `OnHello`/monitor 불일치 | 결과를 불명확으로 격리, Connect 반복 금지 | 운영자가 세션과 process/port 상태를 확인한 뒤 새 회차 승인 |
|
||||
| PREPARE/TAKE IN/NEXT/refresh/TAKE OUT timeout | `OutcomeUnknown`으로 취급, 같은 명령과 반대 명령 자동 실행 금지 | PGM/monitor/콜백을 사람이 확인하고 출력 안전을 복구한 뒤 새 회차 승인 |
|
||||
| `WEB_TIMEOUT` | strict timeout-quarantine message를 native에 전달. MainWindow가 process-lifetime latch를 먼저 세우고 vendor session을 quarantine; 늦은 응답, UI 재시도와 WebView reload로 해제 금지 | native status와 PGM을 사람이 대조하고 process를 새로 시작한 뒤 새 승인 |
|
||||
|
||||
Reference in New Issue
Block a user