oh-my-customcode 2.0.4 → 2.0.5

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.
@@ -1796,15 +1796,15 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
1796
1796
  ### 권한 · auto mode · rm
1797
1797
 
1798
1798
  - CHANGELOG 원문: "Fixed auto mode denials pointing Claude at a Bash permission rule when the blocked tool was not Bash"
1799
- (288) 차단된 도구가 Bash가 아닌데도 auto mode 거부 메시지가 Bash 권한 규칙을 가리키던 결함이 수정되었습니다. 관측한 범위에서 사용자 scope 유효 permission mode는 `auto`(`jq -r '.permissions.defaultMode // "unset"' ~/.claude/settings.json`)이므로 직접 관련됩니다. R001의 classifier 차단 후 재시도 금지 취지와 R010 STOP Protocol의 진단 정확도가 높아질 뿐 규범은 그대로입니다.
1799
+ (288) 차단된 도구가 Bash가 아닌데도 auto mode 거부 메시지가 Bash 권한 규칙을 가리키던 결함이 수정되었습니다. 이 저장소가 추적하는 프로젝트 settings의 `defaultMode`는 `bypassPermissions`이고(`git show HEAD:.claude/settings.json | jq -r '.permissions.defaultMode'`), R010 「Universal bypassPermissions」에 따르면 2.1.257부터 project·local의 이 값은 무시되어 그 범위가 `default`로 귀결하며, bypass가 아닌 user 값(`auto` 포함)을 덮습니다(`.claude/rules/MUST-orchestrator-coordination.md:588`, `claude -p` init `permissionMode` 실측, CC 2.1.289). 작성 기기에서는 사용자 scope `defaultMode`가 `auto`로 관측되었으나(`jq -r '.permissions.defaultMode // "unset"' ~/.claude/settings.json`; 기기별 설정이라 저장소 사실이 아닙니다), 이 규칙대로라면 그 기기의 `claude -p` 세션은 local·managed 설정이나 실행 플래그가 다른 모드를 정하지 않는 한 auto mode가 아니라 `default`로 시작합니다. 대화형 TTY 세션의 유효 모드는 R010이 `-p` 결과와 조정하지 않은 `[가설]`이므로, 이 수정은 auto mode가 실제로 활성인 세션에 한해 관련됩니다. R001의 classifier 차단 후 재시도 금지 취지와 R010 STOP Protocol의 진단 정확도가 높아질 뿐 규범은 그대로입니다.
1800
1800
  - CHANGELOG 원문: "Improved auto mode: when a conversation grows too long for the client-side safety classifier to review, it is now compacted instead of prompting for, or failing, every tool call"
1801
- (288) auto mode에서 대화가 클라이언트 측 안전 classifier가 검토하기에 너무 길어지면 모든 도구 호출을 묻거나 실패시키는 대신 compact됩니다. 유효 모드가 `auto`인 이 저장소의 긴 세션에 해당합니다. 구버전의 긴 세션에서 도구 호출 거부·프롬프트가 있었다면 모델 규칙 위반으로만 귀속할 수 없습니다 [가설 — 해당 거부·프롬프트가 실제로 있었는지 미관측]. R002·R021 문안 변경은 없습니다.
1801
+ (288) auto mode에서 대화가 클라이언트 측 안전 classifier가 검토하기에 너무 길어지면 모든 도구 호출을 묻거나 실패시키는 대신 compact됩니다. 이 저장소의 긴 세션 중 auto mode가 실제로 활성인 세션에만 해당합니다(바로 위 항목의 R010 판정 — 이 저장소처럼 project에 `bypassPermissions`가 있고 local·managed 설정이나 실행 플래그가 다른 모드를 정하지 않으며 user 값이 bypass가 아닐 때 `claude -p`는 `default`로 시작, 대화형 세션은 `[가설]`). 구버전의 긴 auto mode 세션에서 도구 호출 거부·프롬프트가 있었다면 모델 규칙 위반으로만 귀속할 수 없습니다 [가설 — 해당 거부·프롬프트가 실제로 있었는지 미관측]. R002·R021 문안 변경은 없습니다.
1802
1802
  - CHANGELOG 원문: "Changed the client-side auto mode classifier to ignore an `ANTHROPIC_DEFAULT_SONNET_MODEL` pin that names Claude Sonnet 5.5 or Opus 5.5 and use Claude Sonnet 5 instead"
1803
1803
  (288) 클라이언트 측 auto mode classifier는 Claude Sonnet 5.5 또는 Opus 5.5를 가리키는 `ANTHROPIC_DEFAULT_SONNET_MODEL` 고정을 무시하고 Claude Sonnet 5를 사용합니다. 관측한 범위에서 프로젝트 `.claude/settings.json`에 `env`가 없고 `.claude/settings.local.json`의 env 키는 `CLAUDE_COST_CAP`뿐이어서 이 env 고정은 쓰이지 않습니다(사용자 scope는 미관측). 이 저장소의 에이전트 핀은 frontmatter의 Tier 2 전체 ID(R006)이며, auto mode classifier가 에이전트 핀과 무관한 모델로 동작한다는 점은 R006 모델 설명의 맥락 정보입니다.
1804
1804
  - CHANGELOG 원문: "Fixed Bash tool permission check to prompt before a `BASHPID` assignment whose value the shell would evaluate as arithmetic, instead of allowing it silently"
1805
1805
  (288) 셸이 산술식으로 평가할 값을 가진 `BASHPID` 할당을 조용히 허용하지 않고 먼저 확인합니다. R002 Bash 티어(Tier 4 승인) 방향의 플랫폼 수정이며 티어 정책은 바뀌지 않습니다. 저장소에 `BASHPID` 할당 사용은 관측되지 않았습니다.
1806
1806
  - CHANGELOG 원문: "Fixed a dangerous `rm` (such as one on `/` or the home directory) inside a `bash -c` or `sh -c` script running without a prompt in bypassPermissions mode or under a shell allow rule (anthropics/claude-code#96300)"
1807
- (288) `bash -c`·`sh -c` 스크립트 안의 위험한 `rm`(예: `/`나 홈 디렉터리 대상)이 bypassPermissions 모드나 셸 allow 규칙 아래에서 프롬프트 없이 실행되던 결함이 수정되었습니다. 이 수정은 (287)의 `rm` 안전장치 수정이 스크립트 래퍼로 확장된 것이며, 가장 직접적인 선행 노트는 R001의 (261) 노트(positional parameter와 큰따옴표 `sh -c` 내부 `rm -rf`까지 확인을 확장)와 (273) 노트(bypass 모드 subshell 안의 `rm`)입니다. 관측한 범위에서 프로젝트 settings.json에는 `Bash(rm:*)` allow와 `defaultMode: bypassPermissions`(R010에 따라 2.1.257부터 프로젝트 scope에서는 무시됩니다)가 있고 `Bash(bash:*)`·`Bash(sh:*)` allow는 없으며, 유효 모드(사용자 scope)는 `auto`입니다. R001 문안 변경은 없고, 이 플랫폼 가드는 R001의 위임 전 blast-radius 열거를 대체하지 않습니다.
1807
+ (288) `bash -c`·`sh -c` 스크립트 안의 위험한 `rm`(예: `/`나 홈 디렉터리 대상)이 bypassPermissions 모드나 셸 allow 규칙 아래에서 프롬프트 없이 실행되던 결함이 수정되었습니다. 이 수정은 (287)의 `rm` 안전장치 수정이 스크립트 래퍼로 확장된 것이며, 가장 직접적인 선행 노트는 R001의 (261) 노트(positional parameter와 큰따옴표 `sh -c` 내부 `rm -rf`까지 확인을 확장)와 (273) 노트(bypass 모드 subshell 안의 `rm`)입니다. 관측한 범위에서 프로젝트 settings.json에는 `Bash(rm:*)` allow와 `defaultMode: bypassPermissions`(R010에 따라 2.1.257부터 프로젝트 scope에서는 무시됩니다)가 있고 `Bash(bash:*)`·`Bash(sh:*)` allow는 없습니다. 프로젝트 scope의 `bypassPermissions`가 무시되므로 이 저장소의 추적 설정만으로는 bypassPermissions 모드가 되지 않으며, 유효 모드는 local·user·managed 설정과 실행 플래그에 따라 기기마다 다릅니다(R010 「Universal bypassPermissions」, `.claude/rules/MUST-orchestrator-coordination.md:588`). R001 문안 변경은 없고, 이 플랫폼 가드는 R001의 위임 전 blast-radius 열거를 대체하지 않습니다.
1808
1808
  - CHANGELOG 원문: "Changed the background command time limit to apply only in unattended sessions (`-p`, Agent SDK, CI, cloud); terminal, desktop app and VS Code sessions have no limit"
1809
1809
  (288) 백그라운드 명령 시간 제한이 무인 세션(`-p`, Agent SDK, CI, cloud)에만 적용되고, 터미널·데스크톱 앱·VS Code 세션에는 제한이 없습니다. 이 가이드 (285) 절의 백그라운드 시간 제한 항목("(288) 이후 이 제한은 좁혀졌습니다"로 이 불릿을 인용)과 이어지며, 룰 변경은 없습니다.
1810
1810
 
@@ -1933,16 +1933,16 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
1933
1933
  - CHANGELOG 원문: "Fixed resumed subagents and teammates losing their earlier thinking and prompt cache after receiving a message mid-run"
1934
1934
  (290) 재개된 서브에이전트와 teammate가 실행 중 메시지를 받은 뒤 이전 thinking과 prompt cache를 잃던 결함이 수정되었습니다. 원문의 발생 조건은 "after receiving a message mid-run"(실행 중 메시지 수신)입니다. 멈춘 위임을 `SendMessage`로 재개하는 R020 절차(`.claude/rules/MUST-completion-verification.md:120`)가 이 조건에 해당하는지는 [가설 — 재개 메시지가 원문의 실행 중 수신으로 처리되는지 미실측]이며, 효과 크기도 [가설 — 재개 전후 prompt_cache 필드를 R012 상태줄로 실측하면 판정]입니다.
1935
1935
  - CHANGELOG 원문: "Fixed background agents failing with "Agent stalled" and Workflow tool subagents restarting from their prompt when a Mac woke from sleep"
1936
- (290) Mac이 절전에서 깨어날 때 백그라운드 에이전트가 "Agent stalled"로 실패하고 Workflow 도구의 서브에이전트가 프롬프트부터 다시 시작되던 결함이 수정되었습니다. 이 저장소의 개발 환경은 macOS(Darwin)이므로 `/fsd` 장기 루프의 절전 후 중단 진단 시 이 축을 확인 대상에 포함합니다. R018의 정체 멤버 재할당 규칙(`.claude/rules/MUST-agent-teams.md:349`의 "Reassign (>2min)", `:568`의 "~2분간 진행이 없으면") 문안은 바뀌지 않습니다.
1936
+ (290) Mac이 절전에서 깨어날 때 백그라운드 에이전트가 "Agent stalled"로 실패하고 Workflow 도구의 서브에이전트가 프롬프트부터 다시 시작되던 결함이 수정되었습니다. 원문의 조건은 Mac이 절전에서 깨어날 때이므로, Mac에서 돌린 `/fsd` 장기 루프의 절전 후 중단을 진단할 때 이 축을 확인 대상에 포함합니다(개발 기기의 OS는 기기별 사항이라 저장소 사실로 단정하지 않습니다). R018의 정체 멤버 재할당 규칙(`.claude/rules/MUST-agent-teams.md:349`의 "Reassign (>2min)", `:568`의 "~2분간 진행이 없으면") 문안은 바뀌지 않습니다.
1937
1937
 
1938
1938
  ### 예약 작업 · 백그라운드 세션 (/loop)
1939
1939
 
1940
1940
  - CHANGELOG 원문: "Fixed scheduled tasks (`/loop` with an interval, reminders) silently not coming back on resume once the conversation was compacted; covers compactions made from this version on"
1941
1941
  (290) 대화가 compact된 뒤 resume하면 `/loop` 간격 작업과 reminder가 조용히 돌아오지 않던 결함이 수정되었으며, 적용 범위는 이 버전부터 수행한 compaction입니다. 과거에 compact된 세션까지 복구된다고 확장하지 않습니다. 원문의 대상은 간격을 둔 `/loop`와 reminder이며, `/fsd`의 `/loop`는 간격 없이 모델이 주기를 정하는 self-paced 루프입니다(`.claude/skills/fsd/SKILL.md:16`, `:39` "self-paced loop (model decides cadence)"; `:162`는 스킬 호출이 필수가 아니라고 명시). CHANGELOG는 self-paced 루프를 따로 부르기도 하므로(2.1.295 "a self-paced `/loop`") 이 수정이 `/fsd`의 루프에도 적용되는지는 [가설 — self-paced `/loop` 세션을 compact한 뒤 resume해 루프가 돌아오는지 실측하면 판정]입니다.
1942
1942
  - CHANGELOG 원문: "Fixed scheduled tasks set in the foreground never firing after a ← or `/background` hand-off, and recurring ones firing an extra run on every resume, respawn or fork"
1943
- (290) foreground에서 설정한 예약 작업이 ← 또는 `/background` hand-off 뒤 발화하지 않던 결함과, 반복 작업이 resume·respawn·fork마다 추가로 한 번 더 실행되던 결함이 수정되었습니다. `.claude/settings.json`에는 예약 관련 설정이 없습니다(`command grep -c -E 'ScheduleWakeup|CronCreate' .claude/settings.json` 결과 0). 관측한 범위(`git grep -n -E 'CronCreate|ScheduleWakeup|/schedule' -- '.claude/skills/*/SKILL.md'`와 `/fsd`의 `/loop` 줄)에서 플랫폼 예약 기능을 언급하는 스킬 경로는 두 가지입니다. 하나는 `/fsd`의 선택적 `/loop`·ScheduleWakeup 호출(`.claude/skills/fsd/SKILL.md:16`, `:162`)이고, 다른 하나는 `claude-native` 스킬의 예약 실행 안내(`.claude/skills/claude-native/SKILL.md:232` "### Scheduled (CronCreate)", `:237`의 `/schedule "daily at 9am: /claude-native"`, `:240` "Or via CronCreate MCP tool for programmatic scheduling.")입니다. `/schedule`은 `.claude/skills/claude-native/SKILL.md:234`("Can be set up as a scheduled remote agent using `/schedule`")가 말하는 scheduled remote agent를 만드는 경로이고, 2026-10-13 Claude Code 2.1.296 세션의 스킬 목록에서 `schedule` 스킬 설명도 이를 "scheduled cloud agents (routines)"로 소개합니다. 따라서 이 항목의 세션 예약 작업과 다를 수 있습니다 [가설 — `/schedule` routine이 세션 예약 작업 경로를 거치는지는 미관측]. `:240`의 CronCreate 경로는 `/schedule`과 별개로 CronCreate 도구로 예약을 만드는 안내이며, 이것이 이 항목의 세션 예약 작업에 해당하는지도 [가설 — 미관측]입니다. 두 스킬 경로의 실제 사용도 관측하지 않았습니다. `omcustom-loop`는 예약 기능을 언급하지 않습니다(`command grep -c -E '/loop|ScheduleWakeup|CronCreate' .claude/skills/omcustom-loop/SKILL.md` 결과 0). 이 스킬은 SubagentStop 훅을 이용한 자동 이어가기를 설명하며 현재 배선은 v2.1.294 절에 정리했습니다. 따라서 프로젝트 변경은 필요하지 않습니다.
1943
+ (290) foreground에서 설정한 예약 작업이 ← 또는 `/background` hand-off 뒤 발화하지 않던 결함과, 반복 작업이 resume·respawn·fork마다 추가로 한 번 더 실행되던 결함이 수정되었습니다. 관측한 범위(`git show HEAD:.claude/settings.json | command grep -n -i -E 'schedul|cron|wakeup|loop|timer|interval|routine'` 5줄)에서 `.claude/settings.json`에 예약 작업 설정은 보이지 않았습니다. 일치한 5줄은 `statusLine.refreshInterval`, 훅 `description` 3개(수동 compaction 제안, 서브에이전트 완료 시 자동 이어가기, 반복 실패 루프 감지), `skillOverrides`의 `templates:omcustom-loop`이며, 이 핵심어를 쓰지 않는 키는 이 검색으로 판정하지 않았습니다. 관측한 범위(`git grep -n -E 'CronCreate|ScheduleWakeup|/schedule' -- '.claude/skills/*/SKILL.md'`와 `/fsd`의 `/loop` 줄)에서 플랫폼 예약 기능을 언급하는 스킬 경로는 두 가지입니다. 하나는 `/fsd`의 선택적 `/loop`·ScheduleWakeup 호출(`.claude/skills/fsd/SKILL.md:16`, `:162`)이고, 다른 하나는 `claude-native` 스킬의 예약 실행 안내(`.claude/skills/claude-native/SKILL.md:232` "### Scheduled (CronCreate)", `:237`의 `/schedule "daily at 9am: /claude-native"`, `:240` "Or via CronCreate MCP tool for programmatic scheduling.")입니다. `/schedule`은 `.claude/skills/claude-native/SKILL.md:234`("Can be set up as a scheduled remote agent using `/schedule`")가 말하는 scheduled remote agent를 만드는 경로이고, 2026-10-13 Claude Code 2.1.296 세션의 스킬 목록에서 `schedule` 스킬 설명도 이를 "scheduled cloud agents (routines)"로 소개합니다. 따라서 이 항목의 세션 예약 작업과 다를 수 있습니다 [가설 — `/schedule` routine이 세션 예약 작업 경로를 거치는지는 미관측]. `:240`의 CronCreate 경로는 `/schedule`과 별개로 CronCreate MCP 도구(`:240`의 "CronCreate MCP tool" 표기)로 예약을 만드는 안내이며, 이것이 이 항목의 세션 예약 작업에 해당하는지도 [가설 — 미관측]입니다. 두 스킬 경로의 실제 사용도 관측하지 않았습니다. `omcustom-loop`는 예약 기능을 언급하지 않습니다(`command grep -c -E '/loop|ScheduleWakeup|CronCreate' .claude/skills/omcustom-loop/SKILL.md` 결과 0). 이 스킬은 SubagentStop command 훅이 결과 기록·연속 완료 집계·advisory만 수행하고 오케스트레이터 워크플로를 이어가지 않는다고 설명하며(`.claude/skills/omcustom-loop/SKILL.md:3` "no orchestrator-workflow continuation"), 현재 배선은 v2.1.294 절에 정리했습니다. 따라서 프로젝트 변경은 필요하지 않습니다.
1944
1944
  - CHANGELOG 원문: "Fixed `/loop` and other recurring session-only scheduled tasks running an extra time after a sandboxed Bash command on Linux or after `.claude/scheduled_tasks.json` was deleted"
1945
- (290) Linux의 sandboxed Bash 명령 뒤, 또는 `.claude/scheduled_tasks.json`이 삭제된 뒤 `/loop` 등 세션 한정 반복 작업이 한 번 더 실행되던 결함이 수정되었습니다. 첫 조건에 대해서는 관측한 범위에서 `.claude/settings.json`에 `sandbox` 키가 없고(`jq 'has("sandbox")'`=false) 개발 환경이 macOS이므로 직접 영향 조건이 관측되지 않았습니다. 둘째 조건인 `.claude/scheduled_tasks.json` 삭제에 대해서는, 이 파일이 현재 없고(`ls` 결과 "No such file or directory") gitignore 대상이며(`git check-ignore -v .claude/scheduled_tasks.json` → `.gitignore:40:.claude/*`), 이 가이드·미러를 제외한 추적 파일 중 이 파일 이름을 언급하는 곳은 R009 v2.1.273 노트(`.claude/rules/MUST-parallel-execution.md:208`)와 그 `templates/` 미러·위키 사본이어서(`git grep -n scheduled_tasks`), 파일 이름 검색 범위에서는 이 파일을 직접 지우는 경로가 관측되지 않았습니다. 다만 디렉터리 단위 경로는 이 파일을 지울 수 있습니다. 기존 설치에서 `omcustom init`은 `install({ backup: exists })`를 호출하고(`src/cli/init.ts:205`), 백업 단계가 `.claude/`를 `.claude-backup-` 접두의 타임스탬프 폴더로 `rename`하며(`src/core/installer.ts:197`, `:933`, `:919`~`:925`; `src/core/layout.ts:28`, `:32`), 복원 대상 기본값은 `settings.json`·`settings.local.json`과 `agent-memory`·`agent-memory-local`입니다(`src/core/file-preservation.ts:25`, `:30`). R001이 승인을 요구하는 `git clean -fdx`도 gitignore 대상인 이 파일을 지웁니다.
1945
+ (290) Linux의 sandboxed Bash 명령 뒤, 또는 `.claude/scheduled_tasks.json`이 삭제된 뒤 `/loop` 등 세션 한정 반복 작업이 한 번 더 실행되던 결함이 수정되었습니다. 첫 조건에 대해서는 관측한 범위에서 `.claude/settings.json`에 `sandbox` 키가 없으므로(`jq 'has("sandbox")'`=false) 이 저장소의 추적 설정에서는 직접 영향 조건이 관측되지 않았습니다. Linux 기기 여부와 user·local·managed scope의 sandbox 설정은 기기별 사항이라 판정하지 않았습니다. 둘째 조건인 `.claude/scheduled_tasks.json` 삭제에 대해서는, 이 파일이 현재 없고(`ls` 결과 "No such file or directory") gitignore 대상이며(`git check-ignore -v .claude/scheduled_tasks.json` → `.gitignore:40:.claude/*`), 이 가이드·미러를 제외한 추적 파일 중 이 파일 이름을 언급하는 곳은 R009 v2.1.273 노트(`.claude/rules/MUST-parallel-execution.md:208`, `:197`에서 열린 HTML 주석 안)와 그 `templates/` 미러·위키 사본이어서(`git grep -n scheduled_tasks`), 파일 이름 검색 범위에서는 이 파일을 직접 지우는 경로가 관측되지 않았습니다. 다만 디렉터리 단위 경로는 이 파일을 원래 위치에서 없앨 수 있습니다. 기존 설치에서 `omcustom init`은 `install({ backup: exists })`를 호출하고(`src/cli/init.ts:205`), 백업 단계가 `.claude/`를 `.claude-backup-` 접두의 타임스탬프 폴더로 `rename`하며(`src/core/installer.ts:197`, `:933`, `:919`~`:925`; `src/core/layout.ts:28`, `:32`), 복원 대상 기본값은 `settings.json`·`settings.local.json`과 `agent-memory`·`agent-memory-local`입니다(`src/core/file-preservation.ts:25`, `:30`). 즉 이 경로는 `scheduled_tasks.json`을 지우지 않고 백업 폴더로 옮기며(복원 대상 기본값에 없음), 이 이동이 원문의 "was deleted" 조건에 해당하는지는 원문이 밝히지 않습니다 [가설 — `omcustom init` 백업 이동 뒤 세션 한정 반복 작업이 한 번 더 실행되는지로 판정]. R001이 승인을 요구하는 `git clean -fdx`는 gitignore 대상인 이 파일을 실제로 지웁니다. 둘째 조건에 관해서는 어느 경로든 세션 한정 반복 작업이 있는 세션에서 이 파일이 사라질 때 관련되고, 첫 조건(Linux의 sandboxed Bash 명령 뒤)은 위에서 판정한 범위를 따릅니다. 두 조건에 대한 수정 모두 플랫폼 수정이므로 룰 변경은 필요하지 않습니다.
1946
1946
  - CHANGELOG 원문: "Changed background sessions waiting on a scheduled wakeup (`/loop`): they are now left running through updates and low memory, where being restarted or shut down could silently lose the wakeup"
1947
1947
  (290) `/loop` 예약 wakeup을 기다리는 백그라운드 세션은 업데이트와 메모리 부족 상황에서도 재시작·종료되지 않고 유지되므로, 이전에 wakeup이 조용히 사라질 수 있던 경로가 줄어듭니다. R013의 메모리 압박 노트(v2.1.238/274)와 관련된 영역이지만 그 임계값 계산을 바꾸지 않습니다.
1948
1948
  - CHANGELOG 원문: "Fixed sessions moved to the background while idle reopening as "no saved transcript" after a restart or idle cleanup; they now resume their conversation"
@@ -2020,7 +2020,7 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2020
2020
  ### Agent · 서브에이전트
2021
2021
 
2022
2022
  - CHANGELOG 원문: "Added an `effort` parameter to the Agent tool, so Claude runs a sub-agent at the effort level you ask for"
