# 메인 전달: 브라우저 설정 공개안, 구현 전 문서

```text
profile: ltb1021
server: test
codex_docs_repo: /workspace/users/root/codex-ops-docs
repo: /workspace/contextra-analytics-runtime-lifecycle-refactor
branch: task/runtime-lifecycle-refactor
draft: /data/codex-artifacts/contextra/field-maintenance/2026/2026-11-02_contextra-web-config-handoff-draft_r01
```

## 5줄 상태 요약

- 현재 목표: 사이드에서 합의한 FIGHT UI2개와 FALL 예정 UI3개의 Web 전달 계약을 기록했다.
- 확인 사실: 로컬 FIGHT는2개를 지원하고 현행 FALL은 새3개를 거부한다. 상세 검증은 아래 결과 링크를 따른다.
- 생성 범위: 위 draft 폴더만이다. 코드·Owner·공용 명세·기존 전달본·운영·Git 상태를 수정하지 않았다.
- 미확정: FALL 확장의 구현 완료, 실효값 저장/조회 연결, 오류명, 실제 배포와 Web 수용은 아직 아니다.
- 다음: 메인이 본 문서를 읽고 **별도 요청으로** 제한적 FALL 구현·검증·승인된 배포를 맡는다. 이번 문서는 실행 승인이 아니다.

## 확정된 의도와 경계

FIGHT 전용 UI는 `parameters.fight_r5.min_samples`와 `window_seconds`만이다. `schema_version=1`은 고정 전송하며 `contact_min_samples`는 전송하지 않는다. 기존 저장값을 보존하고 최초3이며, 관측창 축소 시 숨긴 값의 상호 제약도 그대로 검증한다. 기본2/1.0, 정확한 정수1~16 및 `floor(window_seconds*10)+1` 이하, 유한 관측창0.3~3초다. FIGHT 규칙이나 API 지원 범위를 이번 제안 때문에 바꾸지 않는다.

FALL은 아래3개만 새로 공개할 목표다. **현재 코드에서 지원되지 않는다.** 합의 범위는 UI와 설정 노출이고, 새 판정 규칙 개발·탑뷰 대응·공간 이전 상태 연결을 재개하는 요청이 아니다.

| 정확한 wire 경로 | 최초 기본 / 범위 | 내부 연결 목표 |
| --- | --- | --- |
| `parameters.fall_r2.r1_torso_min_deg` | 50 / 50~60도 | R1 config의 `torso_down_deg`만 |
| `parameters.fall_r2.r1_leg_min_deg` | 50 / 50~60도 | R1 config의 `leg_down_deg`, `F1_FULL_LEG`만 |
| `parameters.fall_r2.d1_knee_min_deg` | 140 / 140~160도 | D1 `knee_angle_min`만 |

값은 bool을 제외한 유한 숫자다. 문자열/null/범위 밖 값은 거부하며 각도를 하한 보정하지 않는다. 기본보다 엄격한 방향만 노출하지만 이 범위가 영상 성능 최적 범위라는 뜻은 아니다. 초기값에서는 기존 판정과 동등해야 한다. D2, R1 허벅지65도·bbox비율, 서기 지지 억제, 사람/관절 의미, 재무장2초·표시1초는 바꾸지 않는다.

A 분기 선택은 제외한다. D bbox 비율은 [내부 문서](INTERNAL_RULE_NOTES.ko.md)에만 보존하고 UI/새 API/Start 예시에는 넣지 않는다. E는 D1에서 사용 가능한 유효 다리의 무릎 펴짐 조건이며 전체 FALL 공통 차단이나 단독 확정 조건이 아니다.

## 현행 vs 확장 시 보존할 계약

