범위: (1) 2026-07-03 랜드스케이프 리서치 이후 유사 프로젝트 델타, (2) 설치된 Claude Code 2.1.273 과의 호환성 감사, (3) MCP 스펙 2026-07-28 및 2026 하네스 설계 가이드, (4) 이 리포의 라이브 데몬·텔레메트리·항상 로드 표면 실측, (5) 아키텍처 비대화 감사. 리서치 원문 3편은
2026-09-16-sources/에 그대로 보존(인용 URL·확신도·UNVERIFIED 태그 포함). 이전 베이스라인: 2026-07-03.
1. Executive summary
- 표면 비대화의 실체는 도구 수가 아니라 preload 였다. Claude 프로파일로 실측하면 바인딩 전
14종/12.6 KB 인데
prepare_harness_session직후 63종 리스팅·35종anthropic/alwaysLoad· 모델 대면 스키마 44 KB 로 뛴다. ADR-0016 Decision #1 은 always-loaded core 10종이므로 코드가 ADR 을 위반한 상태였다(#365 가 세분 도구 25종을 "라운드트립 회피"로 보존).CORE_10_TOOLS로 정렬 → 에페메랄 빌드 실측 10종/10.8 KB(−61%), 래칫 28 KiB→12 KiB. - tools/list 가 사용 로그의 88%. 45,731행 중 40,213행. 출처는 서버가 아니라 Cursor 안에서 도는
hermes mcp serve(Python MCP SDK 기본 clientInfomcp)의 정확히 180초 주기 재리스팅 — 한 세션이 3주간 8,041행. 영속 경계에서만 필터하고 인메모리 메트릭은 유지. - Claude Code 2.1.273 호환 P0 는 하나.
.claude-plugin/plugin.json의"agents": "./agents/"가claude plugin validate --strict에서 실패(배열 형식 필요) — 라이브 CLI 로 재현·수정·재검증._meta["anthropic/alwaysLoad"]·anthropic/maxResultSizeChars키는 현재 문서와 정확히 일치. - 네이티브
LSP도구가 2025-12-19(v2.0.74)부터 존재하는데 라우팅 블록이 언급하지 않았다.Piebald-AI/claude-code-lsps마켓플레이스가 24개 언어서버를 한 줄로 배선 — 단일 파일 go-to-def/진단은 네이티브에 양보하고 CodeLens 는 교차 파일 참조·임팩트·아키텍처로 차별화. 템플릿에 "Claude Code host facts" 절 추가. - MCP 2026-07-28 은 CodeLens 세션 설계와 정면 충돌하는 방향이다.
initialize/Mcp-Session-Id제거(무상태),server/discover필수,subscriptions/listen, 모든 결과에resultType필수, tools/list 에ttlMs/cacheScope필수, Roots/Sampling/Logging 폐기. Claude Code 2.1.273 은 아직 구세대 핸드셰이크를 쓰므로 당장 깨지지 않지만 "리스트 엔드포인트는 연결별로 달라지지 않는다"는 원칙은 세션별 표면(프로파일·지연 확장·full exposure)의 존재 이유를 흔든다 → ADR 필요. 이번엔ttlMs/cacheScope만 선반영. - 경쟁 지형 델타. 베이스라인에 없던 초대형 신규 3종 — CodeGraph(★71k, 단일 도구 노출),
GitNexus(★47k), codebase-memory-mcp(★43k, camelCase 인지 FTS5 토크나이저). Aider 사실상 정지,
Serena GPL-3.0 재라이선싱+CLA, JetBrains
jbcontext신규 진입. 27개 중 21개 1차 소스 검증. - 아키텍처 비대화. dispatch 7,632줄 중 4,313줄(57%)이 응답 정형화 기계; presets.rs 가 tools.toml
preset_tags와 131개 도구명을 이중 관리; 40줄 미만 재수출 모듈 14개. 이번엔 계측·문서·백로그 등재까지(K-0023~K-0025), 코드는 다음 사이클. - CLAUDE.md 17.2 KB → 7.7 KB. 매 세션 로드되는 파일에서 서브시스템 레퍼런스 14.5 KB 를 docs 로 원문 이관. 라우팅 블록은 host facts 절이 붙어 2.8 KB → 3.6 KB(재생성, doctor exact).
- 폐기 웨이브 제거 게이트 충족. 07-24 창 개시 후 유기적 호출 0(검증 프로브 2건뿐), v1.13.35 가 1회 클린 릴리스 → v2.0 컷에서 삭제 승인(ADR-0018 판정 절).
- 리포 위생. 클린 detached 워크트리 1개 제거, 병합 완료 로컬 브랜치 81개 삭제(원장
.codelens/merged-branches-deleted-2026-09-16.txt), 미커밋 변경 보유 워크트리 3개는 보존.
2. 실측 (2026-09-16, 데몬 :7838 = git bdbbafc, Claude Code 2.1.273)
| 항목 | 이전 | 이후 | 근거 |
|---|---|---|---|
Claude 프로파일 tools/list 바인딩 전 |
14종 · alwaysLoad 13 · 12.1 KB | 14종 · alwaysLoad 9 · 10.6 KB | curl initialize(clientInfo claude-code) → tools/list |
같은 세션, prepare_harness_session 후 |
63종 · alwaysLoad 35 · 27.7 KB | 56종¹ · alwaysLoad 10 · 10.8 KB | 에페메랄 서버(:7741, 브랜치 빌드) 동일 절차 |
| always-load 래칫(name+desc+inputSchema) | 26,244 B / 35종, cap 28 KiB | 10,800 B / 10종, cap 12 KiB | always_load_surface_stays_within_its_context_budget |
--profile 사전 스코프 세션의 첫 tools/list(바인딩 전) |
(미측정 — 리서치 C 갭 2) | planner-readonly 14/20종 · builder-minimal 14/20종 · builder 14/20종 (Claude Code 클라이언트/일반 클라이언트; alwaysLoad 10·9·9) | 에페메랄 서버 :7741~7743 순차 기동, 프로파일별 initialize→tools/list |
prepare_harness_session 엔트리 총 바이트 |
22,017 B(그중 outputSchema ≈18 KB) | 동일 — lean 계약은 outputSchema 를 이미 생략 | generic 프로파일 listing 분해 |
텔레메트리 tools/list 비율 |
40,213 / 45,731 (88%) | 영속 0(인메모리 유지) | persist_event_to_usage_log |
| 180초 폴러 | 세션 a8919779 8,041행(07-24→08-14) | 서버 측 변경 없음(외부 클라이언트) | timestamp gap 중앙값 180,029 ms |
| CLAUDE.md | 17,226 B(손수 14,459 + 블록 2,767) | 7,667 B(손수 4,423 + 블록 3,244) | surface-manifest.py --check 통과 · doctor claude-code exact |
| 폐기 웨이브 호출 | list_active_agents 1 · list_memories 1 (둘 다 검증 프로브) | — | JSONL client_name |
| 워크트리 / 로컬 브랜치 | 4 / 182 (병합 완료 84) | 3 / 102 | git worktree list, git branch -d |
| git pack | 300 MiB — 최대 blob 172 MB(scripts/finetune/pipelines/*.jsonl, main 밖 커밋) |
미변경(히스토리 재작성 필요) | rev-list --objects --all |
¹ 에페메랄 빌드는 semantic 피처 없이 빌드되어 semantic 계열 7종이 리스팅에서 빠짐. always-load
집합은 피처와 무관하게 ADR 10종과 정확히 일치했다.
폴러 판정 근거
- 세션 클라이언트명
(none)(07월, 필드 도입 전)→mcp(08월 이후). Python MCP SDK 의ClientSession기본Implementation(name="mcp"). lsof -iTCP:7838에hermes mcp serve(PID 17866, 부모 = Cursor agent-cli) 가 ESTABLISHED.~/.hermes/config.yaml의gateway_notify_interval: 180.- 서버 응답 스트림에는
list_changed0건 → 서버 유발 재리스팅 아님.
3. 아키텍처 감사 (architecture-audit, 비테스트 Rust 109,224줄)
| 군 | 발견 | 처리 |
|---|---|---|
| 1 이중 진실 | presets.rs 손수 배열 4종(23/41/47/20 = 131명) ↔ tools.toml preset_tags, regen-tool-defs.py::validate_preset_tags 가 lockstep 만 감시 |
K-0023 백로그: regen 이 presets_generated.rs 를 생성하도록 전환(새 추상화 0) |
| 1 이중 진실 | search verb 스키마가 10개 타깃의 수기 합집합 |
라이브 재현 시 max_results·exact_match 모두 pass-through 로 정상 동작 → 감사 주장 하향(스키마 비망라일 뿐 사용자 대면 실패 없음) |
| 2 응답 기계 | success.rs:106 payload_estimate 가 압축 data 1부만 계측, 실제 전송물은 structuredContent+pretty 텍스트+19필드 envelope; 5단계 중 3~5단계 동일 호출; 축약기 2벌; lean 경로에서 계산 즉시 폐기 |
K-0024 백로그. success.rs 는 09-10 미커밋 WIP(호스트 인벤토리 suggestion 필터) 아래라 이번 세션은 손대지 않음 |
| 3 과분할 | 40줄 미만 재수출 모듈 14개, output_schemas 17파일/4단계 |
K-0025 백로그(기계적·단독 커밋) |
| 기각 | rank_fusion.rs 단일 소비자 seam · build_info.rs civil calendar · 호스트 템플릿 5종 |
구조 정당 |
4. 리서치 A — 유사 프로젝트 델타 (원문: 2026-09-16-sources/a-landscape-delta.md)
- 신규 초대형: CodeGraph(MCP 기본 노출 도구 1개
codegraph_explore, 나머지 env opt-in; "44% 비용 절감"과 "세션 종료 시 잔존 컨텍스트 +80%" 를 같은 페이지에 병기 — CodeLens 가 측정한 적 없는 축), GitNexus(Leiden 커뮤니티 탐지로 기능 영역별 스킬 자동 생성), codebase-memory-mcp (cbm_camel_splitFTS5 토크나이저, 11-signal 랭킹 융합, arXiv 프리프린트 동반). - Anthropic 네이티브
LSP도구(2025-12-19, v2.0.74) +claude-code-lsps마켓플레이스(24 언어서버). - JetBrains
jbcontextCLI 신규(2026-07-29 초판, 주간 케이던스). octocode-mcp 가 로컬 코드 인텔로 확장. Aider 정지(마지막 릴리스 2025-08-09). Serena GPL-3.0 + CLA. - 이식 후보 Top(효과/비용): ① 참조된 파일만 크게 경고하는 staleness 배너(S) ② camelCase/ snake_case 인지 토크나이저(S, 현 토크나이저 확인 선행) ③ 잔존 컨텍스트 벤치 축(M) ④ 분모를 명시한 커버리지 공개 방법론(M) ⑤ 스트리밍 envelope + exit-code 상태(M) ⑥ module proximity·graph diffusion 신호(M, MRR 게이트 필수) ⑦ 기능 영역 스킬 자동 생성(L) ⑧ 릴리스 멀티바이너리 스캔 문서(S) ⑩ gitignore 오염 회귀 케이스(S). (#9 alwaysLoad 핵심 상시 로딩은 이번 사이클에서 ADR 정렬로 종결.)
- UNVERIFIED 6건: probe, scip-python, Meta Glean, Nia, Greptile, Augment MCP 정확한 출시일.
- 방법론 경고: WebSearch AI 요약의 날짜를 그대로 믿지 말 것 — Augment "Context Lineage" 가 요약은 2026-06, 1차 페이지는 2025-07-29(14개월 오차).
5. 리서치 B — Claude Code 2.1.273 호환 (원문: b-claude-code-2.1.273-compat.md)
| 파일 | 판정 | 조치(이번 브랜치) |
|---|---|---|
.claude-plugin/plugin.json |
broken — agents 는 .md 경로 배열이어야 함 |
["./agents/codelens-explorer.md"] 로 수정, 비-strict 통과. strict 의 남은 경고는 "플러그인 루트의 CLAUDE.md 는 프로젝트 컨텍스트로 로드되지 않음"(리포=플러그인 루트 구조상 불가피) |
hooks/codelens-session-probe.sh |
source:"fork"(2.1.214+) 미처리 |
fork 가드 추가, 테스트 케이스 추가(11/11) |
crates/.../templates/claude_code.rs → CLAUDE.md 블록 |
네이티브 LSP 언급·host_capabilities 예시 부재 | "Claude Code host facts" 절 추가 후 attach claude-code 로 재생성 |
skills/*/SKILL.md |
trigger·tools 는 스키마 밖(inert, strict 경고 없음) |
죽은 trigger 삭제; tools 는 문서 목적으로 유지 |
docs/platform-setup.md |
deferredToolLoading/hostCapabilities 가 자동 협상처럼 읽힘 |
명시 opt-in 임을 한 문장으로 못박음 |
Dockerfile.release / mcp.json |
EXPOSE·URL 이 7837, 코드 권장·문서·attach 기본은 7838 | 7838 로 정렬(ENTRYPOINT 는 stdio 라 EXPOSE 는 메타데이터) |
.mcp.json(7736 dev 데몬) · agents/codelens-explorer.md · hooks/optional/*.hooks.json · codelens-first.py |
compatible(라이브 validate 통과) | — |
.agents/plugins/marketplace.json |
Claude Code 산출물 아님(Codex 전용) | 감사 범위 밖 |
계약 사실(라이브 문서 HTML 확인): 서버 단위 .mcp.json alwaysLoad 와 도구 단위
_meta["anthropic/alwaysLoad"] 두 메커니즘이 문서화돼 있고 CodeLens 의 키·타입은 정확히 일치.
UNVERIFIED: Claude Code 가 initialize 에서 hostCapabilities 를 보내는지(증거 없음 — 도구 인자 경로만
확인됨), MAX_MCP_OUTPUT_TOKENS 등 env 가 env-vars 페이지에도 있는지.
6. 리서치 C — MCP 스펙·하네스 가이드 (원문: c-mcp-harness-guidance.md)
- 강점 확인: verb facade(
search(mode=…))는 Anthropic 도구 설계 가이드("자주 연쇄되는 다단계를 한 도구로")와 일치. ADR-0015/0016/0010 은 방향상 앞서 있음. ≤20 기본 표면은 CI 로 게이트됨. - 갭 1 (M):
ToolAnnotations에 비스펙 필드 4종(approvalRequired·auditCategory·toolNamespace·tier)을 최상위에 주입. SEP 4건(1862/1913/1984/2417)이 이 객체를 재편 중이라 strict 클라이언트가 거부/제거할 위험 →_meta["codelens/…"]로 이동(K-0026, 별도 ADR). - 갭 3 (S):
ttlMs/cacheScope— 이번에 반영(ttlMs: 300000,cacheScope: "private"). - 갭 2 (실측으로 닫음): 프로파일을
--profile로 사전 스코프한 세션(launchd 데몬은builder가 기본)의 첫 tools/list 는 41/47종이 아니라 20종 이하다 — Claude Code 클라이언트 14종(lean 계약), 일반 클라이언트 20종, 세 프로파일 모두 동일. 41/47종은 기본 목록이 아니라 바인딩 후 호출 가능 집합이므로 ADR-0016 ≤20 게이트는 기동 프로파일과 무관하게 유지된다. 단, builder·builder-minimal 은 core-10 중get_changed_files를 프리셋에서 빼 always-load 가 9종으로 줄어든다(K-0032, S). - 갭 5 (코드로 닫음): 호스트가
host_capabilities.native_tool_search: true를 선언하면session_context.rs의host_declares_native_tool_search가 CodeLens 측_session_deferred_tool_loading게이트를 끈다. 단위 테스트 2건(native_tool_search_disables_codelens_deferred_gate,deferred_gate_stays_on_without_native_tool_search)이 이를 고정하므로 런타임 배선은 확인됨. 지연 로딩을 지원하는 호스트에선 always-load 만 컨텍스트 비용이므로 core-10 정렬이 정답. 비지연 호스트(Codexcodex-mcp-client)는 바인딩 후 63종 전체 스키마를 받는다 → 그 호스트용 lean 리스팅은 후속 과제. - 갭 4 (S, 미착수): Anthropic 가이드의
response_format: concise|detailed패턴이 어떤 도구에도 없다 (tools.toml 0건). 5단계 응답 압축이 이미 같은 목적을 채우는지 먼저 계측한 뒤 결정(K-0031). - 갭 6 (M): verb mode 의 tool search 발견성 평가 부재("find callers of X" →
graph(mode=callers)적중률) — 소형 eval 필요(K-0028). - 스펙 2026-07-28 전략 항목: 무상태 MCP(핸드셰이크·세션 헤더 제거, 요청마다
_meta에 protocolVersion/ clientCapabilities),server/discover필수,subscriptions/listen,resultType필수, 결정적 tools/list 순서, Roots/Sampling/Logging 폐기(CodeLens 는 셋 다 미구현이라 이행 비용 0), Tasks 는 확장으로 분리. CodeLens 의Mcp-Session-Id기반 표면·notify_tools_list_changed·세션 full exposure 는 이 개정판의 "리스트 엔드포인트는 연결별로 달라지지 않는다" 와 충돌 → 표면 상태를 서버 발급 핸들(도구 인자)로 옮기는 설계가 필요(K-0027, ADR). Claude Code 2.1.273 은 구 핸드셰이크를 쓰므로 당장은 무영향. - 확신도 낮은 항목: Cursor 40-도구 상한(커뮤니티 포럼만), 실무자 토큰 비용 수치(단일 셋업).
7. 우선순위와 실행 현황
| P | 항목 | 상태 |
|---|---|---|
| P0 | plugin.json agents 배열화 |
브랜치 커밋 |
| P1 | always-load → ADR-0016 core-10(35→10, −61%) | 브랜치 커밋 + 에페메랄 실측 |
| P1 | 훅 fork 가드 · 템플릿 host facts(LSP·host_capabilities) · tools/list ttlMs/cacheScope |
브랜치 커밋 |
| P1 | tools/list 텔레메트리 영속 제외 | 브랜치 커밋 |
| P2 | CLAUDE.md 다이어트 · 포트 7837→7838 정렬 · platform-setup opt-in 명시 · 스킬 dead 키 · ADR-0018 게이트 판정 | 브랜치 커밋 |
| P2 | 클린 워크트리 제거 · 병합 브랜치 81개 삭제 | 로컬 적용(원장 보존) |
| 백로그 | K-0023 presets codegen · K-0024 payload 게이지 · K-0025 과분할 · K-0026 annotations→_meta · K-0027 무상태 MCP ADR · K-0028 verb 발견성 eval · K-0029 staleness 배너 · K-0030 camel_split 토크나이저 | .codelens/kaizen_board.json |
미적용(사용자 결정): main 병합, origin 푸시, 데몬 재배포(런타임 변경 3종 — alwaysLoad·텔레메트리
필터·ttlMs — 는 재배포 전까지 효력 0), 미커밋 WIP 4파일(09-10, token-suggestion-inventory 워크트리와
바이트 동일) 처리, token-suggestion-inventory/target 2.5 GB 정리, AGENTS.md(Codex 10.5 KB) 다이어트
(host-context-efficiency 워크트리가 편집 중이라 충돌 회피).
8. Open questions
- Claude Code 가
initialize에 host capabilities 를 실어 보내는 경로가 생길지(현재는 도구 인자만). - 비지연 호스트(Codex)에서 바인딩 후 63종 풀 스키마가 실제 정확도에 미치는 영향 — CodeGraph 식 "잔존 컨텍스트" 벤치로 측정 필요(K-0028 과 묶음).
- 무상태 MCP 로 옮길 때 세션별 프로파일(readonly/review/builder)을 어디에 둘 것인가 — 서버 발급
핸들 vs 요청
_meta확장.
9. Staleness
- Claude Code 는 주 단위 릴리스 — 이 문서의 CLI 검증은 2.1.273 기준, 1개월 후 재검증.
- MCP 2026-07-28 은 개정 7주차 —
ttlMs/cacheScope·Tasks 확장의 호스트 채택은 아직 낮음. - 스타 수·다운로드 수는 반올림 값, 인용 시점 재확인.