oh-my-customcode 2.0.2 → 2.0.3

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.3",
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.3",
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.3",
7
7
  "description": "Batteries-included agent harness for Claude Code",
8
8
  "type": "module",
9
9
  "bin": {
@@ -2309,6 +2309,406 @@ 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
+
2312
2712
  ## Known Platform Issues & Workarounds
2313
2713
 
2314
2714
  ### Agent tool malformed parsing on long / special-character prompts (#1241)
@@ -2369,6 +2769,13 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2369
2769
  - #1848 — Claude Code v2.1.294 compatibility documentation
2370
2770
  - #1850 — Claude Code v2.1.295 compatibility documentation
2371
2771
  - #1851 — Claude Code v2.1.296 compatibility documentation
2772
+ - #1861 — Claude Code v2.1.299 compatibility documentation
2773
+ - #1862 — Claude Code v2.1.300 compatibility documentation
2774
+ - #1863 — Claude Code v2.1.301 compatibility documentation
2775
+ - #1864 — Claude Code v2.1.302 compatibility documentation
2776
+ - #1865 — Claude Code v2.1.303 compatibility documentation
2777
+ - #1866 — Claude Code v2.1.304 compatibility documentation
2778
+ - #1868 — Claude Code v2.1.305 compatibility documentation
2372
2779
  - `.claude/skills/claude-native/` — auto-generation source
2373
2780
  - `.claude/rules/SHOULD-hud-statusline.md` — R012 statusline integration
2374
2781
  - `.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.3",
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)",