1. `fall_r2` v1에 optional3개를 추가하는 안이다. 과거 marker만의 요청을 깨뜨리지 않고 엔진 전환 명령으로 쓰지 않는다. **현재 v1은 새 필드를 거부하므로 schema1만으로 지원 가능을 추정하지 않는다.** 실제 지원 반영과 오류 계약은 메인이 확인한다.
2. 새 필드 생략은 저장값 유지, 최초 미설정은50/50/140이다. 다른 시나리오·ROI·On/Off·engine·높은 저장 score를 건드리지 않는다.
3. 기존 FALL `reset_to_defaults=true`는 common 사람0.25/관절0.10/cooldown10만 초기화한다. 새 각도까지 몰래 초기화하지 않는다. 새 판정값 복귀는 명시50/50/140 전송으로 한다. 새 reset UI는 없다.
4. 현행 reset과 common값 동시 전송 오류를 유지한다. **reset과 새 각도 동시 전송은 미확정 조합**이다. 권장안은 거부해 두 요청의 의도를 분리하는 것이고, 대안은 common reset과 새 각도 변경을 원자적으로 함께 처리하는 것이다. 새 UI에서는 이 조합을 보내지 않으며 메인이 구현 전에 정책·오류코드를 확정한다. 이번 초안이 이를 결정한 것으로 해석하지 않는다.
5. `parameters` 바깥 구형 optional 오류의 무시/유지와 새 전용 블록 내부 엄격 검증을 구분한다. 잘못된 새 타입·키·버전·범위는 저장/실행 변경 전에 거부한다.
6. 같은 실효 Start는 no-op이며 실제 URI·시간 anchor·ROI·설정 변경은 정상 반영한다. 기존6시나리오 snapshot·권한·반복 Start 흐름을 보존한다.
7. 공통 score 최초 기본/하한은0.25/0.10이며 유효한 낮은 숫자만 보정한다. 문서상 사람0.35 시작/0.35~0.45·관절0.10·cooldown10 추천은 초기값·채널 자동 변경 승인이 아니다.
8. 실시간/아티팩트 빨강은 현재 충족 또는 대응 확인된1초 유지다. 별도 새 Event와 다르다. 공통 cooldown과 알림 정책은 그대로다.

## 소스 근거와 예상 최소 수정 경계

읽기 기준 HEAD: `4c1fc6dcbdb3e1229104b6761de156239b3282b8`. 실제 메인 착수 시 최신 branch/HEAD/diff와 ownership을 다시 확인한다. 이 경로 목록은 변경 확정 목록이 아니라 기존 흐름을 조사할 출발점이다.

| 소스 | 확인된 역할 / 후속 주의 |
| --- | --- |
| `app/fight_r5/config.py`, `web.py` | 현행2개와 숨긴 contact 검증·patch. FIGHT 변경 불필요 |
| `app/fall_r2/config.py`, `web.py` | 현재 marker/reset만. 새3개 strict 검증·저장값 병합·요청사유를 연결할 후보 |
| `app/fall_runtime.py`, `app/fall_r2/core.py` | 저장 설정 parse/payload와 인스턴스 규칙 전달. 채널끼리 전역 mutable config를 공유하지 않게 검토 |
| `app/fall_r2/reference.py`, `decision.py`, `base.json`, `rules.json` | 이미 참조하는 상수의 인스턴스별 제한적 override. 기본 규칙 자체를 튜닝하지 않음 |
| `app/scenario_parameters.py`, `app/secure_control.py` | Start 투영·입력검증. 미래3필드 반영 전 원자성·전체 snapshot 계약 확인 |
| `app/stream_settings.py` | configured/effective readback과 설정 동일성. 새3필드의 저장/실효값 확인 경로 필요 |

현행 settings 응답은 cooldown을 노출하지 않는다. 기존 요청/실효 로그와 AI 담당자의 저장 설정 확인 경로를 쓰고, 문서만으로 새 API를 있는 것처럼 만들지 않는다. 새로운3필드 오류명·실효값 응답 위치·persisted payload는 구현과 시험을 통해 확정한 뒤 공용 명세와 이 초안 후속본에 반영한다. source 해시 목록은 [context](validation/context.json)를 따른다.

