feat(ai-file): extend read cache bypass to PDF artifact cache and singleflight
AI_FILE_READ_CACHE_BYPASS 가 DB 청크 캐시(TEXT/XLSX_ROWS/SLIDES)만 덮고 있어 PDF 는 부하테스트 중에도 캐시를 타고 있었다. PDF 는 repository 를 거치지 않고 프로세스 내 PdfArtifactCache(TTL 300s / 64MB LRU)를 쓰기 때문에 _CacheBypassAttachmentRepository 그물에 걸리지 않았다.
- runtime: set_pdf_read_cache_bypass seam 추가. get_pdf_artifact 는 항상 miss, put_pdf_artifact 는 저장 생략(읽히지 않을 엔트리로 LRU 를 채우지 않음). create_ai_file_runtime 이 lru_cache 싱글턴이라 인스턴스 생성 순서에 영향받지 않도록 팩토리 변형 대신 호출 시점 모듈 플래그로 구현.
- runtime: run_pdf_read_singleflight 도 함께 바이패스. 동일 키 동시 요청을 1회로 합치면 VU N 개가 붙어도 실제 렌더가 1회만 돌아 파싱 부하가 1/N 로 측정된다.
- perf: install_perf_overrides 가 기존 env/config 스위치 하나로 두 계층을 함께 설치.
- 주석(perf_flags/env_model/repository)을 실제 커버 범위로 정정.
- tests: env/config 양쪽 트리거, PDF 캐시 상시 miss, singleflight 미합류(3건 → 3회 렌더), 청크 캐시 3종 miss 검증.
png/jpg/jpeg 는 캐시 계층이 없어 해당 없음. /metadata 의 매니페스트 캐시와 metadata singleflight 는 READ 스코프 밖이라 이번 범위에서 제외.
Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com