oh-my-customcode 2.0.6 → 2.0.8

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.
Files changed (37) hide show
  1. package/README.md +3 -2
  2. package/dist/cli/index.js +28 -7
  3. package/dist/index.js +28 -7
  4. package/package.json +1 -1
  5. package/templates/.claude/hooks/hooks.json +28 -12
  6. package/templates/.claude/hooks/scripts/auto-continue-guard.sh +5 -5
  7. package/templates/.claude/hooks/scripts/auto-dev-token-tracker.sh +12 -1
  8. package/templates/.claude/hooks/scripts/bash-cd-advisor.sh +172 -0
  9. package/templates/.claude/hooks/scripts/fail-axis-cause-advisor.sh +2 -2
  10. package/templates/.claude/hooks/scripts/failure-ledger.sh +18 -0
  11. package/templates/.claude/hooks/scripts/file-change-validator.sh +6 -3
  12. package/templates/.claude/hooks/scripts/omcustom-auto-update.sh +19 -5
  13. package/templates/.claude/hooks/scripts/r007-r008-drift-advisor.sh +9 -1
  14. package/templates/.claude/hooks/scripts/rule-deletion-guard.sh +118 -1
  15. package/templates/.claude/hooks/scripts/session-env-check.sh +20 -5
  16. package/templates/.claude/hooks/scripts/session-reflection.sh +2 -0
  17. package/templates/.claude/hooks/scripts/stall-detection-advisor.sh +16 -3
  18. package/templates/.claude/hooks/scripts/stuck-detector.sh +21 -4
  19. package/templates/.claude/hooks/scripts/subagent-failure-advisor.sh +48 -23
  20. package/templates/.claude/hooks/scripts/task-outcome-recorder.sh +19 -6
  21. package/templates/.claude/ontology/agents.yaml +71 -7
  22. package/templates/.claude/ontology/graphs/agent-skill.json +64 -5
  23. package/templates/.claude/ontology/graphs/full-graph.json +240 -7
  24. package/templates/.claude/ontology/graphs/routing.json +2 -2
  25. package/templates/.claude/ontology/skills.yaml +65 -1
  26. package/templates/.claude/rules/MUST-enforcement-policy.md +6 -6
  27. package/templates/.claude/rules/MUST-orchestrator-coordination.md +1 -1
  28. package/templates/.claude/rules/SHOULD-memory-integration.md +1 -1
  29. package/templates/.claude/settings.json +28 -12
  30. package/templates/.claude/skills/fsd/SKILL.md +11 -10
  31. package/templates/.claude/skills/goal/SKILL.md +5 -5
  32. package/templates/.claude/skills/omcustom-loop/SKILL.md +4 -4
  33. package/templates/.claude/skills/pipeline/workflows/auto-dev.yaml +13 -0
  34. package/templates/guides/claude-code/04-agent-skills.md +1 -1
  35. package/templates/guides/claude-code/15-version-compatibility.md +51 -51
  36. package/templates/manifest.json +1 -1
  37. package/templates/workflows/auto-dev.yaml +13 -0
@@ -1927,7 +1927,7 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
1927
1927
  ### 에이전트 · teammate · worktree
1928
1928
 
1929
1929
  - CHANGELOG 원문: "Changed an in-process teammate's `agent_id` in Agent results to its agent ID (its `name@team` address stays in `teammate_id`); TeammateIdle hooks no longer fire from its subagents or forks"
1930
- (290) 인프로세스 teammate의 Agent 반환 결과에서 `agent_id`는 agent ID가 되고 `name@team` 주소는 `teammate_id`에 남으며, 그 teammate의 서브에이전트나 fork에서는 TeammateIdle 훅이 더 이상 발화하지 않습니다. 관측한 범위에서 `.claude/settings.json:355`의 TeammateIdle 훅은 stdin에서 `.teammate_id`를 읽으므로(`.claude/settings.json:360`) 주소 필드가 유지되는 한 읽는 필드는 그대로입니다. 이 변경은 Agent 반환 결과에 대한 서술이며 훅 stdin의 필드 변경이라는 근거는 원문에 없습니다 [가설 — 훅 stdin의 `teammate_id` 값 형식 불변 여부는 실제 teammate 세션 미실측]. R018은 `TeamCreate` 부재로 dormant이므로(`.claude/rules/MUST-agent-teams.md:22`, `:36`) 정책 변경은 없습니다.
1930
+ (290) 인프로세스 teammate의 Agent 반환 결과에서 `agent_id`는 agent ID가 되고 `name@team` 주소는 `teammate_id`에 남으며, 그 teammate의 서브에이전트나 fork에서는 TeammateIdle 훅이 더 이상 발화하지 않습니다. 관측한 범위에서 `.claude/settings.json`의 `TeammateIdle` 블록의 훅은 stdin에서 `.teammate_id`를 읽으므로(같은 블록의 inline command) 주소 필드가 유지되는 한 읽는 필드는 그대로입니다. 이 변경은 Agent 반환 결과에 대한 서술이며 훅 stdin의 필드 변경이라는 근거는 원문에 없습니다 [가설 — 훅 stdin의 `teammate_id` 값 형식 불변 여부는 실제 teammate 세션 미실측]. R018은 `TeamCreate` 부재로 dormant이므로(`.claude/rules/MUST-agent-teams.md:22`, `:36`) 정책 변경은 없습니다.
1931
1931
  - CHANGELOG 원문: "Fixed background subagents losing write and Bash access in their worktree after the main session enters or exits a different worktree"
1932
1932
  (290) 메인 세션이 다른 worktree에 들어가거나 나온 뒤 백그라운드 서브에이전트가 자기 worktree의 write·Bash 접근을 잃던 결함이 수정되었습니다. 관측한 범위(`git grep -n '^isolation:' -- '.claude/agents/*.md'`)에서 에이전트 frontmatter의 `isolation:` 값은 `sec-codeql-expert`의 `sandbox`(`.claude/agents/sec-codeql-expert.md:8`) 1건이며 `isolation: worktree` 에이전트는 없습니다. frontmatter 밖의 worktree 경로, 즉 메인 세션이 `EnterWorktree`를 쓰는 `omcustom-auto-improve`(`.claude/skills/omcustom-auto-improve/SKILL.md:59`)와 호출 단위 `isolation: "worktree"` 위임(R009 `.claude/rules/MUST-parallel-execution.md:208`의 v2.1.273 노트)은 이번에 실행 검증하지 않았습니다. 따라서 그 경로의 백그라운드 서브에이전트에 대한 영향은 [가설 — 메인 세션의 worktree 전환과 백그라운드 서브에이전트 실행이 겹치는지로 판정]입니다. 이 수정은 플랫폼의 접근 복원이며 프로젝트의 도구 허용 범위를 넓히는 근거가 아닙니다.
1933
1933
  - CHANGELOG 원문: "Fixed resumed subagents and teammates losing their earlier thinking and prompt cache after receiving a message mid-run"
