증상
agentdesk.yaml의 onboarding 절(config.rs:2628 OnboardingConfig)에 값을 적어도 런타임이 전혀 읽지 않는다. 운영 yaml 현재 값:
onboarding:
guild_id: 1469870512812462284
default_categories: {content: …, cookingheart: …, dev: …, notify: …, yunhone: …}
provider_suffix_map: {-cc: claude, -cdx: codex, -gem: gemini, -qw: qwen}
default_provider: claude
config.onboarding.*를 읽는 코드가 src/config.rs 밖에 0곳이다 (rg "config\.onboarding" 기준). src/services/onboarding/*도 config.discord.guild_id와 config.agents만 본다.
- 소비자 메서드
OnboardingConfig::provider_from_channel_suffix(config.rs:2694)와 resolve_category(:2727)는 #[allow(dead_code)]이고 호출처 0.
- 실제 접미사→provider 매핑은
src/services/provider/registry.rs:243-413의 channel_suffix 상수(-cc, -cdx, -gm, -oc, -qw, -gx)이며 dispatch_channel.rs:65와 cli/run.rs:758이 ProviderKind::from_channel_suffix로 이 상수만 쓴다.
증거: yaml은 gemini 접미사를 -gem으로 적었지만 레지스트리는 -gm이다. 운영자는 -gem이 동작한다고 믿고 있고 실제로는 -gm만 동작한다. 오류도 경고도 없다.
결정 (사용자, 2026-09-05)
하드코딩을 없애고 yaml을 진짜 설정으로 연결한다. (대안이었던 "yaml 절 삭제 + 코드 정본 문서화"는 기각. provider가 늘어나는 중이라 코드 수정 없이 접미사를 바꿀 수 있어야 한다.)
수정
ProviderKind::from_channel_suffix가 레지스트리 상수 대신 설정에서 병합된 접미사 표를 본다. 병합 규칙: 레지스트리 기본값 위에 onboarding.provider_suffix_map을 덮어쓴다(키 추가·변경·null로 제거). 기본값이 남아 있어야 yaml이 비어도 오늘과 동일하게 동작한다.
default_provider도 같은 경로로 ProviderKind::default_channel_provider()에 반영.
default_categories는 소비자가 없으므로 resolve_category를 실제 호출처(온보딩 채널 생성 services/onboarding/channel.rs)에 연결하거나, 이번 범위에서 빼고 별도 이슈. 설계 시 판단하되 dead_code 허용은 남기지 않는다.
- 부팅 시 검증:
provider_suffix_map의 값이 알려진 provider id가 아니거나(오타), 접미사가 다른 접미사의 접미사인 경우(예: -c와 -cc) WARN. deny_unknown_fields를 이 절에 붙여 오타 키를 조기 거부.
- 운영 yaml의
-gem → -gm 정정 또는 -gem을 추가 접미사로 등록 (배포 시 결정).
완료 정의
관련
- 인벤토리 CFG T2 (설정 키 ↔ 소비자 대조),
docs/source-of-truth.md
- 기준: main
01c0c078d8
증상
agentdesk.yaml의onboarding절(config.rs:2628OnboardingConfig)에 값을 적어도 런타임이 전혀 읽지 않는다. 운영 yaml 현재 값:config.onboarding.*를 읽는 코드가src/config.rs밖에 0곳이다 (rg "config\.onboarding"기준).src/services/onboarding/*도config.discord.guild_id와config.agents만 본다.OnboardingConfig::provider_from_channel_suffix(config.rs:2694)와resolve_category(:2727)는#[allow(dead_code)]이고 호출처 0.src/services/provider/registry.rs:243-413의channel_suffix상수(-cc,-cdx,-gm,-oc,-qw,-gx)이며dispatch_channel.rs:65와cli/run.rs:758이ProviderKind::from_channel_suffix로 이 상수만 쓴다.증거: yaml은 gemini 접미사를
-gem으로 적었지만 레지스트리는-gm이다. 운영자는-gem이 동작한다고 믿고 있고 실제로는-gm만 동작한다. 오류도 경고도 없다.결정 (사용자, 2026-09-05)
하드코딩을 없애고 yaml을 진짜 설정으로 연결한다. (대안이었던 "yaml 절 삭제 + 코드 정본 문서화"는 기각. provider가 늘어나는 중이라 코드 수정 없이 접미사를 바꿀 수 있어야 한다.)
수정
ProviderKind::from_channel_suffix가 레지스트리 상수 대신 설정에서 병합된 접미사 표를 본다. 병합 규칙: 레지스트리 기본값 위에onboarding.provider_suffix_map을 덮어쓴다(키 추가·변경·null로 제거). 기본값이 남아 있어야 yaml이 비어도 오늘과 동일하게 동작한다.default_provider도 같은 경로로ProviderKind::default_channel_provider()에 반영.default_categories는 소비자가 없으므로resolve_category를 실제 호출처(온보딩 채널 생성services/onboarding/channel.rs)에 연결하거나, 이번 범위에서 빼고 별도 이슈. 설계 시 판단하되 dead_code 허용은 남기지 않는다.provider_suffix_map의 값이 알려진 provider id가 아니거나(오타), 접미사가 다른 접미사의 접미사인 경우(예:-c와-cc) WARN.deny_unknown_fields를 이 절에 붙여 오타 키를 조기 거부.-gem→-gm정정 또는-gem을 추가 접미사로 등록 (배포 시 결정).완료 정의
onboarding절이 비어 있을 때 동작이 오늘과 바이트 동일 (레지스트리 기본값 테스트)config.rs에#[allow(dead_code)]가 붙은OnboardingConfig메서드 0개onboarding.provider_suffix_map병합 규칙 명시관련
docs/source-of-truth.md01c0c078d8