From 1ae6b7bcdeb830d7d4ba14748c443529b98bcfd3 Mon Sep 17 00:00:00 2001 From: happybell80 Date: Mon, 16 Mar 2026 01:07:07 +0900 Subject: [PATCH] docs: tighten llm ssot docs and plan --- ...260316_llm_model_ssot_transition_계획.md | 28 +++++++++++++++++++ ...ace_config_로컬이식_통합리서치.md | 14 ++++++++++ ...SOT와_하드코딩_분산_문제오픈.md | 17 +++++++++++ 3 files changed, 59 insertions(+) diff --git a/journey/plans/260316_llm_model_ssot_transition_계획.md b/journey/plans/260316_llm_model_ssot_transition_계획.md index 2b1b76e..92ab7bd 100644 --- a/journey/plans/260316_llm_model_ssot_transition_계획.md +++ b/journey/plans/260316_llm_model_ssot_transition_계획.md @@ -105,6 +105,34 @@ - `ir_analyzer.py`의 파일 내부 fallback 배열이 제거되거나 중앙 정책으로 이동합니다. - `skill-slack`의 하드코딩 모델 문자열이 제거됩니다. +## 적용 순서 + +1. `rb8001` 공용 경로 정리 + - `config.py`, `llm_service.py`, `gemini_handler.py` +2. `rb8001` 우회 경로 제거 + - `llm_endpoint.py`, `coldmail_llm_classifier.py`, `ir_analyzer.py` +3. `skill-slack` 모델 선택 정리 + - `digest.py`, `action_extractor.py`, `summarizer.py`, 필요 시 `app/core/config.py` +4. 기본값 변경 검증 + - `workspace-config/runtime.env` + - 과도기 `rb8001/.env` + - API 입력 `model` override +5. worklog 작성 후 닫힘 선언 + +## 레포별 경계 + +- 1차 대상 레포: `robeing/rb8001` +- 2차 대상 레포: `robeing/skill-slack` +- 문서/검증 기록 레포: `robeing/DOCS` +- 한 번에 여러 레포를 한 커밋으로 묶지 않습니다. + +## 롤백 경계 + +- `rb8001` 변경은 `rb8001` 레포 안에서만 롤백 판단합니다. +- `skill-slack` 변경은 `skill-slack` 레포 안에서만 롤백 판단합니다. +- 문서 변경은 `DOCS` 레포 안에서만 롤백 판단합니다. +- 과도기에는 `workspace-config/runtime.env`와 `rb8001/.env`를 이전 값으로 되돌리는 것이 가장 작은 운영 롤백 단위입니다. + ## 닫힘 조건 1. 사용자가 "주 모델을 `--`로 바꾸자"라고 했을 때 기본 수정 지점이 `workspace-config/runtime.env`로 답됩니다. diff --git a/journey/research/260315_모델SSOT_하드코딩_분산과_workspace_config_로컬이식_통합리서치.md b/journey/research/260315_모델SSOT_하드코딩_분산과_workspace_config_로컬이식_통합리서치.md index 765a39f..ac811f5 100644 --- a/journey/research/260315_모델SSOT_하드코딩_분산과_workspace_config_로컬이식_통합리서치.md +++ b/journey/research/260315_모델SSOT_하드코딩_분산과_workspace_config_로컬이식_통합리서치.md @@ -229,6 +229,20 @@ tags: [research, llm, ssot, workspace-config, hardcoding, robeing] - [skill-slack/app/core/config.py](../../../../skill-slack/app/core/config.py) - 현재 LLM 기본 모델 설정 자체가 없습니다. +## 확인 사실 요약표 + +| 항목 | 확인 사실 | 해석 | +|------|-----------|------| +| 기본 설정 진입점 | `rb8001/app/core/config.py`에 `DEFAULT_LLM_MODEL` 존재 | 설정 표면은 이미 있음 | +| 기본 handler 생성 | `rb8001/app/services/llm/llm_service.py`가 `settings.DEFAULT_LLM_MODEL` 사용 | 단일 진입점 후보가 이미 있음 | +| env 우회 | `rb8001/app/services/llm/gemini_handler.py`가 `GEMINI_MODEL` 재조회 | SSOT 파손 | +| router 우회 | `rb8001/app/router/llm_endpoint.py`가 직접 `GeminiHandler` 생성 | 계층 우회 | +| SDK 직결 | `rb8001/app/services/coldmail_llm_classifier.py`가 직접 `genai.GenerativeModel` 생성 | 공용 경로 우회 | +| 파일별 fallback | `rb8001/app/services/ir_analyzer.py`에 fallback 배열 존재 | 정책 분산 | +| API 입력 model | `rb8001/app/services/llm/models.py`의 `LLMRequest.model` 존재 | override 구조는 이미 있음 | +| OpenAI handler | `rb8001/app/services/llm/openai_handler.py` 존재 | provider 추상화 일부 존재 | +| skill-slack 모델 선택 | `digest.py`, `action_extractor.py`, `summarizer.py`에 모델 문자열 존재 | 설정화 또는 정책화 필요 | + ## 최소 변경 원칙 ### 1. 새 추상화 계층을 더 만들지 않는다 diff --git a/journey/troubleshooting/260316_workspace_config_루트기준_SSOT와_하드코딩_분산_문제오픈.md b/journey/troubleshooting/260316_workspace_config_루트기준_SSOT와_하드코딩_분산_문제오픈.md index 0c10265..fe94bfb 100644 --- a/journey/troubleshooting/260316_workspace_config_루트기준_SSOT와_하드코딩_분산_문제오픈.md +++ b/journey/troubleshooting/260316_workspace_config_루트기준_SSOT와_하드코딩_분산_문제오픈.md @@ -124,6 +124,23 @@ tags: [troubleshooting, workspace-config, ssot, hardcoding, runtime] - `robeing/DOCS` 변경은 23 제어면에서도 같은 `workspace-config` 해석 규칙을 써야 한다는 기준을 더 분명히 해줍니다. - 반면 `references/openclaw` 변경은 참고용 업스트림 코드 갱신으로, 23서버의 현재 gateway/nginx/auth/Gitea 런타임에 즉시 영향을 주는 변경은 아닙니다. +### 6. 현재 active runtime 경로 인벤토리 + +| 구분 | 현재 active 경로 | 현재 역할 | 상태 | +|------|------------------|-----------|------| +| 공용 비민감 설정 | `workspace-config/runtime.env` | 목표 SSOT 경로 | 구조 사용 중 | +| 공용 민감 설정 | `workspace-config/secrets.env` | 공용 secrets 경로 | 구조 사용 중 | +| rb8001 compose 주입 | `rb8001/docker-compose.yml`의 `env_file` | 공용 runtime/secrets 주입 | 사용 중 | +| skill-slack compose 주입 | `skill-slack/docker-compose.yml`의 `env_file` | 공용 runtime/secrets 주입 | 사용 중 | +| rb8001 기본 모델 원천 | `rb8001/.env` | 현재 과도기 실제 공급원 | 제거 대상 | +| rb8001 설정 해석 | `rb8001/app/core/config.py` | `settings.DEFAULT_LLM_MODEL` 노출 | 유지 | +| rb8001 기본 호출 진입점 | `rb8001/app/services/llm/llm_service.py` | 기본 handler 생성 | 유지/정리 | +| 직접 우회 1 | `rb8001/app/services/llm/gemini_handler.py` | `GEMINI_MODEL` env 우회 | 제거 대상 | +| 직접 우회 2 | `rb8001/app/router/llm_endpoint.py` | 직접 `GeminiHandler` 생성 | 제거 대상 | +| 직접 우회 3 | `rb8001/app/services/coldmail_llm_classifier.py` | 직접 Gemini SDK 호출 | 제거 대상 | +| 직접 우회 4 | `rb8001/app/services/ir_analyzer.py` | 파일별 fallback 배열 | 제거 대상 | +| 스킬 하드코딩 | `skill-slack/app/services/*` | 모델 문자열 직접 선택 | 제거 또는 정책화 대상 | + ## 영향 범위 - 로컬 개발자가 `WORKSPACE_ROOT`와 `workspace-config` 두 파일만 바꾸면 된다고 믿고 작업해도, 실제 하위 프로젝트에서는 추가 수정이 발생할 수 있습니다.