@@ -1938,9 +1938,9 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
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
- (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해 루프가 돌아오는지 실측하면 판정]입니다.
1941
+ (290) 대화가 compact된 뒤 resume하면 `/loop` 간격 작업과 reminder가 조용히 돌아오지 않던 결함이 수정되었으며, 적용 범위는 이 버전부터 수행한 compaction입니다. 과거에 compact된 세션까지 복구된다고 확장하지 않습니다. 원문의 대상은 간격을 둔 `/loop`와 reminder이며, `/fsd`의 `/loop`는 간격 없이 모델이 주기를 정하는 self-paced 루프입니다(`.claude/skills/fsd/SKILL.md:16`, `:40` "self-paced loop (model decides cadence)"; `:163`은 `/goal`·`/loop` 호출이 필수가 아니라고 명시). 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마다 추가로 한 번 더 실행되던 결함이 수정되었습니다. 관측한 범위(`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 절에 정리했습니다. 따라서 프로젝트 변경은 필요하지 않습니다.
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`, `:163`)이고, 다른 하나는 `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
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"
@@ -1948,7 +1948,7 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
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"
1949
1949
  (290) idle 상태에서 백그라운드로 옮겨진 세션이 재시작이나 idle cleanup 뒤 "no saved transcript"로 열리던 결함이 수정되어 이제 대화를 재개합니다. 이 저장소의 재개 절차(R011 세션 메모리)는 바뀌지 않으며, 실제 재개 동작은 이번 정적 검토에서 실행 검증하지 않았습니다.
1950
1950
  - 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"
1951
- (290) 클라우드 세션에서 컨테이너 재시작으로 `/loop` wakeup이나 예약 작업이 사라진 뒤 세션이 계속 잠든 채로 남던 결함에 대한 수정입니다. 단, 2.1.293 절의 "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"가 이 수정을 되돌렸으므로 현재 최신 버전(2.1.296)에서는 이 항목이 유효하지 않습니다. 이 저장소가 클라우드 세션을 쓰는지는 관측되지 않았습니다. 관측한 범위(`git grep -n -E 'container restart|staying asleep' -- .claude/rules guides CLAUDE.md`, 이 가이드·미러 제외)에서 이 수정에 기대는 룰·가이드 문장은 찾지 못했습니다(유일한 일치인 `.claude/rules/MUST-completion-verification.md:567`은 2.1.275의 권한 프롬프트 항목입니다).
1951
+ (290) 클라우드 세션에서 컨테이너 재시작으로 `/loop` wakeup이나 예약 작업이 사라진 뒤 세션이 계속 잠든 채로 남던 결함에 대한 수정입니다. 단, 2.1.293 절의 "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"가 이 수정을 되돌렸으므로 2.1.293 이후 버전에서는 이 항목이 유효하지 않습니다(이 절 작성 시점의 최신은 2.1.296). 이 저장소가 클라우드 세션을 쓰는지는 관측되지 않았습니다. 관측한 범위(`git grep -n -E 'container restart|staying asleep' -- .claude/rules guides CLAUDE.md`, 이 가이드·미러 제외)에서 이 수정에 기대는 룰·가이드 문장은 찾지 못했습니다(유일한 일치인 `.claude/rules/MUST-completion-verification.md:567`은 2.1.275의 권한 프롬프트 항목입니다).
1952
1952
 
1953
1953
  ### 훅 · 플러그인
1954
1954
 
@@ -1959,7 +1959,7 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
1959
1959
  - CHANGELOG 원문: "Fixed sandboxed Bash commands on Linux running `ConfigChange` hooks and reloading settings mid-command when `.claude/settings.json` or `.claude/settings.local.json` does not exist"
1960
1960
  (290) `.claude/settings.json` 또는 `.claude/settings.local.json`이 없을 때 Linux의 sandboxed Bash 명령이 명령 도중 `ConfigChange` 훅을 실행하고 설정을 다시 읽던 결함이 수정되었습니다. 관측한 범위에서 `.claude/settings.json`에 `ConfigChange` 훅이 없고(`jq '.hooks|has("ConfigChange")'`=false) 두 설정 파일이 모두 존재하며(`ls`) `sandbox` 키도 없어(`jq 'has("sandbox")'`=false) 영향 조건이 관측되지 않았습니다.
1961
1961
  - CHANGELOG 원문: "Added `agentId` to the `tool.check` event of plugin hooks, so a hook can tell a subagent's permission check from the main session's"
1962
- (290) 플러그인 훅의 `tool.check` 이벤트에 `agentId`가 추가되어, 훅이 서브에이전트의 권한 검사와 메인 세션의 검사를 구분할 수 있습니다. 이 항목은 플러그인(mod) 훅 표면이며, `r007-r008-drift-advisor.sh`가 읽는 것은 프로젝트 `settings.json` 훅 stdin의 `agent_id`입니다(`.claude/hooks/scripts/r007-r008-drift-advisor.sh:152`). 두 표면은 서로 다르므로 이 스크립트의 payload 계약을 바꾸지 않으며 코드 변경은 제안하지 않습니다.
1962
+ (290) 플러그인 훅의 `tool.check` 이벤트에 `agentId`가 추가되어, 훅이 서브에이전트의 권한 검사와 메인 세션의 검사를 구분할 수 있습니다. 이 항목은 플러그인(mod) 훅 표면이며, `r007-r008-drift-advisor.sh`가 읽는 것은 프로젝트 `settings.json` 훅 stdin의 `agent_id`입니다(`.claude/hooks/scripts/r007-r008-drift-advisor.sh:155`). 두 표면은 서로 다르므로 이 스크립트의 payload 계약을 바꾸지 않으며 코드 변경은 제안하지 않습니다.
1963
1963
 
1964
1964
  ### 권한 · Bash · 설정
1965
1965
 
@@ -2029,7 +2029,7 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2029
2029
  ### 권한 · 훅 · 도구 입력
2030
2030
 
2031
2031
  - CHANGELOG 원문: "Security: Fixed PreToolUse hook approvals and auto mode bypassing the permission prompt for file reads from network (UNC) paths"
2032
- (292) PreToolUse 훅의 승인과 auto mode가 네트워크(UNC) 경로의 파일 읽기에서 권한 프롬프트를 우회하던 보안 결함이 수정되었습니다. 관측한 범위에서 이 저장소의 훅은 승인 결정 필드를 출력하지 않습니다(`git grep -n permissionDecision -- .claude/hooks` 결과 0건, `.claude/settings.json` 인라인 훅도 `command grep -c permissionDecision` 0; 훅 출력의 `hookSpecificOutput`은 `.claude/hooks/scripts/`의 `claude-md-reinject.sh:74`, `fail-axis-cause-advisor.sh:132`, `r007-r008-drift-advisor.sh:445`, `user-prompt-preprocessor.sh:99`의 jq 출력 식 4곳이 출력 생성 지점이며 모두 `additionalContext` 전달에만 씁니다; `git grep -n hookSpecificOutput -- .claude/hooks`는 주석과 `.claude/hooks/hooks.json:239`의 description을 포함해 13줄을 반환합니다). 또한 이 저장소 실행 환경은 macOS이며 UNC 경로 사용은 관측하지 못했습니다 [가설 — UNC 경로 사용 여부 미관측]. 영향이 없을 것으로 봅니다.
2032
+ (292) PreToolUse 훅의 승인과 auto mode가 네트워크(UNC) 경로의 파일 읽기에서 권한 프롬프트를 우회하던 보안 결함이 수정되었습니다. 관측한 범위에서 이 저장소의 훅은 승인 결정 필드를 출력하지 않습니다(`git grep -n permissionDecision -- .claude/hooks` 결과 0건 — 추적되지 않은 `bash-cd-advisor.sh`는 `git grep`에 잡히지 않으며 커밋 후에는 이 필드를 출력하지 않는다고 밝히는 주석 `:30` 1줄이 걸립니다, `.claude/settings.json` 인라인 훅도 `command grep -c permissionDecision` 0; 훅 출력의 `hookSpecificOutput`은 `.claude/hooks/scripts/`의 `claude-md-reinject.sh:74`, `fail-axis-cause-advisor.sh:132`, `r007-r008-drift-advisor.sh:457`, `user-prompt-preprocessor.sh:99`의 jq 출력 식 4곳(v2.0.7 기준)에 더해 v2.0.8에서 `subagent-failure-advisor.sh:60`, `bash-cd-advisor.sh:169`의 jq 출력 식과 `.claude/hooks/hooks.json:20`의 dev-server 인라인 명령 출력이 추가되어 출력 생성 지점은 7곳이며, 모두 `additionalContext` 전달에만 씁니다; `git grep -n hookSpecificOutput -- .claude/hooks`는 작업 트리에서 주석과 `.claude/hooks/hooks.json:249`의 description을 포함해 16줄을 반환하고(v2.0.7: 13줄), 추적되지 않은 `bash-cd-advisor.sh`의 2줄(`:25`, `:169`)을 포함하는 `grep -rn hookSpecificOutput .claude/hooks`는 18줄이므로 커밋 후에는 18줄이 적용됩니다). 또한 이 저장소 실행 환경은 macOS이며 UNC 경로 사용은 관측하지 못했습니다 [가설 — UNC 경로 사용 여부 미관측]. 영향이 없을 것으로 봅니다.
2033
2033
  - CHANGELOG 원문: "Fixed a skill's or slash command's `allowed-tools` rule coming back in a later turn when you leave auto mode or plan mode partway through that turn"
2034
2034
  (292) auto mode나 plan mode를 턴 도중에 벗어날 때 스킬·슬래시 커맨드의 `allowed-tools` 규칙이 이후 턴에 다시 돌아오던 결함이 수정되었습니다. 관측한 범위(`git grep -n '^allowed-tools:' -- '.claude/skills/*/SKILL.md'`)에서 `allowed-tools`를 선언한 스킬은 2개입니다(`.claude/skills/diagram-design/SKILL.md:12`, `.claude/skills/profile/SKILL.md:7`). 영향 범위가 작고 규칙 문안은 바뀌지 않습니다.
2035
2035
  - CHANGELOG 원문: "Improved hook output handling: `<system-reminder>` tags written in a hook's output are escaped before they reach Claude"
@@ -2046,7 +2046,7 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2046
2046
  - CHANGELOG 원문: "Fixed an MCP tool with a name longer than 128 characters making every request fail; that tool is now left out and an MCP error names it"
2047
2047
  (292) 이름이 128자를 넘는 MCP 도구가 모든 요청을 실패시키던 결함이 수정되어, 해당 도구는 제외되고 MCP 오류가 그 이름을 알립니다. 이 저장소 `.mcp.json`은 서버 2개(`ontology-rag` stdio `.mcp.json:4`, `eraser` http `.mcp.json:16`)를 두며 `.claude/settings.json:26`은 `ontology-rag`만 `enabledMcpjsonServers`에 나열합니다(`:25`의 `enableAllProjectMcpServers`는 true). 도구 이름 길이는 세션 도구 목록으로 잴 수 있습니다. Claude Code 2.1.296 리뷰어 세션에서 가장 긴 `ontology-rag` 도구 이름은 `mcp__ontology-rag__ontology_compare_phases`(42자, 접두 제외 23자)로 관측됐고, 이 절을 정정한 서브에이전트 세션의 지연 도구 목록에서도 같은 이름이 최장이었습니다(python3 `len` 계산). `eraser`는 두 세션 모두 인증 전 도구(`mcp__eraser__authenticate`, `mcp__eraser__complete_authentication`)만 보였으므로, 인증 후 도구 이름 길이는 [가설 — 인증 후 도구 목록으로 판정]입니다.
2048
2048
  - CHANGELOG 원문: "Improved startup of `claude -p` and SDK sessions: the first turn no longer waits for HTTP and SSE MCP servers to answer `resources/list`"
2049
- (292) `claude -p`와 SDK 세션의 시작이 빨라져 첫 턴이 HTTP·SSE MCP 서버의 `resources/list` 응답을 기다리지 않습니다. 이 저장소의 http 서버는 `eraser` 하나이며(`.mcp.json:16`), 무인 실행(`.claude/skills/fsd/SKILL.md:133`가 `claude -p`를 언급)에서 이 서버가 로드되는지는 관측하지 못했습니다 [가설 — `enableAllProjectMcpServers: true`(`.claude/settings.json:25`)에 따른 로드 여부 미실측]. 시작 지연 개선이지만, 첫 턴이 HTTP·SSE 서버의 `resources/list` 결과 없이 시작될 수 있는지는 원문이 말하지 않으므로 [가설 — 첫 턴에서 해당 서버 리소스 목록의 유무를 실측하면 판정]입니다.
2049
+ (292) `claude -p`와 SDK 세션의 시작이 빨라져 첫 턴이 HTTP·SSE MCP 서버의 `resources/list` 응답을 기다리지 않습니다. 이 저장소의 http 서버는 `eraser` 하나이며(`.mcp.json:16`), 무인 실행(`.claude/skills/fsd/SKILL.md:134`가 `claude -p`를 언급)에서 이 서버가 로드되는지는 관측하지 못했습니다 [가설 — `enableAllProjectMcpServers: true`(`.claude/settings.json:25`)에 따른 로드 여부 미실측]. 시작 지연 개선이지만, 첫 턴이 HTTP·SSE 서버의 `resources/list` 결과 없이 시작될 수 있는지는 원문이 말하지 않으므로 [가설 — 첫 턴에서 해당 서버 리소스 목록의 유무를 실측하면 판정]입니다.
2050
2050
  - CHANGELOG 원문: "Changed local (stdio) MCP server connections to negotiate protocol version 2026-07-28 by default on every install, including Bedrock, Vertex and Foundry; `MCP_PROTOCOL_NEGOTIATION=legacy` opts out"
2051
2051
  (292) 로컬(stdio) MCP 서버 연결이 모든 설치(Bedrock·Vertex·Foundry 포함)에서 기본적으로 프로토콜 버전 2026-07-28을 협상하며, `MCP_PROTOCOL_NEGOTIATION=legacy`로 이전 방식을 선택할 수 있습니다. 이 저장소의 로컬 stdio 서버는 `ontology-rag`이며 `.venv/bin/python -m ontology_rag.mcp_server`로 실행됩니다(`.mcp.json:4`~`:9`). Claude Code 2.1.296 세션에서 `ontology-rag` 도구가 노출된 것은 관측됐습니다(리뷰어 관측이며, 이 절을 정정한 서브에이전트 세션의 지연 도구 목록에도 `mcp__ontology-rag__*` 도구가 있었습니다). 다만 연결 경로가 새 프로토콜 협상인지 아래 항목의 7일 폴백인지는 관측하지 않았습니다 [가설 — 연결 경로 미관측]. R019의 enrichment는 실패 시 조용히 건너뛰도록 규정되어 있습니다(`.claude/rules/SHOULD-ontology-rag-routing.md:39`의 「Failure Handling」 절, 표는 `:41`~`:46`).
2052
2052
  - CHANGELOG 원문: "Improved startup with local (stdio) MCP servers that ignore the newer protocol check: after one slow connect they are remembered for 7 days and connected the older way without the wait"
@@ -2055,13 +2055,13 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2055
2055
  ### 무인 실행 · 예약 · 재개
2056
2056
 
2057
2057
  - CHANGELOG 원문: "Fixed one-shot `claude -p` and Agent SDK runs stopping a background command 5 seconds after the final result, and one-shot `claude -p` runs dropping a scheduled wakeup; both are now waited for"
2058
- (292) 일회성 `claude -p`와 Agent SDK 실행이 최종 결과 5초 뒤에 백그라운드 명령을 멈추던 결함과, 일회성 `claude -p` 실행이 예약된 wakeup을 버리던 결함이 수정되어, 이제 둘 다 기다립니다. `/fsd`는 `claude -p`·예약 실행 경로를 명시적으로 다루고(`.claude/skills/fsd/SKILL.md:133`, `:172`), R020은 2.1.257의 Monitor 대기 수정을 이미 기록합니다(`.claude/rules/MUST-completion-verification.md:535`). 구버전 `-p` 실행에서 백그라운드 결과의 부재는 조기 종료의 산물일 수 있었습니다 [가설 — 실제 무인 `-p` 실행에서의 효과 미실측].
2058
+ (292) 일회성 `claude -p`와 Agent SDK 실행이 최종 결과 5초 뒤에 백그라운드 명령을 멈추던 결함과, 일회성 `claude -p` 실행이 예약된 wakeup을 버리던 결함이 수정되어, 이제 둘 다 기다립니다. `/fsd`는 `claude -p`·예약 실행 경로를 명시적으로 다루고(`.claude/skills/fsd/SKILL.md:134`, `:173`), R020은 2.1.257의 Monitor 대기 수정을 이미 기록합니다(`.claude/rules/MUST-completion-verification.md:535`). 구버전 `-p` 실행에서 백그라운드 결과의 부재는 조기 종료의 산물일 수 있었습니다 [가설 — 실제 무인 `-p` 실행에서의 효과 미실측].
2059
2059
  - CHANGELOG 원문: "Fixed plan mode not being restored when resuming a session from the `claude --resume` session picker or with `/resume`"
2060
2060
  (292) `claude --resume` 세션 선택기나 `/resume`으로 세션을 재개할 때 plan mode가 복원되지 않던 결함이 수정되었습니다. 이 저장소의 에이전트 정의에는 `permissionMode: plan`이 0건입니다(`git grep -h '^permissionMode:' -- '.claude/agents/*.md' | sort | uniq -c`). plan mode에 들어가는 경로로는 사용자가 세션에서 켜는 경우 외에, `structured-dev-cycle` 스킬이 Stage 1을 `EnterPlanMode`에 대응시키고(`.claude/skills/structured-dev-cycle/SKILL.md:134`~`:136`) `research` 스킬이 `EnterPlanMode`를 언급하며(`.claude/skills/research/SKILL.md:384`) R002 Tier 3가 `EnterPlanMode`를 나열합니다(`.claude/rules/MUST-permissions.md:11`). 이 경로로 들어간 plan mode도 재개 시 복원 대상이 되지만, 플랫폼 수정이므로 규칙 변경은 필요하지 않습니다.
2061
2061
  - CHANGELOG 원문: "Fixed saved scheduled tasks created after `/resume`, `/branch` or `/clear` never firing, and saved tasks ignoring later creates and deletes after two writes to the tasks file milliseconds apart"
2062
- (292) `/resume`·`/branch`·`/clear` 이후 만든 저장된 예약 작업이 발화하지 않던 결함과, 작업 파일에 몇 밀리초 간격으로 두 번 쓴 뒤 저장된 작업이 이후의 생성·삭제를 무시하던 결함이 수정되었습니다. `/fsd`의 루프 드라이버는 메인 대화 자신이며 `/goal`·`/loop`(ScheduleWakeup) 호출은 필수가 아니라고 규정합니다(`.claude/skills/fsd/SKILL.md:162`). 관측한 범위(위 v2.1.290 절의 예약 경로 `git grep`)에서 이 수정이 닿을 수 있는 경로는 `/fsd`의 선택적 `/loop` 호출과 `claude-native` 스킬의 예약 실행 안내(`.claude/skills/claude-native/SKILL.md:232`~`:240`, `/schedule`·CronCreate)입니다. 두 경로의 실제 사용은 관측하지 않았고, `/schedule` routine이 이 저장된 예약 작업 경로를 쓰는지도 [가설 — 미관측]입니다.
2062
+ (292) `/resume`·`/branch`·`/clear` 이후 만든 저장된 예약 작업이 발화하지 않던 결함과, 작업 파일에 몇 밀리초 간격으로 두 번 쓴 뒤 저장된 작업이 이후의 생성·삭제를 무시하던 결함이 수정되었습니다. `/fsd`의 루프 드라이버는 메인 대화 자신이며 `/goal`·`/loop`(ScheduleWakeup) 호출은 필수가 아니라고 규정합니다(`.claude/skills/fsd/SKILL.md:163`). 관측한 범위(위 v2.1.290 절의 예약 경로 `git grep`)에서 이 수정이 닿을 수 있는 경로는 `/fsd`의 선택적 `/loop` 호출과 `claude-native` 스킬의 예약 실행 안내(`.claude/skills/claude-native/SKILL.md:232`~`:240`, `/schedule`·CronCreate)입니다. 두 경로의 실제 사용은 관측하지 않았고, `/schedule` routine이 이 저장된 예약 작업 경로를 쓰는지도 [가설 — 미관측]입니다.
2063
2063
  - CHANGELOG 원문: "Fixed a background session's `/loop` silently stopping when the session's process restarted (for example after a crash), because its pending wakeup was lost"
2064
- (292) 백그라운드 세션의 프로세스가 재시작될 때(예: 크래시) 대기 중이던 wakeup이 사라져 `/loop`가 조용히 멈추던 결함이 수정되었습니다. `/fsd`의 `/loop` 반복은 `.claude/skills/fsd/SKILL.md:16`과 `:39`에 정의되어 있습니다. 2.1.293의 클라우드 wakeup 롤백은 대상이 클라우드 컨테이너 재시작이므로 이 항목과 별개 항목으로 판단하며(위 Scope-ceiling과 같은 판단, 코드 경로 동일 여부는 [가설]), 2.1.295의 "Fixed a background session's `/loop` stopping without notice when its next wakeup came due while the session's process was down; the session now says so and Claude is told"는 롤백이 아닌 후속 보완입니다. 현행(2.1.296)에서의 실제 동작은 실행 검증하지 않았습니다.
2064
+ (292) 백그라운드 세션의 프로세스가 재시작될 때(예: 크래시) 대기 중이던 wakeup이 사라져 `/loop`가 조용히 멈추던 결함이 수정되었습니다. `/fsd`의 `/loop` 반복은 `.claude/skills/fsd/SKILL.md:16`과 `:40`에 정의되어 있습니다. 2.1.293의 클라우드 wakeup 롤백은 대상이 클라우드 컨테이너 재시작이므로 이 항목과 별개 항목으로 판단하며(위 Scope-ceiling과 같은 판단, 코드 경로 동일 여부는 [가설]), 2.1.295의 "Fixed a background session's `/loop` stopping without notice when its next wakeup came due while the session's process was down; the session now says so and Claude is told"는 롤백이 아닌 후속 보완입니다. 현행(2.1.296)에서의 실제 동작은 실행 검증하지 않았습니다.
2065
2065
  - CHANGELOG 원문: "Added `CLAUDE_CODE_OVERLOADED_RETRY_BASE_DELAY_MS` environment variable to set a longer base delay for the backoff when retrying an overloaded (529) request"
2066
2066
  (292) 과부하(529) 요청을 재시도할 때의 백오프 기본 지연을 늘리는 환경 변수 `CLAUDE_CODE_OVERLOADED_RETRY_BASE_DELAY_MS`가 추가되었습니다. 측정한 범위에서 이 변수는 `.claude/settings.json`과 `.claude/settings.local.json`에 설정되어 있지 않으며(`command grep -c OVERLOADED .claude/settings.json .claude/settings.local.json` 결과 0·0; `.claude/settings.local.json`은 gitignore 대상이라 `git grep`으로는 볼 수 없습니다), 선택 환경 변수이므로 기본 동작은 바뀌지 않습니다. R004의 "Retry up to 3x with backoff (1s, 2s, 4s)"(`.claude/rules/SHOULD-error-handling.md:25`)는 에이전트 수준 재시도 규정이며 플랫폼 내부 백오프와 별개입니다.
2067
2067
 
@@ -2103,7 +2103,7 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2103
2103
  - CHANGELOG 원문: "Fixed subagents and `--agent` sessions being told a built-in tool was disabled for the whole session when only their own tool list left it out"
2104
2104
  (293) 서브에이전트와 `--agent` 세션이 자신의 도구 목록에서만 빠졌을 뿐인 내장 도구를 "세션 전체에서 비활성"이라고 안내받던 결함이 수정되었습니다. 이 저장소의 에이전트는 frontmatter `tools:`/`disallowedTools:`로 도구를 제한하므로(R010 「Known Limitations (Active Cache)」, `.claude/rules/MUST-orchestrator-coordination.md:811`) 직접 관련됩니다. 이 수정은 모델이 받는 안내 문구를 바로잡는 것이며 위임 전 도구 가용성 점검(R010 Agent Capability Pre-Check, `.claude/rules/MUST-orchestrator-coordination.md:742`)의 필요성을 바꾸지 않습니다.
2105
2105
  - CHANGELOG 원문: "Fixed Claude sometimes treating its own last actions before a context compaction as done after it, and retracting or redoing finished work"
2106
- (293) Claude가 컨텍스트 compaction 직전에 자신이 한 마지막 동작을 compaction 이후에 한 일로 취급해, 끝난 작업을 철회하거나 다시 하던 결함이 수정되었습니다(원문 "treating its own last actions before a context compaction as done after it"의 "done after it"을 "compaction 뒤에 수행된 것"으로 읽었습니다). 이 저장소는 compaction 전후 상태 보완용 훅을 배선합니다(PreCompact `task-state-precompact.sh` `.claude/settings.json:396`, PostCompact prompt 훅 `.claude/settings.json:407`). 다만 PreCompact가 저장한 상태의 복원은 PostCompact prompt에 기대며(`.claude/hooks/scripts/task-state-precompact.sh:3` "Pairs with PostCompact prompt that restores this state"), R021은 PostCompact 배선의 효과를 보장되지 않는 것으로 기록합니다(`.claude/rules/MUST-enforcement-policy.md:9`, `:26`; 보장 경로는 `SessionStart` 재주입). 따라서 이 보완이 실제로 복원 효과를 내는지는 [가설 — compact 직후 응답에 저장된 작업 상태가 반영되는지로 판정]입니다. 플랫폼 수정은 같은 문제를 다루는 방향이며 훅·룰 변경은 필요하지 않습니다. 구버전 `/fsd` 세션에서 관측된 작업 재수행이 있다면 일부가 이 결함 때문이었을 수 있으나 [가설 — 해당 세션 트랜스크립트 미조사] R020의 완료 검증 규정 문안은 이 수정으로 바뀌지 않습니다.
2106
+ (293) Claude가 컨텍스트 compaction 직전에 자신이 한 마지막 동작을 compaction 이후에 한 일로 취급해, 끝난 작업을 철회하거나 다시 하던 결함이 수정되었습니다(원문 "treating its own last actions before a context compaction as done after it"의 "done after it"을 "compaction 뒤에 수행된 것"으로 읽었습니다). 이 저장소는 compaction 전후 상태 보완용 훅을 배선합니다(PreCompact `task-state-precompact.sh` `.claude/settings.json`의 `PreCompact` 블록, PostCompact prompt 훅 `.claude/settings.json`의 `PostCompact` 블록). 다만 PreCompact가 저장한 상태의 복원은 PostCompact prompt에 기대며(`.claude/hooks/scripts/task-state-precompact.sh:3` "Pairs with PostCompact prompt that restores this state"), R021은 PostCompact 배선의 효과를 보장되지 않는 것으로 기록합니다(`.claude/rules/MUST-enforcement-policy.md:9`, `:26`; 보장 경로는 `SessionStart` 재주입). 따라서 이 보완이 실제로 복원 효과를 내는지는 [가설 — compact 직후 응답에 저장된 작업 상태가 반영되는지로 판정]입니다. 플랫폼 수정은 같은 문제를 다루는 방향이며 훅·룰 변경은 필요하지 않습니다. 구버전 `/fsd` 세션에서 관측된 작업 재수행이 있다면 일부가 이 결함 때문이었을 수 있으나 [가설 — 해당 세션 트랜스크립트 미조사] R020의 완료 검증 규정 문안은 이 수정으로 바뀌지 않습니다.
2107
2107
 
2108
2108
  ### 컨텍스트 · 룰 로딩
2109
2109
 
@@ -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 계수 서술 — `: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로 실행되는 세션에 한해 해당합니다.
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` 스킬 문서는 이 절을 작성한 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 이후 예약 작업 복원 등)은 이 항목으로 롤백되지 않았습니다.
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`, `:40`, `:163`). 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개(v2.0.8부터 4개 — `subagent-failure-advisor.sh`는 PostToolUseFailure로 이동)가 전부 `command` 타입이라는 관측(`jq -c '[.hooks.SubagentStop[]?.hooks[]?.type]' .claude/settings.json`; #1631 교체, `.claude/hooks/hooks.json:289`의 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
 
@@ -2145,9 +2145,9 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2145
2145
  ### prompt · agent 훅 판정
2146
2146
 
2147
2147
  - CHANGELOG 원문: "Fixed `prompt` and `agent` hooks written as instructions (such as "Block commands that...") allowing what they should block"
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 훅의 평가 경로 미실측]입니다.
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` 결과 두 파일 모두 v2.0.8 기준 `{"command":64,"prompt":1}`; v2.0.7: 63 → v2.0.8: 64). 그 1개는 PostCompact 이벤트의 컨텍스트 재주입 문안이며(`.claude/hooks/hooks.json:381`, `.claude/settings.json`의 `PostCompact` 블록), 무엇을 차단하는 판정 훅이 아닙니다. 스킬·에이전트 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이 기록합니다. 이 절을 작성한 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 조건문이 원문의 '지시문 형태'에 해당하는지 미실측]
2150
+ (294) Stop·SubagentStop의 `prompt` 훅이 지시문 형태로 작성된 경우의 판정이 개선되어 Claude가 일찍 멈출 가능성이 줄었습니다. 이 저장소의 Stop 훅 6개와 SubagentStop 훅 5개(v2.0.8부터 4개 — `subagent-failure-advisor.sh`는 PostToolUseFailure로 이동)는 전부 `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:289`의 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
 
@@ -2165,15 +2165,15 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2165
2165
  ### hooks · 훅 실패 처리
2166
2166
 
2167
2167
  - CHANGELOG 원문: "Added `onFailure: "block"` for command and HTTP hooks: a hook that can't start, times out, or exits with an unexpected code blocks the action instead of letting it through"
2168
- (295) `onFailure: "block"` 옵션이 command·HTTP 훅에 추가되어, 훅이 시작하지 못하거나 타임아웃되거나 예상 밖 종료 코드를 내면 동작을 통과시키는 대신 차단할 수 있습니다. 관측한 범위에서 `.claude/settings.json`·`templates/.claude/settings.json`·`.claude/hooks/hooks.json`에는 `onFailure`·`timeout`·`async` 키가 0건이므로(`git grep -c -E '"(onFailure|timeout|async)"' -- .claude/settings.json templates/.claude/settings.json .claude/hooks/hooks.json` 출력 없음, rc=1) 이 세 파일의 훅은 모두 기본 동작을 씁니다. R021은 대부분의 규칙을 advisory-first로 규정하고 그 이유로 "Missing dependencies (jq, etc.) don't break the session"을 듭니다(`.claude/rules/MUST-enforcement-policy.md:79`). `onFailure: "block"`은 옵트인이므로 기본값이 바뀌지 않으며, 기존 advisory 훅에 일괄 적용하면 R021 정책에 반하므로 적용하지 않습니다. 이 옵션을 R021 Hard Block 계층 훅(`.claude/rules/MUST-enforcement-policy.md:19`의 stage-blocker, dev-server tmux, rule-deletion-guard)에 쓸지는 별도 결정 사안이며 이번 반영 범위에 넣지 않습니다.
2168
+ (295) `onFailure: "block"` 옵션이 command·HTTP 훅에 추가되어, 훅이 시작하지 못하거나 타임아웃되거나 예상 밖 종료 코드를 내면 동작을 통과시키는 대신 차단할 수 있습니다. 관측한 범위에서 `.claude/settings.json`·`templates/.claude/settings.json`·`.claude/hooks/hooks.json`에는 `onFailure`·`timeout`·`async` 키가 0건이므로(`git grep -c -E '"(onFailure|timeout|async)"' -- .claude/settings.json templates/.claude/settings.json .claude/hooks/hooks.json` 출력 없음, rc=1) 이 세 파일의 훅은 모두 기본 동작을 씁니다. R021은 대부분의 규칙을 advisory-first로 규정하고 그 이유로 "Missing dependencies (jq, etc.) don't break the session"을 듭니다(`.claude/rules/MUST-enforcement-policy.md:79`). `onFailure: "block"`은 옵트인이므로 기본값이 바뀌지 않으며, 기존 advisory 훅에 일괄 적용하면 R021 정책에 반하므로 적용하지 않습니다. 이 옵션을 R021 Hard Block 계층 훅(`.claude/rules/MUST-enforcement-policy.md:19`의 stage-blocker, dev-server tmux, rule-deletion-guard; v2.0.8부터 dev-server tmux는 advisory로 바뀌어 이 행에서 제외 — #1856)에 쓸지는 별도 결정 사안이며 이번 반영 범위에 넣지 않습니다.
2169
2169
  - CHANGELOG 원문: "Fixed an async SessionStart hook's unchanged context being added to the conversation again on every resume"
2170
- (295) 비동기 SessionStart 훅의 변하지 않은 컨텍스트가 resume마다 대화에 다시 추가되던 결함이 수정되었습니다. 관측한 범위에서 `.claude/hooks/hooks.json:128`의 `SessionStart` 훅 블록에는 `async` 키가 없으므로(위 `git grep` 0건) 이 결함 조건에 해당하지 않습니다.
2170
+ (295) 비동기 SessionStart 훅의 변하지 않은 컨텍스트가 resume마다 대화에 다시 추가되던 결함이 수정되었습니다. 관측한 범위에서 `.claude/hooks/hooks.json:138`의 `SessionStart` 훅 블록에는 `async` 키가 없으므로(위 `git grep` 0건) 이 결함 조건에 해당하지 않습니다.
2171
2171
  - CHANGELOG 원문: "Fixed variables a SessionStart hook writes to `CLAUDE_ENV_FILE` not reaching the Bash tool after an in-app `/resume` or `/branch`"
2172
2172
  (295) SessionStart 훅이 `CLAUDE_ENV_FILE`에 쓴 변수가 인앱 `/resume`·`/branch` 이후 Bash 도구에 전달되지 않던 결함이 수정되었습니다. 관측한 범위에서 `.claude/hooks/`와 `.claude/settings.json`에는 `CLAUDE_ENV_FILE` 참조가 없으므로(`git grep -n CLAUDE_ENV_FILE -- .claude/hooks .claude/settings.json` rc=1) 영향 조건이 관측되지 않았습니다.
2173
2173
  - CHANGELOG 원문: "Fixed an async hook's JSON output being ignored when it is printed over several lines"
2174
2174
  (295) 여러 줄로 출력된 비동기 훅의 JSON 출력이 무시되던 결함이 수정되었습니다. `async` 훅이 0건이므로(위 `git grep -c` 출력 없음) 영향 조건이 관측되지 않았습니다.
2175
2175
  - CHANGELOG 원문: "Fixed web searches and `agent` hook evaluations taking much longer at `xhigh` and `max` effort"
2176
- (295) `xhigh`·`max` effort에서 웹 검색과 `agent` 훅 평가가 훨씬 오래 걸리던 문제가 수정되었습니다. 관측한 범위에서 CC가 로드하는 `.claude/settings.json`의 훅 타입은 `command` 63개와 `prompt` 1개(PostCompact, `.claude/hooks/hooks.json:375`가 소스)이며 `agent` 타입은 없으므로(v2.1.294 절의 jq 타입 집계) `agent` 훅 쪽 영향 조건은 관측되지 않았습니다. `.claude/agents/*.md`에서 `effort: xhigh` 또는 `max` 줄은 `git grep -n -E 'effort: *(xhigh|max)' -- '.claude/agents/*.md'` 0건이므로(경로를 지정하지 않으면 `docs/` 계획 문서와 이 가이드·미러가 걸립니다) 에이전트 frontmatter 경로의 영향은 없고, 세션 수준 effort 설정에 따른 웹 검색 영향은 측정하지 않았습니다.
2176
+ (295) `xhigh`·`max` effort에서 웹 검색과 `agent` 훅 평가가 훨씬 오래 걸리던 문제가 수정되었습니다. 관측한 범위에서 CC가 로드하는 `.claude/settings.json`의 훅 타입은 v2.0.8 기준 `command` 64개(v2.0.7: 63)와 `prompt` 1개(PostCompact, `.claude/hooks/hooks.json:381`가 소스)이며 `agent` 타입은 없으므로(v2.1.294 절의 jq 타입 집계) `agent` 훅 쪽 영향 조건은 관측되지 않았습니다. `.claude/agents/*.md`에서 `effort: xhigh` 또는 `max` 줄은 `git grep -n -E 'effort: *(xhigh|max)' -- '.claude/agents/*.md'` 0건이므로(경로를 지정하지 않으면 `docs/` 계획 문서와 이 가이드·미러가 걸립니다) 에이전트 frontmatter 경로의 영향은 없고, 세션 수준 effort 설정에 따른 웹 검색 영향은 측정하지 않았습니다.
2177
2177
 
2178
2178
  ### 서브에이전트 · 팀원 · 백그라운드 작업
2179
2179
 
@@ -2186,16 +2186,16 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2186
2186
  - CHANGELOG 원문: "Fixed Claude not being told it can resume background subagents with SendMessage after a session was killed and resumed a second time"
2187
2187
  (295) 세션이 종료된 뒤 두 번째로 resume되었을 때 Claude가 백그라운드 서브에이전트를 `SendMessage`로 재개할 수 있다는 사실을 전달받지 못하던 결함이 수정되었습니다. R018 `SendMessage` resume 관련 노트(`.claude/rules/MUST-agent-teams.md:549`)가 다루는 같은 계열의 신뢰성 수정입니다. 미완 위임을 실측값과 함께 `SendMessage`로 resume하는 R020 「Verification-Delegation Non-Termination」 절차(`.claude/rules/MUST-completion-verification.md:120`)와 보고 본문이 없을 때 `SendMessage`로 재요청하는 R009 결과 수집 절차(`.claude/rules/MUST-parallel-execution.md:368`)는 바뀌지 않습니다.
2188
2188
  - CHANGELOG 원문: "Fixed a background session's `/loop` stopping without notice when its next wakeup came due while the session's process was down; the session now says so and Claude is told"
2189
- (295) 세션의 프로세스가 내려가 있는 동안 백그라운드 세션의 `/loop` 다음 wakeup 시각이 지나면 알림 없이 멈추던 결함이 수정되어, 이제 세션이 그 사실을 알리고 Claude도 전달받습니다. `/fsd`는 self-paced `/loop`를 선택적 구동 수단으로 씁니다(`.claude/skills/fsd/SKILL.md:39`, `:172`). 프로세스가 내려갔다 복구되는 구간의 무음 중단을 이제 세션이 알려주므로, 무인 루프 중단을 관측하면 이 알림 유무를 먼저 확인하는 것이 좋습니다. 이 저장소가 백그라운드 세션에서 `/loop`를 실제로 돌리는지는 관측하지 않았습니다 [가설 — 사용자의 `/fsd` 실행이 백그라운드 세션이면 해당].
2189
+ (295) 세션의 프로세스가 내려가 있는 동안 백그라운드 세션의 `/loop` 다음 wakeup 시각이 지나면 알림 없이 멈추던 결함이 수정되어, 이제 세션이 그 사실을 알리고 Claude도 전달받습니다. `/fsd`는 self-paced `/loop`를 선택적 구동 수단으로 씁니다(`.claude/skills/fsd/SKILL.md:40`, `:173`). 프로세스가 내려갔다 복구되는 구간의 무음 중단을 이제 세션이 알려주므로, 무인 루프 중단을 관측하면 이 알림 유무를 먼저 확인하는 것이 좋습니다. 이 저장소가 백그라운드 세션에서 `/loop`를 실제로 돌리는지는 관측하지 않았습니다 [가설 — 사용자의 `/fsd` 실행이 백그라운드 세션이면 해당].
2190
2190
  - CHANGELOG 원문: "Fixed a stopped scheduled task coming back on resume after a rewind, and a scheduled task being lost on resume after Esc or a rewind following a compaction"
2191
- (295) 되감기(rewind) 뒤 중지된 예약 작업이 resume에서 되살아나던 결함과, 압축(compaction) 뒤 Esc나 되감기를 거친 resume에서 예약 작업이 사라지던 결함이 수정되었습니다. `/fsd`·`/loop` 같은 예약·반복 실행과 R011 세션 연속성에 영향이 있을 수 있는 계열입니다. 관측한 범위에서 `.claude/settings.json`·`.claude/skills/fsd`·`.claude/skills/omcustom-loop`에는 `CronCreate` 예약 작업 설정이 없습니다(`git grep -n CronCreate -- .claude/settings.json .claude/skills/fsd .claude/skills/omcustom-loop` 0건). `CronCreate`는 R002 도구 표(`.claude/rules/MUST-permissions.md:14`) 외에 `claude-native` 스킬의 예약 실행 안내(`.claude/skills/claude-native/SKILL.md:232`, `:240`)와 `guides/claude-code/13-cli-flags.md:56`~`:62`, 그리고 이들의 `templates/` 미러·위키 사본과 `docs/superpowers/plans/`의 계획 문서 2건에 나오며(`git grep -n CronCreate`, 이 가이드·미러 제외), `claude-native`의 이 경로를 실제로 쓰는지는 [가설 — 미관측]입니다. 또한 self-paced `/loop`도 예약 wakeup을 기다리는 세션 한정 반복 작업으로 다뤄지고(2.1.290 CHANGELOG "`/loop` and other recurring session-only scheduled tasks", "background sessions waiting on a scheduled wakeup (`/loop`)"), `/fsd`는 `/loop`를 선택적으로 호출합니다(`.claude/skills/fsd/SKILL.md:16`, `:39`, `:162`). 따라서 `/fsd`를 `/loop`로 돌리다 compaction 뒤 Esc·rewind를 거쳐 resume하는 경로에는 이 수정이 해당할 수 있습니다 [가설 — 해당 경로의 실제 발생은 미관측].
2191
+ (295) 되감기(rewind) 뒤 중지된 예약 작업이 resume에서 되살아나던 결함과, 압축(compaction) 뒤 Esc나 되감기를 거친 resume에서 예약 작업이 사라지던 결함이 수정되었습니다. `/fsd`·`/loop` 같은 예약·반복 실행과 R011 세션 연속성에 영향이 있을 수 있는 계열입니다. 관측한 범위에서 `.claude/settings.json`·`.claude/skills/fsd`·`.claude/skills/omcustom-loop`에는 `CronCreate` 예약 작업 설정이 없습니다(`git grep -n CronCreate -- .claude/settings.json .claude/skills/fsd .claude/skills/omcustom-loop` 0건). `CronCreate`는 R002 도구 표(`.claude/rules/MUST-permissions.md:14`) 외에 `claude-native` 스킬의 예약 실행 안내(`.claude/skills/claude-native/SKILL.md:232`, `:240`)와 `guides/claude-code/13-cli-flags.md:56`~`:62`, 그리고 이들의 `templates/` 미러·위키 사본과 `docs/superpowers/plans/`의 계획 문서 2건에 나오며(`git grep -n CronCreate`, 이 가이드·미러 제외), `claude-native`의 이 경로를 실제로 쓰는지는 [가설 — 미관측]입니다. 또한 self-paced `/loop`도 예약 wakeup을 기다리는 세션 한정 반복 작업으로 다뤄지고(2.1.290 CHANGELOG "`/loop` and other recurring session-only scheduled tasks", "background sessions waiting on a scheduled wakeup (`/loop`)"), `/fsd`는 `/loop`를 선택적으로 호출합니다(`.claude/skills/fsd/SKILL.md:16`, `:40`, `:163`). 따라서 `/fsd`를 `/loop`로 돌리다 compaction 뒤 Esc·rewind를 거쳐 resume하는 경로에는 이 수정이 해당할 수 있습니다 [가설 — 해당 경로의 실제 발생은 미관측].
2192
2192
 
2193
2193
  ### 무인 · headless(`-p`) 실행
2194
2194
 
2195
2195
  - CHANGELOG 원문: "Added a line on stderr, when it is a terminal, that says what a `claude -p` run is waiting for when it stays open after its last turn"
2196
- (295) `claude -p` 실행이 마지막 턴 이후에도 열려 있을 때, 터미널이면 stderr에 무엇을 기다리는지 알려주는 줄이 추가되었습니다. `/fsd`는 무인 실행(`claude -p`, 예약 실행)에서 `/goal`·`/loop`를 권장합니다(`.claude/skills/fsd/SKILL.md:172`). 이 줄은 터미널일 때만 출력되므로 파이프·CI의 stdout 파싱에는 영향이 없다고 보지만 stderr 소비자는 측정하지 않았습니다 [가설 — `claude -p` 실행 스크립트가 stderr를 파싱하지 않으면 영향 없음].
2196
+ (295) `claude -p` 실행이 마지막 턴 이후에도 열려 있을 때, 터미널이면 stderr에 무엇을 기다리는지 알려주는 줄이 추가되었습니다. `/fsd`는 무인 실행(`claude -p`, 예약 실행)에서 `/goal`·`/loop`를 권장합니다(`.claude/skills/fsd/SKILL.md:173`). 이 줄은 터미널일 때만 출력되므로 파이프·CI의 stdout 파싱에는 영향이 없다고 보지만 stderr 소비자는 측정하지 않았습니다 [가설 — `claude -p` 실행 스크립트가 stderr를 파싱하지 않으면 영향 없음].
2197
2197
  - CHANGELOG 원문: "Fixed `claude -p` text output dropping earlier responses when background work started another turn; each turn's response now prints when the turn ends"
2198
- (295) `claude -p` 텍스트 출력이 백그라운드 작업으로 다른 턴이 시작되었을 때 앞선 응답을 빠뜨리던 결함이 수정되어, 이제 각 턴의 응답이 그 턴이 끝날 때 출력됩니다. 이 저장소는 `-p`로 `/fsd`를 돌릴 수 있고(`.claude/skills/fsd/SKILL.md:172`) 서브에이전트 완료 응답에 의존하므로, 구버전의 `-p` 출력 누락을 "에이전트가 응답하지 않음"으로 오진하지 않도록 이 경계를 기억하는 것이 좋습니다. 이 저장소의 `-p` 출력 파서는 관측하지 못했습니다.
2198
+ (295) `claude -p` 텍스트 출력이 백그라운드 작업으로 다른 턴이 시작되었을 때 앞선 응답을 빠뜨리던 결함이 수정되어, 이제 각 턴의 응답이 그 턴이 끝날 때 출력됩니다. 이 저장소는 `-p`로 `/fsd`를 돌릴 수 있고(`.claude/skills/fsd/SKILL.md:173`) 서브에이전트 완료 응답에 의존하므로, 구버전의 `-p` 출력 누락을 "에이전트가 응답하지 않음"으로 오진하지 않도록 이 경계를 기억하는 것이 좋습니다. 이 저장소의 `-p` 출력 파서는 관측하지 못했습니다.
2199
2199
  - CHANGELOG 원문: "Added `CLAUDE_CODE_RETRY_WATCHDOG_MAX_WAIT_MS` to limit how long unattended retry mode (`CLAUDE_CODE_RETRY_WATCHDOG`) waits out 429 and 529 errors"
2200
2200
  (295) 무인 재시도 모드(`CLAUDE_CODE_RETRY_WATCHDOG`)가 429·529 오류를 얼마나 오래 기다리는지 제한하는 `CLAUDE_CODE_RETRY_WATCHDOG_MAX_WAIT_MS`가 추가되었습니다. 이 가이드의 (288) 항목이 이미 `CLAUDE_CODE_RETRY_WATCHDOG`를 다루고 있습니다(`guides/claude-code/15-version-compatibility.md:1791`). 새 환경 변수는 옵트인이며, 관측한 범위(`git grep -n RETRY_WATCHDOG -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'`)에서 참조는 룰 노트(`.claude/rules/MUST-agent-teams.md:549`와 그 `templates/` 미러·`wiki/rules/r018.md` 사본)뿐이라 이 저장소는 어느 쪽도 설정하지 않습니다.
2201
2201
 
@@ -2242,19 +2242,19 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2242
2242
  ### 훅
2243
2243
 
2244
2244
  - CHANGELOG 원문: "Fixed managed-settings `PreToolUse` hooks that deny a tool call with `"continue": false`, and managed `prompt` hooks that block one, refusing the call but not ending the turn"
2245
- (296) managed settings의 `PreToolUse` 훅이 `"continue": false`로 도구 호출을 거부하는 경우와 managed `prompt` 훅이 호출을 차단하는 경우에, 호출은 거부되지만 턴이 끝나지 않던 결함이 수정되었습니다. 관측한 범위에서 description이 차단 목적을 밝힌 이 저장소의 PreToolUse 훅은 프로젝트 settings에 배선되어 있으며, 종료 코드는 훅마다 다릅니다. 스크립트 훅 `.claude/hooks/scripts/stage-blocker.sh:13`과 `.claude/hooks/scripts/rule-deletion-guard.sh:32`는 `exit 2`를 씁니다. description이 차단 목적을 적은 인라인 훅 두 개, 곧 `.claude/settings.json:52`(description `:56` "Block dev servers outside tmux - ensures you can access logs")와 `:82`(description `:86` "Block creation of random .md files - keeps docs consolidated")의 명령에는 `exit 1`이 있습니다(`command grep -n 'exit 1' .claude/settings.json`). `"continue": false`나 `permissionDecision`을 출력하는 곳은 없습니다(`git grep -n -E '"continue": *false|continue: *false|permissionDecision' -- .claude/hooks .claude/settings.json` rc=1). R021의 Conversation Block 계층 훅(`context-budget-advisor.sh`, `stuck-detector.sh`, `cost-cap-advisor.sh`)은 `.claude/settings.json:494`~`:495`, `:516`~`:517`, `:527`~`:528`에서 `continueOnBlock: true`로 배선됩니다. managed settings는 저장소 파일이 아니므로 관측 대상이 아니며, 이 저장소가 배포하는 훅은 관측한 범위에서 프로젝트 settings 훅(`.claude/settings.json`과 `templates/` 미러)이고 플러그인 매니페스트는 없으므로(v2.1.290 절의 `git ls-files`·`find` 0건) 이 수정의 대상이 아니라고 봅니다 [가설 — 사용자 환경의 managed settings 훅 유무는 미관측].
2245
+ (296) managed settings의 `PreToolUse` 훅이 `"continue": false`로 도구 호출을 거부하는 경우와 managed `prompt` 훅이 호출을 차단하는 경우에, 호출은 거부되지만 턴이 끝나지 않던 결함이 수정되었습니다. 관측한 범위에서 description이 차단 목적을 밝힌 이 저장소의 PreToolUse 훅은 프로젝트 settings에 배선되어 있으며, 종료 코드는 훅마다 다릅니다. 스크립트 훅 `.claude/hooks/scripts/stage-blocker.sh:13`과 `.claude/hooks/scripts/rule-deletion-guard.sh`는 `exit 2`를 씁니다(`legacy_check`의 차단 분기들과 분석기 결과 rc 2를 처리하는 분기, 내용 앵커 — 이 스크립트는 줄 번호가 계속 움직입니다. `git grep -n 'exit 2' -- .claude/hooks/scripts/rule-deletion-guard.sh`). description이 차단 목적을 적은 인라인 훅 두 개, 곧 `.claude/settings.json`의 dev-server 훅(v2.0.7 기준 `:52`, description `:56` "Block dev servers outside tmux - ensures you can access logs")과 .md 생성 훅(v2.0.7 기준 `:82`, description `:86` "Block creation of random .md files - keeps docs consolidated")의 명령에는 `exit 1`이 있었습니다(v2.0.8에서 dev-server 훅은 차단하지 않는 advisory로 바뀌어 항상 `exit 0`으로 끝나며, tmux·run_in_background·nohup·`&` 밖에서 포그라운드 dev server가 명령 위치에서 시작될 때만 모델에 `additionalContext`를 전달하고 R021 Hard Block 행에서 빠집니다. .md 생성 훅은 description "Non-blocking notice on new .md/.txt files"의 비차단 알림(`exit 1`)으로 변경; v2.0.7 기준 `git show 060613cd:.claude/settings.json | grep -n 'exit 1'`이 `:52`와 `:82`를 냅니다). `"continue": false`나 `permissionDecision`을 출력하는 곳은 없습니다(`git grep -n -E '"continue": *false|continue: *false|permissionDecision' -- .claude/hooks .claude/settings.json` rc=1). R021의 Conversation Block 계층 훅(`context-budget-advisor.sh`, `stuck-detector.sh`, `cost-cap-advisor.sh`)은 `.claude/settings.json`의 `context-budget-advisor.sh`, `stuck-detector.sh`, `cost-cap-advisor.sh` 훅 항목에서 `continueOnBlock: true`로 배선됩니다. managed settings는 저장소 파일이 아니므로 관측 대상이 아니며, 이 저장소가 배포하는 훅은 관측한 범위에서 프로젝트 settings 훅(`.claude/settings.json`과 `templates/` 미러)이고 플러그인 매니페스트는 없으므로(v2.1.290 절의 `git ls-files`·`find` 0건) 이 수정의 대상이 아니라고 봅니다 [가설 — 사용자 환경의 managed settings 훅 유무는 미관측].
2246
2246
  - CHANGELOG 원문: "Fixed PostToolUse hooks in managed settings not applying `updatedMCPToolOutput` in some sessions"
2247
- (296) managed settings의 PostToolUse 훅이 일부 세션에서 `updatedMCPToolOutput`을 적용하지 못하던 결함이 수정되었습니다. 이 저장소의 `playwright-compress` 훅이 `updatedMCPToolOutput`을 씁니다(`.claude/hooks/scripts/playwright-compress.sh:81`, 배선 `.claude/settings.json:579`). 다만 그 훅은 managed가 아니라 프로젝트 settings에 있으므로 이 수정의 대상이 아닙니다. 프로젝트 settings 경로에서 같은 증상이 있었는지는 관측하지 못했습니다 [가설 — 증상이 managed 한정이라는 CHANGELOG 문구를 따르면 영향 없음]. 또한 이 훅은 입력 JSON 전체를 되돌려 주면서 `updatedMCPToolOutput`을 최상위 키로 넣으며(`.claude/hooks/scripts/playwright-compress.sh:81`의 jq 식), 다른 훅이 쓰는 `hookSpecificOutput` 객체 형태(예: `.claude/hooks/scripts/claude-md-reinject.sh:74`)와 다릅니다. CC가 최상위 위치의 이 키를 적용하는지는 실측하지 않았습니다 [가설 — 훅 적용 전후 MCP 도구 결과를 비교하면 판정].
2247
+ (296) managed settings의 PostToolUse 훅이 일부 세션에서 `updatedMCPToolOutput`을 적용하지 못하던 결함이 수정되었습니다. 이 저장소의 `playwright-compress` 훅이 `updatedMCPToolOutput`을 씁니다(`.claude/hooks/scripts/playwright-compress.sh:81`, 배선 `.claude/settings.json`의 `playwright-compress.sh` 훅 항목). 다만 그 훅은 managed가 아니라 프로젝트 settings에 있으므로 이 수정의 대상이 아닙니다. 프로젝트 settings 경로에서 같은 증상이 있었는지는 관측하지 못했습니다 [가설 — 증상이 managed 한정이라는 CHANGELOG 문구를 따르면 영향 없음]. 또한 이 훅은 입력 JSON 전체를 되돌려 주면서 `updatedMCPToolOutput`을 최상위 키로 넣으며(`.claude/hooks/scripts/playwright-compress.sh:81`의 jq 식), 다른 훅이 쓰는 `hookSpecificOutput` 객체 형태(예: `.claude/hooks/scripts/claude-md-reinject.sh:74`)와 다릅니다. CC가 최상위 위치의 이 키를 적용하는지는 실측하지 않았습니다 [가설 — 훅 적용 전후 MCP 도구 결과를 비교하면 판정].
2248
2248
  - CHANGELOG 원문: "Fixed hook output being altered when it contained text resembling a plugin hint tag"
2249
2249
  (296) 훅 출력에 플러그인 힌트 태그와 비슷한 텍스트가 있으면 출력이 변형되던 결함이 수정되었습니다. 이 저장소의 advisory 훅은 stdout·stderr로 규칙 경고를 전달하므로(R021 Advisory 계층) 이론상 해당될 수 있으나, 관측한 범위에서 저장소에 `plugin hint` 문자열은 0건입니다(`git grep -n 'plugin hint' -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'` rc=1). 훅 출력이 실행 시점에 이런 텍스트를 포함하는지는 관측하지 않았으므로, 영향은 없을 것으로 보되 [가설 — 실제 훅 출력 내용으로 판정]입니다.
2250
2250
  - CHANGELOG 원문: "Fixed Esc or an interrupt during a `UserPromptSubmit` hook or a mod's `prompt.submit` hook ending headless sessions, clearing the typed prompt, or letting the unchecked prompt through"
2251
- (296) `UserPromptSubmit` 훅이나 mod의 `prompt.submit` 훅이 실행되는 동안의 Esc·인터럽트가 headless 세션을 끝내거나 입력한 프롬프트를 지우거나 검사되지 않은 프롬프트를 통과시키던 결함이 수정되었습니다. 이 저장소는 `UserPromptSubmit` 훅 4개(`user-prompt-preprocessor.sh`, `r007-r008-drift-advisor.sh`, `session-autofix-prompt.sh`, `fail-axis-cause-advisor.sh`)를 배선합니다(`.claude/settings.json:233`). 특히 R007/R008 drift advisor와 원인 되묻기 advisor가 이 이벤트에 걸려 있으므로, 구버전의 인터럽트 시 "검사되지 않은 프롬프트 통과"는 advisory 전달 누락의 가능한 경로였습니다 [가설 — 해당 인터럽트 시나리오의 실제 발생은 미관측]. 룰 변경은 필요하지 않습니다.
2251
+ (296) `UserPromptSubmit` 훅이나 mod의 `prompt.submit` 훅이 실행되는 동안의 Esc·인터럽트가 headless 세션을 끝내거나 입력한 프롬프트를 지우거나 검사되지 않은 프롬프트를 통과시키던 결함이 수정되었습니다. 이 저장소는 `UserPromptSubmit` 훅 4개(`user-prompt-preprocessor.sh`, `r007-r008-drift-advisor.sh`, `session-autofix-prompt.sh`, `fail-axis-cause-advisor.sh`)를 배선합니다(`.claude/settings.json`의 `UserPromptSubmit` 블록). 특히 R007/R008 drift advisor와 원인 되묻기 advisor가 이 이벤트에 걸려 있으므로, 구버전의 인터럽트 시 "검사되지 않은 프롬프트 통과"는 advisory 전달 누락의 가능한 경로였습니다 [가설 — 해당 인터럽트 시나리오의 실제 발생은 미관측]. 룰 변경은 필요하지 않습니다.
2252
2252
  - CHANGELOG 원문: "Fixed SessionStart hooks of a plugin loaded after a headless session starts being skipped when a different plugin with the same name, or another spelling of it, had already run"
2253
- (296) headless 세션 시작 후 로드된 플러그인의 SessionStart 훅이, 같은 이름(또는 다른 표기)의 다른 플러그인이 이미 실행됐다는 이유로 건너뛰어지던 결함이 수정되었습니다. 원문의 대상은 플러그인의 SessionStart 훅이며, 이 저장소의 SessionStart 재주입(R021, `.claude/settings.json:161`)은 프로젝트 settings 훅이라 원문 대상에 들지 않습니다. 이 저장소가 사용하는 플러그인(superpowers 등)의 훅이 영향을 받았는지는 관측하지 못했습니다 [가설 — 플러그인 SessionStart 훅 발화 로그로 판정].
2253
+ (296) headless 세션 시작 후 로드된 플러그인의 SessionStart 훅이, 같은 이름(또는 다른 표기)의 다른 플러그인이 이미 실행됐다는 이유로 건너뛰어지던 결함이 수정되었습니다. 원문의 대상은 플러그인의 SessionStart 훅이며, 이 저장소의 SessionStart 재주입(R021, `.claude/settings.json`의 `SessionStart` 블록)은 프로젝트 settings 훅이라 원문 대상에 들지 않습니다. 이 저장소가 사용하는 플러그인(superpowers 등)의 훅이 영향을 받았는지는 관측하지 못했습니다 [가설 — 플러그인 SessionStart 훅 발화 로그로 판정].
2254
2254
  - CHANGELOG 원문: "Fixed a late-loading plugin's SessionStart hook output reaching the new conversation after `/clear` in headless sessions"
2255
2255
  (296) headless 세션에서 늦게 로드된 플러그인의 SessionStart 훅 출력이 `/clear` 이후의 새 대화에 전달되던 결함이 수정되었습니다. 위 항목과 같은 플러그인 훅 경로의 수정이며, 원문상 프로젝트 SessionStart 훅은 대상이 아닙니다.
2256
2256
  - CHANGELOG 원문: "Improved `--debug` output for hooks: command hooks on tool calls, prompts, SessionStart and Stop now log their command, plugin, outcome and duration when they finish, so a slow hook is identifiable"
2257
- (296) `--debug` 출력이 개선되어 도구 호출·프롬프트·SessionStart·Stop의 command 훅이 종료 시 명령, 플러그인, 결과, 소요 시간을 기록하므로 느린 훅을 식별할 수 있습니다. 이 저장소는 훅 핸들러 64개를 프로젝트 settings에 배선하므로(`jq '[.hooks[][]?.hooks[]?] | length' .claude/settings.json`=64) 훅 지연이나 발화 여부를 진단할 때 쓸 수 있는 새 수단입니다. 훅 진단을 R021의 "배선 확인 ≠ 전달 확인 ≠ 발화 확인 ≠ 로드 확인" 원칙(`.claude/rules/MUST-enforcement-policy.md:38`)으로 실측할 때 `--debug` 로그를 증거로 추가할 수 있으나 룰 변경은 필요하지 않습니다.
2257
+ (296) `--debug` 출력이 개선되어 도구 호출·프롬프트·SessionStart·Stop의 command 훅이 종료 시 명령, 플러그인, 결과, 소요 시간을 기록하므로 느린 훅을 식별할 수 있습니다. 이 저장소는 v2.0.8 기준 훅 핸들러 65개를 프로젝트 settings에 배선하므로(`jq '[.hooks[][]?.hooks[]?] | length' .claude/settings.json`=65; v2.0.7: 64 → v2.0.8: 65) 훅 지연이나 발화 여부를 진단할 때 쓸 수 있는 새 수단입니다. 훅 진단을 R021의 "배선 확인 ≠ 전달 확인 ≠ 발화 확인 ≠ 로드 확인" 원칙(`.claude/rules/MUST-enforcement-policy.md:38`)으로 실측할 때 `--debug` 로그를 증거로 추가할 수 있으나 룰 변경은 필요하지 않습니다.
2258
2258
 
2259
2259
  ### 에이전트 · 서브에이전트
2260
2260
 
@@ -2294,7 +2294,7 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2294
2294
  - CHANGELOG 원문: "Fixed `CLAUDE_CODE_RESUME_INTERRUPTED_TURN` re-running a finished turn after a restart when an MCP tool result had ended that turn"
2295
2295
  (296) 재시작 후 MCP 도구 결과가 턴을 끝낸 경우에도 `CLAUDE_CODE_RESUME_INTERRUPTED_TURN`이 이미 끝난 턴을 다시 실행하던 결함이 수정되었습니다. 관측한 범위에서 이 env는 이 가이드 밖에서 0건으로 저장소에 설정돼 있지 않습니다(`git grep -n CLAUDE_CODE_RESUME_INTERRUPTED_TURN -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'` rc=1, `.claude/settings.local.json`은 `command grep -c` 0). 설정할 경우의 무인 루프 재개 시나리오에만 관련됩니다.
2296
2296
  - CHANGELOG 원문: "Fixed secret redaction in shared transcripts and debug logs missing some values that follow a key with no value, including in JSON written inside a shell string"
2297
- (296) 공유 transcript와 debug 로그에서, 값이 없는 키 뒤에 오는 일부 값(셸 문자열 안에 쓰인 JSON 포함)이 마스킹되지 않던 결함이 수정되었습니다. R001은 시크릿 노출을 금지하며(`.claude/rules/MUST-safety.md:9`) 이 저장소는 `secret-filter.sh` 훅을 배선합니다(`.claude/settings.json:548`). 플랫폼 마스킹은 이 훅과 별개의 층이며, 이 수정은 공유·debug 산출물의 방어를 보강합니다. 훅이나 룰 변경은 필요하지 않습니다.
2297
+ (296) 공유 transcript와 debug 로그에서, 값이 없는 키 뒤에 오는 일부 값(셸 문자열 안에 쓰인 JSON 포함)이 마스킹되지 않던 결함이 수정되었습니다. R001은 시크릿 노출을 금지하며(`.claude/rules/MUST-safety.md:9`) 이 저장소는 `secret-filter.sh` 훅을 배선합니다(`.claude/settings.json`의 `secret-filter.sh` 훅 항목). 플랫폼 마스킹은 이 훅과 별개의 층이며, 이 수정은 공유·debug 산출물의 방어를 보강합니다. 훅이나 룰 변경은 필요하지 않습니다.
2298
2298
 
2299
2299
  ### 백그라운드
2300
2300
 
@@ -2319,11 +2319,11 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2319
2319
  ### 훅 · 프롬프트 제출 순서
2320
2320
 
2321
2321
  - CHANGELOG 원문: "Changed `UserPromptSubmit` hooks to run before a skill or custom slash command expands, so a hook that blocks the prompt now also stops its embedded shell commands"
2322
- (299) `UserPromptSubmit` 훅이 스킬이나 사용자 정의 슬래시 커맨드가 확장되기 전에 실행되도록 바뀌어, 프롬프트를 차단하는 훅이 이제 그 커맨드에 포함된 셸 명령도 멈춥니다. CC가 로드하는 `.claude/settings.json:233`의 `UserPromptSubmit`에는 command 훅 4개(`user-prompt-preprocessor.sh`, `r007-r008-drift-advisor.sh`, `session-autofix-prompt.sh`, `fail-axis-cause-advisor.sh`)가 배선되어 있습니다(`jq -c '[(.hooks.PreToolUse | length), ([.hooks.PreToolUse[] | .hooks[]] | length), ([.hooks.UserPromptSubmit[] | .hooks[]] | length)]' .claude/settings.json` = `[11,14,4]`). 이 중 세 스크립트는 `"decision": "block"`을 내보내지 않도록 주석으로 명시합니다(`.claude/hooks/scripts/user-prompt-preprocessor.sh:28`, `.claude/hooks/scripts/r007-r008-drift-advisor.sh:442`, `.claude/hooks/scripts/fail-axis-cause-advisor.sh:20`). R021은 이 중 `r007-r008-drift-advisor.sh`와 `fail-axis-cause-advisor.sh`를 Advisory 계층으로 분류합니다(`.claude/rules/MUST-enforcement-policy.md:23`, `:25`). 네 스크립트를 세 가지로 조회했습니다(각각 `-- <네 스크립트 경로>`): `git grep -n -i -E 'decision|block'`, `git grep -n -E 'exit [1-9]|"continue"|continue *:|stopReason'`, `git grep -n -E 'exit +"?\$'`. 앞의 두 조회에서 나온 히트는 주석 줄(예: `.claude/hooks/scripts/r007-r008-drift-advisor.sh:117`~`:119`, `:442`, `.claude/hooks/scripts/user-prompt-preprocessor.sh:28`, `:97`, `.claude/hooks/scripts/fail-axis-cause-advisor.sh:20`, `:130`)과 `r007-r008-drift-advisor.sh`에서 content block을 다루는 jq 줄(`:266`~`:309`)이었습니다. 셋째 조회는 출력이 없었고(rc=1), `session-autofix-prompt.sh`에서는 세 조회 어디에서도 히트가 나오지 않았습니다. 따라서 관측한 범위(위 세 조회)에서 이 네 훅은 명시적인 차단 출력(`decision`·`continue`·`stopReason` 키)이나 명시적인 차단 종료 코드(`exit 2`)를 내지 않습니다. 다만 세 스크립트는 `set -euo pipefail`로 실행되므로(`.claude/hooks/scripts/fail-axis-cause-advisor.sh:41`, `.claude/hooks/scripts/user-prompt-preprocessor.sh:41`, `.claude/hooks/scripts/r007-r008-drift-advisor.sh:129`; `session-autofix-prompt.sh`에는 `git grep -n -E '^set -'` 히트 없음) 보호되지 않은 명령이 실패하면 그 명령의 종료 코드로 끝날 수 있고, 이 `set -e` 경로는 조회하지 않았습니다. 차단 시 셸 명령도 멈춘다는 변경은 명시적 차단 경로 기준으로 이 훅들에 해당하지 않으며, `set -e` 경로까지 포함한 판정은 [가설 — 각 스크립트에서 보호 없이 실패할 수 있는 명령이 종료 코드 2로 끝날 수 있는지 확인하면 판정 가능]로 남깁니다. 두 스크립트는 훅 입력의 `.prompt`를 읽습니다(`.claude/hooks/scripts/user-prompt-preprocessor.sh:54`, `.claude/hooks/scripts/fail-axis-cause-advisor.sh:54`). 훅이 확장 전에 실행되므로 `/fsd` 같은 스킬 호출에서 `.prompt`가 확장 전 원문을 담을 수 있습니다 [가설 — 2.1.299 전후로 `/<skill>` 프롬프트의 훅 stdin `.prompt`를 캡처해 비교하면 판정 가능]. 스킬 본문의 셸 주입 표기는 ``git grep -c -E '!`' -- '.claude/skills/*/SKILL.md'`` 출력 1줄(`.claude/skills/omcustom-release-notes/SKILL.md:1`)이며, 그 줄(`:164`)은 커밋 메시지의 `!` breaking 표기 설명이라 셸 주입 구문이 아닙니다.
2322
+ (299) `UserPromptSubmit` 훅이 스킬이나 사용자 정의 슬래시 커맨드가 확장되기 전에 실행되도록 바뀌어, 프롬프트를 차단하는 훅이 이제 그 커맨드에 포함된 셸 명령도 멈춥니다. CC가 로드하는 `.claude/settings.json`의 `UserPromptSubmit` 블록에는 command 훅 4개(`user-prompt-preprocessor.sh`, `r007-r008-drift-advisor.sh`, `session-autofix-prompt.sh`, `fail-axis-cause-advisor.sh`)가 배선되어 있습니다(`jq -c '[(.hooks.PreToolUse | length), ([.hooks.PreToolUse[] | .hooks[]] | length), ([.hooks.UserPromptSubmit[] | .hooks[]] | length)]' .claude/settings.json` = v2.0.8 기준 `[12,15,4]`; v2.0.7: `[11,14,4]`). 이 중 세 스크립트는 `"decision": "block"`을 내보내지 않도록 주석으로 명시합니다(`.claude/hooks/scripts/user-prompt-preprocessor.sh:28`, `.claude/hooks/scripts/r007-r008-drift-advisor.sh:454`, `.claude/hooks/scripts/fail-axis-cause-advisor.sh:20`). R021은 이 중 `r007-r008-drift-advisor.sh`와 `fail-axis-cause-advisor.sh`를 Advisory 계층으로 분류합니다(`.claude/rules/MUST-enforcement-policy.md:23`, `:25`). 네 스크립트를 세 가지로 조회했습니다(각각 `-- <네 스크립트 경로>`): `git grep -n -i -E 'decision|block'`, `git grep -n -E 'exit [1-9]|"continue"|continue *:|stopReason'`, `git grep -n -E 'exit +"?\$'`. 앞의 두 조회에서 나온 히트는 주석 줄(예: `.claude/hooks/scripts/r007-r008-drift-advisor.sh:120`~`:122`, `:454`, `.claude/hooks/scripts/user-prompt-preprocessor.sh:28`, `:97`, `.claude/hooks/scripts/fail-axis-cause-advisor.sh:20`, `:130`)과 `r007-r008-drift-advisor.sh`에서 content block을 다루는 jq 줄(`:278`~`:321`)이었습니다. 셋째 조회는 출력이 없었고(rc=1), `session-autofix-prompt.sh`에서는 세 조회 어디에서도 히트가 나오지 않았습니다. 따라서 관측한 범위(위 세 조회)에서 이 네 훅은 명시적인 차단 출력(`decision`·`continue`·`stopReason` 키)이나 명시적인 차단 종료 코드(`exit 2`)를 내지 않습니다. 다만 세 스크립트는 `set -euo pipefail`로 실행되므로(`.claude/hooks/scripts/fail-axis-cause-advisor.sh:41`, `.claude/hooks/scripts/user-prompt-preprocessor.sh:41`, `.claude/hooks/scripts/r007-r008-drift-advisor.sh:132`; `session-autofix-prompt.sh`에는 `git grep -n -E '^set -'` 히트 없음) 보호되지 않은 명령이 실패하면 그 명령의 종료 코드로 끝날 수 있고, 이 `set -e` 경로는 조회하지 않았습니다. 차단 시 셸 명령도 멈춘다는 변경은 명시적 차단 경로 기준으로 이 훅들에 해당하지 않으며, `set -e` 경로까지 포함한 판정은 [가설 — 각 스크립트에서 보호 없이 실패할 수 있는 명령이 종료 코드 2로 끝날 수 있는지 확인하면 판정 가능]로 남깁니다. 두 스크립트는 훅 입력의 `.prompt`를 읽습니다(`.claude/hooks/scripts/user-prompt-preprocessor.sh:54`, `.claude/hooks/scripts/fail-axis-cause-advisor.sh:54`). 훅이 확장 전에 실행되므로 `/fsd` 같은 스킬 호출에서 `.prompt`가 확장 전 원문을 담을 수 있습니다 [가설 — 2.1.299 전후로 `/<skill>` 프롬프트의 훅 stdin `.prompt`를 캡처해 비교하면 판정 가능]. 스킬 본문의 셸 주입 표기는 ``git grep -c -E '!`' -- '.claude/skills/*/SKILL.md'`` 출력 1줄(`.claude/skills/omcustom-release-notes/SKILL.md:1`)이며, 그 줄(`:164`)은 커밋 메시지의 `!` breaking 표기 설명이라 셸 주입 구문이 아닙니다.
2323
2323
  - CHANGELOG 원문: "Changed a skill's own front-matter `UserPromptSubmit` hook to first run on the prompt after the one that invokes the skill"
