# 아이서티 시나리오 증분 배포

기준 source: `40a788c3d7ec6a8ad81a1c84731de56f68f1af89`와 이번 변경 snapshot.
2026-09-21 현장 서비스 준비 완료이며 카메라 Start/정확도/브라우저 수용은 별도다.

## 범위

- 기존 Medium·인증·Redis ACL·DB/Event 원장·Artifact를 보존한다.
- 침입/배회는 Medium, FALL/FIGHT 포함 시 Pose 하나와 Tracking을 공유한다.
- FIRE와 CROWD는 각각 단독이다. CROWD는 P/H 표시만 하며 Event/Artifact를 만들지 않는다.
- FIGHT는 임시 heuristic이며 실제 폭행 인식 정확도를 보장하지 않는다.
- test Runtime, 관제와 비대상 서비스는 변경하지 않는다.

## 패키지와 원장

최종 배포세트는 `/data/contextra/deployment-artifacts/icerti-incremental-20260921-r02/`다.
source/native/새 CROWD ONNX/도구/가이드/파일 hash만 포함하고 개인키·token·비밀번호·test engine은 제외한다.
원본 FULL manifest/archive와 초기 r01 실패 recipe는 수정하지 않고 보존한다.
최종 r02는 수정된 recipe와 host 도구를 합친 재사용용 snapshot이며 image/model을 다시 만들었다는 뜻은 아니다.

현장 적용 원장은 `/opt/contextra/state/transactions/incremental-20260921-r03/`이며
`compose.json`, `applied.json`이 exact image/model/config를 소유한다.
`state/active.json`의 `incremental_patch`와 `state/site.json`의 마지막 private overlay를 함께 읽는다.
기존 `current`/release_id는 FULL 기반을 가리키며 최신 실행 소스를 뜻하지 않는다.
과거 receipt의 미실행 상태는 당시 기록으로 보존한다.

`deployctl`은 별도 `deploy-tools/scenarios-20260921-r01`을 사용한다. 증분 상태에서는 일반
deploy/rollback을 `INCREMENTAL_REVIEW_REQUIRED`로 차단한다. 다음 변경은 이 원장의 exact
Compose/image/model/config를 검토한 후 진행하며 구형 FULL 도구로 덮어쓰지 않는다.

## 빌드와 모델

로컬 base tag의 실제 ID를 manifest와 대조한 뒤 network none으로 source layer를 조립한다.
`FROM sha256:<manifest>`는 registry 이름으로 해석될 수 있으므로 사용하지 않는다.
native/probe는 기존 SDK helper에서 CPU4/RAM8GiB/timeout으로 컴파일한다. 새 SDK·package 설치는 없다.
모델 helper는 CPU4/RAM12GiB, GPU 독점 확인, 후보별 timeout과 디스크15GiB 하한을 사용한다.
완료된 후보를 재변환하지 않고 원장·hash부터 확인한다.

모델 repository는 `/training/contextra/models/releases/scenarios-20260921-r02` 하나를 read-only mount한다.
모든 모델 instance8, batch min/opt/max1/4/4, queue5ms다. Medium/Pose/Fire576, CROWD512이다.
입력FP16·출력FP32를 유지하며 Pose/Fire/CROWD는 현장 Blackwell에서 새로 변환·격리 검증했다.
Medium engine은 기존 검증본을 재사용했다. A6000 engine을 복사하지 않았다.
JSON key 정렬 이후에도 Pose pbtxt 출력 순서가 유지되도록 생성기를 보완했다.

## FALL 현장 기본값

공용 `FallConfig.test_skip_down_hold` 기본값은 Off다.
현장 Analytics의 persistent overlay에 `CONTEXTRA_FALL_SKIP_DOWN_HOLD_DEFAULT=true`를 적용한다.
설정에 값이 없으면 On을 적용하고, 명시적 채널 `false`는 우선 보존한다. Web Start도 보존한다.
이 옵션은 정상 DOWN_CANDIDATE 진입 후 0.7초 대기만 생략하며 선행 자세/전이/ROI 조건을 완화하지 않는다.
오탐 증가 가능성이 있으므로 현장 시연 후 재검토한다. bbox 검출률·Tracking 단절을 해결하지 않는다.

개별 Off 복귀는 수동 Stop/회수 확인 후 Settings GET의 `configured.revision`을 사용해
PATCH `{"expected_revision":"<revision>","fall":{"test_skip_down_hold":false}}`를 적용한다.
전체 기본 Off는 overlay env를 false로 바꾼 뒤 승인된 대상 서비스 전환이 필요하다.
이미 명시적으로 저장된 true는 별도 CAS 변경 없이 바뀌지 않는다.

## 수용 범위

4모델 READY, WSS bootstrap, 내부 Redis reader read/관리명령 거부, Artifact On/HTTP On,
3채널 stopped, source114파일 hash 일치와 기존 원장/인증/비대상 보존을 확인했다.
idle GPU 사용량은4778/24467MiB였다. 이는 채널 처리량·최대부하 수용 결과가 아니다.
Gateway에는 Docker healthcheck가 없으므로 `nginx -t`와 실제 WSS로 준비 상태를 확인한다.

사용자는 현장 브라우저에서 카메라별 시나리오/ROI/confidence를 정하고 수동 Start한다.
FIRE/CROWD는 다른 시나리오를 Off로 둔다. 시작 후 cameraId를 알려주면 별도 최소 교차검증한다.
실제 Web Redis 소비·영상·Event/Artifact 전송·낙상/폭행 정확도는 이번 작업에서 시험하지 않았다.
실패 시 자동 rollback/Start/과거 Event 재전송을 하지 않는다. 이전 Compose/image/모델과 실패 증거를 보존한다.
