SSOT는 로컬 0_VALUE/. GitHub URL은 복사본 참조로 SSOT 원칙 위반. 02_Governance는 존재하지 않는 구 경로로 전부 깨진 링크. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
10 KiB
10 KiB
상위 원칙
- 0_VALUE Coding Principles
- 0_VALUE Infrastructure SSOT Principle
- workspace-config 루트기준 SSOT와 하드코딩 분산 문제 오픈
- 모델 SSOT 하드코딩 분산과 workspace-config 로컬이식 통합 리서치
LLM 모델 SSOT 전환 계획
상태
- in_progress
목표
- 주 LLM 모델 기본값을
workspace-config/runtime.env중심으로 해석하도록 고정합니다. - 과도기에는 최소
rb8001/.env까지만 수정하면 실제 기본 모델이 바뀌도록 맞춥니다. - 예외적으로 API 요청에서
model을 명시하면 그 입력값만으로 실제 호출 모델이 바뀌게 합니다. - 새 추상화 계층을 늘리지 않고 기존
LLMService중심으로 우회 경로를 제거합니다.
범위
포함
rb8001의 모델 기본값/직접 handler 생성/직접 Gemini SDK 호출/fallback 배열 정리skill-slack의 하드코딩 모델 문자열 정리- 전수 확인으로 드러난
rb8001의 추가 직접 생성 경로 정리 skill-news의 독자GEMINI_MODELSSOT와 직접 Gemini SDK 호출 정리- 모델 변경 검증 체크리스트 고정
포함 근거
- 리서치 기준
skill-news는 단순 모델 문자열 1~2개가 아니라,README,.env.example,docker-compose.yml, 서비스 코드, API 모듈 import 시점 초기화가 함께.env의GEMINI_MODEL을 독자 SSOT로 강화하고 있습니다. - 따라서
skill-news를 범위 밖으로 두면 로빙 전체 관점에서 "주 모델 변경이 SSOT 1회 수정으로 닫힌다"는 목표를 충족할 수 없습니다. - 특히
skill-news/app/api/news_endpoints.py의news_summarizer = NewsSummarizer()는 프로세스 시작 시점에 현재 모델 계약을 고정하므로, 단순 문서 수정이나 compose 수정만으로는 충분하지 않습니다.
제외
- 새 provider registry 파일 추가
- 새 gateway 패키지 추가
- 새 request schema 계층 추가
- 서버 배포 작업 자체
파일별 변경 계약
1. 기본 경로 정리
- rb8001/app/services/llm/llm_service.py
- 기본 모델 해석과 요청 모델 override 해석을 한 곳으로 모읍니다.
- provider/model 선택은 이 서비스가 담당합니다.
- rb8001/app/core/config.py
DEFAULT_LLM_MODEL설정 경로를 유지하되, 최종 해석 원천은workspace-config/runtime.env로 둡니다.
2. 우회 경로 제거
- rb8001/app/services/llm/gemini_handler.py
GEMINI_MODELenv 우회 제거
- rb8001/app/router/llm_endpoint.py
- 직접
GeminiHandler생성 제거
- 직접
- rb8001/app/services/coldmail_llm_classifier.py
- 직접
genai.GenerativeModel(...)생성 제거
- 직접
- rb8001/app/services/ir_analyzer.py
- 파일 내부 fallback 배열 제거 또는 중앙 정책으로 이동
- rb8001/app/services/diary/generator.py
- 직접
GeminiHandler()생성 제거 검토
- 직접
- rb8001/app/services/workflows/headlines_workflow.py
or GeminiHandler(default_model)우회 제거
3. 스킬 계층 정리
- skill-slack/app/services/digest.py
- skill-slack/app/services/action_extractor.py
- skill-slack/app/services/summarizer.py
- 하드코딩 모델 문자열을 설정값 또는 API 입력값으로 승격합니다.
- skill-slack/app/core/config.py
- 필요 최소한의 기본 모델 설정만 추가 검토합니다.
4. skill-news 정리
- skill-news/app/services/news_summarizer.py
- skill-news/app/services/companyx_news_summarizer.py
- skill-news/app/services/sea_news_filter.py
- 직접
genai.GenerativeModel(...)생성과GEMINI_MODEL독자 SSOT를 정리합니다.
- 직접
- skill-news/app/api/news_endpoints.py
- import 시점
NewsSummarizer()생성이 어떤 설정 계약을 고정하는지 정리합니다.
- import 시점
- skill-news/docker-compose.yml
- 모델 주입을
workspace-config/runtime.env기준으로 재해석할지 확정합니다.
- 모델 주입을
- skill-news/README.md
- skill-news/.env.example
- 문서 SSOT 표현을 코드/운영 계약과 맞춥니다.
수정 규모 기준
1. 최소 직접 수정 범위
rb80019개 내외skill-slack4개 내외skill-news6개 내외- 서비스 코드 4개
- compose 1개
- 문서/예시 2개 중 계약상 필수 범위 포함
- 문서/테스트 제외 최소 직접 수정 예상은
19개 내외로 봅니다.
2. 완전 종결 범위
- 위 최소 범위 외에도 compose의
.env오버라이드,workspace-config주입 순서, 서비스별 예외를 더 확인해야 합니다. skill-news는 독자 제품 SSOT처럼 운영돼 온 흔적이 있어, 계획 실행 중 예외 선언으로 분리할지 통합 전환할지 정책 판단이 추가로 필요할 수 있습니다.- 따라서 이 계획은
핵심 SSOT 경로 복구 계획이고,로빙 전체 workspace-config 완전 종결 계획과는 범위를 구분합니다.
정책 판단
1. 유지 가능한 정책
- API 요청에서
modeloverride 허용 skill-slack의 skill level별 동작 차이 자체는 유지 가능
2. 제거해야 할 하드코딩
GEMINI_MODEL별도 env 우회- 파일별 fallback 배열
- router/service의 직접 handler 생성
- 서비스 파일 안의 직접 Gemini/OpenAI SDK 생성
skill-slack의 고정 모델 문자열skill-news의.env기반 독자 모델 SSOT 표현- import 시점 초기화가 특정 모델 계약을 고정하는 구조
3. 추가하지 않을 것
- 새 manager/registry/wrapper 계층
- 새 fallback registry 파일
- 새 provider enum 파일
검증 체크리스트
1. 기본 모델 변경 검증
workspace-config/runtime.env의DEFAULT_LLM_MODEL변경 시 기본 호출 모델이 바뀝니다.- 과도기에는 최소
rb8001/.env까지만 함께 수정하면 기본 호출 모델이 바뀝니다. - 그보다 더 많은 파일 수정을 요구하지 않습니다.
2. API 입력 override 검증
LLMRequest.model또는 동등한 API 입력 모델값을 명시하면 해당 요청의 실제 호출 모델이 바뀝니다.- 호출부는 provider SDK를 직접 고르지 않고
LLMService만 경유합니다.
3. 우회 제거 검증
GEMINI_MODELenv 우회가 제거됩니다.GeminiHandler(...)직접 생성이 router/service에서 사라집니다.genai.GenerativeModel(...)직접 생성이 공용 경로 밖에서 사라집니다.ir_analyzer.py의 파일 내부 fallback 배열이 제거되거나 중앙 정책으로 이동합니다.skill-slack의 하드코딩 모델 문자열이 제거됩니다.diary/generator.py,headlines_workflow.py의 직접GeminiHandler생성이 제거됩니다.skill-news의 직접 Gemini SDK 생성과GEMINI_MODEL독자 SSOT가 정리됩니다.skill-news/app/api/news_endpoints.py의 import 시점 초기화가 새 계약과 모순되지 않게 정리됩니다.
적용 순서
rb8001공용 경로 정리config.py,llm_service.py,gemini_handler.py
rb8001우회 경로 제거llm_endpoint.py,coldmail_llm_classifier.py,ir_analyzer.py,diary/generator.py,workflows/headlines_workflow.py
skill-slack모델 선택 정리digest.py,action_extractor.py,summarizer.py, 필요 시app/core/config.py
skill-news모델 경로 정리news_summarizer.py,companyx_news_summarizer.py,sea_news_filter.py,docker-compose.yml,README.md,.env.example
- 기본값 변경 검증
workspace-config/runtime.env- 과도기
rb8001/.env - API 입력
modeloverride
- worklog 작성 후 닫힘 선언
레포별 경계
- 1차 대상 레포:
robeing/rb8001 - 2차 대상 레포:
robeing/skill-slack - 3차 대상 레포:
robeing/skill-news - 문서/검증 기록 레포:
robeing/DOCS - 한 번에 여러 레포를 한 커밋으로 묶지 않습니다.
롤백 경계
rb8001변경은rb8001레포 안에서만 롤백 판단합니다.skill-slack변경은skill-slack레포 안에서만 롤백 판단합니다.skill-news변경은skill-news레포 안에서만 롤백 판단합니다.- 문서 변경은
DOCS레포 안에서만 롤백 판단합니다. - 과도기에는
workspace-config/runtime.env와rb8001/.env를 이전 값으로 되돌리는 것이 가장 작은 운영 롤백 단위입니다.
진행 기록
- 로컬 1차 구현 및 검증: 260316 LLM 모델 SSOT 1차구현 및 로컬검증
닫힘 조건
- 사용자가 "주 모델을
--로 바꾸자"라고 했을 때 기본 수정 지점이workspace-config/runtime.env로 답됩니다. - 과도기에도
workspace-config/runtime.env와rb8001/.env까지만 수정하면 됩니다. - API 입력 모델명으로 요청 단위 override가 가능합니다.
- 리서치 문서에 적힌 직접 우회 경로가 실제 코드에서 제거됩니다.
skill-news까지 포함해 독자 모델 SSOT 표현이 정리됩니다.- 닫힘 선언은
worklog에서만 합니다.