2324
2324
  (299) 스킬 frontmatter에 선언된 `UserPromptSubmit` 훅이 그 스킬을 호출한 프롬프트가 아니라 그다음 프롬프트에서 처음 실행되도록 바뀌었습니다. 관측한 범위에서 `.claude/skills/*/SKILL.md`에는 `hooks:` frontmatter 줄과 `UserPromptSubmit` 문자열이 나타나지 않으므로(`git grep -n -E '^hooks:' -- '.claude/skills/*/SKILL.md'`와 `git grep -n UserPromptSubmit -- '.claude/skills/*/SKILL.md'` 둘 다 출력 없음) 이 저장소 스킬에는 해당하지 않습니다.
2325
2325
  - CHANGELOG 원문: "Fixed plan mode running a write (an MCP tool's, a file's, a shell command's) that a `PreToolUse` hook or a mod's `tool.check` hook allowed"
2326
- (299) `PreToolUse` 훅이나 mod의 `tool.check` 훅이 허용한 쓰기(MCP 도구·파일·셸 명령)를 plan mode가 실행하던 결함이 수정되었습니다. `.claude/settings.json:37`의 `PreToolUse`에는 matcher 그룹 11개와 훅 명령 14개가 있습니다(위 `jq -c` 출력 `[11,14,4]`의 앞 두 값). 관측한 범위에서 이 훅들은 `permissionDecision`을 출력하지 않으므로(`git grep -n permissionDecision -- .claude/settings.json .claude/hooks templates/.claude/settings.json` rc=1) 훅이 명시적으로 허용하는 경로는 관측되지 않았습니다. 종료 코드 0으로 끝나는 훅이 결함 조건의 "allowed"에 해당했는지는 원문이 밝히지 않습니다 [가설 — 구버전 plan mode에서 exit 0으로 끝나는 `PreToolUse` 훅 뒤의 Write가 실행되는지 재현하면 판정 가능]. 에이전트 frontmatter에서 `plan` permission mode나 `opusplan` 모델은 관측되지 않았습니다(`git grep -n -E '^permissionMode:|^model: *opusplan' -- '.claude/agents/*.md'` 49줄이 모두 `permissionMode: bypassPermissions`). R006 Permission Mode 표는 `plan`을 "Require plan approval"로 설명합니다(`.claude/rules/MUST-agent-design.md:382`). 사용자가 대화형 세션에서 plan mode를 쓸 때의 영향은 측정하지 않았습니다.
2326
+ (299) `PreToolUse` 훅이나 mod의 `tool.check` 훅이 허용한 쓰기(MCP 도구·파일·셸 명령)를 plan mode가 실행하던 결함이 수정되었습니다. `.claude/settings.json:37`의 `PreToolUse`에는 v2.0.8 기준 matcher 그룹 12개와 훅 명령 15개가 있습니다(위 `jq -c` 출력 `[12,15,4]`의 앞 두 값; v2.0.7: 11개와 14개). 관측한 범위에서 이 훅들은 `permissionDecision`을 출력하지 않으므로(`git grep -n permissionDecision -- .claude/settings.json .claude/hooks templates/.claude/settings.json` rc=1; 추적되지 않은 `bash-cd-advisor.sh`는 `git grep`에 잡히지 않으며 커밋 후에는 `permissionDecision`을 출력하지 않는다고 밝히는 주석 `:30` 1줄이 걸립니다) 훅이 명시적으로 허용하는 경로는 관측되지 않았습니다. 종료 코드 0으로 끝나는 훅이 결함 조건의 "allowed"에 해당했는지는 원문이 밝히지 않습니다 [가설 — 구버전 plan mode에서 exit 0으로 끝나는 `PreToolUse` 훅 뒤의 Write가 실행되는지 재현하면 판정 가능]. 에이전트 frontmatter에서 `plan` permission mode나 `opusplan` 모델은 관측되지 않았습니다(`git grep -n -E '^permissionMode:|^model: *opusplan' -- '.claude/agents/*.md'` 49줄이 모두 `permissionMode: bypassPermissions`). R006 Permission Mode 표는 `plan`을 "Require plan approval"로 설명합니다(`.claude/rules/MUST-agent-design.md:382`). 사용자가 대화형 세션에서 plan mode를 쓸 때의 영향은 측정하지 않았습니다.
2327
2327
 
