# KBX Configuration Governance v22

## 목적

설정도 코드와 동일한 계약으로 취급한다. 개발자의 로컬 설정이 운영 의미를 결정하거나, 운영 Secret이 Repository에 들어가거나, 동일 Release가 환경별로 다른 방식으로 빌드되는 상태를 방지한다.

## 경계

- **Static configuration**: DB 연결, Hangfire/SignalR 사용여부, Provider credential reference, Observability endpoint, 업로드 한도처럼 배포/프로세스 생명주기에 속하는 값.
- **Dynamic runtime state**: Experiment rollout/kill switch, Runtime incident/read-only 상태처럼 이미 DB 기반 관리 계약이 있는 값. 이 값을 다시 appsettings로 복제하지 않는다.
- **Domain rule**: 재고부족, 출고 가능 상태, 가격/수량 규칙. Configuration으로 우회하지 않는다.

## Source precedence

`defaults → appsettings → environment-specific appsettings → environment → secret-store → command-line`

Secret은 환경변수/User Secrets/Secret Store 경로만 허용한다. Repository 예제에는 실제 값을 넣지 않는다.

## Fail fast

`KbxConfigurationStartupValidator`는 첫 업무 요청 전에 Required/Conditional Required/Enum/Integer Range/URI/Production Safety를 검증한다. 오류 메시지에는 Secret 값을 출력하지 않는다.

## Configuration fingerprint

운영 재현용 fingerprint는 **non-secret 설정만 canonical order로 SHA-256** 한다. 이 값은 배포/로그에 남길 수 있지만 Secret fingerprint나 Secret value를 포함하지 않는다.
