# Camera3 Redis 도착 관측 / 부분 audit

2026-09-27 14:13:28 KST부터30.088초. read-only, Runtime/image/설정/Gateway/Start/Stop 변경 없음.
관측 image는 pose-mixed-baseline-bd3e80f5dd의 sha256:d1ad34b902ca1c559eb47633c83782f61708186058fe15a602bb40582c707ac6.
소스 HEAD06c3cf6, task/runtime-lifecycle-refactor clean. camera3 FALL/FIRE/CROWD, 같은 run 유지.

## 측정

| Provider | Redis메시지/FPS | 간격평균/p95/최대ms | 선택→응답 평균ms |
| --- | --- | --- | --- |
| Crowd | 299/9.94 | 100.4/146/246 | 54.8 |
| Fire | 300/9.97 | 100.5/145/246 | 55.5 |
| Pose | 296/9.84 | 100.6/185/781 | 82.3 |

Redis행은30.088초 관측, API누적counter 차이는 전후32.143초라 분모가 다르다.
각provider의 관측 내부sequence역전/누락0, 전후counter의송신교체/만료/오류/완료queue만료0.
실시간viewer FPS나 전체영상Frame무손실 보장은 아니다. 선택되지 않은 영상Frame은 이 검사 대상이 아니다.
RTP동일3-provider묶음296개: Crowd→Fire→Pose152/296=51.35%, Fire→Crowd→Pose144/296=48.65%.
Pose마지막296/296. 첫도착→Pose 평균150.55ms,중앙44.5,p95 552,최대673.
Crowd/Fire도착차 절대평균약4.56ms(동일3-provider묶음),같은millisecond25묶음은StreamID suffix로 순서를 구분했다.
전체pair로는Crowd/Fire299묶음,같은millisecond26개. 세provider동일묶음과 분모가 다름.
양끝2초제외 Pose263개 기준Fire/Crowd exact RTP일치263/263=100%, 불일치0.
RTP90000Hz,frameTime ESTIMATED/EXTERNAL_ANCHOR_RTP_ZERO. SSRC/픽셀동일 미검증.
각provider 독립Decode이므로 이번일치가 향후모든입력에서 동기화보장임을 뜻하지 않는다.

Pose NMS true/IoU0.85, FALL person_score0.15/joint_score0.30.
공용pose display person_score0.25/joint_score0.15/min_joints10,show_bbox true/show_joints false/show_edges false.
pose.enabled false는별도Pose표시요청이며FALLdependency로Pose추론/NMS는실행된다.
현재Snapshot에는nms집계가없어실제억제개수는미측정. 최종FrameResult재구성에서nms_kept가전달되지않는진단정보누락을확인했다.
NMS연산Off라는뜻은아니다. 현재FALLdecision기반person표시는0.15를사용하며공용0.25와구분한다.
관측 평균객체수Pose4.69/Crowd7.92/Fire0. Fire빈결과도정상송신이다.
Pose만trackId관측,Fire/Crowd없음. 코드도person_owner가있을때만ByteTracker생성/호출한다.

## 원인 해석 / 후보

- 확인: Pose선택→응답 평균이약27ms길고동일RTP도착은평균약150ms늦음. 서로다른분모이므로차이를특정구간시간으로확정하지않음.
- 유력: Pose추론/관절복사,Pose의NMS/Tracking/FALL/직렬화,독립파이프라인선택위상/CPU scheduling.
- Fire/Crowd는수ms차이로순위가바뀜. 고정우선순위근거없음. 상세구간계측Off라각원인비중미측정.
- Web소비미조사. 채널전역마지막FrameSeq/첫도착provider만채택하면후착정보가누락될수있다는계약검토자료일뿐Web버그확정아님.

부분audit 추천:
1. app/multi_provider_results.py public_positions: capacity이하에서도정렬함. 참조validation유지후원순서반환fastpath후보.
2. 같은파일_person_result→_finalize: 단일part도FrameResult재구성/검증/참조재매핑. 결과동등성/NMS진단필드보존을검증한단일part재사용후보.
3. snapshot은publisher와event_capture에서반복생성. 소비자가수정하므로mutable dict직접공유금지,측정후불변projection재사용검토.
4. native→Observation 중복숫자검증은확인되나신뢰경계제거금지. bulk/trusted path는후속.
기능코드수정/부하시험은이번에하지않음.

## 재사용

helper는실행할때만동작하며평소비용0,새image/상시수집불필요. 기존image의redis package를사용한다.
현재는running채널1개일때만API와결합하는bounded helper이며,다채널사용은identity선택보완후진행한다.
reader ACL로XREAD만수행하고consumer group/ACK/Stream변경없음. secret/전체payload/영상은보존하지않음.
아래NEW_RUN은새로운/tmp/codex/ltb1021하위경로로지정한다. 이전원자료는덮어쓰지않는다.

```bash
python3 /tmp/codex/ltb1021/2026-09-27_provider-arrival_r01/observe.py 3 30 NEW_RUN
python3 /tmp/codex/ltb1021/2026-09-27_provider-arrival_r01/analyze.py NEW_RUN
```

SOT observation.json/summary.json. helper종료,사용자camera3는running유지. 스키마필드누락/입력무응답은결과부족으로보고하며Start/Stop으로우회하지않는다.
