"가장 똑똑한 router 는 의견이 없어. 어느 adapter 가 모델을 소유하는지 읽고 비켜."
router 의 일, 최소로 진술하면
모델을 지명하는 generate 요청이 도착하면, 뭔가 정해야 해: 이게 LocalAdapter 로 가, APIAdapter 로 가? 그 결정의 순진한 버전은 분기로 가득한 함수야 — 모델 이름이 이걸로 시작하면, 저 폴더에 있으면, 이 패턴에 맞으면. 새 모델이나 vendor 마다 분기를 추가하고. 그 함수가 버그가 사는 곳, 아무도 안 건드리고 싶은 곳이 돼.
결정을 데이터로 옮겨
더 나은 설계는 결정을 코드에서 registry 로 옮겨. 각 모델이 registry row 를 갖고, 그 row 가 이미 어느 adapter 가 소유하는지 알아. 그러면 router 가 사소해져: 모델의 row 찾고, adapter 읽고, dispatch. 분기 없음, 패턴 없음, 자라는 if/else 없음. registry 가 이미 답을 들고 있어서 router 가 의견이 없어.
왜 '멍청함' 이 칭찬인지
dumb router 는 절대 수정 안 해도 되는 거야. 새 local checkpoint 추가? 스캔 중에 'local' 태그된 registry row 를 받아; router 는 이미 뭘 할지 알아. 새 API vendor 추가? 그 모델들이 APIAdapter 용으로 태그된 row 를 받고; router 는 이미 알아. router 는 한 번, 올바르게 쓰였고, 다신 바뀔 필요 없어, 모든 변화가 그게 읽는 데이터에 사니까. 여기서 멍청함은 안정성을 뜻해.
registry 가 단일 진실 원천이야
이 설계엔 둘째 보상이 있어: 모델-to-adapter 매핑을 아는 곳이 정확히 하나고, registry 야. 라우팅 로직이 서로 모순될 수 있는 두 곳에 절대 없어. 모델이 왜 거기로 라우팅됐는지 알고 싶어? registry row 를 읽어. 라우팅 바꾸고 싶어? row 를 바꿔. router, config 파일, 특수 케이스 셋에 흩어진 결정 로직 대신, 쿼리 가능하고 편집 가능한 단일 진실 원천.