2328
2328
  ### 서브에이전트 · SendMessage · 백그라운드 알림
2329
2329
 
@@ -2339,7 +2339,7 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2339
2339
  ### 권한 · MCP 규칙 · settings
2340
2340
 
2341
2341
  - CHANGELOG 원문: "Changed MCP allow rules to reach only the server they name: `mcp__a` no longer allows a server named `a__b` or `a_`; write `mcp__<server>__*` with the server's whole normalized name"
2342
- (299) MCP allow 규칙이 이름으로 지정한 서버에만 적용되도록 바뀌어, `mcp__a`가 더 이상 `a__b`나 `a_`라는 서버를 허용하지 않습니다. 관측한 범위(`git grep -n -E 'mcp__|enabledMcpjsonServers|disabledMcpjsonServers|enableAllProjectMcpServers' -- .claude/settings.json templates/.claude/settings.json`)에서 두 설정 파일의 `mcp__` 문자열은 `PostToolUse` 훅의 `"matcher"` 값(`.claude/settings.json:582`, `templates/.claude/settings.json:548`)이며 permission 규칙이 아닙니다. 유지보수자 기기의 gitignore된 `.claude/settings.local.json`(저장소 추적 대상 아님)에서 관측한 `mcp__`도 훅 `"matcher"` 값이었습니다(`command grep -n -E 'mcp__|McpjsonServers' .claude/settings.local.json`). `.mcp.json`의 서버 이름은 `ontology-rag`(`.mcp.json:3`)와 `eraser`(`.mcp.json:14`)이고(`jq -c '.mcpServers | to_entries | map({name: .key, type: (.value.type // "stdio")})' .mcp.json` 출력 2개 항목) `__`나 끝의 `_`를 포함하지 않습니다. 따라서 이 변경의 영향 조건은 관측되지 않았습니다.
2342
+ (299) MCP allow 규칙이 이름으로 지정한 서버에만 적용되도록 바뀌어, `mcp__a`가 더 이상 `a__b`나 `a_`라는 서버를 허용하지 않습니다. 관측한 범위(`git grep -n -E 'mcp__|enabledMcpjsonServers|disabledMcpjsonServers|enableAllProjectMcpServers' -- .claude/settings.json templates/.claude/settings.json`)에서 두 설정 파일의 `mcp__` 문자열은 `PostToolUse` 훅의 `"matcher"` 값(`.claude/settings.json`과 `templates/.claude/settings.json`의 `playwright-compress.sh` 훅 항목)이며 permission 규칙이 아닙니다. 유지보수자 기기의 gitignore된 `.claude/settings.local.json`(저장소 추적 대상 아님)에서 관측한 `mcp__`도 훅 `"matcher"` 값이었습니다(`command grep -n -E 'mcp__|McpjsonServers' .claude/settings.local.json`). `.mcp.json`의 서버 이름은 `ontology-rag`(`.mcp.json:3`)와 `eraser`(`.mcp.json:14`)이고(`jq -c '.mcpServers | to_entries | map({name: .key, type: (.value.type // "stdio")})' .mcp.json` 출력 2개 항목) `__`나 끝의 `_`를 포함하지 않습니다. 따라서 이 변경의 영향 조건은 관측되지 않았습니다.
2343
2343
  - CHANGELOG 원문: "Fixed deny and ask rules for an MCP server (`mcp__<server>`) not applying when the server's normalized name contains a double underscore"
