Zed에서 TUI가 깨진다
이날은 두 가지 큰 일이 같이 터진 날이었다.
하나는 Zed 터미널에서 TUI가 깨지는 문제를 추적한 거다.
다른 하나는 GLM-5.2가 당일 출시돼서 즉시 대응한 거다.
둘 다
기다려 줄 수 없는 일이었다.
내가 쓰는 에이전트 도구의 TUI가 Zed에서 깨졌다.
글자가 겹치고 레이아웃이 무너졌다.
근데 Ghostty랑 iTerm2에서는 잘 된다.
Zed만 안 된다.
원인을 추적하니 “동기화 출력”이라는 터미널 기능이 핵심이었다.
동기화 출력이란
전체 화면 TUI는 매번 화면 전체를 다시 그린다.
중간 프레임이 사용자한테 보이면 깜빡임이 생긴다.
그래서 터미널에 “지금부터 업데이트 시작, 끝날 때까지 중간 프레임을 보여주지 마”라고 알린다.
이게 동기화 출력이다.
이걸 지원하는 터미널은 중간 프레임을 숨기고 마지막 프레임만 보여준다.
깨끗하다.
근데 Zed는 이걸 지원하지 않는다.
중간 프레임이 전부 보인다.
그래서 겹치고 무너지는 거다.
원인은 변환 함수 누락
Zed는 Alacritty 기반 터미널을 쓴다.
Alacritty의 터미널 모드를 Zed 모드로 변환하는 함수가 있는데, 동기화 출력 매핑이 빠져 있었다.
다른 모드는 다
매핑되어 있는데, 이것만 누락된 거다.
해결은 장기적으로 Zed에 PR을 올리는 거다.
근데 당장은 Zed 안에서 쓰지 말고 별도 터미널을 쓰는 수밖에 없다.
Ghostty를 Zed 안에 넣을 수 있나
그래서 “Ghostty를 Zed 터미널 패널에 넣을 수 있나”를 조사했다.
Ghostty는 렌더링이 잘 되니까, Zed 안에서 쓸 수 있으면 좋겠다고 생각했다.
결론은 안 된다.
Zed 터미널 패널이랑 Ghostty 둘 다
터미널 에뮬레이터다.
에뮬레이터 안에 에뮬레이터를 넣는 건 구조적으로 안 된다.
iTerm2나 Kitty도 마찬가지다.
Zed 확장으로 커스텀 UI를 그릴 수 있나도 확인했다.
확장은 러스트에서 WASM 샌드박스로 돈다.
Zed의 UI 프레임워크가 확장한테 노출되지 않는다.
그래서 커스텀 패널도, 웹뷰도, 캔버스도 안 된다.
확장이 할 수 있는 건 외부 프로세스를 띄우고 텍스트를 반환하는 것뿐이다.
GLM-5.2가 당일 출시됐다
같은 날 GLM-5.2가 출시됐다.
오후 5시에 코딩 플랜 구독자한테 열렸다.
근데 모델 레지스트리에 아직 반영이 안 됐다.
그래서 정상 경로로는 쓸 수 없었다.
기다릴 수 없으니까 커스텀 프로바이더를 등록했다.
임시 프로바이더를 만들고 GLM-5.2만 넣었다.
그리고 에이전트 10개의 모델 참조를 전부 이 임시 프로바이더로 바꿨다.
스키마 검증 함정
커스텀 프로바이더 스키마가 엄격했다.
16개 허용 필드가 있는데, 레지스트리 캐시에는 있지만 스키마가 거부하는 필드가 있었다.
이걸 넣으면 로드 시점에 검증 에러가 난다.
그래서 허용되지 않는 필드를 제거했다.
그리고 기존 프로바이더 이름이랑 충돌하지 않게 임시 이름을 썼다.
정식으로 등록되면 임시 프로바이더를 지우고 정식으로 갈아탈 거다.
컨텍스트 한계 직접 검증
GLM-5.2의 컨텍스트 한계가 문서에 200K로 돼 있었다.
근데 이게 맞나 확인하고 싶었다.
그래서 API에 직접 큰 입력을 보내봤다.
26만 토큰을 보냈다.
통과했다.
84만 토큰도 통과했다.
102만 토큰도 통과했다.
110만 토큰에서 거절됐다.
문서의 200K는 틀렸다.
실제로는 1M을 지원한다.
[1m] 접미사도 필요 없었다.
그냥 기본으로 1M이다.
문서를 믿지 말고 직접 검증하라는 교훈이 또 나왔다.
문서에 200K라고 돼 있었는데, 실제로는 1M이었다.
직접 보내보지 않았으면 200K로 설정해놓고 썼을 거다.
프롬프트 언어 규칙 단순화
마지막으로 프롬프트 언어 규칙을 단순화했다.
“한국어로만 응답하라”는 규칙이 애매했다.
서브에이전트 프롬프트에도 한국어가 새어나갔다.
여러 단어로 된 규칙을 한 줄로 줄였다.
“최종 사용자 응답은 한국어로.” 이 한 줄로 충분했다.
코드랑 식별자는 어차피 영어로 나오니까, 복잡하게 예외를 나열할 필요가 없었다.
마무리
이날은 두 가지를 동시에 처리한 날이었다.
하나는 원인 추적이고 하나는 즉시 대응이었다.
Zed 렌더링 문제는 원인을 끝까지 추적했다.
동기화 출력이라는 터미널 기능을 몰랐는데, 깨진 증상에서 출발해서 구체적인 함수 누락까지 찾아냈다.
“왜 깨지지”에서 시작해서 “동기화 출력 매핑이 빠졌다”까지. GLM-5.2는 출시 즉시 대응했다.
커스텀 프로바이더를 등록하고 컨텍스트 한계를 직접 검증하고 기존 에이전트를 전환했다.
문서를 안 믿고 직접 검증한 게 핵심이었다.
문서는 200K라고 했는데, 실제는 1M이었다.
원인 추적이든 즉시 대응이든, 직접 확인하는 게 핵심이다.
깨지는 이유를 추측하지 말고 소스를 확인한다.
문서를 믿지 말고 API를 직접 때려본다.
직접 확인한 데이터가 가장 정확하다.