← 전체 글

Jev를 소개합니다: 산문이 아닌 타입으로 답하는 두 번째 의견

이제 Agent!는 셸 명령을 실행하기 전에 그 명령이 얼마나 파괴적인지 Jev(TypeSafe System One)에게 묻습니다. Jev가 또 하나의 LLM 제공자가 아니라 조언자인 이유를 설명합니다.

오늘 Agent!에 새로운 안전 계층이 추가됩니다. TypeSafe System One의 줄임말인 Jev 입니다. 이제 Agent!는 셸 명령을 실행하기 전에 Jev에게 한 가지 질문을 할 수 있습니다. 이 명령이 데이터를 되돌릴 수 없게 파괴할 가능성은 얼마나 되는가? 그 값이 설정한 임계값을 넘으면 명령은 거부됩니다.

이 기능은 커밋 337c94a2, "Add Jev (TypeSafe System One) decision layer"로 도입되었습니다. 이 글에서는 가장 중요한 설계 결정을 다룹니다. 바로 Jev는 또 하나의 LLM 제공자가 아니라는 것 입니다.

그냥 다른 모델에게 물어보면 안 될까?

Agent!는 이미 23개의 LLM 제공자와 연동됩니다. 가장 쉬운 방법은 "안전 모델"을 제공자로 하나 더 추가하고, 명령이 위험해 보이는지 평범한 문장으로 묻는 것이었을 겁니다. 문제는 돌아오는 답이 산문이라는 점입니다. "이 명령은 상황에 따라 위험할 수 있습니다…" 는 판정이 아닙니다. 결국 rm을 실행할지 말지 결정하기 위해 문장을 파싱하게 됩니다.

Jev는 다르게 동작합니다. 상태에 대한 타입이 지정된 질문 에 Choice, Score, 또는 타입이 지정된 "없음" 응답인 Noul로 답합니다. 텍스트를 생성하지 않고, 도구 인자도 생성하지 않습니다. 커밋 메시지는 결론을 이렇게 정리합니다. Jev는 "APIProvider로 동작하는 대신 기존 도구 루프에 조언한다".

이 역할 분리가 설계의 전부입니다.

  • 사용자가 선택한 모델은 행동 합니다. 계획을 세우고, 도구를 호출하고, 코드를 작성합니다.
  • Jev는 판단 합니다. 코드가 임계값과 비교할 수 있는 숫자를 반환합니다.

어디에 위치하나

Jev는 아무것도 대체하지 않습니다. 모든 셸 명령에 대한 검사 순서는 다음과 같습니다.

  1. ShellSafetyService.check: 치명적인 명령을 거부하는 하드코딩된 규칙. 모델이 관여하지 않습니다.
  2. Jev: 1단계를 이미 통과한 명령에 한해, 패턴이 볼 수 없는 부분에 대한 두 번째 의견으로 동작합니다.
  3. 명령 실행.

첫날부터 이 게이트는 ShellTools의 두 셸 실행 경로(executeTCC와 executeTCCStreaming)를 모두 다룹니다.

작업을 절대 멈추지 않도록 설계

에이전트를 막을 수 있는 조언자는 그 자체로 위험합니다. 서비스가 다운되면 밤새 돌리던 작업이 멈춰 버릴까요? 여기서의 답은 '아니요'입니다. JevAdvisor는 fail-open 방식입니다. 키가 없거나, 토글이 꺼져 있거나, 장애가 발생하면 "의견 없음"으로 처리되고 명령은 그대로 진행됩니다.

다만 fail-open은 눈에 보일 때에만 안전합니다. 첫날 안에 두 개의 후속 커밋이 이를 보장했습니다.

  • "Make the advisor observable" (e25384f3)은 사용량 콜백과 오류 보고를 추가해, 실패한 검사가 조용히 "안전"처럼 보이는 대신 로그에 기록되도록 했습니다.
  • "Log the verdict, not just that Jev answered" (d3c47e67)는 모든 검사가 실제 결과, 즉 파괴 위험 백분율과 명령의 허용 또는 거부 여부를 출력하도록 했습니다.

클라이언트는 제대로 된 패키지

첫 버전은 직접 만든 HTTP 클라이언트를 사용했습니다. 질문에는 POST /v1/systemone, 모델 목록에는 GET /v1/models, Bearer 인증, 그리고 429 및 529 응답에 대한 백오프를 갖추고 있었죠. 몇 시간 만에 9e330357이 이를 TypeSafeKit 패키지로 교체했고, f3a817b8은 빌드가 패키지 다운로드에 의존하지 않도록 해당 패키지를 Agent 저장소 안에 벤더링했습니다.

설정 방법

Jev는 설정에 자리하며, 자체 API 키를 가집니다. 이 키는 Keychain 안의 제공자와 무관한 전용 슬롯에 저장됩니다. /v1/models에서 불러오는 모델 선택기와 조언 토글도 있습니다. 토글을 끄면 Agent!는 이전과 완전히 동일하게 동작합니다.

이것이 중요한 이유

에이전트는 어디서나 셸 접근 권한을 얻고 있고, 안전에 대한 표준적인 답은 "모델이 알아서 조심할 것"입니다. 패턴 규칙은 확인 가능하다는 점에서 더 낫습니다. 하지만 누군가 적어 둔 패턴밖에 모릅니다. 타입이 지정된 두 번째 의견은 모호함을 더하지 않으면서 판단을 더해 줍니다. 숫자를 반환하고, 결정은 코드가 내립니다.

앞으로 기본 임계값을 조정하며 로그를 지켜볼 예정입니다. Jev가 거부하지 말아야 할 것을 거부하거나 잡아냈어야 할 것을 놓친다면, GitHub에 이슈를 열고 해당 로그 줄을 첨부해 주세요.