2023
- (292) Agent 도구에 `effort` 파라미터가 추가되어, Claude가 사용자가 요청한 effort 수준으로 서브에이전트를 실행합니다. R009 「Agent Tool Requirements」 목록은 Agent 호출 파라미터로 `subagent_type`과 `model`을 열거하고(`.claude/rules/MUST-parallel-execution.md:278`, `:279`), 다른 룰은 `mode`(R006 `.claude/rules/MUST-agent-design.md:67`·`:470`, R010 `.claude/rules/MUST-orchestrator-coordination.md:588`·`:630`)와 `description`의 `[N]` 접두사(R008 `.claude/rules/MUST-tool-identification.md:101`)를 요구합니다. 이 7개 줄 어디에도 `effort`는 나오지 않으며(각 줄 `sed -n '<줄>p' <파일> | command grep -c effort` 결과 0), effort는 에이전트 frontmatter `effort:`로 정의합니다(`.claude/agents`의 49개 파일에 `effort:` 줄이 있음, R006 선택 필드 `.claude/rules/MUST-agent-design.md:179`). 오케스트레이터 환경의 Agent 도구 정의(Claude Code 2.1.296, 2026-10-13, 세션 도구 목록에서 직접 읽음)에는 `effort` 파라미터(enum: low, medium, high, xhigh, max)가 있으며, 도구 설명(CHANGELOG 원문이 아님) 전문은 "Reasoning effort for this agent. Set this ONLY when the user, or instructions such as CLAUDE.md or a skill, explicitly ask that this agent or delegated work run at a specific effort level, never on your own judgment; otherwise omit it and the agent runs at its usual effort. Ignored for subagent_type: "fork": a fork runs at your own effort."입니다. 이 절을 정정한 서브에이전트 세션(Claude Code 2.1.296)의 Agent 도구 정의에서도 같은 파라미터와 설명을 관측했습니다. 호출 단위 `effort`와 frontmatter `effort`의 우선순위는 관측하지 못했습니다 [가설 — 우선순위 미실측]. 이 항목은 선택 기능 추가이므로 기존 위임 규칙을 바꾸지 않습니다.
2023
+ (292) Agent 도구에 `effort` 파라미터가 추가되어, Claude가 사용자가 요청한 effort 수준으로 서브에이전트를 실행합니다. R009 「Agent Tool Requirements」 목록은 Agent 호출 파라미터로 `subagent_type`과 `model`을 열거하고(`.claude/rules/MUST-parallel-execution.md:278`, `:279`), 다른 룰은 `mode`(R006 `.claude/rules/MUST-agent-design.md:67`(보이는 예시 줄)·`:470`(`:464`에서 열린 HTML DETAIL 주석 안), R010 `.claude/rules/MUST-orchestrator-coordination.md:588`·`:630`)와 `description`의 `[N]` 접두사(R008 `.claude/rules/MUST-tool-identification.md:101`)를 요구합니다. 이 7개 줄 어디에도 `effort`는 나오지 않으며(`for spec in MUST-parallel-execution.md:278 MUST-parallel-execution.md:279 MUST-agent-design.md:67 MUST-agent-design.md:470 MUST-orchestrator-coordination.md:588 MUST-orchestrator-coordination.md:630 MUST-tool-identification.md:101; do f=${spec%%:*}; n=${spec##*:}; git show HEAD:.claude/rules/$f | command sed -n "${n}p" | command grep -c effort; done` 출력 7줄 모두 0), effort는 에이전트 frontmatter `effort:`로 정의합니다(`.claude/agents`의 49개 파일에 `effort:` 줄이 있음, R006 선택 필드 `.claude/rules/MUST-agent-design.md:179`). 오케스트레이터 환경의 Agent 도구 정의(Claude Code 2.1.296, 2026-10-13, 세션 도구 목록에서 직접 읽음)에는 `effort` 파라미터(enum: low, medium, high, xhigh, max)가 있으며, 도구 설명(CHANGELOG 원문이 아님) 전문은 "Reasoning effort for this agent. Set this ONLY when the user, or instructions such as CLAUDE.md or a skill, explicitly ask that this agent or delegated work run at a specific effort level, never on your own judgment; otherwise omit it and the agent runs at its usual effort. Ignored for subagent_type: "fork": a fork runs at your own effort."입니다. 이 절을 정정한 서브에이전트 세션(Claude Code 2.1.296)의 Agent 도구 정의에서도 같은 파라미터와 설명을 관측했습니다. 호출 단위 `effort`와 frontmatter `effort`의 우선순위는 관측하지 못했습니다 [가설 — 우선순위 미실측]. 이 항목은 선택 기능 추가이므로 기존 위임 규칙을 바꾸지 않습니다.
2024
2024
  - CHANGELOG 원문: "Fixed subagent definitions with `permissionMode: auto` entering auto mode when auto mode is unavailable (disabled by settings, circuit breaker, or a model that doesn't support it)"
2025
2025
  (292) auto mode를 쓸 수 없는 상황(설정으로 비활성화, circuit breaker, 미지원 모델)에서 `permissionMode: auto`로 정의된 서브에이전트가 auto mode에 진입하던 결함이 수정되었습니다. `.claude/agents`의 `permissionMode:` 줄 49개는 전부 `bypassPermissions`이고 `auto`와 `plan`은 0건이므로(`git grep -h '^permissionMode:' -- '.claude/agents/*.md' | sort | uniq -c` 결과 1행 "49 permissionMode: bypassPermissions") 이 결함 조건에 해당하지 않습니다.
2026
2026
  - CHANGELOG 원문: "Changed agent names to allow at most 256 characters: a longer one is rejected, and a skill's or a plugin file's `name` longer than that is ignored"
@@ -2115,12 +2115,12 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2115
2115
  - CHANGELOG 원문: "Fixed `claude agents` offering bypass permissions that background sessions then ignored when consent was saved only in `.claude/settings.local.json` or a `--settings` file; it now asks for consent first, and a session that ignores bypass shows a short notice that stays"
2116
2116
  (293) bypass 동의가 `.claude/settings.local.json`이나 `--settings` 파일에만 저장된 경우, `claude agents`가 bypass permissions를 제공하지만 백그라운드 세션이 이를 무시하던 결함이 수정되었습니다. 이제 먼저 동의를 묻고, bypass를 무시한 세션에는 짧은 안내가 남습니다. R010 「Universal bypassPermissions」는 project·local의 `bypassPermissions` `defaultMode`가 2.1.257부터 무시된다고 이미 기록합니다(`.claude/rules/MUST-orchestrator-coordination.md:588`). 같은 계열이며, 이 저장소의 프로젝트 `.claude/settings.json`은 `permissions.defaultMode: "bypassPermissions"`를 유지하되 신뢰하지 말라는 주석을 둡니다(`jq .permissions .claude/settings.json`의 `_comment_defaultMode`). `.claude/settings.local.json`의 동의 상태는 기기별 설정 파일(gitignore 대상)이라 이번 검토에서 의도적으로 열어 보지 않았으며 [가설 — `claude agents` 실사용 시 동의 프롬프트 표시 여부는 미실측] 룰 변경은 필요하지 않습니다.
2117
2117
  - CHANGELOG 원문: "Reverted the auto mode denial message change from 2.1.281 that told Claude a denial covers the outcome, not only the exact command"
2118
- (293) 2.1.281에서 도입된, 거부가 정확한 명령뿐 아니라 그 결과까지 포함한다고 Claude에게 알리던 auto mode 거부 메시지 변경이 롤백되었습니다. 관측한 범위에서 `.claude/rules`와 `CLAUDE.md`에 `2.1.281`을 언급하는 문장은 0건이며(`git grep -n '2\.1\.281' -- .claude/rules CLAUDE.md` rc=1), R010 STOP Protocol은 classifier trip 횟수(2회)만 기준으로 삼고 거부 메시지 문구에 의존하지 않으므로(`.claude/rules/MUST-orchestrator-coordination.md:273`의 trip 계수 서술, 같은 파일 `:254`의 STOP Protocol 절) 영향이 없습니다. 다만 롤백으로 "거부는 결과까지 포함하므로 다른 경로로 우회하지 말라"는 취지를 플랫폼 메시지가 더 이상 전하지 않습니다. 저장소 룰 중 인접한 규범은 적용 범위가 각각 좁습니다. R001의 Ask-before-scan(`.claude/rules/MUST-safety.md:147`)은 크레덴셜 디스커버리 스캔이 classifier에 걸리면 재시도하지 말라고 하고, R001 「Standing User-Deny + Classifier Block」(`:171`, `:177`)은 사용자의 상시 금지("don't touch X")가 있을 때만 차단된 편집을 다른 경로로 재시도하지 말라고 합니다. R010 STOP Protocol(`.claude/rules/MUST-orchestrator-coordination.md:262`)은 서브에이전트의 classifier trip 2회를 다루고, 같은 룰의 git 조항 두 개(`:487` 브랜치 전환 거부 시 `stash`/`reset`/`clean` 자체 우회 금지, `:1004`·`:1014` pre-commit 훅 차단의 `--no-verify` 우회 금지)와 R017의 v2.1.269/271 노트(`.claude/rules/MUST-sync-verification.md:369`, HTML 주석 안 — 낡은 `.git/config.lock`을 `rm`으로 자체 우회하지 말고 보고)는 git 작업에 한정됩니다. R015의 `.claude/rules/MUST-intent-transparency.md:138`은 allow 규칙으로는 classifier 차단이 풀리지 않으므로 사용자가 `!`로 직접 실행하거나 차단 트리거를 제거해야 한다고 적고, 같은 룰의 「Failed Tool Re-Try Discipline」(`:82`)은 사용자가 지정한 도구를 거부 후에도 같은 도구로 재시도하라는 규범이라 방향이 일부 반대이지만, 다른 수단으로 조용히 바꾸지 말라는 같은 방향의 요소도 있습니다(보이는 `:87` "do NOT silently switch", `:84`에서 열린 DETAIL 주석 안 `:85` "do NOT silently switch to a different mechanism"; 둘 다 사용자가 지정한 도구에 한정). R020의 진단 가설 표(`.claude/rules/MUST-completion-verification.md:323`)는 권한·토큰 오류를 플래그·옵션 변경으로 우회하지 말라고 하지만 진단 가설 검증 맥락의 조항입니다. 룰 문장 스윕(`git grep -n -i classifier -- .claude/rules CLAUDE.md`와 ``git grep -n -i -E 'route around|circumvent|우회|another path|different mechanism' -- .claude/rules CLAUDE.md``, HTML 주석 안의 일치 포함)에서 위 조항 외에 일반 auto mode 거부 전반에 대해 "다른 경로로 우회하지 말라"고 규정한 문장은 찾지 못했습니다. 즉 롤백 뒤 그 일반 규범은 플랫폼 메시지에서 빠졌고, 위 스윕 범위의 저장소 룰에서도 확인되지 않습니다. (288) 절 「권한 · auto mode · rm」은 사용자 scope `defaultMode`를 `auto`로 관측했습니다. 세션의 실제 유효 모드는 프로젝트 설정과의 우선순위에 따라 달라지므로(R010 「Universal bypassPermissions」 — `claude -p`에서는 `default` 귀결 실측, 대화형 세션은 [가설]) 이 롤백은 auto mode로 실행되는 세션에 한해 해당합니다.
2118
+ (293) 2.1.281에서 도입된, 거부가 정확한 명령뿐 아니라 그 결과까지 포함한다고 Claude에게 알리던 auto mode 거부 메시지 변경이 롤백되었습니다. 관측한 범위에서 `.claude/rules`와 `CLAUDE.md`에 `2.1.281`을 언급하는 문장은 0건이며(`git grep -n '2\.1\.281' -- .claude/rules CLAUDE.md` rc=1), R010 STOP Protocol은 classifier trip 횟수(2회)만 기준으로 삼고 거부 메시지 문구에 의존하지 않으므로(`.claude/rules/MUST-orchestrator-coordination.md:273`의 trip 계수 서술 — `:272`에서 열린 HTML DETAIL 주석 안, 같은 파일 `:254`의 STOP Protocol 절) 영향이 없습니다. 다만 롤백으로 "거부는 결과까지 포함하므로 다른 경로로 우회하지 말라"는 취지를 플랫폼 메시지가 더 이상 전하지 않습니다. 저장소 룰 중 인접한 규범은 적용 범위가 각각 좁습니다. R001의 Ask-before-scan(`.claude/rules/MUST-safety.md:147`)은 크레덴셜 디스커버리 스캔이 classifier에 걸리면 재시도하지 말라고 하고, R001 「Standing User-Deny + Classifier Block」(`:171`, `:177`)은 사용자의 상시 금지("don't touch X")가 있을 때만 차단된 편집을 다른 경로로 재시도하지 말라고 합니다. R010 STOP Protocol(`.claude/rules/MUST-orchestrator-coordination.md:262`)은 서브에이전트의 classifier trip 2회를 다루고, 같은 룰의 git 조항 두 개(`:487` 브랜치 전환 거부 시 `stash`/`reset`/`clean` 자체 우회 금지, `:1004`·`:1014` pre-commit 훅 차단의 `--no-verify` 우회 금지)와 R017의 v2.1.269/271 노트(`.claude/rules/MUST-sync-verification.md:369`, HTML 주석 안 — 낡은 `.git/config.lock`을 `rm`으로 자체 우회하지 말고 보고)는 git 작업에 한정됩니다. R015의 `.claude/rules/MUST-intent-transparency.md:138`은 allow 규칙으로는 classifier 차단이 풀리지 않으므로 사용자가 `!`로 직접 실행하거나 차단 트리거를 제거해야 한다고 적고, 같은 룰의 「Failed Tool Re-Try Discipline」(`:82`)은 사용자가 지정한 도구를 거부 후에도 같은 도구로 재시도하라는 규범이라 방향이 일부 반대이지만, 다른 수단으로 조용히 바꾸지 말라는 같은 방향의 요소도 있습니다(보이는 `:87` "do NOT silently switch", `:84`에서 열린 DETAIL 주석 안 `:85` "do NOT silently switch to a different mechanism"; `:87`은 사용자가 지정한 도구, `:85`는 사용자가 지정한 도구·형식("User-specified tools/formats")에 한정). R020의 진단 가설 표(`.claude/rules/MUST-completion-verification.md:323`)는 권한·토큰 오류를 플래그·옵션 변경으로 우회하지 말라고 하지만 진단 가설 검증 맥락의 조항입니다. 룰 문장 스윕(`git grep -n -i classifier -- .claude/rules CLAUDE.md`와 ``git grep -n -i -E 'route around|circumvent|우회|another path|different mechanism' -- .claude/rules CLAUDE.md``, HTML 주석 안의 일치 포함)에서 위 조항 외에 일반 auto mode 거부 전반에 대해 "다른 경로로 우회하지 말라"고 규정한 문장은 찾지 못했습니다. 즉 롤백 뒤 그 일반 규범은 플랫폼 메시지에서 빠졌고, 위 스윕 범위의 저장소 룰에서도 확인되지 않습니다. (288) 절 「권한 · auto mode · rm」은 작성 기기의 사용자 scope `defaultMode`를 `auto`로 관측했습니다(기기별 설정이라 저장소 사실이 아닙니다). 세션의 실제 유효 모드는 프로젝트 설정과의 우선순위에 따라 달라지므로(R010 「Universal bypassPermissions」의 `claude -p` 실측과 원천 목록·우선순위에 따르면, 이 저장소처럼 project(또는 local)에 `bypassPermissions`가 있고 local·managed 설정이나 실행 플래그가 다른 모드를 정하지 않으며 user 값이 bypass가 아닐 때 `default`로 귀결하고, 키가 없으면 user 값이 유지되며, managed 범위와 대화형 세션은 [가설]) 이 롤백은 auto mode로 실행되는 세션에 한해 해당합니다.
2119
2119
 
2120
2120
  ### 스케줄링
2121
2121
 
2122
2122
  - CHANGELOG 원문: "Reverted the 2.1.290 fix for cloud sessions staying asleep after a container restart lost a pending `/loop` wakeup or scheduled task; Claude is no longer told, and the session stays asleep"
