Search

260722_2339_Opencode 품질문제

출처

스타 16만 개의 오픈소스 AI 코딩 에이전트 OpenCode를 로컬 LLM으로 써 보니, 도구로서의 UX와 보안 설계가 둘 다 파이프(llm | bash) 품질 문제로 무너지고 있었습니다.
작성자는 OpenCode git baef5cd4 + 로컬 Qwen3.6-27B(M4 Max)로 시험했습니다.
별도 CVE 공개가 아니라, "LLM 출력을 셸로 넘기는 구조"에서 파이프 계층이 어떻게 실패하는지를 짚은 글입니다.
결론은 짧습니다: 쓰지 마라. (annoying + alarming 두 축)

원인 파악을 해봅시다 :)

로컬 LLM은 /v1/chat/completions처럼 매 턴 전체 대화를 다시 보내는 형태가 많습니다.
요청 = 지금까지의 전체 프롬프트 JSON 서버 = 가장 긴 캐시 접두사 찾기 → 나머지 prefill → 토큰 생성
Plain Text
복사
접두사 캐시가 깨지면 prefill 비용이 폭증합니다. M4 Max에서도 응답 시작까지 최대 ~10분이 걸릴 수 있었다고 합니다.
즉 이런 상황입니다 :(
AGENTS.md 매 턴 재읽기 + 에이전트↔유저 전환 때 도구 결과 prune + 시스템 프롬프트에 "오늘 날짜" 삽입 → 프롬프트 캐시 미스 연쇄 → GPU 풀가동 + 긴 대기
Plain Text
복사

여기서 우리가 꼭 알아가야할 핵심 개념!!: Prompt Cache

로컬/원격 모두, 긴 컨텍스트의 병목은 종종 생성(decode) 이 아니라 프리필(prefill) 입니다.
캐시를 살리는 원칙은 단순합니다.
1.
앞부분(시스템/스펙)을 자주 바꾸지 말 것
2.
중간을 잘라내면 그 뒤 캐시도 같이 죽음
3.
요약(compaction)이 필요하면 끝에 요약 프롬프트를 붙이는 쪽이 전체 재프리필보다 나음
OpenCode가 깨뜨린 대표 패턴:
동작
왜 아픈가
매 턴 AGENTS.md 재로드
turn-0 접두사가 자주 바뀜
PRUNE_PROTECT = 40_000 고정 prune
초반에 읽은 명세가 먼저 증발
중단(interrupt)도 user 전환 처리
방향 수정할 때마다 캐시 폐기
시스템 프롬프트에 날짜
자정만 넘어도 전체 미스
한 줄: 컨텍스트 창을 "무한한 것처럼" 보이게 만드는 compaction/prune은, 캐시를 1급 시민으로 다루지 않으면 누수 있는 추상화가 됩니다.

자주 하는 실수들입니다! (에이전트 UX)

실수 1. 중요한 컨텍스트를 특별 취급하지 않는다

스펙을 먼저 읽고 → 코드를 많이 읽고 → 모델이 헛소리 → 중단
→ prune이 스펙을 지움 → 명세 없이 구현이 시작됩니다.

실수 2. Plan/Build 모드를 프롬프트 통째 교체로 구현한다

모드만 바꿔도 시스템 프롬프트가 달라지면 전체 캐시 미스입니다.
작성자는 "논의한 내용을 파일로 남기고 새 세션으로 넘기는" 방식을 더 선호했습니다.

실수 3. 권한 UI가 Yes 피로를 만든다

외부 경로 접근마다 Yes/No/Always만 있고 Never가 없음.
하위 에이전트 거절 시 세션/컨텍스트가 날아가면, 사용자는 생산성을 위해 위험한 Yes를 누르게 됩니다.

더 심각한 쪽: 권한 필터는 "문자열 검사"에 가깝다

원문이 alarming으로 분류한 핵심은, Bash 권한 시스템이 AST + 문자열 패턴에 의존한다는 점입니다.
대략 이런 우회가 문제됩니다:
간접 실행 / 절대 경로 / 변수 펼침 Python·기타 인터프리터 리다이렉션·파일 쓰기 "허용된 것처럼 보이는" 명령 조합
Plain Text
복사
정책(policy)이 아니라 휴리스틱 필터에 가깝고,
"프로젝트 밖 파일 접근 제한"이나 "한 번 허용하면 영구" 같은 모델과도 잘 안 맞습니다.
추가로 원문이 경고한 것:
원격 모델 기본 연결 / 넓은 네트워크 접근
과거 HTTP 서버 쪽 RCE 이력 언급
Docker만으로 충분하다고 착각하지 말 것

해결(설계) 방향

1. 프롬프트 캐시를 1급 제약으로 취급

시스템/스펙 = 고정 접두사 작업 메모 = 파일로 handoff 요약 = 세션 끝에 붙이거나, 모델이 직접 메모 파일 작성
Plain Text
복사
(원문은 Pi의 session tree처럼 캐시를 의도적으로 쓰는 UX를 긍정적으로 언급)

2. 권한은 OS 수준 격리

문자열 금지 목록보다:
실행 파일 allowlist 워크스페이스 밖 = 읽기 전용 또는 차단 네트워크 기본 거부 컨테이너/VM/샌드박스
Plain Text
복사

3. "인기 = 안전"이 아니다

스타 수와 보안 자세는 별개입니다. llm | bash 구조에서는 파이프가 제품의 전부입니다.

정리해봅시다!

1.
OpenCode 비판의 핵심은 모델이 아니라 에이전트 런타임(캐시·컨텍스트·권한) 이다.
2.
로컬 LLM에서 캐시 미스는 체감 지연을 분 단위로 만든다.
3.
prune/compaction을 잘못 쓰면 가장 중요한 명세가 먼저 사라진다.
4.
Bash 문자열 필터는 보안 경계가 될 수 없다. OS 격리가 기본이어야 한다.
5.
에이전트 도구를 고를 때는 스타보다 "캐시를 어떻게 다루는지 / 권한을 어디서 강제하는지" 를 본다.

이상!