3-7. 언어 서버가 붙는다 (9/15 ~ 9/21)

일주일에 265커밋·PR 104건. 앞 편의 4분의 1 규모지만 한 축이 처음부터 끝까지 닫혔다 — 네이티브 편집기에 LSP 가 붙어 호버·정의 이동·시그니처·포맷·이름 바꾸기·code action·자동완성·semantic tokens·접힘·저장 통지·참조 피커까지 열두 조각이 이레 만에 섰다. 그 앞뒤로 성능 진단 하루와 build.zig 를 3분의 1 로 줄인 리팩터가 있다.

진단으로 판 하루 (9/15)

9월 15일은 새 기능이 아니라 왜 느린가를 파는 날이었다. 결과는 전부 수치로 남았다.

자리전후원인
폭포 출력11~20Hz55Hz불공정 mutex 기아 — 리더가 청크 경계마다 메인에게 코어 락 차례를 넘긴다
코어 락 점유—−60%빈 출력 신호가 락을 잡고 지나가고 있었다(P4-3 진단, §12.9)
kitty 이미지프레임마다 메인이 3~8ms 정지0base64·zlib 해제를 리더가 락 밖에서
2.9MB PNG락 보유 16~17ms1ms 미만f=100 PNG 도 락 밖 디코드, payload 복사 제거
split 3 pane 스크롤19.5Hz56HzCoreText grid run 캐시 — run 내용 키로 CTLine 생성을 건너뛴다
host CPU50%14%데몬 할당자의 스택 포획을 껐다

CTLine 비용의 정체(합자 6배·폴백 캐스케이드 run당 약 110µs)는 진단만 하고 착수는 보류했다(§10.9). 나흘 뒤 폭포를 검산하니 기대 4.2ms 가 실측 4.19ms 와 맞았다 — 진단이 맞았다는 확인만 남기고 손대지 않았다.

병합 편집기 마감 (9/14~9/16)

전 편 끝에 열린 세 판 편집기(S3b-1)가 이 주에 닫혔다. 세 판의 대응표(S3b-M), 고르기 줄을 판으로(S3b-3c), 세 판의 caret(S3b-3b), F7/⇧F7 로 충돌 구간 이동(S5), 세 판의 가로는 Result 의 것(S6). 소스 컨트롤 쪽은 마커가 없어진 충돌 행에 «+» 가 돌아오고(S4) 「모두 스테이지」가 마커 남은 파일을 비켜 간다(S4b).

미니맵과 진단 층 (9/16)

"네 N5 미니맵부터 계획 공격하고 진행해주세요" — 2026-09-16

"계획 공격" — 계획을 먼저 적대적으로 공격하고 살아남으면 진행하는 이 주의 어법이다. 미니맵(N5a — 2px/1px 색 블록 스트립·비례 스크롤·슬라이더), 비교 뷰 막대의 변경 마커와 검색 행 강조(N5b), 그리고 진단 층 — 첫 출처는 tree-sitter 구문 오류. gutter 글리프·지그재그 밑줄·막대/미니맵 마커·F8/⇧F8(§5.4). 이 진단 층이 다음 날 LSP 가 꽂힐 자리다.

LSP 열두 조각 (9/17~9/21)

"네 LSP seam 1단부터 계획 공격하고 진행해주세요" — 2026-09-17

날조각내용
9/171단transport·수명·신뢰 프롬프트·Full sync·publishDiagnostics 합치기·상태바 설치 안내(§8.2a)
9/17①호버 박스 — 진단 문장 + 언어 서버 hover, VS Code 마커 호버 모양
9/18②③④정의로 이동·되돌아가기(F12·⌘클릭·⌃-), 시그니처 힌트(⇧⌘Space), 문서 포맷(⇧⌥F)
9/19⑤⑥⑦이름 바꾸기(F2, WorkspaceEdit 전부 검증 뒤 적용), code action(⌘.), 자동완성 ①-a·b·c(LSP 팝업·버퍼 단어 병합·fuzzy·labelDetails)
9/20⑧자동완성 옆 문서 패널, semantic tokens 2층 — 보이는 범위만 11색으로 tree-sitter 위에
9/21⑨⑩⑪⑫foldingRange 접힘 3층, didSave 통지, 참조 피커(⇧F12), 구현·타입 정의·선언으로

언어 서버는 번들하지 않는다 — 6월에 §8.1a 로 정한 대로 설치를 안내한다. 검증은 가짜 서버로 LSP 3.17 응답을 모사했는데, 그게 곧 질문거리가 됐다.

"자동 검증하지 못한 영역: 실 rust-analyzer 의 resolve 응답 모양(가짜 서버로 모사 — LSP 3.17 의 additionalTextEdits 그대로). 왜 못했어요?" — 2026-09-19

didSave 조각이 그 답의 일부다 — rustc 진단이 저장에만 다시 돌아 고친 오류가 남아 있던 것을 실제 서버에서 봤다. 같은 날 편집기는 파일 없이 여는 문서(U1)·이름 없는 문서 저장(U2)·저장 실패 사유와 「연 뒤 바뀌었나」(C0)·저장 충돌 고르기(C1a)를 얻었고, 비교 뷰에도 구문 색이 났다 — "계약은 있었고 구현이 반쪽이었다".

원격 훅 (9/19~9/21)

에이전트 훅은 셸 구간을 닫고(AT3b — PostToolUse·PostToolUseFailure, bashEditDiff 로 셸 편집 귀속), 원격 Term 의 턴 스냅샷과 ✎ 귀속을 저쪽 기계에서 세우며(AT3c·AT3d), 훅 커맨드 하나로 로컬/원격 설치기의 핑퐁을 없앴다(RA8). 원격 tmux pane 은 pane 별 훅 슬롯 테이블·라우팅·사이드바 행·«+N pane 밀림» 고지까지 RA7 조각 다섯으로 화면에 들어왔다. 실기 e2e — 새 Maru.app → maru ssh → loopback sshd → claude 한 턴 — 도구와 결과가 문서로 남았다.

build.zig 21,352 → 8,835 (9/21)

등록을 «바뀌는 이유» 별로 build/ 로 가르고, 빌드 등록을 문자열이 아니라 AST 뷰 build_graph 로 세고, tests/boundary/ 판정자 스무 개를 표로 모았다 — 등록과 「매달기」가 3천 줄 떨어져 있었다. 같은 날 #3833 과 #3839 가 각자 초록으로 머지돼 main 이 컴파일되지 않는 사고가 났고, 앞 주에 적어 둔 "각자는 초록인데 합치면 깨지는 것" 규율이 실제로 쓰였다.

9월 21일 시점

항목수치
누적 커밋약 6,960건 (9/15~9/21 265건)
PR약 3,850건
이 주 최다 스코프editor · session-host · agent-hooks · terminal

터미널 안 편집기가 언어 서버를 갖췄다. 첫 문서의 비목표 "IDE형 워크스페이스 제품" 과의 거리는 이제 이름의 문제에 가깝다.