oh-my-customcode 2.0.2 → 2.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli/index.js CHANGED
@@ -335,7 +335,7 @@ var init_package = __esm(() => {
335
335
  workspaces: [
336
336
  "packages/*"
337
337
  ],
338
- version: "2.0.2",
338
+ version: "2.0.4",
339
339
  description: "Batteries-included agent harness for Claude Code",
340
340
  type: "module",
341
341
  bin: {
package/dist/index.js CHANGED
@@ -2906,7 +2906,7 @@ var package_default = {
2906
2906
  workspaces: [
2907
2907
  "packages/*"
2908
2908
  ],
2909
- version: "2.0.2",
2909
+ version: "2.0.4",
2910
2910
  description: "Batteries-included agent harness for Claude Code",
2911
2911
  type: "module",
2912
2912
  bin: {
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "workspaces": [
4
4
  "packages/*"
5
5
  ],
6
- "version": "2.0.2",
6
+ "version": "2.0.4",
7
7
  "description": "Batteries-included agent harness for Claude Code",
8
8
  "type": "module",
9
9
  "bin": {
@@ -2309,6 +2309,596 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2309
2309
  - 모델 카탈로그 셀 정정: Sonnet 5.5 cache read 비용 표기는 이번 변경에서 R006 Tier-2 표(`.claude/rules/MUST-agent-design.md:52`)와 `guides/multi-model-routing/README.md:38`에 정정되었습니다. 이는 카탈로그 값 정정이며 에이전트 행동 규범을 바꾸는 변경은 아닙니다. 위 첫 항목의 "룰 문안 변경은 불필요"는 이 카탈로그 셀을 제외한 규범 문안을 가리킵니다.
2310
2310
  - 이 문서의 규범 변경 제안은 없습니다(CC 2.1.296 CHANGELOG 항목 기준).
2311
2311
 
2312
+ ---
2313
+
2314
+ ## v2.1.299 (2026-10-14)
2315
+
2316
+ > Issue: #1861 — Claude Code v2.1.299 compatibility documentation
2317
+ > Scope-ceiling check (R017): 조사 시점(2026-10-25)의 최신 릴리즈는 2.1.310입니다(`claude --version`=2.1.310, `npm view @anthropic-ai/claude-code version`=2.1.310). 상한 이후 릴리즈 2.1.300~2.1.310의 CHANGELOG 절을 각각 잘라 "2.1.299"와 "Revert"를 검색했습니다. "2.1.299"는 11개 절에서 한 번도 나타나지 않았습니다(절마다 `awk -v v="<버전>" '/^## /{p=($2==v)} p' CHANGELOG.md`로 자른 파일에 `grep -c '2\.1\.299'` = 0). 대소문자를 무시한 "revert"는 2곳에서 나타났으며 둘 다 git의 revert 상태 감지에 관한 문장입니다. 2.1.300의 "Fixed the diff view in Claude Desktop and Remote Control sessions not noticing a conflicted cherry-pick or revert in reftable repositories"와 2.1.301의 "Fixed `/diff` not noticing a conflicted cherry-pick or revert in reftable repositories when one of its git checks timed out or failed"이며, 이 릴리즈 항목을 되돌리거나 좁히는 문장은 관측한 범위에서 찾지 못했습니다. 릴리즈 게시 시각은 2026-10-14T02:49:42Z입니다(`gh release view v2.1.299 -R anthropics/claude-code --json publishedAt`).
2318
+
2319
+ ### 훅 · 프롬프트 제출 순서
2320
+
2321
+ - CHANGELOG 원문: "Changed `UserPromptSubmit` hooks to run before a skill or custom slash command expands, so a hook that blocks the prompt now also stops its embedded shell commands"
2322
+ (299) `UserPromptSubmit` 훅이 스킬이나 사용자 정의 슬래시 커맨드가 확장되기 전에 실행되도록 바뀌어, 프롬프트를 차단하는 훅이 이제 그 커맨드에 포함된 셸 명령도 멈춥니다. CC가 로드하는 `.claude/settings.json:233`의 `UserPromptSubmit`에는 command 훅 4개(`user-prompt-preprocessor.sh`, `r007-r008-drift-advisor.sh`, `session-autofix-prompt.sh`, `fail-axis-cause-advisor.sh`)가 배선되어 있습니다(`jq -c '[(.hooks.PreToolUse | length), ([.hooks.PreToolUse[] | .hooks[]] | length), ([.hooks.UserPromptSubmit[] | .hooks[]] | length)]' .claude/settings.json` = `[11,14,4]`). 이 중 세 스크립트는 `"decision": "block"`을 내보내지 않도록 주석으로 명시합니다(`.claude/hooks/scripts/user-prompt-preprocessor.sh:28`, `.claude/hooks/scripts/r007-r008-drift-advisor.sh:442`, `.claude/hooks/scripts/fail-axis-cause-advisor.sh:20`). R021은 이 중 `r007-r008-drift-advisor.sh`와 `fail-axis-cause-advisor.sh`를 Advisory 계층으로 분류합니다(`.claude/rules/MUST-enforcement-policy.md:23`, `:25`). 네 스크립트를 세 가지로 조회했습니다(각각 `-- <네 스크립트 경로>`): `git grep -n -i -E 'decision|block'`, `git grep -n -E 'exit [1-9]|"continue"|continue *:|stopReason'`, `git grep -n -E 'exit +"?\$'`. 앞의 두 조회에서 나온 히트는 주석 줄(예: `.claude/hooks/scripts/r007-r008-drift-advisor.sh:117`~`:119`, `:442`, `.claude/hooks/scripts/user-prompt-preprocessor.sh:28`, `:97`, `.claude/hooks/scripts/fail-axis-cause-advisor.sh:20`, `:130`)과 `r007-r008-drift-advisor.sh`에서 content block을 다루는 jq 줄(`:266`~`:309`)이었습니다. 셋째 조회는 출력이 없었고(rc=1), `session-autofix-prompt.sh`에서는 세 조회 어디에서도 히트가 나오지 않았습니다. 따라서 관측한 범위(위 세 조회)에서 이 네 훅은 명시적인 차단 출력(`decision`·`continue`·`stopReason` 키)이나 명시적인 차단 종료 코드(`exit 2`)를 내지 않습니다. 다만 세 스크립트는 `set -euo pipefail`로 실행되므로(`.claude/hooks/scripts/fail-axis-cause-advisor.sh:41`, `.claude/hooks/scripts/user-prompt-preprocessor.sh:41`, `.claude/hooks/scripts/r007-r008-drift-advisor.sh:129`; `session-autofix-prompt.sh`에는 `git grep -n -E '^set -'` 히트 없음) 보호되지 않은 명령이 실패하면 그 명령의 종료 코드로 끝날 수 있고, 이 `set -e` 경로는 조회하지 않았습니다. 차단 시 셸 명령도 멈춘다는 변경은 명시적 차단 경로 기준으로 이 훅들에 해당하지 않으며, `set -e` 경로까지 포함한 판정은 [가설 — 각 스크립트에서 보호 없이 실패할 수 있는 명령이 종료 코드 2로 끝날 수 있는지 확인하면 판정 가능]로 남깁니다. 두 스크립트는 훅 입력의 `.prompt`를 읽습니다(`.claude/hooks/scripts/user-prompt-preprocessor.sh:54`, `.claude/hooks/scripts/fail-axis-cause-advisor.sh:54`). 훅이 확장 전에 실행되므로 `/fsd` 같은 스킬 호출에서 `.prompt`가 확장 전 원문을 담을 수 있습니다 [가설 — 2.1.299 전후로 `/<skill>` 프롬프트의 훅 stdin `.prompt`를 캡처해 비교하면 판정 가능]. 스킬 본문의 셸 주입 표기는 ``git grep -c -E '!`' -- '.claude/skills/*/SKILL.md'`` 출력 1줄(`.claude/skills/omcustom-release-notes/SKILL.md:1`)이며, 그 줄(`:164`)은 커밋 메시지의 `!` breaking 표기 설명이라 셸 주입 구문이 아닙니다.
2323
+ - CHANGELOG 원문: "Changed a skill's own front-matter `UserPromptSubmit` hook to first run on the prompt after the one that invokes the skill"
2324
+ (299) 스킬 frontmatter에 선언된 `UserPromptSubmit` 훅이 그 스킬을 호출한 프롬프트가 아니라 그다음 프롬프트에서 처음 실행되도록 바뀌었습니다. 관측한 범위에서 `.claude/skills/*/SKILL.md`에는 `hooks:` frontmatter 줄과 `UserPromptSubmit` 문자열이 나타나지 않으므로(`git grep -n -E '^hooks:' -- '.claude/skills/*/SKILL.md'`와 `git grep -n UserPromptSubmit -- '.claude/skills/*/SKILL.md'` 둘 다 출력 없음) 이 저장소 스킬에는 해당하지 않습니다.
2325
+ - CHANGELOG 원문: "Fixed plan mode running a write (an MCP tool's, a file's, a shell command's) that a `PreToolUse` hook or a mod's `tool.check` hook allowed"
2326
+ (299) `PreToolUse` 훅이나 mod의 `tool.check` 훅이 허용한 쓰기(MCP 도구·파일·셸 명령)를 plan mode가 실행하던 결함이 수정되었습니다. `.claude/settings.json:37`의 `PreToolUse`에는 matcher 그룹 11개와 훅 명령 14개가 있습니다(위 `jq -c` 출력 `[11,14,4]`의 앞 두 값). 관측한 범위에서 이 훅들은 `permissionDecision`을 출력하지 않으므로(`git grep -n permissionDecision -- .claude/settings.json .claude/hooks templates/.claude/settings.json` rc=1) 훅이 명시적으로 허용하는 경로는 관측되지 않았습니다. 종료 코드 0으로 끝나는 훅이 결함 조건의 "allowed"에 해당했는지는 원문이 밝히지 않습니다 [가설 — 구버전 plan mode에서 exit 0으로 끝나는 `PreToolUse` 훅 뒤의 Write가 실행되는지 재현하면 판정 가능]. 에이전트 frontmatter에서 `plan` permission mode나 `opusplan` 모델은 관측되지 않았습니다(`git grep -n -E '^permissionMode:|^model: *opusplan' -- '.claude/agents/*.md'` 49줄이 모두 `permissionMode: bypassPermissions`). R006 Permission Mode 표는 `plan`을 "Require plan approval"로 설명합니다(`.claude/rules/MUST-agent-design.md:382`). 사용자가 대화형 세션에서 plan mode를 쓸 때의 영향은 측정하지 않았습니다.
2327
+
2328
+ ### 서브에이전트 · SendMessage · 백그라운드 알림
2329
+
2330
+ - CHANGELOG 원문: "Fixed background subagents in auto mode sometimes sending their final report twice, once as the result and once as a message"
2331
+ (299) auto mode의 백그라운드 서브에이전트가 때때로 최종 보고를 결과로 한 번, 메시지로 한 번, 두 번 보내던 결함이 수정되었습니다. R009는 완료 알림에 보고 본문이 없으면 한 턴 기다린 뒤 산출물을 실측하고 `SendMessage`로 재요청하도록 규정합니다(`.claude/rules/MUST-parallel-execution.md:368`). 구버전에서 같은 보고가 두 번 도착하면 별개의 완료나 재요청에 대한 응답으로 오인할 수 있으므로, 보고 횟수가 아니라 산출물 실측으로 완료를 판정하는 R020 원칙을 그대로 적용합니다. 저장소가 추적하는 permission mode 값은 project `.claude/settings.json:23`의 `"defaultMode": "bypassPermissions"`입니다(`git ls-files .claude/settings.local.json` 출력 없음, `git check-ignore -v --no-index .claude/settings.local.json` = `.gitignore:40:.claude/*`). 유지보수자 기기에서는 `jq -r '.permissions.defaultMode // "unset"' ~/.claude/settings.json .claude/settings.json .claude/settings.local.json`의 출력이 `auto`, `bypassPermissions`, `bypassPermissions`로 관측되었으며, user·local 값은 기기 로컬 값입니다. R010은 user `auto`와 project·local `bypassPermissions` 조합이 `claude -p`에서 `default`로 시작한다고 기록하고, 같은 문단에서 대화형 TTY 세션은 2026-09-02 기록("auto mode is active")과 조정되지 않은 `[가설]`로 남깁니다(`.claude/rules/MUST-orchestrator-coordination.md:588`). 대화형 세션이 auto mode로 실행되는지는 측정하지 않았습니다 [가설 — 세션의 실제 permission mode 표시로 판정].
2332
+ - CHANGELOG 원문: "Fixed `SendMessage` not finding a subagent by name after the CLI restarted and resumed the session (names given before the last compaction still need the agent ID)"
2333
+ (299) CLI가 재시작되어 세션을 resume한 뒤 `SendMessage`가 이름으로 서브에이전트를 찾지 못하던 결함이 수정되었습니다. 원문 괄호는 이 수정의 예외로, 재시작·resume 뒤에도 마지막 compaction 이전에 붙인 이름은 여전히 agent ID가 필요하다고 적습니다. R018은 이름을 붙인 `Agent` 스폰이 세션의 암묵적 팀의 팀원을 만든다고 기록하고(`.claude/rules/MUST-agent-teams.md:22`), R009는 보고가 빠진 위임을 `SendMessage`로 재요청하도록 규정합니다(`.claude/rules/MUST-parallel-execution.md:368`). 따라서 재시작·resume를 거친 세션에서 마지막 compaction 이전에 붙인 이름의 위임을 이어갈 때는 agent ID로 `SendMessage`를 보내야 합니다. 재시작 없이 compaction(아래 idle compaction 포함)만 거친 세션의 이름 조회는 원문이 다루지 않습니다 [가설 — 재시작 없이 compaction된 세션에서 compaction 이전 이름으로 `SendMessage`를 보내 보면 판정 가능]. 그 경우에도 agent ID 사용을 예방 조치로 권합니다. 이 저장소 위임에서 이름 기반 `SendMessage`를 얼마나 쓰는지는 측정하지 않았습니다.
2334
+ - CHANGELOG 원문: "Improved background agent notifications: they now say when an agent is only waiting on its own background work, got a message too late for its result, or was stopped by a usage limit"
2335
+ (299) 백그라운드 에이전트 알림이 이제 에이전트가 자기 백그라운드 작업을 기다리고 있을 뿐인 경우, 결과에 반영되기에는 늦게 메시지를 받은 경우, 사용량 한도로 멈춘 경우를 알려줍니다. 새 문구는 실측할 대상을 고르는 신호로 쓸 수 있지만 완료 증거는 아닙니다. R018 「Member Completion Verification」(`.claude/rules/MUST-agent-teams.md:501`의 제목, `:503`의 본문)과 R009 결과 수집 절차(`.claude/rules/MUST-parallel-execution.md:368`)의 ground-truth 실측 의무는 바뀌지 않습니다.
2336
+ - CHANGELOG 원문: "Changed agent `tools:` lists to take only the named MCP server's tools; list a server whose name contains `__` as `mcp__<whole name>__*`"
2337
+ (299) 에이전트 `tools:` 목록이 이름으로 지정한 MCP 서버의 도구만 받도록 바뀌었고, 이름에 `__`가 들어 있는 서버는 `mcp__<whole name>__*`로 적어야 합니다. 관측한 범위에서 `.claude/agents/*.md`에는 `mcp__` 항목이나 `mcpServers:` 줄이 없으므로(`git grep -n -E 'mcp__|^mcpServers:' -- '.claude/agents/*.md'` 출력 없음) 이 저장소 에이전트 정의에는 해당하지 않습니다.
2338
+
2339
+ ### 권한 · MCP 규칙 · settings
2340
+
2341
+ - CHANGELOG 원문: "Changed MCP allow rules to reach only the server they name: `mcp__a` no longer allows a server named `a__b` or `a_`; write `mcp__<server>__*` with the server's whole normalized name"
2342
+ (299) MCP allow 규칙이 이름으로 지정한 서버에만 적용되도록 바뀌어, `mcp__a`가 더 이상 `a__b`나 `a_`라는 서버를 허용하지 않습니다. 관측한 범위(`git grep -n -E 'mcp__|enabledMcpjsonServers|disabledMcpjsonServers|enableAllProjectMcpServers' -- .claude/settings.json templates/.claude/settings.json`)에서 두 설정 파일의 `mcp__` 문자열은 `PostToolUse` 훅의 `"matcher"` 값(`.claude/settings.json:582`, `templates/.claude/settings.json:548`)이며 permission 규칙이 아닙니다. 유지보수자 기기의 gitignore된 `.claude/settings.local.json`(저장소 추적 대상 아님)에서 관측한 `mcp__`도 훅 `"matcher"` 값이었습니다(`command grep -n -E 'mcp__|McpjsonServers' .claude/settings.local.json`). `.mcp.json`의 서버 이름은 `ontology-rag`(`.mcp.json:3`)와 `eraser`(`.mcp.json:14`)이고(`jq -c '.mcpServers | to_entries | map({name: .key, type: (.value.type // "stdio")})' .mcp.json` 출력 2개 항목) `__`나 끝의 `_`를 포함하지 않습니다. 따라서 이 변경의 영향 조건은 관측되지 않았습니다.
2343
+ - CHANGELOG 원문: "Fixed deny and ask rules for an MCP server (`mcp__<server>`) not applying when the server's normalized name contains a double underscore"
2344
+ (299) 정규화된 서버 이름에 이중 밑줄이 들어 있으면 그 MCP 서버의 deny·ask 규칙(`mcp__<server>`)이 적용되지 않던 결함이 수정되었습니다. 바로 위 항목의 근거대로 관측한 범위의 설정 파일에는 `mcp__` permission 규칙이 없고 `.mcp.json` 서버 이름에 `__`가 없으므로 영향 조건이 관측되지 않았습니다.
2345
+ - CHANGELOG 원문: "Fixed a settings file being ignored when `enabledMcpjsonServers` or `disabledMcpjsonServers` held a single server name (letters, digits, - or _) as a plain string"
2346
+ (299) `enabledMcpjsonServers`나 `disabledMcpjsonServers`가 서버 이름 하나를 일반 문자열로 담으면 그 설정 파일이 무시되던 결함이 수정되었습니다. `.claude/settings.json:26`~`:28`의 `enabledMcpjsonServers`는 배열(`["ontology-rag"]`)입니다. 유지보수자 기기의 gitignore된 `.claude/settings.local.json`(`git check-ignore -v --no-index .claude/settings.local.json` = `.gitignore:40:.claude/*`)에서도 이 키가 배열로 시작하는 것을 관측했습니다. `templates/.claude/settings.json`에는 이 키가 나타나지 않습니다(위 `git grep`). 관측한 값이 문자열이 아니므로 결함 조건에 해당하지 않습니다.
2347
+ - CHANGELOG 원문: "Fixed `claude mcp list`, `claude mcp get` and subagent MCP servers starting a server that a policy check blocks; it is now reported as blocked without being started"
2348
+ (299) `claude mcp list`·`claude mcp get`과 서브에이전트 MCP 서버가 정책 검사로 차단된 서버를 시작하던 결함이 수정되어, 이제 시작하지 않고 blocked로 보고합니다. 서브에이전트 소절의 `tools:` 항목에서 실행한 `git grep -n -E 'mcp__|^mcpServers:' -- '.claude/agents/*.md'`(출력 없음)대로 에이전트 frontmatter에 `mcpServers:` 줄이 없으므로 서브에이전트 MCP 서버 경로는 관측되지 않았고, managed 정책 설정은 확인하지 않았습니다.
2349
+ - CHANGELOG 원문: "Fixed MCP connections over HTTP hanging for 30 seconds and failing when a server never ends the body of its reply to a notification (anthropics/claude-code#99014)"
2350
+ (299) 서버가 알림에 대한 응답 본문을 끝내지 않으면 HTTP 기반 MCP 연결이 30초 동안 멈췄다가 실패하던 결함이 수정되었습니다. `.mcp.json:14`~`:16`의 `eraser`는 `"type": "http"` 서버이므로 이 결함 조건에 들어갈 수 있는 연결입니다 [가설 — `eraser` 서버가 알림 응답 본문을 끝내지 않는지는 미관측이며, 2.1.299 미만에서 `eraser` 연결 시 30초 정지 후 실패가 재현되면 판정 가능]. v2.1.295 절의 원격 MCP 재연결 항목도 같은 `eraser` http 서버를 관련 연결로 다뤘습니다. 다만 그 항목의 원문은 headless·SDK 세션의 원격 MCP 서버에 한정되었고, 이번 수정의 원문은 세션 종류를 한정하지 않습니다. `ontology-rag`는 `.mcp.json:4`의 `"type": "stdio"`이므로 HTTP 연결 조건에 해당하지 않습니다.
2351
+ - CHANGELOG 원문: "Fixed rm prompts on shell `-c` scripts that don't run `rm`. An rm built at run time in a script Claude Code can't read no longer prompts unless `CLAUDE_CODE_STRICT_INLINE_SHELL_RM_PROMPT=1`"
2352
+ (299) `rm`을 실행하지 않는 셸 `-c` 스크립트에 rm 확인 프롬프트가 뜨던 결함이 수정되었습니다. 또한 Claude Code가 읽을 수 없는 스크립트 안에서 실행 시점에 조립된 rm은 `CLAUDE_CODE_STRICT_INLINE_SHELL_RM_PROMPT=1`이 아니면 더 이상 프롬프트를 띄우지 않습니다. R005는 즉석 순회를 `xargs`·배열·`bash -c`로 쓰도록 권하므로(`.claude/rules/MAY-optimization.md:43`) 앞 절은 이 형태의 불필요한 프롬프트를 줄이는 방향입니다. 뒤 절은 확인 프롬프트 하나를 기본으로 없애는 방향이며, 관측한 범위(`git grep -n STRICT_INLINE_SHELL -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'` rc=1)에서 이 저장소는 그 환경 변수를 설정하지 않습니다. R006 표에 따르면 `bypassPermissions`는 "Skip all permission prompts"이므로(`.claude/rules/MUST-agent-design.md:381`) 이 변경은 다른 permission mode로 실행되는 세션에서 관련됩니다. 위 서브에이전트 항목에서 유지보수자 기기로 관측한 조합(user `auto` + project·local `bypassPermissions`)은 R010 기록상 `claude -p`에서 `default`로 시작하므로(`.claude/rules/MUST-orchestrator-coordination.md:588`) 그런 기기의 무인 실행에도 관련될 수 있습니다. 이 저장소의 파괴적 명령 방어에는 CC 프롬프트와 별개로 `PreToolUse` Bash 훅(`destructive-git-guard.sh`, `rule-deletion-guard.sh`)도 있지만, 이 훅들이 실행 시점에 조립된 rm을 잡는지는 측정하지 않았습니다 [가설 — 합성 입력으로 두 훅을 재현하면 판정 가능].
2353
+
2354
+ ### 컨텍스트 · compaction · 상태줄
2355
+
2356
+ - CHANGELOG 원문: "Added idle compaction in the terminal: a 200K+ token conversation left idle for about 54 minutes is compacted before its one-hour prompt cache expires, so your next message doesn't reprocess it all"
2357
+ (299) 터미널에서 200K 토큰 이상인 대화가 약 54분 동안 유휴 상태로 남으면, 1시간 prompt cache가 만료되기 전에 compact해 다음 메시지가 전체를 다시 처리하지 않도록 하는 idle compaction이 추가되었습니다. compact된 뒤에는 R010 「Session Continuity」의 CLAUDE.md 재독 의무(`.claude/rules/MUST-orchestrator-coordination.md:848`의 제목, `:850`의 본문)와 R021의 `SessionStart` 재주입 경로(`.claude/rules/MUST-enforcement-policy.md:9`의 각주, `claude-md-reinject.sh`)가 적용됩니다. 위 `SendMessage` 항목의 제한(재시작·resume 뒤 마지막 compaction 이전 이름은 agent ID 필요, 재시작 없는 compaction은 [가설])과 아래 `/reload-skills` 항목도 함께 관련됩니다. R013의 컨텍스트 예산은 사용량 기준입니다(`.claude/rules/SHOULD-ecomode.md:172`의 보이는 제목 "R013 context budget (usage-based)", `:181`의 DETAIL 주석). 같은 파일의 DETAIL 주석(`:174`~`:182`)에 있는 Token Guardian 행은 "1h cache TTL idle detection"을 트리거로 적고 있어(`:179`) idle compaction과 같은 유휴 구간을 겨냥합니다 [가설 — cc-token-saver 설치 여부와 실제 동작은 미관측이며, 두 장치가 함께 켜진 환경에서 유휴 구간 동작을 관찰하면 판정 가능]. 원문이 "in the terminal"로 한정하므로 `claude -p` 무인 실행에 적용되는지는 확인하지 않았습니다.
2358
+ - CHANGELOG 원문: "Added `CLAUDE_CODE_IDLE_COMPACT_MIN_TOKENS` to change idle compaction's 200K-token minimum; `"idleCompaction": false` in settings.json turns it off. Both need v2.1.290 or later"
2359
+ (299) `CLAUDE_CODE_IDLE_COMPACT_MIN_TOKENS`로 idle compaction의 200K 토큰 하한을 바꿀 수 있고, settings.json의 `"idleCompaction": false`로 끌 수 있습니다. 원문은 둘 다 v2.1.290 이상이 필요하다고 적습니다. 관측한 범위(`git grep -n -i -E 'idleCompaction|IDLE_COMPACT' -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'` rc=1)에서 이 저장소는 어느 쪽도 설정하지 않으므로 터미널 세션에서는 기본 동작을 따릅니다 [가설 — 기본 활성 여부는 원문의 "turns it off"에서 추론했으며, 200K 토큰을 넘긴 세션을 54분 이상 두어 compaction 발생을 관찰하면 판정 가능].
2360
+ - CHANGELOG 원문: "Fixed replies cut off at the output token limit ending the turn silently, with no retry or error, after a request fell back to non-streaming mode"
2361
+ (299) non-streaming 모드로 폴백한 요청에서 출력 토큰 한도에 걸려 잘린 응답이 재시도나 오류 없이 턴을 조용히 끝내던 결함이 수정되었습니다. R004는 v2.1.246·v2.1.257의 자동 이어감 경계를 기록하고(`.claude/rules/SHOULD-error-handling.md:28`, `:30`), 서브에이전트 중간 종료를 진단할 때 R020 「maxTurns 절단 실증」의 turn 한도를 먼저 확인하도록 안내합니다(`:30`). 2.1.299 미만 세션에서 표시 없이 끝난 응답은 turn 한도나 네트워크 절단이 아니라 이 결함이었을 수 있으므로 진단 후보에 포함합니다 [가설 — non-streaming 폴백 여부를 트랜스크립트에서 확인해야 판정 가능].
2362
+ - CHANGELOG 원문: "Improved `/reload-skills` to say it re-sends the full skill list to Claude, which is how to get skills back after compaction"
2363
+ (299) `/reload-skills`가 전체 스킬 목록을 Claude에게 다시 보낸다고 안내하도록 개선되었으며, 원문은 이것이 compaction 뒤 스킬을 되찾는 방법이라고 적습니다. 이 저장소는 스킬 114개를 추적합니다(`git ls-files '.claude/skills/*/SKILL.md' | wc -l` = 114). R013의 v2.1.261 노트는 `/skill-doctor`를 스킬 컨텍스트 비용 진단 수단으로 기록합니다(`.claude/rules/SHOULD-ecomode.md:97`). `/reload-skills`는 사용자가 입력하는 슬래시 커맨드이므로, 대화형 세션에서 compaction(위 idle compaction 포함) 뒤 스킬을 찾지 못할 때 복구 수단이 됩니다. 무인 `claude -p` 실행에서 이 커맨드를 쓸 수 있는지는 확인하지 않았습니다. compaction 뒤 이 저장소 세션에서 스킬 목록이 실제로 빠졌는지는 관측하지 않았습니다.
2364
+ - CHANGELOG 원문: "Fixed `/usage`, the approaching-limit warning (terminal and VS Code) and the status line sometimes showing more than 100% used (anthropics/claude-code#92238)"
2365
+ (299) `/usage`, 한도 근접 경고(터미널·VS Code), 상태줄이 때때로 사용량을 100% 넘게 표시하던 결함이 수정되었습니다. R012 상태줄 스크립트는 `rate_limits.five_hour.used_percentage`와 `rate_limits.seven_day.used_percentage`를 읽고(`.claude/statusline.sh:103`~`:104`) 정수로 바꾼 값을 상한 없이 `RL:${rl_5h_int}%`로 표시합니다(`:350`~`:351`). 원문의 "the status line"이 상태줄 명령에 전달되는 `rate_limits` 값까지 포함한다면, 구버전에서 RL 세그먼트에 나타난 100% 초과 값은 스크립트가 아니라 플랫폼 값에서 왔을 수 있습니다 [가설 — 구버전 상태줄 stdin의 `used_percentage`가 100을 넘었는지 캡처하면 판정 가능].
2366
+
2367
+ ### 무인 · headless(`-p`) 실행
2368
+
2369
+ - CHANGELOG 원문: "Fixed `claude -p` saying nothing when a settings file fails validation: text-output runs now list the file and the invalid entry on stderr"
2370
+ (299) 설정 파일이 검증에 실패해도 `claude -p`가 아무것도 알리지 않던 결함이 수정되어, 이제 텍스트 출력 실행은 stderr에 그 파일과 잘못된 항목을 표시합니다. `/fsd`는 `claude -p`·예약 실행 같은 무인 경로를 다루고(`.claude/skills/fsd/SKILL.md:133`, `:172`), R010은 유효 permission mode를 `claude -p` init 값으로 실측한 기록에 기대고 있습니다(`.claude/rules/MUST-orchestrator-coordination.md:588`). 이 저장소의 `.claude/settings.json`은 `_comment_defaultMode` 같은 주석용 키를 담고 있습니다(`.claude/settings.json:22`). 2.1.299 이상에서 이 파일이 검증 오류를 내는지는 실행해 보지 않았습니다 [가설 — `claude -p` 텍스트 출력 실행의 stderr를 확인하면 판정 가능].
2371
+ - CHANGELOG 원문: "Fixed a regression in 2.1.296 where cloud and headless sessions could run an approved tool call twice if a new message arrived as the session resumed after a restart"
2372
+ (299) 2.1.296에서 생긴 회귀로, cloud·headless 세션이 재시작 후 resume되는 동안 새 메시지가 도착하면 승인된 도구 호출을 두 번 실행할 수 있던 결함이 수정되었습니다. 영향 구간은 2.1.296 이상 2.1.299 미만이며, 원문의 발생 조건은 재시작, 그 뒤의 resume, resume 도중 새 메시지 도착의 세 가지입니다. `/fsd`를 `claude -p`로 돌리는 경로(`.claude/skills/fsd/SKILL.md:172`)에서 이 구간에 세 조건이 함께 일어났다면 `git commit`·`gh issue create` 같은 비멱등 호출이 중복되었을 수 있으므로, 그 구간의 무인 실행 결과는 중복 커밋·이슈 여부를 실측으로 확인하는 것이 좋습니다 [가설 — 해당 구간에서 세 조건이 함께 발생했는지는 미관측].
2373
+ - CHANGELOG 원문: "Fixed MCP tool calls in headless and SDK sessions sometimes failing or running twice when a background reconnect closed the connection they were running on"
2374
+ (299) headless·SDK 세션에서 백그라운드 재연결이 실행 중인 연결을 닫으면 MCP 도구 호출이 때때로 실패하거나 두 번 실행되던 결함이 수정되었습니다. `.mcp.json`에는 stdio 서버 `ontology-rag`(`:3`~`:4`)와 원격 http 서버 `eraser`(`:14`~`:16`)가 있으며, 이 항목은 v2.1.295 절에서 다룬 원격 MCP 재연결 수정과 같은 계열입니다. 무인 실행에서 `eraser`의 생성 도구가 두 번 실행되면 중복 산출물이 생길 수 있습니다 [가설 — 무인 실행에서 `eraser` 도구 사용은 미관측]. R019는 enrichment 실패 시 조용히 건너뛰도록 규정하므로(`.claude/rules/SHOULD-ontology-rag-routing.md:39`의 「Failure Handling」 제목, `:43`의 "MCP server unavailable" 행, `:48`) `ontology-rag` 호출 실패는 라우팅을 막지 않습니다.
2375
+
2376
+ ### 예약 작업 · `/loop`
2377
+
2378
+ - CHANGELOG 원문: "Fixed scheduled tasks and loops firing again after every turn, or firing early, during the repeated hour when daylight saving time ends"
2379
+ (299) 서머타임이 끝나 같은 시각이 반복되는 한 시간 동안 예약 작업과 루프가 매 턴 뒤 다시 발화하거나 일찍 발화하던 결함이 수정되었습니다. 원문은 세션 종류를 한정하지 않습니다. `/fsd`는 self-paced `/loop`를 반복 수단의 하나로 설명하고(`.claude/skills/fsd/SKILL.md:39`), 무인 실행(`claude -p`, 예약 실행)에서 `/goal`·`/loop` 호출을 권장합니다(`:172`). 따라서 서머타임 종료 구간에 `/loop`로 `/fsd`를 돌린 경우 반복이 매 턴 뒤 다시 발화하거나 일찍 발화했을 수 있습니다 [가설 — 원문의 "loops"가 self-paced `/loop`를 포함하는지와 서머타임 종료 구간의 `/fsd` 실행 사례는 미관측].
2380
+ - CHANGELOG 원문: "Fixed scheduled tasks being announced for the wrong minute: the scheduling tools now report each job's actual next run time"
2381
+ (299) 예약 작업의 공지 시각이 잘못된 분(minute)으로 표시되던 결함이 수정되어, 이제 예약 도구가 각 작업의 실제 다음 실행 시각을 보고합니다. 원문은 세션 종류를 한정하지 않습니다. 관측한 범위(`git grep -n -E 'ScheduleWakeup|CronCreate' -- .claude/skills`)에서 이 저장소 스킬의 예약 도구 언급은 `/fsd`의 `/loop`(ScheduleWakeup) 설명(`.claude/skills/fsd/SKILL.md:162`)과 `claude-native` 스킬의 `CronCreate` 예약 실행 안내(`.claude/skills/claude-native/SKILL.md:232`, `:240`)입니다. 이 경로로 예약한 작업은 2.1.299 미만에서 보고된 다음 실행 시각이 실제와 분 단위로 어긋났을 수 있습니다 [가설 — ScheduleWakeup이 원문의 "scheduling tools"에 포함되는지와 두 경로의 실제 사용은 미관측].
2382
+
2383
+ ### 스킬 로딩 · Read/Write 도구
2384
+
2385
+ - CHANGELOG 원문: "Changed skill and command loading: one whose file or folder name has hidden, direction-changing or blank-like characters, `<` or `>` is no longer offered until renamed; such a `name:` is ignored"
2386
+ (299) 파일·폴더 이름에 숨김·방향 전환·공백 유사 문자나 `<`·`>`가 들어 있는 스킬과 커맨드는 이름을 바꿀 때까지 제공되지 않고, 그런 `name:`은 무시됩니다. 관측한 범위(python3 `os.walk` 검사)에서 `.claude/skills`와 `templates/.claude/skills` 아래 디렉토리·파일 이름 538개와 각 `SKILL.md`의 `name:` 값 가운데 출력 가능한 ASCII(0x21–0x7E) 밖 문자나 `<`·`>`를 포함한 항목은 0건이었고 `.claude/commands`는 존재하지 않으므로, 이 변경의 영향 조건은 관측되지 않았습니다.
2387
+ - CHANGELOG 원문: "Fixed Read garbling UTF-16LE files with a byte-order mark, and Write dropping byte-order marks or silently converting Windows-1252, Shift-JIS, GBK or UTF-16BE files to UTF-8 (now refused)"
2388
+ (299) BOM이 있는 UTF-16LE 파일을 Read가 깨뜨리던 결함과, Write가 BOM을 빠뜨리거나 Windows-1252·Shift-JIS·GBK·UTF-16BE 파일을 UTF-8로 조용히 변환하던 결함이 수정되었으며, 후자는 이제 거부됩니다. `git ls-files -z`가 나열한 1,578개 경로 중 1개(`docs/plans/refs/latest`)는 심볼릭 링크이므로(`git ls-files -s`의 mode 120000 줄 1개) tracked 일반 파일은 1,577개입니다. python3 검사에서 앞 8,000바이트에 NUL이 없는 tracked 일반 파일 가운데 BOM이 있는 파일과 UTF-8로 디코드되지 않는 파일은 각각 0건이었으므로, 관측한 범위에서 tracked 텍스트 파일 편집에서 Write 거부가 생길 조건은 관측되지 않았습니다. NUL이 있어 바이너리로 분류한 파일(BOM 없는 UTF-16 파일이 섞여 있을 수 있음)은 인코딩 판정에서 제외했습니다.
2389
+
2390
+ 기타 165건 — 이 저장소 비해당(mods·plugin API와 `claude plugin` eval·test·validate, Claude apps gateway·서드파티 `ANTHROPIC_BASE_URL`·managed settings 전달, Cowork·cloud sessions·Remote Control·self-hosted runner, VSCode·Windows·WSL·Claude Tag·Code Review 전용 항목, 터미널 렌더링·CJK 줄바꿈·붙여넣기·fullscreen UI, sandbox 경로 규칙, worktree·reftable, SDK·IDE·remote-control 세션의 `ScheduleWakeup` 결함, SDK·headless의 auto mode 모델 전환, `/btw`·`/ultrareview`·Artifact 도구·Claude in Chrome, 이미지·PDF·문서 첨부 처리, debug 로그 메모리, description 없이 시작한 팀원의 자격증명 표시, `/usage` 경고·plan mode 안내 줄 같은 안내 문구 등). 실측: `gh release view v2.1.299 --repo anthropics/claude-code --json body --jq .body | grep -c '^- '` = 190건 중 위 본문 25건을 다뤘으므로 190 − 25 = 165건입니다. 계수 범위는 해당 릴리즈 노트의 최상위 불릿 줄(`- `로 시작하는 줄)입니다.
2391
+
2392
+ **Action items**:
2393
+
2394
+ - 관측한 범위에서 이 릴리즈의 기본 동작 변경 중 이 저장소와 맞닿는 것에는 터미널 idle compaction(기본 동작, 위 [가설] 참조), `UserPromptSubmit` 훅의 실행 시점 이동, 실행 시점에 조립된 rm의 확인 프롬프트 제거(`CLAUDE_CODE_STRICT_INLINE_SHELL_RM_PROMPT=1`로 옛 동작 복원)가 있습니다. `idleCompaction`·`CLAUDE_CODE_IDLE_COMPACT_MIN_TOKENS` 설정 여부는 별도 결정 사안으로 이월합니다.
2395
+ - 재시작·resume를 거친 세션에서는 마지막 compaction 이전에 붙인 이름 대신 agent ID로 `SendMessage`를 보냅니다. 재시작 없이 compaction만 거친 세션에서도 예방 조치로 agent ID를 씁니다. 대화형 세션에서 compaction 뒤 스킬이 보이지 않으면 `/reload-skills`를 씁니다. 관측한 범위에서 룰·CLAUDE.md·에이전트·훅 파일의 변경을 확정한 항목은 찾지 못했습니다(R016: CC 지식은 이 가이드에 두고 룰 파일에는 행동 변화가 필요할 때 1줄).
2396
+ - 2.1.296 이상 2.1.299 미만으로 `claude -p` 무인 실행을 했고 그 실행에서 재시작, resume, resume 도중 새 메시지 도착이 함께 일어났다면, 승인된 도구 호출의 중복 실행 회귀가 남긴 중복 커밋·이슈가 있는지 실측으로 확인합니다.
2397
+ - (299) 항목 중 `[가설 — …]` 표기는 판정 기준을 충족하는 측정이 이루어지기 전에는 결론으로 쓰지 않습니다.
2398
+
2399
+ ---
2400
+
2401
+ ## v2.1.300 (2026-10-14)
2402
+
2403
+ > Issue: #1862 — Claude Code v2.1.300 compatibility documentation
2404
+ > Scope-ceiling check (R017): 조사 시점(2026-10-25)의 최신 릴리즈는 2.1.310입니다(`claude --version`=2.1.310, `npm view @anthropic-ai/claude-code version`=2.1.310). 2.1.301~2.1.310 CHANGELOG 절을 각각 잘라 `2.1.300` 문자열과 "Revert"(대소문자 무시)를 검색했습니다(`grep -n -i -E '2\.1\.300|revert' section-<버전>.md`). "2.1.300"은 305 절 한 곳에서 나타났으며, 그 문장은 "Self-hosted runner: Fixed a start script that shares only its stdout with the runner or orchestrator failing with `Resource temporarily unavailable` when `TERM` is set (a 2.1.300 regression)"입니다. 이 문장은 이 릴리즈의 self-hosted runner 항목 계열의 회귀 수정이며 이 저장소는 self-hosted runner를 쓰지 않으므로 무관합니다. "revert"는 301 절 "Fixed `/diff` not noticing a conflicted cherry-pick or revert in reftable repositories when one of its git checks timed out or failed" 한 곳에서만 나타났고, 이는 git revert 상태 감지 수정이지 롤백 문장이 아닙니다. 같은 영역의 후속 항목으로 302 절 "Changed prompt and agent hooks so that at most 12 of one event run at a time; the rest wait their turn", 304 절 "Changed tool search to be on by default behind a custom `ANTHROPIC_BASE_URL`; a 400 or 422 from the gateway is retried without it", 305 절 "Fixed every request failing on Vertex, Bedrock and other providers when the endpoint or a gateway rejects tool search, and behind gateways with ToolSearch disallowed or left out of `--tools` (a 2.1.304 regression): Claude Code now retries without it"가 있으나 모두 이 릴리즈 항목을 되돌리는 문장이 아닌 별개 변경입니다. artifact 갱신 영역의 301 절 항목은 아래 「Artifact 도구」 소절에서 다룹니다. 릴리즈 게시 시각은 2026-10-14T18:24:25Z입니다(`gh release view v2.1.300 -R anthropics/claude-code --json publishedAt`).
2405
+
2406
+ ### 훅
2407
+
2408
+ - CHANGELOG 원문: "Fixed SessionEnd hooks sometimes not running when you exit while a background command is still running"
2409
+ (300) 백그라운드 명령이 아직 실행 중일 때 종료하면 SessionEnd 훅이 때때로 실행되지 않던 결함이 수정되었습니다. 이 저장소의 두 settings 파일에는 SessionEnd 훅이 배선되어 있지 않습니다(`jq -c '.hooks.SessionEnd // "absent"' .claude/settings.json templates/.claude/settings.json` 결과 두 파일 모두 `"absent"`). R011 Session-End Auto-Save는 사용자 발화("끝", "종료" 등)로 세션 종료를 감지한다고 규정하므로(`.claude/rules/SHOULD-memory-integration.md:445`) 이 수정의 직접 대상이 아니라고 봅니다.
2410
+ - CHANGELOG 원문: "Fixed agent hooks ignoring their `model`: aliases like `haiku` now resolve, a subagent's model no longer overrides it, and an unavailable model falls back to the caller's instead of allowing the action"
2411
+ (300) `agent` 훅이 자신의 `model` 설정을 무시하던 결함이 수정되었습니다. 이제 `haiku` 같은 별칭이 해석되고, 서브에이전트의 모델이 훅의 모델을 덮어쓰지 않으며, 사용할 수 없는 모델은 동작을 허용하는 대신 호출자의 모델로 폴백합니다. 이 저장소의 두 settings 파일에서 훅 타입 분포는 `{"command":63,"prompt":1}`이고 `agent` 타입 훅은 0개입니다(`jq -c '[.hooks[][]?.hooks[]? | .type] | group_by(.) | map({(.[0]):length}) | add' .claude/settings.json templates/.claude/settings.json`; `git grep -n -E '"type": *"agent"' -- .claude templates/.claude` rc=1). 따라서 현재 배선에는 적용 대상이 없습니다. 원문의 마지막 절은 구버전에서 사용할 수 없는 모델을 지정한 `agent` 훅이 판정 없이 동작을 허용했다는 뜻이므로, 훗날 `agent` 훅을 차단 용도로 배선한다면 2.1.300 이상을 전제로 해야 한다고 봅니다.
2412
+ - CHANGELOG 원문: "Changed hooks: `updatedInput` from PreToolUse and PermissionRequest hooks is now validated like Claude's own input: unknown keys are dropped, and input the tool rejects denies the call"
2413
+ (300) PreToolUse·PermissionRequest 훅이 돌려주는 `updatedInput`이 이제 Claude 자신의 입력과 같은 방식으로 검증됩니다. 원문은 결과를 두 갈래로 나눕니다. 알 수 없는 키는 버려지고, 도구가 거부하는 입력은 호출 자체를 거부합니다. 키가 버려진 뒤의 처리는 원문이 말하지 않습니다. 남은 입력이 도구 검증을 통과하면 그 키만 빠진 채 진행되고, 필수 키를 오타 내 그 키가 버려지면 남은 입력이 도구 검증에 걸려 거부될 수 있다고 봅니다 [가설 — 키가 버려진 뒤 호출이 진행되는지 거부되는지를 측정하지 않음]. 이 저장소의 훅은 `updatedInput`을 출력하지 않고 PermissionRequest 훅도 배선하지 않습니다(`git grep -n -E 'updatedInput|PermissionRequest' -- .claude/hooks .claude/settings.json templates/.claude/settings.json` rc=1). 따라서 이 동작 변경은 현재 배선에 영향을 주지 않습니다. 앞으로 입력을 고쳐 쓰는 PreToolUse 훅을 추가한다면 훅 검증 픽스처를 두 갈래로 나눠야 합니다. 선택 키를 오타 내면 그 키가 오류 없이 버려져 의도한 수정이 조용히 빠질 수 있고, 필수 키를 오타 내면 남은 입력이 도구 검증에 걸려 거부될 수 있으며, 도구 스키마에 맞지 않는 값은 호출 거부로 이어집니다.
2414
+
2415
+ ### 백그라운드 · 프로세스
2416
+
2417
+ - CHANGELOG 원문: "Fixed Claude polling a background command's output file or sleeping while it runs"
2418
+ (300) 백그라운드 명령이 실행되는 동안 Claude가 그 출력 파일을 폴링하거나 sleep하던 결함이 수정되었습니다. 이 저장소의 릴리즈 대기 지침은 Bash 타임아웃 안의 유한 폴링이나 단일 `gh run watch <run-id> --exit-status`(선택적으로 `run_in_background`)를 무한 수동 폴링 루프보다 우선하라고 적고 있습니다(`.claude/skills/pipeline/workflows/auto-dev.yaml:1536`~`:1539`, #1711). 이 수정은 모델 쪽 행동에 관한 것이며 이 지침과 충돌하지 않으므로 지침 변경은 필요하지 않습니다. 구버전 세션 기록에서 백그라운드 명령을 기다리며 출력 파일을 반복 Read한 흔적은 위임 프롬프트 결함이 아니라 이 플랫폼 결함의 산물일 수 있습니다 [가설 — 해당 기간 트랜스크립트에서 반복 Read 패턴과 CC 버전을 대조하지 않음].
2419
+ - CHANGELOG 원문: "Changed exit to force-kill background commands still running 1.5 seconds after being asked to stop; in fullscreen mode they could previously be left running"
2420
+ (300) 종료 시 정지 요청 후 1.5초가 지나도 실행 중인 백그라운드 명령을 강제 종료하도록 바뀌었습니다. 이전에는 fullscreen 모드에서 그런 명령이 남아 있을 수 있었습니다. 이 저장소의 R005는 프로세스를 띄운 스크립트를 정리한 직후 `pgrep -f <패턴> | wc -l`로 잔여 개수를 확인하라고 규정합니다(`.claude/rules/MAY-optimization.md:43`). 이 변경은 세션 종료 시점의 잔여를 줄이는 방향이지만 세션 도중 정리의 대체 수단은 아니므로 그 확인 절차는 그대로 유지합니다.
2421
+ - CHANGELOG 원문: "Changed background sessions to resume a carried workflow through the Workflow tool's approval instead of running it from the handoff file"
2422
+ (300) 백그라운드 세션이 넘겨받은 workflow를 handoff 파일에서 바로 실행하는 대신 Workflow 도구의 승인을 거쳐 재개하도록 바뀌었습니다. 이 저장소의 두 스킬은 신규 DAG·오케스트레이션 작업에 네이티브 Workflow tool을 우선 쓰라고 권장합니다(`.claude/skills/dag-orchestration/SKILL.md:11`, `.claude/skills/task-decomposition/SKILL.md:11`). 관측한 범위(`git grep -n -i -E 'workflow tool|workflow script|workflow\(' -- .claude/skills`)에서 그 밖의 일치는 CI workflow 스크립트를 다루는 `.claude/skills/pipeline/workflows/auto-dev.yaml:851` 한 곳이므로, 스킬은 Workflow 도구 사용을 권장하지만 호출 절차나 스크립트를 정의하지는 않습니다. Workflow 스크립트에 대한 규범은 R023 「Workflow Script Sanity Check」(`.claude/rules/SHOULD-verification-ladder.md:320` 제목, `:322`부터 본문)에 있습니다. 무인 백그라운드 실행에서 workflow 재개가 승인 단계에서 멈출 수 있는지는 permission mode에 따라 달라질 것으로 보입니다 [가설 — 백그라운드 세션의 Workflow 승인 프롬프트를 permission mode별로 실측하지 않음].
2423
+
2424
+ ### headless · resume · 트랜스크립트
2425
+
2426
+ - CHANGELOG 원문: "Fixed resuming a headless or Agent SDK session losing the recent messages a compaction had kept, when the compaction followed a reply cut at the output token limit (compactions from this version on)"
2427
+ (300) 출력 토큰 한도에서 잘린 응답 뒤에 compaction이 일어난 경우, headless 또는 Agent SDK 세션을 재개하면 compaction이 보존한 최근 메시지가 사라지던 결함이 수정되었습니다. 원문의 괄호("compactions from this version on")대로 이 수정은 2.1.300 이후에 일어난 compaction에만 적용됩니다. 이 저장소의 무인 실행 경로에는 `claude -p`를 쓰는 측정 절차(`.claude/rules/MUST-orchestrator-coordination.md:588`)와 리뷰어 호출(`.claude/skills/agora/SKILL.md:18`)이 있습니다. 출력 토큰 한도에서 잘린 응답 뒤에 2.1.300 이전 버전에서 compaction된 headless·Agent SDK 세션을 재개할 때는 여전히 compaction이 보존한 최근 메시지가 빠질 수 있다고 전제합니다.
2428
+ - CHANGELOG 원문: "Fixed resuming a headless or Agent SDK session losing its compaction summary or bringing back pre-compaction history, when the compaction followed a retried or unfinished reply in the same turn"
2429
+ (300) 같은 턴에서 재시도되었거나 끝나지 않은 응답 뒤에 compaction이 일어난 경우, headless 또는 Agent SDK 세션을 재개하면 compaction 요약이 사라지거나 compaction 이전 기록이 되살아나던 결함이 수정되었습니다. R004는 비대화형 세션의 중단 응답 자동 이어감(v2.1.246+)을 기록하고 있으므로(`.claude/rules/SHOULD-error-handling.md:28`), 재시도·미완료 응답과 compaction이 겹치는 조합은 무인 루프에서 나타날 수 있습니다 [가설 — 이 저장소 무인 세션에서 해당 조합의 발생 빈도를 측정하지 않음]. 같은 턴의 재시도·미완료 응답 뒤에 compaction된 headless·Agent SDK 세션을 구버전에서 재개했을 때 compaction 요약이 빠졌거나 이미 요약된 이전 기록이 되살아난 것처럼 보였다면 이 결함이 원인 후보입니다.
2430
+ - CHANGELOG 원문: "Fixed the first transcript entry written after resuming a session being lost when a crash had cut the transcript's last line short"
2431
+ (300) 크래시로 트랜스크립트의 마지막 줄이 잘린 상태에서 세션을 재개하면, 재개 후 처음 기록되는 트랜스크립트 항목이 사라지던 결함이 수정되었습니다. 이 저장소에서 `transcript_path`를 언급하는 훅 스크립트는 3개입니다(`git grep -n -l 'transcript_path' -- .claude/hooks` 결과 `r007-r008-drift-advisor.sh`, `session-env-check.sh`, `task-outcome-recorder.sh`; `session-env-check.sh`의 언급은 `:48` 주석 1곳입니다). R020 「Self-Violation Counting Is Also Diagnosis」(`.claude/rules/MUST-completion-verification.md:381` 제목)는 위반 계수를 트랜스크립트 파싱으로 하라고 요구하므로, 구버전 크래시 후 재개 세션의 트랜스크립트로 계수할 때는 재개 직후 1건이 누락되었을 수 있음을 함께 적습니다.
2432
+ - CHANGELOG 원문: "Changed local session transcripts to also record each API request's system prompt, tools and parameters, so a transcript you choose to share can reproduce a request exactly"
2433
+ (300) 로컬 세션 트랜스크립트가 각 API 요청의 시스템 프롬프트, 도구, 파라미터도 기록하도록 바뀌었습니다. 유지보수자 기기의 로컬 트랜스크립트로 레코드 형태를 측정했습니다(17:22 KST, `~/.claude/projects/<프로젝트>/` 바로 아래 `*.jsonl` 중 2026-10-25 측정 세션(유지보수자 기기, 트랜스크립트 `version` 필드 최댓값 2.1.302)의 트랜스크립트 1개, 계수만 출력하는 스크립트로 측정; 세션이 진행 중이라 수치는 측정 시점 값입니다). 이 파일에는 `api-request` 52줄, `api-request-blob` 56줄, `api-request-shape` 2줄이 별도 최상위 줄로 기록되어 있었습니다. `version` 최댓값이 2.1.288·2.1.289·2.1.294인 같은 디렉토리 트랜스크립트 5개에는 세 타입이 0줄이었고, 2.1.300·2.1.301 트랜스크립트는 이 디렉토리에 없었습니다. `api-request-blob` 56줄은 모두 `.message.role`을 가졌고(system 41, assistant 11, user 4이며 user 4줄 중 `tool_result` 블록이 없는 줄은 1줄), `isSidechain` 키는 56줄 모두 없었습니다. role이 assistant인 blob 11줄의 content에는 모두 `tool_use` 블록이 있었고 그중 6줄에는 `text` 블록도 있었습니다. 같은 시점 `tail -n 200` 창(isSidechain 필터 후)에서 role이 assistant인 줄 23개 중 4개가 `api-request-blob`이었습니다. `r007-r008-drift-advisor.sh`는 레코드 최상위 `.type`을 보지 않고 `.message.role`로 줄을 고릅니다(`.type?`은 content 블록 판별에만 씁니다). assistant 줄 인덱스 목록 생성(`.claude/hooks/scripts/r007-r008-drift-advisor.sh:232`)과 그 마지막 원소를 마지막 assistant 줄로 고르는 선택(`:235`), 턴 경계 판정(`:249`~`:251`, content가 문자열이거나 `tool_result` 블록이 없는 user 줄을 경계로 봄), 턴 구성(`:265`)이 그렇고, `:229`의 필터는 `isSidechain`이 없는 줄을 통과시킵니다. 창은 `:339`에서 `tail -n 200`으로 읽고 `:340`에서 그 줄 수를 세어 `:343`에서 `$wlc`로 넘깁니다. `:262`는 창 안에 경계가 하나도 없고(`$bi`가 비어 있음) 창이 포화(`$wlc >= 200`)일 때에만 판정을 건너뜁니다. 따라서 blob 줄이 실제 응답 줄과 함께 턴으로 묶여 `tool_use`·announce가 이중 계수되거나, `tool_result`가 없는 user blob이 턴 경계로 잡힐 수 있습니다. 또한 추가된 줄이 실제 경계를 창 밖으로 밀어내 "경계 없음 + 포화" 조건이 더 자주 성립해 판정이 건너뛰어질 수 있습니다(반대로 `tool_result`가 없는 user blob은 창 안에 경계를 더할 수 있습니다) [가설 — 이 경로의 실제 오탐·미탐 발화는 관측되지 않음(not observed); 판정 기준은 2.1.300 이상 트랜스크립트에서 advisory 출력과 blob 줄을 제외한 재계산을 대조하는 것]. 또한 트랜스크립트 파일 크기가 커지므로, 트랜스크립트를 공유하거나 이슈에 첨부할 때 시스템 프롬프트 전문이 포함된다는 점을 확인합니다.
2434
+
2435
+ ### MCP · 도구 검색
2436
+
2437
+ - CHANGELOG 원문: "Fixed automatic tool search (`ENABLE_TOOL_SEARCH=auto`) turning off part-way through a conversation, for example while MCP servers reconnect after a resume"
2438
+ (300) 자동 도구 검색(`ENABLE_TOOL_SEARCH=auto`)이 대화 도중, 예를 들어 resume 뒤 MCP 서버가 다시 연결되는 동안 꺼지던 결함이 수정되었습니다. 이 저장소는 `ENABLE_TOOL_SEARCH`를 설정하지 않으며(`git grep -n 'ENABLE_TOOL_SEARCH' -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'` rc=1, `jq -c '.env // {}' .claude/settings.json` = `{}`), tracked 파일 `.mcp.json`에는 `eraser`·`ontology-rag` 두 서버가 있습니다(`git show HEAD:.mcp.json | jq -c '.mcpServers|keys'`; 이 파일은 `.gitignore:49` 패턴에도 걸리지만 `git ls-files`에 포함되며 작업트리와 HEAD의 차이는 없습니다, `git diff --quiet HEAD -- .mcp.json` rc=0). R005의 DETAIL 주석(자동 주입되지 않음)은 도구 부재를 결론짓기 전에 `ToolSearch`로 실측하라고 적고 있습니다(`.claude/rules/MAY-optimization.md:140`). 도구 검색 자체는 동작이 관측되었습니다. 2026-10-25 측정 세션(유지보수자 기기, 트랜스크립트 `version` 2.1.302)의 위임 에이전트 컨텍스트에 지연 도구 목록과 `ToolSearch`로 로드하라는 안내가 있었고, R018은 `ToolSearch` 지연 로드 실측을 기록합니다(`.claude/rules/MUST-agent-teams.md:492`). 측정하지 않은 것은 그 도구 검색이 `auto` 모드로 동작하는지 여부입니다. 따라서 구버전에서 resume 뒤 MCP 서버가 다시 연결되는 동안 지연 도구가 지연 처리 없이 노출되던 현상이 있었다면 이 결함의 산물일 수 있습니다 [가설 — 이 저장소 세션의 도구 검색 모드가 `auto`인지 측정하지 않음].
2439
+ - CHANGELOG 원문: "Fixed Claude not being told about an MCP server's tools and instructions until its next tool call, when the server finished connecting after a compaction"
2440
+ (300) compaction 뒤에 연결을 마친 MCP 서버의 도구와 지침이 다음 도구 호출 전까지 Claude에게 알려지지 않던 결함이 수정되었습니다. R019는 `ontology-rag` MCP 서버를 쓸 수 없으면 조용히 건너뛰라고 규정합니다(`.claude/rules/SHOULD-ontology-rag-routing.md:43`). 구버전 장기 세션에서 compaction 직후 라우팅 enrichment가 건너뛰어졌다면, 서버 부재가 아니라 이 고지 지연이 원인이었을 수 있습니다 [가설 — compaction 직후 `get_agent_for_task` 호출 가능 여부를 측정하지 않음].
2441
+ - CHANGELOG 원문: "Fixed a conversation failing on every turn with a 400 error when the API rejected an MCP tool's input schema; Claude Code now sends that tool without parameters for the rest of the conversation"
2442
+ (300) API가 어떤 MCP 도구의 입력 스키마를 거부하면 대화가 매 턴 400 오류로 실패하던 결함이 수정되었고, 이제 그 도구는 남은 대화 동안 파라미터 없이 전송됩니다. 결과어에 주의해야 합니다. 대화는 계속되지만 해당 MCP 도구는 파라미터 없이 노출되므로 정상 호출이 되지 않을 수 있습니다. R004 「Recovery」의 Retryable 행(`.claude/rules/SHOULD-error-handling.md:25`, 3회 backoff 재시도)으로는 이런 매 턴 400이 해소되지 않았을 것이며 [가설 — 구버전에서 재시도 결과를 측정하지 않음], 구버전에서 이 증상은 설정 오류가 아니라 특정 MCP 도구 스키마 거부였을 수 있습니다.
2443
+ - CHANGELOG 원문: "Fixed Claude searching for deferred tools already loaded earlier in the conversation when a session resumes a history that never listed them"
2444
+ (300) 지연 도구를 한 번도 나열하지 않은 기록을 재개한 세션에서, Claude가 대화 앞부분에서 이미 로드한 지연 도구를 다시 검색하던 결함이 수정되었습니다. R018 「멤버 도구 부재 시 대체 규약」은 `SendMessage`를 `ToolSearch`(query "select:SendMessage")로 지연 로드한 실측을 기록합니다(`.claude/rules/MUST-agent-teams.md:492`). 이 수정은 중복 검색 비용을 줄이는 방향이며 `SendMessage` 부재를 전제하기 전에 먼저 로드를 시도하라는 그 규약의 절차를 바꾸지 않습니다.
2445
+
2446
+ ### 모니터링 (OpenTelemetry)
2447
+
2448
+ - CHANGELOG 원문: "Added `cache_creation_5m_tokens` and `cache_creation_1h_tokens` to the OpenTelemetry `api_request` event, splitting cache writes by lifetime"
2449
+ (300) OpenTelemetry `api_request` 이벤트에 `cache_creation_5m_tokens`와 `cache_creation_1h_tokens`가 추가되어 캐시 쓰기를 수명별로 나눠 볼 수 있습니다. 이 저장소의 `monitoring-setup` 스킬은 OpenTelemetry console 출력으로 API 요청 이벤트를 포함한 사용 지표를 보여 준다고 설명합니다(`.claude/skills/monitoring-setup/SKILL.md:11`). 스킬 절차 자체는 바뀌지 않으며, 캐시 TTL 관련 비용을 진단할 때 이 두 필드를 근거로 쓸 수 있습니다. 상태줄과 훅은 캐시 쓰기 토큰을 직접 읽지 않습니다(`git grep -n -E 'cache_creation' -- .claude/hooks .claude/statusline.sh` rc=1).
2450
+
2451
+ ### 도구 동작
2452
+
2453
+ - CHANGELOG 원문: "Fixed Claude naming files in the session scratchpad by a bare filename or relative path instead of their full path"
2454
+ (300) Claude가 세션 scratchpad의 파일을 전체 경로가 아니라 파일 이름만 또는 상대 경로로 부르던 결함이 수정되었습니다. 이 저장소의 auto-dev 파이프라인은 위임이 만드는 임시 파일을 `$TMPDIR`나 세션 scratchpad 아래의 에이전트별 고유 경로에 두라고 요구합니다(`.claude/skills/pipeline/workflows/auto-dev.yaml:835`~`:836`). 구버전 서브에이전트 보고에서 scratchpad 파일이 이름만으로 언급되었다면 저장소 루트 기준 상대 경로로 오독될 수 있었으므로, 보고된 경로는 `ls`로 실재를 확인한 뒤 사용합니다.
2455
+
2456
+ ### Artifact 도구
2457
+
2458
+ - CHANGELOG 원문: "Improved artifact updates: Claude now applies a small change and republishes the artifact in one call, and makes larger edits and republishes within a single response"
2459
+ (300) artifact 갱신 방식이 바뀌어, 작은 변경은 한 번의 호출로 적용해 다시 게시하고 큰 편집은 한 응답 안에서 편집과 재게시를 함께 합니다. 바로 다음 릴리즈인 2.1.301 절에는 "Fixed artifact updates being refused where a PreToolUse hook covers Edit or Write; Claude now edits the file and then republishes instead of changing it in the publish call"이 있습니다. 이 저장소의 PreToolUse 훅 matcher에는 Edit·Write를 덮는 항목이 여럿 있습니다(`jq -c '[.hooks.PreToolUse[]? | .matcher]' .claude/settings.json` 결과에 `"Write|Edit"`, `"Write"`, `"Edit|Write"`, `"Edit"`, `"Write|Edit|Bash"` 포함). 따라서 이 저장소에서 Artifact 도구로 artifact를 갱신한 세션은 2.1.301 수정 이전에 그 거부 조건에 해당했을 수 있습니다. CHANGELOG는 301 항목을 회귀로 표시하지 않으므로, 300의 한 번 호출 갱신 방식이 그 거부를 낳았다는 인과는 [가설 — 2.1.300과 2.1.301에서 같은 PreToolUse 훅 아래 artifact 갱신을 재현해 비교하지 않음]입니다. 관측한 범위(`git grep -n -l -E 'Artifact tool|Artifact\(|action: *"?publish' -- .claude/skills .claude/agents` rc=1)에서 이 저장소의 스킬·에이전트는 Artifact 도구 사용을 정의하지 않습니다.
2460
+
2461
+ 기타 71건 — 이 저장소 비해당(mods API(`virtualText`, `$.ui.view`, `Text`의 `dir`, `agent.spawn`·`prompt.change`·`prompt.edit`·`prompt.submit` 훅, 핫 리로드 안내), Claude Platform on AWS의 `/advisor`, OpenTelemetry GenAI 속성·`git_commit_id`·`user_prompt` 이벤트, cloud sessions·Cowork·Remote Control·`claude remote-control`·`claude daemon`·self-hosted runner 항목, `claude agents` 화면·`/tasks`·breadcrumb·agents view 입력 처리 같은 UI 세부, `--worktree`·reftable 저장소·plugin `WorktreeCreate`/`WorktreeRemove` 훅, `forceLoginOrgUUID`·`forceLoginGatewayUrl`·`claude gateway`·`CLAUDE_CODE_PROVIDER_MANAGED_BY_HOST`, `/autocompact` 경고 문구, `claude --help`의 `--restricted` 설명, `/branch`·`claude purge`의 U+2028/U+2029 처리, gzip 요청 압축, 번들 `claude-api`·`plugin-authoring` 스킬, Artifact 도구 진행 표시, Claude 3 모델의 PDF 안내, TLS 검사 프록시 뒤 feature flag, 어두운 ANSI 테마, `/sandbox` 문구, VSCode·Windows·`[Cloud sessions]`·`[Remote Control]`·`[Claude Tag]`·`[Code Review]` 항목). 실측: `gh release view v2.1.300 --repo anthropics/claude-code --json body --jq .body | grep -c '^- '` = 88건 중 위 본문 17건을 다뤘으므로 88 − 17 = 71건입니다. 계수 범위는 해당 릴리즈 노트의 최상위 불릿 줄(`- `로 시작하는 줄)입니다.
2462
+
2463
+ **Action items**:
2464
+ - 훅 설정 변경은 필요하지 않습니다. 위 jq·`git grep` 결과상 두 settings 파일에는 SessionEnd 훅과 `agent` 타입 훅이 없고, 훅이 `updatedInput`을 출력하지 않습니다.
2465
+ - 측정한 트랜스크립트 1개(기기 로컬, 2.1.302)에서는 트랜스크립트 기록 확장으로 생긴 `api-request-blob` 줄이 모두 `.message.role`을 가졌으므로, 그런 줄은 `r007-r008-drift-advisor.sh`의 role 기반 선택(`:232`, `:249`~`:251`, `:265`)에 섞일 수 있습니다. 레코드 형태는 위와 같이 측정했으나 실제 오판 발화는 관측되지 않았으므로 영향은 [가설]로 남기고, advisory 출력과 blob 제외 재계산을 대조한 뒤 판단합니다.
2466
+ - (300) 항목 중 `[가설 — …]` 표기는 판정 기준을 충족하는 측정이 이루어지기 전에는 결론으로 쓰지 않습니다.
2467
+
2468
+ ---
2469
+
2470
+ ## v2.1.301 (2026-10-15)
2471
+
2472
+ > Issue: #1863 — Claude Code v2.1.301 compatibility documentation
2473
+ > Scope-ceiling check (R017): 조사 시점(2026-10-25)의 최신 릴리즈는 2.1.310입니다(`claude --version`=2.1.310, `npm view @anthropic-ai/claude-code version`=2.1.310). 상한 이후 릴리즈 2.1.302~2.1.310의 CHANGELOG 절을 각각 잘라 "2.1.301"과 "Revert"를 검색했으며(`awk -v v="<버전>" '/^## /{p=($2==v)} p' CHANGELOG.md`로 자른 절마다 `grep -c -F`), 두 문자열 모두 9개 절에서 0건이었습니다. 따라서 이 릴리즈 항목을 되돌리거나 회귀로 지목하는 문장은 관측한 범위에서 없습니다. 릴리즈 게시 시각은 2026-10-15T19:22:06Z입니다(`gh release view v2.1.301 -R anthropics/claude-code --json publishedAt`).
2474
+
2475
+ ### 훅
2476
+
2477
+ - CHANGELOG 원문: "Fixed artifact updates being refused where a PreToolUse hook covers Edit or Write; Claude now edits the file and then republishes instead of changing it in the publish call"
2478
+ (301) Edit나 Write를 대상으로 하는 PreToolUse 훅이 있는 환경에서 artifact 갱신이 거부되던 결함이 수정되어, 이제 Claude가 게시 호출 안에서 파일을 바꾸는 대신 파일을 편집한 뒤 다시 게시합니다. 이 저장소는 matcher에 Edit 또는 Write가 들어간 PreToolUse 항목 5개를 프로젝트 settings에 배선하므로(`.claude/settings.json:45` `Write|Edit`, `:85` `Write`, `:95` `Edit|Write`, `:105` `Edit`, `:115` `Write|Edit|Bash`; `jq -r '.hooks.PreToolUse[].matcher' .claude/settings.json`) 원문의 조건에 해당합니다. 2.1.300 CHANGELOG의 "Improved artifact updates: Claude now applies a small change and republishes the artifact in one call, and makes larger edits and republishes within a single response"가 게시 호출 하나로 바꾸는 경로를 도입한 것으로 읽힙니다. 이 수정의 원문은 새 동작("Claude now edits the file and then republishes instead of changing it in the publish call")이 PreToolUse 훅 환경에만 적용되는지, 모든 artifact 갱신에 적용되는지 명시하지 않습니다. 다만 CHANGELOG는 이 결함을 2.1.300의 회귀로 명시하지 않으므로 두 항목의 인과는 확정하지 않습니다. 이 저장소 세션의 artifact 게시가 실제로 거부됐는지는 관측하지 못했습니다 [가설 — 판정 범위를 우선 2.1.300 세션으로 좁혀, 그 트랜스크립트의 artifact 게시 거부 기록으로 판정. 작성 기기의 이 프로젝트 트랜스크립트 디렉토리에는 `version` 최댓값이 2.1.300·2.1.301인 파일이 없으므로(2026-10-25 17:50 KST, 파일별 `version` 최댓값 계수), 해당 버전 트랜스크립트가 없는 기기에서는 같은 PreToolUse 훅 구성으로 2.1.300과 2.1.301에서 artifact 게시를 재현해 비교].
2479
+ - CHANGELOG 원문: "Fixed quitting removing a worktree made by a `WorktreeCreate` hook without asking when it may hold unpushed commits"
2480
+ (301) `WorktreeCreate` 훅이 만든 worktree를, 푸시되지 않은 커밋이 있을 수 있는데도 종료 시 묻지 않고 제거하던 결함이 수정되었습니다. R006은 이 이벤트를 훅 이벤트 카탈로그에 나열하지만(`.claude/rules/MUST-agent-design.md:255`, DETAIL 주석 — 자동 주입되지 않음; 보이는 요약은 `:257`의 "33개 이벤트 타입"), 프로젝트 settings와 templates 미러의 `hooks` 키에는 `WorktreeCreate`가 0건입니다(`jq -r '.hooks|keys[]' <파일> | grep -c WorktreeCreate`를 `.claude/settings.json`과 `templates/.claude/settings.json`에 각각 실행해 둘 다 0). 따라서 이 저장소 설정 범위에서는 영향 조건이 관측되지 않았습니다.
2481
+ - CHANGELOG 원문: "Fixed the permission prompt for a plugin or skill hook's `ask` decision not showing which plugin or skill the hook comes from"
2482
+ (301) 플러그인이나 스킬 훅이 `ask` 결정을 낼 때의 권한 프롬프트가 그 훅의 출처 플러그인·스킬을 보여 주지 않던 결함이 수정되었습니다. 관측한 범위에서 이 저장소의 스킬·에이전트 frontmatter에는 `hooks:` 필드가 없고(`git grep -l -E '^hooks:' -- '.claude/skills/*/SKILL.md' '.claude/agents/*.md'` 출력 없음), 프로젝트 훅에서 `permissionDecision`을 출력하는 곳도 없습니다(`git grep -n -E 'permissionDecision' -- .claude/hooks .claude/settings.json` rc=1). 위 두 측정 범위에서 이 저장소가 배포하는 스킬·훅은 이 수정의 대상이 아니며, 사용 중인 외부 플러그인(superpowers 등) 훅이 `ask`를 내는지는 관측하지 않았습니다 [가설 — 플러그인 훅 소스의 `ask` 출력 여부로 판정].
2483
+
2484
+ ### 스킬 · Workflow
2485
+
2486
+ - CHANGELOG 원문: "Fixed skills and commands with very many or very long argument names stalling for seconds when invoked; only the first 64 names, each up to 64 characters, are now filled in"
2487
+ (301) 인자 이름이 매우 많거나 긴 스킬·커맨드가 호출 시 수 초간 멈추던 결함이 수정되어, 이제 앞의 64개 이름(각 64자까지)만 채워집니다. 이름 붙은 인자를 선언하는 `arguments:` frontmatter는 이 저장소 스킬에서 0건이며(`git grep -c -E '^arguments:' -- '.claude/skills/*/SKILL.md'` 출력 없음), 추적된 SKILL.md 114개 중 50개는 표시용 `argument-hint:`를 씁니다(`git grep -l -E '^argument-hint:' -- '.claude/skills/*/SKILL.md' | wc -l`=50, `git ls-files -- '.claude/skills/*/SKILL.md' | wc -l`=114). 따라서 64개 상한에 걸리는 스킬은 관측되지 않았습니다.
2488
+ - CHANGELOG 원문: "Fixed skills, commands and hooks using very large amounts of memory when their arguments fill many placeholders"
2489
+ (301) 인자가 많은 자리표시자를 채울 때 스킬·커맨드·훅이 매우 많은 메모리를 쓰던 결함이 수정되었습니다. 이 저장소에서 자리표시자 후보 문자열(`$ARGUMENTS` 또는 `$<숫자>`)이 있는 스킬 파일은 8개이며(`git grep -l -P '\$ARGUMENTS|\$[0-9]\b' -- '.claude/skills/*/SKILL.md' | wc -l`=8), 이 수에는 셸 예시 코드의 `$1` 같은 비자리표시자도 섞여 있을 수 있습니다. `$ARGUMENTS`를 쓰는 파일은 1개입니다(`git grep -c -P '\$ARGUMENTS' -- '.claude/skills/*/SKILL.md'` 1건, `.claude/skills/ambiguity-gate/SKILL.md`). "많은 자리표시자" 조건에 해당하는 스킬이 있는지는 판정하지 못했습니다 [가설 — 스킬 호출 전후 프로세스 메모리 측정으로 판정].
2490
+ - CHANGELOG 원문: "Fixed skills no longer being listed to the model after using `/rewind`"
2491
+ (301) `/rewind` 사용 후 스킬 목록이 모델에게 더 이상 제공되지 않던 결함이 수정되었습니다. 이 저장소 세션은 추적된 SKILL.md 114개(`git ls-files -- '.claude/skills/*/SKILL.md' | wc -l`=114)의 라우팅 스킬과 슬래시 커맨드 스킬을 모델이 볼 수 있는 스킬 목록에 의존하므로, 구버전에서 `/rewind` 뒤에 스킬 라우팅이 실패했다면 그 원인이 이 결함일 수 있습니다 [가설 — 2.1.301 미만에서 `/rewind` 직후 Skill 호출 실패 기록으로 판정].
2492
+ - CHANGELOG 원문: "Fixed workflow agents sometimes skipping their step, and the run still reporting success, after reading the harness note that their task text carries no user authority"
2493
+ (301) workflow 에이전트가 자기 작업 텍스트에 사용자 권한이 없다는 하네스 안내문을 읽은 뒤 가끔 단계를 건너뛰고, 실행은 여전히 성공으로 보고되던 결함이 수정되었습니다. R023은 Workflow 스크립트 실행 전 결정론적 점검을 규정하고(`.claude/rules/SHOULD-verification-ladder.md:322`), R020은 "실행함"과 "성공함"을 구분합니다. 원문의 "sometimes"대로 구버전 Workflow 실행의 성공 보고는 각 단계의 실제 수행을 보장하지 않았으므로, 그 산출물은 결정론적 ground-truth로 다시 확인하는 것이 좋습니다. `dag-orchestration`·`task-decomposition` 스킬은 신규 작업에 네이티브 Workflow tool을 권장합니다(`.claude/skills/dag-orchestration/SKILL.md:11`, `.claude/skills/task-decomposition/SKILL.md:11`). 관측한 범위(`git ls-files | grep -i -E 'workflow.*\.(js|mjs)$'` 출력 없음)에서 추적된 Workflow 스크립트 파일은 없습니다. 이름에 workflow가 들어간 `.claude/skills/pipeline/workflows/auto-dev.yaml`은 pipeline 스킬의 YAML 정의이며, 스킬 파일 중 Workflow tool이나 `scriptPath`를 언급하는 것은 위 두 스킬이고 pipeline 스킬은 들어 있지 않습니다(`git grep -n -i -P 'Workflow tool|scriptPath' -- '.claude/skills/*/SKILL.md'`).
2494
+ - CHANGELOG 원문: "Fixed workflow scripts asking for permission or being refused when read, edited or re-run after a Bash `cd` in the same session"
2495
+ (301) 같은 세션에서 Bash `cd` 뒤에 workflow 스크립트를 읽거나 편집하거나 다시 실행할 때 권한을 묻거나 거부되던 결함이 수정되었습니다. R005는 Bash `cd`가 세션 cwd로 남아 상대 경로가 어긋날 수 있다며 지속 `cd`를 금지합니다(`.claude/rules/MAY-optimization.md:89`, #1778, #1767). 이 수정은 workflow 스크립트 경로에 한정되며 다른 스크립트·도구의 상대 경로 문제를 다루지 않으므로, R005의 지속 `cd` 금지는 그대로 유효합니다.
2496
+
2497
+ ### 도구 동작 · 권한
2498
+
2499
+ - CHANGELOG 원문: "Fixed Grep and Glob reporting no matches when the search program failed unexpectedly before returning any results; they now return an error saying the search failed"
2500
+ (301) 검색 프로그램이 결과를 내기 전에 예기치 않게 실패했을 때 Grep·Glob이 "일치 없음"으로 보고하던 결함이 수정되어, 이제 검색 실패 오류를 반환합니다. 관측한 범위(`git grep -l -P '^\s*-\s*(Grep|Glob)\s*$|^tools:.*\b(Grep|Glob)\b' -- '.claude/agents/*.md' | wc -l`=50, 에이전트 파일 50개)에서 모든 에이전트 파일이 `tools:`에 Grep 또는 Glob을 명시하며, R002는 이렇게 명시한 `qa-writer` 1건이 전용 `Grep`/`Glob`을 받았다는 실측을 기록하고, 다른 에이전트로의 일반화는 추정으로 둡니다(`.claude/rules/MUST-permissions.md:18`). 따라서 2.1.301 미만에서 서브에이전트가 보고한 Grep·Glob의 0건 결과는 검색 실패가 위장된 것일 수 있었습니다. R005의 2.1.275 노트(`.claude/rules/MAY-optimization.md:120`, DETAIL 주석 — 자동 주입되지 않음)는 재확인 대상을 "대용량 출력 탐색"의 0건 결과로 한정하므로, 이 항목은 그 노트가 이미 덮는 경우가 아닙니다. 같은 재확인 원칙(0건 결과를 `git grep` 등 독립 경로로 다시 확인)을 검색 프로그램 실패 경로로 확장 적용하는 근거로 기록합니다. 보이는 R005 본문은 저장소 전수조사에 `git grep`을 표준으로 둡니다(`.claude/rules/MAY-optimization.md:87`).
2501
+ - CHANGELOG 원문: "Fixed the Read tool reading binary files such as .xlsm, .parquet, .epub and .heic as text"
2502
+ (301) Read 도구가 .xlsm, .parquet, .epub, .heic 같은 바이너리 파일을 텍스트로 읽던 결함이 수정되었습니다. 이 저장소에서 이 네 확장자의 추적 파일은 0개이므로(`git ls-files -- '*.xlsm' '*.parquet' '*.epub' '*.heic' | wc -l`=0) 저장소 파일 범위에서는 영향 조건이 관측되지 않았습니다.
2503
+ - CHANGELOG 원문: "Fixed a tool call cut off by a message sent mid-turn during its permission check being reported to the model as rejected by the user"
2504
+ (301) 권한 검사 중에 턴 도중 보낸 메시지로 끊긴 도구 호출이 모델에게 "사용자가 거부함"으로 보고되던 결함이 수정되었습니다. R020은 비파괴 맥락에서 인터럽트 직후 직전 요청을 "취소"로 단정하지 말라고 규정하며(`.claude/rules/MUST-completion-verification.md:307`, 적용 범위는 `:293`의 "비파괴 한정"이고 파괴적 작업은 `:299`의 Safety Carve-Out이 정지를 우선합니다), R015는 사용자 지정 도구가 실패해도 같은 도구를 재시도하라고 규정합니다(`.claude/rules/MUST-intent-transparency.md:87`). 구버전에서 모델이 받은 "사용자 거부" 신호는 실제 거부가 아니라 턴 도중 메시지에 의한 절단이었을 수 있으므로, 그 신호를 근거로 작업을 포기하거나 다른 도구로 바꾼 사례는 재해석 대상입니다 [가설 — 해당 세션 트랜스크립트에서 거부 직전 사용자 메시지 유무로 판정].
2505
+
2506
+ ### 컨텍스트 · 모델 · headless
2507
+
2508
+ - CHANGELOG 원문: "Added `CLAUDE_CODE_RETRY_WATCHDOG_MAX_USAGE_LIMIT_WAIT_MS` so unattended retry mode (`CLAUDE_CODE_RETRY_WATCHDOG`) ends a request at a usage limit that resets too far away instead of waiting"
2509
+ (301) 무인 재시도 모드(`CLAUDE_CODE_RETRY_WATCHDOG`)가 너무 먼 시점에 초기화되는 사용량 한도에서 기다리지 않고 요청을 끝내도록 하는 `CLAUDE_CODE_RETRY_WATCHDOG_MAX_USAGE_LIMIT_WAIT_MS`가 추가되었습니다. 이 저장소는 무인 `claude -p` 실행에서 `/fsd`를 쓸 수 있다고 안내하지만(`.claude/skills/fsd/SKILL.md:172`), `RETRY_WATCHDOG` 계열 env는 추적되는 프로젝트 settings와 templates 미러에서 0건입니다(`grep -c RETRY_WATCHDOG .claude/settings.json templates/.claude/settings.json` 모두 0). 새 env도 이 가이드 밖의 추적 파일에서 0건이므로(`git grep -n RETRY_WATCHDOG_MAX -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'` rc=1) 저장소 설정 범위에서는 동작이 바뀌지 않습니다. 작성 기기의 `.claude/settings.local.json`은 추적되지 않는 gitignore 대상이므로(`git ls-files -- .claude/settings.local.json` 출력 없음, `git check-ignore -v --no-index .claude/settings.local.json` = `.gitignore:40:.claude/*`) 저장소 근거에서 뺐으며, 그 파일에서도 0건이었던 것은 로컬 관측일 뿐입니다.
2510
+ - CHANGELOG 원문: "Fixed the `fable` (and `best`) model alias erroring on the Anthropic API when the newest Fable model is not available to your organization: Claude Code now retries once on the previous Fable model"
2511
+ (301) 조직에서 최신 Fable 모델을 쓸 수 없을 때 `fable`(및 `best`) 별칭이 Anthropic API에서 오류를 내던 결함이 수정되어, 이제 이전 Fable 모델로 한 번 재시도합니다. R006은 `fable`을 Agent 도구 `model` 파라미터의 Tier-3 값으로 둡니다(`.claude/rules/MUST-agent-design.md:70`). 에이전트 frontmatter에서 Fable을 지정한 파일은 관측한 범위에서 0개입니다(`git grep -n -E '^model: *(claude-)?fable' -- '.claude/agents/*.md'` rc=1). 이 수정 이후 `model: "fable"` 스폰은 오류 대신 이전 Fable 모델로 실행될 수 있으므로, 실행 모델이 중요한 위임에서는 스폰 결과의 실제 모델을 확인하는 것이 좋습니다 [가설 — 최신 Fable을 쓸 수 없는 조직에서 스폰 결과의 `resolvedModel`로 판정].
2512
+ - CHANGELOG 원문: "Improved switching to a model with a smaller context window: a conversation too long for the new model is now summarized by the previous model first"
2513
+ (301) 컨텍스트 창이 더 작은 모델로 바꿀 때, 새 모델에 너무 긴 대화를 이전 모델이 먼저 요약하도록 개선되었습니다. R006과 R013은 `CLAUDE_CODE_DISABLE_1M_CONTEXT` 설정 여부에 따라 1M 창 모델이 실효 200K로 동작할 수 있다고 기록합니다(`.claude/rules/MUST-agent-design.md:85`, DETAIL 주석 — 자동 주입되지 않음; `.claude/rules/SHOULD-ecomode.md:91`). 1M 창 세션에서 더 작은 창의 모델로 `/model` 전환하면 이 요약이 개입할 수 있습니다 [가설 — 이 저장소 세션의 모델 전환 사례는 미관측].
2514
+ - CHANGELOG 원문: "Fixed a case where switching to a model with a smaller context window could spend usage credits on a summary by the previous model without asking first"
2515
+ (301) 더 작은 창의 모델로 전환할 때 이전 모델의 요약에 묻지 않고 사용 크레딧을 쓸 수 있던 경우가 수정되었습니다. 이전 모델이 요약하는 동작은 전체 CHANGELOG에서 2.1.301 절의 이 항목과 위 항목 두 줄에만 나타나므로(`grep -c -F 'by the previous model' CHANGELOG.md`=2, 두 줄 모두 2.1.301 절 범위 안), 그 동작이 언제부터 있었는지는 CHANGELOG로 확정할 수 없습니다. 비용 상한 advisory 훅 `cost-cap-advisor.sh`는 상태줄 브리지 파일 `/tmp/.claude-cost-${PPID}`의 누적 비용을 읽으므로(`.claude/hooks/scripts/cost-cap-advisor.sh:10`, `:43`), 그 동작이 있던 버전에서는 모델 전환 직후의 비용 증가가 이 요약 비용이었을 수 있습니다 [가설 — 먼저 해당 버전에 이전 모델 요약 동작이 있었는지 확인하고, 있었다면 전환 전후 `/cost` 차이로 판정].
2516
+ - CHANGELOG 원문: "Fixed conversations being compacted over and over, on a model you didn't pick, behind an LLM gateway whose responses name a different model than the one requested"
2517
+ (301) 요청한 모델과 다른 모델 이름을 응답에 적는 LLM gateway 뒤에서, 대화가 고르지 않은 모델로 반복 compaction되던 결함이 수정되었습니다. `ANTHROPIC_BASE_URL`은 추적되는 프로젝트 settings와 templates 미러에서 0건이므로(`grep -c ANTHROPIC_BASE_URL .claude/settings.json templates/.claude/settings.json` 모두 0) 저장소가 추적하는 설정은 gateway를 지정하지 않습니다. 사용자 셸 env, user scope 설정, gitignore된 로컬 settings의 gateway 사용 여부는 저장소 사실이 아니어서 판정에서 뺐습니다 [가설 — 실행 환경의 `ANTHROPIC_BASE_URL` 설정 여부로 판정].
2518
+
2519
+ ### 텔레메트리
2520
+
2521
+ - CHANGELOG 원문: "Added `classifier_verdict` and `permission_mode` to OpenTelemetry `tool_decision` events, so auto mode classifier decisions can be told apart from permission rules"
2522
+ (301) OpenTelemetry `tool_decision` 이벤트에 `classifier_verdict`와 `permission_mode`가 추가되어, auto mode 분류기의 결정을 권한 규칙과 구분할 수 있습니다. `monitoring-setup` 스킬은 `claude_code.tool_decision` 이벤트를 관측 대상으로 나열합니다(`.claude/skills/monitoring-setup/SKILL.md:182`). R010 Self-Check 항목 1은 무인 실행 전에 유효 permission mode를 settings 파일과 실행 플래그로 실측하라고 규정하며(`.claude/rules/MUST-orchestrator-coordination.md:606`), 이 속성은 그 실측을 도구 호출 단위로 보강하는 관측 수단이 될 수 있습니다 [가설 — `permission_mode` 값이 R010이 정의하는 유효 모드와 같은지는 미실측, 같은 세션에서 `claude -p` init `permissionMode`와 대조해 판정].
2523
+ - CHANGELOG 원문: "Added `classifier_category` to OpenTelemetry `tool_decision` events, naming the built-in rule a classifier block matched, when `OTEL_LOG_TOOL_DETAILS=1`"
2524
+ (301) `OTEL_LOG_TOOL_DETAILS=1`일 때 OpenTelemetry `tool_decision` 이벤트에 분류기 차단이 일치한 내장 규칙 이름인 `classifier_category`가 추가되었습니다. R010 STOP Protocol은 서브에이전트가 safety classifier에 2회 걸리면 중단하고 재설계하라고 규정하고(`.claude/rules/MUST-orchestrator-coordination.md:262`), 같은 파일의 2.1.268 노트는 auto mode 거부 화면에 규칙 이름이 표시된다고 기록합니다(`:731`, DETAIL 주석 — 자동 주입되지 않음). 이 속성은 차단 사유를 텔레메트리에도 규칙 단위로 남기므로 재설계 범위를 정할 때 증거로 쓸 수 있으나, 2.1.282부터 project·local settings의 `OTEL_LOG_*` 변수는 무시되므로 user scope 설정이나 셸 export가 필요합니다(`.claude/skills/monitoring-setup/SKILL.md:24`).
2525
+
2526
+ 기타 33건 — 이 저장소 비해당(mods API(`Input`의 `rows`, `$.model.fork`, 훅 `.catch`, `$.env.set`, 질문 대화상자 위 트리)·`claude-api` 번들 스킬의 OpenTelemetry 안내와 CMEK 문구·Self-hosted runner·`[VSCode]`·Windows 전용 항목, vim mode(`%` motion, INSERT 유지, AskUserQuestion Esc), 터미널 렌더링(VTE·iTerm2 잔여 문자, 어두운 ANSI 테마, 헤더 행만 있는 Markdown 표, fullscreen compaction 정지, 장시간 서브에이전트 진행 표시 렌더링), artifact 페이지의 sticky header 위 띠 칠하기, 로그인·디스크 가득 참 오류 문구·토큰 갱신 시간 초과, `awsAuthRefresh`, 재개 세션의 compaction 행 안내, "/clear" 힌트, reftable 저장소의 `/diff` 등 harness 비영향 세부사항으로 분류했습니다 [가설 — 범주별 저장소 사용 여부는 개별 실측하지 않음]). 실측: `gh release view v2.1.301 --repo anthropics/claude-code --json body --jq .body | grep -c '^- '` = 51건 중 위 본문 18건을 다뤘으므로 51 − 18 = 33건입니다. 계수 범위는 해당 릴리즈 노트의 최상위 불릿 줄(`- `로 시작하는 줄)입니다.
2527
+
2528
+ **Action items**:
2529
+ - 이 문서의 규범 변경 제안은 없습니다(CC 2.1.301 CHANGELOG 항목 기준). 위 항목 대부분은 저장소가 추적하는 구성에서 해당 조건(`WorktreeCreate` 훅, 스킬·에이전트 `hooks:`, `arguments:` frontmatter, gateway 설정, watchdog env, 대상 바이너리 확장자 파일)이 관측되지 않았거나, 본문이 인용한 기존 룰(R002, R005, R006, R010, R013, R015, R020, R023)의 전제를 보강하는 항목입니다. 예외는 네 항목입니다. artifact 항목은 저장소가 원문 조건에 해당하며(PreToolUse matcher 5개) 룰 인용 없이 아래 후속 후보 (3)으로 추적합니다. `/rewind` 항목과 모델 전환 크레딧 항목은 룰 인용 없이 [가설]로 남긴 회고 판정이며, 자리표시자 항목은 조건에 해당하는 스킬이 있는지 판정하지 못했습니다.
2530
+ - 후속 실측 후보: (1) OpenTelemetry `tool_decision`의 `permission_mode` 값과 `claude -p` init `permissionMode`를 같은 세션에서 대조합니다. (2) 최신 Fable을 쓸 수 없는 조직에서 `model: "fable"` 스폰의 `resolvedModel`을 확인합니다. (3) 2.1.300 세션 트랜스크립트에서 PreToolUse 훅 환경의 artifact 게시 거부 기록을 확인하고, 기기에 해당 버전 트랜스크립트가 없으면 같은 훅 구성으로 2.1.300과 2.1.301에서 재현해 비교합니다.
2531
+
2532
+ ---
2533
+
2534
+ ## v2.1.302 (2026-10-16)
2535
+
2536
+ > Issue: #1864 — Claude Code v2.1.302 compatibility documentation
2537
+ > Scope-ceiling check (R017): 조사 시점(2026-10-25)의 최신 릴리즈는 2.1.310입니다(`claude --version`=2.1.310, `npm view @anthropic-ai/claude-code version`=2.1.310). 상한 이후 릴리즈 2.1.303~2.1.310의 CHANGELOG 절을 각각 잘라 "2.1.302"와 "Revert"를 검색했으며(`awk -v v="<버전>" '/^## /{p=($2==v)} p' CHANGELOG.md`로 자른 절마다 `grep -c -F`), 두 문자열 모두 8개 절에서 0건이었습니다. 같은 범위의 "regression" 문장은 2.1.305 절의 두 건이며, 각각 "(a 2.1.304 regression)"과 "(a 2.1.300 regression)"을 지목하므로 이 릴리즈의 회귀 수정이 아닙니다. 따라서 이 릴리즈 항목을 되돌리거나 회귀로 지목하는 문장은 관측한 범위에서 없습니다. 릴리즈 게시 시각은 2026-10-16T20:53:06Z입니다(`gh release view v2.1.302 -R anthropics/claude-code --json publishedAt`).
2538
+
2539
+ ### 에이전트 · 서브에이전트
2540
+
2541
+ - CHANGELOG 원문: "Changed fork subagents (`subagent_type: "fork"`) to be on by default in `claude -p`, the Agent SDK, the desktop app and VS Code, as they already are in the terminal; `CLAUDE_CODE_FORK_SUBAGENT=0` turns them off, and `claude mcp serve` never offers them"
2542
+ (302) fork 서브에이전트(`subagent_type: "fork"`)가 터미널과 같이 `claude -p`, Agent SDK, 데스크톱 앱, VS Code에서도 기본으로 켜지도록 바뀌었으며, `CLAUDE_CODE_FORK_SUBAGENT=0`으로 끌 수 있고 `claude mcp serve`는 이를 제공하지 않습니다. R009의 2.1.232 노트는 fork가 전체 대화와 prompt cache를 상속하므로 "Instance independence — Isolated context, no shared state" 행이 fork에는 성립하지 않는다고 기록합니다(`.claude/rules/MUST-parallel-execution.md:200`, DETAIL 주석 — 자동 주입되지 않음). 그 노트는 실행 환경을 구분하지 않지만, 원문("as they already are in the terminal")에 따르면 이 변경 전에는 `claude -p`에서 fork가 기본으로 켜져 있지 않았습니다. 이 변경으로 무인 `claude -p`에서 도는 `/fsd`(`.claude/skills/fsd/SKILL.md:172`)에서도 그 노트의 전제가 기본으로 적용됩니다. `CLAUDE_CODE_FORK_SUBAGENT`는 이 가이드 밖의 추적 파일에서 0건이므로(`git grep -c -F CLAUDE_CODE_FORK_SUBAGENT -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'` 출력 없음) 저장소 설정으로 끄지 않습니다.
2543
+ - CHANGELOG 원문: "Changed the desktop app and VS Code to always run the main conversation's subagents in the background, as the terminal does, rather than let Claude choose; a subagent's own Agent calls in `claude -p`, the Agent SDK, the desktop app and VS Code now run in the foreground by default"
2544
+ (302) 데스크톱 앱과 VS Code가 터미널처럼 메인 대화의 서브에이전트를 항상 백그라운드로 실행하도록 바뀌었고, `claude -p`·Agent SDK·데스크톱 앱·VS Code에서 서브에이전트 자신의 Agent 호출은 이제 기본으로 포그라운드에서 실행됩니다. R009의 2.1.232 노트는 백그라운드 스폰의 반환이 완료 신호가 아니라고 기록하며(`.claude/rules/MUST-parallel-execution.md:200`, DETAIL 주석 — 자동 주입되지 않음), 이 변경은 그 전제를 데스크톱 앱과 VS Code로 넓힙니다. 뒤쪽 절의 "서브에이전트 자신의 Agent 호출"은 R010 Core Rule이 프로젝트 정책으로 금지하는 경로이므로(`.claude/rules/MUST-orchestrator-coordination.md:7`, "Subagents MUST NOT spawn other subagents") 이 정책을 따르는 위임 흐름에는 해당하지 않습니다. 서브에이전트가 정책을 어기고 Agent를 호출한 경우의 포그라운드 실행 영향은 관측하지 않았습니다 [가설 — 해당 위반 사례의 트랜스크립트로 판정].
2545
+ - CHANGELOG 원문: "Fixed worktree isolation refusing to create or resume worktrees under git 2.56 or later when a stray `.git` file points at a directory that doesn't exist"
2546
+ (302) git 2.56 이상에서 존재하지 않는 디렉토리를 가리키는 남은 `.git` 파일이 있을 때 worktree isolation이 worktree 생성·재개를 거부하던 결함이 수정되었습니다. 작성 기기의 git은 2.52.0으로(`git --version`, 로컬 관측) 원문의 버전 조건에 들지 않으며, CI 러너와 사용자 환경의 git 버전은 관측하지 않았습니다. 에이전트 frontmatter의 `isolation:`은 관측한 범위에서 `sandbox` 1건이며(`git grep -n -E '^isolation:' -- '.claude/agents/*.md'` → `.claude/agents/sec-codeql-expert.md:8`) `worktree` 값은 없습니다. 다만 가이드는 에이전트 frontmatter `isolation: worktree`를 선택지로 안내하고(`guides/git-worktree-workflow/README.md:89`, `guides/worktree-lifecycle/README.md:81`), `omcustom-auto-improve` 스킬은 `EnterWorktree` 도구를 씁니다(`.claude/skills/omcustom-auto-improve/SKILL.md:59`). 그 안내를 따른 에이전트와 `EnterWorktree`가 원문의 "worktree isolation"에 포함되는지는 관측하지 못했습니다 [가설 — git 2.56 이상 환경에서 남은 `.git` 파일을 둔 채 `isolation: worktree` 에이전트 스폰과 `EnterWorktree` 호출을 각각 실행해 판정].
2547
+
2548
+ ### 권한 · permission mode
2549
+
2550
+ - CHANGELOG 원문: "Changed `claude -p` and Agent SDK sessions with no permission mode to start in `default` mode on third-party providers, with telemetry off or on a fresh install; `--permission-mode auto` keeps auto"
2551
+ (302) permission mode가 지정되지 않은 `claude -p`·Agent SDK 세션이 서드파티 provider에서, 텔레메트리를 끈 환경에서, 또는 새로 설치한 환경에서 `default` 모드로 시작하도록 바뀌었고, `--permission-mode auto`는 auto를 유지합니다. 원문의 "on third-party providers, with telemetry off or on a fresh install"은 세 조건을 선택지로 나열한 것으로 읽었습니다. 같은 CHANGELOG의 다른 항목이 텔레메트리 꺼짐을 provider와 별개 범주로 나열하기 때문입니다(2.1.304 "now also available on Bedrock, Vertex, Foundry, Claude apps gateway and telemetry-disabled sessions", 2.1.310 "on Bedrock, Vertex, and Foundry, and when telemetry or nonessential traffic is disabled"). 서드파티 provider이면서 텔레메트리가 꺼졌거나 새로 설치한 경우만 해당한다는 결합 독해도 문법상 배제되지 않습니다 [가설 — 서드파티 provider 없이 텔레메트리만 끈 1st-party `claude -p` 세션의 init `permissionMode`가 `default`인지로 판정]. R010 「Universal bypassPermissions」 본문은 2.1.212 이상에서 부모 모드가 `permissions.defaultMode`(managed·local·project·user)와 `--permission-mode` 같은 실행 플래그에서 온다고 기록하고, 2.1.257부터 project·local의 `bypassPermissions`가 무시되어 그 범위가 `default`로 귀결한다는 실측 규칙을 적습니다(`.claude/rules/MUST-orchestrator-coordination.md:588`, Self-Check 항목 1 `:606`). 저장소가 추적하는 값은 프로젝트 settings의 `bypassPermissions`와 templates 미러의 미설정입니다(`jq -r '.permissions.defaultMode // "unset"' .claude/settings.json templates/.claude/settings.json` = `bypassPermissions`, `unset`). 따라서 init으로 templates를 받은 프로젝트에서 local·user·managed 범위의 `defaultMode`와 실행 플래그도 비어 있으면, 위 조건의 `claude -p`는 이 변경의 "no permission mode" 세션에 들 수 있습니다 [가설 — 그 구성에서 위 세 조건별 init `permissionMode`로 판정]. 이 저장소 자체의 `bypassPermissions`가 무시된 상태를 CC가 "no permission mode"로 취급하는지는 실측하지 않았으며, R010 `:588`의 규칙대로라면 그 경우에도 `default`로 귀결하므로 결과는 같을 것으로 봅니다 [가설 — 같은 판정 기준]. `packages/serve/src/lib/server/claude-cli.ts`의 `claude -p … --no-input` 호출 4곳(`:40`, `:86`, `:117`, `:174`)은 `--permission-mode`를 넘기지 않으며(`git grep -n -F 'claude -p' -- packages/` 4건, `git grep -n -F -e '--permission-mode' -- packages/` 출력 없음), 각 호출은 `cwd: root` 또는 `cwd: projectRoot`(`:44`, `:90`, `:121`, `:178`)에서 실행되므로, 실행 플래그가 없는 이 호출의 모드는 그 디렉토리의 project·local settings와 user·managed settings, 곧 R010 `:588`이 나열한 네 범위가 정합니다. 이 호출이 도구 승인을 필요로 하는지는 관측하지 않았습니다. 작성 기기의 로컬 관측은 저장소 사실이 아니며, user scope `auto`와 추적되지 않는 `.claude/settings.local.json`(`git check-ignore -v --no-index .claude/settings.local.json` = `.gitignore:40:.claude/*`)의 `bypassPermissions`입니다. R010 `:588`의 규칙대로라면 이 조합의 `claude -p`는 이 변경과 무관하게 이미 `default`로 시작합니다. 서드파티 provider env는 추적되는 프로젝트 settings와 templates 미러에서 0건입니다(`grep -c -E 'ANTHROPIC_BASE_URL|CLAUDE_CODE_USE_(BEDROCK|VERTEX|FOUNDRY)' .claude/settings.json templates/.claude/settings.json` 모두 0). 무인 `/fsd`를 위 세 조건 중 하나에서 돌릴 때는 R010 Self-Check대로 `claude -p` init `permissionMode`를 먼저 실측합니다.
2552
+ - CHANGELOG 원문: "Added `CLAUDE_CODE_AUTO_MODE_MODEL` to choose the model the client-side auto mode classifier uses; it does not change the model for server-side auto mode"
2553
+ (302) 클라이언트 측 auto mode 분류기가 쓰는 모델을 고르는 `CLAUDE_CODE_AUTO_MODE_MODEL`이 추가되었으며, 서버 측 auto mode의 모델은 바꾸지 않습니다. 저장소가 추적하는 settings는 `auto`를 지정하지 않습니다(위 `jq` 결과 `bypassPermissions`, `unset`). 작성 기기의 user scope 값은 `auto`이지만(로컬 관측), R010 `:588`의 실측 규칙에 따르면 무시된 project `bypassPermissions`가 `claude -p`에서 그 값을 `default`로 덮으며, 대화형 TTY 세션의 결과는 같은 단락이 `[가설]`로 남긴 미조정 상태입니다. 이 env는 이 가이드 밖의 추적 파일에서 0건이므로(`git grep -c -F CLAUDE_CODE_AUTO_MODE_MODEL -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'` 출력 없음) 저장소 설정 범위에서는 분류기 모델이 바뀌지 않습니다. auto mode가 활성인 세션에서 클라이언트 측과 서버 측 중 어느 분류기가 쓰이는지는 관측하지 못했습니다 [가설 — OpenTelemetry `tool_decision` 이벤트의 `classifier_verdict`·`permission_mode` 속성(2.1.301)으로 판정].
2554
+ - CHANGELOG 원문: "Improved auto mode with the server-side classifier: a conversation too long for the safety check is now compacted, instead of every checked tool call being denied"
2555
+ (302) 서버 측 분류기를 쓰는 auto mode에서, 안전 검사에 너무 긴 대화는 이제 검사 대상 도구 호출을 모두 거부하는 대신 compaction됩니다. R010 STOP Protocol은 서브에이전트가 safety classifier에 2회 걸리면 중단하고 범위를 좁혀 재설계하라고 규정합니다(`.claude/rules/MUST-orchestrator-coordination.md:262`). 구버전의 긴 세션에서 연속 거부가 났다면 그 원인은 작업 범위가 아니라 대화 길이였을 수 있으므로, 그 거부 횟수를 STOP 판정의 trip으로 셀 때는 거부 사유를 먼저 확인하는 것이 좋습니다 [가설 — 거부 메시지의 규칙 이름이나 `classifier_category`로 판정].
2556
+
2557
+ ### 훅
2558
+
2559
+ - CHANGELOG 원문: "Changed prompt and agent hooks so that at most 12 of one event run at a time; the rest wait their turn"
2560
+ (302) prompt 훅과 agent 훅이 한 이벤트당 동시에 최대 12개까지 실행되고 나머지는 차례를 기다리도록 바뀌었습니다. 이 저장소의 prompt·agent 타입 훅은 프로젝트 settings와 templates 미러에서 각각 1개이며(`jq -r '[.hooks[][]?.hooks[]? | select(.type=="prompt" or .type=="agent")] | length' .claude/settings.json templates/.claude/settings.json` = 1, 1), 그 1개는 PostCompact 이벤트(키 `.claude/settings.json:403`)의 prompt 훅입니다(`"type": "prompt"`는 `.claude/settings.json:407`, templates 미러 `templates/.claude/settings.json:373`). 소스 `.claude/hooks/hooks.json`에서도 같은 타입은 1개입니다(`jq -r '[.. | objects | select(has("type")) | .type | select(.=="prompt" or .=="agent")] | length' .claude/hooks/hooks.json` = 1). 위 세 파일에서 한 이벤트에 12개를 넘는 prompt·agent 훅은 관측되지 않았으므로 이 상한은 저장소가 배선한 훅의 실행 순서를 바꾸지 않습니다(외부 플러그인 훅은 측정 범위 밖입니다). command 훅은 원문 대상이 아닙니다.
2561
+
2562
+ ### 컨텍스트 · compaction · 도구
2563
+
2564
+ - CHANGELOG 원문: "Added an `Idle compaction` row to `/config` for turning idle compaction off or back on; the notices shown after an idle compaction now say how to turn it off"
2565
+ (302) idle compaction을 끄거나 다시 켜는 `Idle compaction` 행이 `/config`에 추가되었고, idle compaction 후 표시되는 안내가 끄는 방법을 알려 줍니다. 관측한 범위에서 저장소에는 idle compaction 관련 문자열이 0건입니다(`git grep -n -i 'idle compaction' -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'` rc=1). R013의 컨텍스트 예산 임계값은 컨텍스트 사용 비율 기준이므로(`.claude/rules/SHOULD-ecomode.md:87` 제목 줄, 임계값 상세는 같은 파일 `:103`의 DETAIL 주석 — 자동 주입되지 않음), 유휴 시간에 의한 compaction은 그 임계값과 별개로 일어날 수 있습니다 [가설 — idle compaction의 발동 조건은 원문에 없어 미실측].
2566
+ - CHANGELOG 원문: "Fixed a "Prompt is too long" error when stopping a turn while the conversation was being compacted"
2567
+ (302) 대화가 compaction되는 동안 턴을 멈추면 "Prompt is too long" 오류가 나던 결함이 수정되었습니다. R013의 2.1.274 노트는 훅 주도 세션의 "Prompt is too long" 종료 결함 수정을 기록합니다(`.claude/rules/SHOULD-ecomode.md:101`). 이 항목은 다른 경로(compaction 중 턴 중지)의 같은 오류이므로, 2.1.302 미만에서 사용자가 compaction 중에 턴을 멈춘 뒤 이 오류가 났다면 컨텍스트 초과가 아니라 이 결함이었을 수 있습니다 [가설 — 오류 직전 compaction 진행 여부로 판정].
2568
+ - CHANGELOG 원문: "Fixed a prompt cache miss when a tool added mid-session was loaded again through ToolSearch or after compaction"
2569
+ (302) 세션 도중 추가된 도구(원문 "a tool added mid-session")가 ToolSearch로 다시 로드되거나 compaction 후에 다시 로드될 때 prompt cache miss가 나던 결함이 수정되었습니다. 원문은 어떤 도구가 세션 도중 추가되는지 예를 들지 않습니다. 작성자 예시로, 이 저장소는 `.mcp.json`에 MCP 서버 2개를 두므로(`git cat-file -p HEAD:.mcp.json`) 그 서버가 세션 중에 늦게 연결된 경우 그 도구가 원문 범위에 들 수 있습니다 [가설 — 서버 연결 시점과 재로드 전후 `prompt_cache` 필드로 판정]. 이 저장소의 룰은 `SendMessage` 같은 지연 내장 도구를 `ToolSearch`로 로드하는 절차를 기록하지만(`.claude/rules/MUST-agent-teams.md:492`), 지연 내장 도구가 원문의 "a tool added mid-session"에 해당하는지는 원문에 없어 판정하지 못했습니다 [가설 — 지연 내장 도구 재로드 전후 `prompt_cache` 필드로 판정]. R012는 상태줄의 `prompt_cache` 필드가 cache miss의 가능한 원인을 표시한다고 기록합니다(`.claude/rules/SHOULD-hud-statusline.md:65`).
2570
+ - CHANGELOG 원문: "Fixed the Read tool loading an image file of any size, or a pipe or device named like an image, entirely into memory; image sources over 128 MB are now refused"
2571
+ (302) Read 도구가 크기와 무관하게 이미지 파일, 또는 이미지처럼 이름 붙은 파이프·장치를 통째로 메모리에 올리던 결함이 수정되어, 이제 128 MB를 넘는 이미지 소스는 거부됩니다. 이 저장소의 추적 이미지 14개 중 가장 큰 파일은 1,294,475바이트입니다(`git ls-files -z -- '*.png' '*.jpg' '*.jpeg' '*.gif' '*.webp' '*.svg' | xargs -0 stat -f '%z %N' | sort -n | tail -1` → `assets/diagrams/03-routing-architecture.png`). 따라서 추적 이미지 범위에서는 거부 대상이 관측되지 않았습니다.
2572
+
2573
+ ### MCP · 설정 쓰기 · 텔레메트리
2574
+
2575
+ - CHANGELOG 원문: "Fixed MCP servers showing no tools, or every tool call failing, when the server negotiates protocol version 2026-07-28 but omits `resultType`, `ttlMs` or `cacheScope`"
2576
+ (302) 서버가 프로토콜 버전 2026-07-28로 협상하면서 `resultType`, `ttlMs`, `cacheScope`를 빠뜨리면 MCP 서버의 도구가 보이지 않거나 모든 도구 호출이 실패하던 결함이 수정되었습니다. 이 저장소는 `.mcp.json`에 서버 2개(`ontology-rag`는 stdio, `eraser`는 http)를 둡니다(`git cat-file -p HEAD:.mcp.json`). R019는 MCP 서버를 쓸 수 없거나 결과가 비면 enrichment 없이 조용히 진행하라고 규정하므로(`.claude/rules/SHOULD-ontology-rag-routing.md:43`, `:45`), 구버전에서 이 결함으로 도구가 사라졌다면 라우팅 enrichment가 경고 없이 빠졌을 수 있습니다. 두 서버가 협상한 프로토콜 버전은 관측하지 못했습니다 [가설 — MCP 초기화 응답의 `protocolVersion`으로 판정].
2577
+ - CHANGELOG 원문: "Fixed `claude plugin` and other subcommands sometimes exiting before a queued settings or config write finished, which could lose the change or leave a `.tmp` file behind"
2578
+ (302) `claude plugin`과 다른 서브커맨드가 대기 중인 settings·config 쓰기가 끝나기 전에 가끔 종료되어, 변경이 유실되거나 `.tmp` 파일이 남을 수 있던 결함이 수정되었습니다. 이 저장소 문서는 설정을 쓰는 서브커맨드를 안내하며, 아래는 예시입니다(후보 전체는 `git grep -n -E 'claude (mcp|plugin) (add|install|remove|enable|disable|marketplace)' -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/**' ':!wiki/**'` 출력). `claude mcp add semble -- semble mcp`는 `.claude/skills/semble-integration/SKILL.md:67`과 `guides/token-efficiency/semble.md:71`에 있습니다. `claude mcp add-json aws-mcp --scope user …`는 HTML 주석 밖의 에이전트 정의 본문 `.claude/agents/infra-aws-expert.md:81`과 `guides/aws/index.yaml:47`에 있고, `CLAUDE.md:275`·`:279`의 같은 계열 명령(`claude mcp add`·`claude mcp add-json`)은 HTML 주석 안이라 자동 주입되지 않습니다. `claude plugin marketplace add`와 `claude plugin install cc-token-saver`는 `guides/cc-token-saver/README.md:9`, `:10`에 있습니다. 원문은 `claude plugin`을 명명하지만 `claude mcp add`가 원문의 "other subcommands"에 드는지는 원문에 없습니다 [가설 — 2.1.302 미만에서 `claude mcp add` 직후 설정 파일의 서버 항목 기록 여부와 `.tmp` 잔존 여부로 판정]. 구버전에서 이런 명령을 실행했다면 `claude mcp list`나 `claude plugin list`로 등록 결과를 실측하는 것이 R020의 "실행함 ≠ 성공함" 원칙에 맞습니다.
2579
+ - CHANGELOG 원문: "Fixed `classifier_category` missing from OpenTelemetry `tool_decision` events for most auto mode classifier blocks, and new `tool_decision` attributes pushing out `tool_use_id`, `tool_source` and `tool_parameters` when `OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT` is low"
2580
+ (302) 대부분의 auto mode 분류기 차단에서 OpenTelemetry `tool_decision` 이벤트에 `classifier_category`가 빠지던 결함과, `OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT`가 낮을 때 새 `tool_decision` 속성이 `tool_use_id`, `tool_source`, `tool_parameters`를 밀어내던 결함이 수정되었습니다. 2.1.301에서 추가된 속성의 후속 수정이므로, 2.1.301 단독 환경의 `classifier_category` 부재는 차단이 없었다는 증거가 아닙니다. `monitoring-setup` 스킬은 `claude_code.tool_decision`을 관측 대상으로 나열하며(`.claude/skills/monitoring-setup/SKILL.md:182`), `OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT`는 이 가이드 밖의 추적 파일에서 0건입니다(`git grep -n OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'` rc=1).
2581
+
2582
+ 기타 49건 — 이 저장소 비해당(`[Cloud sessions]`·`[Claude Tag]`·`[Code Review]`·`[Remote Control]`·`[VSCode]`·Self-hosted runner·Windows 전용 항목, 태그 없는 cloud session 비용·사용량 재시작 수정, `/design-sync`·`/design-login`·`/design consent` 등 Claude Design 안내, Vertex·Bedrock 전환 오류와 gateway의 Opus 4 접두사 모델명, plugin marketplace의 reftable 재복제·`claude plugin details <name>@builtin` 안내·plugin이 많을 때의 시작 시간·PowerShell 도구, 데스크톱 앱의 MCP 인증 안내, artifact 빈 편집 목록 게시, agents view 빈 행과 `← for agents` 힌트, `claude remote-control --help`, prompt suggestions의 크레딧 과금, 백틱 URL·이모지 줄바꿈 렌더링, 배경 세션의 LLM gateway 안내, Claude in Chrome 안내문 위치, `/feedback` 정책 안내 등 harness 비영향 세부사항으로 분류했습니다 [가설 — 범주별 저장소 사용 여부는 개별 실측하지 않음]). 실측: `gh release view v2.1.302 --repo anthropics/claude-code --json body --jq .body | grep -c '^- '` = 63건 중 위 본문 14건을 다뤘으므로 63 − 14 = 49건입니다. 계수 범위는 해당 릴리즈 노트의 최상위 불릿 줄(`- `로 시작하는 줄)입니다.
2583
+
2584
+ **Action items**:
2585
+ - 이 문서의 규범 변경 제안은 없습니다(CC 2.1.302 CHANGELOG 항목 기준). fork 서브에이전트의 `-p` 기본 활성화와 permission mode 기본값 변경은 R009·R010이 이미 다루는 전제(fork 컨텍스트 상속, 유효 모드 실측)를 무인 실행 경로로 넓히는 항목입니다.
2586
+ - 후속 실측 후보: (1) `defaultMode`와 `--permission-mode` 없이 서드파티 provider, 텔레메트리를 끈 1st-party, 새 설치 각각에서 `claude -p` init `permissionMode`를 실측합니다(templates 미러의 `defaultMode` 미설정 구성 포함). (2) 무인 `claude -p`에서 `subagent_type: "fork"`가 도구 목록에 노출되는지 확인합니다. (3) `.mcp.json` 두 서버의 협상 `protocolVersion`을 확인합니다.
2587
+
2588
+ ---
2589
+
2590
+ ## v2.1.303 (2026-10-18)
2591
+
2592
+ > Issue: #1865 — Claude Code v2.1.303 compatibility documentation
2593
+ > Scope-ceiling check (R017): 조사 시점(2026-10-25)의 최신 릴리즈는 2.1.310입니다(`claude --version`=2.1.310, `npm view @anthropic-ai/claude-code version`=2.1.310). 2.1.304~2.1.310 CHANGELOG 절을 각각 잘라 `2.1.303` 문자열과 "Revert"(대소문자 무시)를 검색한 결과(`grep -n -i -E '2\.1\.303|revert' section-<버전>.md`), 일곱 절 모두에서 일치하는 줄이 관측되지 않았습니다. 따라서 이 릴리즈를 되돌리거나 그 회귀를 고치는 문장은 상한까지 관측되지 않았습니다. 릴리즈 게시 시각은 2026-10-18T22:26:54Z입니다(`gh release view v2.1.303 -R anthropics/claude-code --json publishedAt`).
2594
+
2595
+ ### 일반 수정
2596
+
2597
+ - CHANGELOG 원문: "Bug fixes and reliability improvements"
2598
+ (303) 이 릴리즈의 노트는 일반적인 버그 수정과 안정성 개선이라는 한 문장으로만 구성되며 개별 변경을 명시하지 않습니다(`gh release view v2.1.303 --repo anthropics/claude-code --json body --jq .body | grep -c '^- '` = 1). 따라서 훅, 서브에이전트, 권한, headless 실행 등 이 저장소 하네스의 어떤 동작이 바뀌었는지는 노트로 판정할 수 없습니다 [가설 — 판정하려면 2.1.302와 2.1.303에서 같은 훅·`claude -p` 실행의 출력을 비교해야 합니다]. 이 릴리즈를 근거로 룰·훅·설정을 바꾸지 않으며, 2.1.302와 2.1.303 사이에서 동작 차이가 관측되면 이 릴리즈를 원인 후보로 함께 기록합니다.
2599
+
2600
+ 기타 0건 — 이 저장소 비해당 항목은 없습니다. 실측: `gh release view v2.1.303 --repo anthropics/claude-code --json body --jq .body | grep -c '^- '` = 1건 중 위 본문 1건을 다뤘으므로 1 − 1 = 0건입니다. 계수 범위는 해당 릴리즈 노트의 최상위 불릿 줄(`- `로 시작하는 줄)입니다.
2601
+
2602
+ **Action items**:
2603
+ - 룰·훅·설정 변경은 필요하지 않습니다. 노트가 개별 변경을 명시하지 않으므로 조치 근거가 되는 항목이 없습니다.
2604
+
2605
+ ---
2606
+
2607
+ ## v2.1.304 (2026-10-19)
2608
+
2609
+ > Issue: #1866 — Claude Code v2.1.304 compatibility documentation
2610
+ > Scope-ceiling check (R017): 조사 시점(2026-10-25)의 최신 릴리즈는 2.1.310입니다(`claude --version`=2.1.310, `npm view @anthropic-ai/claude-code version`=2.1.310). 2.1.305~2.1.310의 CHANGELOG 절을 각각 잘라 "2.1.304"와 "Revert"를 검색했습니다. "Revert"는 여섯 절 모두에서 0건이었고, "2.1.304"는 2.1.305 절의 한 문장에서 나타났습니다. 그 문장은 "Fixed every request failing on Vertex, Bedrock and other providers when the endpoint or a gateway rejects tool search, and behind gateways with ToolSearch disallowed or left out of `--tools` (a 2.1.304 regression): Claude Code now retries without it"이며, 도구 검색과 관련된 2.1.304 회귀를 고친 문장입니다. 원문은 회귀를 일으킨 2.1.304 변경을 특정하지 않으며, 실패 조건에는 Vertex·Bedrock 등 provider와 `ToolSearch`를 금지하거나 `--tools`에서 뺀 게이트웨이가 들어 있습니다. 2.1.304 절에서 도구 검색을 다루는 최상위 불릿은 아래 「컨텍스트 · compaction · 도구 검색」 소절의 custom `ANTHROPIC_BASE_URL` 항목 하나입니다(`awk -v v=2.1.304 '/^## /{p=($2==v)} p' CHANGELOG.md | grep -c -i -E 'tool ?search'` = 1). 다만 그 항목이 이 회귀의 원인인지는 원문으로 확인되지 않습니다 [가설 — 이후 CHANGELOG나 이슈에서 원인 변경이 명시되면 판정]. 릴리즈 게시 시각은 2026-10-19T21:34:39Z입니다(`gh release view v2.1.304 -R anthropics/claude-code --json publishedAt`). 릴리즈 노트의 최상위 불릿 76줄은 CHANGELOG 2.1.304 절의 최상위 불릿 76줄과 순서까지 같습니다(python3 목록 비교 결과 identical).
2611
+
2612
+ ### 훅 · 스킬
2613
+
2614
+ - CHANGELOG 원문: "Fixed a PreToolUse hook's deny reason being replaced by a timeout error when an Agent SDK callback hook on the same tool call timed out"
2615
+ (304) 같은 도구 호출에 걸린 Agent SDK 콜백 훅이 타임아웃되면 PreToolUse 훅의 거부 사유가 타임아웃 오류로 바뀌던 결함이 수정되었습니다. 이 저장소의 PreToolUse 훅은 `.claude/settings.json`에 배선된 11개 블록입니다(`jq '.hooks.PreToolUse | length' .claude/settings.json` = 11). 관측한 범위에서 저장소 코드에는 Agent SDK 의존성이 보이지 않으므로(`git grep -n -E 'claude-agent-sdk|claude-code-sdk' -- package.json src packages` rc=1) SDK 콜백 훅이 같은 도구 호출에 겹치는 조건은 관측되지 않았습니다.
2616
+ - CHANGELOG 원문: "[VSCode] Fixed one cause of sessions failing to start with "Subprocess initialization did not complete within 60000ms": time a SessionStart command hook spends running no longer counts toward the limit, up to 10 minutes in total"
2617
+ (304) VSCode에서 세션이 "Subprocess initialization did not complete within 60000ms"로 시작에 실패하던 원인 하나가 수정되어, SessionStart command 훅이 실행되는 시간은 합계 10분까지 이 제한에 포함되지 않습니다. 이 저장소는 `.claude/settings.json`의 SessionStart에 command 훅 7개를 배선하며, 그 훅들에는 개별 `timeout`이 없습니다(`jq -c '[.hooks.SessionStart[].hooks[] | .type] | group_by(.) | map({(.[0]): length}) | add' .claude/settings.json` = `{"command":7}`, `jq -c '[.hooks.SessionStart[].hooks[] | .timeout // null]'` = null 7개). 원문에 따르면 수정 전 버전에서는 이 훅들의 실행 시간이 60초 시작 제한에 포함되었으므로, VSCode 확장으로 이 저장소를 여는 환경에서는 시작 실패에 기여했을 수 있습니다 [가설 — 7개 훅의 실행 시간 합계와 VSCode 시작 실패 발생 여부는 미관측]. VSCode 전용 항목이며 CLI 세션과 `claude -p`에는 해당하지 않습니다.
2618
+ - CHANGELOG 원문: "Fixed a skill's `once` hook also removing another skill's identical hook after it ran"
2619
+ (304) 한 스킬의 `once` 훅이 실행된 뒤 다른 스킬의 동일한 훅까지 제거하던 결함이 수정되었습니다. 관측한 범위에서 `.claude/skills` 아래 파일에는 `hooks:` 키가 0건이므로(`git grep -n -E '^[[:space:]]*hooks:' -- .claude/skills` rc=1) 스킬 훅 경로의 영향 조건은 관측되지 않았습니다.
2620
+ - CHANGELOG 원문: "Changed skill hooks: the skills of one source (a repo, your own folder, or a plugin) can register at most 1,024 hooks and 16,384 matcher characters per session"
2621
+ (304) 한 출처(저장소, 사용자 폴더, 플러그인)의 스킬이 세션당 등록할 수 있는 훅이 최대 1,024개, matcher 문자 수가 최대 16,384자로 제한됩니다. 위 `git grep` 결과(rc=1)에 따르면 이 저장소의 스킬은 훅을 선언하지 않으므로 이 상한과 관계가 관측되지 않았습니다. 원문의 대상은 스킬 훅이며, 프로젝트 settings 훅이 이 계수에 들어가는지는 원문이 밝히지 않습니다. 들어가더라도 `.claude/settings.json`의 훅은 64개(command 63, prompt 1)이므로(`jq '[.hooks[][].hooks[]] | length' .claude/settings.json` = 64) 1,024개 상한 아래이고, matcher 문자 수 합계도 374자로(`jq '[.hooks[][].matcher // ""] | add | length' .claude/settings.json` = 374) 16,384자 상한 아래입니다.
2622
+ - CHANGELOG 원문: "Changed skills under a policy that allows hooks from plugins only: a skill used in the main conversation whose hooks are kept out no longer gets its `allowed-tools`"
2623
+ (304) 플러그인 훅만 허용하는 정책 아래에서, 훅이 배제된 스킬을 메인 대화에서 쓰면 그 스킬의 `allowed-tools`가 더 이상 부여되지 않습니다. 이 저장소에서 `allowed-tools`를 선언한 스킬은 `.claude/skills/diagram-design/SKILL.md:12`와 `.claude/skills/profile/SKILL.md:7`의 두 개입니다(`git grep -n -E '^allowed-tools:' -- '.claude/skills/*/SKILL.md'`). 두 스킬에는 `hooks:` 키가 없으므로(위 `git grep` rc=1) 원문의 "hooks are kept out" 조건에 해당하지 않는다고 봅니다 [가설 — 훅을 선언하지 않은 스킬도 이 조건에 드는지는 원문이 밝히지 않으며, 해당 managed 정책을 켠 환경에서 두 스킬의 도구 허용을 실측하면 판정]. 정책 자체는 managed settings 사안이라 저장소 파일에서는 관측 대상이 아닙니다.
2624
+ - CHANGELOG 원문: "Changed compaction to send Claude the skill list again afterwards; `/reload-skills` now sends only new or changed skills"
2625
+ (304) compaction 뒤에 스킬 목록을 Claude에 다시 보내도록 바뀌었고, `/reload-skills`는 새로 추가되거나 바뀐 스킬만 보냅니다. 이 저장소의 `.claude/skills/`에는 스킬 디렉토리 114개가 있습니다(`command ls -d .claude/skills/*/ | wc -l` = 114). 이 중 init이 설치하는 것은 `scope: package` 6개를 뺀 108개입니다(`src/core/scope-filter.ts:36`의 `return scope !== 'package';`, `git grep -l -E '^scope: package' -- '.claude/skills/*/SKILL.md' | wc -l` = 6). 따라서 compaction 직후의 컨텍스트 사용량(R013 임계값, statusline CTX%)에는 그 세션이 로드한 스킬 목록 크기가 다시 더해집니다 [가설 — compaction 직전·직후의 `/context` 출력과 statusline CTX%를 비교하면 판정]. R013의 v2.1.261 노트는 이 저장소의 스킬 열거 블록을 "115개"로 적고 있으나(`.claude/rules/SHOULD-ecomode.md:97`) 위 디렉토리 계수는 114개입니다.
2626
+ - CHANGELOG 원문: "Fixed resumed and cloud sessions sending Claude the whole skill list again each time plugins reloaded at startup"
2627
+ (304) 재개된 세션과 cloud 세션이 시작할 때 플러그인이 다시 로드될 때마다 전체 스킬 목록을 Claude에 다시 보내던 결함이 수정되었습니다. 스킬 디렉토리 114개(위 계수)를 둔 이 저장소에서 `--resume`으로 재개한 세션에서는 이 중복이 컨텍스트 비용을 늘렸을 수 있습니다 [가설 — 수정 전 버전으로 재개한 세션의 트랜스크립트에서 스킬 목록 반복 횟수를 세면 판정].
2628
+
2629
+ ### 서브에이전트 · 팀원 · headless
2630
+
2631
+ - CHANGELOG 원문: "Fixed a plugin keeping a headless run going past `--max-turns`, Stop, or ended input by spawning subagents or re-running a finished one"
2632
+ (304) 플러그인이 서브에이전트를 스폰하거나 끝난 서브에이전트를 다시 실행해 headless 실행을 `--max-turns`·Stop·입력 종료 뒤까지 이어가던 결함이 수정되었습니다. 원문의 주체는 플러그인입니다. 관측한 범위에서 이 저장소의 `.claude/`와 `CLAUDE.md`에는 `--max-turns` 사용이 보이지 않으며(`git grep -n -E -- '--max-turns' -- .claude CLAUDE.md` rc=1), 무인 `/fsd`의 `claude -p` 경로는 `OMCUSTOM_UNATTENDED=1`로 무인 실행을 표시합니다(`.claude/skills/fsd/SKILL.md:133`). 이 저장소는 프로젝트 settings에서 플러그인을 켜지 않으며(`jq -c '.enabledPlugins // null' .claude/settings.json` = null), 사용자 수준에서 켠 플러그인이 이 결함을 일으켰는지는 관측하지 않았습니다 [가설 — headless 실행 트랜스크립트에서 Stop 이후의 서브에이전트 스폰이 보이면 판정].
2633
+ - CHANGELOG 원문: "Fixed self-paced `/loop` wakeups scheduled at the 1-hour maximum firing just after the 1-hour prompt cache expired, so those wakeups no longer re-read the conversation uncached"
2634
+ (304) 1시간 최대치로 예약된 self-paced `/loop` wakeup이 1시간 prompt cache가 만료된 직후에 발동하던 결함이 수정되어, 그런 wakeup은 더 이상 대화를 캐시 없이 다시 읽지 않습니다. `/fsd` 스킬은 반복 단위를 `/loop` recurrence, 곧 모델이 주기를 정하는 self-paced loop로 기술하고(`.claude/skills/fsd/SKILL.md:39`), 무인(`claude -p`, 예약 실행) 세션에서 `/goal`·`/loop`를 호출하는 경로를 권장합니다(`.claude/skills/fsd/SKILL.md:172`). 그 경로의 wakeup이 1시간 최대치로 예약된 적이 있다면, 수정 전 버전에서는 그런 wakeup마다 대화를 캐시 없이 다시 읽는 비용이 들었을 수 있습니다 [가설 — 무인 `/fsd` 실행 기록에서 1시간 최대치 wakeup의 발생 여부와 그 요청의 cache read 토큰으로 판정].
2635
+ - CHANGELOG 원문: "Fixed subagents sometimes forgetting their most recent work when they were messaged or resumed right after finishing"
2636
+ (304) 서브에이전트가 끝난 직후에 메시지를 받거나 재개되면 가장 최근 작업을 때때로 잊던 결함이 수정되었습니다. R009는 완료 알림에 보고 본문이 없으면 한 턴 기다리고, 그래도 없으면 산출물을 실측한 뒤 `SendMessage`로 재요청하도록 안내합니다(`.claude/rules/MUST-parallel-execution.md:368`). 수정 전 버전에서는 이 재요청을 받은 서브에이전트가 직전 작업을 잊은 채 답했을 수 있습니다 [가설 — 수정 전 버전의 재요청 응답과 실제 산출물을 대조한 기록은 미관측]. 재요청 응답도 결정론적 ground-truth로 대조한다는 원칙(R018 「Member Completion Verification」, 제목 `.claude/rules/MUST-agent-teams.md:501`)은 그대로입니다.
2637
+ - CHANGELOG 원문: "Fixed agent teams: approving a shutdown request from the main session no longer exits the whole CLI"
2638
+ (304) 메인 세션에서 shutdown 요청을 승인하면 CLI 전체가 종료되던 agent teams 결함이 수정되었습니다. 이 환경에서 R018은 `TeamCreate` 부재로 비활성입니다(`.claude/rules/MUST-agent-teams.md:22`, `:30`). 같은 파일 `:22`는 이름 붙인 `Agent` 스폰이 세션의 암묵적 팀의 팀원이 된다고 기록하지만, 그 팀원에게서 shutdown 요청이 오는지는 관측하지 않았습니다 [가설 — 이름 붙인 팀원의 shutdown 요청을 메인에서 승인한 뒤 CLI가 유지되는지로 판정].
2639
+ - CHANGELOG 원문: "Improved responsiveness and throughput when many subagents are running at the same time"
2640
+ (304) 많은 서브에이전트가 동시에 실행될 때의 응답성과 처리량이 개선되었습니다. R009의 동시 실행 상한 "5 concurrent (soft default: 4)"(`.claude/rules/MUST-parallel-execution.md:190`)는 프로젝트 정책이므로 이 개선으로 바뀌지 않으며, 같은 파일의 Stability Testing Protocol(제목 `:256`, 본문 `:258`)이 정한 축소 기준도 그대로입니다.
2641
+ - CHANGELOG 원문: "Improved the `claude -p` invalid-settings warning: a file that did not load lists only what stopped it, and long lists are capped per file"
2642
+ (304) `claude -p`의 잘못된 settings 경고가 개선되어, 로드되지 않은 파일은 로드를 막은 원인만 나열하고 긴 목록은 파일별로 상한을 둡니다. 이 저장소의 `playwright-compress` 훅은 훅 안에서 `claude -p`를 호출하지만 stderr를 `2>/dev/null`로 버리므로(`.claude/hooks/scripts/playwright-compress.sh:54`) 이 경고의 형식 변경은 그 훅의 출력에 닿지 않습니다. R010이 기록한 project/local `defaultMode: "bypassPermissions"` 무시 WARN(`.claude/rules/MUST-orchestrator-coordination.md:625`, `--debug-file` 실측, DETAIL 주석 안)이 이 경고와 같은 출력인지는 관측하지 않았습니다 [가설 — `claude -p`로 무시 WARN을 재현해 stderr와 debug 파일의 형식을 대조하면 판정].
2643
+
2644
+ ### 컨텍스트 · compaction · 도구 검색
2645
+
2646
+ - CHANGELOG 원문: "Fixed a "Context limit reached" or "Prompt is too long" error after stopping a turn while Claude Code was compacting a conversation the API had rejected as too long"
2647
+ (304) API가 너무 길다고 거부한 대화를 Claude Code가 compaction하는 도중 턴을 중지하면 "Context limit reached" 또는 "Prompt is too long" 오류가 나던 결함이 수정되었습니다. R013은 같은 "Prompt is too long" 계열 수정을 v2.1.269/273·v2.1.274 노트로 기록하고 있으며(`.claude/rules/SHOULD-ecomode.md:99`, `:101`), 이번 수정은 그중 턴 중지 경로를 다룹니다. 무인 `/fsd` 실행은 사람이 턴을 중지하지 않으므로 이 경로의 대상이 아니라고 봅니다 [가설 — 무인 실행 중 compaction 도중의 인터럽트 발생 기록으로 판정].
2648
+ - CHANGELOG 원문: "Fixed `CLAUDE_CODE_AUTO_COMPACT_WINDOW=200k` silently setting a 100K window: the variable now accepts `k` and `M` suffixes like `--autocompact`, and warns when a value is out of range or ignored"
2649
+ (304) `CLAUDE_CODE_AUTO_COMPACT_WINDOW=200k`가 조용히 100K 창을 설정하던 결함이 수정되어, 이제 이 변수가 `--autocompact`처럼 `k`·`M` 접미사를 받고 범위를 벗어나거나 무시되는 값에는 경고합니다. 관측한 범위에서 이 저장소에는 이 변수와 `--autocompact` 사용이 보이지 않습니다(`git grep -n -E 'CLAUDE_CODE_AUTO_COMPACT_WINDOW|--autocompact' -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'` rc=1). R013의 백분율 임계값은 창 크기에 따라 절대 토큰량이 달라지므로(`.claude/rules/SHOULD-ecomode.md:91`), 사용자 환경에서 이 변수에 접미사 값을 넣었다면 수정 전 버전의 실효 창은 원문 예시처럼 의도와 달랐을 수 있습니다 [가설 — 사용자 환경의 변수 값은 미관측].
2650
+ - CHANGELOG 원문: "Changed tool search to be on by default behind a custom `ANTHROPIC_BASE_URL`; a 400 or 422 from the gateway is retried without it"
2651
+ (304) custom `ANTHROPIC_BASE_URL` 뒤에서도 도구 검색이 기본으로 켜지고, 게이트웨이가 400 또는 422를 돌려주면 도구 검색 없이 재시도합니다. 이 저장소의 두 settings에는 `ANTHROPIC_BASE_URL` 설정이 보이지 않습니다(`git grep -n 'ANTHROPIC_BASE_URL' -- .claude/settings.json templates/.claude/settings.json .claude/hooks` rc=1, 두 파일의 `jq -c '.env // {} | keys'` = `[]`). 관측한 범위(`git grep -n 'ANTHROPIC_BASE_URL' -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'`)에서 그 밖의 참조는 룰 버전 노트 서술 네 곳(`.claude/rules/MUST-orchestrator-coordination.md:663`, `:665`, `.claude/rules/MUST-safety.md:55`, `.claude/rules/MAY-optimization.md:120` — 네 곳 모두 HTML 주석 안)과 그 `templates/` 미러, 그리고 `wiki/rules/r005.md:74`·`:129`의 요약입니다. 2.1.305는 도구 검색과 관련된 2.1.304 회귀를 수정했으나 원문은 대상 변경을 특정하지 않으므로, 이 항목과의 연결은 위 Scope-ceiling check에 적은 대로 [가설]입니다. R002 § 각주(`.claude/rules/MUST-permissions.md:20`)는 `ToolSearch`가 실행 환경에 없을 수 있다는 전제를 이미 두고 있습니다.
2652
+
2653
+ ### Bash · 도구 · worktree
2654
+
2655
+ - CHANGELOG 원문: "Fixed Bash and PowerShell deleting a large command's output file when it could not be copied to the session's tool-results folder, unless the disk is full"
2656
+ (304) 큰 명령 출력 파일을 세션의 tool-results 폴더로 복사하지 못했을 때 Bash·PowerShell이 그 출력 파일을 삭제하던 결함이 수정되었습니다(디스크가 가득 찬 경우는 제외). R013의 v2.1.261 노트는 command 출력이 인라인 상한을 넘으면 파일로 저장된다는 전제에서 `bashOutputMaxChars`를 기본값으로 올리지 않고 독립적인 exit-code 조회를 우선하도록 안내합니다(`.claude/rules/SHOULD-ecomode.md:97`). 수정 전 버전에서는 파일로 넘어간 큰 출력이 복사 실패 시 사라질 수 있었으므로, 같은 줄의 exit-code 우선 지침은 그 경우에도 판정 근거를 남깁니다.
2657
+ - CHANGELOG 원문: "Fixed `rm -r` of a mounted drive or a folder at its top level (`/Volumes`, `/media`, WSL's `/mnt/c`) not getting the safety prompt that `rm -rf /Applications` gets"
2658
+ (304) 마운트된 드라이브나 그 최상위 폴더(`/Volumes`, `/media`, WSL의 `/mnt/c`)에 대한 `rm -r`이 `rm -rf /Applications`가 받는 안전 프롬프트를 받지 못하던 결함이 수정되었습니다. R001은 광범위 삭제를 금지 작업으로 둡니다(`.claude/rules/MUST-safety.md:11`). 이 플랫폼 프롬프트는 R001의 v2.1.261 노트(`.claude/rules/MUST-safety.md:59`, DETAIL 주석 안)가 서술한 위험 `rm` 프롬프트와 같은 defense-in-depth 성격이며, R001의 사전 확인·승인 의무를 대체하지 않습니다.
2659
+ - CHANGELOG 원문: "Fixed `claude --worktree` removing the worktree and its branch without asking at exit when HEAD was detached or on another branch, which could lose commits"
2660
+ (304) HEAD가 detached이거나 다른 브랜치에 있을 때 `claude --worktree`가 종료 시 묻지 않고 worktree와 그 브랜치를 제거해 커밋을 잃을 수 있던 결함이 수정되었습니다. 관측한 범위에서 이 저장소의 `.claude/`와 `CLAUDE.md`에는 `claude --worktree` 호출이 보이지 않습니다(`git grep -n -F 'claude --worktree' -- .claude CLAUDE.md` rc=1). 더 넓은 검색 `git grep -n -E 'isolation: *"?worktree|--worktree|EnterWorktree' -- .claude CLAUDE.md`에서 `--worktree`에 걸리는 줄은 `.claude/hooks/scripts/destructive-git-guard.sh:34`이며, 이 줄의 `--worktree`는 `git restore`의 플래그를 가리는 가드 패턴입니다. 같은 검색에서 worktree를 만드는 스킬 경로는 `omcustom-auto-improve`의 `EnterWorktree` 사용입니다(`.claude/skills/omcustom-auto-improve/SKILL.md:59`). `EnterWorktree` 경로가 같은 종료 처리를 거치는지는 관측하지 않았습니다 [가설 — `EnterWorktree`로 만든 worktree에서 브랜치를 바꾼 뒤 종료해 브랜치가 남는지로 판정]. 이 결함은 R001의 미병합 브랜치 삭제 승인 의무(「Destructive Git Commands」, 제목 `.claude/rules/MUST-safety.md:14`)와 같은 위험 부류입니다.
2661
+ - CHANGELOG 원문: "Fixed `claude --help` text for `--tools`, `--resume`, `--debug`, `--json-schema`, `--disable-slash-commands`, `--system-prompt-snapshot` and `claude update` to match actual behavior"
2662
+ (304) `--tools`·`--resume`·`--debug` 등의 `claude --help` 설명이 실제 동작에 맞게 고쳐졌습니다. R010은 `--dangerously-skip-permissions`의 의미를 CC 2.1.289의 `claude --help` 출력으로 인용하는데(`.claude/rules/MUST-orchestrator-coordination.md:588`), 이 플래그는 원문의 정정 목록에 들어 있지 않습니다. R002 ‡ 각주의 `--tools` 근거는 help 텍스트가 아니라 CHANGELOG 2.1.162 문장입니다(`.claude/rules/MUST-permissions.md:18`). 따라서 두 인용의 근거는 이번 정정으로 바뀌지 않습니다.
2663
+ - CHANGELOG 원문: "Removed the notes from `claude plugin validate` that predicted where a mod's hooks would run"
2664
+ (304) `claude plugin validate`가 mod 훅이 실행될 위치를 예측해 보여 주던 안내가 제거되었습니다. R017은 스킬 추가·수정 후 `claude plugin validate`를 개수 대조와 함께 실행하도록 안내합니다(`.claude/rules/MUST-sync-verification.md:533`). 제거된 것은 mod 훅에 관한 안내이며, 관측한 범위에서 저장소에는 mod 디렉토리가 보이지 않습니다(`git ls-files | grep -i -E '(^|/)mods?/'` 0줄). 따라서 R017 검증 출력의 개수 대조에는 영향이 없다고 봅니다 [가설 — mod의 배치 위치 규약은 확인하지 않았으며, 2.1.303과 2.1.304의 검증 출력을 비교하면 판정].
2665
+
2666
+ 기타 55건 — 이 저장소 비해당으로 판단한 항목입니다: mods·plugin API(`tool.check`의 `decider: "person"`·`e.isReadOnly`, `settings.read` 계층, mod 재로드·버튼·공유, 먼저 실행된 플러그인이 mod 훅을 건너뛸 때의 transcript 줄), `/auto-mode-setup`, `/claude-api` 스킬 갱신, Pro·Max 재개 사용량 경고, 조직 정책 갱신·Consumer Terms·`/privacy-settings`, Linux sandbox `denyRead` glob, `CLAUDE_CODE_TRANSCRIPT_LOCAL_GC`, Cowork·Remote Control·Claude Desktop 전용 항목, SDK·desktop 세션의 context usage 확인 대기, LLM gateway `context_management` 오류, server-managed settings로 전달된 OpenTelemetry 설정, Write 결과의 경로 표시, 이미지 이름의 idle pipe를 기다리는 Read의 인터럽트, `/effort` 표시, 다중 선택 질문 메모 절단·transcript `{`/`}`·agents view Ctrl+C·compaction 요약의 도구 이름 표시 같은 터미널 UI, `/usage`·`/artifacts`·`/fast` 표시, auto mode 세션 파일 크기, SDK·headless의 큰 compacted 세션 재개 속도, 긴 대화의 메모리 사용, 나머지 VSCode 항목과 Self-hosted runner·Windows·Cloud sessions·Claude Tag·Code Review 항목. 기능어 표본 검색(`git grep -n -i -o -E 'auto-mode-setup|managed-agents|TRANSCRIPT_LOCAL_GC|remote.control|denyRead|privacy-settings|context_management|OTEL_|OpenTelemetry|Cowork|tool\.check|settings\.read|reload-skills|/effort|/usage|/artifacts|/fast([^a-z]|$)|isReadOnly|cleanupPeriodDays|self-hosted' -- .claude CLAUDE.md .github package.json`)의 히트 파일은 `.claude/rules/` 아래 11개와, 룰 밖의 다섯 파일입니다. 룰 밖 히트 가운데 OpenTelemetry는 `monitoring-setup` 스킬과 그 메타데이터(`.claude/ontology/skills.yaml`, `.claude/skills/intent-detection/patterns/agent-triggers.yaml`)입니다. 그 스킬은 2.1.282 미만에서는 `.claude/settings.local.json`(`.claude/skills/monitoring-setup/SKILL.md:34`), 2.1.282 이상에서는 user-scope `~/.claude/settings.json`과 셸 export(`:73`, `:74`)를 안내하며, 2.1.282부터 project·local 설정에 적힌 OpenTelemetry 변수가 무시된다고 적습니다(`:24`의 마스터 스위치·endpoint·내용 캡처 변수, `:60`). 따라서 그 스킬이 안내하는 경로들은 이 항목의 대상인 server-managed settings 경로와 다릅니다. 나머지 두 파일은 부분 문자열 일치입니다(`.claude/skills/research/SKILL.md:292`, `:294`의 "risks/efforts"·"risk/effort", `CLAUDE.md:245`의 cc-token-saver `/usage-view`). 룰 파일 11개의 히트는 문맥별로 판정하지 않았고, 기능어가 없는 성능·표시 항목도 검색으로 판정하지 않았습니다 [가설 — 항목별 저장소 측정은 위 본문 항목에 한해 실행했습니다]. 실측: `gh release view v2.1.304 --repo anthropics/claude-code --json body --jq .body | grep -c '^- '` = 76건 중 위 본문 21건을 다뤘으므로 76 − 21 = 55건입니다. 계수 범위는 해당 릴리즈 노트의 최상위 불릿 줄(`- `로 시작하는 줄)입니다.
2667
+
2668
+ **Action items**:
2669
+ - 관측한 범위에서 행동 변화를 위해 룰·CLAUDE.md·에이전트·훅을 바꿔야 한다고 확정한 항목은 없습니다(R016: CC 지식은 이 가이드에 두고 룰 파일에는 행동 변화가 필요할 때만 1줄). 위 compaction 항목에 적은 R013의 "115개"와 디렉토리 계수 114개의 차이는 카운트 동기화 사안(R017 「Count Sync」)이며 이 절의 반영 범위에 넣지 않습니다. 위 `[가설 — …]` 표기는 판정 기준을 충족하는 측정이 이루어지기 전에는 결론으로 쓰지 않습니다.
2670
+
2671
+ ---
2672
+
2673
+ ## v2.1.305 (2026-10-20)
2674
+
2675
+ > Issue: #1868 — Claude Code v2.1.305 compatibility documentation
2676
+ > Scope-ceiling check (R017): 조사 시점(2026-10-25)의 최신 릴리즈는 2.1.310입니다(`claude --version`=2.1.310, `npm view @anthropic-ai/claude-code version`=2.1.310). 2.1.306~2.1.310의 CHANGELOG 절을 각각 잘라 "2.1.305"와 "Revert"를 검색했습니다. "Revert"는 다섯 절 모두에서 0건이었고, "2.1.305"는 2.1.307 절의 한 문장에서 나타났습니다. 그 문장은 "Changed the `axScreenReader` setting and `CLAUDE_AX_SCREEN_READER` in a settings `env` block to apply only from user, managed or `--settings` settings (since 2.1.305)"이며, 스크린 리더 설정의 적용 범위를 좁히는 내용이라 아래 본문 항목을 되돌리거나 좁히지 않습니다. 이 저장소의 두 settings에는 `env` 키가 없습니다(`jq -c '.env // {} | keys'` = `[]`, `.claude/settings.json`·`templates/.claude/settings.json`). 릴리즈 게시 시각은 2026-10-20T20:46:50Z입니다(`gh release view v2.1.305 -R anthropics/claude-code --json publishedAt`). 릴리즈 노트의 최상위 불릿 38줄은 CHANGELOG 2.1.305 절의 최상위 불릿 38줄과 순서까지 같습니다(python3 목록 비교 결과 identical).
2677
+
2678
+ ### 도구 검색 · 설정 · MCP · 시작 경고
2679
+
2680
+ - CHANGELOG 원문: "Fixed every request failing on Vertex, Bedrock and other providers when the endpoint or a gateway rejects tool search, and behind gateways with ToolSearch disallowed or left out of `--tools` (a 2.1.304 regression): Claude Code now retries without it"
2681
+ (305) 2.1.304의 회귀로, 엔드포인트나 게이트웨이가 도구 검색을 거부하는 Vertex·Bedrock 등 provider에서, 그리고 `ToolSearch`를 금지하거나 `--tools`에서 뺀 게이트웨이 뒤에서 모든 요청이 실패하던 결함이 수정되었고, 이제 도구 검색 없이 재시도합니다. 원문은 회귀를 일으킨 2.1.304 변경을 특정하지 않습니다. 이 저장소의 두 settings에는 provider나 게이트웨이를 고르는 `env` 설정이 보이지 않으며(위 `jq` 결과 `[]`), `.claude/settings.json`의 permission `deny` 규칙도 0개입니다(`jq -c '.permissions.deny // [] | length' .claude/settings.json` = 0). 사용자 환경이 2.1.304에서 이 조건에 해당했는지는 관측하지 않았습니다.
2682
+ - CHANGELOG 원문: "Fixed `/effort` and `/autocompact` settings not applying when the model name differed from a `modelOverrides` value by letter case or a `[1m]` tag"
2683
+ (305) 모델 이름이 `modelOverrides` 값과 대소문자나 `[1m]` 태그에서 다를 때 `/effort`·`/autocompact` 설정이 적용되지 않던 결함이 수정되었습니다. 이 저장소의 두 settings에는 `modelOverrides`가 보이지 않습니다(`git grep -n modelOverrides -- .claude/settings.json templates/.claude/settings.json` rc=1). R006은 `[1m]` 접미사를 1M 컨텍스트 표기로 안내하므로(`.claude/rules/MUST-agent-design.md:62`), `modelOverrides`를 쓰는 사용자 환경에서는 이 표기 차이가 결함 조건이었을 수 있습니다 [가설 — 사용자 환경의 `modelOverrides` 값은 미관측].
2684
+ - CHANGELOG 원문: "Improved MCP consent dialogs so an Enter meant for the prompt is less likely to be taken as Accept"
2685
+ (305) 프롬프트에 입력하려던 Enter가 MCP 동의 대화상자의 Accept로 받아들여질 가능성이 줄었습니다. 이 저장소는 `.mcp.json`에 프로젝트 MCP 서버 2개를 두며(`jq -c '.mcpServers | keys' .mcp.json` = `["eraser","ontology-rag"]`), `.claude/settings.json`에서 `enableAllProjectMcpServers: true`와 `enabledMcpjsonServers: ["ontology-rag"]`를 설정합니다(`jq -c '{enableAllProjectMcpServers, enabledMcpjsonServers}' .claude/settings.json`). 이 설정이 적용되는 환경에서는 프로젝트 MCP 서버의 동의 대화상자가 뜨지 않는다고 봅니다 [가설 — 프로젝트 settings의 이 두 키가 현재 CC에서 적용되는지는 미관측이며, 새 클론에서 대화형 세션을 시작해 동의 대화상자 표시 여부로 판정].
2686
+ - CHANGELOG 원문: "Fixed startup warnings printing as raw text above the logo: they now go to the debug log, and permission rules that restrict nothing show as warning rows under the banner"
2687
+ (305) 시작 경고가 로고 위에 원문 텍스트로 찍히던 문제가 수정되어 이제 debug log로 가고, 아무것도 제한하지 않는 permission 규칙은 배너 아래 경고 행으로 표시됩니다. R010이 기록한 project/local `defaultMode: "bypassPermissions"` 무시 WARN은 `claude -p --debug-file`의 debug 파일에서 관측된 것입니다(`.claude/rules/MUST-orchestrator-coordination.md:625`, DETAIL 주석 안). 그 WARN이 대화형 시작 화면에도 찍혔는지는 관측하지 않았으므로, 이 변경 뒤에도 해당 확인은 debug 파일로 합니다 [가설 — 대화형 시작 화면과 debug log를 함께 보면 판정]. 이 저장소의 `.claude/settings.json` permission은 allow 17개·deny 0개·ask 0개입니다(`jq -c '.permissions | {allowN:(.allow//[]|length), denyN:(.deny//[]|length), askN:(.ask//[]|length)}' .claude/settings.json`). R010에 따르면 2.1.257부터 project/local의 `defaultMode: "bypassPermissions"`는 무시됩니다(`.claude/rules/MUST-orchestrator-coordination.md:588`). 같은 줄의 `claude -p` 실측 규칙에 따르면, 이 저장소처럼 project에 그 값이 있으면(`jq -r '.permissions.defaultMode' .claude/settings.json` = bypassPermissions) 그 범위는 `default`로 귀결되어 user 값이 `bypassPermissions`가 아닌 한 `default`가 되고, user가 `bypassPermissions`이면 `bypassPermissions`로 남습니다. local 범위의 다른 값(같은 줄의 실측은 `default`, `acceptEdits`이며 `auto`는 무시, `plan`·`dontAsk`는 미측정)은 여전히 적용되어 project·user 값보다 우선하며, managed 설정과 실행 플래그도 원천입니다. 따라서 유효 모드는 기기마다 다르며, 대화형 세션의 결과는 R010이 `-p` 결과와 조정하지 않은 `[가설]`로 둡니다. 이 allow 규칙이 "restrict nothing" 경고 행으로 표시되는지는 관측하지 않았습니다 [가설 — 유효 모드를 기록한 대화형 세션의 시작 배너 경고 행으로 판정].
2688
+
2689
+ ### 서브에이전트 · 팀원 · worktree · Workflow
2690
+
2691
+ - CHANGELOG 원문: "Fixed new worktrees in a bare repository sometimes starting from local HEAD instead of the default branch, and unchanged subagent worktrees sometimes not being cleaned up"
2692
+ (305) bare 저장소의 새 worktree가 기본 브랜치 대신 로컬 HEAD에서 때때로 시작하던 결함과, 바뀌지 않은 서브에이전트 worktree가 때때로 정리되지 않던 결함이 수정되었습니다. 이 저장소는 bare 저장소가 아닙니다(`git rev-parse --is-bare-repository` = false). 관측한 범위에서 frontmatter로 worktree 격리하는 에이전트는 보이지 않으며(`git grep -n -E '^isolation:' -- '.claude/agents/*.md'` 결과는 `.claude/agents/sec-codeql-expert.md:8`의 `sandbox` 한 건), 작성 기기의 작업 트리에서 조사 시점에 관측한 `git worktree list`는 1줄(메인 작업 트리)이었으며, 이 값은 체크아웃마다 다른 로컬 상태입니다. 서브에이전트 worktree 정리 결함은 호출 단위 `isolation: "worktree"` 위임에서 관련된다고 봅니다 [가설 — 호출 단위 worktree 위임 뒤 `git worktree list`의 잔존 줄로 판정].
2693
+ - CHANGELOG 원문: "Fixed Claude naming the wrong model for a subagent's work after the subagent switched to a fallback model"
2694
+ (305) 서브에이전트가 fallback 모델로 바뀐 뒤 Claude가 그 서브에이전트 작업의 모델을 잘못 말하던 결함이 수정되었습니다. R009는 병렬 스폰 표시에 `[N] {subagent_type}:{model}` 형식을 쓰고(`.claude/rules/MUST-parallel-execution.md:290`), R006의 v2.1.247 버전 노트(`.claude/rules/MUST-agent-design.md:81`, HTML 주석 안)는 서브에이전트가 첫 호출의 model 404에서 세션의 fallback model chain을 쓴다고 기록합니다. 스폰 표시의 모델은 요청한 모델이며, 수정 전 버전에서는 fallback 전환 뒤 Claude가 서술한 실행 모델이 틀렸을 수 있습니다 [가설 — 서브에이전트 트랜스크립트의 `message.model` 값과 Claude의 서술을 대조하면 판정].
2695
+ - CHANGELOG 원문: "Fixed cloud sessions and teammates not telling Claude when a compaction had to leave the oldest messages out of its summary to fit"
2696
+ (305) compaction이 요약 크기에 맞추려고 가장 오래된 메시지를 요약에서 빼야 했을 때 cloud 세션과 팀원이 이를 Claude에 알리지 않던 결함이 수정되었습니다. 이 환경에서 팀원은 이름 붙인 `Agent` 스폰으로 생깁니다(`.claude/rules/MUST-agent-teams.md:22`). 수정 전 버전에서는 오래 실행된 팀원 세션의 Claude가, compaction이 초기 위임 지시를 포함할 수 있는 가장 오래된 메시지를 요약에서 뺀 사실을 통보받지 못했을 수 있습니다 [가설 — 팀원 compaction에서 메시지 누락이 실제로 일어났는지는 미관측]. R018의 결정론적 완료 검증 원칙(「Member Completion Verification」, 제목 `.claude/rules/MUST-agent-teams.md:501`)은 그대로입니다.
2697
+ - CHANGELOG 원문: "Fixed Workflow resume re-running already-completed `pipeline()` and `parallel()` agents instead of serving them from the run's journal"
2698
+ (305) Workflow resume이 이미 완료된 `pipeline()`·`parallel()` agent를 실행 journal에서 제공하지 않고 다시 실행하던 결함이 수정되었습니다. R009의 v2.1.269/271 버전 노트(`.claude/rules/MUST-parallel-execution.md:206`, HTML 주석 안)는 Workflow 스크립트 내부의 `parallel()`/`pipeline()` fan-out을 `CLAUDE_CODE_WORKFLOW_MAX_CONCURRENT_AGENTS`가 규율한다고 적습니다. 관측한 범위에서 `.claude/skills`에는 `pipeline(`·`parallel(` 호출이 보이지 않으므로(`git grep -n -E '(^|[^[:alnum:]_])(pipeline|parallel)\(' -- .claude/skills` rc=1) 스킬이 배포하는 Workflow 스크립트 경로의 영향은 관측되지 않았습니다. 사용자가 작성한 Workflow 스크립트를 수정 전 버전에서 resume했다면 완료된 agent가 다시 실행되어 비용과 부수효과가 중복되었을 수 있습니다 [가설 — 해당 Workflow의 resume 기록으로 판정].
2699
+
2700
+ ### 무인 실행 · Bash
2701
+
2702
+ - CHANGELOG 원문: "Added `CLAUDE_CODE_RETRY_WATCHDOG_USAGE_LIMIT_RECHECK_MS` so unattended retry mode (`CLAUDE_CODE_RETRY_WATCHDOG`) notices a usage limit that was lifted before its reset"
2703
+ (305) 무인 재시도 모드(`CLAUDE_CODE_RETRY_WATCHDOG`)가 리셋 전에 해제된 사용량 한도를 알아차리도록 `CLAUDE_CODE_RETRY_WATCHDOG_USAGE_LIMIT_RECHECK_MS`가 추가되었습니다. 관측한 범위에서 이 저장소의 settings와 스킬은 `CLAUDE_CODE_RETRY_WATCHDOG`를 설정하지 않습니다(`git grep -n -E 'CLAUDE_CODE_RETRY_WATCHDOG' -- .claude/skills .claude/settings.json templates/.claude/settings.json` rc=1). 관측한 범위(`git grep -n 'RETRY_WATCHDOG' -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'`)에서 그 밖의 참조는 R018 v2.1.260 버전 노트 서술(`.claude/rules/MUST-agent-teams.md:549`, HTML 주석 안)과 그 `templates/` 미러, 그리고 `wiki/rules/r018.md:161`의 영어 요약입니다. 무인 `/fsd`를 이 재시도 모드로 실행하는 사용자 환경에서 관련된다고 봅니다 [가설 — 사용자 환경의 환경 변수 설정은 미관측].
2704
+ - CHANGELOG 원문: "Fixed Bash commands on a full disk failing with a raw `ENOSPC` file path: the error now says the disk is full and that nothing ran"
2705
+ (305) 디스크가 가득 찬 상태의 Bash 명령이 원시 `ENOSPC` 파일 경로로 실패하던 문제가 수정되어, 이제 디스크가 가득 찼고 아무것도 실행되지 않았다고 알립니다. R020 「Failure/Interrupt Report ≠ Actual Failure」(제목 `.claude/rules/MUST-completion-verification.md:524`)는 도구의 실패·중단 보고도 ground-truth로 확인하도록 요구합니다. 원문에 따르면 이 오류에서는 명령이 실행되지 않았으므로, 이 메시지를 받은 경우 그 명령의 부분 산출물보다 디스크 여유 공간을 먼저 확인합니다. 실행 도중 디스크가 차서 끊긴 명령은 별개 경우이며, 2.1.309 CHANGELOG의 "a Bash command cut off by a full disk now says so and names the folder to free up" 문장이 다룹니다. 그 경우에는 명령이 부분 실행되었으므로 부분 산출물이 확인 대상입니다.
2706
+
2707
+ 기타 28건 — 이 저장소 비해당으로 판단한 항목입니다: Linux `sandbox.allowNestedUserNamespaces`, cloud session·SDK `setMcpServers`의 MCP 서버 교체, 예약된 Cowork cloud 세션의 WebFetch 승인 대기, Remote Control `/resume` 항목·spawn-mode 안내, `/usage`·스크린 리더·`/artifacts` 같은 터미널 UI, mod `Image`·docked pane, managed `allowedMcpServers`의 `managed-mcp.json` 필터, Claude Desktop이 경로로 마운트한 플러그인의 `allowManagedPermissionRulesOnly` 처리, Self-hosted runner·VSCode·Cloud sessions·Claude Tag·Code Review 항목. 기능어 표본 검색(`git grep -n -i -o -E 'allowNestedUserNamespaces|setMcpServers|allowedMcpServers|deniedMcpServers|managed-mcp|allowManagedPermissionRulesOnly|spinnerVerbs|axScreenReader|screen reader|iTerm|docked pane|Cowork|remote.control|/usage|/artifacts|self-hosted|alwaysLoad' -- .claude CLAUDE.md .github package.json`)의 히트 파일은 `.claude/rules/` 아래 9개와 `CLAUDE.md` 하나이며, `CLAUDE.md:245`의 히트는 cc-token-saver `/usage-view`의 부분 문자열 일치입니다. 룰 파일 9개의 히트는 문맥별로 판정하지 않았고, 기능어가 없는 표시 항목도 검색으로 판정하지 않았습니다 [가설 — 항목별 저장소 측정은 위 본문 항목에 한해 실행했습니다]. 실측: `gh release view v2.1.305 --repo anthropics/claude-code --json body --jq .body | grep -c '^- '` = 38건 중 위 본문 10건을 다뤘으므로 38 − 10 = 28건입니다. 계수 범위는 해당 릴리즈 노트의 최상위 불릿 줄(`- `로 시작하는 줄)입니다.
2708
+
2709
+ **Action items**:
2710
+ - 관측한 범위에서 행동 변화를 위해 룰·CLAUDE.md·에이전트·훅을 바꿔야 한다고 확정한 항목은 없습니다(R016: CC 지식은 이 가이드에 두고 룰 파일에는 행동 변화가 필요할 때만 1줄). 위 `[가설 — …]` 표기는 판정 기준을 충족하는 측정이 이루어지기 전에는 결론으로 쓰지 않습니다.
2711
+
2712
+ ---
2713
+
2714
+ ## v2.1.306 (2026-10-21)
2715
+
2716
+ > Issue: #1867 — Claude Code v2.1.306 compatibility documentation
2717
+ > Scope-ceiling check (R017): 조사 시점(2026-10-25)의 최신 릴리즈는 2.1.310입니다(`claude --version`=2.1.310, `npm view @anthropic-ai/claude-code version`=2.1.310). 2.1.307·2.1.308·2.1.309·2.1.310 CHANGELOG 절을 각각 잘라 `2.1.306` 문자열과 "Revert"를 검색한 결과 네 절 모두 두 문자열이 0건이었으므로(`for v in 2.1.307 2.1.308 2.1.309 2.1.310; do awk -v v="$v" '/^## /{p=($2==v)} p' CHANGELOG.md | grep -c -F -e 2.1.306; awk -v v="$v" '/^## /{p=($2==v)} p' CHANGELOG.md | grep -c -i revert; done` 출력 0 여덟 줄), 이 릴리즈의 두 항목을 되돌리거나 좁히는 문장은 관측되지 않았습니다. 같은 compaction 영역의 후속 항목은 `for v in 2.1.307 2.1.308 2.1.309 2.1.310; do awk -v v="$v" '/^## /{p=($2==v)} p' CHANGELOG.md | grep -n -i compact; done` 검색에서 여섯 줄이 걸렸습니다(절 머리 줄을 1행으로 센 번호): 307:11("Autocompact is thrashing" 오류 일부, PDF 페이지·이미지·큰 도구 결과를 많이 읽는 턴), 307:12(cloud 세션 재시작 뒤 `/autocompact` 창), 309:14(매우 큰 중첩 CLAUDE.md 아래 파일을 읽은 뒤 반복 compaction), 309:38(compaction이 일어난 턴의 남은 artifact 업데이트마다 권한을 묻던 결함), 310:11(비대화형 세션(`-p`, Agent SDK)에서 트랜스크립트 파일이 매우 클 때 compaction 중 메모리 사용), 그리고 310:6 "Fixed compaction after a "Prompt is too long" error keeping too much of a conversation with dense text, such as base64 or SVG, so the next request could fail again"입니다. 여섯 줄 모두 롤백이 아니며 아래 MCP 세션 오류 보고 항목과 조건이 다른 별개 수정입니다. 릴리즈 게시 시각은 2026-10-21T03:16:31Z입니다(`gh release view v2.1.306 -R anthropics/claude-code --json publishedAt`).
2718
+
2719
+ ### MCP · compaction 오류 보고
2720
+
2721
+ - CHANGELOG 원문: "Fixed an API error being replaced by "prompt is too long", and an unneeded compaction, in sessions with many MCP tools"
2722
+ (306) MCP 도구가 많은 세션에서 API 오류가 "prompt is too long"으로 바뀌어 보고되던 결함과 불필요한 compaction이 일어나던 결함이 함께 수정되었습니다. 원문의 인과 방향은 실제 API 오류가 "prompt is too long"으로 대체된 것이므로, 306 이전 MCP 도구가 많은 세션에서 본 "prompt is too long" 보고는 컨텍스트 초과의 증거가 아니었을 수 있고, 같은 조건의 세션에서 일어난 compaction도 필요해서 일어난 것이 아니었을 수 있습니다. R013은 다른 조건의 "Prompt is too long" 결함 수정을 기록하고 있습니다. (269) 노트는 auto-compaction이 요약할 완전한 이전 대화 교환이 없을 때(주로 매우 큰 프롬프트를 쓰는 SDK 세션)의 경우이고(`.claude/rules/SHOULD-ecomode.md:99`, 보이는 텍스트), (274) 노트는 훅 주도 세션(활성 `/goal` 등)에서 컨텍스트가 다시 넘칠 때의 경우입니다(`.claude/rules/SHOULD-ecomode.md:101`, 보이는 텍스트). 이 저장소의 `.mcp.json`은 서버 2개(`ontology-rag` stdio, `eraser` http)를 정의합니다(`git show HEAD:.mcp.json`). user 범위 설정이나 claude.ai 커넥터가 더하는 MCP 도구는 저장소 사실이 아니므로 세지 않았고, 원문이 "many"의 기준 수치를 밝히지 않으므로 이 저장소를 쓰는 세션이 결함 조건에 해당했는지는 [가설 — 306 이전 트랜스크립트에서 MCP 도구가 많은 세션의 "prompt is too long" 사례와 실제 컨텍스트 크기를 대조하면 판정 가능]입니다. 이 재해석은 실패·중단 보고도 ground-truth를 확인하기 전에는 실패로 단정하지 않는다는 R020 「Failure/Interrupt Report ≠ Actual Failure」 본문(`.claude/rules/MUST-completion-verification.md:526`, 보이는 텍스트)과 같은 계열의 진단 함의입니다. R013 임계값은 창 대비 백분율이므로(`.claude/rules/SHOULD-ecomode.md:91`) 이 수정으로 바뀌지 않습니다.
2723
+
2724
+ ### 중첩 `claude -p` 실행
2725
+
2726
+ - CHANGELOG 원문: "Fixed `claude -p` inside cloud sessions reporting "Not logged in" when started without the session's environment variables"
2727
+ (306) cloud 세션 안에서 세션의 환경 변수 없이 시작된 `claude -p`가 "Not logged in"을 보고하던 결함이 수정되었습니다. 이 저장소 코드에서 `claude -p` 호출은 같은 줄 검색 `git grep -n -P '(\bclaude\b|CLAUDE[A-Z_]*BIN)[^\n]*?\s-p(\s|$|")' HEAD -- '*.sh' '*.bash' '*.ts' '*.js' '*.mjs' '*.cjs' '*.py' '*.yml' '*.yaml' '.husky/*'`와 줄 이음 검색 `git grep -n -P -A1 '(\bclaude\b|CLAUDE[A-Z_]*BIN)[^\n]*\\\s*$' HEAD -- '*.sh' '*.bash' '*.ts' '*.js' '*.mjs' '*.cjs' '*.py' '*.yml' '*.yaml' '.husky/*'`로 관측한 범위에서 네 계열(미러·테스트를 뺀 파일 5개)에 나타납니다. 첫째, 훅 `.claude/hooks/scripts/playwright-compress.sh:54`가 `claude -p --model haiku`로 브라우저 MCP 출력을 요약하며, 이 훅은 `.claude/settings.json:579`에 `mcp__playwright__.*|mcp__claude-in-chrome__.*` matcher(`:582`)로 배선되어 있습니다. 둘째, Web UI 서버 `packages/serve/src/lib/server/claude-cli.ts:40`, `:86`, `:117`, `:174`가 `` `claude -p ${escapeShellArg(prompt)} --no-input` `` 명령 문자열을 조립합니다. 셋째, `agora` 스킬의 `.claude/skills/agora/scripts/reviewers.sh:168`~`:169`와 `.claude/skills/agora/scripts/judge.sh:223`~`:224`가 변수 바이너리 `"$AGORA_CLAUDE_BIN"` 뒤의 이음 줄에서 `-p`를 넘깁니다. 넷째, `infra/hada-scout/scout-runner.sh:109`가 `timeout "${SCOUT_TIMEOUT}" claude -p`를 실행합니다. 같은 줄 검색의 나머지 히트는 `templates/` 아래 미러(`playwright-compress.sh:54`)와 테스트 주석(`tests/unit/core/hooks-scripts.test.ts:2863`)이고, 이음 줄 검색의 나머지 히트는 `templates/` 아래 `agora` 미러(같은 줄 번호)와 다음 줄이 `-p`가 아닌 줄(`.claude/hooks/scripts/adaptive-harness-scan.sh:12`와 그 미러, `.github/workflows/ci.yml:336`~`:337`, `tests/unit/skills/agora-scripts.test.ts:373`의 주석)입니다. 이 검색은 코드 확장자 파일에서 같은 줄과 바로 다음 이음 줄의 형태만 잡으므로 다른 변수명·배열 인자 형태의 호출은 놓칠 수 있으며, 배열 인자 형태 검색(`git grep -n -P "['\"]claude['\"]\s*,\s*\[|['\"]-p['\"]" HEAD -- '*.ts' '*.js' '*.mjs' '*.py' ':!**/*.test.ts'`)은 0건이었습니다. `agora`의 `run_sanitized`는 `AGORA_` 접두 환경 변수만 제거해 자식 프로세스를 띄웁니다(`.claude/skills/agora/scripts/reviewers.sh:49`~`:53`, `:151`). `playwright-compress.sh`는 출력이 3000자 이상일 때만 요약을 시도하고(`:44`~`:48`), `claude -p`가 0이 아닌 코드로 끝나면 원본 입력을 그대로 돌려줍니다(`:54`~`:58`). 다만 "Not logged in" 상태의 `claude -p`가 0으로 끝나며 그 문구를 stdout에 낸다면, 그 문구가 요약으로 쓰여 `:80`~`:81`에서 `tool_response`·`updatedMCPToolOutput`을 대체할 수 있습니다 [가설 — 로그아웃 상태 `claude -p`의 exit code와 stdout으로 판정]. 이 저장소를 cloud 세션에서 실행하는지, 위 자식 프로세스들이 "세션의 환경 변수 없이 시작된" 조건에 해당하는지는 관측하지 않았습니다 [가설 — cloud 세션에서 브라우저 MCP 도구를 호출한 뒤 훅이 요약을 돌려주는지 원본을 돌려주는지 306 전후로 비교하면 판정 가능].
2728
+
2729
+ 기타 0건 — 이 저장소 비해당 항목은 없습니다. 실측: `gh release view v2.1.306 --repo anthropics/claude-code --json body --jq .body | grep -c '^- '` = 2건 중 위 본문 2건을 다뤘으므로 2 − 2 = 0건입니다. 계수 범위는 해당 릴리즈 노트의 최상위 불릿 줄(`- `로 시작하는 줄)입니다.
2730
+
2731
+ **Action items**:
2732
+ - 관측한 범위에서 훅·설정 변경이 필요하다고 확정한 항목은 없습니다. 첫 항목은 진단 해석에 관한 것입니다. 둘째 항목의 `playwright-compress.sh`는 `claude -p`가 0이 아닌 코드로 끝나는 경우 원본을 반환하도록 작성되어 있으나(`.claude/hooks/scripts/playwright-compress.sh:54`~`:58`), 로그아웃 상태에서 0으로 끝나는 경우의 동작은 위 [가설]입니다.
2733
+ - 306 이전 버전에서 MCP 도구가 많은 세션의 "prompt is too long" 보고나 compaction을 진단할 때는 컨텍스트 초과로 단정하기 전에 실제 컨텍스트 크기와 원래 API 오류를 먼저 확인합니다. 룰 변경 제안은 없습니다(R016: CC 지식은 이 가이드에 둡니다).
2734
+ - (306) 항목 중 `[가설 — …]` 표기는 판정 기준을 충족하는 측정이 이루어지기 전에는 결론으로 쓰지 않습니다.
2735
+
2736
+ ---
2737
+
2738
+ ## v2.1.307 (2026-10-21)
2739
+
2740
+ > Issue: #1870 — Claude Code v2.1.307 compatibility documentation
2741
+ > Scope-ceiling check (R017): 조사 시점(2026-10-25)의 최신 릴리즈는 2.1.310입니다(`claude --version`=2.1.310, `npm view @anthropic-ai/claude-code version`=2.1.310). 2.1.308·2.1.309·2.1.310 CHANGELOG 절을 각각 잘라 `2.1.307` 문자열과 "Revert"를 검색한 결과 세 절 모두 두 문자열이 0건이었으므로(`for v in 2.1.308 2.1.309 2.1.310; do awk -v v="$v" '/^## /{p=($2==v)} p' CHANGELOG.md | grep -c -F -e 2.1.307; awk -v v="$v" '/^## /{p=($2==v)} p' CHANGELOG.md | grep -c -i revert; done` 출력 0 여섯 줄), 이 릴리즈 항목을 되돌리거나 좁히는 문장은 관측되지 않았습니다. 아래 본문 항목의 핵심어로 309·310 절을 검색하면(`for v in 2.1.309 2.1.310; do awk -v v="$v" '/^## /{p=($2==v)} p' CHANGELOG.md | grep -n -i -E 'keychain|sleep|idempotent|thrash|compact|safety_event|\[1m\]|recently[- ]denied|unparseable|axScreenReader'; done`) 309 절 14·38행과 310 절 3·6·11행이 걸립니다(절 머리 줄을 1행으로 센 번호). 310:3은 Monitor 도구 항목으로 "sleep" 단어가 일치했을 뿐 MCP 연결 중 절전과는 무관합니다. compaction 히트 가운데 309:14(매우 큰 중첩 CLAUDE.md 아래 파일을 읽은 뒤 세션이 반복 compaction하던 결함, 크기 한도를 넘는 중첩 CLAUDE.md는 이제 앞부분만 로드)가 아래 "Autocompact is thrashing" 항목과 가장 가까운 후속 항목이지만, 원인 조건이 다른 별개 수정이며 307 항목을 되돌리거나 좁히지 않습니다. 309:38(compaction이 일어난 턴의 남은 artifact 업데이트마다 권한을 묻던 결함), 310:6(base64·SVG 같은 밀도 높은 텍스트가 있는 대화에서 "Prompt is too long" 오류 뒤의 compaction, 2.1.306 절에서 인용), 310:11(비대화형 세션(`-p`, Agent SDK)에서 트랜스크립트 파일이 매우 클 때 compaction 중 메모리 사용)도 별개 수정입니다. 릴리즈 게시 시각은 2026-10-21T22:17:02Z입니다(`gh release view v2.1.307 -R anthropics/claude-code --json publishedAt`).
2742
+
2743
+ ### 모델 · 컨텍스트 · compaction
2744
+
2745
+ - CHANGELOG 원문: "Fixed requests failing with a model-not-found error when `CLAUDE_CODE_DISABLE_1M_CONTEXT` is set and the model is an alias with the `[1m]` suffix, such as `opus[1m]`"
2746
+ (307) `CLAUDE_CODE_DISABLE_1M_CONTEXT`가 설정된 상태에서 모델이 `opus[1m]`처럼 `[1m]` 접미사가 붙은 별칭이면 요청이 model-not-found 오류로 실패하던 결함이 수정되었습니다. R013은 이 환경 변수가 native 1M 창 모델을 auto-compaction으로 200K에 유지한다고 기록하고(`.claude/rules/SHOULD-ecomode.md:91`, 보이는 텍스트), R006은 `[1m]` 접미사를 1M 창 활성화 표기로 설명합니다(`.claude/rules/MUST-agent-design.md:62`, 보이는 텍스트). 저장소가 추적하는 파일 범위에서 에이전트 frontmatter의 `model:` 값은 `claude-sonnet-5-5` 42개, `claude-opus-5-5` 5개, `haiku` 3개이고(`git grep -h -E '^model:' HEAD -- '.claude/agents/*.md' | sort | uniq -c`), `[1m]` 표기는 `.claude/agents`·`.claude/settings.json`·`templates/.claude/settings.json`에서 0건이며(`git grep -n -F '[1m]' HEAD -- .claude/agents .claude/settings.json templates/.claude/settings.json` 출력 없음), `CLAUDE_CODE_DISABLE_1M_CONTEXT`는 tracked 설정 두 파일에 없습니다(`git grep -c CLAUDE_CODE_DISABLE_1M_CONTEXT HEAD -- .claude/settings.json templates/.claude/settings.json` rc=1). 검색을 코드·설정 확장자 전체로 넓힌 `git grep -n -F -e '[1m]' -e 'CLAUDE_CODE_DISABLE_1M_CONTEXT' HEAD -- '*.sh' '*.bash' '*.ts' '*.js' '*.mjs' '*.py' '*.yml' '*.yaml' '*.json' '.husky/*'`에서도 환경 변수는 0건이고, `[1m]` 히트는 주석(`.claude/hooks/scripts/audit-log.sh:29`와 그 미러)과 테스트 픽스처(`tests/unit/core/hooks-scripts-shape.test.ts:274`, `:280`, `tests/unit/core/template-validation.test.ts:108`, `:526`)입니다. 따라서 관측한 범위에서 저장소가 추적하는 설정만으로는 이 결함의 두 조건이 함께 만들어지지 않습니다. 다만 이 환경 변수와 모델 별칭은 셸 환경, user 범위 설정, gitignore된 `.claude/settings.local.json`(`git check-ignore -v --no-index .claude/settings.local.json` 결과 `.gitignore:40:.claude/*`)에서도 정해질 수 있으므로, 실제 해당 여부는 기기마다 다릅니다. 유지보수자 기기에서의 관측(2026-10-25, CC 2.1.310)으로는 셸 환경 변수가 설정되지 않았고(`[ -n "${CLAUDE_CODE_DISABLE_1M_CONTEXT+x}" ]` 거짓), user·local 설정 파일의 `CLAUDE_CODE_DISABLE_1M_CONTEXT`·`[1m]` 계수도 0이었습니다(`command grep -c -F -e CLAUDE_CODE_DISABLE_1M_CONTEXT ~/.claude/settings.json .claude/settings.local.json`, `command grep -c -F -e '[1m]' ~/.claude/settings.json .claude/settings.local.json`). R002가 기록한 이 저장소 실행 환경의 `claude-opus-5[1m]`(`.claude/rules/MUST-permissions.md:145`, 보이는 텍스트)은 `claude -p --output-format stream-json` init 이벤트에서 얻은 측정값이며(측정 방법은 `:143`, HTML 주석 안), `opus[1m]` 별칭을 골라 나온 값일 수도 있습니다. 그러나 그 측정 기록에는 `CLAUDE_CODE_DISABLE_1M_CONTEXT` 설정 여부가 적혀 있지 않으므로 이 결함 조건의 증거로 쓰지 않습니다. 수정 뒤 이 조합이 어떤 창 크기로 실행되는지는 원문이 밝히지 않습니다 [가설 — 환경 변수를 켜고 `opus[1m]`으로 시작한 세션의 `/context` 창 크기를 확인하면 판정 가능].
2747
+ - CHANGELOG 원문: "Fixed some "Autocompact is thrashing" errors in turns that read many PDF pages, images or other large tool results"
2748
+ (307) PDF 페이지·이미지·그 밖의 큰 도구 결과를 많이 읽는 턴에서 나던 "Autocompact is thrashing" 오류 일부가 수정되었습니다. 원문이 "some"으로 범위를 한정하므로 이 조건의 턴에서도 이 오류가 모두 해소되었다고 보지 않습니다. 관측한 범위(`git grep -n -i thrashing HEAD -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'` 0건)에서 이 저장소의 룰·스킬·훅은 이 오류 문구를 참조하지 않습니다. R013 컨텍스트 예산 임계값은 창 대비 백분율이므로(`.claude/rules/SHOULD-ecomode.md:91`) 이 수정으로 바뀌지 않습니다.
2749
+
2750
+ ### MCP
2751
+
2752
+ - CHANGELOG 원문: "Fixed MCP servers showing "needs authentication" in `claude -p` on macOS while the login keychain was locked; they now say why, and the next run after an unlock connects without a new sign-in"
2753
+ (307) macOS에서 로그인 키체인이 잠긴 동안 `claude -p`의 MCP 서버가 "needs authentication"으로 표시되던 결함이 수정되어, 이제 MCP 서버가 그 이유를 알려주고, 잠금 해제 뒤의 다음 실행은 새 로그인 없이 연결됩니다. `.mcp.json`의 `eraser`는 `url`과 `type: "http"`만 가진 원격 서버 정의이므로(`git show HEAD:.mcp.json`, `.mcp.json:14`~`:17`), 저장소 설정만으로는 이 서버가 키체인에 자격 증명을 두는 인증을 거치는지 알 수 없습니다. `/fsd` 스킬은 무인(`claude -p`, 예약 실행) 세션에서 `/goal`·`/loop`를 호출하는 경로를 권장하며(`.claude/skills/fsd/SKILL.md:172`), 저장소 코드가 `claude -p`를 직접 띄우는 예로는 `agora` 스킬의 `.claude/skills/agora/scripts/reviewers.sh:168`~`:169`(`"$AGORA_CLAUDE_BIN"` 뒤 이음 줄의 `-p`)가 있습니다. 이런 `claude -p` 실행이 macOS에서 로그인 키체인이 잠긴 동안 이뤄졌고 그때 MCP 서버가 "needs authentication"으로 보였다면, 원인 하나가 키체인 잠금이었을 수 있습니다 [가설 — 키체인이 잠긴 macOS에서 `claude -p`의 MCP 상태 메시지를 306과 307에서 비교하면 판정 가능]. 원문은 잠금 해제 뒤의 다음 실행이 연결된다고 적을 뿐 잠긴 동안 연결된다고 적지 않으므로, 무인 실행의 MCP 의존 단계는 계속 연결 상태를 실측합니다.
2754
+ - CHANGELOG 원문: "Fixed MCP servers being reported as timed out, and staying failed in headless runs, when a macOS or Linux computer went to sleep while they were connecting"
2755
+ (307) MCP 서버가 연결되는 도중 macOS·Linux 컴퓨터가 절전에 들어가면 타임아웃으로 보고되던 결함과, 그때 headless 실행에서는 실패 상태로 남던 결함이 수정되었습니다. R004는 절전·연결 끊김·서버 오류로 mid-stream 절단된 서브에이전트 응답이 자동으로 이어진다는 (257) 노트를 두고 있으며(`.claude/rules/SHOULD-error-handling.md:30`, 보이는 텍스트), 이 수정은 같은 절전 계열이지만 대상이 MCP 연결 단계라는 점이 다릅니다. 307 이전 macOS·Linux에서 MCP 서버가 연결 중 "timed out"으로 보고되었다면 서버 장애가 아니라 연결 중 절전이 원인이었을 수 있고, 그 실행이 headless(`claude -p`)였다면 원문상 실패 상태가 그대로 남는 결과까지 이어졌을 수 있습니다 [가설 — 실패 시각과 시스템 절전 기록(`pmset -g log`)을 대조하면 판정 가능]. 원문이 전송 방식을 한정하지 않으므로 `.mcp.json`의 두 서버(stdio `ontology-rag`, http `eraser`, `git show HEAD:.mcp.json`) 중 어느 쪽이 해당하는지는 구분하지 않습니다.
2756
+ - CHANGELOG 원문: "Fixed HTTP MCP tool calls being sent twice when the connection closed mid-call; only read-only or idempotent tools are now retried"
2757
+ (307) 호출 도중 연결이 닫히면 HTTP MCP 도구 호출이 두 번 전송되던 결함이 수정되어, 이제 읽기 전용이거나 멱등인 도구만 재시도됩니다. `.mcp.json`의 두 서버 중 HTTP 전송은 `eraser`(`.mcp.json:15`~`:16`)이고 `ontology-rag`는 stdio입니다(`.mcp.json:4`, `git show HEAD:.mcp.json`). 어떤 `eraser` 도구가 읽기 전용·멱등으로 분류되는지는 저장소 설정에서 알 수 없습니다. 307 이전에는 호출 도중 연결이 닫힌 경우 멱등이 아닌 도구 호출(예: 생성 계열)도 두 번 전송되어 중복 산출물을 남겼을 수 있습니다 [가설 — 중복 산출물 유무는 확인하지 않음]. 307 이후 멱등이 아닌 도구는 재시도되지 않으므로, 같은 상황에서 그 호출이 원격에 반영됐는지는 원격 상태를 확인한 뒤 재호출 여부를 정하는 것이 안전합니다 [가설 — 재시도하지 않는 경우의 오류 보고 형태는 원문이 밝히지 않음].
2758
+
2759
+ ### 권한 · auto mode · 설정 범위
2760
+
2761
+ - CHANGELOG 원문: "Fixed `/permissions` > Recently denied not showing the denied shell command, and auto mode's local classifier ignoring an approval from there when it checks a retried command; approving a row now names the command, not its description"
2762
+ (307) `/permissions` > Recently denied에 거부된 셸 명령이 표시되지 않던 결함과, auto mode의 로컬 classifier가 재시도된 명령을 검사할 때 그 화면에서 한 승인을 무시하던 결함이 수정되었고, 이제 행을 승인하면 설명이 아니라 명령 자체가 지정됩니다. R015는 "allow 규칙으로는 safety-classifier 차단이 해소되지 않습니다"라고 적고 사용자 직접 실행(`!`)이나 차단 트리거 제거를 안내합니다(`.claude/rules/MUST-intent-transparency.md:138`, 보이는 텍스트). 307 이전에 auto mode에서 "Recently denied에서 승인했는데도 재시도가 다시 막혔다"는 관측이 있었다면 로컬 classifier가 재시도된 명령을 검사하며 그 승인을 무시한 결함이었을 수 있습니다. 원문은 로컬 classifier의 재시도 검사만 언급하므로, 이 화면 승인이 R015가 말하는 safety-classifier 차단까지 해소하는지는 [가설 — Recently denied에서 승인한 명령을 auto mode에서 재시도해 차단 여부를 확인하면 판정 가능]입니다. 관측한 범위(`git grep -n -i -E 'recently[- ]denied|recent denials' HEAD -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'` 8줄)에서 이 화면에 관한 기록은 룰 파일의 경우 모두 HTML 주석 안에 있습니다: R002의 ARCHIVED 주석 두 줄(`.claude/rules/MUST-permissions.md:65`, `:67`, 자동 주입되지 않음), R001의 HTML 주석(`.claude/rules/MUST-safety.md:200`에서 열리는 주석 안의 `:201`, 자동 주입되지 않음), 그리고 이 세 줄의 `templates/` 미러입니다. 나머지 2줄은 위키 사본(`wiki/rules/r002.md:75`, `:77`)입니다. 이 중 R002 `:65`는 v2.1.191부터 Recently-denied 탭이 승인한 거부 항목을 닫을 때 유지한다고 기록하며, 이번 수정은 그 탭에서 한 승인이 auto mode 로컬 classifier의 재시도 검사에서 무시되던 결함을 다룹니다. 저장소가 추적하는 project 설정의 `permissions.defaultMode`는 `bypassPermissions`입니다(`git show HEAD:.claude/settings.json | jq -r '.permissions.defaultMode // "unset"'`). R010은 2.1.257+에서 project 범위의 `bypassPermissions`가 무시되어 그 범위가 `default`로 귀결된다고 `claude -p` 실측으로 기록하고, 대화형 세션의 결과는 `[가설]`로 남깁니다(`.claude/rules/MUST-orchestrator-coordination.md:588`, 보이는 텍스트). 실효 모드는 저장소 밖의 user·managed 범위 설정과 실행 플래그에도 좌우되므로, auto mode에서만 해당하는 두 번째 결함이 이 저장소를 쓰는 세션에 해당하는지는 기기마다 다르며 여기서 단정하지 않습니다.
2763
+ - CHANGELOG 원문: "Changed the `axScreenReader` setting and `CLAUDE_AX_SCREEN_READER` in a settings `env` block to apply only from user, managed or `--settings` settings (since 2.1.305)"
2764
+ (307) `axScreenReader` 설정과 settings `env` 블록의 `CLAUDE_AX_SCREEN_READER`가 user·managed·`--settings` 설정에서만 적용되도록 바뀌었으므로, project(`.claude/settings.json`)·local(`.claude/settings.local.json`) 범위에 적은 값은 적용 대상이 아닙니다. 이 설정은 2.1.208 CHANGELOG 절이 화면 낭독기 모드를 추가하면서 안내한 것이므로(`awk '/^## /{v=$2} /axScreenReader/{print v}' CHANGELOG.md` 결과 2.1.208과 2.1.307 두 절), 원문 괄호의 "(since 2.1.305)"는 도입 시점이 아니며 그 정확한 뜻은 원문만으로 확정하지 않습니다. 저장소가 추적하는 파일에서는 이 키가 쓰이지 않습니다(`git grep -n -i -E 'axScreenReader|AX_SCREEN_READER' HEAD -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'` 0건). gitignore된 `.claude/settings.local.json`과 user 범위 설정은 저장소 사실이 아니므로 이 결론의 근거에 넣지 않았습니다. project·local 범위 값이 무시되거나 그 범위로는 켤 수 없는 설정의 예로는 다음이 있으며, 이 항목이 같은 계열에 더해집니다. R010은 2.1.257+에서 project·local의 `defaultMode: "bypassPermissions"`가 무시되고 `"auto"`도 같은 CHANGELOG에 따라 무시된다고 적으며 `auto`는 미측정 `[가설]`로 둡니다(`.claude/rules/MUST-orchestrator-coordination.md:588`, 보이는 텍스트). `monitoring-setup` 스킬은 2.1.282부터 project·local 설정의 OpenTelemetry 변수 중 export를 켜거나 endpoint를 지정하거나 내용을 캡처하는 변수가 무시된다고 적습니다(`.claude/skills/monitoring-setup/SKILL.md:24`). 2.1.232 CHANGELOG는 `sandbox.ripgrep`을 user·managed·`--settings`에서만 적용하도록 바꿨고, R002는 이를 HTML 주석 안 버전 노트로 기록합니다(`.claude/rules/MUST-permissions.md:99`, `:85`에서 열리는 DETAIL 주석 안, 자동 주입되지 않음). 같은 주석 안의 (2.1.222) 노트는 Remote Control auto-start를 repo-local 설정으로는 켤 수 없고 끄는 것만 가능하다고 적습니다(`.claude/rules/MUST-permissions.md:93`, HTML 주석 안).
2765
+
2766
+ ### 서브에이전트 · 도구 호출 · 백그라운드
2767
+
2768
+ - CHANGELOG 원문: "Improved fork subagents launched together: each is now told which launch is its own, so forks are much less likely to try to start each other's work"
2769
+ (307) 함께 실행된 fork 서브에이전트가 이제 각자 어느 실행이 자기 것인지 전달받으므로, 서로의 작업을 시작하려 할 가능성이 크게 줄었습니다. R010은 「Parallel Delegation — Sibling-Agent Disclosure」 절(제목 `.claude/rules/MUST-orchestrator-coordination.md:493`)의 표에서 병렬 스폰 프롬프트마다 동시 실행 에이전트 수·각자 담당 범위·"자기 담당 범위만 기준으로 보고" 지시를 명시하도록 요구합니다(`.claude/rules/MUST-orchestrator-coordination.md:517`, 보이는 텍스트). 원문의 개선은 함께 실행된 각 fork에게 자기 실행이 어느 것인지 알려주는 것이며 형제의 담당 범위나 보고 범위 지시를 대신한다고 적지 않으므로, R010의 고지 의무는 그대로 둡니다. v2.1.232+에서 `subagent_type: "fork"` 서브에이전트가 전체 대화와 prompt cache를 상속한다는 기록은 R009의 DETAIL 주석 안에 있습니다(`.claude/rules/MUST-parallel-execution.md:197`에서 열리는 `<!-- DETAIL: CC version notes (v2.1.224-v2.1.273) + Fable 5 note` 주석의 `:200`, 자동 주입되지 않음). 관측한 범위(`git grep -n -E 'subagent_type: *"?fork|"fork"' HEAD -- .claude/skills .claude/agents` 출력 없음)에서 스킬·에이전트 정의는 fork 서브에이전트를 지정하지 않으므로, 이 개선은 오케스트레이터가 Agent 도구에서 직접 fork 여러 개를 함께 실행하는 경우에 해당합니다.
2770
+ - CHANGELOG 원문: "Improved recovery from unparseable tool calls: Claude Code now retries the call up to twice before ending the turn with an error"
2771
+ (307) 파싱할 수 없는 도구 호출에서의 복구가 개선되어, 이제 Claude Code가 턴을 오류로 끝내기 전에 그 호출을 최대 두 번 재시도합니다. R018은 멤버 프롬프트가 크거나 여러 도메인에 걸치면 "malformed-parsing truncation" 위험이 있다며 약 5000토큰·단일 도메인 상한을 둡니다(`.claude/rules/MUST-agent-teams.md:583`, 보이는 텍스트). 다만 R018 전체는 Detection이 No이면 휴면이고 R009/R010이 적용됩니다(`.claude/rules/MUST-agent-teams.md:36`, 보이는 텍스트). 이 가이드의 「Known Platform Issues & Workarounds」 절에 있는 「Agent tool malformed parsing on long / special-character prompts (#1241)」 항목은 Agent 도구가 매우 길거나 특수문자가 많은 위임 프롬프트를 간헐적으로 파싱하지 못해 도구 호출을 `malformed`로 보고하는 증상과 그 우회책을 적고 있습니다. R018과 그 #1241 항목이 말하는 실패가 원문의 "unparseable tool calls"와 같은 실패인지는 확인하지 않았습니다 [가설 — 상한을 넘는 위임에서 파싱 실패가 307 전후로 턴 종료로 이어지는 빈도를 비교하면 판정 가능]. 같은 실패라 해도 원문은 재시도 두 번 뒤에는 턴을 오류로 끝낸다고 적으므로 상한과 우회책의 필요성은 남습니다. 또한 307 이후에는 파싱 실패가 재시도로 가려질 수 있으므로, 위임 결과 판정은 계속 R020 ground-truth로 합니다.
2772
+ - CHANGELOG 원문: "Fixed subagent transcripts recording placeholder token usage and an empty stop reason for streamed responses"
2773
+ (307) 스트리밍 응답에 대해 서브에이전트 트랜스크립트가 자리표시용 토큰 사용량과 빈 stop reason을 기록하던 결함이 수정되었습니다. 관측한 범위(`git grep -l -E 'transcript_path' HEAD -- .claude/hooks`)에서 트랜스크립트 경로를 다루는 훅 스크립트는 `r007-r008-drift-advisor.sh`, `session-env-check.sh`, `task-outcome-recorder.sh` 세 개이고, `git grep -n -E 'stop_reason|input_tokens|output_tokens|"usage"|\.usage' HEAD -- .claude/hooks .claude/statusline.sh`가 출력 없이 끝났으므로 관측한 범위에서 훅과 상태줄에 트랜스크립트의 토큰 사용량이나 stop reason을 파싱하는 코드는 나오지 않았습니다. 비용 경고 훅 `cost-cap-advisor.sh`는 트랜스크립트가 아니라 `/tmp/.claude-cost-${PPID}` 파일에서 비용을 읽습니다(`.claude/hooks/scripts/cost-cap-advisor.sh:10`, `:43`). `packages/eval-core/src/db/schema.ts:41`에 `input_tokens` 열이 있으나, `git grep -n -F -e inputTokens -e input_tokens HEAD -- packages/eval-core/src ':!**/*.test.ts'`가 돌려준 것은 스키마·마이그레이션 정의 4줄(`db/schema.ts:41`, `:62`, `db/migrate.ts:40`, `:56`)이고 `git grep -n -P '\.usage\b|usage\?\.|message\.usage' HEAD -- packages/eval-core/src`는 0건(rc=1)이어서, 그 값을 서브에이전트 트랜스크립트에서 채우는 경로는 이 이름들로는 찾지 못했습니다 [가설 — eval-core의 세션 수집 경로를 읽으면 판정 가능]. 307 이전 서브에이전트 트랜스크립트로 토큰을 사후 집계했다면 스트리밍 응답분은 자리표시 값이었을 수 있으므로, 그런 과거 집계는 근거로 쓰지 않습니다.
2774
+ - CHANGELOG 원문: "Fixed a background command stopped through a connected app (such as the desktop app archiving an idle session) being reported to Claude as stopped by the user; the notice now names its output file"
2775
+ (307) 연결된 앱(예: 유휴 세션을 보관하는 데스크톱 앱)을 통해 중지된 백그라운드 명령이 Claude에게 사용자가 중지한 것으로 보고되던 결함이 수정되어, 이제 알림이 그 명령의 출력 파일을 지정합니다. R020 「Failure/Interrupt Report ≠ Actual Failure」 본문은 실패·중단 보고도 ground-truth를 확인하기 전에는 실패로 단정하지 않는다고 규정하며(`.claude/rules/MUST-completion-verification.md:526`, 보이는 텍스트), 이 결함은 중단의 주체가 잘못 보고되던 사례입니다. 307 이전에 "사용자가 중지함"으로 보고된 백그라운드 명령은 연결된 앱을 통해 중지된 경우라면 사용자 조치가 아니었으므로 사용자 의도의 근거로 쓰지 않습니다 [가설 — 이 저장소 사용자가 데스크톱 앱 등 연결된 앱으로 세션을 다루는지는 관측하지 않음]. 이제 알림이 출력 파일을 지정하므로, 중지된 명령이 어디까지 진행했는지는 그 파일을 읽어 확인하는 것이 R020의 ground-truth 원칙에 맞습니다.
2776
+
2777
+ ### 텔레메트리
2778
+
2779
+ - CHANGELOG 원문: "Added the `claude_code.safety_event` OpenTelemetry event for each tool call a permission rule, auto mode, a safety check, a hook or the sandbox stopped, prompted or sent back"
2780
+ (307) 권한 규칙·auto mode·안전 검사·훅·샌드박스가 도구 호출을 멈추거나, 확인을 요청하거나, 되돌려 보낼 때마다 발생하는 `claude_code.safety_event` OpenTelemetry 이벤트가 추가되었습니다. 이 저장소의 `monitoring-setup` 스킬은 2.1.307이 속하는 「2.1.282 이상」 갈래(`.claude/skills/monitoring-setup/SKILL.md:58`)에서 `CLAUDE_CODE_ENABLE_TELEMETRY`·`OTEL_METRICS_EXPORTER`·`OTEL_LOGS_EXPORTER`를 console로 켜는 env 블록(`:66`~`:68`)을 user-scope 설정이나 셸 export로 배치하도록 안내합니다(`:73`~`:74`). 원문은 이 이벤트가 어느 exporter로 나가는지 밝히지 않으므로, 그 절차로 켠 console 출력에 이 이벤트가 나타나는지는 [가설 — 텔레메트리를 켠 세션에서 훅 차단 1건을 일으켜 console 출력에 `claude_code.safety_event`가 찍히는지 확인하면 판정 가능]입니다. R021 표는 Hard Block 훅으로 stage-blocker, dev-server tmux, rule-deletion-guard를 듭니다(`.claude/rules/MUST-enforcement-policy.md:19`, 보이는 텍스트). 이 중 `exit 2`로 끝나는 차단 경로가 코드에서 확인되는 것은 `.claude/hooks/scripts/stage-blocker.sh:13`과 `.claude/hooks/scripts/rule-deletion-guard.sh`(`:32`, `:46`, `:56`, `:881`)이며(`git show HEAD:.claude/hooks/scripts/stage-blocker.sh | grep -n 'exit 2'`, `git show HEAD:.claude/hooks/scripts/rule-deletion-guard.sh | grep -n 'exit 2'`), 이 이벤트는 이 두 훅이 도구 호출을 멈춘 경우를 세는 결정론적 소스 후보입니다. dev-server tmux 훅은 `.claude/settings.json:52`의 인라인 명령이 `exit 1`로 끝나므로(`git show HEAD:.claude/settings.json | awk 'NR==52' | grep -o -E 'exit [0-9]+'` = `exit 1`) 실제로 도구 호출을 멈추는지가 열린 이슈 #1856에서 아직 실측되지 않았고, 이 이벤트가 그 훅에 대해 기록되는지도 [가설 — #1856의 런타임 차단 실측과 함께 판정]입니다. R010 「Subagent Scope-Creep STOP Protocol」의 2회 trip 계수(`.claude/rules/MUST-orchestrator-coordination.md:262`, 보이는 텍스트)에도 쓸 수 있을지는, 이 이벤트가 서브에이전트의 classifier trip을 다른 차단과 구분해 기록하는지 원문이 밝히지 않으므로 [가설 — 이벤트 속성에 차단 주체와 에이전트 식별자가 있는지 확인하면 판정 가능]입니다. R021 표의 `failure-ledger.sh`(`.claude/rules/MUST-enforcement-policy.md:24`, 보이는 텍스트)는 PostToolUseFailure 훅으로 도구 실패를 원장에 남기는 별도 장치이며, 관측한 범위(`git grep -n safety_event HEAD -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'` 0건)에서 이 저장소는 아직 이 이벤트를 참조하지 않습니다.
2781
+
2782
+ 기타 31건 — 이 저장소 비해당으로 판단한 항목입니다: Claude API 코드를 API 버전 `2026-10-21`로 옮기는 옵트인 명령 `/claude-api api-version`, 맞춤 `ANTHROPIC_BASE_URL` 게이트웨이 뒤와 Foundry에서의 `prompt-caching-scope` 헤더(저장소가 추적하는 `.claude/settings.json`·`templates/.claude/settings.json`에 `ANTHROPIC_BASE_URL` 0건, `git grep -c ANTHROPIC_BASE_URL HEAD -- .claude/settings.json templates/.claude/settings.json` rc=1), Agent SDK 전용 항목(백그라운드 작업이 도는 동안 턴이 때때로 SDK MCP 서버의 최신 도구 없이 시작되던 결함, API 확인이 5초를 넘을 때의 `setModel()` 대기), cloud sessions·self-hosted runner 전용 항목(재시작 뒤 `/autocompact` 창 유지, 재시작 시 `/clear`한 대화가 때때로 되살아나던 결함, 웹 검색 403 사유 표시, 데스크톱 앱 MCP 연결 실패 시의 첫 응답 지연, checkout 훅·인증서·git proxy 등), Claude apps gateway 전용 항목(`CLAUDE_STREAM_FIRST_BYTE_TIMEOUT_MS`, Desktop 텔레메트리), 앱·도구 연동 세부(Cowork cloud 세션의 WebFetch, 데스크톱 앱 Code 탭의 GitHub MCP 양식, Artifact 도구 읽기의 연결 재사용), CLI 브라우저 로그인 성공 페이지가 뜨는 시점, 큰 붙여넣기 이미지·PDF 읽기가 든 세션의 Remote Control 연결 시간, `/help`·`/` 메뉴의 번들 스킬 설명 표시, WebSearch 예산 소진 안내 문구, VSCode·Cloud sessions·Code Review 전용 항목. 기능어 표본 검색(`git grep -l -i -E 'api-version|prompt-caching-scope|setModel|createSdkMcpServer|CLAUDE_STREAM_FIRST_BYTE_TIMEOUT_MS|OTEL_EXPORTER_OTLP_HEADERS|Cowork|remote.control|checkout-hook|use-anthropic-git-proxy|self-hosted|WebSearch budget' HEAD -- .claude CLAUDE.md .github package.json`)의 히트 파일은 `.claude/rules/` 아래 8개와 `.github/scripts/send-report.ts` 하나이며, 후자의 히트는 GitHub REST 요청 헤더 `X-GitHub-Api-Version`(`:44`)의 부분 문자열 일치입니다. 룰 파일 8개의 히트는 문맥별로 판정하지 않았고, 기능어가 없는 표시·성능 항목도 검색으로 판정하지 않았습니다 [가설 — 항목별 저장소 측정은 위 본문 항목에 한해 실행했습니다]. 실측: `gh release view v2.1.307 --repo anthropics/claude-code --json body --jq .body | grep -c '^- '` = 43건 중 위 본문 12건을 다뤘으므로 43 − 12 = 31건입니다. 계수 범위는 해당 릴리즈 노트의 최상위 불릿 줄(`- `로 시작하는 줄)입니다.
2783
+
2784
+ **Action items**:
2785
+ - 관측한 범위에서 저장소가 추적하는 훅·설정·에이전트를 바꿔야 한다고 확정한 항목은 없습니다. 근거는 위 각 항목의 HEAD 측정입니다(`[1m]`·`CLAUDE_CODE_DISABLE_1M_CONTEXT`·`axScreenReader`가 tracked 설정에 없음, 트랜스크립트의 토큰 값을 파싱하는 훅이 위 `git grep`에서 나오지 않음). dev-server tmux 훅의 차단 여부는 이 릴리즈와 별개로 열린 이슈 #1856에서 다룹니다. 룰 문안 변경 가능성은 이 문서에서 판정하지 않습니다.
2786
+ - 후보: 이 가이드 「Known Platform Issues & Workarounds」의 #1241 항목에 307의 도구 호출 재시도 개선을 주석으로 달지는, 위 unparseable 항목의 [가설]이 판정된 뒤 결정합니다.
2787
+ - 307 이전 버전의 다음 관측은 각 조건에서 결함 산물이었을 수 있으므로 원인 진단의 결론으로 쓰지 않습니다: `CLAUDE_CODE_DISABLE_1M_CONTEXT` 설정과 `[1m]` 별칭 모델이 겹친 경우의 model-not-found, PDF 페이지·이미지·큰 도구 결과를 많이 읽는 턴의 "Autocompact is thrashing"(일부), macOS의 `claude -p`에서 로그인 키체인이 잠긴 동안의 MCP "needs authentication", macOS·Linux에서 연결 중 절전이 끼었을 때의 MCP "timed out" 보고와 headless 실행의 실패 상태 지속, 호출 도중 연결이 닫힌 HTTP MCP 호출의 이중 전송, 거부된 셸 명령이 보이지 않던 Recently denied 화면과 auto mode 로컬 classifier가 재시도된 명령을 검사하며 그 화면의 승인을 무시한 재차단, 연결된 앱을 통해 중지된 백그라운드 명령의 "사용자가 중지함" 보고, 스트리밍 응답에 대한 서브에이전트 트랜스크립트의 자리표시 토큰 사용량과 빈 stop reason.
2788
+ - 룰 문안 변경 제안은 이 문서에 두지 않습니다(R016: CC 지식은 이 가이드에 두고, 룰 파일에는 행동 변화가 필요할 때만 1줄). (307) 항목 중 `[가설 — …]` 표기는 판정 기준을 충족하는 측정이 이루어지기 전에는 결론으로 쓰지 않습니다.
2789
+
2790
+ ---
2791
+
2792
+ ## v2.1.308 (2026-10-22)
2793
+
2794
+ > Issue: #1869 — Claude Code v2.1.308 compatibility documentation
2795
+ > Scope-ceiling check (R017): 조사 시점(2026-10-25)의 최신 릴리즈는 2.1.310입니다(`claude --version`=2.1.310, `npm view @anthropic-ai/claude-code version`=2.1.310). 2.1.309·2.1.310 CHANGELOG 절을 각각 잘라 `2.1.308` 문자열과 "Revert"를 검색한 결과 두 절 모두 두 문자열이 0건이었으므로(`for v in 2.1.309 2.1.310; do awk -v v="$v" '/^## /{p=($2==v)} p' CHANGELOG.md | grep -c -F -e 2.1.308; awk -v v="$v" '/^## /{p=($2==v)} p' CHANGELOG.md | grep -c -i revert; done` 출력 0 네 줄), 이 릴리즈를 되돌리거나 좁히는 문장은 관측되지 않았습니다. 릴리즈 게시 시각은 2026-10-22T04:34:55Z입니다(`gh release view v2.1.308 -R anthropics/claude-code --json publishedAt`).
2796
+
2797
+ ### 일반 안정성 개선
2798
+
2799
+ - CHANGELOG 원문: "Bug fixes and reliability improvements"
2800
+ (308) 이 릴리즈의 노트는 대상 기능을 밝히지 않고 버그 수정과 신뢰성 개선을 한 줄로 묶어 적습니다(`awk -v v=2.1.308 '/^## /{p=($2==v)} p' CHANGELOG.md | grep -c '^- '` = 1). 원문이 대상을 특정하지 않으므로 이 저장소의 훅·서브에이전트·스킬·설정 중 어디에 영향이 있는지 판정할 근거가 원문에 없으며, 저장소 측 조치도 도출하지 않습니다. 2.1.307과 2.1.309 사이에서 관측한 동작 차이를 이 릴리즈로 귀속하려면 버전을 고정해 재현합니다 [가설 — 2.1.307과 2.1.308을 각각 고정 실행해 같은 입력의 결과가 다르면 308 귀속 가능].
2801
+
2802
+ 기타 0건 — 이 저장소 비해당 항목은 없습니다. 실측: `gh release view v2.1.308 --repo anthropics/claude-code --json body --jq .body | grep -c '^- '` = 1건 중 위 본문 1건을 다뤘으므로 1 − 1 = 0건입니다. 계수 범위는 해당 릴리즈 노트의 최상위 불릿 줄(`- `로 시작하는 줄)입니다.
2803
+
2804
+ **Action items**:
2805
+ - 훅·설정·룰 변경 제안은 없습니다. 원문에 구체 항목이 없으므로 이 릴리즈를 근거로 한 진단 재해석도 하지 않습니다.
2806
+
2807
+ ---
2808
+
2809
+ ## v2.1.309 (2026-10-22)
2810
+
2811
+ > Issue: #1871 — Claude Code v2.1.309 compatibility documentation
2812
+ > Scope-ceiling check (R017): 조사 시점(2026-10-25)의 최신 릴리즈는 2.1.310입니다(`claude --version`=2.1.310, `npm view @anthropic-ai/claude-code version`=2.1.310). 상한 이후 릴리즈인 2.1.310(게시 2026-10-23T23:39:00Z, `gh release view v2.1.310 -R anthropics/claude-code --json publishedAt`)의 CHANGELOG 절을 잘라 "2.1.309"와 "Revert"를 검색했으며(`gh api -H "Accept: application/vnd.github.raw" repos/anthropics/claude-code/contents/CHANGELOG.md | awk -v v=2.1.310 '/^## /{p=($2==v)} p' | grep -c -F '2.1.309'`=0, 같은 파이프라인 끝을 대소문자 무시 `grep -c -i 'revert'`로 바꾼 결과=0), 이 릴리즈 항목을 되돌리거나 좁히는 문장은 관측되지 않았습니다. 릴리즈 게시 시각은 2026-10-22T22:18:57Z입니다(`gh release view v2.1.309 -R anthropics/claude-code --json publishedAt`).
2813
+
2814
+ ### 권한 · Bash 권한 검사
2815
+
2816
+ - CHANGELOG 원문: "Fixed Bash permission checks not prompting for some compound commands that change directory before running git when the `cd` is wrapped or prefixed, as they do for a plain `cd`"
2817
+ (309) 디렉토리를 바꾼 뒤 git을 실행하는 일부 복합 명령에서 `cd`가 감싸이거나(wrapped) 접두어가 붙은(prefixed) 경우, 일반 `cd`일 때와 달리 Bash 권한 검사가 승인을 요청하지 않던 결함이 수정되었습니다. 이제 이런 명령도 일반 `cd`처럼 승인을 요청합니다. R005는 지속 `cd`를 남기지 말고 절대 경로나 서브셸 `( cd <dir> && … )`을 쓰라고 규정하므로(`.claude/rules/MAY-optimization.md:89`, 보이는 본문 줄) 그중 서브셸 형태가 원문의 "wrapped" `cd`에 해당할 수 있습니다 [가설 — 원문은 "wrapped"의 구체 형태를 밝히지 않으므로, 비-bypass 모드에서 `( cd templates && git status )`를 실행해 프롬프트가 뜨는지로 판정]. 같은 계열의 기록으로, R002 버전 노트(`.claude/rules/MUST-permissions.md:125`의 (d), HTML 주석 안)는 2.1.271에서 디렉토리 변경 2회·서브셸·`cd`+`git` 체인을 가진 Bash 명령이 bypass·auto 모드의 `permissions.blockReadsOutsideWorkingDirectories`에서 프롬프트를 건너뛰던 결함이 수정되었다고 적습니다. 이 저장소의 두 settings에는 그 키가 없습니다(`git grep -n blockReadsOutsideWorkingDirectories HEAD -- .claude/settings.json templates/.claude/settings.json` rc=1). 저장소의 project settings에는 `Bash(git:*)` allow 규칙이 있으나(`.claude/settings.json:8`) 이 규칙이 `cd` 뒤 git 검사의 프롬프트를 억제하는지는 측정하지 않았습니다. 저장소의 project settings는 `defaultMode: "bypassPermissions"`이고 배포 미러 `templates/.claude/settings.json`에는 `defaultMode`가 없습니다(`git show HEAD:.claude/settings.json | jq -c '{defaultMode: .permissions.defaultMode}'` = `{"defaultMode":"bypassPermissions"}`, `git show HEAD:templates/.claude/settings.json | jq -c '{defaultMode: .permissions.defaultMode}'` = `{"defaultMode":null}`). R010 「Universal bypassPermissions」(제목 줄 `.claude/rules/MUST-orchestrator-coordination.md:579`, 본문 `:588`)는 2.1.257부터 project·local의 `bypassPermissions`가 무시되어, user 값이 `plan`·`auto`·`acceptEdits`처럼 bypass가 아닐 때 `claude -p`에서 `default`로 귀결된다고 기록합니다(#1828, CC 2.1.289 실측). 따라서 user 값이 bypass가 아닌 기기의 `claude -p` 무인 실행에서는 새 프롬프트가 나타날 수 있습니다 [가설 — 같은 본문 줄이 `default`가 실제로 프롬프트를 띄우는지와 TTY 세션을 미관측으로 남기므로, 해당 기기의 비-bypass 실행으로 판정]. `git -C templates status`처럼 디렉토리를 바꾸지 않는 형태는 원문의 대상 조건("change directory before running git")에 들지 않으며, R010 「사전 실측 리터럴」(본문 `.claude/rules/MUST-orchestrator-coordination.md:388`, 코드 블록 줄 `:391`)도 `cd` 없이 `git rev-parse`를 실행하는 형태입니다.
2818
+ - CHANGELOG 원문: "Fixed the Bash permission check trusting a variable set by a command whose redirect can fail to open"
2819
+ (309) 리다이렉트 대상을 열지 못할 수 있는 명령이 설정한 변수를 Bash 권한 검사가 신뢰하던 결함이 수정되었습니다. 원문은 수정 뒤의 결과(승인 요청 여부)를 밝히지 않으므로, 이전에 자동 승인되던 일부 명령이 이제 승인을 요청하는지는 단정하지 않습니다 [가설 — 원문에 결과어가 없으므로 영향 방향은 미확정]. 저장소의 project allow 규칙은 `Bash(git:*)`·`Bash(sed:*)` 같은 접두 규칙이며(`.claude/settings.json:8`, `:16`), 이런 형태(리다이렉트가 붙은 변수 설정 뒤 그 변수를 쓰는 명령)를 지시하는 스킬이 있는지는 측정하지 않았습니다.
2820
+ - CHANGELOG 원문: "Changed `sed -i` to get the standard Bash prompt and run as written, not a simulated file-edit preview; like other Bash edits, it is no longer restored by `/rewind`"
2821
+ (309) `sed -i`가 모의 파일 편집 미리보기 대신 표준 Bash 프롬프트를 받고 쓰인 그대로 실행되도록 바뀌었으며, 다른 Bash 편집처럼 `/rewind`로 복원되지 않습니다. 기본 동작 변경입니다. 저장소의 project settings에는 `Bash(sed:*)` allow 규칙이 있습니다(`.claude/settings.json:16`). 표준 Bash 프롬프트 경로에서는 이 접두 규칙이 `sed -i`에도 적용될 수 있습니다 [가설 — 비-bypass 모드에서 `sed -i` 실행 시 프롬프트 유무로 판정]. 관측한 범위에서 훅·스킬·에이전트·project settings에는 `sed -i` 명령이 없고(`git grep -n -P '\bsed\b[^|;&\n]*\s-i' HEAD -- .claude/hooks .claude/skills .claude/agents .claude/settings.json` rc=1; 이 정규식이 `sed -E -i`·`sed -i.bak` 형태도 잡는 것을 픽스처로 확인) `/rewind`를 쓰는 절차도 없으므로(`git grep -n -F '/rewind' HEAD -- .claude/skills .claude/agents .claude/hooks` rc=1), 관측한 영향 조건은 Claude가 즉석에서 쓰는 `sed -i` 편집입니다. 그런 편집은 이제 `/rewind` 복원 대상이 아닙니다. R005 버전 노트(`.claude/rules/MAY-optimization.md:108`, HTML 주석 안)와 R023 버전 노트(`.claude/rules/SHOULD-verification-ladder.md:351`, HTML 주석 안)는 2.1.269의 `bashEditDiffEnabled`(2.1.269 CHANGELOG: "Added a diff of the files a Bash command changed to the Bash tool result when the Bash tool handles file edits (setting `bashEditDiffEnabled`)")를 셸 편집의 사후 점검 수단으로 기록하며, R005 노트는 이로써 위임받은 에이전트의 `sed -i`가 감사 가능해진다고 적습니다. `sed -i`가 이제 모의 편집 미리보기가 아니라 다른 Bash 편집처럼 처리되므로 그 노트의 전제가 계속 성립하는지는 판정하지 않았습니다 [가설 — `bashEditDiffEnabled`를 켠 세션에서 `sed -i` 실행 결과에 diff가 붙는지로 판정]. 이 저장소의 두 settings에는 `bashEditDiffEnabled`가 없습니다(`git grep -n bashEditDiffEnabled HEAD -- .claude/settings.json templates/.claude/settings.json` rc=1).
2822
+
2823
+ ### MCP · headless
2824
+
2825
+ - CHANGELOG 원문: "Fixed a disabled MCP server being reconnected by a later permission prompt in print and SDK sessions"
2826
+ (309) print(`-p`)·SDK 세션에서 비활성화된 MCP 서버가 나중의 권한 프롬프트로 다시 연결되던 결함이 수정되었습니다. v2.1.296 절의 headless 항목(headless 세션이 디렉토리 변경이나 플러그인 재로드 뒤, 그 폴더에서 꺼 둔 `.mcp.json` 서버나 플러그인 MCP 서버를 시작하던 결함)과 같은 계열의 수정입니다. 이 저장소는 `.mcp.json`에 서버 2개(`ontology-rag` stdio, `eraser` http)를 두며(`git cat-file -p HEAD:.mcp.json | jq -c '.mcpServers | to_entries | map({name: .key, type: (.value.type // "stdio")})'`), 두 서버 항목의 키에는 비활성화 키가 없습니다(`git cat-file -p HEAD:.mcp.json | jq -c '.mcpServers | map_values(keys)'` = `{"ontology-rag":["args","command","env","type"],"eraser":["type","url"]}`). 저장소의 project settings는 `enableAllProjectMcpServers: true`, `enabledMcpjsonServers: ["ontology-rag"]`이고 `disabledMcpjsonServers`는 null이며(`git show HEAD:.claude/settings.json | jq -c '{enableAllProjectMcpServers, enabledMcpjsonServers, disabledMcpjsonServers}'`), 배포 미러에서는 세 키가 모두 null로 나옵니다(`git show HEAD:templates/.claude/settings.json | jq -c '{enableAllProjectMcpServers, enabledMcpjsonServers, disabledMcpjsonServers}'`). 따라서 저장소 설정 범위에서는 비활성화된 서버가 관측되지 않았습니다. 사용자가 기기별로 끈 서버의 상태(사용자 `~/.claude.json` 등)는 관측하지 않았습니다 [가설 — 사용자 scope에서 끈 서버가 있고, print(`-p`)·SDK 세션(예: `claude -p`로 실행한 `/fsd`)에서 나중에 권한 프롬프트가 뜬 경우에 해당].
2827
+
2828
+ ### CLAUDE.md 로딩 · 컨텍스트
2829
+
2830
+ - CHANGELOG 원문: "Fixed sessions compacting repeatedly after reading files under a very large nested CLAUDE.md; a nested CLAUDE.md over the size limit now loads only its start"
2831
+ (309) 매우 큰 nested CLAUDE.md 아래의 파일을 읽은 뒤 세션이 반복해서 compact되던 결함이 수정되었으며, 크기 한도를 넘는 nested CLAUDE.md는 이제 앞부분만 로드됩니다. 이 저장소의 추적 CLAUDE.md는 2개로, 루트 `CLAUDE.md`(13,846바이트)와 nested `templates/CLAUDE.md`(13,817바이트)입니다(`git ls-files -- '*CLAUDE*.md' '*claude.md'`, `git cat-file -s HEAD:CLAUDE.md`, `git cat-file -s HEAD:templates/CLAUDE.md`). 원문은 크기 한도 값을 밝히지 않으므로 `templates/CLAUDE.md`가 한도를 넘어 앞부분만 로드되는지는 판정하지 못했습니다 [가설 — `templates/` 아래 파일을 읽은 세션에서 `templates/CLAUDE.md`가 끝까지 로드되는지 `/context`나 `InstructionsLoaded` 훅으로 확인하면 판정]. `templates/CLAUDE.md`가 원문의 "very large" 조건에 해당하고, 구버전에서 `templates/` 아래 파일을 읽은 뒤 반복 compaction을 겪었다면 이 결함이 원인 후보입니다 [가설 — 크기 조건 충족 여부와 그런 반복 compaction은 관측하지 않음].
2832
+
2833
+ ### 서브에이전트 · 팀원 · worktree
2834
+
2835
+ - CHANGELOG 원문: "Fixed split-pane agent teammates not inheriting the tool deny and `--tools` rules given on the leader's command line"
2836
+ (309) split-pane 에이전트 팀원이 리더의 명령줄에서 준 도구 deny 규칙과 `--tools` 규칙을 상속하지 않던 결함이 수정되었습니다. 저장소 settings(`.claude/settings.json`, `templates/.claude/settings.json`)에는 `teammateMode` 키가 없으므로(`git grep -n teammateMode HEAD -- .claude/settings.json templates/.claude/settings.json` rc=1) 팀원이 split-pane으로 표시되는지는 사용자 settings나 실행 옵션에 달려 있습니다 [가설 — `teammateMode` 값과 split-pane 표시의 대응은 원문 외 미확인]. R018은 `TeamCreate`가 없어도 이름 붙인 `Agent` 스폰이 세션의 암묵적 팀의 팀원을 만든다고 기록합니다(`.claude/rules/MUST-agent-teams.md:22`, 보이는 표 행, CC 2.1.289 실측). 다만 그런 팀원이 split-pane으로 뜨는지는 측정하지 않았습니다 [가설 — 이름 붙인 스폰 뒤 tmux pane 생성 여부로 판정]. 관측한 범위에서 이 저장소의 스킬·훅·워크플로·`package.json`은 `--tools`·`--disallowedTools`·`--allowedTools` 계열 플래그를 쓰지 않으며(`git grep -n -E -e '--tools|--disallowedTools|--disallowed-tools|--allowedTools|--allowed-tools' HEAD -- .claude/skills .claude/hooks .github package.json` rc=1), 가이드 쌍을 뺀 저장소 전체에서 이 플래그 계열이 나오는 파일은 `.claude/rules/MUST-permissions.md`, 그 `templates/` 미러, `wiki/rules/r002.md`입니다(`git grep -l -E -e '--tools|--disallowedTools|--disallowed-tools|--allowedTools|--allowed-tools' HEAD -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'`). 따라서 상속될 리더 명령줄 규칙은 저장소 쪽에서 관측되지 않았습니다. 사용자가 실행 alias로 이런 플래그를 주는지는 관측하지 않았습니다. 에이전트 frontmatter의 `tools:`·`disallowedTools:` 제한(R010 「Known Limitations (Active Cache)」, 제목 줄 `.claude/rules/MUST-orchestrator-coordination.md:811`)은 원문 대상인 리더 명령줄 규칙과 별개입니다.
2837
+ - CHANGELOG 원문: "Fixed worktree-isolated sessions accepting some locale-prefixed commands the isolation guard should refuse"
2838
+ (309) worktree로 격리된 세션이, 격리 가드가 거부해야 할 일부 locale 접두 명령을 받아들이던 결함이 수정되었습니다. 관측한 범위(`git grep -n -E 'isolation: *"?worktree|EnterWorktree' HEAD -- .claude/agents .claude/skills .claude/settings.json`)에서 에이전트·스킬·project settings가 지시하는 worktree 격리 절차는 `omcustom-auto-improve` 스킬의 `EnterWorktree` 단계입니다(`.claude/skills/omcustom-auto-improve/SKILL.md:59`). 이 pathspec 밖에는 호출 단위 `isolation: "worktree"` 위임 기록이 있습니다. R009 버전 노트(`.claude/rules/MUST-parallel-execution.md:208`, HTML 주석 안)는 worktree 병렬 위임(`isolation: "worktree"`)을 다루고, R006은 frontmatter `isolation: worktree | sandbox`를 예시하며(`.claude/rules/MUST-agent-design.md:220`, HTML 주석 안), v2.1.305 절의 worktree 정리 항목도 호출 단위 `isolation: "worktree"` 위임을 관련 경로로 둡니다. 같은 격리 가드에 관한 기록으로, R002 버전 노트는 2.1.257에서 worktree 격리 세션이 git을 건드리지 않는 Bash 반복문·`$VAR` 읽기·`"$(…)"`·heredoc을 거부하던 결함이 수정되었다고 적고(`.claude/rules/MUST-permissions.md:113`의 (e), HTML 주석 안), 2.1.274에서 특정 중첩 셸 확장을 포함한 Bash 명령이 다시 거부되므로 R009 worktree 위임에서 이를 격리 결함으로 진단하지 말고 명령을 단순화하라고 적습니다(같은 파일 `:127`, HTML 주석 안). 이번 수정은 2.1.274처럼 가드가 거부하는 쪽으로 움직이는 변경입니다. `EnterWorktree`로 들어간 세션과 호출 단위 `isolation: "worktree"` 위임 세션이 원문의 "worktree-isolated sessions"에 해당하는지는 측정하지 않았습니다 [가설 — 두 경로에서 locale 접두 명령에 대한 가드의 거부 메시지를 관측하면 판정]. locale 접두(`LC_ALL=C`)는 관측한 범위에서 훅·스킬 스크립트의 코드 줄(`.claude/hooks/scripts/cost-cap-advisor.sh:22`, `:49`, `.claude/skills/agora/scripts/anonymize.sh:266`)에 나타나며(`git grep -n -E '(^|[ ;&|(])(LC_ALL|LANG|LC_[A-Z]+)=' HEAD -- .claude/skills .claude/hooks .claude/agents`), 이는 Bash 도구 명령 문자열이 아니라 스크립트 본문이므로 가드 검사 대상이 아니라고 봅니다 [가설 — 가드가 명령 문자열을 검사한다는 전제].
2839
+ - CHANGELOG 원문: "Fixed worktree-isolated sessions on zsh accepting some arithmetic commands that the isolation guard should refuse"
2840
+ (309) zsh의 worktree 격리 세션이, 격리 가드가 거부해야 할 일부 산술 명령을 받아들이던 결함이 수정되었습니다. R002 버전 노트는 이 저장소의 Bash 도구 실행 셸을 zsh로 기록하므로(`.claude/rules/MUST-permissions.md:113`의 (b), HTML 주석 안) zsh 조건에 해당할 수 있으나, 실제 셸은 사용자 기기마다 다릅니다. 위 항목과 같은 worktree 격리 경로(`EnterWorktree` 단계, 호출 단위 `isolation: "worktree"` 위임)에 관련되며 [가설], 이 수정은 가드가 더 많은 명령을 거부하는 방향이므로 zsh 격리 세션 안의 일부 즉석 산술 명령이 거부될 수 있습니다 [가설 — 거부 대상 산술 형태는 원문에 나오지 않음].
2841
+
2842
+ ### Bash · 도구 동작 · transcript
2843
+
2844
+ - CHANGELOG 원문: "Fixed long tool output previews being cut through an emoji, leaving session transcripts that `jq` could not parse"
2845
+ (309) 긴 도구 출력 미리보기가 이모지 중간에서 잘려 `jq`가 파싱할 수 없는 세션 transcript를 남기던 결함이 수정되었습니다. 이 저장소의 R007/R008 drift advisor와 Stop 훅 회고는 transcript를 줄 단위로 나눈 뒤(`split("\n")`, `.claude/hooks/scripts/r007-r008-drift-advisor.sh:227`, `.claude/hooks/scripts/session-reflection.sh:167`) 각 줄을 `fromjson? // empty`로 파싱하므로(같은 파일의 코드 줄 `:228`, `:168`) 파싱할 수 없는 줄은 오류 없이 건너뜁니다. 따라서 구버전 transcript에서 긴 도구 출력 미리보기가 이모지 중간에서 잘린 줄은 판정에서 빠졌을 수 있습니다 [가설 — 잘린 줄이 판정에 쓰이는 레코드였는지는 미조사; 기존 transcript에서 `fromjson`이 실패하는 줄을 세면 판정]. R020 「Self-Violation Counting Is Also Diagnosis」(제목 줄 `.claude/rules/MUST-completion-verification.md:381`)의 표 행(`:389`)은 transcript를 파싱해 실측 집계한 뒤 보고하라고 요구하므로, 2.1.309 이전에 기록된 transcript를 `?` 없는 `jq`로 파싱하면 그런 줄에서 실패할 수 있습니다. 원문은 이미 기록된 transcript를 고친다고 서술하지 않습니다.
2846
+ - CHANGELOG 원문: "Improved disk-full handling: a Bash command cut off by a full disk now says so and names the folder to free up, and starting on a full temp volume prints a clear message, not a raw ENOSPC error"
2847
+ (309) 디스크가 가득 차 Bash 명령이 중단되면 이제 그 사실과 비워야 할 폴더를 알려 주고, 임시 볼륨이 가득 찬 상태로 시작하면 원시 ENOSPC 오류 대신 명확한 메시지를 출력합니다. R020은 실행 중 인터럽트된 셸 명령이 잘렸다는 표시 없이 "Ran 1 shell command"로만 표시되던 v2.1.246 이전 사례를 들어 출력 완결성 확인을 요구합니다(`.claude/rules/MUST-completion-verification.md:532`, 보이는 표 행). 이 개선은 디스크 부족으로 인한 Bash 명령 중단을 명시적으로 보고하는 방향이며, R020의 출력 완결성 확인 의무는 바뀌지 않습니다. v2.1.305 절의 `ENOSPC` 항목은 디스크가 가득 차 명령이 아무것도 실행되지 않은 경우를 다루며 실행 도중 끊긴 경우로 이 문장을 참조합니다. 두 경우는 구분되며, 이 항목처럼 실행 도중 끊긴 명령은 부분 산출물을 남겼을 수 있습니다.
2848
+
2849
+ ### GitHub 기록
2850
+
2851
+ - CHANGELOG 원문: "Fixed Claude notifying unrelated GitHub users by writing role names and placeholders as mentions in PRs, issues and comments"
2852
+ (309) Claude가 PR·이슈·코멘트에 역할 이름과 플레이스홀더를 멘션 형태로 써서 무관한 GitHub 사용자에게 알림을 보내던 결함이 수정되었습니다. 이 저장소는 PR·이슈·코멘트를 `gh`로 작성하는 스킬을 두며(`git grep -l -E 'gh (issue|pr) (create|comment)' HEAD -- .claude/skills | wc -l`=5), R015는 에이전트 직접 지정 문법으로 `@{agent-name} {command}`를 규정합니다(`.claude/rules/MUST-intent-transparency.md:40`, 보이는 본문 줄; 예시는 `.claude/skills/intent-detection/SKILL.md:144`의 `@lang-python-expert`). 이 표기가 GitHub 본문에 들어가면 같은 이름의 GitHub 사용자 멘션으로 해석될 수 있었습니다 [가설 — 이 저장소가 작성한 이슈·PR 본문에서 `@<agent-name>` 형태를 검색하면 판정]. `.claude/skills/pipeline/workflows/auto-dev.yaml:504`, `:609`의 `--add-assignee @me`는 `gh` 명령 인자이며 본문 텍스트가 아니므로 원문 대상이 아닙니다.
2853
+
2854
+ 기타 68건 — 이 저장소 비해당(샌드박스 항목: macOS·Linux 샌드박스의 셸 startup 파일 실행, `denyWrite` symlink glob, `--mcp-config` 파일 보호, 샌드박스 제외 명령의 쓰기 승인, Linux 백그라운드 명령의 write deny, Linux 샌드박스의 PDF Read — 저장소 settings에 `sandbox` 설정 0건(`git grep -n -i sandbox HEAD -- .claude/settings.json templates/.claude/settings.json` rc=1), `--mcp-config` 실행 경로 0건(`git grep -n -e '--mcp-config' HEAD -- .claude .github package.json` rc=1); 단 `.claude/agents/sec-codeql-expert.md:8`의 `isolation: sandbox`(R006 예시의 주석은 "sandbox = restricted bash", `.claude/rules/MUST-agent-design.md:220`, HTML 주석 안)를 CC가 Bash 샌드박스로 취급하는지는 확인하지 않았습니다 [가설 — 이 에이전트를 스폰해 샌드박스 적용 여부를 관측하면 판정; 해당하면 위 샌드박스 항목 일부가 이 에이전트에 관련]; `Edit(path)` deny 규칙의 Bash 리다이렉트 차단 — 저장소 settings의 deny 규칙 null(`git show HEAD:.claude/settings.json | jq -c '.permissions.deny'`, `git show HEAD:templates/.claude/settings.json | jq -c '.permissions.deny'`); worktree·브랜치 체크아웃의 git replace refs 무시 — 원격의 replace ref 0개(`git ls-remote origin 'refs/replace/*' | wc -l`=0); worktree 생성·재사용에서 git이 객체를 on-demand로 가져오지 않도록 한 변경(대상은 일반 clone과, Bash 샌드박스가 설정된 partial clone이며 그런 partial clone은 객체를 먼저 가져옴) — 저장소 settings에 sandbox 설정 0건(위 명령)이고, 일반 clone에서는 on-demand fetch가 일어나지 않는다고 봅니다 [가설 — 일반 clone에서 `EnterWorktree` 전후 git 네트워크 요청 유무로 판정]; `--add-dir` 스킬 이름 충돌 — 실행 경로 0건(`git grep -n -e 'add-dir' HEAD -- .claude/skills .claude/hooks .claude/agents .github package.json` rc=1); `claude ultrareview` workspace trust — 실행 경로 0건(`git grep -n -i ultrareview HEAD -- .claude/skills .claude/hooks .claude/agents .github package.json` rc=1); PowerShell 훅·Windows 전용 수정 — `"shell": "powershell"` 0건(`git grep -n -E '"shell" *: *"powershell"' HEAD -- .claude/settings.json templates/.claude/settings.json .claude/hooks/hooks.json` rc=1); Desktop·VSCode 전용 항목(Desktop app·VS Code의 bypass 모드에서 위험 `rm`·`rmdir` 프롬프트를 즉시 거부하는 변경 포함), Cloud sessions·Claude Tag·Code Review·self-hosted runner, mods(`turn.step` 별칭, hooks module 깊이 오류), artifact 게시·갱신, Amazon Bedrock·gateway keepalive, `/claude-api` 스킬·번들 dataviz 스킬, claude.ai synced plugin·skill, `/verify`·`/code-review`의 nested package 스킬 탐색, 터미널 UI(ctrl+enter, ctrl+o, 키 바인딩 slash command, `/rename`, `/rewind` 목록 표시), macOS Command Line Tools 대화상자, `/privacy-settings`·feedback, `claude remote-control` 상태줄, profile store symlink 보호, Claude Code 자체 git 명령의 Windows 속도·영어 오류 메시지). 실측: `gh release view v2.1.309 --repo anthropics/claude-code --json body --jq .body | grep -c '^- '` = 79건 중 위 본문 11건을 다뤘으므로 79 − 11 = 68건입니다. 계수 범위는 해당 릴리즈 노트의 최상위 불릿 줄(`- `로 시작하는 줄)입니다.
2855
+
2856
+ **Action items**:
2857
+
2858
+ - 본문 11개 항목 가운데 원문이 `Changed`로 시작하는 기본 동작 변경은 `sed -i` 항목 1개입니다(본문 인용 11줄의 첫 단어: Fixed 9, Changed 1, Improved 1). 이 릴리즈 전체의 `- Changed` 불릿은 6개이며(`gh release view v2.1.309 --repo anthropics/claude-code --json body --jq .body | grep -c '^- Changed'`=6) 나머지 5개는 기타로 분류했습니다. 본문의 결함 수정 9개 가운데 이 저장소의 실행에서 승인 요청이나 거부가 늘 수 있는 방향의 항목은 `cd`를 감싸거나 접두어를 붙인 뒤 git을 실행하는 일부 복합 명령, worktree 격리 가드 2건(일부 locale 접두 명령, zsh의 일부 산술 명령 — 해당 세션 경로는 [가설]), 그리고 리더를 deny·`--tools` 명령줄 규칙으로 실행하고 split-pane 팀원을 쓰는 경우의 규칙 상속입니다(본문에서 저장소 쪽 사용은 관측되지 않았습니다). 비활성 MCP 서버의 재연결 방지는 사용자가 끈 상태를 유지하는 수정이므로 이 목록에 넣지 않았습니다. 기타로 분류한 항목에도 거부나 승인 요청이 늘 수 있는 방향의 변경이 있으나(예: `Edit(path)` deny 규칙의 Bash 리다이렉트 차단, `--mcp-config` 파일 보호, 샌드박스 제외 명령의 쓰기 전 승인 요청, Windows PowerShell의 `Set-Location`·`cd` 승인 요청), 위 기타 문장의 측정과 범주 분류에 따라 이 저장소 비해당으로 두었습니다. 리다이렉트를 열지 못할 수 있는 명령이 설정한 변수 항목은 원문에 결과어가 없어 방향을 분류하지 않았습니다. 이 저장소에서 실제로 프롬프트·거부가 생기는지는 아래 후속 실측 후보 (1)·(2)·(5)·(6)으로 남깁니다. 룰·CLAUDE.md·에이전트·훅 문안 변경은 이 절에서 확정하지 않습니다(R016: CC 지식은 이 가이드에 두고 룰 파일에는 행동 변화가 필요할 때만 1줄).
2859
+ - 후속 실측 후보: (1) 비-bypass 모드에서 `( cd templates && git status )`가 프롬프트를 띄우는지, `Bash(git:*)`가 이를 억제하는지 확인합니다. (2) 비-bypass 모드에서 `Bash(sed:*)`가 `sed -i`에 적용되는지, `bashEditDiffEnabled`를 켠 세션에서 `sed -i` 결과에 diff가 붙는지 확인합니다. (3) `templates/CLAUDE.md`(13,817바이트)가 nested 크기 한도를 넘는지 확인합니다. (4) 2.1.309 이전 transcript에서 `fromjson`이 실패하는 줄 수를 셉니다. (5) `EnterWorktree` 세션과 호출 단위 `isolation: "worktree"` 위임 세션에서 locale 접두 명령과 zsh 산술 명령이 거부되는지 확인합니다. (6) 리더를 `--disallowedTools`·`--tools`로 실행한 세션에서 이름 붙인 스폰이 split-pane 팀원이 되는지, 그 팀원이 리더의 규칙을 상속하는지 확인합니다.
2860
+ - (309) 항목 중 `[가설 — …]` 표기는 판정 기준을 충족하는 측정이 이루어지기 전에는 결론으로 쓰지 않습니다.
2861
+
2862
+ ---
2863
+
2864
+ ## v2.1.310 (2026-10-23)
2865
+
2866
+ > Issue: #1872 — Claude Code v2.1.310 compatibility documentation
2867
+ > Scope-ceiling check (R017): 조사 시점(2026-10-25)의 최신 릴리즈는 2.1.310입니다(`claude --version`=2.1.310, `npm view @anthropic-ai/claude-code version`=2.1.310, `gh release list -R anthropics/claude-code --limit 3`의 첫 행이 `v2.1.310 Latest`). 이 릴리즈가 스코프 상한이므로 이후 릴리즈의 롤백 확인 대상이 없습니다. 릴리즈 게시 시각은 2026-10-23T23:39:00Z입니다(`gh release view v2.1.310 -R anthropics/claude-code --json publishedAt`).
2868
+
2869
+ ### Bash · Monitor 도구
2870
+
2871
+ - CHANGELOG 원문: "Added the Monitor tool and plugin monitors on Bedrock, Vertex, and Foundry, and when telemetry or nonessential traffic is disabled; long foreground sleeps are now blocked there too"
2872
+ (310) Bedrock·Vertex·Foundry에서, 그리고 텔레메트리나 비필수 트래픽을 끈 경우에도 Monitor 도구와 플러그인 monitor가 추가되었고, 그 환경에서도 이제 긴 foreground sleep이 차단됩니다. R002는 Monitor를 Tier 3 도구로 분류합니다(`.claude/rules/MUST-permissions.md:11`, 주석 밖 표 행). 추적되는 프로젝트 settings와 그 `templates/` 미러에는 `env` 키가 없습니다(`for f in .claude/settings.json templates/.claude/settings.json; do git show "HEAD:$f" | jq 'has("env")'; done` = `false`, `false`). `git grep -n -E 'CLAUDE_CODE_USE_(BEDROCK|VERTEX|FOUNDRY)|DISABLE_TELEMETRY|DISABLE_NONESSENTIAL_TRAFFIC' HEAD -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'`의 출력은 15줄이며, 그중 `CLAUDE_CODE_USE_` 히트는 없습니다. 15줄의 내역은 다음과 같습니다. `.claude/skills/monitoring-setup/SKILL.md`의 4줄 중 `:251`·`:253`은 변수 설명 표이고, `:262`·`:264`는 "Enterprise Configuration" 예시의 `env` 블록에서 `DISABLE_TELEMETRY`와 `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`를 `"1"`로 둡니다. `.claude/skills/skills-sh-search/SKILL.md:211`은 skills CLI 텔레메트리를 끄려면 `DISABLE_TELEMETRY=1`을 설정하라고 안내합니다. `guides/claude-code/13-cli-flags.md:141`·`:143`은 변수 설명 표이고, `docs/superpowers/plans/2026-03-29-v0.65.0-release.md:29`는 계획 문서의 작업 항목입니다. 나머지 7줄은 앞의 세 파일(`monitoring-setup` 4줄, `skills-sh-search` 1줄, `13-cli-flags.md` 2줄)의 `templates/` 미러입니다. Enterprise Configuration 예시를 적용한 환경은 이 릴리즈부터 Monitor 도구를 받고 긴 foreground sleep도 차단되는 조건에 들어갑니다 [가설 — 이 예시를 실제로 적용한 사용자 환경은 미관측]. `skills-sh-search`의 안내를 따라 Claude Code가 실행되는 셸에 `DISABLE_TELEMETRY=1`을 export하는 것도 같은 조건에 들어가는 또 하나의 경로일 수 있습니다 [가설 — CC가 그 셸 변수를 텔레메트리 비활성 조건으로 읽는지와 사용자의 export 여부는 미관측]. foreground sleep 쪽은 `git grep -n -P '(?<![A-Za-z_])sleep(?![A-Za-z_])' HEAD -- .claude/skills .claude/hooks .claude/agents`로 재면 30줄이 걸립니다. 그중 셸 `sleep` 명령은 agora 스크립트 watchdog의 `( sleep "$secs"; kill -TERM -- "-$pid" 2>/dev/null ) &` 2줄(`.claude/skills/agora/scripts/judge.sh:140`, `.claude/skills/agora/scripts/reviewers.sh:106`)입니다. 나머지 28줄은 같은 두 스크립트의 주석 6줄, `.claude/skills/claude-code-bible/scripts/fetch-docs.js`의 JS `sleep` 함수 2줄, `fastapi-best-practices`·`java-best-practices` 문서의 Python·Java `sleep` 언급 3줄, `systematic-debugging`의 TS 예시와 임의 대기 반패턴 서술 15줄, 워크플로 스크립트 사본에서 `sleep`을 무력화하라는 `.claude/skills/pipeline/workflows/auto-dev.yaml` 서술 2줄입니다. 숫자 인자만 찾는 ERE `git grep -n -E '(^|[^a-zA-Z_])sleep [0-9]' HEAD -- .claude/skills .claude/hooks .claude/agents`는 이 변수 인자 형태를 놓쳐 출력이 없습니다(rc=1). agora watchdog의 `sleep`은 스크립트 안에서 `&`로 띄운 서브셸에 있으며, 이 차단이 스크립트 안의 그런 sleep에도 적용되는지는 관측하지 않았습니다 [가설 — Bedrock·Vertex·Foundry나 텔레메트리·비필수 트래픽을 끈 환경에서 agora를 실행해 watchdog 서브셸의 sleep이 차단되는지 확인하면 판정].
2873
+
2874
+ ### 컨텍스트 · compaction · 무인(`-p`) 실행
2875
+
2876
+ - CHANGELOG 원문: "Fixed compaction after a "Prompt is too long" error keeping too much of a conversation with dense text, such as base64 or SVG, so the next request could fail again"
2877
+ (310) "Prompt is too long" 오류 뒤의 compaction이 base64나 SVG처럼 밀도 높은 텍스트가 든 대화를 너무 많이 남겨, 다음 요청이 다시 실패할 수 있던 결함이 수정되었습니다. 룰에서는 예컨대 R013 노트(`.claude/rules/SHOULD-ecomode.md:99`, `:101`, 주석 밖 본문 줄)가 같은 오류 계열의 compaction 수정을 기록합니다. 이 가이드에서 원문 인용 줄에 "Prompt is too long"이 들어간 항목은, 이 절을 넣기 전(HEAD 5600fc87) 기준으로 (284)(288)(290)(302)(304) 5건입니다(`git show HEAD:guides/claude-code/15-version-compatibility.md | command grep -n -F 'CHANGELOG 원문: "' | command grep -F 'Prompt is too long'` = 5줄). 이 저장소에서는 `diagram-design` 스킬이 SVG 다이어그램 생성을 목적으로 합니다(`.claude/skills/diagram-design/SKILL.md:3`). 이 스킬로 SVG 텍스트가 많이 쌓인 대화에서 "Prompt is too long" 오류 뒤 compaction을 거친 다음 요청이 다시 실패했다면 구버전의 이 결함이 원인 후보입니다 [가설 — 해당 스킬을 쓴 세션에서 그런 재실패 사례는 미관측]. R013의 임계값 정의는 바뀌지 않습니다.
2878
+ - CHANGELOG 원문: "Improved memory use of non-interactive sessions (`-p`, Agent SDK) during compaction when the transcript file is very large"
2879
+ (310) 트랜스크립트 파일이 매우 클 때 비대화형 세션(`-p`, Agent SDK)이 compaction 중 쓰는 메모리가 개선되었습니다. `/fsd`는 무인(`claude -p`, 예약 실행) 세션에서 `/goal`·`/loop` 경로를 권장하고(`.claude/skills/fsd/SKILL.md:172`), `claude -p` 경로에서는 env `OMCUSTOM_UNATTENDED=1`을 쓰도록 안내합니다(`:133`). R013은 메모리 사용량이 치명적일 때의 가시적 경고(v2.1.274)를 기록합니다(`.claude/rules/SHOULD-ecomode.md:101`, 주석 밖 본문 줄). 장기 `-p` 실행에서 트랜스크립트 파일이 매우 커지면 이 개선이 해당할 수 있으나, CHANGELOG는 "very large"의 기준을 밝히지 않습니다 [가설 — 트랜스크립트 파일이 매우 큰 장기 `-p` `/fsd` 실행에서 compaction 시점 메모리를 2.1.310 전후로 비교하면 판정]. 룰 변경은 필요하지 않습니다.
2880
+
2881
+ ### 권한 · permission mode · settings
2882
+
2883
+ - CHANGELOG 원문: "Improved auto mode's prompt before the first read outside the working directories: it now says when blocking those reads makes shell commands ask for permission"
2884
+ (310) auto mode에서 작업 디렉토리 밖의 첫 읽기 전에 표시되는 프롬프트가 개선되어, 그런 읽기를 차단하면 셸 명령이 권한을 요청하게 되는 경우 이제 그 사실을 알려 줍니다. R002의 v2.1.257 노트는 HTML 주석 안의 DETAIL 블록(자동 주입되지 않음)에 있으며(`.claude/rules/MUST-permissions.md:113`, 주석 시작 `:85`), auto mode에서 작업 디렉토리 밖 첫 파일 읽기 전에 1회 프롬프트를 표시하고 그런 읽기를 차단하는 동작을 `permissions.blockReadsOutsideWorkingDirectories` 설정의 동작으로 서술합니다. 같은 DETAIL 블록에는 이 설정과 셸 명령을 함께 다룬 기록이 더 있습니다. v2.1.271 노트의 (d)(`:125`, HTML 주석 안)는 디렉토리 변경 2회, 서브셸, `cd`+`git` 체인을 가진 명령이 bypass·auto 모드의 이 설정에서 프롬프트를 건너뛰던 결함의 수정을 기록합니다. v2.1.273/274 노트의 (273) 항목(`:127`, HTML 주석 안)은 권한 검사기가 완전히 분석할 수 없는 Bash 명령이 이 설정에서 프롬프트를 건너뛰던 결함의 수정을 기록합니다. 추적되는 프로젝트 settings와 그 `templates/` 미러에는 이 설정이 없습니다(`for f in .claude/settings.json templates/.claude/settings.json; do git show "HEAD:$f" | jq '(.permissions // {}) | has("blockReadsOutsideWorkingDirectories")'; done` = `false`, `false`). `for f in .claude/settings.json templates/.claude/settings.json; do git show "HEAD:$f" | jq -c '{defaultMode: (.permissions.defaultMode // "unset"), has: ((.permissions // {}) | has("defaultMode"))}'; done`의 출력은 `{"defaultMode":"bypassPermissions","has":true}`, `{"defaultMode":"unset","has":false}`이므로, 추적되는 프로젝트 settings의 `permissions.defaultMode`는 `bypassPermissions`이고 `templates/` 미러에는 이 키가 없습니다. R010은 2.1.257부터 프로젝트·로컬의 `bypassPermissions`가 무시된다고 기록하고, `claude -p` 실측(CC 2.1.289)으로 그 결과를 두 갈래로 나눕니다. 사용자 값이 `bypassPermissions`가 아니면(`plan`/`auto`/`acceptEdits`) 무시된 범위가 `default`로 귀결되어 사용자 값을 덮고, 사용자 값이 `bypassPermissions`이면 결과가 `bypassPermissions`로 남습니다. 대화형 TTY 세션의 유효 모드는 R010이 `[가설]`로 남겨 두었습니다(`.claude/rules/MUST-orchestrator-coordination.md:588`, 주석 밖 본문 줄). 사용자·managed settings와 실행 플래그는 저장소 밖에 있으므로, 이 프롬프트가 이 저장소 세션에서 표시되는지는 관측하지 않았습니다 [가설 — 설정을 켠 auto mode 세션에서 작업 디렉토리 밖을 처음 읽을 때 문구를 확인하면 판정].
2885
+ - CHANGELOG 원문: "Fixed file read permission prompts not showing where a symbolic link leads"
2886
+ (310) 파일 읽기 권한 프롬프트가 심볼릭 링크의 대상 위치를 보여 주지 않던 결함이 수정되었습니다. 쓰기 쪽의 같은 계열 수정은 이 가이드의 (280) 항목이 기록하며, 그 수정의 결과는 두 가지입니다. 하나는 심볼릭 링크 경로를 통한 쓰기에서 프롬프트가 실제 쓰기 위치를 표시하는 것이고, 다른 하나는 `acceptEdits`·allow 규칙·auto mode가 밖에 떨어지는 쓰기를 더 이상 승인하지 않는 것입니다. 관측한 범위에서 이 저장소의 추적 심볼릭 링크는 `docs/plans/refs/latest` 1개이며(`git ls-files -s | awk '$1=="120000"{print $4}'`), 대상은 저장소 안의 상대 경로 `../2025-01-25`입니다(`git cat-file -p HEAD:docs/plans/refs/latest`). 이 수정의 대상은 프롬프트에 표시되는 내용이며, `.claude/settings.json`의 `permissions` 규칙은 바뀌지 않습니다.
2887
+ - CHANGELOG 원문: "Fixed background cleanup deleting some recent files, such as pasted images, when `cleanupPeriodDays` is set to a very large value"
2888
+ (310) `cleanupPeriodDays`를 매우 큰 값으로 설정했을 때 백그라운드 정리가 붙여 넣은 이미지 같은 최근 파일 일부를 지우던 결함이 수정되었습니다. 추적되는 프로젝트 settings와 그 `templates/` 미러에는 `cleanupPeriodDays`가 없습니다(`for f in .claude/settings.json templates/.claude/settings.json; do git show "HEAD:$f" | jq 'has("cleanupPeriodDays")'; done` = `false`, `false`). 저장소 안에서는 `git grep -n cleanupPeriodDays HEAD -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'`의 히트가 R011의 HTML 주석 안 DETAIL 블록(자동 주입되지 않음, 주석 시작 `.claude/rules/SHOULD-memory-integration.md:551`)에 있는 노트(`:552`)와 그 `templates/` 미러, `wiki/rules/r011.md:142` 사본의 서술 3건이며, 이 키를 설정하는 추적 파일은 이 출력에 없습니다. 따라서 저장소 설정 범위에서는 결함 조건(매우 큰 값 설정)이 관측되지 않았습니다. 사용자 settings의 값은 저장소 밖이므로 이 결론에 넣지 않습니다.
2889
+
2890
+ ### MCP
2891
+
2892
+ - CHANGELOG 원문: "Changed the error for an MCP tool call that times out in a non-interactive session while the server's elicitation is unanswered: it now tells Claude that no answer came and not to repeat the call"
2893
+ (310) 비대화형 세션에서 서버의 elicitation에 답이 없는 채로 MCP 도구 호출이 타임아웃되면, 이제 오류가 Claude에게 답이 오지 않았다는 사실과 호출을 반복하지 말라는 지시를 함께 알려 줍니다. 이 저장소의 `.mcp.json`은 `ontology-rag`(stdio, 명령 `.venv/bin/python -m ontology_rag.mcp_server`)와 `eraser`(http, `https://app.eraser.io/api/mcp`) 두 서버를 둡니다(`git show HEAD:.mcp.json | jq -c '.mcpServers | to_entries[] | {name: .key, type: .value.type, command: .value.command, args: .value.args, url: .value.url}'`). `ontology-rag`의 서버 소스는 추적 파일 `packages/ontology-rag/src/ontology_rag/mcp_server.py`이며, `git grep -n -i elicit HEAD -- packages`는 출력이 없었습니다(rc=1). 따라서 추적 소스 범위에서 `ontology-rag`가 elicitation을 요청하는 코드는 관측되지 않았습니다. `.venv`에 설치된 실행본이 이 추적 소스와 같은지는 기기 로컬 상태라 확인하지 않았습니다. 원격 http 서버 `eraser`가 elicitation을 요청하는지는 관측하지 않았습니다 [가설 — 서버 동작이나 `-p` 실행 로그로 판정]. 추적되는 프로젝트 settings와 그 `templates/` 미러에는 `Elicitation`·`ElicitationResult` 훅 키가 없습니다(`for f in .claude/settings.json templates/.claude/settings.json; do git show "HEAD:$f" | jq -c '.hooks | {Elicitation: has("Elicitation"), ElicitationResult: has("ElicitationResult")}'; done` = 두 줄 모두 `{"Elicitation":false,"ElicitationResult":false}`). 저장소 전체로 넓힌 `git grep -l -i elicit HEAD -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'`의 히트 파일 8개는 R006 훅 카탈로그(`.claude/rules/MUST-agent-design.md`, 히트 줄은 HTML 주석 안)와 그 `templates/` 미러, `tests/unit/core/` 테스트 4개, `wiki/guides/claude-code.md`, `wiki/rules/r006.md`입니다. R004의 Retryable 행은 "Retry up to 3x with backoff (1s, 2s, 4s), then report"를 규정합니다(`.claude/rules/SHOULD-error-handling.md:25`, 주석 밖 표 행). 새 오류 문구는 같은 호출을 반복하지 말라고 지시하므로, `-p` 무인 실행에서 elicitation 미응답 타임아웃 오류를 받으면 R004의 Retryable 행보다 Non-recoverable 행(`:26`)으로 다루는 편이 문구와 맞습니다 [가설 — 이 오류를 실제로 받은 사례는 미관측]. 이 문서는 룰 반영 여부를 정하지 않습니다.
2894
+
2895
+ 기타 19건 — 이 저장소 비해당(일부 gateway·호환 서버가 `effort-2025-11-24` beta 값이나 대화 중간 system 메시지를 거부할 때 그것들 없이 다시 시도하는 수정, 긴 편집 뒤 외부 편집기를 닫는 순간 질문의 auto-continue 타임아웃이 발화하던 터미널 UI 결함, Git Bash가 없고 훅 명령이 따옴표 문자열뿐일 때 PreToolUse·PermissionRequest 훅이 도구 호출을 통과시키던 Windows 전용 결함, mod `Image` 렌더링, AppArmor 제한이 bubblewrap의 샌드박스 시작을 막을 때 Linux `/sandbox`가 표시하는 안내, `[VSCode]` 2건, `[Cloud sessions]` 7건, `[Claude Tag]` 3건, `[Code Review]` 2건). 실측: `gh release view v2.1.310 --repo anthropics/claude-code --json body --jq .body | grep -c '^- '` = 26건 중 위 본문 7건을 다뤘으므로 26 − 7 = 19건입니다. 계수 범위는 해당 릴리즈 노트의 최상위 불릿 줄(`- `로 시작하는 줄)입니다.
2896
+
2897
+ **Action items**:
2898
+ - 이 릴리즈의 본문 7건은 다음과 같습니다. 추가 1건은 Bedrock·Vertex·Foundry에서, 그리고 텔레메트리나 비필수 트래픽을 끈 경우의 Monitor 도구·플러그인 monitor 제공과 그 환경의 긴 foreground sleep 차단입니다. 결함 수정 3건은 "Prompt is too long" 오류 뒤 dense text 대화의 compaction, 심볼릭 링크 대상을 보여 주지 않던 파일 읽기 권한 프롬프트, `cleanupPeriodDays`가 매우 클 때 최근 파일 일부를 지우던 백그라운드 정리입니다. 개선 2건은 트랜스크립트 파일이 매우 클 때 비대화형 세션의 compaction 메모리, 그리고 auto mode의 작업 디렉토리 밖 첫 읽기 프롬프트입니다. 변경 1건은 비대화형 세션에서 elicitation 미응답으로 타임아웃된 MCP 도구 호출의 오류 문구입니다. 위 항목별 측정(`git show HEAD:`·`jq`·`git grep`·`git cat-file`) 범위에서 추적되는 저장소 설정(`.claude/settings.json`, `templates/.claude/settings.json`, `.mcp.json`)을 바꿔야 하는 항목은 찾지 못했습니다(R016: CC 지식은 이 가이드에 두고 룰 파일에는 행동 변화가 필요할 때만 1줄).
2899
+ - 후속 실측 후보(본문 `[가설]` 8개에 대응): (1) Bedrock·Vertex·Foundry나 텔레메트리·비필수 트래픽을 끈 환경에서 Monitor 도구 제공과 긴 foreground sleep 차단을 확인합니다. 이때 `monitoring-setup` 스킬의 Enterprise Configuration 예시(`.claude/skills/monitoring-setup/SKILL.md:262`~`:264`)를 적용한 경로와 `skills-sh-search`의 `DISABLE_TELEMETRY=1` 안내(`.claude/skills/skills-sh-search/SKILL.md:211`)를 셸에 export한 경로를 함께 보고, agora watchdog 서브셸의 `sleep`(`.claude/skills/agora/scripts/judge.sh:140`, `.claude/skills/agora/scripts/reviewers.sh:106`)이 차단되는지도 확인합니다. (2) `diagram-design`으로 SVG 텍스트가 많이 쌓인 대화에서 "Prompt is too long" 오류 뒤 compaction을 거친 다음 요청이 다시 실패하는지 확인합니다. (3) 트랜스크립트 파일이 매우 큰 장기 `-p` `/fsd` 실행에서 compaction 시점 메모리를 2.1.310 전후로 비교합니다. (4) `permissions.blockReadsOutsideWorkingDirectories`를 켠 auto mode 세션에서 작업 디렉토리 밖 첫 읽기 프롬프트의 문구를 확인합니다. (5) 원격 http 서버 `eraser`가 elicitation을 요청하는지 확인합니다. (6) 비대화형 세션에서 elicitation 미응답 타임아웃 오류를 실제로 받은 사례가 있는지 확인합니다.
2900
+ - (310) 항목 중 `[가설 — …]` 표기는 판정 기준을 충족하는 측정이 이루어지기 전에는 결론으로 쓰지 않습니다.
2901
+
2312
2902
  ## Known Platform Issues & Workarounds
2313
2903
 
2314
2904
  ### Agent tool malformed parsing on long / special-character prompts (#1241)
@@ -2369,6 +2959,18 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2369
2959
  - #1848 — Claude Code v2.1.294 compatibility documentation
2370
2960
  - #1850 — Claude Code v2.1.295 compatibility documentation
2371
2961
  - #1851 — Claude Code v2.1.296 compatibility documentation
2962
+ - #1861 — Claude Code v2.1.299 compatibility documentation
2963
+ - #1862 — Claude Code v2.1.300 compatibility documentation
2964
+ - #1863 — Claude Code v2.1.301 compatibility documentation
2965
+ - #1864 — Claude Code v2.1.302 compatibility documentation
2966
+ - #1865 — Claude Code v2.1.303 compatibility documentation
2967
+ - #1866 — Claude Code v2.1.304 compatibility documentation
2968
+ - #1868 — Claude Code v2.1.305 compatibility documentation
2969
+ - #1867 — Claude Code v2.1.306 compatibility documentation
2970
+ - #1870 — Claude Code v2.1.307 compatibility documentation
2971
+ - #1869 — Claude Code v2.1.308 compatibility documentation
2972
+ - #1871 — Claude Code v2.1.309 compatibility documentation
2973
+ - #1872 — Claude Code v2.1.310 compatibility documentation
2372
2974
  - `.claude/skills/claude-native/` — auto-generation source
2373
2975
  - `.claude/rules/SHOULD-hud-statusline.md` — R012 statusline integration
2374
2976
  - `.claude/rules/MUST-agent-design.md` — R006 agent frontmatter spec
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.0.2",
2
+ "version": "2.0.4",
3
3
  "lastUpdated": "2026-10-06",
4
4
  "omcustomMinClaudeCode": "2.1.121",
5
5
  "omcustomMinClaudeCodeReason": "Sensitive-path direct Write/Edit on .claude/** under bypassPermissions (R010 deprecation, #1101)",