Rust AI 어시스턴트를 위한 Fail-Closed 게이트
Source: Dev.to
작업 회피 제안을 거부하기 전에 거부를 증명하도록 AI를 멈추게 하기
대부분의 AI 코딩 어시스턴트는 다음과 같은 워크플로를 따릅니다:
- 컴파일러 오류 읽기
- 오류 설명하기
- 해결책 제시하기
많은 언어에서 잘 동작하지만, Rust에서는 언어가 제공하는 보장을 깨뜨리는 경우가 종종 있습니다.
문제점
Rust 컴파일러 오류—특히 borrow‑checker 거부—는 형식적인 거부입니다:
- 요청된 상태가 안전함을 증명할 수 없거나, 혹은
- Rust의 불변식 아래 존재할 수 없을 때
AI 어시스턴트는 이를 보통 “사용자가 회피하고 싶어 할 것”으로 간주하고, 다음과 같은 예측 가능한 패턴을 만들게 됩니다:
clone()이 너무 일찍 등장Arc가 기본 탈출구가 됨RefCell과unsafe가 명시적인 트레이드‑오프 없이 나타남
AI는 어떤 불변식이 희생되는지 결정하지 않고, 단순히 하나를 희생합니다.
핵심 아이디어: 제안은 증명될 때만 허용
AI를 “Rust 설명을 더 잘하게” 만드는 대신, 이 프로젝트는 한 가지 규칙을 강제합니다:
AI 어시스턴트는 허용된다는 증명을 할 때까지 어떤 제안도 하지 않아야 합니다.
이는 fail‑closed adjudication gate 로 구현됩니다.
두 역할, 하나의 확고한 경계
Adjudicator (LLM)
허용되는 행동:
- 거부를 분류 (A / B / C / D)
- 충돌이나 증명 공백 설명
- 어떤 Rust 불변식이 유지되는지 명시
허용되지 않는 행동:
- 코드 제안
- 회피 방안 제시
- 탈출 메커니즘에 대한 힌트
Auditor (Gate)
-
의미를 해석하거나 Rust semantics를 이해하지 않음.
-
구조적 검증만 수행:
- 필수 필드 존재 여부
- enum 일치 여부
- 스코프 일관성
- 금지된 제안 행동이 없는지 확인
검증에 실패하면 → fail‑close.
Fail‑close가 핵심 설계 선택인 이유
대부분의 AI 시스템은 fail open(“확신이 없으면 그래도 도와준다”) 방식입니다.
컴파일러는 fail closed(“증명되지 않으면 멈춘다”) 방식을 사용합니다.
이 게이트는 어시스턴트의 직감이 아니라 컴파일러의 철학을 복제합니다. 판정이 완전하지 않을 때 시스템은 구조화된 거부만 반환합니다—제안도, 회피 힌트도, “~을 시도해볼 수 있다” 같은 문구도 없습니다.
최소 흐름
Input (code + intent)
↓
Adjudicator (LLM)
- classify rejection
- describe conflict
↓
Auditor (Gate)
- schema validation
- enum checks
↓
PASS → suggestions allowed
FAIL → suggestions blocked
결정은 모델이 아니라 게이트가 합니다.
이 데모가 의도적으로 하지 않는 일
rustc오류 코드를 매핑- 설명 품질 판단
- 프롬프트 최적화
- Rust 교육
오직 한 가지만 증명합니다: 제안 제어는 프롬프트 관례가 아니라 제품 동작으로 강제될 수 있다는 점.
왜 Rust에서 이것이 눈에 띄는가
Rust는 불변식 위반을 명시적으로 드러내지만, 동일한 실패 모드는 다음 분야에서도 존재합니다:
- 보안 도구
- 금융 시스템
- 안전‑중요 코드
- 정책‑구동 시스템
“친절함”이 권한을 무시할 수 있는 모든 도메인에 이런 게이트가 필요합니다.
요점
AI 어시스턴트는 컴파일러와 경쟁해서는 안 됩니다; 컴파일러를 존중해야 합니다. 때로는 올바른 출력이 회피가 아니라 규칙에 의해 강제된 침묵일 수 있습니다.