한 줄에 세 규칙이 사라졌다
이날은 에이전트 프레임워크의 조용한 실패를 잡은 날이다.
한 줄에 세 규칙을 넣어놓고 한 줄을 통째로 바꿔서 다른 규칙이 사라졌다.
세션 타이틀이 첫 요청에서 안 붙는 버그도 찾았다.
둘 다
안전망이 못 잡는 종류의 버그였다.
프롬프트 규칙을 강화하고 있었다.
“영어로 추론하라”는 규칙을 권장에서 필수로 바꿨다.
규칙이 있는 줄을 통째로 바꿨다.
근데 그 줄에 규칙이 세 개 들어 있었다.
영어 추론, 한자 금지, 간결함 선호. 이 세 개가 한 줄에 들어 있었다.
줄을 통째로 바꾸니까 한자 금지랑 간결함 선호가 조용히 사라졌다.
왜 안전망이 못 잡았나
해시라인 편집 시스템은 외부 변경을 잡는다.
읽고 편집하는 사이에 다른 사람이 파일을 바꾸면 해시가 안 맞아서 편집이 거부된다.
근데 이번엔 같은 턴에서 내가 바꾼 거다.
읽은 해시랑 편집하는 해시가 같다.
그래서 안전망이 발동하지 않는다.
같은 턴에서의 과도하게 좁은 편집은 안전망이 못 잡는다.
교훈
한 줄에 여러 규칙을 넣지 마라. 규칙은 하나에 하나씩이어야 한다.
한 줄을 통째로 바꾸면 같은 줄에 있는 다른 규칙이 조용히 사라진다.
그리고 편집 후에는 다시 읽어라. 특히 설정이나 규칙 파일을 편집했을 때는 전체 섹션을 다시 읽어서 뭔가 사라지지 않았는지 확인해야 한다.
첫 요청에서 타이틀이 안 붙는다
두 번째 버그는 세션 타이틀이었다.
“첫 요청에 타이틀이 안 붙었다.
지금은 붙는다”는 보고가 들어왔다.
이전에 네 번 조사했다.
전부 “고장이 아니라 느린 거다”라고 결론지었다.
다섯 번째 조사에서 진짜 원인을 찾았다.
원인: 원샷이 트리거 전에 소비된다
원인은 세 가지가 겹쳐 있었다.
첫째, 타이틀을 생성하는 함수에 최소 컨텍스트 길이 가드가 있었다.
80자 미만이면 생성을 건너뛴다.
근데 첫 요청이 45자였다.
80자 미만이라서 건너뛴 거다.
둘째, 첫 요청 플래그를 설정하기 전에 원샷을 소비한다.
첫 요청이 왔으면 플래그를 true로 설정한다.
근데 이걸 생성 함수 호출 전에 한다.
생성 함수가 가드에서 건너뛰어도 플래그는 이미 true다.
그래서 첫 요청 기회가 영구적으로 사라진다.
셋째, 설계 모순이다.
최대 길이 제한은 첫 요청에 면제해준다.
근데 최소 길이 제한은 면제해주지 않는다.
“첫 요청은 전부 쓴다”면서 최소는 안 풀어준 거다.
왜 결국 붙었나
첫 요청에서 안 붙었는데 4분 뒤에 붙었다.
에이전트가 끝나면 휴식 상태에서 타이틀을 다시 시도한다.
이때는 뒤에 쌓인 대화 텍스트가 80자를 넘는다.
그래서 가드를 통과해서 타이틀이 붙는다.
“느린 거”가 아니라 “빠른 경로가 죽어 있고 느린 경로만 살아 있는 거”였다.
이걸 구분하지 못해서 네 번이나 “느린 거다”라고 결론지은 거다.
같은 패턴의 다른 버그
이 버그 패턴은 루프 동결 버그랑 같다.
루프에서도 검증 가드가 매 턴 리셋되는데 상태는 영구적으로 남는다.
한 번 가드가 실패하면 영구적으로 막힌다.
핵심은 “영구 상태가 휘발성 가드 전에 소비된다”는 거다.
상태를 먼저 설정하고 가드가 실패하면 상태는 이미 설정된 채로 남는다.
가드가 매 턴 리셋되어도 상태는 리셋되지 않는다.
이 생명주기 불일치가 영구적인 실패를 만든다.
서브에이전트 도구 접근 감사
마지막으로 서브에이전트의 도구 접근 권한을 감사했다.
도구가 에이전트한테 어떻게 들어가느냐에 따라 접근성이 완전히 다르다.
느슨한 확장으로 등록된 도구는 모든 자식 프로세스에 자동으로 로드된다.
근데 네이티브로 등록된 도구는 허용 목록에 있어야만 접근할 수 있다.
이 차이를 모르면 감사에서 오탐이 나온다.
“허용 목록에 없다”고 해서 “접근 못 한다”고 단정하면 안 된다.
어떤 도구는 느슨한 확장이라서 자동으로 들어가니까.
마무리
이날의 버그는 전부 “안전망이 못 잡는 종류”였다.
한 줄에 세 규칙이 들어 있으면 같은 줄을 바꿀 때 다른 규칙이 사라진다.
해시라인은 외부 변경은 잡지만 같은 턴의 과도하게 좁은 편집은 못 잡는다.
원샷이 트리거 전에 소비되면 트리거가 발동하지 않아도 원샷은 사라진다.
가드가 매번 리셋되어도 상태는 영구적으로 남는다.
이런 버그를 잡으려면 “편집 후 다시 읽기”와 “느린 거랑 고장 난 거랑 구분하기”가 필요하다.
안전망을 믿지 말고 안전망이 못 잡는 종류의 실패를 직접 확인해야 한다.