2123
- (293) 컨테이너 재시작으로 대기 중인 `/loop` wakeup이나 예약 작업이 사라진 cloud 세션이 계속 잠든 상태로 남던 문제에 대한 2.1.290 수정(2.1.290 CHANGELOG: "Fixed cloud sessions staying asleep after a container restart lost a pending `/loop` wakeup or scheduled task; Claude is now told and can schedule it again")이 롤백되어, Claude에게 알리지 않으며 세션은 잠든 채로 남습니다. 대상은 cloud 세션입니다. 관측한 범위(v2.1.290 절의 예약 경로 `git grep`)에서 이 저장소가 `/loop`를 쓰는 경로는 `/fsd`의 선택적 self-paced `/loop` 호출입니다(`.claude/skills/fsd/SKILL.md:16`, `:39`, `:162`). self-paced `/loop`도 예약 wakeup을 기다리는 세션 한정 반복 작업으로 다뤄집니다(2.1.290 CHANGELOG "`/loop` and other recurring session-only scheduled tasks", "background sessions waiting on a scheduled wakeup (`/loop`)"). `claude-native` 스킬의 `/schedule` 안내(`.claude/skills/claude-native/SKILL.md:234`~`:237`)는 클라우드 routine을 만드는 경로이며, routine 실행이 이 항목의 cloud 세션 wakeup 경로를 거치는지는 [가설 — 미관측]입니다. `omcustom-loop` 스킬 문서는 SubagentStop prompt 훅을 설명하지만(`.claude/skills/omcustom-loop/SKILL.md:3`, `:13`), v2.1.294 절에 정리한 대로 현재 SubagentStop 훅 5개는 전부 `command` 타입이며(`jq -c '[.hooks.SubagentStop[]?.hooks[]?.type]' .claude/settings.json`; #1631 교체, `.claude/hooks/hooks.json:283`의 description) 스킬 문서가 배선보다 오래된 상태이고, 이 스킬 문서는 `/loop`·`ScheduleWakeup`·`CronCreate`를 언급하지 않습니다(`command grep -c -E '/loop|ScheduleWakeup|CronCreate' .claude/skills/omcustom-loop/SKILL.md` 결과 0). `/fsd`를 cloud 세션에서 돌린 흔적은 관측하지 못했으므로 영향이 없을 것으로 봅니다 [가설 — cloud 세션 사용 여부 미관측]. 2.1.290의 다른 `/loop` 관련 수정(compaction 이후 예약 작업 복원 등)은 이 항목으로 롤백되지 않았습니다.
2123
+ (293) 컨테이너 재시작으로 대기 중인 `/loop` wakeup이나 예약 작업이 사라진 cloud 세션이 계속 잠든 상태로 남던 문제에 대한 2.1.290 수정(2.1.290 CHANGELOG: "Fixed cloud sessions staying asleep after a container restart lost a pending `/loop` wakeup or scheduled task; Claude is now told and can schedule it again")이 롤백되어, Claude에게 알리지 않으며 세션은 잠든 채로 남습니다. 대상은 cloud 세션입니다. 관측한 범위(v2.1.290 절의 예약 경로 `git grep`)에서 이 저장소가 `/loop`를 쓰는 경로는 `/fsd`의 선택적 self-paced `/loop` 호출입니다(`.claude/skills/fsd/SKILL.md:16`, `:39`, `:162`). self-paced `/loop`도 예약 wakeup을 기다리는 세션 한정 반복 작업으로 다뤄집니다(2.1.290 CHANGELOG "`/loop` and other recurring session-only scheduled tasks", "background sessions waiting on a scheduled wakeup (`/loop`)"). `claude-native` 스킬의 `/schedule` 안내(`.claude/skills/claude-native/SKILL.md:234`~`:237`)는 클라우드 routine을 만드는 경로이며, routine 실행이 이 항목의 cloud 세션 wakeup 경로를 거치는지는 [가설 — 미관측]입니다. `omcustom-loop` 스킬 문서는 이 절을 작성한 v2.0.2 시점에 SubagentStop prompt 훅을 설명해 배선보다 오래된 상태였으나, v2.0.5(#1857)에서 고쳐져 이제 SubagentStop command 훅을 설명합니다(`.claude/skills/omcustom-loop/SKILL.md:3` "SubagentStop advisory hooks during background agent work (outcome recording, consecutive-completion advisory; no orchestrator-workflow continuation)"; `:13`은 이 훅들이 결과를 기록하고 연속 완료 횟수를 세고 advisory를 낼 뿐 오케스트레이터 워크플로를 이어가지 않으며, "check pending steps" 지시는 v1.1.32에서 prompt 훅에서 빠졌고 남은 failure-gate prompt 훅은 #1631에서 advisory command 훅으로 교체되었다고 적습니다). 이는 v2.1.294 절에 정리한 배선, 즉 SubagentStop 훅 5개가 전부 `command` 타입이라는 관측(`jq -c '[.hooks.SubagentStop[]?.hooks[]?.type]' .claude/settings.json`; #1631 교체, `.claude/hooks/hooks.json:283`의 description)과 일치합니다. 이 스킬 문서는 `/loop`·`ScheduleWakeup`·`CronCreate`를 언급하지 않습니다(`command grep -c -E '/loop|ScheduleWakeup|CronCreate' .claude/skills/omcustom-loop/SKILL.md` 결과 0). `/fsd`를 cloud 세션에서 돌린 흔적은 관측하지 못했으므로 영향이 없을 것으로 봅니다 [가설 — cloud 세션 사용 여부 미관측]. 2.1.290의 다른 `/loop` 관련 수정(compaction 이후 예약 작업 복원 등)은 이 항목으로 롤백되지 않았습니다.
2124
2124
 
2125
2125
  ### MCP
2126
2126
 
@@ -2147,13 +2147,13 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2147
2147
  - CHANGELOG 원문: "Fixed `prompt` and `agent` hooks written as instructions (such as "Block commands that...") allowing what they should block"
2148
2148
  (294) 지시문 형태("Block commands that..." 등)로 작성된 `prompt`·`agent` 훅이 막아야 할 대상을 허용하던 결함이 수정되었습니다. 측정한 범위에서 이 저장소가 설정하는 `prompt` 훅은 1개이며 `agent` 타입 훅은 0개입니다(`jq -c '[.hooks[][]?.hooks[]? | .type] | group_by(.) | map({(.[0]):length}) | add' .claude/settings.json templates/.claude/settings.json` 결과 두 파일 모두 `{"command":63,"prompt":1}`). 그 1개는 PostCompact 이벤트의 컨텍스트 재주입 문안이며(`.claude/hooks/hooks.json:375`, `.claude/settings.json:407`), 무엇을 차단하는 판정 훅이 아닙니다. 스킬·에이전트 frontmatter에는 `hooks:` 블록이 없습니다(`git grep -n -E '^hooks:' -- '.claude/agents/*.md' '.claude/skills/*/SKILL.md'` 결과 0건; 경로를 지정하지 않으면 R006 본문의 frontmatter 예시 줄이 걸립니다). 따라서 이 결함이 이 저장소의 차단 동작에 영향을 주지 않았다고 봅니다. PostCompact `prompt` 훅 문안이 판정 대상 평가를 거치는지는 CHANGELOG가 말하지 않으므로 [가설 — PostCompact prompt 훅의 평가 경로 미실측]입니다.
2149
2149
  - CHANGELOG 원문: "Improved how `prompt` hooks on Stop and SubagentStop written as instructions (such as "Carry on if the build is broken") are judged, so Claude is less likely to stop early"
2150
- (294) Stop·SubagentStop의 `prompt` 훅이 지시문 형태로 작성된 경우의 판정이 개선되어 Claude가 일찍 멈출 가능성이 줄었습니다. 이 저장소의 Stop 훅 6개와 SubagentStop 훅 5개는 전부 `command` 타입이며 `prompt` 타입은 없습니다(`jq -c '{stop:[.hooks.Stop[]?.hooks[]?.type], sub:[.hooks.SubagentStop[]?.hooks[]?.type]}' .claude/settings.json`). SubagentStop의 `prompt` 판정 훅은 #1631에서 advisory 전용 command 훅으로 교체되었다고 `.claude/hooks/hooks.json:283`의 description이 기록합니다. 다만 `.claude/skills/omcustom-loop/SKILL.md:3`와 `:13`은 여전히 "SubagentStop prompt hook"으로 자동 이어가기를 설명하고 있어 현재 배선과 문서가 어긋납니다. 이 어긋남은 이번 릴리즈와 무관한 선재 항목이며 이 문서에서는 사실만 기록합니다. 따라서 이 개선은 현재 배선에는 적용 대상이 없고, 훗날 Stop·SubagentStop에 `prompt` 훅을 다시 배선하면 그때 적용됩니다.
2150
+ (294) Stop·SubagentStop의 `prompt` 훅이 지시문 형태로 작성된 경우의 판정이 개선되어 Claude가 일찍 멈출 가능성이 줄었습니다. 이 저장소의 Stop 훅 6개와 SubagentStop 훅 5개는 전부 `command` 타입이며 `prompt` 타입은 없습니다(`jq -c '{stop:[.hooks.Stop[]?.hooks[]?.type], sub:[.hooks.SubagentStop[]?.hooks[]?.type]}' .claude/settings.json`). SubagentStop의 `prompt` 판정 훅은 #1631에서 advisory 전용 command 훅으로 교체되었다고 `.claude/hooks/hooks.json:283`의 description이 기록합니다. 이 절을 작성한 v2.0.2 시점에는 `.claude/skills/omcustom-loop/SKILL.md:3`와 `:13`이 여전히 "SubagentStop prompt hook"으로 자동 이어가기를 설명해 배선과 문서가 어긋났습니다(이 문장은 당시 이력이며 현재 파일의 문구가 아닙니다). 이 어긋남은 2.1.294와 무관한 선재 항목이었고, v2.0.5(#1857)에서 스킬 문서가 SubagentStop command 훅 설명으로 고쳐졌습니다(`:3` "outcome recording, consecutive-completion advisory; no orchestrator-workflow continuation"). 따라서 이 개선은 이 저장소가 설정하는 훅(settings.json)에는 적용 대상이 없고, 훗날 Stop·SubagentStop에 `prompt` 훅을 다시 배선하면 그때 적용됩니다. 다만 CC 내장 `/goal` 커맨드(`omcustom:goal` 스킬과는 별개 — 위 :118 참조)는 세션 범위 Stop `prompt` 훅을 등록하므로(CC 2.1.310 바이너리 문자열 `sessionHooksRegistry.add(s,"Stop","",{type:"prompt",prompt:t})`) 그런 세션에서는 저장소 배선과 무관하게 이 개선이 적용될 수 있습니다. [가설 — goal 조건문이 원문의 '지시문 형태'에 해당하는지 미실측]
2151
2151
 
2152
2152
  기타 0건 — 이 저장소 비해당 항목은 없습니다. 실측: `gh release view v2.1.294 --repo anthropics/claude-code --json body --jq .body | grep -c '^- '` = 2건 중 위 본문 2건을 다뤘으므로 2 − 2 = 0건입니다. 계수 범위는 해당 릴리즈 노트의 최상위 불릿 줄(`- `로 시작하는 줄)입니다.
2153
2153
 
2154
2154
  **Action items**:
2155
2155
  - 훅 설정 변경은 불필요합니다. `agent` 타입 훅은 0개이고, 유일한 `prompt` 훅은 PostCompact 재주입용이며 Stop·SubagentStop은 전부 `command` 훅입니다.
2156
- - 룰 변경 제안은 없습니다. `omcustom-loop` 스킬 문서와 hooks.json 배선의 어긋남은 이 릴리즈의 조치 사항이 아니라 별도 정리 후보로만 보고합니다.
2156
+ - 룰 변경 제안은 없습니다. `omcustom-loop` 스킬 문서와 hooks.json 배선의 어긋남은 이 절 작성 시점(v2.0.2)에 이 릴리즈의 조치 사항이 아니라 별도 정리 후보로 보고했고, v2.0.5(#1857)에서 정리되었습니다.
2157
2157
 
2158
2158
  ---
2159
2159
 
@@ -2376,9 +2376,9 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2376
2376
  ### 예약 작업 · `/loop`
2377
2377
 
2378
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` 실행 사례는 미관측].
2379
+ (299) 서머타임이 끝나 같은 시각이 반복되는 한 시간 동안 예약 작업과 루프가 매 턴 뒤 다시 발화하거나 일찍 발화하던 결함이 수정되었습니다. 원문은 세션 종류를 한정하지 않습니다. `/fsd`는 self-paced `/loop`를 반복 수단의 하나로 설명하고(`.claude/skills/fsd/SKILL.md:39`), 세션이 무인(`claude -p`, 예약 실행)이라 자기 페이싱이 필요할 때 `/goal`·`/loop` 호출을 권장합니다(`:172`). 따라서 2.1.299 미만에서 서머타임을 적용하는 시간대의 서머타임 종료 구간에 `/loop`로 `/fsd`를 돌린 경우 반복이 매 턴 뒤 다시 발화하거나 일찍 발화했을 수 있습니다 [가설 — 원문의 "loops"가 self-paced `/loop`를 포함하는지와 서머타임 종료 구간의 `/fsd` 실행 사례는 미관측].
2380
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"에 포함되는지와 두 경로의 실제 사용은 미관측].
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` 절 제목 "### Scheduled (CronCreate)", `:240` "Or via CronCreate MCP tool for programmatic scheduling.")입니다. 그 절의 주 경로는 `/schedule`(`:234`, `:237`)이고 CronCreate MCP 도구는 대안입니다. `/loop`(ScheduleWakeup)나 CronCreate MCP 도구로 예약한 작업은 2.1.299 미만에서 보고된 다음 실행 시각이 실제와 분 단위로 어긋났을 수 있습니다 [가설 — ScheduleWakeup이 원문의 "scheduling tools"에 포함되는지, `/schedule` routine이 이 항목의 대상인지, 두 도구 경로의 실제 사용은 미관측].
2382
2382
 
2383
2383
  ### 스킬 로딩 · Read/Write 도구
2384
2384
 
@@ -2410,12 +2410,12 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2410
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
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
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 훅을 추가한다면 훅 검증 픽스처를 두 갈래로 나눠야 합니다. 선택 키를 오타 내면 그 키가 오류 없이 버려져 의도한 수정이 조용히 빠질 수 있고, 필수 키를 오타 내면 남은 입력이 도구 검증에 걸려 거부될 수 있으며, 도구 스키마에 맞지 않는 값은 호출 거부로 이어집니다.
2413
+ (300) PreToolUse·PermissionRequest 훅이 돌려주는 `updatedInput`이 이제 Claude 자신의 입력과 같은 방식으로 검증됩니다. 원문은 결과를 두 갈래로 나눕니다. 알 수 없는 키는 버려지고, 도구가 거부하는 입력은 호출 자체를 거부합니다. 키가 버려진 뒤의 처리는 원문이 말하지 않습니다. 남은 입력이 도구 검증을 통과하면 그 키만 빠진 채 진행되고, 필수 키를 오타 내 그 키가 버려지면 남은 입력이 도구 검증에 걸려 거부될 수 있다고 봅니다 [가설 — `updatedInput`이 원래 입력 전체를 대체한다는 전제(원문은 대체인지 병합인지 말하지 않으며, 병합이라면 원래 입력의 필수 키가 남아 거부되지 않을 수 있음)와, 키가 버려진 뒤 호출이 진행되는지 거부되는지를 측정하지 않음]. 이 저장소의 훅은 `updatedInput`을 출력하지 않고 PermissionRequest 훅도 배선하지 않습니다(`git grep -n -E 'updatedInput|PermissionRequest' -- .claude/hooks .claude/settings.json templates/.claude/settings.json` rc=1). 따라서 이 동작 변경은 현재 배선에 영향을 주지 않습니다. 앞으로 입력을 고쳐 쓰는 PreToolUse 훅을 추가한다면 훅 검증 픽스처를 세 경우로 나눠야 합니다. 선택 키를 오타 내면 그 키가 오류 없이 버려져 의도한 수정이 조용히 빠질 수 있고, 필수 키를 오타 내면 위 [가설]의 전체 대체 전제에서 남은 입력이 도구 검증에 걸려 거부될 수 있으며, 도구 스키마에 맞지 않는 값은 호출 거부로 이어집니다.
2414
2414
 
2415
2415
  ### 백그라운드 · 프로세스
2416
2416
 
2417
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 버전을 대조하지 않음].
2418
+ (300) 백그라운드 명령이 실행되는 동안 Claude가 그 출력 파일을 폴링하거나 sleep하던 결함이 수정되었습니다. 이 저장소의 릴리즈 대기 지침은 Bash 타임아웃 안의 유한 폴링이나 단일 `gh run watch <run-id> --exit-status`(선택적으로 `run_in_background`)를 무한 수동 폴링 루프보다 우선하라고 적고 있습니다(`.claude/skills/pipeline/workflows/auto-dev.yaml:1551`~`:1554`, #1711). 이 수정은 모델 쪽 행동에 관한 것이며 이 지침과 충돌하지 않으므로 지침 변경은 필요하지 않습니다. 구버전 세션 기록에서 백그라운드 명령을 기다리며 출력 파일을 반복 Read한 흔적은 위임 프롬프트 결함이 아니라 이 플랫폼 결함의 산물일 수 있습니다 [가설 — 해당 기간 트랜스크립트에서 반복 Read 패턴과 CC 버전을 대조하지 않음].
2419
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
2420
  (300) 종료 시 정지 요청 후 1.5초가 지나도 실행 중인 백그라운드 명령을 강제 종료하도록 바뀌었습니다. 이전에는 fullscreen 모드에서 그런 명령이 남아 있을 수 있었습니다. 이 저장소의 R005는 프로세스를 띄운 스크립트를 정리한 직후 `pgrep -f <패턴> | wc -l`로 잔여 개수를 확인하라고 규정합니다(`.claude/rules/MAY-optimization.md:43`). 이 변경은 세션 종료 시점의 잔여를 줄이는 방향이지만 세션 도중 정리의 대체 수단은 아니므로 그 확인 절차는 그대로 유지합니다.
2421
2421
  - CHANGELOG 원문: "Changed background sessions to resume a carried workflow through the Workflow tool's approval instead of running it from the handoff file"
@@ -2430,7 +2430,7 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2430
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
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
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 줄을 제외한 재계산을 대조하는 것]. 또한 트랜스크립트 파일 크기가 커지므로, 트랜스크립트를 공유하거나 이슈에 첨부할 때 시스템 프롬프트 전문이 포함된다는 점을 확인합니다.
2433
+ (300) 로컬 세션 트랜스크립트가 각 API 요청의 시스템 프롬프트, 도구, 파라미터도 기록하도록 바뀌었습니다. 유지보수자 기기의 로컬 트랜스크립트 1개로 레코드 형태를 측정했습니다. 대상은 `~/.claude/projects/<프로젝트>/` 바로 아래 `*.jsonl` 중 2026-10-25 측정 세션의 트랜스크립트(`version` 필드 최댓값 2.1.302)이고, 17:22 KST에 계수만 출력하는 스크립트로 측정했습니다. 세션이 진행 중이었으므로 수치는 측정 시점 값입니다. 이 파일에는 `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`는 창 시작부터 마지막 assistant 줄까지(`:248`의 `range(0; $last + 1)`) 경계가 하나도 없고(`$bi`가 비어 있음) 창이 포화(`$wlc >= 200`)일 때에만 판정을 건너뜁니다. 따라서 blob 줄이 실제 응답 줄과 함께 턴으로 묶여 `tool_use`·announce가 이중 계수되거나, `tool_result`가 없는 user blob이 턴 경계로 잡힐 수 있습니다. 또한 추가된 줄이 실제 경계를 창 밖으로 밀어내 "경계 없음 + 포화" 조건이 더 자주 성립해 판정이 건너뛰어질 수 있습니다(반대로 `tool_result`가 없는 user blob은 창 안에 경계를 더할 수 있습니다) [가설 — 이 경로의 실제 오탐·미탐 발화는 관측되지 않음(not observed); 판정 기준은 2.1.300 이상 트랜스크립트에서 advisory 출력과 blob 줄을 제외한 재계산을 대조하는 것]. 또한 트랜스크립트 파일 크기가 커지므로, 트랜스크립트를 공유하거나 이슈에 첨부할 때 시스템 프롬프트 전문이 포함된다는 점을 확인합니다.
2434
2434
 
2435
2435
  ### MCP · 도구 검색
2436
2436
 
@@ -2475,7 +2475,7 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2475
2475
  ### 훅
2476
2476
 
2477
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 게시를 재현해 비교].
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"가 게시 호출 하나로 바꾸는 경로를 도입한 것으로 읽힙니다. 다만 CHANGELOG는 이 결함을 2.1.300의 회귀로 명시하지 않으므로 두 항목의 인과는 확정하지 않습니다. 이 수정의 원문은 새 동작("Claude now edits the file and then republishes instead of changing it in the publish call")이 PreToolUse 훅 환경에만 적용되는지, 모든 artifact 갱신에 적용되는지 명시하지 않습니다. 이 저장소 세션의 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
2479
  - CHANGELOG 원문: "Fixed quitting removing a worktree made by a `WorktreeCreate` hook without asking when it may hold unpushed commits"
2480
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
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"
@@ -2548,7 +2548,7 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2548
2548
  ### 권한 · permission mode
2549
2549
 
2550
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`를 먼저 실측합니다.
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` 호출 4곳(`:40`, `:86`, `:117`, `:174`; 명령 문자열은 모두 ``claude -p ${escapeShellArg(prompt)} --no-input``)은 `--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`)에서 실행되므로, 모드 관련 실행 플래그(`--permission-mode` 등)가 없는 이 호출의 모드는 그 디렉토리의 project·local settings와 user·managed settings, 곧 R010 `:588`이 나열한 네 범위가 정하고, 네 범위가 모두 비어 있으면 CC 내장 기본값이 정합니다. 이 항목은 그 기본값을 원문의 조건("on third-party providers, with telemetry off or on a fresh install")에서 `default`로 바꿉니다. 이 호출이 도구 승인을 필요로 하는지는 관측하지 않았습니다. 작성 기기의 로컬 관측은 저장소 사실이 아니며, 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
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
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
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"
@@ -2575,7 +2575,7 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2575
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
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
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의 "실행함 ≠ 성공함" 원칙에 맞습니다.
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`로 시작하는 명령은 `.claude/agents/infra-aws-expert.md:81`(HTML 주석 밖의 에이전트 정의 본문)과 `guides/aws/index.yaml:47`(가이드 메타데이터의 `install_command`)에 있고, `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
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
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
2581
 
