# KBX UX Experiment & Controlled Rollout v17

## 목적

UX 변경을 전 사용자에게 즉시 배포하지 않고, 되돌릴 수 있는 범위에서 제한적으로 노출한 뒤 v16 UX Metric과 Guardrail로 판단한다.

## 허용 범위

- layout
- information emphasis
- default filter
- navigation
- copy

## 금지 범위

- Permission / Authorization
- Sensitive data exposure
- Domain business rule
- Validation
- Idempotency
- Workflow safety
- WMS scan success/validation rule
- Inventory truth

## 배정

Server가 Tenant + User + Experiment를 기준으로 안정적인 Bucket을 계산하고, 실제 Experiment에 편입된 사용자만 assignment를 영속화한다. Browser가 Variant를 임의 선택하지 않는다.

## Exposure

Assignment API 호출만으로 노출로 세지 않는다. Variant가 실제 렌더링된 뒤 `experiment.exposed`를 기록한다. 이후 같은 Screen의 semantic telemetry에는 experimentId/variant context가 붙는다.

## 판단

Reference 정책은 최소 Variant별 200 exposure 이후에만 판정한다. Guardrail 위반은 즉시 롤백 후보이며, `candidate`는 승격 검토 대상일 뿐 자동 정답이 아니다. 현재 정책은 운영 Threshold이며 통계적 유의성을 주장하지 않는다.

## 롤백

`kill_switch=true`, `state=rolled-back`, `rollout_percent=0`으로 원자 전환하고 audit을 남긴다. 기존 assignment 이력은 삭제하지 않아 재현성을 유지한다.

## 열린 화면의 롤백 전파

Runtime 변경 후 `/hubs/kbx-experiments` SignalR 이벤트로 열린 Browser에 invalidation을 전달한다. Browser는 이벤트 값을 그대로 신뢰하지 않고 Assignment API를 다시 조회한다. SignalR 연결이 끊겨도 다음 화면진입/새로고침의 API 평가가 Source of Truth다.

## Telemetry attribution integrity

Browser가 보낸 experimentId/variant를 그대로 신뢰하지 않는다. Ingest 시 현재 사용자 assignment, runtime running 상태, kill switch, rollout bucket을 Server에서 다시 확인한다. 유효하지 않은 context는 일반 업무 event에서는 제거하고, `experiment.exposed` 자체가 유효하지 않으면 저장하지 않는다.