2344
2344
  (299) 정규화된 서버 이름에 이중 밑줄이 들어 있으면 그 MCP 서버의 deny·ask 규칙(`mcp__<server>`)이 적용되지 않던 결함이 수정되었습니다. 바로 위 항목의 근거대로 관측한 범위의 설정 파일에는 `mcp__` permission 규칙이 없고 `.mcp.json` 서버 이름에 `__`가 없으므로 영향 조건이 관측되지 않았습니다.
2345
2345
  - CHANGELOG 원문: "Fixed a settings file being ignored when `enabledMcpjsonServers` or `disabledMcpjsonServers` held a single server name (letters, digits, - or _) as a plain string"
@@ -2367,18 +2367,18 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2367
2367
  ### 무인 · headless(`-p`) 실행
2368
2368
 
2369
2369
  - CHANGELOG 원문: "Fixed `claude -p` saying nothing when a settings file fails validation: text-output runs now list the file and the invalid entry on stderr"
2370
- (299) 설정 파일이 검증에 실패해도 `claude -p`가 아무것도 알리지 않던 결함이 수정되어, 이제 텍스트 출력 실행은 stderr에 그 파일과 잘못된 항목을 표시합니다. `/fsd`는 `claude -p`·예약 실행 같은 무인 경로를 다루고(`.claude/skills/fsd/SKILL.md:133`, `:172`), R010은 유효 permission mode를 `claude -p` init 값으로 실측한 기록에 기대고 있습니다(`.claude/rules/MUST-orchestrator-coordination.md:588`). 이 저장소의 `.claude/settings.json`은 `_comment_defaultMode` 같은 주석용 키를 담고 있습니다(`.claude/settings.json:22`). 2.1.299 이상에서 이 파일이 검증 오류를 내는지는 실행해 보지 않았습니다 [가설 — `claude -p` 텍스트 출력 실행의 stderr를 확인하면 판정 가능].
2370
+ (299) 설정 파일이 검증에 실패해도 `claude -p`가 아무것도 알리지 않던 결함이 수정되어, 이제 텍스트 출력 실행은 stderr에 그 파일과 잘못된 항목을 표시합니다. `/fsd`는 `claude -p`·예약 실행 같은 무인 경로를 다루고(`.claude/skills/fsd/SKILL.md:134`, `:173`), R010은 유효 permission mode를 `claude -p` init 값으로 실측한 기록에 기대고 있습니다(`.claude/rules/MUST-orchestrator-coordination.md:588`). 이 저장소의 `.claude/settings.json`은 `_comment_defaultMode` 같은 주석용 키를 담고 있습니다(`.claude/settings.json:22`). 2.1.299 이상에서 이 파일이 검증 오류를 내는지는 실행해 보지 않았습니다 [가설 — `claude -p` 텍스트 출력 실행의 stderr를 확인하면 판정 가능].
2371
2371
  - CHANGELOG 원문: "Fixed a regression in 2.1.296 where cloud and headless sessions could run an approved tool call twice if a new message arrived as the session resumed after a restart"