## 검증과 2차 작업 인계

**필수 1: 설정 계약과 변경 원자성.** 기본/최소/최대/소수값, bool·string·null·NaN/Infinity·버전·오타·범위 밖 거부, 생략/저장/재기동, 기존 reset 범위, 명시50/50/140 복귀, hidden contact 제약, 같은 실효 Start no-op을 확인한다. 오류로 기존 저장/실행이 바뀌지 않아야 한다. 기존6시나리오·URI·anchor·ROI 보존도 포함한다.

**필수 2: 분기 범위와 기본값 동등성.** 저장 R2 근거를 재사용해50/50/140의 현재 판정·기여/유지·알림 정책 불변을 확인한다. 각도 상향이 해당 분기에만 작용하고 D2/허벅지 보조/FIGHT/다른 사람에 전파되지 않는지 표적 확인한다. 모델/Pose/Tracking 재추론이나 새 튜닝 탐색으로 확대하지 않는다. 허용 상한을 성능 검증 완료로 표현하지 않는다.

**권장:** Web 동료가 FIGHT를 먼저 연결하고 FALL은 실제 지원 후 연결한다. 기존 브라우저의 저장값 표시, 실패 메시지, 반복 Start, 사용자가 바꾸지 않은 값 보존을 별도 확인한다. API 접수 성공과 최종 적용 성공을 구분한다.

**보류:** 이번 문서 작업에서는 위 Runtime/통합검증·배포·브라우저 시험을 수행하지 않았다. 장시간 안정성/현장 일반화/탑뷰·공간 이력 고도화/새 영상/HTML도 보류다. 원하면 별도 명시 요청으로 메인이 진행한다.

2차의 구현·격리검증과 실제 배포를 한 번에 맡길지는 사용자 요청문에서 정한다. 배포 승인이 있더라도 actual 지문·복귀점·공용 컨테이너 영향·persistent 정합을 확인하는 기존 배포 절차를 따른다. 이 파일을 읽은 것만으로 SSH·build·Gateway/서비스·채널 제어를 시작하지 않는다. 검사 실패를 맞추려고 규칙을 바꾸거나 자동 rollback/재Start를 승인받은 것으로 취급하지 않는다.

## 다음 전달물과 미실행

- Web 동료용: [FIGHT](FIGHT_R5_WEB_CONFIG_DRAFT.ko.md), [FALL 제안](FALL_R2_WEB_CONFIG_PROPOSAL.ko.md), [JSON](examples/README.ko.md).
- 현행 순수 validator 검사와 확장 설계 검사: [검증 범위](validation/README.ko.md), [결과](validation/result.json).
- 메인 수락·구현 후 공용 명세·Owner 업데이트는 메인 소관이다. 이 초안은 canonical을 덮어쓰지 않는다.
- 아이서티 사람용 HTML은 추가 질답 → 초안 → 사용자 수정 → 최종본 순서로 별도 요청에서 만든다. 이번 산출물에 HTML은 없다.
- Git 저장소 무수정. Report는 이번 문서 사실만 기록하며 배포·Web 패치 완료로 표시하지 않는다.

### 원문

[Owner](/workspace/contextra-analytics-runtime-lifecycle-refactor/docs/profiles/ltb1021/topics/runtime-lifecycle/README.ko.md), [FIGHT 명세](/workspace/contextra-analytics-runtime-lifecycle-refactor/docs/integration/FIGHT_R5_WEB_CONFIG.ko.md), [FALL 명세](/workspace/contextra-analytics-runtime-lifecycle-refactor/docs/integration/FALL_R2_WEB_CONFIG.ko.md), [배포 절차](/workspace/contextra-analytics-runtime-lifecycle-refactor/docs/deployment/SCENARIO_DEMO_COMPATIBILITY.ko.md).
