# 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` 자체가 유효하지 않으면 저장하지 않는다.