chore(config): config_prod.yml 정리 + env_model 기본값을 운영값으로 정렬
운영 config 를 열었을 때 "이게 테스트 모드 설정인지 실제 운영 설정인지" 구분되지 않던 문제를 해결한다.
config_prod.yml (기존 키 값 변경 0건, 파싱 결과로 대조 확인)
- 파일 상단에 읽는 법 헤더 추가: ${ENV:-값} 문법, ENC() 의미, "yml 에 키가 없음 != 운영값과 다름", 폴러 전용 키를 두지 않는 이유.
- 모든 키에 주석. 의미 단위로 그룹핑(추출 상한/윈도우, 아카이브 폭탄 방어, 이미지 축소 사다리 4단계, Gemini 세마포어 분리).
- 부하테스트 전용 스위치 섹션 신설. 4개(attachment_access_relaxed / read_cache_bypass / memprobe / memprobe_reclaim_every)를 명시적으로 false/0 선언 — 실효값은 원래도 꺼져 있었으므로 동작 변화 없음. 생략하면 "빠뜨린 건지 끈 건지" 구분이 안 되는 것이 문제였다. 이제 이 섹션 하나만 보면 운영/테스트 모드가 판별된다.
env_model.py
- AiFileConfig 기본값 = 운영값 정책 확립. yml 이 키를 생략해도 운영과 같은 동작을 얻는다. 14개 필드 정렬(attachment_inflight_count 4->1, pdf_max_render_pixels 24M->36M, text_chunk_size 5000->15000, pdf_page_window_size 5->8, agent_knowledge_db_pool_size 10->3, gemini_vlm_concurrency 2->8, GeminiConfig.retry_attempts 1->4 등).
- 기본값이 운영값과 다른 예외 두 부류(부하테스트 스위치, DB 폴러 전용)는 docstring 과 개별 주석에 이유를 남겼다.
- 환경 식별자는 제외: GCS 버킷/프로젝트ID, RabbitMQ 호스트/큐 이름, server.port, storage.provider, redis.cluster, elasticsearch.verify_ssl. 코드 기본값에 운영 리소스를 박으면 설정 누락 시 조용히 운영을 가리킨다. verify_ssl 은 기본값을 false 로 내리는 것이 보안 다운그레이드라 True 유지.
부수 영향 (프로파일별 실효 설정을 before/after 덤프로 대조)
- prod / stg / dev: 실효값 변화 없음.
- local: 생략된 키가 새 기본값을 물려받아 3건 변화(pdf_store_shrink_after_render, xlsx_max_output_chars, gemini.retry_attempts) — 모두 배포 환경과의 parity 가 올라가는 방향이라 수용.
- 회귀가 되는 2건은 config_local.yml 에 명시 고정: agent_knowledge_db_pool_size(기본값 3 을 물려받으면 폴러 워커 캡이 pool_size - reserved 라 2->1 로 깎임), pdf_max_request_render_pixels.
테스트
- 옛 기본값을 정책으로 박아둔 3건 수정. pdf_store_shrink 는 롤백 바닥이 모델 기본값이 아니라 yml/env 라는 점을 docstring 으로 이관. pptx_read_max_bytes 는 pdf_page_window_size 와의 곱 등식이 깨져 (8*5MB != 25MB) 절대값 고정 검증으로 변경.
- test_memprobe: "prod 에 키가 없어야 한다"에서 "꺼져 있어야 한다"는 불변식으로 전환하고 4개 플래그 전부로 확장. 생략도 명시적 false 도 통과하고 true / ${...:-true} 만 막는다.
Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com