2372
- (299) 2.1.296에서 생긴 회귀로, cloud·headless 세션이 재시작 후 resume되는 동안 새 메시지가 도착하면 승인된 도구 호출을 두 번 실행할 수 있던 결함이 수정되었습니다. 영향 구간은 2.1.296 이상 2.1.299 미만이며, 원문의 발생 조건은 재시작, 그 뒤의 resume, resume 도중 새 메시지 도착의 세 가지입니다. `/fsd`를 `claude -p`로 돌리는 경로(`.claude/skills/fsd/SKILL.md:172`)에서 이 구간에 세 조건이 함께 일어났다면 `git commit`·`gh issue create` 같은 비멱등 호출이 중복되었을 수 있으므로, 그 구간의 무인 실행 결과는 중복 커밋·이슈 여부를 실측으로 확인하는 것이 좋습니다 [가설 — 해당 구간에서 세 조건이 함께 발생했는지는 미관측].
2372
+ (299) 2.1.296에서 생긴 회귀로, cloud·headless 세션이 재시작 후 resume되는 동안 새 메시지가 도착하면 승인된 도구 호출을 두 번 실행할 수 있던 결함이 수정되었습니다. 영향 구간은 2.1.296 이상 2.1.299 미만이며, 원문의 발생 조건은 재시작, 그 뒤의 resume, resume 도중 새 메시지 도착의 세 가지입니다. `/fsd`를 `claude -p`로 돌리는 경로(`.claude/skills/fsd/SKILL.md:173`)에서 이 구간에 세 조건이 함께 일어났다면 `git commit`·`gh issue create` 같은 비멱등 호출이 중복되었을 수 있으므로, 그 구간의 무인 실행 결과는 중복 커밋·이슈 여부를 실측으로 확인하는 것이 좋습니다 [가설 — 해당 구간에서 세 조건이 함께 발생했는지는 미관측].
2373
2373
  - CHANGELOG 원문: "Fixed MCP tool calls in headless and SDK sessions sometimes failing or running twice when a background reconnect closed the connection they were running on"
2374
2374
  (299) headless·SDK 세션에서 백그라운드 재연결이 실행 중인 연결을 닫으면 MCP 도구 호출이 때때로 실패하거나 두 번 실행되던 결함이 수정되었습니다. `.mcp.json`에는 stdio 서버 `ontology-rag`(`:3`~`:4`)와 원격 http 서버 `eraser`(`:14`~`:16`)가 있으며, 이 항목은 v2.1.295 절에서 다룬 원격 MCP 재연결 수정과 같은 계열입니다. 무인 실행에서 `eraser`의 생성 도구가 두 번 실행되면 중복 산출물이 생길 수 있습니다 [가설 — 무인 실행에서 `eraser` 도구 사용은 미관측]. R019는 enrichment 실패 시 조용히 건너뛰도록 규정하므로(`.claude/rules/SHOULD-ontology-rag-routing.md:39`의 「Failure Handling」 제목, `:43`의 "MCP server unavailable" 행, `:48`) `ontology-rag` 호출 실패는 라우팅을 막지 않습니다.
2375
2375
 
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`). 따라서 2.1.299 미만에서 서머타임을 적용하는 시간대의 서머타임 종료 구간에 `/loop`로 `/fsd`를 돌린 경우 반복이 매 턴 뒤 다시 발화하거나 일찍 발화했을 수 있습니다 [가설 — 원문의 "loops"가 self-paced `/loop`를 포함하는지와 서머타임 종료 구간의 `/fsd` 실행 사례는 미관측].
2379
+ (299) 서머타임이 끝나 같은 시각이 반복되는 한 시간 동안 예약 작업과 루프가 매 턴 뒤 다시 발화하거나 일찍 발화하던 결함이 수정되었습니다. 원문은 세션 종류를 한정하지 않습니다. `/fsd`는 self-paced `/loop`를 반복 수단의 하나로 설명하고(`.claude/skills/fsd/SKILL.md:40`), 세션이 무인(`claude -p`, 예약 실행)이라 자기 페이싱이 필요할 때 `/goal`·`/loop` 호출을 권장합니다(`:173`). 따라서 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` 절 제목 "### 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이 이 항목의 대상인지, 두 도구 경로의 실제 사용은 미관측].
2381
+ (299) 예약 작업의 공지 시각이 잘못된 분(minute)으로 표시되던 결함이 수정되어, 이제 예약 도구가 각 작업의 실제 다음 실행 시각을 보고합니다. 원문은 세션 종류를 한정하지 않습니다. 관측한 범위(`git grep -n -E 'ScheduleWakeup|CronCreate' -- .claude/skills`)에서 이 저장소 스킬의 예약 도구 언급은 `/fsd`의 `/loop`(ScheduleWakeup) 설명(`.claude/skills/fsd/SKILL.md:163`)과 `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
 
@@ -2415,7 +2415,7 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
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:1551`~`:1554`, #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:1564`~`:1567`, #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 요청의 시스템 프롬프트, 도구, 파라미터도 기록하도록 바뀌었습니다. 유지보수자 기기의 로컬 트랜스크립트 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 줄을 제외한 재계산을 대조하는 것]. 또한 트랜스크립트 파일 크기가 커지므로, 트랜스크립트를 공유하거나 이슈에 첨부할 때 시스템 프롬프트 전문이 포함된다는 점을 확인합니다.
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:244`)과 그 마지막 원소를 마지막 assistant 줄로 고르는 선택(`:247`), 턴 경계 판정(`:260`~`:263`, content가 문자열이거나 `tool_result` 블록이 없는 user 줄을 경계로 봄), 턴 구성(`:277`)이 그렇고, `:232`의 필터는 `isSidechain`이 없는 줄을 통과시킵니다. 창은 `:351`에서 `tail -n 200`으로 읽고 `:352`에서 그 줄 수를 세어 `:355`에서 `$wlc`로 넘깁니다. `:274`는 창 시작부터 마지막 assistant 줄까지(`:260`의 `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
 
@@ -2462,7 +2462,7 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2462
2462
 
2463
2463
  **Action items**:
