feat: add two-folder first-run playout setup

This commit is contained in:
2026-07-27 01:00:57 +09:00
parent 483b2785a0
commit ee82f0be42
14 changed files with 1753 additions and 278 deletions

View File

@@ -17,19 +17,24 @@
상사 PC에 이미 `Cuts`, `Res\MmoneyCoder.ini`, Tornado2/K3D x64와 장비 라이선스가 있다면
같은 항목을 다시 전달하지 않는다. 대신 기존 설치 위치가 이번 인수 대상이 맞는지 확인하고,
다음 값은 저장소가 아니라 승인된 사내 기록이나 전달 경로에서 확인한다.
다음 항목을 확인한다.
- DB endpoint와 계정 정보. 메신저 화면, 작업 기록 또는 Git에 값을 남기지 않는다.
- 기존 `Cuts``Res`의 공통 부모 경로, 그리고 실제 자격증명 INI 경로.
- 기존 코더가 실제 실행에 사용하던 서로 이웃한 `Cuts``Res` 폴더.
- Tornado2/K3D x64 설치본과 해당 장비용 라이선스 상태.
- 벤더 배포본 또는 관리자 검수로 **독립 승인된** native DLL과 Interop DLL의 SHA-256 두 개.
- 개발 PGM의 실제 Network Server TCP port, 창 제목, 출력 라우팅과 담당자 확인 정보.
- 개발 PGM의 로컬 Network Server가 회사 기본값 `127.0.0.1:30001`을 사용한다는 사실과
출력 라우팅.
해당 PC에 승인된 `Cuts`/`Res`가 없을 때만 `New-LegacyRuntimeBundle.ps1`로 생성한 runtime
bundle ZIP과 별도 신뢰 경로로 전달할 기대 SHA-256을 추가로 준비한다.
현재 설치된 DLL의 해시를 그 자리에서 계산한 뒤 같은 값을 승인값으로 삼지 않는다. 라이선스
파일, DLL, 인증서 또는 자산을 앱 폴더에 임의 복사해 등록·라이선스 검사를 우회하지 않는다.
첫 실행 설정은 예상 HKLM Registry64 등록, CLSID·ProgID·TypeLib, AMD64, vendor 폴더 배치와
HKCU override 부재를 먼저 검증한다. 모두 맞을 때만 현재 설치된 native/Interop 두 DLL의
SHA-256을 이 PC의 최초 기준으로 자동 고정한다. 이후 DLL이나 등록이 바뀌면 자동 재승인하지
않고 Development Live를 차단한다. 이 지속 기준은 사용자 전용
`%LOCALAPPDATA%\MBN_STOCK_WEBVIEW\Config\k3d-pins.local.json`에 저장하며 Git에는 넣지
않는다. 라이선스 파일, DLL, 인증서 또는 자산을 앱 폴더에 임의 복사해 등록·라이선스 검사를
우회하지 않는다.
## 1. 개발 장비와 대상 고정
@@ -37,8 +42,8 @@ bundle ZIP과 별도 신뢰 경로로 전달할 기대 SHA-256을 추가로 준
1. 이 PC와 로컬 Tornado2/PGM은 개발용이며 실제 방송 라우팅에 영향이 없다.
2. `Tornado2*` 프로세스는 정확히 하나이고 주 창 제목은 승인값과 정확히 일치한다.
3. Tornado2의 `Tools > Option > Control > Network Server > TCP Port`에 표시된 값을 직접
읽는다. 문서나 예제의 `30001`을 추정값으로 사용하지 않는다.
3. Tornado2의 `Tools > Option > Control > Network Server > TCP Port`가 지정 개발 환경의
회사 기본값 `30001`인지 확인한다. 다른 값이면 자동 첫 실행 설정을 사용하지 않는다.
4. 해당 TCP LISTEN 소유 PID와 Tornado2 PID가 같고, 실행 도중 프로세스 세대가 바뀌지 않는다.
5. `View > Network Monitoring Window`와 PGM 화면을 동시에 관찰할 담당자가 있다.
@@ -46,53 +51,58 @@ bundle ZIP과 별도 신뢰 경로로 전달할 기대 SHA-256을 추가로 준
## 2. 기존 자산 보유 PC: clone 후 1회 초기화
상사 PC처럼 승인된 자산과 벤더 설치가 이미 있는 경우에는 이 흐름을 우선 사용한다. 저장소를
clone한 뒤 Visual Studio를 열기 전에 저장소 루트의 PowerShell에서 다음 초기화기를 한 번
실행한다.
상사 PC처럼 승인된 자산과 벤더 설치가 이미 있는 경우에는 이 흐름을 우선 사용한다. 별도
PowerShell 명령은 필요 없다.
```powershell
powershell -NoProfile -ExecutionPolicy Bypass `
-File .\scripts\Initialize-ExistingDevelopmentPc.ps1 `
-LegacyRuntimeSourceRoot '<Cuts와 Res의 공통 부모>' `
-ConfigureDevelopmentLive `
-PlayoutHost 127.0.0.1 `
-PlayoutPort <Tornado2에서 직접 확인한 Network-Server-port> `
-NativeSha256 '<독립 승인된 native DLL SHA-256>' `
-InteropSha256 '<독립 승인된 Interop DLL SHA-256>'
```
1. 저장소를 clone하고 `MBN_STOCK_WEBVIEW.sln`을 Visual Studio 2026에서 연다.
2. `Debug|x64`, `Legacy Parity App (VS F5)`,
`MBN_STOCK_WEBVIEW.LegacyParityApp - Development Live (Package)`를 선택한다.
3. 첫 번째 F5로 소스 전용 첫 실행 설정 앱을 연다. 이 프로세스는 DB 미연결과 DryRun을
강제하고 Tornado2/PGM에 연결하지 않는다.
4. `Cuts 폴더 선택`에서 실제 실행 자산의 `Cuts` 폴더를 선택한다.
5. `Res 폴더 선택`에서 다음 파일들이 함께 있는 실제 설정 폴더를 선택한다.
`MmoneyCoder.ini`, `종목.ini`, `업종_코스피.ini`, `업종_코스닥.ini`, `해외.ini`,
`환율.ini`, `지수.ini`, `종목비교.ini`.
6. 두 폴더가 같은 공통 부모 아래의 정확한 `Cuts`, `Res`인지 확인하고 `설정 시작`을 누른다.
7. `설정 완료`가 표시되면 창을 닫고 F5를 한 번 더 누른다.
DB INI가 `<공통 부모>\Res\MmoneyCoder.ini`아닌 다른 위치에 있다면 검토한 절대 경로
`-DatabaseIniPath`로 추가한다. `-LegacyRuntimeSourceRoot`를 생략했을 때는 스크립트가
정확한 기본 형제 저장소 경로를 먼저 확인하고, 찾지 못하면 폴더 선택기를 연다. 선택기에서는
`Cuts``Res`를 함께 포함하는 `bin\Debug` 공통 부모를 선택한다. 그 바로 아래의 `Cuts`
또는 `Res`를 선택해도 스크립트가 공통 부모로 정규화한다. 이름이 비슷한 백업 폴더나 과거의
다른 빌드 출력은 선택하지 않는다. 비대화형 실행에서 선택기를 금지하려면
`-NoFolderPicker`를 추가하며, 이 경우 기본 형제 경로가 없으면 명시적 경로 없이 진행하지
않는다.
기존 승인 프로필이 별도 출력 채널을 사용하는 경우에만 확인된 숫자를
`-OutputChannel <verified-channel>`로 추가하고, 기본 player를 사용하는 경우에는 생략한다.
소스 트리의 오래된 `RES`, 백업 폴더, `MmoneyCoder - 복사본.ini`있는 다른 위치를
선택하지 않는다. 화면 입력은 `Cuts``Res` 두 폴더뿐이지만, 첫 실행 앱은
`MmoneyCoder.ini`를 포함한 **활성 INI 8개**를 모두 확인한다. 7개 UI INI는 각각 파싱하고
`MmoneyCoder.ini`는 DB 계약을 검증한다. 전체 Res를 무차별 복사하지 않고 폐쇄형 34개
allowlist만 runtime으로 구성하며, 자격증명 INI는 별도 사용자 전용 경로로만 복사한다.
개발 테스트 서버의 계정이라 노출을 허용하는 경우에도 자격증명을 Git이나 빌드 산출물에 넣지
않는 계약은 그대로 유지한다.
초기화기는 다음 작업을 한 번에 수행해야 한다.
- 로컬 `Cuts`/`Res` tree와 프로젝트가 요구하는 자산 계약을 읽기 전용으로 검증하고, 임시
bundle을 거쳐 사용자 전용
`%LOCALAPPDATA%\MBN_STOCK_WEBVIEW\RuntimeBundles\<ZIP-SHA256>`에 검증된 복사본을 설치한다.
- 저장소에서 제외되는 `Directory.Build.local.props`가 그 설치 root를
`LegacyRuntimeAssetsMode=Required`로 사용하게 한다.
- 설치 root를 명시적 MSBuild 속성으로 전달해, 저장소 binding을 아직 바꾸지 않은 상태에서
Debug x64 전체 자산 빌드를 먼저 검증한다.
- 기존 DB INI를 `%LOCALAPPDATA%\MBN_STOCK_WEBVIEW\Res\MmoneyCoder.ini`로 복사하고 현재
Windows 사용자 전용 ACL을 적용한다.
- K3D x64 등록 상태를 읽기 전용으로 점검한다.
- `-ConfigureDevelopmentLive`를 지정했을 때만 port와 독립 승인 해시를 검증하고 보호된 로컬
Development Live 설정을 모든 선행 검증이 끝난 마지막 단계에서 새로 발급한다.
- 별도 `-SkipBuild`를 주지 않은 기본 실행에서는 Debug x64 전체 자산 빌드 후 선택된 runtime
- K3D x64 등록 상태를 읽기 전용으로 점검하고 검증된 설치본의 native/Interop SHA-256을
사용자 전용 `Config\k3d-pins.local.json`의 최초 기준으로 자동 고정한다. 이 파일이 이미
있으면 같은 값을 재사용하고, 등록 DLL이 달라졌을 때 자동 갱신하지 않는다.
- Debug x64 전체 자산 빌드 후 선택된 runtime
root, Cuts/Res의 경로·길이·SHA-256·전체 파일 집합, SourceOnly가 아님과 DB INI가 빌드
출력에 들어가지 않았음을 검증한다.
- `127.0.0.1:30001` 개발 기본 endpoint의 보호된 로컬 Development Live 설정을 모든 선행
검증 뒤 새로 발급한다.
- 저장소에서 제외되는 `Directory.Build.local.props`를 마지막 성공 표식으로 원자 기록해
그 설치 root를 `LegacyRuntimeAssetsMode=Required`로 사용하게 한다.
초기화 과정 자체는 Tornado2/PGM에 `CONNECT`하거나 PREPARE, TAKE IN, NEXT, TAKE OUT 등의
명령을 보내지 않는다. 초기화 도중 오류가 나면 F5로 송출을 시도하지 말고 원인부터 바로잡는다.
`-ConfigureDevelopmentLive``-SkipBuild`는 함께 사용할 수 없으므로 실제 송출 설정 전에
전체 자산 빌드 검증을 생략할 수 없다. runtime 연결이나 DB overlay를 갱신한 뒤 선행 단계가
실패하면 기존 파일의 정확한 내용과 ACL을 복구하고, Live 승인 파일은 제거된 상태로 둔다.
runtime 연결이나 DB overlay를 갱신한 뒤 선행 단계가 실패하면 기존 파일의 정확한 내용과
ACL을 복구하고 Live 승인 파일은 제거된 상태로 둔다. 반면 K3D pin은 DLL 변경 뒤 재시도로
자동 승인되는 일을 막는 지속 신뢰 기준이므로, 최초 생성 또는 독립 검증에 따른 명시적 교체가
완료된 뒤 다른 설정 단계가 실패해도 그대로 보존한다.
`Directory.Build.local.props`는 모든 기능 설정이 끝난 뒤에만 기록하므로, 설정 창이나
Visual Studio가 그 전에 비정상 종료되면 다음 F5도 SourceOnly 첫 실행 화면으로 돌아와
같은 두 폴더로 다시 진행할 수 있다.
기본 초기화가 이미 빌드를 확인한다. 필요하면 같은 조건이 유지되는지 별도 MSBuild 인자나 환경
변수 없이 다음 명령으로 다시 확인할 수 있다.
@@ -105,22 +115,35 @@ dotnet build .\src\MBN_STOCK_WEBVIEW.LegacyParityApp\MBN_STOCK_WEBVIEW.LegacyPar
출력에 전체 runtime 자산이 활성화되었다는 메시지가 있어야 한다. 소스 전용 모드,
`bin\SourceOnly` 또는 `DryRun`만 표시되면 Development Live를 진행하지 않는다.
위 권장 명령의 최종 요약은 `K3DStatus=Valid`, `K3DComActivated=false`,
`BuildVerified=true`, `DevelopmentLiveRequested=true`여야 한다.
`DevelopmentLiveWritten=true`, `DevelopmentLiveReused=false`여야 한다. 경로와 해시가 포함된
전체 출력은 Git이나 일반 메신저에 붙이지 않는다.
같은 자산·DB·Live 설정으로 다시 실행하면 검증된 runtime과 DB는 재사용하지만, 기존 Live
승인은 먼저 무효화하고 전체 검증이 다시 성공한 뒤 새로 발급한다. 기존 값이 달라졌다면 자동으로
덮어쓰지 않으며, 변경 대상을 먼저 검토한 뒤 필요한 항목에만 각각
`-ReplaceRuntimeBinding`, `-ReplaceDatabaseProfile`, `-ReplaceLiveConfig`를 명시한다.
같은 clone에서는 이후 `git pull` 뒤 Visual Studio 2026에서 `Debug|x64`, 시작 대상
`Legacy Parity App (VS F5)`, 실행 프로필
`MBN_STOCK_WEBVIEW.LegacyParityApp - Development Live (Package)`를 선택해 F5로 시작할 수
있다. 저장소를 새 폴더에 다시 clone하거나 자산·DB·K3D·PGM 설정이 바뀐 경우에는 초기화기를
다시 실행한다. pull 뒤 Required 자산 검증이 실패하는 경우에도 F5를 반복하지 말고 초기화기를
다시 실행한다. 최초 실제 동작 확인은 아래 최소 인수 시퀀스의 `5001` 하나로 제한한다.
있다. 저장소를 새 폴더에 다시 clone하면 첫 실행 설정을 다시 진행한다. 자산·DB·K3D·PGM
설정이 바뀌었거나 pull 뒤 Required 자산 검증이 실패하 F5를 반복하지 말고 변경 원인을
검토한다. 특히 K3D DLL 변경은 첫 실행 화면을 반복해도 자동 승인되지 않는다. 최초 실제 동작
확인은 아래 최소 인수 시퀀스의 `5001` 하나로 제한한다.
### 화면 초기화를 사용할 수 없을 때
첫 실행 창을 열 수 없는 장애 대응에만 저장소 루트에서 다음 수동 등가 명령을 사용한다.
```powershell
powershell -NoProfile -ExecutionPolicy Bypass `
-File .\scripts\Initialize-ExistingDevelopmentPc.ps1 `
-LegacyRuntimeSourceRoot '<Cuts와 Res의 공통 부모>' `
-NoFolderPicker `
-ConfigureDevelopmentLive `
-PlayoutHost 127.0.0.1 `
-PlayoutPort 30001 `
-PinRegisteredK3D
```
기존 로컬 runtime, DB 또는 Live 설정과 다르면 자동으로 덮어쓰지 않는다. 변경 대상을 검토한
뒤에만 `-ReplaceRuntimeBinding`, `-ReplaceDatabaseProfile`, `-ReplaceLiveConfig` 중 필요한
항목을 명시한다. 수동 모드는 기존처럼 독립 승인된 `-NativeSha256``-InteropSha256`
사용할 수도 있으며, 이 두 값과 `-PinRegisteredK3D`는 함께 쓸 수 없다. 이 스크립트는 첫
실행 화면이 내부에서 사용하는 초기화 도구의 수동 fallback이며 일반 clone 절차의 선행
명령이 아니다.
## 3. 자산이 없는 PC 대안: 검증된 Git 밖 runtime bundle 설치
@@ -257,7 +280,7 @@ powershell -NoProfile -ExecutionPolicy Bypass `
검증으로 넘어가지 않는다. DB 연결 확인은 [DB 운영 가이드](DATABASE.md)의 read-only smoke만
먼저 수행하고, 실패 시 Tornado 명령을 보내지 않는다.
## 5. K3D 설치, 라이선스와 승인 해시 확인
## 5. K3D 설치, 라이선스와 기준 해시 확인
벤더 절차로 Tornado2/K3D x64와 장비 라이선스를 먼저 설치한다. 저장소의 점검은 레지스트리와
파일을 읽을 뿐 COM을 활성화하지 않는다. 2단계 초기화는 이 검사를 항상 수행하고 `Valid`,
@@ -271,23 +294,60 @@ powershell -NoProfile -ExecutionPolicy Bypass `
Registry64, TypeLib/CLSID 양방향 매핑, `Apartment`, AMD64 PE, HKCU override 부재 검사가 모두
성공해야 한다. 점검 성공은 라이선스 성공을 대신하지 않으므로 벤더 방식으로 라이선스도 별도
확인한다. native와 Interop의 실제 파일은 각각 독립 승인된 SHA-256과 일치해야 하며 둘 중 하나라도
다르면 중단한다.
확인한다. 첫 실행 설정은 이 검사를 통과한 native와 Interop 파일의 SHA-256을 최초 기준으로
고정하며, 이후 실제 파일이 기준값과 하나라도 다르면 중단한다. 수동 승인 모드에서는 두 파일이
각각 독립 승인된 SHA-256과 일치해야 한다.
지속 pin 파일의 경로는 다음과 같다.
```text
%LOCALAPPDATA%\MBN_STOCK_WEBVIEW\Config\k3d-pins.local.json
```
이 파일은 정확한 JSON 계약과 현재 Windows 사용자 전용 ACL로 원자적으로 생성된다. 최초
기준이 고정된 뒤에는 나머지 설정의 성공 여부와 무관하게 파일을 삭제하거나 편집해 새 DLL을
승인하지 않는다.
### K3D DLL이 정식으로 교체된 경우
벤더 업데이트 등으로 DLL이 의도적으로 바뀌었다면 두 파일을 별도 배포 증적이나 관리자 검수로
독립 확인한 뒤에만 수동 fallback을 사용한다. 현재 설치 파일에서 계산한 값만 보고 같은
값을 승인하지 않는다. 일반적인 교체 명령은 다음과 같으며
`-ReplaceK3DPin``-PinRegisteredK3D`와 함께 사용할 수 없다.
```powershell
powershell -NoProfile -ExecutionPolicy Bypass `
-File .\scripts\Initialize-ExistingDevelopmentPc.ps1 `
-LegacyRuntimeSourceRoot '<Cuts와 Res의 공통 부모>' `
-NoFolderPicker `
-ConfigureDevelopmentLive `
-PlayoutHost 127.0.0.1 `
-PlayoutPort 30001 `
-NativeSha256 '<independently-verified-64-hex-native-sha256>' `
-InteropSha256 '<independently-verified-64-hex-interop-sha256>' `
-ReplaceK3DPin `
-ReplaceLiveConfig
```
runtime이나 DB 위치도 의도적으로 달라졌을 때만 각각 `-ReplaceRuntimeBinding`,
`-ReplaceDatabaseProfile`을 추가한다. 해시가 실제 등록 파일과 다르거나 K3D 등록 검사가
실패하면 기존 pin을 보존하고 중단한다.
## 6. 보호된 로컬 송출 설정
2단계 초기화에 `-ConfigureDevelopmentLive`와 필수 값을 주었다면 아래 설정 두 파일도
마지막 단계에서 검증 후 새로 발급다. 기존 승인은 매번 먼저 무효화하며 runtime·DB·Debug
빌드가 모두 성공하지 않으면 새 Live 승인 파일을 남기지 않는다. 자산 없는 PC의 3단계 bundle 흐름처럼 설정만 별도로
초기화해야 할 때는 저장소 루트에서 다음 스크립트를 실행한다. port는 이번에 Tornado2 화면에서
직접 확인한 값이고, 두 해시는 독립 승인값이어야 한다. 기존 승인 프로필이 별도 출력 채널을
사용할 때만 검증된 숫자를 `-OutputChannel`로 추가하며, 기본 player를 쓰는 경우에는 생략한다.
2단계 첫 실행 설정은 지속 K3D pin을 확인한 뒤 아래 송출 설정 두 파일도 마지막 기능 설정
단계에서 검증 후 새로 발급다. 기존 승인은 매번 먼저 무효화하며 runtime·DB·Debug 빌드가 모두
성공하지 않으면 새 Live 승인 파일을 남기지 않는다. 자산 없는 PC의 3단계 bundle 흐름처럼
설정만 별도로 초기화해야 할 때는 저장소 루트에서 다음 스크립트를 실행한다. 이 수동 경로의
두 해시는 별도로 확인한 값이어야 한다. 지정 개발 PC의 endpoint는
`127.0.0.1:30001`로 고정한다. 기존 승인 프로필이 별도 출력 채널을 사용할 때만 검증된 숫자를
`-OutputChannel`로 추가하며, 기본 player를 쓰는 경우에는 생략한다.
```powershell
powershell -NoProfile -ExecutionPolicy Bypass `
-File .\scripts\Initialize-DevelopmentLiveConfig.ps1 `
-PlayoutHost 127.0.0.1 `
-PlayoutPort <verified-network-server-tcp-port> `
-PlayoutPort 30001 `
-NativeSha256 '<independently-approved-64-hex-native-sha256>' `
-InteropSha256 '<independently-approved-64-hex-interop-sha256>'
```
@@ -309,7 +369,7 @@ powershell -NoProfile -ExecutionPolicy Bypass `
|---|---|
| `mode` | 항상 `DryRun`. Development Live 프로세스만 일시적으로 Live로 덮어쓴다. |
| `host` | 로컬 PGM이면 숫자형 loopback `127.0.0.1`. `localhost` 또는 원격 주소를 추정하지 않는다. |
| `port` | Tornado2 화면에서 이번에 직접 확인한 Network Server TCP port |
| `port` | 지정 개발 환경의 고정 Network Server TCP port `30001` |
| `tcpMode` / `clientPort` | `1` / `0` |
| `sceneDirectory` | `null`. 검증된 로컬 runtime이 빌드 출력에 배치한 기본 `Cuts`를 사용한다. |
| `outputChannel` | 승인된 개발 PGM 라우팅 값. 기존 승인 프로필이 기본 player를 쓰는 경우에만 `null` |
@@ -357,8 +417,10 @@ scene root는 실행 파일 옆 검증된 `Cuts`로 마지막에 다시 고정
}
```
주석, trailing comma, 중복·추가 속성을 넣지 않는다. 두 해시와 승인 근거는 Git 밖에 보관한다.
현재 설치 파일에서 즉석 계산한 값으로 placeholder를 채우지 않는다. 자세한 strict 파일 규칙은
주석, trailing comma, 중복·추가 속성을 넣지 않는다. 수동 승인 모드의 두 해시와 승인 근거는
Git 밖에 보관하고 현재 설치 파일에서 즉석 계산한 값으로 placeholder를 채우지 않는다. 첫 실행
설정은 지속 K3D pin을 먼저 검증한 뒤 그 기준값으로 이 Live 승인 파일을 생성한다. 자세한
strict 파일 규칙은
[Visual Studio Development Live 설정](DEVELOPMENT_LIVE_VISUAL_STUDIO.md)을 따른다.
## 7. 정확한 로컬 PGM 연결 전용 확인
@@ -375,7 +437,7 @@ dotnet run --project .\tools\MBN_STOCK_WEBVIEW.PlayoutSmoke `
--pgm-connect-diagnostic `
--i-understand-this-will-contact-current-pgm-tornado-via-ktap-connect-and-disconnect-only `
--host 127.0.0.1 `
--port <verified-network-server-tcp-port> `
--port 30001 `
--expected-pgm-window-title PGM
```
@@ -421,9 +483,9 @@ Live 앱을 종료하면 부트스트랩이 만든 Live 환경은 프로세스
- 지정 개발 PC와 정확한 로컬 PGM 대상 확인
- 기존 자산 또는 외부 bundle에서 설치한 검증된 로컬 runtime과 허용 scene 확인
- K3D x64 등록, 장비 라이선스와 두 독립 승인 해시 확인
- K3D x64 등록, 장비 라이선스, 지속 pin과 자동 고정 또는 수동 승인된 두 기준 해시 확인
- 개발 DB read-only smoke 성공
-`%LOCALAPPDATA%` 설정 파일의 내용·ACL 검증
- 지속 K3D pin과`%LOCALAPPDATA%` 송출 설정 파일의 내용·ACL 검증
- connect-only 진단과 최소 5001 회차가 retry 0, `OutcomeUnknown=false`로 종료
- 최종 TAKE OUT/IDLE, DISCONNECT와 Explicit DryRun 재시작 확인
- 누락 영상 14개 관련 action이 제한 상태임을 인수자에게 고지
@@ -438,7 +500,7 @@ Git 밖 인수 기록에만 보관한다.
`Directory.Build.local.props`
- `Res\MmoneyCoder.ini`, `database.local.json`과 DB 자격증명
- `playout.local.json`, `playout.development-live.local.json`,
`runtime-folders.local.json`
`runtime-folders.local.json`, `k3d-pins.local.json`
- Tornado/K3D native DLL, Interop DLL, 라이선스 파일·키
- native/Interop 승인 해시와 승인 근거
- MSIX 서명 인증서, 개인 키와 암호