@@ -2622,7 +2622,7 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2622
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
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
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개입니다.
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 노트(`.claude/rules/SHOULD-ecomode.md:97`)는 이 저장소의 스킬 열거 블록 개수를 적습니다. 이 절을 작성한 v2.0.3 시점에는 "115개"였고, v2.0.5(#1877)에서 위 디렉토리 계수와 같은 114개로 정정되었습니다.
2626
2626
  - CHANGELOG 원문: "Fixed resumed and cloud sessions sending Claude the whole skill list again each time plugins reloaded at startup"
2627
2627
  (304) 재개된 세션과 cloud 세션이 시작할 때 플러그인이 다시 로드될 때마다 전체 스킬 목록을 Claude에 다시 보내던 결함이 수정되었습니다. 스킬 디렉토리 114개(위 계수)를 둔 이 저장소에서 `--resume`으로 재개한 세션에서는 이 중복이 컨텍스트 비용을 늘렸을 수 있습니다 [가설 — 수정 전 버전으로 재개한 세션의 트랜스크립트에서 스킬 목록 반복 횟수를 세면 판정].
2628
2628
 
@@ -2663,10 +2663,10 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2663
2663
  - CHANGELOG 원문: "Removed the notes from `claude plugin validate` that predicted where a mod's hooks would run"
2664
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
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건입니다. 계수 범위는 해당 릴리즈 노트의 최상위 불릿 줄(`- `로 시작하는 줄)입니다.
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`)입니다. 그 스킬의 「CC 버전 분기 안내」 절(`.claude/skills/monitoring-setup/SKILL.md:22`)은 2.1.282부터 project·local 설정에 적힌 OpenTelemetry 변수가 무시된다고 적습니다(`:24`의 마스터 스위치·endpoint·내용 캡처 변수; `enable` 절의 `:60`도 같은 취지). `enable` 절(`:28`)은 2.1.282 미만에서는 `.claude/settings.local.json`(`:34`), 2.1.282 이상에서는 user-scope `~/.claude/settings.json`과 셸 export(`:73`, `:74`)를 안내합니다. 다만 Upgrade Path는 버전 구분 없이 `.claude/settings.local.json`을 안내하고(`:193` "In settings.local.json env:"), `trajectory-otel on` 절차도 `.claude/settings.local.json`을 쓰라고 적되(`:306`) 같은 기능의 Activation Notes(`:381`)가 2.1.282부터는 `enable`·`disable`의 2.1.282 이상 분기처럼 적용하라고 덧붙입니다. 따라서 그 스킬이 안내하는 경로들은 이 항목의 대상인 server-managed settings 경로와 다릅니다. 나머지 두 파일은 부분 문자열 일치입니다(`.claude/skills/research/SKILL.md:292`, `:294`의 "risks/efforts"·"risk/effort", `CLAUDE.md:245`(`:227`에서 열린 HTML 주석 안)의 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
2667
 
2668
2668
  **Action items**:
2669
- - 관측한 범위에서 행동 변화를 위해 룰·CLAUDE.md·에이전트·훅을 바꿔야 한다고 확정한 항목은 없습니다(R016: CC 지식은 이 가이드에 두고 룰 파일에는 행동 변화가 필요할 때만 1줄). 위 compaction 항목에 적은 R013의 "115개"와 디렉토리 계수 114개의 차이는 카운트 동기화 사안(R017 「Count Sync」)이며 이 절의 반영 범위에 넣지 않습니다. 위 `[가설 — …]` 표기는 판정 기준을 충족하는 측정이 이루어지기 전에는 결론으로 쓰지 않습니다.
2669
+ - 관측한 범위에서 행동 변화를 위해 룰·CLAUDE.md·에이전트·훅을 바꿔야 한다고 확정한 항목은 없습니다(R016: CC 지식은 이 가이드에 두고 룰 파일에는 행동 변화가 필요할 때만 1줄). 위 compaction 항목에 적은 R013 스킬 개수의 차이(v2.0.3 시점 "115개" 대 디렉토리 계수 114개)는 카운트 동기화 사안(R017 「Count Sync」)이라 이 절의 반영 범위에 넣지 않았고, v2.0.5(#1877)에서 114개로 정정되었습니다. 위 `[가설 — …]` 표기는 판정 기준을 충족하는 측정이 이루어지기 전에는 결론으로 쓰지 않습니다.
2670
2670
 
2671
2671
  ---
2672
2672
 
@@ -2684,7 +2684,7 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2684
2684
  - CHANGELOG 원문: "Improved MCP consent dialogs so an Enter meant for the prompt is less likely to be taken as Accept"
2685
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
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" 경고 행으로 표시되는지는 관측하지 않았습니다 [가설 — 유효 모드를 기록한 대화형 세션의 시작 배너 경고 행으로 판정].
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` init `permissionMode` 실측 규칙(CC 2.1.289, 2026-10-06)에 따르면, 이 저장소처럼 project에 그 값이 있으면(`jq -r '.permissions.defaultMode' .claude/settings.json` = bypassPermissions) 그 범위는 `default`로 귀결되어 user 값이 `bypassPermissions`가 아닌 한 `default`가 되고, user가 `bypassPermissions`이면 `bypassPermissions`로 남습니다. local 범위의 다른 값(같은 줄의 실측은 `default`, `acceptEdits`이며, `auto`는 2.1.257 CHANGELOG상 무시되나 미측정 `[가설]`, `plan`·`dontAsk`는 미측정)은 여전히 적용되어 project·user 값보다 우선하며, managed 설정과 실행 플래그도 원천입니다. 따라서 유효 모드는 기기마다 다르며, 대화형 세션의 결과는 R010이 `-p` 결과와 조정하지 않은 `[가설]`로 둡니다. 이 allow 규칙이 "restrict nothing" 경고 행으로 표시되는지는 관측하지 않았습니다 [가설 — 유효 모드를 기록한 대화형 세션의 시작 배너 경고 행으로 판정].
2688
2688
 
2689
2689
  ### 서브에이전트 · 팀원 · worktree · Workflow
2690
2690
 
@@ -2714,7 +2714,7 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2714
2714
  ## v2.1.306 (2026-10-21)
2715
2715
 
2716
2716
  > Issue: #1867 — Claude Code v2.1.306 compatibility documentation
2717
- > Scope-ceiling check (R017): 조사 시점(2026-10-25)의 최신 릴리즈는 2.1.310입니다(`claude --version`=2.1.310, `npm view @anthropic-ai/claude-code version`=2.1.310). 2.1.307·2.1.308·2.1.309·2.1.310 CHANGELOG 절을 각각 잘라 `2.1.306` 문자열과 "Revert"를 검색한 결과 네 절 모두 두 문자열이 0건이었으므로(`for v in 2.1.307 2.1.308 2.1.309 2.1.310; do awk -v v="$v" '/^## /{p=($2==v)} p' CHANGELOG.md | grep -c -F -e 2.1.306; awk -v v="$v" '/^## /{p=($2==v)} p' CHANGELOG.md | grep -c -i revert; done` 출력 0 여덟 줄), 이 릴리즈의 두 항목을 되돌리거나 좁히는 문장은 관측되지 않았습니다. 같은 compaction 영역의 후속 항목은 `for v in 2.1.307 2.1.308 2.1.309 2.1.310; do awk -v v="$v" '/^## /{p=($2==v)} p' CHANGELOG.md | grep -n -i compact; done` 검색에서 여섯 줄이 걸렸습니다(절 머리 줄을 1행으로 센 번호): 307:11("Autocompact is thrashing" 오류 일부, PDF 페이지·이미지·큰 도구 결과를 많이 읽는 턴), 307:12(cloud 세션 재시작 뒤 `/autocompact` 창), 309:14(매우 큰 중첩 CLAUDE.md 아래 파일을 읽은 뒤 반복 compaction), 309:38(compaction이 일어난 턴의 남은 artifact 업데이트마다 권한을 묻던 결함), 310:11(비대화형 세션(`-p`, Agent SDK)에서 트랜스크립트 파일이 매우 클 때 compaction 중 메모리 사용), 그리고 310:6 "Fixed compaction after a "Prompt is too long" error keeping too much of a conversation with dense text, such as base64 or SVG, so the next request could fail again"입니다. 여섯 줄 모두 롤백이 아니며 아래 MCP 세션 오류 보고 항목과 조건이 다른 별개 수정입니다. 릴리즈 게시 시각은 2026-10-21T03:16:31Z입니다(`gh release view v2.1.306 -R anthropics/claude-code --json publishedAt`).
2717
+ > Scope-ceiling check (R017): 조사 시점(2026-10-25)의 최신 릴리즈는 2.1.310입니다(`claude --version`=2.1.310, `npm view @anthropic-ai/claude-code version`=2.1.310). 이 절의 `awk` 명령이 읽는 `CHANGELOG.md`는 저장소 루트의 같은 이름 파일이 아니라 `gh api -H 'Accept: application/vnd.github.raw' repos/anthropics/claude-code/contents/CHANGELOG.md > CHANGELOG.md`로 받은 Claude Code CHANGELOG입니다. 이 절의 상한 루프는 빈 파일이나 저장소 루트 `CHANGELOG.md`(커밋 82a7e4c6의 파일)로 실행해도 0 여덟 줄을 출력하므로(2026-10-25 측정), 받은 파일의 크기(`wc -c CHANGELOG.md`)와 대상 절 머리(`grep -c -E '^## 2\.1\.(307|308|309|310)$' CHANGELOG.md` = 4, 위 두 파일에서는 0)를 먼저 확인합니다. 2.1.307·2.1.308·2.1.309·2.1.310 CHANGELOG 절을 각각 잘라 `2.1.306` 문자열과 "Revert"를 검색한 결과 네 절 모두 두 문자열이 0건이었으므로(`for v in 2.1.307 2.1.308 2.1.309 2.1.310; do awk -v v="$v" '/^## /{p=($2==v)} p' CHANGELOG.md | grep -c -F -e 2.1.306; awk -v v="$v" '/^## /{p=($2==v)} p' CHANGELOG.md | grep -c -i revert; done` 출력 0 여덟 줄), 이 릴리즈의 두 항목을 되돌리거나 좁히는 문장은 관측되지 않았습니다. 같은 compaction 영역의 후속 항목은 `for v in 2.1.307 2.1.308 2.1.309 2.1.310; do awk -v v="$v" '/^## /{p=($2==v)} p' CHANGELOG.md | grep -n -i compact; done` 검색에서 여섯 줄이 걸렸습니다(절 머리 줄을 1행으로 센 번호): 307:11("Autocompact is thrashing" 오류 일부, PDF 페이지·이미지·큰 도구 결과를 많이 읽는 턴), 307:12(cloud 세션 재시작 뒤 `/autocompact` 창), 309:14(매우 큰 중첩 CLAUDE.md 아래 파일을 읽은 뒤 반복 compaction), 309:38(compaction이 일어난 턴의 남은 artifact 업데이트마다 권한을 묻던 결함), 310:11(비대화형 세션(`-p`, Agent SDK)에서 트랜스크립트 파일이 매우 클 때 compaction 중 메모리 사용), 그리고 310:6 "Fixed compaction after a "Prompt is too long" error keeping too much of a conversation with dense text, such as base64 or SVG, so the next request could fail again"입니다. 여섯 줄 모두 롤백이 아니며 아래 MCP 세션 오류 보고 항목과 조건이 다른 별개 수정·개선입니다(310:11만 "Improved", 나머지 다섯 줄은 "Fixed"). 릴리즈 게시 시각은 2026-10-21T03:16:31Z입니다(`gh release view v2.1.306 -R anthropics/claude-code --json publishedAt`).
2718
2718
 
2719
2719
  ### MCP · compaction 오류 보고
2720
2720
 
@@ -2724,12 +2724,12 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2724
2724
  ### 중첩 `claude -p` 실행
2725
2725
 
2726
2726
  - CHANGELOG 원문: "Fixed `claude -p` inside cloud sessions reporting "Not logged in" when started without the session's environment variables"
2727
- (306) cloud 세션 안에서 세션의 환경 변수 없이 시작된 `claude -p`가 "Not logged in"을 보고하던 결함이 수정되었습니다. 이 저장소 코드에서 `claude -p` 호출은 같은 줄 검색 `git grep -n -P '(\bclaude\b|CLAUDE[A-Z_]*BIN)[^\n]*?\s-p(\s|$|")' HEAD -- '*.sh' '*.bash' '*.ts' '*.js' '*.mjs' '*.cjs' '*.py' '*.yml' '*.yaml' '.husky/*'`와 줄 이음 검색 `git grep -n -P -A1 '(\bclaude\b|CLAUDE[A-Z_]*BIN)[^\n]*\\\s*$' HEAD -- '*.sh' '*.bash' '*.ts' '*.js' '*.mjs' '*.cjs' '*.py' '*.yml' '*.yaml' '.husky/*'`로 관측한 범위에서 네 계열(미러·테스트를 뺀 파일 5개)에 나타납니다. 첫째, 훅 `.claude/hooks/scripts/playwright-compress.sh:54`가 `claude -p --model haiku`로 브라우저 MCP 출력을 요약하며, 이 훅은 `.claude/settings.json:579`에 `mcp__playwright__.*|mcp__claude-in-chrome__.*` matcher(`:582`)로 배선되어 있습니다. 둘째, Web UI 서버 `packages/serve/src/lib/server/claude-cli.ts:40`, `:86`, `:117`, `:174`가 `` `claude -p ${escapeShellArg(prompt)} --no-input` `` 명령 문자열을 조립합니다. 셋째, `agora` 스킬의 `.claude/skills/agora/scripts/reviewers.sh:168`~`:169`와 `.claude/skills/agora/scripts/judge.sh:223`~`:224`가 변수 바이너리 `"$AGORA_CLAUDE_BIN"` 뒤의 이음 줄에서 `-p`를 넘깁니다. 넷째, `infra/hada-scout/scout-runner.sh:109`가 `timeout "${SCOUT_TIMEOUT}" claude -p`를 실행합니다. 같은 줄 검색의 나머지 히트는 `templates/` 아래 미러(`playwright-compress.sh:54`)와 테스트 주석(`tests/unit/core/hooks-scripts.test.ts:2863`)이고, 이음 줄 검색의 나머지 히트는 `templates/` 아래 `agora` 미러(같은 줄 번호)와 다음 줄이 `-p`가 아닌 줄(`.claude/hooks/scripts/adaptive-harness-scan.sh:12`와 그 미러, `.github/workflows/ci.yml:336`~`:337`, `tests/unit/skills/agora-scripts.test.ts:373`의 주석)입니다. 이 검색은 코드 확장자 파일에서 같은 줄과 바로 다음 이음 줄의 형태만 잡으므로 다른 변수명·배열 인자 형태의 호출은 놓칠 수 있으며, 배열 인자 형태 검색(`git grep -n -P "['\"]claude['\"]\s*,\s*\[|['\"]-p['\"]" HEAD -- '*.ts' '*.js' '*.mjs' '*.py' ':!**/*.test.ts'`)은 0건이었습니다. `agora`의 `run_sanitized`는 `AGORA_` 접두 환경 변수만 제거해 자식 프로세스를 띄웁니다(`.claude/skills/agora/scripts/reviewers.sh:49`~`:53`, `:151`). `playwright-compress.sh`는 출력이 3000자 이상일 때만 요약을 시도하고(`:44`~`:48`), `claude -p`가 0이 아닌 코드로 끝나면 원본 입력을 그대로 돌려줍니다(`:54`~`:58`). 다만 "Not logged in" 상태의 `claude -p`가 0으로 끝나며 그 문구를 stdout에 낸다면, 그 문구가 요약으로 쓰여 `:80`~`:81`에서 `tool_response`·`updatedMCPToolOutput`을 대체할 수 있습니다 [가설 — 로그아웃 상태 `claude -p`의 exit code와 stdout으로 판정]. 이 저장소를 cloud 세션에서 실행하는지, 위 자식 프로세스들이 "세션의 환경 변수 없이 시작된" 조건에 해당하는지는 관측하지 않았습니다 [가설 — cloud 세션에서 브라우저 MCP 도구를 호출한 뒤 훅이 요약을 돌려주는지 원본을 돌려주는지 306 전후로 비교하면 판정 가능].
2727
+ (306) cloud 세션 안에서 세션의 환경 변수 없이 시작된 `claude -p`가 "Not logged in"을 보고하던 결함이 수정되었습니다. 이 저장소 코드에서 `claude -p` 호출은 같은 줄 검색 `git grep -n -P '(\bclaude\b|CLAUDE[A-Z_]*BIN)[^\n]*?\s-p(\s|$|")' HEAD -- '*.sh' '*.bash' '*.ts' '*.js' '*.mjs' '*.cjs' '*.py' '*.yml' '*.yaml' '.husky/*'`와 줄 이음 검색 `git grep -n -P -A1 '(\bclaude\b|CLAUDE[A-Z_]*BIN)[^\n]*\\\s*$' HEAD -- '*.sh' '*.bash' '*.ts' '*.js' '*.mjs' '*.cjs' '*.py' '*.yml' '*.yaml' '.husky/*'`로 관측한 범위에서 네 계열(미러·테스트를 뺀 파일 5개)에 나타납니다. 첫째, 훅 `.claude/hooks/scripts/playwright-compress.sh:54`가 `claude -p --model haiku`로 브라우저 MCP 출력을 요약하며, 이 훅은 `.claude/settings.json:579`에 `mcp__playwright__.*|mcp__claude-in-chrome__.*` matcher(`:582`)로 배선되어 있습니다. 둘째, Web UI 서버 `packages/serve/src/lib/server/claude-cli.ts:40`, `:86`, `:117`, `:174`가 `` `claude -p ${escapeShellArg(prompt)} --no-input` `` 명령 문자열을 조립합니다. 셋째, `agora` 스킬의 `.claude/skills/agora/scripts/reviewers.sh:168`~`:169`와 `.claude/skills/agora/scripts/judge.sh:223`~`:224`가 변수 바이너리 `"$AGORA_CLAUDE_BIN"` 뒤의 이음 줄에서 `-p`를 넘깁니다. 넷째, `infra/hada-scout/scout-runner.sh:109`가 `timeout "${SCOUT_TIMEOUT}" claude -p`를 실행합니다. 같은 줄 검색의 나머지 히트는 `templates/` 아래 미러(`playwright-compress.sh:54`)와 테스트 주석(`tests/unit/core/hooks-scripts.test.ts:2863`)이고, 이음 줄 검색의 나머지 히트는 `templates/` 아래 `agora` 미러(같은 줄 번호)와 다음 줄이 `-p`가 아닌 줄(`.claude/hooks/scripts/adaptive-harness-scan.sh:12`와 그 미러, `.github/workflows/ci.yml:336`~`:337`, `tests/unit/skills/agora-scripts.test.ts:373`의 주석)입니다. 이 검색은 코드 확장자 파일에서 같은 줄과 바로 다음 이음 줄의 형태만 잡으므로 다른 변수명·배열 인자 형태의 호출은 놓칠 수 있으며, 배열 인자 형태 검색(`git grep -n -P "['\"]claude['\"]\s*,\s*\[|['\"]-p['\"]" HEAD -- '*.ts' '*.js' '*.mjs' '*.py' ':!**/*.test.ts'`)은 0건이었습니다. `agora`의 두 스크립트는 각자의 `run_sanitized`로 `AGORA_` 접두 환경 변수만 제거해 자식 프로세스를 띄우며(`.claude/skills/agora/scripts/reviewers.sh:49`~`:53`, `:151`; `.claude/skills/agora/scripts/judge.sh:52`~`:56`, `:177`), `AGORA_CLAUDE_BIN`의 기본값은 `claude`입니다(`reviewers.sh:15`, `judge.sh:20`). `playwright-compress.sh`는 출력이 3000자 이상일 때만 요약을 시도하고(`:44`~`:48`), `claude -p`가 0이 아닌 코드로 끝나면 원본 입력을 그대로 돌려줍니다(`:54`~`:58`). 다만 "Not logged in" 상태의 `claude -p`가 0으로 끝난다면 결과는 두 갈래로 나뉩니다. 그 문구를 stdout에 낸다면 그 문구가 요약이 되고, stdout이 비었다면(stderr 출력은 `:54`의 `2>/dev/null`이 버림) 빈 문자열이 요약이 됩니다. 원본에 `:51`의 패턴 `ref="[^"]*"`(큰따옴표로 감싼 `ref=` 값)과 일치하는 값이 있었다면, 두 갈래 모두 요약에 없는 그 값들이 `:61`~`:74`에서 `[Preserved refs]` 줄로 덧붙습니다. 어느 갈래든 최종 요약이 `:80`~`:81`에서 훅 출력의 `tool_response`·`updatedMCPToolOutput` 값이 됩니다 [가설 — 로그아웃 상태 `claude -p`의 exit code와 stdout으로 판정]. 그 값이 실제 MCP 도구 결과를 대체하는지는 v2.1.296 절이 실측하지 않았다고 기록한 최상위 `updatedMCPToolOutput` 키의 적용 여부에도 달려 있습니다 [가설 — v2.1.296 절과 같이 훅 적용 전후 MCP 도구 결과를 비교하면 판정]. 이 저장소를 cloud 세션에서 실행하는지, 위 자식 프로세스들이 "세션의 환경 변수 없이 시작된" 조건에 해당하는지는 관측하지 않았습니다 [가설 — cloud 세션에서 브라우저 MCP 도구를 호출한 뒤 훅이 요약을 돌려주는지 원본을 돌려주는지 306 전후로 비교하면 판정 가능].
2728
2728
 
2729
2729
  기타 0건 — 이 저장소 비해당 항목은 없습니다. 실측: `gh release view v2.1.306 --repo anthropics/claude-code --json body --jq .body | grep -c '^- '` = 2건 중 위 본문 2건을 다뤘으므로 2 − 2 = 0건입니다. 계수 범위는 해당 릴리즈 노트의 최상위 불릿 줄(`- `로 시작하는 줄)입니다.
2730
2730
 
2731
2731
  **Action items**:
2732
- - 관측한 범위에서 훅·설정 변경이 필요하다고 확정한 항목은 없습니다. 첫 항목은 진단 해석에 관한 것입니다. 둘째 항목의 `playwright-compress.sh`는 `claude -p`가 0이 아닌 코드로 끝나는 경우 원본을 반환하도록 작성되어 있으나(`.claude/hooks/scripts/playwright-compress.sh:54`~`:58`), 로그아웃 상태에서 0으로 끝나는 경우의 동작은 위 [가설]입니다.
2732
+ - 관측한 범위에서 훅·설정 변경이 필요하다고 확정한 항목은 없습니다. 첫 항목은 진단 해석에 관한 것입니다. 둘째 항목의 `playwright-compress.sh`는 `claude -p`가 0이 아닌 코드로 끝나는 경우 원본을 반환하도록 작성되어 있으나(`.claude/hooks/scripts/playwright-compress.sh:54`~`:58`), 로그아웃 상태에서 0으로 끝나는 경우의 동작(문구가 stdout에 나오는 갈래와 stdout이 비는 갈래)과 그 결과가 실제 MCP 도구 결과를 대체하는지는 위 [가설]입니다.
2733
2733
  - 306 이전 버전에서 MCP 도구가 많은 세션의 "prompt is too long" 보고나 compaction을 진단할 때는 컨텍스트 초과로 단정하기 전에 실제 컨텍스트 크기와 원래 API 오류를 먼저 확인합니다. 룰 변경 제안은 없습니다(R016: CC 지식은 이 가이드에 둡니다).
2734
2734
  - (306) 항목 중 `[가설 — …]` 표기는 판정 기준을 충족하는 측정이 이루어지기 전에는 결론으로 쓰지 않습니다.
2735
2735
 
@@ -2738,19 +2738,19 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2738
2738
  ## v2.1.307 (2026-10-21)
2739
2739
 
2740
2740
  > Issue: #1870 — Claude Code v2.1.307 compatibility documentation
2741
- > Scope-ceiling check (R017): 조사 시점(2026-10-25)의 최신 릴리즈는 2.1.310입니다(`claude --version`=2.1.310, `npm view @anthropic-ai/claude-code version`=2.1.310). 2.1.308·2.1.309·2.1.310 CHANGELOG 절을 각각 잘라 `2.1.307` 문자열과 "Revert"를 검색한 결과 세 절 모두 두 문자열이 0건이었으므로(`for v in 2.1.308 2.1.309 2.1.310; do awk -v v="$v" '/^## /{p=($2==v)} p' CHANGELOG.md | grep -c -F -e 2.1.307; awk -v v="$v" '/^## /{p=($2==v)} p' CHANGELOG.md | grep -c -i revert; done` 출력 0 여섯 줄), 이 릴리즈 항목을 되돌리거나 좁히는 문장은 관측되지 않았습니다. 아래 본문 항목의 핵심어로 309·310 절을 검색하면(`for v in 2.1.309 2.1.310; do awk -v v="$v" '/^## /{p=($2==v)} p' CHANGELOG.md | grep -n -i -E 'keychain|sleep|idempotent|thrash|compact|safety_event|\[1m\]|recently[- ]denied|unparseable|axScreenReader'; done`) 309 절 14·38행과 310 절 3·6·11행이 걸립니다(절 머리 줄을 1행으로 센 번호). 310:3은 Monitor 도구 항목으로 "sleep" 단어가 일치했을 뿐 MCP 연결 중 절전과는 무관합니다. compaction 히트 가운데 309:14(매우 큰 중첩 CLAUDE.md 아래 파일을 읽은 뒤 세션이 반복 compaction하던 결함, 크기 한도를 넘는 중첩 CLAUDE.md는 이제 앞부분만 로드)가 아래 "Autocompact is thrashing" 항목과 가장 가까운 후속 항목이지만, 원인 조건이 다른 별개 수정이며 307 항목을 되돌리거나 좁히지 않습니다. 309:38(compaction이 일어난 턴의 남은 artifact 업데이트마다 권한을 묻던 결함), 310:6(base64·SVG 같은 밀도 높은 텍스트가 있는 대화에서 "Prompt is too long" 오류 뒤의 compaction, 2.1.306 절에서 인용), 310:11(비대화형 세션(`-p`, Agent SDK)에서 트랜스크립트 파일이 매우 클 때 compaction 중 메모리 사용)도 별개 수정입니다. 릴리즈 게시 시각은 2026-10-21T22:17:02Z입니다(`gh release view v2.1.307 -R anthropics/claude-code --json publishedAt`).
2741
+ > Scope-ceiling check (R017): 조사 시점(2026-10-25)의 최신 릴리즈는 2.1.310입니다(`claude --version`=2.1.310, `npm view @anthropic-ai/claude-code version`=2.1.310). 이 절의 `awk` 명령이 읽는 `CHANGELOG.md`는 저장소 루트의 같은 이름 파일이 아니라 `gh api -H 'Accept: application/vnd.github.raw' repos/anthropics/claude-code/contents/CHANGELOG.md > CHANGELOG.md`로 받은 Claude Code CHANGELOG이며, 빈 파일이나 저장소 루트 `CHANGELOG.md`(커밋 82a7e4c6의 파일)로도 상한 루프가 0만 출력하므로(2026-10-25 측정) 대상 절 머리(`grep -c -E '^## 2\.1\.(308|309|310)$' CHANGELOG.md` = 3)를 먼저 확인합니다. 2.1.308·2.1.309·2.1.310 CHANGELOG 절을 각각 잘라 `2.1.307` 문자열과 "Revert"를 검색한 결과 세 절 모두 두 문자열이 0건이었으므로(`for v in 2.1.308 2.1.309 2.1.310; do awk -v v="$v" '/^## /{p=($2==v)} p' CHANGELOG.md | grep -c -F -e 2.1.307; awk -v v="$v" '/^## /{p=($2==v)} p' CHANGELOG.md | grep -c -i revert; done` 출력 0 여섯 줄), 이 릴리즈 항목을 되돌리거나 좁히는 문장은 관측되지 않았습니다. 아래 본문 항목의 핵심어 일부로 309·310 절을 검색하면(`for v in 2.1.309 2.1.310; do awk -v v="$v" '/^## /{p=($2==v)} p' CHANGELOG.md | grep -n -i -E 'keychain|sleep|idempotent|thrash|compact|safety_event|\[1m\]|recently[- ]denied|unparseable|axScreenReader'; done`) 309 절 14·38행과 310 절 3·6·11행이 걸립니다(절 머리 줄을 1행으로 센 번호). 310:3은 Monitor 도구 항목으로 "sleep" 단어가 일치했을 뿐 MCP 연결 중 절전과는 무관합니다. compaction 히트 가운데 309:14(매우 큰 중첩 CLAUDE.md 아래 파일을 읽은 뒤 세션이 반복 compaction하던 결함, 크기 한도를 넘는 중첩 CLAUDE.md는 이제 앞부분만 로드)가 아래 "Autocompact is thrashing" 항목과 가장 가까운 후속 항목이지만, 원인 조건이 다른 별개 수정이며 307 항목을 되돌리거나 좁히지 않습니다. 309:38(compaction이 일어난 턴의 남은 artifact 업데이트마다 권한을 묻던 결함), 310:6(base64·SVG 같은 밀도 높은 텍스트가 있는 대화에서 "Prompt is too long" 오류 뒤의 compaction, 이 가이드 v2.1.306 절의 범위 확인 문단이 원문을 인용)도 별개 수정이고, 310:11(비대화형 세션(`-p`, Agent SDK)에서 트랜스크립트 파일이 매우 클 때 compaction 중 메모리 사용)은 별개 개선("Improved")입니다. 위 핵심어 검색의 정규식은 본문 항목의 핵심어를 모두 담지 않습니다. 빠진 핵심어(fork, stop reason, background, `CLAUDE_AX_SCREEN_READER`)로 같은 두 절을 검색한 `for v in 2.1.309 2.1.310; do awk -v v="$v" '/^## /{p=($2==v)} p' CHANGELOG.md | grep -n -i -E 'fork|stop reason|background|AX_SCREEN_READER'; done`은 309 절 42·52행과 310 절 5·25행을 돌려주며, 각각 세션보다 오래 산 백그라운드 명령에서 Linux 샌드박스 write deny가 풀리던 결함, 번들 dataviz 스킬의 `apca(text, background)` 함수, `cleanupPeriodDays`가 매우 클 때의 백그라운드 정리, Claude Tag 번들 목록의 백그라운드 새로 고침이라 307 항목을 되돌리거나 좁히지 않습니다. MCP 인접 항목은 `for v in 2.1.309 2.1.310; do awk -v v="$v" '/^## /{p=($2==v)} p' CHANGELOG.md | grep -n -E 'MCP'; done`에서 309 절 5·6행과 310 절 14행이 걸립니다. 309:5(`--mcp-config`로 넘긴 MCP 설정 파일을 샌드박스 명령·자동 승인 편집이 고칠 수 있던 결함), 309:6(print·SDK 세션에서 비활성화된 MCP 서버가 나중의 권한 프롬프트로 다시 연결되던 결함), 310:14(비대화형 세션에서 서버의 elicitation에 답이 없는 채로 타임아웃된 MCP 도구 호출의 오류 문구 변경)는 307 본문의 MCP 항목(키체인 잠금, 연결 중 절전, HTTP 호출 이중 전송)과 대상이 다른 별개 항목입니다. 두 보조 검색도 핵심어 표본이므로 다른 표현으로 쓰인 후속 항목은 놓칠 수 있습니다. 릴리즈 게시 시각은 2026-10-21T22:17:02Z입니다(`gh release view v2.1.307 -R anthropics/claude-code --json publishedAt`).
2742
2742
 
2743
2743
  ### 모델 · 컨텍스트 · compaction
2744
2744
 
2745
2745
  - CHANGELOG 원문: "Fixed requests failing with a model-not-found error when `CLAUDE_CODE_DISABLE_1M_CONTEXT` is set and the model is an alias with the `[1m]` suffix, such as `opus[1m]`"
2746
- (307) `CLAUDE_CODE_DISABLE_1M_CONTEXT`가 설정된 상태에서 모델이 `opus[1m]`처럼 `[1m]` 접미사가 붙은 별칭이면 요청이 model-not-found 오류로 실패하던 결함이 수정되었습니다. R013은 이 환경 변수가 native 1M 창 모델을 auto-compaction으로 200K에 유지한다고 기록하고(`.claude/rules/SHOULD-ecomode.md:91`, 보이는 텍스트), R006은 `[1m]` 접미사를 1M 창 활성화 표기로 설명합니다(`.claude/rules/MUST-agent-design.md:62`, 보이는 텍스트). 저장소가 추적하는 파일 범위에서 에이전트 frontmatter의 `model:` 값은 `claude-sonnet-5-5` 42개, `claude-opus-5-5` 5개, `haiku` 3개이고(`git grep -h -E '^model:' HEAD -- '.claude/agents/*.md' | sort | uniq -c`), `[1m]` 표기는 `.claude/agents`·`.claude/settings.json`·`templates/.claude/settings.json`에서 0건이며(`git grep -n -F '[1m]' HEAD -- .claude/agents .claude/settings.json templates/.claude/settings.json` 출력 없음), `CLAUDE_CODE_DISABLE_1M_CONTEXT`는 tracked 설정 두 파일에 없습니다(`git grep -c CLAUDE_CODE_DISABLE_1M_CONTEXT HEAD -- .claude/settings.json templates/.claude/settings.json` rc=1). 검색을 코드·설정 확장자 전체로 넓힌 `git grep -n -F -e '[1m]' -e 'CLAUDE_CODE_DISABLE_1M_CONTEXT' HEAD -- '*.sh' '*.bash' '*.ts' '*.js' '*.mjs' '*.py' '*.yml' '*.yaml' '*.json' '.husky/*'`에서도 환경 변수는 0건이고, `[1m]` 히트는 주석(`.claude/hooks/scripts/audit-log.sh:29`와 그 미러)과 테스트 픽스처(`tests/unit/core/hooks-scripts-shape.test.ts:274`, `:280`, `tests/unit/core/template-validation.test.ts:108`, `:526`)입니다. 따라서 관측한 범위에서 저장소가 추적하는 설정만으로는 이 결함의 두 조건이 함께 만들어지지 않습니다. 다만 이 환경 변수와 모델 별칭은 셸 환경, user 범위 설정, gitignore된 `.claude/settings.local.json`(`git check-ignore -v --no-index .claude/settings.local.json` 결과 `.gitignore:40:.claude/*`)에서도 정해질 수 있으므로, 실제 해당 여부는 기기마다 다릅니다. 유지보수자 기기에서의 관측(2026-10-25, CC 2.1.310)으로는 셸 환경 변수가 설정되지 않았고(`[ -n "${CLAUDE_CODE_DISABLE_1M_CONTEXT+x}" ]` 거짓), user·local 설정 파일의 `CLAUDE_CODE_DISABLE_1M_CONTEXT`·`[1m]` 계수도 0이었습니다(`command grep -c -F -e CLAUDE_CODE_DISABLE_1M_CONTEXT ~/.claude/settings.json .claude/settings.local.json`, `command grep -c -F -e '[1m]' ~/.claude/settings.json .claude/settings.local.json`). R002가 기록한 이 저장소 실행 환경의 `claude-opus-5[1m]`(`.claude/rules/MUST-permissions.md:145`, 보이는 텍스트)은 `claude -p --output-format stream-json` init 이벤트에서 얻은 측정값이며(측정 방법은 `:143`, HTML 주석 안), `opus[1m]` 별칭을 골라 나온 값일 수도 있습니다. 그러나 그 측정 기록에는 `CLAUDE_CODE_DISABLE_1M_CONTEXT` 설정 여부가 적혀 있지 않으므로 이 결함 조건의 증거로 쓰지 않습니다. 수정 뒤 이 조합이 어떤 창 크기로 실행되는지는 원문이 밝히지 않습니다 [가설 — 환경 변수를 켜고 `opus[1m]`으로 시작한 세션의 `/context` 창 크기를 확인하면 판정 가능].
2746
+ (307) `CLAUDE_CODE_DISABLE_1M_CONTEXT`가 설정된 상태에서 모델이 `opus[1m]`처럼 `[1m]` 접미사가 붙은 별칭이면 요청이 model-not-found 오류로 실패하던 결함이 수정되었습니다. R013은 이 환경 변수가 native 1M 창 모델을 auto-compaction으로 200K에 유지한다고 기록하고(`.claude/rules/SHOULD-ecomode.md:91`, 보이는 텍스트), R006은 `[1m]` 접미사를 1M 창 활성화 표기로 설명합니다(`.claude/rules/MUST-agent-design.md:62`, 보이는 텍스트). 저장소가 추적하는 파일 범위에서 에이전트 frontmatter의 `model:` 값은 `claude-sonnet-5-5` 42개, `claude-opus-5-5` 5개, `haiku` 3개이고(`git grep -h -E '^model:' HEAD -- '.claude/agents/*.md' | sort | uniq -c`), `[1m]` 표기는 `.claude/agents`·`.claude/settings.json`·`templates/.claude/settings.json`에서 0건이며(`git grep -n -F '[1m]' HEAD -- .claude/agents .claude/settings.json templates/.claude/settings.json` 출력 없음), `CLAUDE_CODE_DISABLE_1M_CONTEXT`는 tracked 설정 두 파일에 없습니다(`git grep -c CLAUDE_CODE_DISABLE_1M_CONTEXT HEAD -- .claude/settings.json templates/.claude/settings.json` rc=1). 검색을 코드·설정 확장자 일부로 넓힌 `git grep -n -F -e '[1m]' -e 'CLAUDE_CODE_DISABLE_1M_CONTEXT' HEAD -- '*.sh' '*.bash' '*.ts' '*.js' '*.mjs' '*.py' '*.yml' '*.yaml' '*.json' '.husky/*'`에서도 환경 변수는 0건이고, `[1m]` 히트는 주석(`.claude/hooks/scripts/audit-log.sh:29`와 그 미러)과 테스트 파일의 줄(`tests/unit/core/hooks-scripts-shape.test.ts:274`의 입력 픽스처, `:280`의 단언, `tests/unit/core/template-validation.test.ts:108`의 JSDoc 주석, `:526`의 단언 입력 배열 항목)입니다. 이 pathspec 밖에도 `.toml`·`.jq`·`.rs`·`.svelte` 같은 추적 확장자가 있으나, `.md`만 뺀 `git grep -n -F -e '[1m]' -e 'CLAUDE_CODE_DISABLE_1M_CONTEXT' HEAD -- . ':!*.md'`도 같은 6줄을 돌려줍니다. 따라서 관측한 범위에서 저장소가 추적하는 설정만으로는 이 결함의 두 조건이 함께 만들어지지 않습니다. 다만 이 환경 변수와 모델 별칭은 셸 환경, user 범위 설정, gitignore된 `.claude/settings.local.json`(`git check-ignore -v --no-index .claude/settings.local.json` 결과 `.gitignore:40:.claude/*`)에서도 정해질 수 있으므로, 실제 해당 여부는 기기마다 다릅니다. 유지보수자 기기에서의 관측(2026-10-25, CC 2.1.310)으로는 셸 환경 변수가 설정되지 않았고(`[ -n "${CLAUDE_CODE_DISABLE_1M_CONTEXT+x}" ]` 거짓), user·local 설정 파일의 `CLAUDE_CODE_DISABLE_1M_CONTEXT`·`[1m]` 계수도 0이었습니다(`command grep -c -F -e CLAUDE_CODE_DISABLE_1M_CONTEXT ~/.claude/settings.json .claude/settings.local.json`, `command grep -c -F -e '[1m]' ~/.claude/settings.json .claude/settings.local.json`). R002가 기록한 이 저장소 실행 환경의 `claude-opus-5[1m]`(`.claude/rules/MUST-permissions.md:145`, 보이는 텍스트)은 `claude -p --output-format stream-json` init 이벤트의 `tools` 배열을 측정한 기록(`:143`, HTML 주석 안)에 실행 모델로 함께 적힌 값이며, 그 기록은 이 모델 ID를 어디서 읽었는지 밝히지 않습니다. 이 값은 `opus[1m]` 별칭을 골라 나온 값일 수도 있습니다. 그러나 그 측정 기록에는 `CLAUDE_CODE_DISABLE_1M_CONTEXT` 설정 여부가 적혀 있지 않으므로 이 결함 조건의 증거로 쓰지 않습니다. 수정 뒤 이 조합이 어떤 창 크기로 실행되는지는 원문이 밝히지 않습니다 [가설 — 환경 변수를 켜고 `opus[1m]`으로 시작한 세션의 `/context` 창 크기를 확인하면 판정 가능].
2747
2747
  - CHANGELOG 원문: "Fixed some "Autocompact is thrashing" errors in turns that read many PDF pages, images or other large tool results"
2748
2748
  (307) PDF 페이지·이미지·그 밖의 큰 도구 결과를 많이 읽는 턴에서 나던 "Autocompact is thrashing" 오류 일부가 수정되었습니다. 원문이 "some"으로 범위를 한정하므로 이 조건의 턴에서도 이 오류가 모두 해소되었다고 보지 않습니다. 관측한 범위(`git grep -n -i thrashing HEAD -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'` 0건)에서 이 저장소의 룰·스킬·훅은 이 오류 문구를 참조하지 않습니다. R013 컨텍스트 예산 임계값은 창 대비 백분율이므로(`.claude/rules/SHOULD-ecomode.md:91`) 이 수정으로 바뀌지 않습니다.
2749
2749
 
2750
2750
  ### MCP
2751
2751
 
2752
2752
  - CHANGELOG 원문: "Fixed MCP servers showing "needs authentication" in `claude -p` on macOS while the login keychain was locked; they now say why, and the next run after an unlock connects without a new sign-in"
2753
- (307) macOS에서 로그인 키체인이 잠긴 동안 `claude -p`의 MCP 서버가 "needs authentication"으로 표시되던 결함이 수정되어, 이제 MCP 서버가 그 이유를 알려주고, 잠금 해제 뒤의 다음 실행은 새 로그인 없이 연결됩니다. `.mcp.json`의 `eraser`는 `url`과 `type: "http"`만 가진 원격 서버 정의이므로(`git show HEAD:.mcp.json`, `.mcp.json:14`~`:17`), 저장소 설정만으로는 이 서버가 키체인에 자격 증명을 두는 인증을 거치는지 알 수 없습니다. `/fsd` 스킬은 무인(`claude -p`, 예약 실행) 세션에서 `/goal`·`/loop`를 호출하는 경로를 권장하며(`.claude/skills/fsd/SKILL.md:172`), 저장소 코드가 `claude -p`를 직접 띄우는 예로는 `agora` 스킬의 `.claude/skills/agora/scripts/reviewers.sh:168`~`:169`(`"$AGORA_CLAUDE_BIN"` 뒤 이음 줄의 `-p`)가 있습니다. 이런 `claude -p` 실행이 macOS에서 로그인 키체인이 잠긴 동안 이뤄졌고 그때 MCP 서버가 "needs authentication"으로 보였다면, 원인 하나가 키체인 잠금이었을 수 있습니다 [가설 — 키체인이 잠긴 macOS에서 `claude -p`의 MCP 상태 메시지를 306과 307에서 비교하면 판정 가능]. 원문은 잠금 해제 뒤의 다음 실행이 연결된다고 적을 뿐 잠긴 동안 연결된다고 적지 않으므로, 무인 실행의 MCP 의존 단계는 계속 연결 상태를 실측합니다.
2753
+ (307) macOS에서 로그인 키체인이 잠긴 동안 `claude -p`의 MCP 서버가 "needs authentication"으로 표시되던 결함이 수정되어, 이제 MCP 서버가 그 이유를 알려주고, 잠금 해제 뒤의 다음 실행은 새 로그인 없이 연결됩니다. `.mcp.json`의 `eraser`는 `url`과 `type: "http"`만 가진 원격 서버 정의이므로(`git show HEAD:.mcp.json`, `.mcp.json:14`~`:17`), 저장소 설정만으로는 이 서버가 키체인에 자격 증명을 두는 인증을 거치는지 알 수 없습니다. `/fsd` 스킬은 세션이 무인(`claude -p`, 예약 실행)이라 자기 페이싱이 필요할 때 `/goal`·`/loop`를 호출하는 경로를 권장하며(`.claude/skills/fsd/SKILL.md:172`), 저장소 코드가 `claude -p`를 직접 띄우는 예로는 `agora` 스킬의 `.claude/skills/agora/scripts/reviewers.sh:168`~`:169`(`"$AGORA_CLAUDE_BIN"` 뒤 이음 줄의 `-p`)가 있습니다. 이런 `claude -p` 실행이 macOS에서 로그인 키체인이 잠긴 동안 이뤄졌고 그때 MCP 서버가 "needs authentication"으로 보였다면, 원인 하나가 키체인 잠금이었을 수 있습니다 [가설 — 키체인이 잠긴 macOS에서 `claude -p`의 MCP 상태 메시지를 306과 307에서 비교하면 판정 가능]. 원문은 잠금 해제 뒤의 다음 실행이 연결된다고 적을 뿐 잠긴 동안 연결된다고 적지 않으므로, 무인 실행의 MCP 의존 단계는 계속 연결 상태를 실측합니다.
2754
2754
  - CHANGELOG 원문: "Fixed MCP servers being reported as timed out, and staying failed in headless runs, when a macOS or Linux computer went to sleep while they were connecting"
2755
2755
  (307) MCP 서버가 연결되는 도중 macOS·Linux 컴퓨터가 절전에 들어가면 타임아웃으로 보고되던 결함과, 그때 headless 실행에서는 실패 상태로 남던 결함이 수정되었습니다. R004는 절전·연결 끊김·서버 오류로 mid-stream 절단된 서브에이전트 응답이 자동으로 이어진다는 (257) 노트를 두고 있으며(`.claude/rules/SHOULD-error-handling.md:30`, 보이는 텍스트), 이 수정은 같은 절전 계열이지만 대상이 MCP 연결 단계라는 점이 다릅니다. 307 이전 macOS·Linux에서 MCP 서버가 연결 중 "timed out"으로 보고되었다면 서버 장애가 아니라 연결 중 절전이 원인이었을 수 있고, 그 실행이 headless(`claude -p`)였다면 원문상 실패 상태가 그대로 남는 결과까지 이어졌을 수 있습니다 [가설 — 실패 시각과 시스템 절전 기록(`pmset -g log`)을 대조하면 판정 가능]. 원문이 전송 방식을 한정하지 않으므로 `.mcp.json`의 두 서버(stdio `ontology-rag`, http `eraser`, `git show HEAD:.mcp.json`) 중 어느 쪽이 해당하는지는 구분하지 않습니다.
2756
2756
  - CHANGELOG 원문: "Fixed HTTP MCP tool calls being sent twice when the connection closed mid-call; only read-only or idempotent tools are now retried"
@@ -2779,11 +2779,11 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2779
2779
  - CHANGELOG 원문: "Added the `claude_code.safety_event` OpenTelemetry event for each tool call a permission rule, auto mode, a safety check, a hook or the sandbox stopped, prompted or sent back"
2780
2780
  (307) 권한 규칙·auto mode·안전 검사·훅·샌드박스가 도구 호출을 멈추거나, 확인을 요청하거나, 되돌려 보낼 때마다 발생하는 `claude_code.safety_event` OpenTelemetry 이벤트가 추가되었습니다. 이 저장소의 `monitoring-setup` 스킬은 2.1.307이 속하는 「2.1.282 이상」 갈래(`.claude/skills/monitoring-setup/SKILL.md:58`)에서 `CLAUDE_CODE_ENABLE_TELEMETRY`·`OTEL_METRICS_EXPORTER`·`OTEL_LOGS_EXPORTER`를 console로 켜는 env 블록(`:66`~`:68`)을 user-scope 설정이나 셸 export로 배치하도록 안내합니다(`:73`~`:74`). 원문은 이 이벤트가 어느 exporter로 나가는지 밝히지 않으므로, 그 절차로 켠 console 출력에 이 이벤트가 나타나는지는 [가설 — 텔레메트리를 켠 세션에서 훅 차단 1건을 일으켜 console 출력에 `claude_code.safety_event`가 찍히는지 확인하면 판정 가능]입니다. R021 표는 Hard Block 훅으로 stage-blocker, dev-server tmux, rule-deletion-guard를 듭니다(`.claude/rules/MUST-enforcement-policy.md:19`, 보이는 텍스트). 이 중 `exit 2`로 끝나는 차단 경로가 코드에서 확인되는 것은 `.claude/hooks/scripts/stage-blocker.sh:13`과 `.claude/hooks/scripts/rule-deletion-guard.sh`(`:32`, `:46`, `:56`, `:881`)이며(`git show HEAD:.claude/hooks/scripts/stage-blocker.sh | grep -n 'exit 2'`, `git show HEAD:.claude/hooks/scripts/rule-deletion-guard.sh | grep -n 'exit 2'`), 이 이벤트는 이 두 훅이 도구 호출을 멈춘 경우를 세는 결정론적 소스 후보입니다. dev-server tmux 훅은 `.claude/settings.json:52`의 인라인 명령이 `exit 1`로 끝나므로(`git show HEAD:.claude/settings.json | awk 'NR==52' | grep -o -E 'exit [0-9]+'` = `exit 1`) 실제로 도구 호출을 멈추는지가 열린 이슈 #1856에서 아직 실측되지 않았고, 이 이벤트가 그 훅에 대해 기록되는지도 [가설 — #1856의 런타임 차단 실측과 함께 판정]입니다. R010 「Subagent Scope-Creep STOP Protocol」의 2회 trip 계수(`.claude/rules/MUST-orchestrator-coordination.md:262`, 보이는 텍스트)에도 쓸 수 있을지는, 이 이벤트가 서브에이전트의 classifier trip을 다른 차단과 구분해 기록하는지 원문이 밝히지 않으므로 [가설 — 이벤트 속성에 차단 주체와 에이전트 식별자가 있는지 확인하면 판정 가능]입니다. R021 표의 `failure-ledger.sh`(`.claude/rules/MUST-enforcement-policy.md:24`, 보이는 텍스트)는 PostToolUseFailure 훅으로 도구 실패를 원장에 남기는 별도 장치이며, 관측한 범위(`git grep -n safety_event HEAD -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'` 0건)에서 이 저장소는 아직 이 이벤트를 참조하지 않습니다.
2781
2781
 
2782
- 기타 31건 — 이 저장소 비해당으로 판단한 항목입니다: Claude API 코드를 API 버전 `2026-10-21`로 옮기는 옵트인 명령 `/claude-api api-version`, 맞춤 `ANTHROPIC_BASE_URL` 게이트웨이 뒤와 Foundry에서의 `prompt-caching-scope` 헤더(저장소가 추적하는 `.claude/settings.json`·`templates/.claude/settings.json`에 `ANTHROPIC_BASE_URL` 0건, `git grep -c ANTHROPIC_BASE_URL HEAD -- .claude/settings.json templates/.claude/settings.json` rc=1), Agent SDK 전용 항목(백그라운드 작업이 도는 동안 턴이 때때로 SDK MCP 서버의 최신 도구 없이 시작되던 결함, API 확인이 5초를 넘을 때의 `setModel()` 대기), cloud sessions·self-hosted runner 전용 항목(재시작 뒤 `/autocompact` 창 유지, 재시작 시 `/clear`한 대화가 때때로 되살아나던 결함, 웹 검색 403 사유 표시, 데스크톱 앱 MCP 연결 실패 시의 첫 응답 지연, checkout 훅·인증서·git proxy 등), Claude apps gateway 전용 항목(`CLAUDE_STREAM_FIRST_BYTE_TIMEOUT_MS`, Desktop 텔레메트리), 앱·도구 연동 세부(Cowork cloud 세션의 WebFetch, 데스크톱 앱 Code 탭의 GitHub MCP 양식, Artifact 도구 읽기의 연결 재사용), CLI 브라우저 로그인 성공 페이지가 뜨는 시점, 큰 붙여넣기 이미지·PDF 읽기가 든 세션의 Remote Control 연결 시간, `/help`·`/` 메뉴의 번들 스킬 설명 표시, WebSearch 예산 소진 안내 문구, VSCode·Cloud sessions·Code Review 전용 항목. 기능어 표본 검색(`git grep -l -i -E 'api-version|prompt-caching-scope|setModel|createSdkMcpServer|CLAUDE_STREAM_FIRST_BYTE_TIMEOUT_MS|OTEL_EXPORTER_OTLP_HEADERS|Cowork|remote.control|checkout-hook|use-anthropic-git-proxy|self-hosted|WebSearch budget' HEAD -- .claude CLAUDE.md .github package.json`)의 히트 파일은 `.claude/rules/` 아래 8개와 `.github/scripts/send-report.ts` 하나이며, 후자의 히트는 GitHub REST 요청 헤더 `X-GitHub-Api-Version`(`:44`)의 부분 문자열 일치입니다. 룰 파일 8개의 히트는 문맥별로 판정하지 않았고, 기능어가 없는 표시·성능 항목도 검색으로 판정하지 않았습니다 [가설 — 항목별 저장소 측정은 위 본문 항목에 한해 실행했습니다]. 실측: `gh release view v2.1.307 --repo anthropics/claude-code --json body --jq .body | grep -c '^- '` = 43건 중 위 본문 12건을 다뤘으므로 43 − 12 = 31건입니다. 계수 범위는 해당 릴리즈 노트의 최상위 불릿 줄(`- `로 시작하는 줄)입니다.
2782
+ 기타 31건 — 이 저장소 비해당으로 판단한 항목입니다: Claude API 코드를 API 버전 `2026-10-21`로 옮기는 옵트인 명령 `/claude-api api-version`, 맞춤 `ANTHROPIC_BASE_URL` 게이트웨이 뒤와 Foundry에서의 `prompt-caching-scope` 헤더(저장소가 추적하는 `.claude/settings.json`·`templates/.claude/settings.json`에 `ANTHROPIC_BASE_URL` 0건, `git grep -c ANTHROPIC_BASE_URL HEAD -- .claude/settings.json templates/.claude/settings.json` rc=1), Agent SDK 전용 항목(백그라운드 작업이 도는 동안 턴이 때때로 SDK MCP 서버의 최신 도구 없이 시작되던 결함, API 확인이 5초를 넘을 때의 `setModel()` 대기), cloud sessions·self-hosted runner 전용 항목(재시작 뒤 `/autocompact` 창 유지, 재시작 시 `/clear`한 대화가 때때로 되살아나던 결함, 웹 검색 403 사유 표시, 데스크톱 앱 MCP 연결 실패 시의 첫 응답 지연, checkout 훅·인증서·git proxy 등), Claude apps gateway 전용 항목(`CLAUDE_STREAM_FIRST_BYTE_TIMEOUT_MS`, Desktop 텔레메트리), 앱·도구 연동 세부(Cowork cloud 세션의 WebFetch, 데스크톱 앱 Code 탭의 GitHub MCP 양식, Artifact 도구 읽기의 연결 재사용), CLI 브라우저 로그인 성공 페이지가 뜨는 시점, 큰 붙여넣기 이미지·PDF 읽기가 든 세션의 Remote Control 연결 시간, `/help`·`/` 메뉴의 번들 스킬 설명 표시, WebSearch 예산 소진 안내 문구, VSCode·Cloud sessions·Code Review 전용 항목. 기능어 표본 검색(`git grep -l -i -E 'api-version|prompt-caching-scope|setModel|createSdkMcpServer|CLAUDE_STREAM_FIRST_BYTE_TIMEOUT_MS|OTEL_EXPORTER_OTLP_HEADERS|Cowork|remote.control|checkout-hook|use-anthropic-git-proxy|self-hosted|WebSearch budget' HEAD -- .claude CLAUDE.md .github package.json`)의 히트 파일은 `.claude/rules/` 아래 8개와 `.github/scripts/send-report.ts` 하나이며, 후자의 히트는 GitHub REST 요청 헤더 `X-GitHub-Api-Version`(`:44`)의 부분 문자열 일치입니다. 룰 파일 8개의 히트는 문맥별로 판정하지 않았고, 기능어가 없는 표시·성능 항목도 검색으로 판정하지 않았습니다. 항목별 저장소 측정은 위 본문 항목에 한해 실행했으므로, 이 31건의 비해당 분류는 [가설 — 룰 파일 8개 히트의 문맥과 기능어 없는 항목의 관련 경로를 항목별로 읽으면 판정 가능]입니다. 실측: `gh release view v2.1.307 --repo anthropics/claude-code --json body --jq .body | grep -c '^- '` = 43건 중 위 본문 12건을 다뤘으므로 43 − 12 = 31건입니다. 계수 범위는 해당 릴리즈 노트의 최상위 불릿 줄(`- `로 시작하는 줄)입니다.
2783
2783
 
2784
2784
  **Action items**:
2785
2785
  - 관측한 범위에서 저장소가 추적하는 훅·설정·에이전트를 바꿔야 한다고 확정한 항목은 없습니다. 근거는 위 각 항목의 HEAD 측정입니다(`[1m]`·`CLAUDE_CODE_DISABLE_1M_CONTEXT`·`axScreenReader`가 tracked 설정에 없음, 트랜스크립트의 토큰 값을 파싱하는 훅이 위 `git grep`에서 나오지 않음). dev-server tmux 훅의 차단 여부는 이 릴리즈와 별개로 열린 이슈 #1856에서 다룹니다. 룰 문안 변경 가능성은 이 문서에서 판정하지 않습니다.
2786
- - 후보: 이 가이드 「Known Platform Issues & Workarounds」의 #1241 항목에 307의 도구 호출 재시도 개선을 주석으로 달지는, 위 unparseable 항목의 [가설]이 판정된 뒤 결정합니다.
2786
+ - 후보: 이 가이드 「Known Platform Issues & Workarounds」의 #1241 항목에 307의 도구 호출 재시도 개선을 본문 참고 문장으로 덧붙일지는, 위 unparseable 항목의 [가설]이 판정된 뒤 결정합니다.
2787
2787
  - 307 이전 버전의 다음 관측은 각 조건에서 결함 산물이었을 수 있으므로 원인 진단의 결론으로 쓰지 않습니다: `CLAUDE_CODE_DISABLE_1M_CONTEXT` 설정과 `[1m]` 별칭 모델이 겹친 경우의 model-not-found, PDF 페이지·이미지·큰 도구 결과를 많이 읽는 턴의 "Autocompact is thrashing"(일부), macOS의 `claude -p`에서 로그인 키체인이 잠긴 동안의 MCP "needs authentication", macOS·Linux에서 연결 중 절전이 끼었을 때의 MCP "timed out" 보고와 headless 실행의 실패 상태 지속, 호출 도중 연결이 닫힌 HTTP MCP 호출의 이중 전송, 거부된 셸 명령이 보이지 않던 Recently denied 화면과 auto mode 로컬 classifier가 재시도된 명령을 검사하며 그 화면의 승인을 무시한 재차단, 연결된 앱을 통해 중지된 백그라운드 명령의 "사용자가 중지함" 보고, 스트리밍 응답에 대한 서브에이전트 트랜스크립트의 자리표시 토큰 사용량과 빈 stop reason.
2788
2788
  - 룰 문안 변경 제안은 이 문서에 두지 않습니다(R016: CC 지식은 이 가이드에 두고, 룰 파일에는 행동 변화가 필요할 때만 1줄). (307) 항목 중 `[가설 — …]` 표기는 판정 기준을 충족하는 측정이 이루어지기 전에는 결론으로 쓰지 않습니다.
2789
2789
 
@@ -2792,7 +2792,7 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2792
2792
  ## v2.1.308 (2026-10-22)
2793
2793
 
2794
2794
  > Issue: #1869 — Claude Code v2.1.308 compatibility documentation
2795
- > Scope-ceiling check (R017): 조사 시점(2026-10-25)의 최신 릴리즈는 2.1.310입니다(`claude --version`=2.1.310, `npm view @anthropic-ai/claude-code version`=2.1.310). 2.1.309·2.1.310 CHANGELOG 절을 각각 잘라 `2.1.308` 문자열과 "Revert"를 검색한 결과 두 절 모두 두 문자열이 0건이었으므로(`for v in 2.1.309 2.1.310; do awk -v v="$v" '/^## /{p=($2==v)} p' CHANGELOG.md | grep -c -F -e 2.1.308; awk -v v="$v" '/^## /{p=($2==v)} p' CHANGELOG.md | grep -c -i revert; done` 출력 0 네 줄), 이 릴리즈를 되돌리거나 좁히는 문장은 관측되지 않았습니다. 릴리즈 게시 시각은 2026-10-22T04:34:55Z입니다(`gh release view v2.1.308 -R anthropics/claude-code --json publishedAt`).
2795
+ > Scope-ceiling check (R017): 조사 시점(2026-10-25)의 최신 릴리즈는 2.1.310입니다(`claude --version`=2.1.310, `npm view @anthropic-ai/claude-code version`=2.1.310). 이 절의 `awk` 명령이 읽는 `CHANGELOG.md`는 저장소 루트의 같은 이름 파일이 아니라 `gh api -H 'Accept: application/vnd.github.raw' repos/anthropics/claude-code/contents/CHANGELOG.md > CHANGELOG.md`로 받은 Claude Code CHANGELOG이며, 빈 파일이나 저장소 루트 `CHANGELOG.md`(커밋 82a7e4c6의 파일)로도 상한 루프가 0만 출력하므로(2026-10-25 측정) 대상 절 머리(`grep -c -E '^## 2\.1\.(309|310)$' CHANGELOG.md` = 2)를 먼저 확인합니다. 2.1.309·2.1.310 CHANGELOG 절을 각각 잘라 `2.1.308` 문자열과 "Revert"를 검색한 결과 두 절 모두 두 문자열이 0건이었으므로(`for v in 2.1.309 2.1.310; do awk -v v="$v" '/^## /{p=($2==v)} p' CHANGELOG.md | grep -c -F -e 2.1.308; awk -v v="$v" '/^## /{p=($2==v)} p' CHANGELOG.md | grep -c -i revert; done` 출력 0 네 줄), 이 릴리즈를 되돌리거나 좁히는 문장은 관측되지 않았습니다. 릴리즈 게시 시각은 2026-10-22T04:34:55Z입니다(`gh release view v2.1.308 -R anthropics/claude-code --json publishedAt`).
2796
2796
 
2797
2797
  ### 일반 안정성 개선
2798
2798
 
@@ -2814,11 +2814,11 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2814
2814
  ### 권한 · Bash 권한 검사
2815
2815
 
2816
2816
  - CHANGELOG 원문: "Fixed Bash permission checks not prompting for some compound commands that change directory before running git when the `cd` is wrapped or prefixed, as they do for a plain `cd`"
2817
- (309) 디렉토리를 바꾼 뒤 git을 실행하는 일부 복합 명령에서 `cd`가 감싸이거나(wrapped) 접두어가 붙은(prefixed) 경우, 일반 `cd`일 때와 달리 Bash 권한 검사가 승인을 요청하지 않던 결함이 수정되었습니다. 이제 이런 명령도 일반 `cd`처럼 승인을 요청합니다. R005는 지속 `cd`를 남기지 말고 절대 경로나 서브셸 `( cd <dir> && … )`을 쓰라고 규정하므로(`.claude/rules/MAY-optimization.md:89`, 보이는 본문 줄) 그중 서브셸 형태가 원문의 "wrapped" `cd`에 해당할 수 있습니다 [가설 — 원문은 "wrapped"의 구체 형태를 밝히지 않으므로, 비-bypass 모드에서 `( cd templates && git status )`를 실행해 프롬프트가 뜨는지로 판정]. 같은 계열의 기록으로, R002 버전 노트(`.claude/rules/MUST-permissions.md:125`의 (d), HTML 주석 안)는 2.1.271에서 디렉토리 변경 2회·서브셸·`cd`+`git` 체인을 가진 Bash 명령이 bypass·auto 모드의 `permissions.blockReadsOutsideWorkingDirectories`에서 프롬프트를 건너뛰던 결함이 수정되었다고 적습니다. 이 저장소의 두 settings에는 그 키가 없습니다(`git grep -n blockReadsOutsideWorkingDirectories HEAD -- .claude/settings.json templates/.claude/settings.json` rc=1). 저장소의 project settings에는 `Bash(git:*)` allow 규칙이 있으나(`.claude/settings.json:8`) 이 규칙이 `cd` 뒤 git 검사의 프롬프트를 억제하는지는 측정하지 않았습니다. 저장소의 project settings는 `defaultMode: "bypassPermissions"`이고 배포 미러 `templates/.claude/settings.json`에는 `defaultMode`가 없습니다(`git show HEAD:.claude/settings.json | jq -c '{defaultMode: .permissions.defaultMode}'` = `{"defaultMode":"bypassPermissions"}`, `git show HEAD:templates/.claude/settings.json | jq -c '{defaultMode: .permissions.defaultMode}'` = `{"defaultMode":null}`). R010 「Universal bypassPermissions」(제목 줄 `.claude/rules/MUST-orchestrator-coordination.md:579`, 본문 `:588`)는 2.1.257부터 project·local의 `bypassPermissions`가 무시되어, user 값이 `plan`·`auto`·`acceptEdits`처럼 bypass가 아닐 때 `claude -p`에서 `default`로 귀결된다고 기록합니다(#1828, CC 2.1.289 실측). 따라서 user 값이 bypass가 아닌 기기의 `claude -p` 무인 실행에서는 새 프롬프트가 나타날 수 있습니다 [가설 — 같은 본문 줄이 `default`가 실제로 프롬프트를 띄우는지와 TTY 세션을 미관측으로 남기므로, 해당 기기의 비-bypass 실행으로 판정]. `git -C templates status`처럼 디렉토리를 바꾸지 않는 형태는 원문의 대상 조건("change directory before running git")에 들지 않으며, R010 「사전 실측 리터럴」(본문 `.claude/rules/MUST-orchestrator-coordination.md:388`, 코드 블록 줄 `:391`)도 `cd` 없이 `git rev-parse`를 실행하는 형태입니다.
2817
+ (309) 디렉토리를 바꾼 뒤 git을 실행하는 일부 복합 명령에서 `cd`가 감싸이거나(wrapped) 접두어가 붙은(prefixed) 경우, 일반 `cd`일 때와 달리 Bash 권한 검사가 승인을 요청하지 않던 결함이 수정되었습니다. 이제 이런 명령도 일반 `cd`처럼 승인을 요청합니다. R005는 지속 `cd`를 남기지 말고 절대 경로나 서브셸 `( cd <dir> && … )`을 쓰라고 규정하므로(`.claude/rules/MAY-optimization.md:89`, 보이는 본문 줄) 그중 서브셸 형태가 원문의 "wrapped" `cd`에 해당할 수 있습니다 [가설 — 원문은 "wrapped"의 구체 형태를 밝히지 않으므로, 비-bypass 모드에서 `( cd templates && git status )`를 실행해 프롬프트가 뜨는지로 판정]. 같은 계열의 기록으로, R002 버전 노트(`.claude/rules/MUST-permissions.md:125`의 (d), HTML 주석 안)는 2.1.271에서 디렉토리 변경 2회, 서브셸, 또는 `cd`+`git` 체인을 가진 Bash 명령이 bypass·auto 모드의 `permissions.blockReadsOutsideWorkingDirectories`에서 프롬프트를 건너뛰던 결함이 수정되었다고 적습니다. 이 저장소의 두 settings에는 그 키가 없습니다(`git grep -n blockReadsOutsideWorkingDirectories HEAD -- .claude/settings.json templates/.claude/settings.json` rc=1). 저장소의 project settings에는 `Bash(git:*)` allow 규칙이 있으나(`.claude/settings.json:8`) 이 규칙이 `cd` 뒤 git 검사의 프롬프트를 억제하는지는 측정하지 않았습니다. 저장소 자체 절차에도 괄호 서브셸 안에서 `cd` 뒤 git을 실행하는 Bash 호출이 있습니다. `pipeline` 스킬 auto-dev 워크플로의 path-precheck 블록(`.claude/skills/pipeline/workflows/auto-dev.yaml:342`)과 path-precheck-file 블록(`:357`)은 서브셸 안에서 `root=$(git rev-parse --show-toplevel) && cd "$root"` 뒤에 `git ls-files`를 실행합니다. 저장소의 project settings는 `defaultMode: "bypassPermissions"`이고 배포 미러 `templates/.claude/settings.json`에는 `defaultMode`가 없습니다(`git show HEAD:.claude/settings.json | jq -c '{defaultMode: .permissions.defaultMode}'` = `{"defaultMode":"bypassPermissions"}`, `git show HEAD:templates/.claude/settings.json | jq -c '{defaultMode: .permissions.defaultMode}'` = `{"defaultMode":null}`). R010 「Universal bypassPermissions」(제목 줄 `.claude/rules/MUST-orchestrator-coordination.md:579`, 본문 `:588`)는 2.1.257부터 project·local의 `bypassPermissions`가 무시되어, user 값이 `plan`·`auto`·`acceptEdits`처럼 bypass가 아닐 때 `claude -p`에서 `default`로 귀결된다고 기록합니다(#1828, CC 2.1.289 실측). 같은 줄의 원천 목록(managed·local·project·user 설정과 실행 플래그)과 우선순위에 따르면 이 귀결은 local·managed 설정이나 실행 플래그가 다른 모드를 정하지 않을 때의 것이며, managed 범위는 R010이 미측정 `[가설]`로 둡니다. 따라서 local·managed 설정이나 실행 플래그가 다른 모드를 정하지 않고 user 값이 bypass가 아닌 기기의 `claude -p` 무인 실행에서는 새 프롬프트가 나타날 수 있습니다 [가설 — 같은 본문 줄이 `default`가 실제로 프롬프트를 띄우는지와 TTY 세션을 미관측으로 남기므로, 해당 기기의 비-bypass 실행으로 판정]. `git -C templates status`처럼 디렉토리를 바꾸지 않는 형태는 원문의 대상 조건("change directory before running git")에 들지 않으며, R010 「사전 실측 리터럴」(본문 `.claude/rules/MUST-orchestrator-coordination.md:388`, 코드 블록 줄 `:391`)도 `cd` 없이 `git rev-parse`를 실행하는 형태입니다.
2818
2818
  - CHANGELOG 원문: "Fixed the Bash permission check trusting a variable set by a command whose redirect can fail to open"
2819
2819
  (309) 리다이렉트 대상을 열지 못할 수 있는 명령이 설정한 변수를 Bash 권한 검사가 신뢰하던 결함이 수정되었습니다. 원문은 수정 뒤의 결과(승인 요청 여부)를 밝히지 않으므로, 이전에 자동 승인되던 일부 명령이 이제 승인을 요청하는지는 단정하지 않습니다 [가설 — 원문에 결과어가 없으므로 영향 방향은 미확정]. 저장소의 project allow 규칙은 `Bash(git:*)`·`Bash(sed:*)` 같은 접두 규칙이며(`.claude/settings.json:8`, `:16`), 이런 형태(리다이렉트가 붙은 변수 설정 뒤 그 변수를 쓰는 명령)를 지시하는 스킬이 있는지는 측정하지 않았습니다.
2820
2820
  - CHANGELOG 원문: "Changed `sed -i` to get the standard Bash prompt and run as written, not a simulated file-edit preview; like other Bash edits, it is no longer restored by `/rewind`"
2821
- (309) `sed -i`가 모의 파일 편집 미리보기 대신 표준 Bash 프롬프트를 받고 쓰인 그대로 실행되도록 바뀌었으며, 다른 Bash 편집처럼 `/rewind`로 복원되지 않습니다. 기본 동작 변경입니다. 저장소의 project settings에는 `Bash(sed:*)` allow 규칙이 있습니다(`.claude/settings.json:16`). 표준 Bash 프롬프트 경로에서는 이 접두 규칙이 `sed -i`에도 적용될 수 있습니다 [가설 — 비-bypass 모드에서 `sed -i` 실행 시 프롬프트 유무로 판정]. 관측한 범위에서 훅·스킬·에이전트·project settings에는 `sed -i` 명령이 없고(`git grep -n -P '\bsed\b[^|;&\n]*\s-i' HEAD -- .claude/hooks .claude/skills .claude/agents .claude/settings.json` rc=1; 이 정규식이 `sed -E -i`·`sed -i.bak` 형태도 잡는 것을 픽스처로 확인) `/rewind`를 쓰는 절차도 없으므로(`git grep -n -F '/rewind' HEAD -- .claude/skills .claude/agents .claude/hooks` rc=1), 관측한 영향 조건은 Claude가 즉석에서 쓰는 `sed -i` 편집입니다. 그런 편집은 이제 `/rewind` 복원 대상이 아닙니다. R005 버전 노트(`.claude/rules/MAY-optimization.md:108`, HTML 주석 안)와 R023 버전 노트(`.claude/rules/SHOULD-verification-ladder.md:351`, HTML 주석 안)는 2.1.269의 `bashEditDiffEnabled`(2.1.269 CHANGELOG: "Added a diff of the files a Bash command changed to the Bash tool result when the Bash tool handles file edits (setting `bashEditDiffEnabled`)")를 셸 편집의 사후 점검 수단으로 기록하며, R005 노트는 이로써 위임받은 에이전트의 `sed -i`가 감사 가능해진다고 적습니다. `sed -i`가 이제 모의 편집 미리보기가 아니라 다른 Bash 편집처럼 처리되므로 그 노트의 전제가 계속 성립하는지는 판정하지 않았습니다 [가설 — `bashEditDiffEnabled`를 켠 세션에서 `sed -i` 실행 결과에 diff가 붙는지로 판정]. 이 저장소의 두 settings에는 `bashEditDiffEnabled`가 없습니다(`git grep -n bashEditDiffEnabled HEAD -- .claude/settings.json templates/.claude/settings.json` rc=1).
2821
+ (309) `sed -i`가 모의 파일 편집 미리보기 대신 표준 Bash 프롬프트를 받고 쓰인 그대로 실행되도록 바뀌었으며, 다른 Bash 편집처럼 `/rewind`로 복원되지 않습니다. 기본 동작 변경입니다. 저장소의 project settings에는 `Bash(sed:*)` allow 규칙이 있습니다(`.claude/settings.json:16`). 표준 Bash 프롬프트 경로에서는 이 접두 규칙이 `sed -i`에도 적용될 수 있습니다 [가설 — 비-bypass 모드에서 `sed -i` 실행 시 프롬프트 유무로 판정]. 관측한 범위에서 훅·스킬·에이전트·project settings에는 `sed -i` 명령이 없고(`git grep -n -P '\bsed\b[^|;&\n]*\s-i' HEAD -- .claude/hooks .claude/skills .claude/agents .claude/settings.json` rc=1; 이 정규식이 `sed -E -i`·`sed -i.bak` 형태도 잡는 것을 픽스처로 확인; 앞 정규식이 놓치는 `sed -Ei`·`sed --in-place`·`gsed -i`·`$SED -i`·`${SED} -i`까지 잡는 것을 픽스처로 확인한 `git grep -n -P '(\bg?sed\b|\$\{?SED\b)[^|;&\n]*(\s-[A-Za-z]*i|--in-place)' HEAD -- .claude/hooks .claude/skills .claude/agents .claude/settings.json`와, 줄 이음 뒤 다음 줄의 `-i`를 보는 `git grep -n -P -A1 '(\bg?sed\b|\$\{?SED\b)[^\n]*\\\s*$' HEAD -- .claude/hooks .claude/skills .claude/agents .claude/settings.json`도 rc=1) `/rewind`를 쓰는 절차도 없으므로(`git grep -n -F '/rewind' HEAD -- .claude/skills .claude/agents .claude/hooks` rc=1), 관측한 영향 조건은 Claude가 즉석에서 쓰는 `sed -i` 편집입니다. 그런 편집은 이제 `/rewind` 복원 대상이 아닙니다. 즉석 `sed` 편집으로 이어질 수 있는 스킬 경로로는 `dev-refactor` 스킬이 구조 변경 없는 이름 바꾸기에 IDE rename이나 `sed`를 대안으로 권하는 줄(`.claude/skills/dev-refactor/SKILL.md:17`, `:52`)이 있습니다. R005 버전 노트(`.claude/rules/MAY-optimization.md:108`, HTML 주석 안)와 R023 버전 노트(`.claude/rules/SHOULD-verification-ladder.md:351`, HTML 주석 안)는 2.1.269의 `bashEditDiffEnabled`(2.1.269 CHANGELOG: "Added a diff of the files a Bash command changed to the Bash tool result when the Bash tool handles file edits (setting `bashEditDiffEnabled`)")를 셸 편집의 사후 점검 수단으로 기록하며, R005 노트는 이로써 위임받은 에이전트의 `sed -i`가 감사 가능해진다고 적습니다. `sed -i`가 이제 모의 편집 미리보기가 아니라 다른 Bash 편집처럼 처리되므로 그 노트의 전제가 계속 성립하는지는 판정하지 않았습니다 [가설 — `bashEditDiffEnabled`를 켠 세션에서 `sed -i` 실행 결과에 diff가 붙는지로 판정]. 이 저장소의 두 settings에는 `bashEditDiffEnabled`가 없습니다(`git grep -n bashEditDiffEnabled HEAD -- .claude/settings.json templates/.claude/settings.json` rc=1).
2822
2822
 
2823
2823
  ### MCP · headless
2824
2824
 
@@ -2835,7 +2835,7 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2835
2835
  - CHANGELOG 원문: "Fixed split-pane agent teammates not inheriting the tool deny and `--tools` rules given on the leader's command line"
2836
2836
  (309) split-pane 에이전트 팀원이 리더의 명령줄에서 준 도구 deny 규칙과 `--tools` 규칙을 상속하지 않던 결함이 수정되었습니다. 저장소 settings(`.claude/settings.json`, `templates/.claude/settings.json`)에는 `teammateMode` 키가 없으므로(`git grep -n teammateMode HEAD -- .claude/settings.json templates/.claude/settings.json` rc=1) 팀원이 split-pane으로 표시되는지는 사용자 settings나 실행 옵션에 달려 있습니다 [가설 — `teammateMode` 값과 split-pane 표시의 대응은 원문 외 미확인]. R018은 `TeamCreate`가 없어도 이름 붙인 `Agent` 스폰이 세션의 암묵적 팀의 팀원을 만든다고 기록합니다(`.claude/rules/MUST-agent-teams.md:22`, 보이는 표 행, CC 2.1.289 실측). 다만 그런 팀원이 split-pane으로 뜨는지는 측정하지 않았습니다 [가설 — 이름 붙인 스폰 뒤 tmux pane 생성 여부로 판정]. 관측한 범위에서 이 저장소의 스킬·훅·워크플로·`package.json`은 `--tools`·`--disallowedTools`·`--allowedTools` 계열 플래그를 쓰지 않으며(`git grep -n -E -e '--tools|--disallowedTools|--disallowed-tools|--allowedTools|--allowed-tools' HEAD -- .claude/skills .claude/hooks .github package.json` rc=1), 가이드 쌍을 뺀 저장소 전체에서 이 플래그 계열이 나오는 파일은 `.claude/rules/MUST-permissions.md`, 그 `templates/` 미러, `wiki/rules/r002.md`입니다(`git grep -l -E -e '--tools|--disallowedTools|--disallowed-tools|--allowedTools|--allowed-tools' HEAD -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'`). 따라서 상속될 리더 명령줄 규칙은 저장소 쪽에서 관측되지 않았습니다. 사용자가 실행 alias로 이런 플래그를 주는지는 관측하지 않았습니다. 에이전트 frontmatter의 `tools:`·`disallowedTools:` 제한(R010 「Known Limitations (Active Cache)」, 제목 줄 `.claude/rules/MUST-orchestrator-coordination.md:811`)은 원문 대상인 리더 명령줄 규칙과 별개입니다.
2837
2837
  - CHANGELOG 원문: "Fixed worktree-isolated sessions accepting some locale-prefixed commands the isolation guard should refuse"
2838
- (309) worktree로 격리된 세션이, 격리 가드가 거부해야 할 일부 locale 접두 명령을 받아들이던 결함이 수정되었습니다. 관측한 범위(`git grep -n -E 'isolation: *"?worktree|EnterWorktree' HEAD -- .claude/agents .claude/skills .claude/settings.json`)에서 에이전트·스킬·project settings가 지시하는 worktree 격리 절차는 `omcustom-auto-improve` 스킬의 `EnterWorktree` 단계입니다(`.claude/skills/omcustom-auto-improve/SKILL.md:59`). 이 pathspec 밖에는 호출 단위 `isolation: "worktree"` 위임 기록이 있습니다. R009 버전 노트(`.claude/rules/MUST-parallel-execution.md:208`, HTML 주석 안)는 worktree 병렬 위임(`isolation: "worktree"`)을 다루고, R006은 frontmatter `isolation: worktree | sandbox`를 예시하며(`.claude/rules/MUST-agent-design.md:220`, HTML 주석 안), v2.1.305 절의 worktree 정리 항목도 호출 단위 `isolation: "worktree"` 위임을 관련 경로로 둡니다. 같은 격리 가드에 관한 기록으로, R002 버전 노트는 2.1.257에서 worktree 격리 세션이 git을 건드리지 않는 Bash 반복문·`$VAR` 읽기·`"$(…)"`·heredoc을 거부하던 결함이 수정되었다고 적고(`.claude/rules/MUST-permissions.md:113`의 (e), HTML 주석 안), 2.1.274에서 특정 중첩 셸 확장을 포함한 Bash 명령이 다시 거부되므로 R009 worktree 위임에서 이를 격리 결함으로 진단하지 말고 명령을 단순화하라고 적습니다(같은 파일 `:127`, HTML 주석 안). 이번 수정은 2.1.274처럼 가드가 거부하는 쪽으로 움직이는 변경입니다. `EnterWorktree`로 들어간 세션과 호출 단위 `isolation: "worktree"` 위임 세션이 원문의 "worktree-isolated sessions"에 해당하는지는 측정하지 않았습니다 [가설 — 두 경로에서 locale 접두 명령에 대한 가드의 거부 메시지를 관측하면 판정]. locale 접두(`LC_ALL=C`)는 관측한 범위에서 훅·스킬 스크립트의 코드 줄(`.claude/hooks/scripts/cost-cap-advisor.sh:22`, `:49`, `.claude/skills/agora/scripts/anonymize.sh:266`)에 나타나며(`git grep -n -E '(^|[ ;&|(])(LC_ALL|LANG|LC_[A-Z]+)=' HEAD -- .claude/skills .claude/hooks .claude/agents`), 이는 Bash 도구 명령 문자열이 아니라 스크립트 본문이므로 가드 검사 대상이 아니라고 봅니다 [가설 — 가드가 명령 문자열을 검사한다는 전제].
2838
+ (309) worktree로 격리된 세션이, 격리 가드가 거부해야 할 일부 locale 접두 명령을 받아들이던 결함이 수정되었습니다. 관측한 범위(`git grep -n -E 'isolation: *"?worktree|EnterWorktree' HEAD -- .claude/agents .claude/skills .claude/settings.json`)에서 에이전트·스킬·project settings가 지시하는 worktree 격리 절차는 `omcustom-auto-improve` 스킬의 `EnterWorktree` 단계입니다(`.claude/skills/omcustom-auto-improve/SKILL.md:59`). 이 pathspec 밖의 worktree 격리 기록은 `git grep -n -E 'isolation: *"?worktree|EnterWorktree' HEAD -- . ':!.claude/agents' ':!.claude/skills' ':!.claude/settings.json' ':!templates'`로 찾을 수 있으며, 다음 세 문장에 든 예는 그 출력에서 고른 표본입니다. 호출 단위 `isolation: "worktree"` 위임 기록의 예로는 worktree 병렬 위임을 다루는 R009 버전 노트(`.claude/rules/MUST-parallel-execution.md:208`, HTML 주석 안), `isolation: "worktree"`로 스폰하는 에이전트를 다루는 이 가이드 v2.1.277 절의 untracked 스킬 디렉터리 항목, 호출 단위 위임을 관련 경로로 두는 v2.1.305 절의 worktree 정리 항목 등이 있습니다. 에이전트 frontmatter `isolation: worktree` 기록의 예로는 R006의 예시(`.claude/rules/MUST-agent-design.md:220`의 `isolation: worktree | sandbox`, HTML 주석 안)와 보이는 가이드 본문(`guides/git-worktree-workflow/README.md:89`, `guides/worktree-lifecycle/README.md:81`, `guides/harness-engineering/README.md:104`, `:161`, `:332`, `:333`) 등이 있습니다. `EnterWorktree` 도구 안내도 보이는 가이드 본문에 있습니다(`guides/git-worktree-workflow/README.md:71`~`:78`, `guides/worktree-lifecycle/README.md:75`, `:79`). 같은 격리 가드에 관한 기록으로, R002 버전 노트는 2.1.257에서 worktree 격리 세션이 git을 건드리지 않는 Bash 반복문·`$VAR` 읽기·`"$(…)"`·heredoc을 거부하던 결함이 수정되었다고 적고(`.claude/rules/MUST-permissions.md:113`의 (e), HTML 주석 안), 2.1.274에서 특정 중첩 셸 확장을 포함한 Bash 명령이 다시 거부되므로 R009 worktree 위임에서 이를 격리 결함으로 진단하지 말고 명령을 단순화하라고 적습니다(같은 파일 `:127`, HTML 주석 안). 이번 수정은 2.1.274처럼 가드가 거부하는 쪽으로 움직이는 변경입니다. `EnterWorktree`로 들어간 세션과 호출 단위 `isolation: "worktree"` 위임 세션이 원문의 "worktree-isolated sessions"에 해당하는지는 측정하지 않았습니다 [가설 — 두 경로에서 locale 접두 명령에 대한 가드의 거부 메시지를 관측하면 판정]. locale 접두(`LC_ALL=C`)는 관측한 범위에서 훅·스킬 스크립트의 코드 줄(`.claude/hooks/scripts/cost-cap-advisor.sh:22`, `:49`, `.claude/skills/agora/scripts/anonymize.sh:266`)에 나타나며(`git grep -n -E '(^|[ ;&|(])(LC_ALL|LANG|LC_[A-Z]+)=' HEAD -- .claude/skills .claude/hooks .claude/agents`), 이는 Bash 도구 명령 문자열이 아니라 스크립트 본문이므로 가드 검사 대상이 아니라고 봅니다 [가설 — 가드가 명령 문자열을 검사한다는 전제].
2839
2839
  - CHANGELOG 원문: "Fixed worktree-isolated sessions on zsh accepting some arithmetic commands that the isolation guard should refuse"
2840
2840
  (309) zsh의 worktree 격리 세션이, 격리 가드가 거부해야 할 일부 산술 명령을 받아들이던 결함이 수정되었습니다. R002 버전 노트는 이 저장소의 Bash 도구 실행 셸을 zsh로 기록하므로(`.claude/rules/MUST-permissions.md:113`의 (b), HTML 주석 안) zsh 조건에 해당할 수 있으나, 실제 셸은 사용자 기기마다 다릅니다. 위 항목과 같은 worktree 격리 경로(`EnterWorktree` 단계, 호출 단위 `isolation: "worktree"` 위임)에 관련되며 [가설], 이 수정은 가드가 더 많은 명령을 거부하는 방향이므로 zsh 격리 세션 안의 일부 즉석 산술 명령이 거부될 수 있습니다 [가설 — 거부 대상 산술 형태는 원문에 나오지 않음].
2841
2841
 
@@ -2851,12 +2851,12 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2851
2851
  - CHANGELOG 원문: "Fixed Claude notifying unrelated GitHub users by writing role names and placeholders as mentions in PRs, issues and comments"
2852
2852
  (309) Claude가 PR·이슈·코멘트에 역할 이름과 플레이스홀더를 멘션 형태로 써서 무관한 GitHub 사용자에게 알림을 보내던 결함이 수정되었습니다. 이 저장소는 PR·이슈·코멘트를 `gh`로 작성하는 스킬을 두며(`git grep -l -E 'gh (issue|pr) (create|comment)' HEAD -- .claude/skills | wc -l`=5), R015는 에이전트 직접 지정 문법으로 `@{agent-name} {command}`를 규정합니다(`.claude/rules/MUST-intent-transparency.md:40`, 보이는 본문 줄; 예시는 `.claude/skills/intent-detection/SKILL.md:144`의 `@lang-python-expert`). 이 표기가 GitHub 본문에 들어가면 같은 이름의 GitHub 사용자 멘션으로 해석될 수 있었습니다 [가설 — 이 저장소가 작성한 이슈·PR 본문에서 `@<agent-name>` 형태를 검색하면 판정]. `.claude/skills/pipeline/workflows/auto-dev.yaml:504`, `:609`의 `--add-assignee @me`는 `gh` 명령 인자이며 본문 텍스트가 아니므로 원문 대상이 아닙니다.
2853
2853
 
2854
- 기타 68건 — 이 저장소 비해당(샌드박스 항목: macOS·Linux 샌드박스의 셸 startup 파일 실행, `denyWrite` symlink glob, `--mcp-config` 파일 보호, 샌드박스 제외 명령의 쓰기 승인, Linux 백그라운드 명령의 write deny, Linux 샌드박스의 PDF Read — 저장소 settings에 `sandbox` 설정 0건(`git grep -n -i sandbox HEAD -- .claude/settings.json templates/.claude/settings.json` rc=1), `--mcp-config` 실행 경로 0건(`git grep -n -e '--mcp-config' HEAD -- .claude .github package.json` rc=1); 단 `.claude/agents/sec-codeql-expert.md:8`의 `isolation: sandbox`(R006 예시의 주석은 "sandbox = restricted bash", `.claude/rules/MUST-agent-design.md:220`, HTML 주석 안)를 CC가 Bash 샌드박스로 취급하는지는 확인하지 않았습니다 [가설 — 이 에이전트를 스폰해 샌드박스 적용 여부를 관측하면 판정; 해당하면 위 샌드박스 항목 일부가 이 에이전트에 관련]; `Edit(path)` deny 규칙의 Bash 리다이렉트 차단 — 저장소 settings의 deny 규칙 null(`git show HEAD:.claude/settings.json | jq -c '.permissions.deny'`, `git show HEAD:templates/.claude/settings.json | jq -c '.permissions.deny'`); worktree·브랜치 체크아웃의 git replace refs 무시 — 원격의 replace ref 0개(`git ls-remote origin 'refs/replace/*' | wc -l`=0); worktree 생성·재사용에서 git이 객체를 on-demand로 가져오지 않도록 한 변경(대상은 일반 clone과, Bash 샌드박스가 설정된 partial clone이며 그런 partial clone은 객체를 먼저 가져옴) — 저장소 settings에 sandbox 설정 0건(위 명령)이고, 일반 clone에서는 on-demand fetch가 일어나지 않는다고 봅니다 [가설 — 일반 clone에서 `EnterWorktree` 전후 git 네트워크 요청 유무로 판정]; `--add-dir` 스킬 이름 충돌 — 실행 경로 0건(`git grep -n -e 'add-dir' HEAD -- .claude/skills .claude/hooks .claude/agents .github package.json` rc=1); `claude ultrareview` workspace trust — 실행 경로 0건(`git grep -n -i ultrareview HEAD -- .claude/skills .claude/hooks .claude/agents .github package.json` rc=1); PowerShell 훅·Windows 전용 수정 — `"shell": "powershell"` 0건(`git grep -n -E '"shell" *: *"powershell"' HEAD -- .claude/settings.json templates/.claude/settings.json .claude/hooks/hooks.json` rc=1); Desktop·VSCode 전용 항목(Desktop app·VS Code의 bypass 모드에서 위험 `rm`·`rmdir` 프롬프트를 즉시 거부하는 변경 포함), Cloud sessions·Claude Tag·Code Review·self-hosted runner, mods(`turn.step` 별칭, hooks module 깊이 오류), artifact 게시·갱신, Amazon Bedrock·gateway keepalive, `/claude-api` 스킬·번들 dataviz 스킬, claude.ai synced plugin·skill, `/verify`·`/code-review`의 nested package 스킬 탐색, 터미널 UI(ctrl+enter, ctrl+o, 키 바인딩 slash command, `/rename`, `/rewind` 목록 표시), macOS Command Line Tools 대화상자, `/privacy-settings`·feedback, `claude remote-control` 상태줄, profile store symlink 보호, Claude Code 자체 git 명령의 Windows 속도·영어 오류 메시지). 실측: `gh release view v2.1.309 --repo anthropics/claude-code --json body --jq .body | grep -c '^- '` = 79건 중 위 본문 11건을 다뤘으므로 79 − 11 = 68건입니다. 계수 범위는 해당 릴리즈 노트의 최상위 불릿 줄(`- `로 시작하는 줄)입니다.
2854
+ 기타 68건 — 이 저장소 비해당(샌드박스 항목: macOS·Linux 샌드박스의 셸 startup 파일 실행, `denyWrite` symlink glob, `--mcp-config` 파일 보호, 샌드박스 제외 명령의 쓰기 승인, Linux 백그라운드 명령의 write deny, Linux 샌드박스의 PDF Read — 저장소 settings에 `sandbox` 설정 0건(`git grep -n -i sandbox HEAD -- .claude/settings.json templates/.claude/settings.json` rc=1), `--mcp-config` 실행 경로 0건(`git grep -n -e '--mcp-config' HEAD -- .claude .github package.json` rc=1); 단 `.claude/agents/sec-codeql-expert.md:8`의 `isolation: sandbox`(R006 예시의 주석은 "sandbox = restricted bash", `.claude/rules/MUST-agent-design.md:220`, HTML 주석 안)를 CC가 Bash 샌드박스로 취급하는지는 확인하지 않았습니다(R006의 다른 HTML 주석 안 서술 `.claude/rules/MUST-agent-design.md:410`은 `isolation: sandbox`에서 에이전트의 Bash 호출이 제한된 권한으로 실행된다고 하면서도 이를 advisory metadata로, 강제는 실행 환경에 달린 것으로 적습니다) [가설 — 이 에이전트를 스폰해 샌드박스 적용 여부를 관측하면 판정; 해당하면 위 샌드박스 항목 일부가 이 에이전트에 관련]; `Edit(path)` deny 규칙의 Bash 리다이렉트 차단 — 저장소 settings의 deny 규칙 null(`git show HEAD:.claude/settings.json | jq -c '.permissions.deny'`, `git show HEAD:templates/.claude/settings.json | jq -c '.permissions.deny'`); Claude Code가 만드는 worktree·브랜치 체크아웃의 git replace refs 무시 — 원격의 replace ref 0개(`git ls-remote origin 'refs/replace/*' | wc -l`=0); worktree 생성·재사용에서 git이 객체를 on-demand로 가져오지 않도록 한 변경(대상은 일반 clone과, Bash 샌드박스가 설정된 partial clone이며 그런 partial clone은 객체를 먼저 가져옴) — 저장소 settings에 sandbox 설정 0건(위 명령)이고, 일반 clone에서는 on-demand fetch가 일어나지 않는다고 봅니다 [가설 — 일반 clone에서 `EnterWorktree` 전후 git 네트워크 요청 유무로 판정]; `--add-dir` 스킬 이름 충돌 — 실행 경로 0건(`git grep -n -e 'add-dir' HEAD -- .claude/skills .claude/hooks .claude/agents .github package.json` rc=1); `claude ultrareview` workspace trust — 실행 경로 0건(`git grep -n -i ultrareview HEAD -- .claude/skills .claude/hooks .claude/agents .github package.json` rc=1); PowerShell 훅·Windows 전용 수정 — `"shell": "powershell"` 0건(`git grep -n -E '"shell" *: *"powershell"' HEAD -- .claude/settings.json templates/.claude/settings.json .claude/hooks/hooks.json` rc=1); Desktop·VSCode 전용 항목(Desktop app·VS Code의 bypass 모드에서 위험 `rm`·`rmdir` 프롬프트를 즉시 거부하는 변경 포함), Cloud sessions·Claude Tag·Code Review·self-hosted runner, mods(`turn.step` 별칭, hooks module 깊이 오류), artifact 게시·갱신, Amazon Bedrock·gateway keepalive, `/claude-api` 스킬·번들 dataviz 스킬, claude.ai synced plugin·skill, `/verify`·`/code-review`의 nested package 스킬 탐색, 터미널 UI(ctrl+enter, ctrl+o, 키 바인딩 slash command, `/rename`, `/rewind` 목록 표시), macOS Command Line Tools 대화상자, `/privacy-settings`·feedback, `claude remote-control` 상태줄, profile store symlink 보호, Claude Code 자체 git 명령의 Windows 속도·영어 오류 메시지). 이 가운데 `[가설]`을 붙인 두 곳(`sec-codeql-expert`의 `isolation: sandbox` 취급, 일반 clone의 on-demand fetch)은 판정 전까지 비해당이 확정되지 않습니다. 또한 샌드박스·deny 항목의 비해당 판단은 저장소가 추적하는 두 settings만 측정한 것이며, gitignore된 local 범위(`.claude/settings.local.json`)와 사용자·managed 범위 settings의 `sandbox`·`permissions.deny` 값은 관측하지 않았습니다 [가설 — 그런 값을 둔 기기에서는 해당할 수 있으며, 그 기기의 사용자·local·managed settings를 확인하면 판정]. 다만 그중 `--mcp-config` 파일 보호 항목의 판단은 두 settings가 아니라 실행 경로 검색(`git grep -n -e '--mcp-config' HEAD -- .claude .github package.json` rc=1)에 근거하며, 사용자의 실행 명령줄은 관측하지 않았습니다. 실측: `gh release view v2.1.309 --repo anthropics/claude-code --json body --jq .body | grep -c '^- '` = 79건 중 위 본문 11건을 다뤘으므로 79 − 11 = 68건입니다. 계수 범위는 해당 릴리즈 노트의 최상위 불릿 줄(`- `로 시작하는 줄)입니다.
2855
2855
 
2856
2856
  **Action items**:
2857
2857
 
2858
- - 본문 11개 항목 가운데 원문이 `Changed`로 시작하는 기본 동작 변경은 `sed -i` 항목 1개입니다(본문 인용 11줄의 첫 단어: Fixed 9, Changed 1, Improved 1). 이 릴리즈 전체의 `- Changed` 불릿은 6개이며(`gh release view v2.1.309 --repo anthropics/claude-code --json body --jq .body | grep -c '^- Changed'`=6) 나머지 5개는 기타로 분류했습니다. 본문의 결함 수정 9개 가운데 이 저장소의 실행에서 승인 요청이나 거부가 늘 수 있는 방향의 항목은 `cd`를 감싸거나 접두어를 붙인 뒤 git을 실행하는 일부 복합 명령, worktree 격리 가드 2건(일부 locale 접두 명령, zsh의 일부 산술 명령 — 해당 세션 경로는 [가설]), 그리고 리더를 deny·`--tools` 명령줄 규칙으로 실행하고 split-pane 팀원을 쓰는 경우의 규칙 상속입니다(본문에서 저장소 쪽 사용은 관측되지 않았습니다). 비활성 MCP 서버의 재연결 방지는 사용자가 끈 상태를 유지하는 수정이므로 이 목록에 넣지 않았습니다. 기타로 분류한 항목에도 거부나 승인 요청이 늘 수 있는 방향의 변경이 있으나(예: `Edit(path)` deny 규칙의 Bash 리다이렉트 차단, `--mcp-config` 파일 보호, 샌드박스 제외 명령의 쓰기 전 승인 요청, Windows PowerShell의 `Set-Location`·`cd` 승인 요청), 위 기타 문장의 측정과 범주 분류에 따라 이 저장소 비해당으로 두었습니다. 리다이렉트를 열지 못할 수 있는 명령이 설정한 변수 항목은 원문에 결과어가 없어 방향을 분류하지 않았습니다. 이 저장소에서 실제로 프롬프트·거부가 생기는지는 아래 후속 실측 후보 (1)·(2)·(5)·(6)으로 남깁니다. 룰·CLAUDE.md·에이전트·훅 문안 변경은 이 절에서 확정하지 않습니다(R016: CC 지식은 이 가이드에 두고 룰 파일에는 행동 변화가 필요할 때만 1줄).
2859
- - 후속 실측 후보: (1) 비-bypass 모드에서 `( cd templates && git status )`가 프롬프트를 띄우는지, `Bash(git:*)`가 이를 억제하는지 확인합니다. (2) 비-bypass 모드에서 `Bash(sed:*)`가 `sed -i`에 적용되는지, `bashEditDiffEnabled`를 켠 세션에서 `sed -i` 결과에 diff가 붙는지 확인합니다. (3) `templates/CLAUDE.md`(13,817바이트)가 nested 크기 한도를 넘는지 확인합니다. (4) 2.1.309 이전 transcript에서 `fromjson`이 실패하는 줄 수를 셉니다. (5) `EnterWorktree` 세션과 호출 단위 `isolation: "worktree"` 위임 세션에서 locale 접두 명령과 zsh 산술 명령이 거부되는지 확인합니다. (6) 리더를 `--disallowedTools`·`--tools`로 실행한 세션에서 이름 붙인 스폰이 split-pane 팀원이 되는지, 그 팀원이 리더의 규칙을 상속하는지 확인합니다.
2858
+ - 본문 11개 항목 가운데 원문이 `Changed`로 시작하는 기본 동작 변경은 `sed -i` 항목 1개입니다(본문 인용 11줄의 첫 단어: Fixed 9, Changed 1, Improved 1). 이 릴리즈 전체의 `- Changed` 불릿은 6개이며(`gh release view v2.1.309 --repo anthropics/claude-code --json body --jq .body | grep -c '^- Changed'`=6) 나머지 5개는 기타로 분류했습니다. 본문의 결함 수정 9개 가운데 이 저장소의 실행에서 승인 요청이나 거부가 늘 수 있는 방향의 항목은 `cd`를 감싸거나 접두어를 붙인 뒤 git을 실행하는 일부 복합 명령, worktree 격리 가드 2건(일부 locale 접두 명령, zsh의 일부 산술 명령 — 해당 세션 경로는 [가설]), 그리고 리더를 deny·`--tools` 명령줄 규칙으로 실행하고 split-pane 팀원을 쓰는 경우의 규칙 상속입니다(본문에서 저장소 쪽 사용은 관측되지 않았고, 사용자의 실행 명령줄은 관측하지 않았습니다). 리다이렉트를 열지 못할 수 있는 명령이 설정한 변수 항목은 원문에 결과어가 없어 방향을 분류하지 않았습니다. 비활성화된 MCP 서버의 재연결 방지는 그 서버를 비활성 상태로 유지하는 수정이므로 위 방향 목록에 넣지 않았습니다. 기타로 분류한 항목에도 거부나 승인 요청이 늘 수 있는 방향의 변경이 있으나(예: 서브셸을 함께 가진 일부 명령에서 `Edit(path)` deny 규칙의 Bash 리다이렉트 차단, `--mcp-config` 파일 보호, 샌드박스가 켜져 있지만 실행할 수 없을 때 샌드박스 제외 명령이 쓰기 목록 경로에 쓰기 전의 승인 요청, 현재 디렉토리를 대상으로 추가 인자를 가진 일부 Windows PowerShell `Set-Location`·`cd` 명령의 승인 요청), 위 「기타 68건」 문단의 측정과 범주 분류에 따라 이 저장소 비해당으로 두었습니다. split-pane 항목이 사용자의 실행 명령줄을 관측하지 않은 것과 마찬가지로, 그 문단의 샌드박스·deny 판단도 사용자·local(gitignore된 `.claude/settings.local.json`)·managed 범위 settings를 관측하지 않은 범위의 판단입니다(`--mcp-config` 파일 보호는 실행 경로 검색 기준이며 사용자의 실행 명령줄은 관측하지 않았습니다). 이 저장소에서 실제로 프롬프트·거부가 생기는지는 아래 후속 실측 후보 (1)·(2)·(5)·(6)으로 남깁니다. 룰·CLAUDE.md·에이전트·훅 문안 변경은 이 절에서 확정하지 않습니다(R016: CC 지식은 이 가이드에 두고 룰 파일에는 행동 변화가 필요할 때만 1줄).
2859
+ - 후속 실측 후보: (1) 비-bypass 모드에서 `( cd templates && git status )`가 프롬프트를 띄우는지, `Bash(git:*)`가 이를 억제하는지 확인합니다. 저장소 자체 형태인 auto-dev 워크플로의 path-precheck 블록(`.claude/skills/pipeline/workflows/auto-dev.yaml:342`, `:357`)도 같은 프로브로 확인합니다. (2) 비-bypass 모드에서 `Bash(sed:*)`가 `sed -i`에 적용되는지, `bashEditDiffEnabled`를 켠 세션에서 `sed -i` 결과에 diff가 붙는지 확인합니다. (3) `templates/CLAUDE.md`(13,817바이트)가 nested 크기 한도를 넘는지 확인합니다. (4) 2.1.309 이전 transcript에서 `fromjson`이 실패하는 줄 수를 셉니다. (5) `EnterWorktree` 세션과 호출 단위 `isolation: "worktree"` 위임 세션에서 locale 접두 명령과 zsh 산술 명령이 거부되는지 확인합니다. (6) 리더를 `--disallowedTools`·`--tools`로 실행한 세션에서 이름 붙인 스폰이 split-pane 팀원이 되는지, 그 팀원이 리더의 규칙을 상속하는지 확인합니다.
2860
2860
  - (309) 항목 중 `[가설 — …]` 표기는 판정 기준을 충족하는 측정이 이루어지기 전에는 결론으로 쓰지 않습니다.
2861
2861
 
2862
2862
  ---
@@ -2869,19 +2869,19 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2869
2869
  ### Bash · Monitor 도구
2870
2870
 
2871
2871
  - CHANGELOG 원문: "Added the Monitor tool and plugin monitors on Bedrock, Vertex, and Foundry, and when telemetry or nonessential traffic is disabled; long foreground sleeps are now blocked there too"
2872
- (310) Bedrock·Vertex·Foundry에서, 그리고 텔레메트리나 비필수 트래픽을 끈 경우에도 Monitor 도구와 플러그인 monitor가 추가되었고, 그 환경에서도 이제 긴 foreground sleep이 차단됩니다. R002는 Monitor를 Tier 3 도구로 분류합니다(`.claude/rules/MUST-permissions.md:11`, 주석 밖 표 행). 추적되는 프로젝트 settings와 그 `templates/` 미러에는 `env` 키가 없습니다(`for f in .claude/settings.json templates/.claude/settings.json; do git show "HEAD:$f" | jq 'has("env")'; done` = `false`, `false`). `git grep -n -E 'CLAUDE_CODE_USE_(BEDROCK|VERTEX|FOUNDRY)|DISABLE_TELEMETRY|DISABLE_NONESSENTIAL_TRAFFIC' HEAD -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'`의 출력은 15줄이며, 그중 `CLAUDE_CODE_USE_` 히트는 없습니다. 15줄의 내역은 다음과 같습니다. `.claude/skills/monitoring-setup/SKILL.md`의 4줄 중 `:251`·`:253`은 변수 설명 표이고, `:262`·`:264`는 "Enterprise Configuration" 예시의 `env` 블록에서 `DISABLE_TELEMETRY`와 `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`를 `"1"`로 둡니다. `.claude/skills/skills-sh-search/SKILL.md:211`은 skills CLI 텔레메트리를 끄려면 `DISABLE_TELEMETRY=1`을 설정하라고 안내합니다. `guides/claude-code/13-cli-flags.md:141`·`:143`은 변수 설명 표이고, `docs/superpowers/plans/2026-03-29-v0.65.0-release.md:29`는 계획 문서의 작업 항목입니다. 나머지 7줄은 앞의 세 파일(`monitoring-setup` 4줄, `skills-sh-search` 1줄, `13-cli-flags.md` 2줄)의 `templates/` 미러입니다. Enterprise Configuration 예시를 적용한 환경은 이 릴리즈부터 Monitor 도구를 받고 긴 foreground sleep도 차단되는 조건에 들어갑니다 [가설 — 이 예시를 실제로 적용한 사용자 환경은 미관측]. `skills-sh-search`의 안내를 따라 Claude Code가 실행되는 셸에 `DISABLE_TELEMETRY=1`을 export하는 것도 같은 조건에 들어가는 또 하나의 경로일 수 있습니다 [가설 — CC가 그 셸 변수를 텔레메트리 비활성 조건으로 읽는지와 사용자의 export 여부는 미관측]. foreground sleep 쪽은 `git grep -n -P '(?<![A-Za-z_])sleep(?![A-Za-z_])' HEAD -- .claude/skills .claude/hooks .claude/agents`로 재면 30줄이 걸립니다. 그중 셸 `sleep` 명령은 agora 스크립트 watchdog의 `( sleep "$secs"; kill -TERM -- "-$pid" 2>/dev/null ) &` 2줄(`.claude/skills/agora/scripts/judge.sh:140`, `.claude/skills/agora/scripts/reviewers.sh:106`)입니다. 나머지 28줄은 같은 두 스크립트의 주석 6줄, `.claude/skills/claude-code-bible/scripts/fetch-docs.js`의 JS `sleep` 함수 2줄, `fastapi-best-practices`·`java-best-practices` 문서의 Python·Java `sleep` 언급 3줄, `systematic-debugging`의 TS 예시와 임의 대기 반패턴 서술 15줄, 워크플로 스크립트 사본에서 `sleep`을 무력화하라는 `.claude/skills/pipeline/workflows/auto-dev.yaml` 서술 2줄입니다. 숫자 인자만 찾는 ERE `git grep -n -E '(^|[^a-zA-Z_])sleep [0-9]' HEAD -- .claude/skills .claude/hooks .claude/agents`는 이 변수 인자 형태를 놓쳐 출력이 없습니다(rc=1). agora watchdog의 `sleep`은 스크립트 안에서 `&`로 띄운 서브셸에 있으며, 이 차단이 스크립트 안의 그런 sleep에도 적용되는지는 관측하지 않았습니다 [가설 — Bedrock·Vertex·Foundry나 텔레메트리·비필수 트래픽을 끈 환경에서 agora를 실행해 watchdog 서브셸의 sleep이 차단되는지 확인하면 판정].
2872
+ (310) Bedrock·Vertex·Foundry에서, 그리고 텔레메트리나 비필수 트래픽을 끈 경우에도 Monitor 도구와 플러그인 monitor가 추가되었고, 그 환경에서도 이제 긴 foreground sleep이 차단됩니다. R002는 Monitor를 Tier 3 도구로 분류합니다(`.claude/rules/MUST-permissions.md:11`, 주석 밖 표 행). 추적되는 프로젝트 settings와 그 `templates/` 미러에는 `env` 키가 없습니다(`for f in .claude/settings.json templates/.claude/settings.json; do git show "HEAD:$f" | jq 'has("env")'; done` = `false`, `false`). `git grep -n -E 'CLAUDE_CODE_USE_(BEDROCK|VERTEX|FOUNDRY)|DISABLE_TELEMETRY|DISABLE_NONESSENTIAL_TRAFFIC' HEAD -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'`의 출력은 15줄이며, 그중 `CLAUDE_CODE_USE_` 히트는 없습니다. 15줄의 내역은 다음과 같습니다. `.claude/skills/monitoring-setup/SKILL.md`의 4줄 중 `:251`·`:253`은 변수 설명 표이고, `:262`·`:264`는 "Enterprise Configuration" 예시의 `env` 블록에서 `DISABLE_TELEMETRY`와 `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`를 `"1"`로 둡니다. `.claude/skills/skills-sh-search/SKILL.md:211`은 skills CLI 텔레메트리를 끄려면 `DISABLE_TELEMETRY=1`을 설정하라고 안내합니다. `guides/claude-code/13-cli-flags.md:141`·`:143`은 변수 설명 표이고, `docs/superpowers/plans/2026-03-29-v0.65.0-release.md:29`는 계획 문서의 작업 항목입니다. 나머지 7줄은 앞의 세 파일(`monitoring-setup` 4줄, `skills-sh-search` 1줄, `13-cli-flags.md` 2줄)의 `templates/` 미러입니다. 앞의 두 변수 설명 표에는 `DO_NOT_TRACK`도 있으나(`guides/claude-code/13-cli-flags.md:145`, `.claude/skills/monitoring-setup/SKILL.md:255`) 15줄을 낸 검색의 정규식에 없어 15줄에 들지 않습니다. 별도 검색 `git grep -n -F DO_NOT_TRACK HEAD -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'`의 4줄은 이 두 표 행과 그 `templates/` 미러이며, 값을 설정하는 줄은 없습니다. 원문은 어떤 변수(`DISABLE_TELEMETRY`, `CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC`, `DO_NOT_TRACK` 등)가 "telemetry or nonessential traffic is disabled" 조건을 만드는지 밝히지 않으며, 이 저장소의 두 표(`guides/claude-code/13-cli-flags.md:141`, `.claude/skills/monitoring-setup/SKILL.md:251`)는 `DISABLE_TELEMETRY`를 Claude Code의 "Disable all telemetry collection" 변수로 적습니다. Enterprise Configuration 예시를 적용한 환경(`DISABLE_TELEMETRY`·`CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC` 설정)은 이 릴리즈부터 Monitor 도구를 받고 긴 foreground sleep도 차단되는 조건에 들어갈 수 있습니다 [가설 — 원문이 조건 변수를 밝히지 않으며, 이 예시를 실제로 적용한 사용자 환경은 미관측]. `skills-sh-search`의 안내를 따라 Claude Code가 실행되는 셸에 `DISABLE_TELEMETRY=1`을 export하는 것도 같은 변수를 설정하므로 같은 조건에 들어갈 수 있는 또 하나의 경로입니다 [가설 — 위와 같은 변수 대응 전제이며, 사용자의 export 여부는 미관측]. foreground sleep 쪽은 `git grep -n -P '(?<![A-Za-z_])sleep(?![A-Za-z_])' HEAD -- .claude/skills .claude/hooks .claude/agents`로 재면 30줄이 걸립니다. 그중 셸 `sleep` 명령은 agora 스크립트 watchdog의 `( sleep "$secs"; kill -TERM -- "-$pid" 2>/dev/null ) &` 2줄(`.claude/skills/agora/scripts/judge.sh:140`, `.claude/skills/agora/scripts/reviewers.sh:106`)입니다. 나머지 28줄은 같은 두 스크립트의 주석 6줄, `.claude/skills/claude-code-bible/scripts/fetch-docs.js`의 JS `sleep` 함수 2줄, `fastapi-best-practices`·`java-best-practices` 문서의 Python·Java `sleep` 언급 3줄, `systematic-debugging`의 TS 예시와 임의 대기 반패턴 서술 15줄, 워크플로 스크립트를 사본으로 추출해 검증할 때 사본 수정을 `sleep` 무력화 같은 실행 환경 대체로만 제한하는 `.claude/skills/pipeline/workflows/auto-dev.yaml` 서술 2줄(`:854`, `:860`)입니다. 숫자 인자만 찾는 ERE `git grep -n -E '(^|[^a-zA-Z_])sleep [0-9]' HEAD -- .claude/skills .claude/hooks .claude/agents`는 이 변수 인자 형태를 놓쳐 출력이 없습니다(rc=1). 30줄을 센 PCRE의 경계 조건은 `sleep_interval`처럼 밑줄로 이어진 이름을 빼므로, `pipeline` 스킬 auto-dev 워크플로의 ci-check 단계가 Bash 타임아웃 예산 안에서 poll하라고 지시하는 줄(`.claude/skills/pipeline/workflows/auto-dev.yaml:1551`~`:1554`, `loop_count × sleep_interval`)은 30줄에 들지 않습니다(`git grep -n -E 'sleep_' HEAD -- .claude/skills .claude/hooks .claude/agents`의 출력은 `:1552` 1줄). 같은 지시는 한도 없는 수동 poll loop보다 실행 ID를 지정한 `gh run watch`에 `--exit-status`를 붙인 단일 bounded 호출(선택적으로 `run_in_background`)을 우선하라고 적습니다. 이 지시를 따라 foreground로 실행하는 poll loop의 대기가 원문의 "long foreground sleeps"에 드는지는 [가설 — 원문이 차단 기준 길이를 밝히지 않으므로, 해당 환경에서 ci-check 단계의 poll loop를 실행해 차단 여부를 확인하면 판정]입니다. agora watchdog의 `sleep`은 스크립트 안에서 `&`로 띄운 서브셸에 있으며, 이 차단이 스크립트 안의 그런 sleep에도 적용되는지는 관측하지 않았습니다 [가설 — Bedrock·Vertex·Foundry나 텔레메트리·비필수 트래픽을 끈 환경에서 agora를 실행해 watchdog 서브셸의 sleep이 차단되는지 확인하면 판정].
2873
2873
 
2874
2874
  ### 컨텍스트 · compaction · 무인(`-p`) 실행
2875
2875
 
2876
2876
  - CHANGELOG 원문: "Fixed compaction after a "Prompt is too long" error keeping too much of a conversation with dense text, such as base64 or SVG, so the next request could fail again"
2877
- (310) "Prompt is too long" 오류 뒤의 compaction이 base64나 SVG처럼 밀도 높은 텍스트가 든 대화를 너무 많이 남겨, 다음 요청이 다시 실패할 수 있던 결함이 수정되었습니다. 룰에서는 예컨대 R013 노트(`.claude/rules/SHOULD-ecomode.md:99`, `:101`, 주석 밖 본문 줄)가 같은 오류 계열의 compaction 수정을 기록합니다. 이 가이드에서 원문 인용 줄에 "Prompt is too long"이 들어간 항목은, 이 절을 넣기 전(HEAD 5600fc87) 기준으로 (284)(288)(290)(302)(304) 5건입니다(`git show HEAD:guides/claude-code/15-version-compatibility.md | command grep -n -F 'CHANGELOG 원문: "' | command grep -F 'Prompt is too long'` = 5줄). 이 저장소에서는 `diagram-design` 스킬이 SVG 다이어그램 생성을 목적으로 합니다(`.claude/skills/diagram-design/SKILL.md:3`). 이 스킬로 SVG 텍스트가 많이 쌓인 대화에서 "Prompt is too long" 오류 뒤 compaction을 거친 다음 요청이 다시 실패했다면 구버전의 이 결함이 원인 후보입니다 [가설 — 해당 스킬을 쓴 세션에서 그런 재실패 사례는 미관측]. R013의 임계값 정의는 바뀌지 않습니다.
2877
+ (310) "Prompt is too long" 오류 뒤의 compaction이 base64나 SVG처럼 밀도 높은 텍스트가 든 대화를 너무 많이 남겨, 다음 요청이 다시 실패할 수 있던 결함이 수정되었습니다. 룰에서는 예컨대 R013 노트(`.claude/rules/SHOULD-ecomode.md:99`, `:101`, 주석 밖 본문 줄)가 같은 오류 계열의 compaction 수정을 기록합니다. 이 가이드에서 원문 인용 줄에 "Prompt is too long"이 대소문자 구분 없이 들어간 항목은, 이 절과 v2.1.306 절을 넣기 전(커밋 5600fc87) 기준으로 (284)(288)(290)(302)(304) 5건입니다(`git show 5600fc87:guides/claude-code/15-version-compatibility.md | command grep -n -F 'CHANGELOG 원문: "' | command grep -i -F 'prompt is too long'` = 5줄). 이 절과 함께 추가된 이 가이드 v2.1.306 절의 (306) 항목은 MCP 도구가 많은 세션에서 API 오류가 소문자 "prompt is too long"으로 대체되던 결함을 다루며, 이 항목과 원인 조건이 다른 별개 수정입니다. 이 저장소에서는 `diagram-design` 스킬이 SVG 다이어그램 생성을 목적으로 합니다(`.claude/skills/diagram-design/SKILL.md:3`). 이 스킬로 SVG 텍스트가 많이 쌓인 대화에서 "Prompt is too long" 오류 뒤 compaction을 거친 다음 요청이 다시 실패했다면 구버전의 이 결함이 원인 후보입니다 [가설 — 해당 스킬을 쓴 세션에서 그런 재실패 사례는 미관측]. R013의 임계값 정의는 바뀌지 않습니다.
2878
2878
  - CHANGELOG 원문: "Improved memory use of non-interactive sessions (`-p`, Agent SDK) during compaction when the transcript file is very large"
2879
- (310) 트랜스크립트 파일이 매우 클 때 비대화형 세션(`-p`, Agent SDK)이 compaction 중 쓰는 메모리가 개선되었습니다. `/fsd`는 무인(`claude -p`, 예약 실행) 세션에서 `/goal`·`/loop` 경로를 권장하고(`.claude/skills/fsd/SKILL.md:172`), `claude -p` 경로에서는 env `OMCUSTOM_UNATTENDED=1`을 쓰도록 안내합니다(`:133`). R013은 메모리 사용량이 치명적일 때의 가시적 경고(v2.1.274)를 기록합니다(`.claude/rules/SHOULD-ecomode.md:101`, 주석 밖 본문 줄). 장기 `-p` 실행에서 트랜스크립트 파일이 매우 커지면 이 개선이 해당할 수 있으나, CHANGELOG는 "very large"의 기준을 밝히지 않습니다 [가설 — 트랜스크립트 파일이 매우 큰 장기 `-p` `/fsd` 실행에서 compaction 시점 메모리를 2.1.310 전후로 비교하면 판정]. 룰 변경은 필요하지 않습니다.
2879
+ (310) 트랜스크립트 파일이 매우 클 때 비대화형 세션(`-p`, Agent SDK)이 compaction 중 쓰는 메모리가 개선되었습니다. `/fsd`는 세션이 무인(`claude -p`, 예약 실행)이라 자기 페이싱이 필요할 때 `/goal`·`/loop` 경로를 권장하고(`.claude/skills/fsd/SKILL.md:172`), `claude -p` 경로에서는 env `OMCUSTOM_UNATTENDED=1`을 쓰도록 안내합니다(`:133`). R013은 메모리 사용량이 치명적일 때의 가시적 경고(v2.1.274)를 기록합니다(`.claude/rules/SHOULD-ecomode.md:101`, 주석 밖 본문 줄). 장기 `-p` 실행에서 트랜스크립트 파일이 매우 커지면 이 개선이 해당할 수 있으나, CHANGELOG는 "very large"의 기준을 밝히지 않습니다 [가설 — 트랜스크립트 파일이 매우 큰 장기 `-p` `/fsd` 실행에서 compaction 시점 메모리를 2.1.310 전후로 비교하면 판정]. 룰 변경은 필요하지 않습니다.
2880
2880
 
2881
2881
  ### 권한 · permission mode · settings
2882
2882
 
2883
2883
  - CHANGELOG 원문: "Improved auto mode's prompt before the first read outside the working directories: it now says when blocking those reads makes shell commands ask for permission"
2884
- (310) auto mode에서 작업 디렉토리 밖의 첫 읽기 전에 표시되는 프롬프트가 개선되어, 그런 읽기를 차단하면 셸 명령이 권한을 요청하게 되는 경우 이제 그 사실을 알려 줍니다. R002의 v2.1.257 노트는 HTML 주석 안의 DETAIL 블록(자동 주입되지 않음)에 있으며(`.claude/rules/MUST-permissions.md:113`, 주석 시작 `:85`), auto mode에서 작업 디렉토리 밖 첫 파일 읽기 전에 1회 프롬프트를 표시하고 그런 읽기를 차단하는 동작을 `permissions.blockReadsOutsideWorkingDirectories` 설정의 동작으로 서술합니다. 같은 DETAIL 블록에는 이 설정과 셸 명령을 함께 다룬 기록이 더 있습니다. v2.1.271 노트의 (d)(`:125`, HTML 주석 안)는 디렉토리 변경 2회, 서브셸, `cd`+`git` 체인을 가진 명령이 bypass·auto 모드의 이 설정에서 프롬프트를 건너뛰던 결함의 수정을 기록합니다. v2.1.273/274 노트의 (273) 항목(`:127`, HTML 주석 안)은 권한 검사기가 완전히 분석할 수 없는 Bash 명령이 이 설정에서 프롬프트를 건너뛰던 결함의 수정을 기록합니다. 추적되는 프로젝트 settings와 그 `templates/` 미러에는 이 설정이 없습니다(`for f in .claude/settings.json templates/.claude/settings.json; do git show "HEAD:$f" | jq '(.permissions // {}) | has("blockReadsOutsideWorkingDirectories")'; done` = `false`, `false`). `for f in .claude/settings.json templates/.claude/settings.json; do git show "HEAD:$f" | jq -c '{defaultMode: (.permissions.defaultMode // "unset"), has: ((.permissions // {}) | has("defaultMode"))}'; done`의 출력은 `{"defaultMode":"bypassPermissions","has":true}`, `{"defaultMode":"unset","has":false}`이므로, 추적되는 프로젝트 settings의 `permissions.defaultMode`는 `bypassPermissions`이고 `templates/` 미러에는 이 키가 없습니다. R010은 2.1.257부터 프로젝트·로컬의 `bypassPermissions`가 무시된다고 기록하고, `claude -p` 실측(CC 2.1.289)으로 그 결과를 두 갈래로 나눕니다. 사용자 값이 `bypassPermissions`가 아니면(`plan`/`auto`/`acceptEdits`) 무시된 범위가 `default`로 귀결되어 사용자 값을 덮고, 사용자 값이 `bypassPermissions`이면 결과가 `bypassPermissions`로 남습니다. 대화형 TTY 세션의 유효 모드는 R010이 `[가설]`로 남겨 두었습니다(`.claude/rules/MUST-orchestrator-coordination.md:588`, 주석 밖 본문 줄). 사용자·managed settings와 실행 플래그는 저장소 밖에 있으므로, 이 프롬프트가 이 저장소 세션에서 표시되는지는 관측하지 않았습니다 [가설 — 설정을 켠 auto mode 세션에서 작업 디렉토리 밖을 처음 읽을 때 문구를 확인하면 판정].
2884
+ (310) auto mode에서 작업 디렉토리 밖의 첫 읽기 전에 표시되는 프롬프트가 개선되어, 그런 읽기를 차단하면 셸 명령이 권한을 요청하게 되는 경우 이제 그 사실을 알려 줍니다. R002의 v2.1.257 노트는 HTML 주석 안의 DETAIL 블록(자동 주입되지 않음)에 있으며(`.claude/rules/MUST-permissions.md:113`, 주석 시작 `:85`), auto mode에서 작업 디렉토리 밖 첫 파일 읽기 전에 1회 프롬프트를 표시하고 그런 읽기를 차단하는 동작을 `permissions.blockReadsOutsideWorkingDirectories` 설정의 동작으로 서술합니다. 같은 DETAIL 블록에는 이 설정과 셸 명령을 함께 다룬 기록이 더 있습니다. v2.1.271 노트의 (d)(`:125`, HTML 주석 안)는 디렉토리 변경 2회, 서브셸, 또는 `cd`+`git` 체인을 가진 명령이 bypass·auto 모드의 이 설정에서 프롬프트를 건너뛰던 결함의 수정을 기록합니다. v2.1.273/274 노트의 (273) 항목(`:127`, HTML 주석 안)은 권한 검사기가 완전히 분석할 수 없는 Bash 명령이 이 설정에서 프롬프트를 건너뛰던 결함의 수정을 기록합니다. 추적되는 프로젝트 settings와 그 `templates/` 미러에는 이 설정이 없습니다(`for f in .claude/settings.json templates/.claude/settings.json; do git show "HEAD:$f" | jq '(.permissions // {}) | has("blockReadsOutsideWorkingDirectories")'; done` = `false`, `false`). `for f in .claude/settings.json templates/.claude/settings.json; do git show "HEAD:$f" | jq -c '{defaultMode: (.permissions.defaultMode // "unset"), has: ((.permissions // {}) | has("defaultMode"))}'; done`의 출력은 `{"defaultMode":"bypassPermissions","has":true}`, `{"defaultMode":"unset","has":false}`이므로, 추적되는 프로젝트 settings의 `permissions.defaultMode`는 `bypassPermissions`이고 `templates/` 미러에는 이 키가 없습니다. R010은 2.1.257부터 프로젝트·로컬의 `bypassPermissions`가 무시된다고 기록하고, `claude -p` 실측(CC 2.1.289)으로 그 결과를 두 갈래로 나눕니다. 사용자 값이 `bypassPermissions`가 아니면(`plan`/`auto`/`acceptEdits`) 무시된 범위가 `default`로 귀결되어 사용자 값을 덮고, 사용자 값이 `bypassPermissions`이면 결과가 `bypassPermissions`로 남습니다. R010의 원천 목록(managed·local·project·user 설정과 실행 플래그)과 우선순위에 따르면 두 갈래 모두 local·managed 설정이나 실행 플래그가 다른 모드를 정하지 않을 때의 결과이며, managed 범위는 R010이 미측정 `[가설]`로 둡니다. 대화형 TTY 세션의 유효 모드는 R010이 `[가설]`로 남겨 두었습니다(`.claude/rules/MUST-orchestrator-coordination.md:588`, 주석 밖 본문 줄). 사용자·managed settings와 실행 플래그는 저장소 밖에 있으므로, 이 프롬프트가 이 저장소 세션에서 표시되는지는 관측하지 않았습니다 [가설 — 설정을 켠 auto mode 세션에서 작업 디렉토리 밖을 처음 읽을 때 문구를 확인하면 판정].
2885
2885
  - CHANGELOG 원문: "Fixed file read permission prompts not showing where a symbolic link leads"
2886
2886
  (310) 파일 읽기 권한 프롬프트가 심볼릭 링크의 대상 위치를 보여 주지 않던 결함이 수정되었습니다. 쓰기 쪽의 같은 계열 수정은 이 가이드의 (280) 항목이 기록하며, 그 수정의 결과는 두 가지입니다. 하나는 심볼릭 링크 경로를 통한 쓰기에서 프롬프트가 실제 쓰기 위치를 표시하는 것이고, 다른 하나는 `acceptEdits`·allow 규칙·auto mode가 밖에 떨어지는 쓰기를 더 이상 승인하지 않는 것입니다. 관측한 범위에서 이 저장소의 추적 심볼릭 링크는 `docs/plans/refs/latest` 1개이며(`git ls-files -s | awk '$1=="120000"{print $4}'`), 대상은 저장소 안의 상대 경로 `../2025-01-25`입니다(`git cat-file -p HEAD:docs/plans/refs/latest`). 이 수정의 대상은 프롬프트에 표시되는 내용이며, `.claude/settings.json`의 `permissions` 규칙은 바뀌지 않습니다.
2887
2887
  - CHANGELOG 원문: "Fixed background cleanup deleting some recent files, such as pasted images, when `cleanupPeriodDays` is set to a very large value"
@@ -2896,7 +2896,7 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2896
2896
 
2897
2897
  **Action items**:
2898
2898
  - 이 릴리즈의 본문 7건은 다음과 같습니다. 추가 1건은 Bedrock·Vertex·Foundry에서, 그리고 텔레메트리나 비필수 트래픽을 끈 경우의 Monitor 도구·플러그인 monitor 제공과 그 환경의 긴 foreground sleep 차단입니다. 결함 수정 3건은 "Prompt is too long" 오류 뒤 dense text 대화의 compaction, 심볼릭 링크 대상을 보여 주지 않던 파일 읽기 권한 프롬프트, `cleanupPeriodDays`가 매우 클 때 최근 파일 일부를 지우던 백그라운드 정리입니다. 개선 2건은 트랜스크립트 파일이 매우 클 때 비대화형 세션의 compaction 메모리, 그리고 auto mode의 작업 디렉토리 밖 첫 읽기 프롬프트입니다. 변경 1건은 비대화형 세션에서 elicitation 미응답으로 타임아웃된 MCP 도구 호출의 오류 문구입니다. 위 항목별 측정(`git show HEAD:`·`jq`·`git grep`·`git cat-file`) 범위에서 추적되는 저장소 설정(`.claude/settings.json`, `templates/.claude/settings.json`, `.mcp.json`)을 바꿔야 하는 항목은 찾지 못했습니다(R016: CC 지식은 이 가이드에 두고 룰 파일에는 행동 변화가 필요할 때만 1줄).
2899
- - 후속 실측 후보(본문 `[가설]` 8개에 대응): (1) Bedrock·Vertex·Foundry나 텔레메트리·비필수 트래픽을 끈 환경에서 Monitor 도구 제공과 긴 foreground sleep 차단을 확인합니다. 이때 `monitoring-setup` 스킬의 Enterprise Configuration 예시(`.claude/skills/monitoring-setup/SKILL.md:262`~`:264`)를 적용한 경로와 `skills-sh-search`의 `DISABLE_TELEMETRY=1` 안내(`.claude/skills/skills-sh-search/SKILL.md:211`)를 셸에 export한 경로를 함께 보고, agora watchdog 서브셸의 `sleep`(`.claude/skills/agora/scripts/judge.sh:140`, `.claude/skills/agora/scripts/reviewers.sh:106`)이 차단되는지도 확인합니다. (2) `diagram-design`으로 SVG 텍스트가 많이 쌓인 대화에서 "Prompt is too long" 오류 뒤 compaction을 거친 다음 요청이 다시 실패하는지 확인합니다. (3) 트랜스크립트 파일이 매우 큰 장기 `-p` `/fsd` 실행에서 compaction 시점 메모리를 2.1.310 전후로 비교합니다. (4) `permissions.blockReadsOutsideWorkingDirectories`를 켠 auto mode 세션에서 작업 디렉토리 밖 첫 읽기 프롬프트의 문구를 확인합니다. (5) 원격 http 서버 `eraser`가 elicitation을 요청하는지 확인합니다. (6) 비대화형 세션에서 elicitation 미응답 타임아웃 오류를 실제로 받은 사례가 있는지 확인합니다.
2899
+ - 후속 실측 후보(본문 `[가설]` 9개에 대응, `awk '/^## v2\.1\.310 /{p=1} p && /^\*\*Action items\*\*/{exit} p' guides/claude-code/15-version-compatibility.md | grep -o '\[가설 —' | wc -l` = 9): (1) Bedrock·Vertex·Foundry나 텔레메트리·비필수 트래픽을 끈 환경에서 Monitor 도구 제공과 긴 foreground sleep 차단을 확인합니다. 이때 `monitoring-setup` 스킬의 Enterprise Configuration 예시(`.claude/skills/monitoring-setup/SKILL.md:262`~`:264`)를 적용한 경로와 `skills-sh-search`의 `DISABLE_TELEMETRY=1` 안내(`.claude/skills/skills-sh-search/SKILL.md:211`)를 셸에 export한 경로를 함께 보고, agora watchdog 서브셸의 `sleep`(`.claude/skills/agora/scripts/judge.sh:140`, `.claude/skills/agora/scripts/reviewers.sh:106`)과 auto-dev 워크플로 ci-check 단계의 poll loop(`.claude/skills/pipeline/workflows/auto-dev.yaml:1551`~`:1554`)가 차단되는지도 확인합니다. (2) `diagram-design`으로 SVG 텍스트가 많이 쌓인 대화에서 "Prompt is too long" 오류 뒤 compaction을 거친 다음 요청이 다시 실패하는지 확인합니다. (3) 트랜스크립트 파일이 매우 큰 장기 `-p` `/fsd` 실행에서 compaction 시점 메모리를 2.1.310 전후로 비교합니다. (4) `permissions.blockReadsOutsideWorkingDirectories`를 켠 auto mode 세션에서 작업 디렉토리 밖 첫 읽기 프롬프트의 문구를 확인합니다. (5) 원격 http 서버 `eraser`가 elicitation을 요청하는지 확인합니다. (6) 비대화형 세션에서 elicitation 미응답 타임아웃 오류를 실제로 받은 사례가 있는지 확인합니다.
2900
2900
  - (310) 항목 중 `[가설 — …]` 표기는 판정 기준을 충족하는 측정이 이루어지기 전에는 결론으로 쓰지 않습니다.
2901
2901
 
2902
2902
  ## Known Platform Issues & Workarounds