2464
2464
  - 훅 설정 변경은 필요하지 않습니다. 위 jq·`git grep` 결과상 두 settings 파일에는 SessionEnd 훅과 `agent` 타입 훅이 없고, 훅이 `updatedInput`을 출력하지 않습니다.
2465
- - 측정한 트랜스크립트 1개(기기 로컬, 2.1.302)에서는 트랜스크립트 기록 확장으로 생긴 `api-request-blob` 줄이 모두 `.message.role`을 가졌으므로, 그런 줄은 `r007-r008-drift-advisor.sh`의 role 기반 선택(`:232`, `:249`~`:251`, `:265`)에 섞일 수 있습니다. 레코드 형태는 위와 같이 측정했으나 실제 오판 발화는 관측되지 않았으므로 영향은 [가설]로 남기고, advisory 출력과 blob 제외 재계산을 대조한 뒤 판단합니다.
2465
+ - 측정한 트랜스크립트 1개(기기 로컬, 2.1.302)에서는 트랜스크립트 기록 확장으로 생긴 `api-request-blob` 줄이 모두 `.message.role`을 가졌으므로, 그런 줄은 `r007-r008-drift-advisor.sh`의 role 기반 선택(`:244`, `:260`~`:263`, `:277`)에 섞일 수 있습니다. 레코드 형태는 위와 같이 측정했으나 실제 오판 발화는 관측되지 않았으므로 영향은 [가설]로 남기고, advisory 출력과 blob 제외 재계산을 대조한 뒤 판단합니다.
2466
2466
  - (300) 항목 중 `[가설 — …]` 표기는 판정 기준을 충족하는 측정이 이루어지기 전에는 결론으로 쓰지 않습니다.
2467
2467
 
2468
2468
  ---
@@ -2486,7 +2486,7 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2486
2486
  - CHANGELOG 원문: "Fixed skills and commands with very many or very long argument names stalling for seconds when invoked; only the first 64 names, each up to 64 characters, are now filled in"
2487
2487
  (301) 인자 이름이 매우 많거나 긴 스킬·커맨드가 호출 시 수 초간 멈추던 결함이 수정되어, 이제 앞의 64개 이름(각 64자까지)만 채워집니다. 이름 붙은 인자를 선언하는 `arguments:` frontmatter는 이 저장소 스킬에서 0건이며(`git grep -c -E '^arguments:' -- '.claude/skills/*/SKILL.md'` 출력 없음), 추적된 SKILL.md 114개 중 50개는 표시용 `argument-hint:`를 씁니다(`git grep -l -E '^argument-hint:' -- '.claude/skills/*/SKILL.md' | wc -l`=50, `git ls-files -- '.claude/skills/*/SKILL.md' | wc -l`=114). 따라서 64개 상한에 걸리는 스킬은 관측되지 않았습니다.
2488
2488
  - CHANGELOG 원문: "Fixed skills, commands and hooks using very large amounts of memory when their arguments fill many placeholders"
2489
- (301) 인자가 많은 자리표시자를 채울 때 스킬·커맨드·훅이 매우 많은 메모리를 쓰던 결함이 수정되었습니다. 이 저장소에서 자리표시자 후보 문자열(`$ARGUMENTS` 또는 `$<숫자>`)이 있는 스킬 파일은 1개이며(`git grep -l -P '\$ARGUMENTS|\$[0-9]\b' -- '.claude/skills/*/SKILL.md' | wc -l`=1, 2026-10-25 작업 트리 재실측, `.claude/skills/ambiguity-gate/SKILL.md`), 셸 예시 코드 안의 `$N`도 인자가 있으면 치환되므로 후보에서 제외하지 않습니다(guide 04 「위치 인자 `$N` 치환」 참조). `$ARGUMENTS`를 쓰는 파일도 1개입니다(`git grep -c -P '\$ARGUMENTS' -- '.claude/skills/*/SKILL.md'` 1건, `.claude/skills/ambiguity-gate/SKILL.md`). "많은 자리표시자" 조건에 해당하는 스킬이 있는지는 판정하지 못했습니다 [가설 — 스킬 호출 전후 프로세스 메모리 측정으로 판정].
2489
+ (301) 인자가 많은 자리표시자를 채울 때 스킬·커맨드·훅이 매우 많은 메모리를 쓰던 결함이 수정되었습니다. 이 저장소에서 자리표시자 후보 문자열(`$ARGUMENTS` 또는 `$<숫자>`)이 있는 스킬 파일은 1개이며(`git grep -l -P '\$ARGUMENTS|\$[0-9]\b' -- '.claude/skills/*/SKILL.md' | wc -l`=1, 2026-10-25 작업 트리 재실측, `.claude/skills/ambiguity-gate/SKILL.md`), 셸 예시 코드 안의 `$N`도 인자 범위 안의 인덱스면 치환되므로 후보에서 제외하지 않습니다(guide 04 「위치 인자 `$N` 치환」 참조). `$ARGUMENTS`를 쓰는 파일도 1개입니다(`git grep -c -P '\$ARGUMENTS' -- '.claude/skills/*/SKILL.md'` 1건, `.claude/skills/ambiguity-gate/SKILL.md`). "많은 자리표시자" 조건에 해당하는 스킬이 있는지는 판정하지 못했습니다 [가설 — 스킬 호출 전후 프로세스 메모리 측정으로 판정].
2490
2490
  - CHANGELOG 원문: "Fixed skills no longer being listed to the model after using `/rewind`"
2491
2491
  (301) `/rewind` 사용 후 스킬 목록이 모델에게 더 이상 제공되지 않던 결함이 수정되었습니다. 이 저장소 세션은 추적된 SKILL.md 114개(`git ls-files -- '.claude/skills/*/SKILL.md' | wc -l`=114)의 라우팅 스킬과 슬래시 커맨드 스킬을 모델이 볼 수 있는 스킬 목록에 의존하므로, 구버전에서 `/rewind` 뒤에 스킬 라우팅이 실패했다면 그 원인이 이 결함일 수 있습니다 [가설 — 2.1.301 미만에서 `/rewind` 직후 Skill 호출 실패 기록으로 판정].
2492
2492
  - CHANGELOG 원문: "Fixed workflow agents sometimes skipping their step, and the run still reporting success, after reading the harness note that their task text carries no user authority"
@@ -2506,7 +2506,7 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2506
2506
  ### 컨텍스트 · 모델 · headless
2507
2507
 
2508
2508
  - CHANGELOG 원문: "Added `CLAUDE_CODE_RETRY_WATCHDOG_MAX_USAGE_LIMIT_WAIT_MS` so unattended retry mode (`CLAUDE_CODE_RETRY_WATCHDOG`) ends a request at a usage limit that resets too far away instead of waiting"
2509
- (301) 무인 재시도 모드(`CLAUDE_CODE_RETRY_WATCHDOG`)가 너무 먼 시점에 초기화되는 사용량 한도에서 기다리지 않고 요청을 끝내도록 하는 `CLAUDE_CODE_RETRY_WATCHDOG_MAX_USAGE_LIMIT_WAIT_MS`가 추가되었습니다. 이 저장소는 무인 `claude -p` 실행에서 `/fsd`를 쓸 수 있다고 안내하지만(`.claude/skills/fsd/SKILL.md:172`), `RETRY_WATCHDOG` 계열 env는 추적되는 프로젝트 settings와 templates 미러에서 0건입니다(`grep -c RETRY_WATCHDOG .claude/settings.json templates/.claude/settings.json` 모두 0). 새 env도 이 가이드 밖의 추적 파일에서 0건이므로(`git grep -n RETRY_WATCHDOG_MAX -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'` rc=1) 저장소 설정 범위에서는 동작이 바뀌지 않습니다. 작성 기기의 `.claude/settings.local.json`은 추적되지 않는 gitignore 대상이므로(`git ls-files -- .claude/settings.local.json` 출력 없음, `git check-ignore -v --no-index .claude/settings.local.json` = `.gitignore:40:.claude/*`) 저장소 근거에서 뺐으며, 그 파일에서도 0건이었던 것은 로컬 관측일 뿐입니다.
2509
+ (301) 무인 재시도 모드(`CLAUDE_CODE_RETRY_WATCHDOG`)가 너무 먼 시점에 초기화되는 사용량 한도에서 기다리지 않고 요청을 끝내도록 하는 `CLAUDE_CODE_RETRY_WATCHDOG_MAX_USAGE_LIMIT_WAIT_MS`가 추가되었습니다. 이 저장소는 무인 `claude -p` 실행에서 `/fsd`를 쓸 수 있다고 안내하지만(`.claude/skills/fsd/SKILL.md:173`), `RETRY_WATCHDOG` 계열 env는 추적되는 프로젝트 settings와 templates 미러에서 0건입니다(`grep -c RETRY_WATCHDOG .claude/settings.json templates/.claude/settings.json` 모두 0). 새 env도 이 가이드 밖의 추적 파일에서 0건이므로(`git grep -n RETRY_WATCHDOG_MAX -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'` rc=1) 저장소 설정 범위에서는 동작이 바뀌지 않습니다. 작성 기기의 `.claude/settings.local.json`은 추적되지 않는 gitignore 대상이므로(`git ls-files -- .claude/settings.local.json` 출력 없음, `git check-ignore -v --no-index .claude/settings.local.json` = `.gitignore:40:.claude/*`) 저장소 근거에서 뺐으며, 그 파일에서도 0건이었던 것은 로컬 관측일 뿐입니다.
2510
2510
  - CHANGELOG 원문: "Fixed the `fable` (and `best`) model alias erroring on the Anthropic API when the newest Fable model is not available to your organization: Claude Code now retries once on the previous Fable model"
2511
2511
  (301) 조직에서 최신 Fable 모델을 쓸 수 없을 때 `fable`(및 `best`) 별칭이 Anthropic API에서 오류를 내던 결함이 수정되어, 이제 이전 Fable 모델로 한 번 재시도합니다. R006은 `fable`을 Agent 도구 `model` 파라미터의 Tier-3 값으로 둡니다(`.claude/rules/MUST-agent-design.md:70`). 에이전트 frontmatter에서 Fable을 지정한 파일은 관측한 범위에서 0개입니다(`git grep -n -E '^model: *(claude-)?fable' -- '.claude/agents/*.md'` rc=1). 이 수정 이후 `model: "fable"` 스폰은 오류 대신 이전 Fable 모델로 실행될 수 있으므로, 실행 모델이 중요한 위임에서는 스폰 결과의 실제 모델을 확인하는 것이 좋습니다 [가설 — 최신 Fable을 쓸 수 없는 조직에서 스폰 결과의 `resolvedModel`로 판정].
2512
2512
  - CHANGELOG 원문: "Improved switching to a model with a smaller context window: a conversation too long for the new model is now summarized by the previous model first"
@@ -2539,7 +2539,7 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2539
2539
  ### 에이전트 · 서브에이전트
2540
2540
 
2541
2541
  - CHANGELOG 원문: "Changed fork subagents (`subagent_type: "fork"`) to be on by default in `claude -p`, the Agent SDK, the desktop app and VS Code, as they already are in the terminal; `CLAUDE_CODE_FORK_SUBAGENT=0` turns them off, and `claude mcp serve` never offers them"
2542
- (302) fork 서브에이전트(`subagent_type: "fork"`)가 터미널과 같이 `claude -p`, Agent SDK, 데스크톱 앱, VS Code에서도 기본으로 켜지도록 바뀌었으며, `CLAUDE_CODE_FORK_SUBAGENT=0`으로 끌 수 있고 `claude mcp serve`는 이를 제공하지 않습니다. R009의 2.1.232 노트는 fork가 전체 대화와 prompt cache를 상속하므로 "Instance independence — Isolated context, no shared state" 행이 fork에는 성립하지 않는다고 기록합니다(`.claude/rules/MUST-parallel-execution.md:200`, DETAIL 주석 — 자동 주입되지 않음). 그 노트는 실행 환경을 구분하지 않지만, 원문("as they already are in the terminal")에 따르면 이 변경 전에는 `claude -p`에서 fork가 기본으로 켜져 있지 않았습니다. 이 변경으로 무인 `claude -p`에서 도는 `/fsd`(`.claude/skills/fsd/SKILL.md:172`)에서도 그 노트의 전제가 기본으로 적용됩니다. `CLAUDE_CODE_FORK_SUBAGENT`는 이 가이드 밖의 추적 파일에서 0건이므로(`git grep -c -F CLAUDE_CODE_FORK_SUBAGENT -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'` 출력 없음) 저장소 설정으로 끄지 않습니다.
2542
+ (302) fork 서브에이전트(`subagent_type: "fork"`)가 터미널과 같이 `claude -p`, Agent SDK, 데스크톱 앱, VS Code에서도 기본으로 켜지도록 바뀌었으며, `CLAUDE_CODE_FORK_SUBAGENT=0`으로 끌 수 있고 `claude mcp serve`는 이를 제공하지 않습니다. R009의 2.1.232 노트는 fork가 전체 대화와 prompt cache를 상속하므로 "Instance independence — Isolated context, no shared state" 행이 fork에는 성립하지 않는다고 기록합니다(`.claude/rules/MUST-parallel-execution.md:200`, DETAIL 주석 — 자동 주입되지 않음). 그 노트는 실행 환경을 구분하지 않지만, 원문("as they already are in the terminal")에 따르면 이 변경 전에는 `claude -p`에서 fork가 기본으로 켜져 있지 않았습니다. 이 변경으로 무인 `claude -p`에서 도는 `/fsd`(`.claude/skills/fsd/SKILL.md:173`)에서도 그 노트의 전제가 기본으로 적용됩니다. `CLAUDE_CODE_FORK_SUBAGENT`는 이 가이드 밖의 추적 파일에서 0건이므로(`git grep -c -F CLAUDE_CODE_FORK_SUBAGENT -- . ':!guides/claude-code/15-version-compatibility.md' ':!templates/guides/claude-code/15-version-compatibility.md'` 출력 없음) 저장소 설정으로 끄지 않습니다.
2543
2543
  - CHANGELOG 원문: "Changed the desktop app and VS Code to always run the main conversation's subagents in the background, as the terminal does, rather than let Claude choose; a subagent's own Agent calls in `claude -p`, the Agent SDK, the desktop app and VS Code now run in the foreground by default"
2544
2544
  (302) 데스크톱 앱과 VS Code가 터미널처럼 메인 대화의 서브에이전트를 항상 백그라운드로 실행하도록 바뀌었고, `claude -p`·Agent SDK·데스크톱 앱·VS Code에서 서브에이전트 자신의 Agent 호출은 이제 기본으로 포그라운드에서 실행됩니다. R009의 2.1.232 노트는 백그라운드 스폰의 반환이 완료 신호가 아니라고 기록하며(`.claude/rules/MUST-parallel-execution.md:200`, DETAIL 주석 — 자동 주입되지 않음), 이 변경은 그 전제를 데스크톱 앱과 VS Code로 넓힙니다. 뒤쪽 절의 "서브에이전트 자신의 Agent 호출"은 R010 Core Rule이 프로젝트 정책으로 금지하는 경로이므로(`.claude/rules/MUST-orchestrator-coordination.md:7`, "Subagents MUST NOT spawn other subagents") 이 정책을 따르는 위임 흐름에는 해당하지 않습니다. 서브에이전트가 정책을 어기고 Agent를 호출한 경우의 포그라운드 실행 영향은 관측하지 않았습니다 [가설 — 해당 위반 사례의 트랜스크립트로 판정].
2545
2545
  - CHANGELOG 원문: "Fixed worktree isolation refusing to create or resume worktrees under git 2.56 or later when a stray `.git` file points at a directory that doesn't exist"
@@ -2557,7 +2557,7 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2557
2557
  ### 훅
2558
2558
 
2559
2559
  - CHANGELOG 원문: "Changed prompt and agent hooks so that at most 12 of one event run at a time; the rest wait their turn"
