구조
플랫폼도 두뇌도 갈아 끼우는데 코어는 하나입니다. 그 사이에 사람이 지키는 선이 있습니다.
어댑터의 계약은 네 개다
플랫폼 어댑터가 지켜야 할 것은 넷뿐이다 — 들어온 걸 정규화하고, 권한을 판정하고, 잡으로 넘기고, 답을 돌려준다.
그 뒤로는 코어가 슬랙인지 디스코드인지 모른다. 그래서 디스코드를 붙일 때 새로 쓴 게 어댑터 하나였다.
계약이 네 개라는 게 중요하다. 셋이면 권한 판정이 코어로 새고, 다섯이면 플랫폼마다 다른 게 코어에 스며든다. 경계는 넓지도 좁지도 않아야 하고, 그 폭은 “플랫폼마다 정말로 다른 것”이 몇 개인지로 정해진다.
디스코드를 붙이면서 이식 버그가 하나 나왔다. 조직 시스템이 사용자 식별자를 슬랙 형식으로 하드코딩한 정규식으로 검사하고 있었고, 디스코드의 숫자 식별자를 전부 거부했다. 플랫폼 중립이라고 믿었던 코어에 플랫폼이 스며 있던 자리다.
두뇌도 갈아 끼운다
응답을 만드는 CLI를 바꿀 수 있다. 방식이 특이한데, 이 PC에 이미 로그인돼 있는 CLI를 스폰한다.
그래서 어느 걸 골라도 요금제가 정액 그대로다. API 키를 꽂는 방식이었으면 제공자를 바꿀 때마다 과금 모델이 바뀌었을 텐데, 로그인된 CLI를 부르는 방식이라 그 사람의 구독이 그대로 적용된다.
세션은 제공자별로 따로 파일링된다. 세션 식별자는 그 에이전트 저장소의 영수증이라 섞으면 안 되기 때문이다. 전환해도 양쪽 대화가 다 보존된다.
다만 예외가 있다. 손님 요청과 오너의 DM 밖 요청은 무엇을 골랐든 항상 기본 두뇌로 간다. 권한 규칙이 그 CLI 형식의 파일이라, 다른 CLI가 들고 가지 못한다. 안전장치가 못 따라가면 전환도 안 시키는 게 맞다.
죽은 제공자를 배운 것
제공자 하나가 개인 계정에 닫혔다. 무료뿐 아니라 유료 구독도 함께.
증상이 고약했다. 로그인은 성공하고, 첫 요청에서 죽는다. 그래서 “설정은 됐는데 왜 안 되지”가 된다.
그 자리를 후속 CLI로 메우면서 함정을 셋 더 밟았다.
- stdin 관용구처럼 보이는 인자가 stdin을 버렸다.
-p -형태를 넘겼더니-를 프롬프트 문자열로 받고 표준입력을 무시했다. 인사말이 돌아왔다. - 죽은 대화 식별자가 에러가 아니었다. 경고만 하고 새 대화로 자가 복구해 새 식별자를 준다. 그래서 재시도 로직이 아니라 돌아온 식별자를 저장하는 코드가 필요했다.
- 설치가 PATH를 레지스트리에만 넣었다. 이미 돌고 있던 워커는 그걸 못 본다. 폴백 경로가 없으면 “설치했는데 아무 일도 안 일어남”이 된다.
셋 다 조용한 고장 계열이다. 어느 것도 예외를 던지지 않는다.