2560
- (302) prompt 훅과 agent 훅이 한 이벤트당 동시에 최대 12개까지 실행되고 나머지는 차례를 기다리도록 바뀌었습니다. 이 저장소의 prompt·agent 타입 훅은 프로젝트 settings와 templates 미러에서 각각 1개이며(`jq -r '[.hooks[][]?.hooks[]? | select(.type=="prompt" or .type=="agent")] | length' .claude/settings.json templates/.claude/settings.json` = 1, 1), 그 1개는 PostCompact 이벤트(키 `.claude/settings.json:403`)의 prompt 훅입니다(`"type": "prompt"`는 `.claude/settings.json:407`, templates 미러 `templates/.claude/settings.json:373`). 소스 `.claude/hooks/hooks.json`에서도 같은 타입은 1개입니다(`jq -r '[.. | objects | select(has("type")) | .type | select(.=="prompt" or .=="agent")] | length' .claude/hooks/hooks.json` = 1). 위 세 파일에서 한 이벤트에 12개를 넘는 prompt·agent 훅은 관측되지 않았으므로 이 상한은 저장소가 배선한 훅의 실행 순서를 바꾸지 않습니다(외부 플러그인 훅은 측정 범위 밖입니다). command 훅은 원문 대상이 아닙니다.
2560
+ (302) prompt 훅과 agent 훅이 한 이벤트당 동시에 최대 12개까지 실행되고 나머지는 차례를 기다리도록 바뀌었습니다. 이 저장소의 prompt·agent 타입 훅은 프로젝트 settings와 templates 미러에서 각각 1개이며(`jq -r '[.hooks[][]?.hooks[]? | select(.type=="prompt" or .type=="agent")] | length' .claude/settings.json templates/.claude/settings.json` = 1, 1), 그 1개는 PostCompact 이벤트(`.claude/settings.json`의 `PostCompact` 키)의 prompt 훅입니다(`"type": "prompt"`는 그 블록 안, templates 미러는 `templates/.claude/settings.json`의 `PostCompact` 블록). 소스 `.claude/hooks/hooks.json`에서도 같은 타입은 1개입니다(`jq -r '[.. | objects | select(has("type")) | .type | select(.=="prompt" or .=="agent")] | length' .claude/hooks/hooks.json` = 1). 위 세 파일에서 한 이벤트에 12개를 넘는 prompt·agent 훅은 관측되지 않았으므로 이 상한은 저장소가 배선한 훅의 실행 순서를 바꾸지 않습니다(외부 플러그인 훅은 측정 범위 밖입니다). command 훅은 원문 대상이 아닙니다.
2561
2561
 
2562
2562
  ### 컨텍스트 · compaction · 도구
2563
2563
 
@@ -2629,9 +2629,9 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2629
2629
  ### 서브에이전트 · 팀원 · headless
2630
2630
 
2631
2631
  - CHANGELOG 원문: "Fixed a plugin keeping a headless run going past `--max-turns`, Stop, or ended input by spawning subagents or re-running a finished one"
2632
- (304) 플러그인이 서브에이전트를 스폰하거나 끝난 서브에이전트를 다시 실행해 headless 실행을 `--max-turns`·Stop·입력 종료 뒤까지 이어가던 결함이 수정되었습니다. 원문의 주체는 플러그인입니다. 관측한 범위에서 이 저장소의 `.claude/`와 `CLAUDE.md`에는 `--max-turns` 사용이 보이지 않으며(`git grep -n -E -- '--max-turns' -- .claude CLAUDE.md` rc=1), 무인 `/fsd`의 `claude -p` 경로는 `OMCUSTOM_UNATTENDED=1`로 무인 실행을 표시합니다(`.claude/skills/fsd/SKILL.md:133`). 이 저장소는 프로젝트 settings에서 플러그인을 켜지 않으며(`jq -c '.enabledPlugins // null' .claude/settings.json` = null), 사용자 수준에서 켠 플러그인이 이 결함을 일으켰는지는 관측하지 않았습니다 [가설 — headless 실행 트랜스크립트에서 Stop 이후의 서브에이전트 스폰이 보이면 판정].
2632
+ (304) 플러그인이 서브에이전트를 스폰하거나 끝난 서브에이전트를 다시 실행해 headless 실행을 `--max-turns`·Stop·입력 종료 뒤까지 이어가던 결함이 수정되었습니다. 원문의 주체는 플러그인입니다. 관측한 범위에서 이 저장소의 `.claude/`와 `CLAUDE.md`에는 `--max-turns` 사용이 보이지 않으며(`git grep -n -E -- '--max-turns' -- .claude CLAUDE.md` rc=1), 무인 `/fsd`의 `claude -p` 경로는 `OMCUSTOM_UNATTENDED=1`로 무인 실행을 표시합니다(`.claude/skills/fsd/SKILL.md:134`). 이 저장소는 프로젝트 settings에서 플러그인을 켜지 않으며(`jq -c '.enabledPlugins // null' .claude/settings.json` = null), 사용자 수준에서 켠 플러그인이 이 결함을 일으켰는지는 관측하지 않았습니다 [가설 — headless 실행 트랜스크립트에서 Stop 이후의 서브에이전트 스폰이 보이면 판정].
2633
2633
  - CHANGELOG 원문: "Fixed self-paced `/loop` wakeups scheduled at the 1-hour maximum firing just after the 1-hour prompt cache expired, so those wakeups no longer re-read the conversation uncached"
2634
- (304) 1시간 최대치로 예약된 self-paced `/loop` wakeup이 1시간 prompt cache가 만료된 직후에 발동하던 결함이 수정되어, 그런 wakeup은 더 이상 대화를 캐시 없이 다시 읽지 않습니다. `/fsd` 스킬은 반복 단위를 `/loop` recurrence, 곧 모델이 주기를 정하는 self-paced loop로 기술하고(`.claude/skills/fsd/SKILL.md:39`), 무인(`claude -p`, 예약 실행) 세션에서 `/goal`·`/loop`를 호출하는 경로를 권장합니다(`.claude/skills/fsd/SKILL.md:172`). 그 경로의 wakeup이 1시간 최대치로 예약된 적이 있다면, 수정 전 버전에서는 그런 wakeup마다 대화를 캐시 없이 다시 읽는 비용이 들었을 수 있습니다 [가설 — 무인 `/fsd` 실행 기록에서 1시간 최대치 wakeup의 발생 여부와 그 요청의 cache read 토큰으로 판정].
2634
+ (304) 1시간 최대치로 예약된 self-paced `/loop` wakeup이 1시간 prompt cache가 만료된 직후에 발동하던 결함이 수정되어, 그런 wakeup은 더 이상 대화를 캐시 없이 다시 읽지 않습니다. `/fsd` 스킬은 반복 단위를 `/loop` recurrence, 곧 모델이 주기를 정하는 self-paced loop로 기술하고(`.claude/skills/fsd/SKILL.md:40`), 무인(`claude -p`, 예약 실행) 세션에서 `/goal`·`/loop`를 호출하는 경로를 권장합니다(`.claude/skills/fsd/SKILL.md:173`). 그 경로의 wakeup이 1시간 최대치로 예약된 적이 있다면, 수정 전 버전에서는 그런 wakeup마다 대화를 캐시 없이 다시 읽는 비용이 들었을 수 있습니다 [가설 — 무인 `/fsd` 실행 기록에서 1시간 최대치 wakeup의 발생 여부와 그 요청의 cache read 토큰으로 판정].
2635
2635
  - CHANGELOG 원문: "Fixed subagents sometimes forgetting their most recent work when they were messaged or resumed right after finishing"
2636
2636
  (304) 서브에이전트가 끝난 직후에 메시지를 받거나 재개되면 가장 최근 작업을 때때로 잊던 결함이 수정되었습니다. R009는 완료 알림에 보고 본문이 없으면 한 턴 기다리고, 그래도 없으면 산출물을 실측한 뒤 `SendMessage`로 재요청하도록 안내합니다(`.claude/rules/MUST-parallel-execution.md:368`). 수정 전 버전에서는 이 재요청을 받은 서브에이전트가 직전 작업을 잊은 채 답했을 수 있습니다 [가설 — 수정 전 버전의 재요청 응답과 실제 산출물을 대조한 기록은 미관측]. 재요청 응답도 결정론적 ground-truth로 대조한다는 원칙(R018 「Member Completion Verification」, 제목 `.claude/rules/MUST-agent-teams.md:501`)은 그대로입니다.
2637
2637
  - CHANGELOG 원문: "Fixed agent teams: approving a shutdown request from the main session no longer exits the whole CLI"
@@ -2724,7 +2724,7 @@ 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`; `.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 전후로 비교하면 판정 가능].
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`의 `playwright-compress.sh` 훅 항목에 `mcp__playwright__.*|mcp__claude-in-chrome__.*` matcher로 배선되어 있습니다. 둘째, 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:2851`)이고, 이음 줄 검색의 나머지 히트는 `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
 
@@ -2750,7 +2750,7 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
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:173`), 저장소 코드가 `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"
@@ -2777,7 +2777,7 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2777
2777
  ### 텔레메트리
2778
2778
 
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
- (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건)에서 이 저장소는 아직 이 이벤트를 참조하지 않습니다.
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를 들었습니다(v2.0.7 기준 `.claude/rules/MUST-enforcement-policy.md:19`, 보이는 텍스트; v2.0.8부터 dev-server는 이 행에서 빠져 현재 `:19`는 stage-blocker, rule-deletion-guard입니다). 이 중 `exit 2`로 끝나는 차단 경로가 코드에서 확인되는 것은 `.claude/hooks/scripts/stage-blocker.sh:13`과 `.claude/hooks/scripts/rule-deletion-guard.sh`의 `exit 2` 경로(`legacy_check`의 차단 분기들과 분석기 차단 분기, 내용 앵커)이며(`git show HEAD:.claude/hooks/scripts/stage-blocker.sh | grep -n 'exit 2'`, `git grep -n 'exit 2' -- .claude/hooks/scripts/rule-deletion-guard.sh`), 이 이벤트는 이 두 훅이 도구 호출을 멈춘 경우를 세는 결정론적 소스 후보입니다. dev-server tmux 훅은 `.claude/settings.json`의 dev-server 인라인 명령(v2.0.7 기준 `:52`)이 `exit 1`로 끝나므로(`git show 060613cd:.claude/settings.json | awk 'NR==52' | grep -o -E 'exit [0-9]+'` = `exit 1`; v2.0.8에서 이 훅은 항상 `exit 0`인 advisory로 바뀌어 도구 호출을 멈추지 않고, 포그라운드 dev server가 tmux·run_in_background·nohup·`&` 밖에서 명령 위치로 시작될 때만 모델에 `additionalContext`를 전달하며 R021 Hard Block 행에서 빠집니다) 실제로 도구 호출을 멈추는지는 #1775 코멘트(https://github.com/baekenough/oh-my-customcode/issues/1775#issuecomment-6404861043)에서 실측되었습니다: PreToolUse 훅 `exit 1`은 도구가 실행되었고 훅 stderr는 모델에 전달되지 않았습니다(CC 2.1.310, `claude -p`, haiku, 1회 실행 — 조건이 좁은 단일 관측). 이 이벤트가 그 훅에 대해 기록되는지는 [가설 — 텔레메트리를 켠 세션에서 판정 가능]입니다. 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
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
 
@@ -2842,7 +2842,7 @@ Opus 4.8에서 thinking blocks가 수정되어 API 오류가 발생하던 버그
2842
2842
  ### Bash · 도구 동작 · transcript
2843
2843
 
2844
2844
  - CHANGELOG 원문: "Fixed long tool output previews being cut through an emoji, leaving session transcripts that `jq` could not parse"
2845
- (309) 긴 도구 출력 미리보기가 이모지 중간에서 잘려 `jq`가 파싱할 수 없는 세션 transcript를 남기던 결함이 수정되었습니다. 이 저장소의 R007/R008 drift advisor와 Stop 훅 회고는 transcript를 줄 단위로 나눈 뒤(`split("\n")`, `.claude/hooks/scripts/r007-r008-drift-advisor.sh:227`, `.claude/hooks/scripts/session-reflection.sh:167`) 각 줄을 `fromjson? // empty`로 파싱하므로(같은 파일의 코드 줄 `:228`, `:168`) 파싱할 수 없는 줄은 오류 없이 건너뜁니다. 따라서 구버전 transcript에서 긴 도구 출력 미리보기가 이모지 중간에서 잘린 줄은 판정에서 빠졌을 수 있습니다 [가설 — 잘린 줄이 판정에 쓰이는 레코드였는지는 미조사; 기존 transcript에서 `fromjson`이 실패하는 줄을 세면 판정]. R020 「Self-Violation Counting Is Also Diagnosis」(제목 줄 `.claude/rules/MUST-completion-verification.md:381`)의 표 행(`:389`)은 transcript를 파싱해 실측 집계한 뒤 보고하라고 요구하므로, 2.1.309 이전에 기록된 transcript를 `?` 없는 `jq`로 파싱하면 그런 줄에서 실패할 수 있습니다. 원문은 이미 기록된 transcript를 고친다고 서술하지 않습니다.
2845
+ (309) 긴 도구 출력 미리보기가 이모지 중간에서 잘려 `jq`가 파싱할 수 없는 세션 transcript를 남기던 결함이 수정되었습니다. 이 저장소의 R007/R008 drift advisor와 Stop 훅 회고는 transcript를 줄 단위로 나눈 뒤(`split("\n")`, `.claude/hooks/scripts/r007-r008-drift-advisor.sh:230`, `.claude/hooks/scripts/session-reflection.sh:167`) 각 줄을 `fromjson? // empty`로 파싱하므로(같은 파일의 코드 줄 `:231`, `:168`) 파싱할 수 없는 줄은 오류 없이 건너뜁니다. 따라서 구버전 transcript에서 긴 도구 출력 미리보기가 이모지 중간에서 잘린 줄은 판정에서 빠졌을 수 있습니다 [가설 — 잘린 줄이 판정에 쓰이는 레코드였는지는 미조사; 기존 transcript에서 `fromjson`이 실패하는 줄을 세면 판정]. R020 「Self-Violation Counting Is Also Diagnosis」(제목 줄 `.claude/rules/MUST-completion-verification.md:381`)의 표 행(`:389`)은 transcript를 파싱해 실측 집계한 뒤 보고하라고 요구하므로, 2.1.309 이전에 기록된 transcript를 `?` 없는 `jq`로 파싱하면 그런 줄에서 실패할 수 있습니다. 원문은 이미 기록된 transcript를 고친다고 서술하지 않습니다.
2846
2846
  - CHANGELOG 원문: "Improved disk-full handling: a Bash command cut off by a full disk now says so and names the folder to free up, and starting on a full temp volume prints a clear message, not a raw ENOSPC error"
2847
2847
  (309) 디스크가 가득 차 Bash 명령이 중단되면 이제 그 사실과 비워야 할 폴더를 알려 주고, 임시 볼륨이 가득 찬 상태로 시작하면 원시 ENOSPC 오류 대신 명확한 메시지를 출력합니다. R020은 실행 중 인터럽트된 셸 명령이 잘렸다는 표시 없이 "Ran 1 shell command"로만 표시되던 v2.1.246 이전 사례를 들어 출력 완결성 확인을 요구합니다(`.claude/rules/MUST-completion-verification.md:532`, 보이는 표 행). 이 개선은 디스크 부족으로 인한 Bash 명령 중단을 명시적으로 보고하는 방향이며, R020의 출력 완결성 확인 의무는 바뀌지 않습니다. v2.1.305 절의 `ENOSPC` 항목은 디스크가 가득 차 명령이 아무것도 실행되지 않은 경우를 다루며 실행 도중 끊긴 경우로 이 문장을 참조합니다. 두 경우는 구분되며, 이 항목처럼 실행 도중 끊긴 명령은 부분 산출물을 남겼을 수 있습니다.
2848
2848
 
@@ -2869,14 +2869,14 @@ 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/` 미러입니다. 앞의 두 변수 설명 표에는 `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이 차단되는지 확인하면 판정].
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:1564`~`:1567`, `loop_count × sleep_interval`)은 30줄에 들지 않습니다(`git grep -n -E 'sleep_' -- .claude/skills .claude/hooks .claude/agents`의 작업 트리 출력은 `:1565` 1줄이고, 같은 검색을 `HEAD` 리비전에 실행하면 `:1552` 1줄입니다; 위 `:1564`~`:1567`은 작업 트리 기준). 같은 지시는 한도 없는 수동 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
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:173`), `claude -p` 경로에서는 env `OMCUSTOM_UNATTENDED=1`을 쓰도록 안내합니다(`:134`). 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
 
@@ -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
- - 후속 실측 후보(본문 `[가설]` 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 미응답 타임아웃 오류를 실제로 받은 사례가 있는지 확인합니다.
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:1564`~`:1567`)가 차단되는지도 확인합니다. (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