oh-my-customcode 1.1.65 → 1.1.67
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +3 -3
- package/dist/index.js +3 -3
- package/package.json +3 -3
- package/templates/.claude/rules/MAY-optimization.md +8 -0
- package/templates/.claude/rules/MUST-agent-design.md +6 -0
- package/templates/.claude/rules/MUST-agent-teams.md +4 -0
- package/templates/.claude/rules/MUST-completion-verification.md +6 -0
- package/templates/.claude/rules/MUST-enforcement-policy.md +6 -0
- package/templates/.claude/rules/MUST-orchestrator-coordination.md +9 -1
- package/templates/.claude/rules/MUST-parallel-execution.md +4 -0
- package/templates/.claude/rules/MUST-permissions.md +8 -0
- package/templates/.claude/rules/MUST-safety.md +4 -0
- package/templates/.claude/rules/MUST-sync-verification.md +5 -0
- package/templates/.claude/rules/SHOULD-ecomode.md +4 -0
- package/templates/.claude/rules/SHOULD-interaction.md +2 -0
- package/templates/.claude/rules/SHOULD-memory-integration.md +6 -0
- package/templates/.claude/rules/SHOULD-verification-ladder.md +4 -0
- package/templates/.claude/skills/fsd/SKILL.md +17 -1
- package/templates/.claude/skills/homework/SKILL.md +11 -4
- package/templates/manifest.json +1 -1
package/dist/cli/index.js
CHANGED
|
@@ -217,7 +217,7 @@ var init_package = __esm(() => {
|
|
|
217
217
|
workspaces: [
|
|
218
218
|
"packages/*"
|
|
219
219
|
],
|
|
220
|
-
version: "1.1.
|
|
220
|
+
version: "1.1.67",
|
|
221
221
|
description: "Batteries-included agent harness for Claude Code",
|
|
222
222
|
type: "module",
|
|
223
223
|
bin: {
|
|
@@ -265,13 +265,13 @@ var init_package = __esm(() => {
|
|
|
265
265
|
yaml: "^2.8.2"
|
|
266
266
|
},
|
|
267
267
|
devDependencies: {
|
|
268
|
-
"@anthropic-ai/sdk": "^0.
|
|
268
|
+
"@anthropic-ai/sdk": "^0.123.0",
|
|
269
269
|
"@biomejs/biome": "^2.3.12",
|
|
270
270
|
"@types/bun": "^1.3.6",
|
|
271
271
|
"@types/js-yaml": "^4.0.9",
|
|
272
272
|
"@types/nodemailer": "^8.0.0",
|
|
273
273
|
"js-yaml": "^5.0.0",
|
|
274
|
-
nodemailer: "^
|
|
274
|
+
nodemailer: "^10.0.0",
|
|
275
275
|
typescript: "^7.0.2",
|
|
276
276
|
vitepress: "^1.6.4"
|
|
277
277
|
},
|
package/dist/index.js
CHANGED
|
@@ -2326,7 +2326,7 @@ var package_default = {
|
|
|
2326
2326
|
workspaces: [
|
|
2327
2327
|
"packages/*"
|
|
2328
2328
|
],
|
|
2329
|
-
version: "1.1.
|
|
2329
|
+
version: "1.1.67",
|
|
2330
2330
|
description: "Batteries-included agent harness for Claude Code",
|
|
2331
2331
|
type: "module",
|
|
2332
2332
|
bin: {
|
|
@@ -2374,13 +2374,13 @@ var package_default = {
|
|
|
2374
2374
|
yaml: "^2.8.2"
|
|
2375
2375
|
},
|
|
2376
2376
|
devDependencies: {
|
|
2377
|
-
"@anthropic-ai/sdk": "^0.
|
|
2377
|
+
"@anthropic-ai/sdk": "^0.123.0",
|
|
2378
2378
|
"@biomejs/biome": "^2.3.12",
|
|
2379
2379
|
"@types/bun": "^1.3.6",
|
|
2380
2380
|
"@types/js-yaml": "^4.0.9",
|
|
2381
2381
|
"@types/nodemailer": "^8.0.0",
|
|
2382
2382
|
"js-yaml": "^5.0.0",
|
|
2383
|
-
nodemailer: "^
|
|
2383
|
+
nodemailer: "^10.0.0",
|
|
2384
2384
|
typescript: "^7.0.2",
|
|
2385
2385
|
vitepress: "^1.6.4"
|
|
2386
2386
|
},
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"workspaces": [
|
|
4
4
|
"packages/*"
|
|
5
5
|
],
|
|
6
|
-
"version": "1.1.
|
|
6
|
+
"version": "1.1.67",
|
|
7
7
|
"description": "Batteries-included agent harness for Claude Code",
|
|
8
8
|
"type": "module",
|
|
9
9
|
"bin": {
|
|
@@ -51,13 +51,13 @@
|
|
|
51
51
|
"yaml": "^2.8.2"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
|
-
"@anthropic-ai/sdk": "^0.
|
|
54
|
+
"@anthropic-ai/sdk": "^0.123.0",
|
|
55
55
|
"@biomejs/biome": "^2.3.12",
|
|
56
56
|
"@types/bun": "^1.3.6",
|
|
57
57
|
"@types/js-yaml": "^4.0.9",
|
|
58
58
|
"@types/nodemailer": "^8.0.0",
|
|
59
59
|
"js-yaml": "^5.0.0",
|
|
60
|
-
"nodemailer": "^
|
|
60
|
+
"nodemailer": "^10.0.0",
|
|
61
61
|
"typescript": "^7.0.2",
|
|
62
62
|
"vitepress": "^1.6.4"
|
|
63
63
|
},
|
|
@@ -20,6 +20,8 @@
|
|
|
20
20
|
|
|
21
21
|
> **zsh 내장 `echo`는 이스케이프를 확장한다 (#1625)**: zsh(이 저장소 Bash 도구 실행 셸)의 내장 `echo`는 `\n` 등 백슬래시 이스케이프를 기본 확장하므로, JSON 문자열을 파이프에 실을 때 `echo "$var"`를 쓰면 valid JSON을 스스로 깨뜨려 하류 파서 오진을 유발한다(v1.1.53 세션 훅 오진의 실제 원인). JSON/구조화 문자열 전달은 `printf '%s' "$var"`를 표준으로 한다.
|
|
22
22
|
|
|
23
|
+
> **zsh는 미인용 `$var`를 단어 분할하지 않는다 (#1683 #5)**: bash에서 관용적인 `for l in $list` / `set -- $line` 은 zsh(이 저장소 Bash 도구 실행 셸)에서 변수 전체를 **한 단어**로 취급하므로, `set -u`와 결합하면 `$2` 접근이 `parameter not set`으로 즉시 종료됩니다. 단어 분할이 필요하면 `${=var}`(zsh 전용) 또는 배열(`arr=(a b c); for x in "${arr[@]}"`)을 사용하고, 여러 필드가 든 문자열은 `read -r a b c <<< "$line"`으로 분해합니다. Origin: #1683 찐빠 #5 (v1.1.64 세션 — pre-triage 라벨 부트스트랩 스니펫이 1턴 실패 후 명시 인자로 재실행). Cross-ref: 위 zsh `echo` 노트, 파이프 `$?` 노트(#1540 zsh 변형) — 같은 "이 저장소의 셸은 zsh" 계열입니다.
|
|
24
|
+
|
|
23
25
|
> **로컬 실행 옵션 제시 전 자원 가용성 선확인 (#1455 #2)**: 로컬 실행에 의존하는 검증 옵션(로컬 스모크 테스트, 로컬 스크립트 실행 등)을 사용자에게 제시하기 **전에**, 그 실행에 필요한 로컬 자원(env 키, CLI 도구, 인증 상태)의 가용성을 먼저 확인한다. **저장소 secret 존재 ≠ 로컬 셸 env 존재** — `gh secret list`로 저장소 secret을 확인해도 로컬 셸에 해당 env가 있으리라 단정하지 말 것. 자원 부재 시 옵션에 전제조건을 명시하거나 옵션에서 제외하여, 사용자가 실행 불가한 옵션을 선택했다가 되돌리는 왕복(AskUserQuestion 재질문)을 방지한다. Cross-ref: R020(사전 검증). Origin: #1455 #2 (Session 127 회고 찐빠 #2) — 사용자가 "로컬 스모크 테스트 먼저"를 선택했으나 로컬 셸에 ANTHROPIC_API_KEY 부재로 실행 불가 → "스킵, 바로 커밋" 재선택, AskUserQuestion 왕복 1회 발생.
|
|
24
26
|
|
|
25
27
|
> **Shell output parsing — use Python, not read/grep (#1401 찐빠 #3)**: adb bounds rect, 좌표쌍, JSON 분할 등 구조화된 출력 파싱은 `read`+`grep -o` 파이프라인 대신 Python (`python3 -c "..."`) 을 사용한다. `read`+`grep -o` 조합은 공백 차이에 취약해 헛값을 산출한다. SSH 원격 `bash -c` 인자에 소괄호 포함 금지 — `ssh host "cmd; cmd2"` 형식 사용.
|
|
@@ -40,6 +42,12 @@
|
|
|
40
42
|
|
|
41
43
|
> **v2.1.259/261+**: (259) `claude plugin validate --json`이 기계 판독 가능한 검증 리포트를 제공합니다(cross-ref R017 v2.1.233 `plugin validate` 노트 — 사람 판독용 출력 파싱보다 이 쪽을 우선). (261) `/context`의 토큰 계산이 토큰-계산 API를 쓸 수 없을 때 추가 소형 모델 요청 대신 **로컬 추정치**를 사용하도록 바뀌었습니다 — 엔드포인트가 다운된 동안에는 `/context` 수치가 API 실측이 아니라 추정치일 수 있습니다. (261) `claude -p --resume <file>`이 트랜스크립트에 기록된 손상된 세션 ID를 그대로 채택하던 결함이 수정되어 이제 새 세션 ID로 재개합니다 — 트랜스크립트 기반 계수(R020)에서 v2.1.261+의 재개된 `-p` 세션은 재개 대상 파일과 다른 세션 ID를 가질 수 있습니다.
|
|
42
44
|
|
|
45
|
+
> **v2.1.268/269+**: (268) 서버가 응답을 계속 열어두는 경우 `WebFetch`가 무한정 걸려있던 문제가 수정되어 이제 300초 후 실패합니다(`CLAUDE_CODE_WEBFETCH_DEADLINE_MS`로 조정, 0은 비활성) — 위 WebFetch 캐시 TTL 노트의 연장선으로, 구버전에서 WebFetch가 멈춘 것은 느린 사이트가 아니라 **플랫폼 hang**이었을 수 있습니다. (268) 장기 실행 idle 세션의 busy loop로 인한 지속적 고CPU 사용과, `.claude/workflows/` 스크립트가 있는 프로젝트에서 시작 시 각 스크립트를 파싱하던 문제가 수정되었습니다. (268) localhost/점 없는 호스트명에 대한 `WebFetch` 오류 메시지가 거부 사유를 설명하고 curl 사용을 제안하도록 개선되었습니다. (269) `bashEditDiffEnabled` 설정 — Bash 도구가 파일 편집을 수행할 때 도구 결과에 명령이 변경한 파일의 diff가 포함됩니다 — 셸 기반 편집에 대한 결정론적 사후 쓰기 확인 수단입니다(cross-ref R010 오케스트레이터 직접 쓰기 금지 — 위임받은 에이전트의 `sed -i`가 이제 감사 가능해집니다).
|
|
46
|
+
|
|
47
|
+
> **v2.1.271+**: (271) `/resume`과 `/teleport`가 이전 대화의 파일-읽음 추적을 그대로 유지해, 재개된 대화가 한 번도 읽지 않은 파일을 Claude가 편집할 수 있던 결함이 수정되었습니다(위 v2.1.228 Write 노트의 read-before-write 가드가 재개 경계를 넘어 우회 가능했다는 뜻입니다). (271) 샌드박스 명령이 시작에 실패한 뒤 남은 낡은 `.git/config.lock`이 세션 나머지 동안 `git checkout -b`, `git push -u`, `git config`를 깨뜨리던 결함이 Linux에서 수정되었습니다(Darwin은 미해당 — cross-ref R017). (271) `/cd` 이후 `/reload-skills`가 슬래시 메뉴와 다른 스킬 개수를 보고하던 결함이 수정되었습니다(cross-ref R017 Count Sync — 디렉토리 변경 후 `/reload-skills` 개수는 신뢰할 수 있는 스킬-카운트 ground truth가 아니었습니다). (271) MCP 서버가 `list_changed`를 촘촘한 루프로 보낼 때 발생하던 지속적 고CPU와 반복 도구목록 요청이 수정되었습니다.
|
|
48
|
+
|
|
49
|
+
> **v2.1.273/274+**: (274) 경미한 메모리 압박 상태의 머신에서 background 명령이 30분 idle 후 중지되던 것이, 이제 메모리가 치명적으로 낮을 때만 중지되고 디버그 로그에 사유가 남습니다 — v2.1.260의 서브에이전트 background 1시간 제한 제거와 결합하면, "무음 종료"의 알려진 플랫폼 원인 두 가지가 모두 사라졌으므로 남은 종료는 실재 신호로 취급합니다. (274) Bash 도구가 플러그인 리로드마다 셸 프로파일을 재소스(수 초 지연)하던 것이, 이제 플러그인의 `bin/` 디렉토리가 바뀔 때만 그렇게 됩니다; Monitor 알림이 스크립트의 최종 출력과 종료를 하나의 알림으로 병합합니다; 서버별 `timeout`이 더 길어도 Streamable HTTP MCP 도구 호출이 ~5분에 타임아웃하던 결함이 수정되었습니다; 레거시 HTTP+SSE를 쓰는 MCP `http` 서버가 첫 요청에 4xx로 응답할 때 정상 fallback되도록 수정되었습니다(위 v2.1.265 SSE 노트의 연장선); `CLAUDE_CODE_MCP_STARTUP_WAIT_MS`가 연결 중인 MCP 서버에 대한 첫 비대화형 턴의 대기 시간을 상한합니다. (273) MCP 서버가 세션 도중 연결이 끊기고 재연결이 포기될 때 알림이 표시됩니다(`/mcp` 확인 유도) — 이 저장소 세션에서 관측된 llm-memory 530 사례가 무음 대신 가시화됩니다.
|
|
50
|
+
|
|
43
51
|
<!--
|
|
44
52
|
> **v2.1.206+**: `/doctor`에 checked-in CLAUDE.md에서 코드베이스로부터 파생 가능한 내용을 잘라내도록 제안하는 체크가 추가되었습니다 — R005 "Context Optimization via HTML Comments"의 컨텍스트 절감 원칙과 정합(모델 불필요 메타데이터 축소).
|
|
45
53
|
-->
|
|
@@ -81,6 +81,8 @@ Skill/rule text instructing "spawn with `model: opus`" refers to this tier — a
|
|
|
81
81
|
|
|
82
82
|
> **v2.1.259+**: 프론트매터 `model:` 관련 결함 2건이 수정되었습니다 — (a) 커스텀 커맨드와 **스킬**의 프론트매터 `model:`이 interactive 세션에서 **무시**되던 결함이 수정되어, 259 이전에는 이 파일 「Skill Frontmatter」의 선택적 `model` 필드가 interactive 실행에서 **효과가 없었고**, 스킬의 실제 실행 모델은 스킬이 무엇을 선언했든 세션 모델 그대로였습니다(R020 "attempt ≠ outcome"의 스킬 model pin 각도). (b) auto mode가 커맨드·스킬 프론트매터 `model:`이 명명한, 지원하지 않는 모델로 turn을 실행하던 결함이 수정되어 이제 세션 모델을 유지합니다 — 즉 auto mode에서는 스킬 `model:` pin이 세션 모델에 조용히 override될 수 있으므로, 실제 실행 모델은 프론트매터가 아니라 v2.1.223 강등 경고로 확인합니다.
|
|
83
83
|
|
|
84
|
+
> **v2.1.274+**: `claude agents` CLI가 auto-update 재실행 이후 `--model`, `--effort`, `--permission-mode`, `--allow-dangerously-skip-permissions`, `--agent` 플래그를 잃던 결함이 수정되었습니다 — 구버전에서는 `claude agents` 백그라운드 세션이 auto-update 재실행 후 시작 당시 지정한 permission mode·model을 **조용히 잃을 수 있었습니다**(R010 「Universal bypassPermissions」의 "유효 모드는 실측해야 한다"는 원칙과 직결). 또한 (274) Bedrock/Vertex/Foundry에서 `model: "opus"` 서브에이전트가 세션 model id에서 인식 가능한 model family를 찾지 못하면(`ANTHROPIC_DEFAULT_OPUS_MODEL` 미설정 시) 세션 모델을 **벗어나던** 결함이 수정되어 이제 세션 모델을 유지합니다 — 이 저장소 환경은 아니지만 "CC가 alias를 해석한다"는 위 Tier-1 원칙의 또 다른 경계 사례로 기록합니다.
|
|
85
|
+
|
|
84
86
|
> **Claude Fable 5 (access via CC v2.1.170+)**: Mythos-class model, GA on the Claude API and positioned as a tier above Opus — its capabilities exceed any previously GA model. CC v2.1.170 is the client version that adds access (the model's GA is an API/platform property, not a CC-release milestone). Available via frontmatter full ID `claude-fable-5` (Tier 2) or Agent tool `model: fable` (Tier 3) — NOT via a Tier-1 frontmatter alias. Reserve for the most complex reasoning where its capability premium is warranted; `sonnet` remains the default for general tasks and `opus` for architecture (cost/latency awareness, R005). CC v2.1.170 also fixes session transcripts not saving (and not appearing in `--resume`) when launched from a VS Code integrated terminal or any shell inheriting Claude Code env vars — relevant to transcript-dependent skills (`homework`, `episodic-memory`). Closes #1352.
|
|
85
87
|
|
|
86
88
|
> **v2.1.257+**: Claude Fable 5.1(`claude-fable-5-1`)이 추가되어 **기본 Fable 모델**이 되었습니다 — 1M context, $10/$50 per Mtok(캐시 읽기 $0.25/Mtok). Tier-3 `model: fable` alias는 이제 Fable 5.1로 해석됩니다(단 Claude apps gateway 세션은 게이트웨이가 아직 Fable 5.1을 미지원해 당분간 Fable 5로 유지됩니다 — `/model`에서 명시 선택해야 Fable 5.1 사용 가능). frontmatter에서 확정하려면 Tier-2 full ID `claude-fable-5-1`을 쓰고, 기존 `claude-fable-5` pin은 그대로 Fable 5에 남습니다 — Tier-1 alias 해석 주체는 CC라는 위 원칙(v2.1.219/222 노트와 동일 계열)의 재확인입니다.
|
|
@@ -147,6 +149,8 @@ Key optional fields: `memory`, `effort`, `skills`, `soul`, `isolation`, `backgro
|
|
|
147
149
|
|
|
148
150
|
> **v2.1.261/265/267+**: 서브에이전트/스킬 런타임 관련 3건 — (261) `--append-subagent-system-prompt-file`이 신설되어 커맨드라인에 담기 힘들 만큼 큰 서브에이전트 시스템 프롬프트를 파일에서 읽습니다(R009의 ~5000-token 프롬프트 휴리스틱과 정합 — 대형 프롬프트는 단순 파일 로드가 아니라 우선 분할의 신호입니다). (265) forked 스킬(`context: fork`)이 착수(kickoff) 프롬프트를 스트리밍하지 않고, `--forward-subagent-text`와 함께 쓸 때 그 텍스트 turn을 stream-json progress 이벤트로 내보내지 않던 결함이 수정되었습니다 — 아래 「Context Fork Criteria」의 10/12 `context: fork` 스킬을 `-p --output-format stream-json`으로 실행할 때 관련되며, 구버전에서는 fork progress 이벤트 부재가 fork가 실행되지 않았다는 증거가 아니었습니다. (267) `--system-prompt`/`--append-system-prompt`로 시작한 서브에이전트·세션이 이제 시스템 프롬프트와 도구 정의를 매 요청마다 재렌더링하는 대신 한 번만 기록합니다(prompt-cache 안정성) — `--system-prompt-snapshot off`는 프롬프트 반복 작업을 위해 매 요청 새로 렌더링합니다.
|
|
149
151
|
|
|
152
|
+
> **v2.1.271+**: 신규 에이전트 프론트매터 필드 `omitClaudeMd`(및 `--agents` JSON에도 동일 필드)가 추가되어, 커스텀·플러그인 서브에이전트가 user/project/local CLAUDE.md 파일을 **전혀 로드하지 않고** 실행할 수 있습니다(managed policy 파일은 계속 로드됩니다). 이 저장소는 오늘 스폰되는 모든 서브에이전트가 프로젝트 CLAUDE.md + 23개 룰(고정 주입 ~49.5k 토큰, R016 코퍼스 비용 cross-ref)을 그대로 상속하므로, `omitClaudeMd: true`는 `Explore`나 `tracker-checkpoint`처럼 좁고 비용에 민감한 에이전트에 새로운 레버가 됩니다 — 단 그렇게 스폰된 에이전트는 R007/R008/R010을 보지 못하므로, 오케스트레이터는 그 출력을 **rule-unaware**로 취급해야 합니다. 위 「Optional Frontmatter」 필드 목록에 추가할 때는 이 무규칙 특성을 함께 명시합니다. 또한 (271) `--resume` 시 재개 세션의 모델 패밀리가 설정된 기본값과 다르면 1M 컨텍스트 창(`[1m]`)이 소실되던 결함이 수정되었습니다(Tier-2 `[1m]` 접미사 각도, cross-ref R013).
|
|
153
|
+
|
|
150
154
|
### Note on `skills:` field
|
|
151
155
|
|
|
152
156
|
The `skills:` frontmatter field is **advisory metadata** consumed by oh-my-customcode tooling (graph-builder, mgr-sauron) for documentation and validation. It is **NOT a runtime allowlist** — Claude Code does not filter the available skills based on this field, and subagents can invoke any registered skill regardless of what `skills:` declares. Use it to document a subagent's intended skill dependencies; do not rely on it for access control.
|
|
@@ -502,6 +506,8 @@ description: Brief desc # One-line summary
|
|
|
502
506
|
|
|
503
507
|
Key optional fields: `scope`, `context`, `version`, `effort`, `model`, `agent`, `hooks`, `paths`, `shell`, `allowed-tools`, `keep-coding-instructions`. Skill `effort` takes precedence over agent `effort` when both specified. See full optional fields via Read tool.
|
|
504
508
|
|
|
509
|
+
> **v2.1.269+**: `claude plugin eval`이 신설되어 플러그인의 eval suite를 실행하고 채점된 재현 가능 결과(JSON + HTML report)를 생성합니다 — 스킬/플러그인 품질을 위한 결정론적 Tier-1/2 계측 도구입니다(cross-ref R023, `skill-creator`의 eval 워크플로우). 또한 (269) Skill 도구의 "Unknown skill" 오류가 bare name이 정확히 하나의 플러그인 스킬과 일치할 때 그 플러그인 스킬의 전체 이름을 명시하도록 개선되었고, cloud 세션에서 claude.ai로부터 동기화된 스킬은 `anthropic-skills:<name>`으로 명명됩니다(bare name이 유일하면 여전히 동작) — 위 v2.1.228 동기화-스킬 하드닝 노트와 관련됩니다.
|
|
510
|
+
|
|
505
511
|
<!-- ARCHIVED CC version note (historical):
|
|
506
512
|
> **v2.1.163+**: In skill `command` bodies, use `\$` to emit a literal `$` before a number (e.g., `\$1`) — previously ambiguous with shell variable expansion. Relevant when authoring skills with `shell:` or inline command steps that include dollar signs not intended as variables.
|
|
507
513
|
-->
|
|
@@ -436,6 +436,10 @@ Cross-reference: R020 ("actual outcome ≠ attempt" — verifying that a command
|
|
|
436
436
|
|
|
437
437
|
> **v2.1.261+**: 다른 머신의 OFFLINE Remote Control 세션으로 `SendMessage`를 보내면 전송됨으로 읽혔으나, 이제 그 머신이 재연결될 때까지 전달이 큐잉된다는 결과를 반환합니다 — v2.1.224 inbox 쓰기 실패·v2.1.251 최종 답변 유실에 이은 이 계열의 세 번째 사례이며, 구버전의 "Message sent"는 상대가 온라인이라는 보장조차 아니었습니다. 같은 릴리즈에서 in-process agent-team teammate가 두 번째 턴에 첫 턴의 도구·스킬 announcement를 재전송해 요청 prefix가 바뀌고 prompt cache를 놓치던 결함도 수정되었고, (265) teammate·resumed 서브에이전트가 `SubagentStart` 훅 컨텍스트와 preloaded skill을 prompt prefix 밖으로 이동시키던 결함도 수정되었습니다. 이 저장소의 R018은 `TeamCreate` 부재로 dormant이므로, 이 노트는 cross-session `SendMessage` 경로에 한해 기록합니다.
|
|
438
438
|
|
|
439
|
+
> **v2.1.268/271+**: (268) 신뢰하지 않은 폴더의 동일 이름 agent 파일에서 tools나 system prompt를 물려받은 채 respawn되던 in-process teammate 결함이 수정되었습니다 — agent 정의에 대한 trust boundary이며 R001과 교차합니다. 같은 릴리즈에서 `claude remote-control`로 서빙되는 Remote Control 세션이 `ListAgents`에 세션 제목 대신 생성된 이름으로 표시되던 결함도 수정되었습니다. (271) 수신 세션의 permission-mode 정책에 의해 보류된 cross-session 메시지가 흔적 없이 사라지던 결함이 수정되어, 이제 headless 발신자는 전달 통지를 받고 `SendMessage` 결과가 더 이상 "읽힘"을 함의하지 않습니다 — v2.1.224/251/260/261 SendMessage 신뢰성 계열에 "전달됨 ≠ 읽힘"이 명시적으로 추가됩니다. 같은 릴리즈에서 `claude mcp serve`가 30초마다 진행 업데이트를 보내 장시간 무음 도구 호출이 idle 타임아웃으로 중단되지 않도록 개선되었습니다.
|
|
440
|
+
|
|
441
|
+
> **v2.1.273/274+**: (273) 최종 스트리밍 응답에 토큰 사용량이나 model id가 빠졌을 때 서브에이전트/백그라운드 에이전트가 FAILED로 보고되고 결과가 전달되지 않던 결함이 수정되었습니다(R020 「Failure/Interrupt Report ≠ Actual Failure」cross-ref). (274) 서브에이전트가 메인 세션에 보낸 메시지가 relaunch 후 Claude Desktop 트랜스크립트에서 사라지던 결함이 수정되었고, headless/SDK 세션이 완료된 background task마다 개별 모델 호출을 하던 것이 이미 큐잉된 완료건은 한 번의 호출로 응답하도록 바뀌었습니다(R009 fan-out의 비용 각도). (273) `/tui`가 이미 완료된 agent-team teammate 때문에 재시작을 거부하던 결함도 수정되었습니다. 결론은 그대로입니다 — 결정론적 ground-truth만이 완료 증거이며, 이 수정들은 잘못된 "failed"/"idle" 신호를 줄일 뿐 검증을 대체하지 않습니다.
|
|
442
|
+
|
|
439
443
|
<!-- ARCHIVED CC version note (historical):
|
|
440
444
|
> **CC v2.1.162+**: `claude agents --json` now includes a `waitingFor` field showing what a waiting session is blocked on (e.g. a permission prompt). Use it as an additional deterministic ground-truth signal — a member with a non-empty `waitingFor` is blocked on input (needs unblocking), NOT silently stalled (reassign per stall handling below). This distinguishes the two failure modes the verification is meant to separate.
|
|
441
445
|
|
|
@@ -430,6 +430,12 @@ Origin: #1269 ① (R020 self-violation, session 106).
|
|
|
430
430
|
|
|
431
431
|
> **v2.1.265/267+**: (265) 이전 프로세스가 도구 실행 중 죽은 뒤 재개하면 마지막 프롬프트를 더 이상 재작성하지 않고, 중단된 도구 호출을 유지하며 **interrupted로 명시 표시**합니다 — 위 v2.1.246 행(인터럽트된 셸 명령이 단순 "실행됨"으로만 표시)의 연장선으로, 이 경로에서는 이제 트랜스크립트에 명시적 interrupted 마커가 남으므로 v2.1.265+에서는 그 부재가 유의미한 증거지만 구버전에서는 아닙니다. (267) `/compact` 또는 다른 슬래시 커맨드 직후 `-p --resume`으로 재개할 때 가짜 "Continue from where you left off." turn이 더 이상 삽입되지 않습니다 — `/fsd` 류 `-p` 루프에서 이런 turn을 사용자 입력으로 오인할 수 있었던 경로와 관련됩니다(R015: 이것은 지시가 아닙니다). 또한 큰 세션(트랜스크립트 5MB 초과)을 재개할 때 병렬 도구 호출과 그 훅 출력이 재로드된 대화에서 누락되던 결함도 수정되었습니다(cross-ref R021) — 회고적 트랜스크립트 계수(「Self-Violation Counting Is Also Diagnosis」)에서, 구버전으로 재개된 5MB 초과 세션은 도구 호출이 유실됐을 수 있으므로 그런 트랜스크립트의 계수는 **하한값**으로 취급합니다.
|
|
432
432
|
|
|
433
|
+
> **v2.1.269+**: 원격·헤드리스 세션이 background agent가 아직 실행 중인데도 "waiting for your input"을 보고하던 결함이 수정되었습니다(`CLAUDE_CODE_BG_TASKS_REPORT_RUNNING=0`으로 구동작 복원 가능) — 구버전 `-p`/원격 실행에서 idle 보고는 백그라운드 작업 완료의 증거가 아니었습니다. 같은 릴리즈에서 compaction 이후 Claude에 전달되는 git status가 세션 시작 시점이 아니라 **현재** 상태로 바뀌었습니다 — R017 「게이트는 분기 시점 1회가 아니라 상태변경 위임마다」와 직접 교차: v2.1.269 이전에는 compaction 후 오케스트레이터가 stale git 스냅샷으로 추론할 수 있었으므로, compaction 직후 HEAD/브랜치 재실측은 선택이 아니었습니다. 또한 (269) `/goal` 실행이 API 오류·네트워크 끊김·토큰 한도 후 무음으로 멈추던 결함이 수정되어, 이제 backoff로 재시도하거나 중단 사유를 명시합니다 — `/goal`을 감싸는 `/fsd`에도 해당합니다.
|
|
434
|
+
|
|
435
|
+
> **v2.1.273+**: 서브에이전트/백그라운드 에이전트가 스트리밍 최종 응답에 토큰 사용량이 빠졌거나 model id가 없을 때 **FAILED로 보고되고 결과가 전달되지 않던** 결함이 수정되었습니다 — 작업은 완료됐으나 전달만 실패한, 이 섹션이 다루는 "실패 보고 ≠ 실제 실패"의 정확한 사례입니다. 같은 릴리즈에서 SDK와 `--output-format stream-json` 출력이, 실행 도중(예: `CLAUDE_AUTO_BACKGROUND_TASKS`로) background로 이동한 서브에이전트의 남은 메시지와 최종 보고를 누락하던 결함도 수정되었고, context meter와 auto-compact가 advisor 도구 턴을 실제 크기의 약 2배로 계상해 auto-compact가 실제 창의 절반 지점에서 발동하던 결함도 수정되었습니다(cross-ref R013). 위 v2.1.246 `maxTurns` partial 표시와 함께, 이들은 「위임 경계를 Phase 개수로 설계」가 다루는 "판정 없이 종료" 증상의 추가 플랫폼 원인입니다 — 위 Core Rule의 ground-truth 원칙은 그대로 유지됩니다.
|
|
436
|
+
|
|
437
|
+
> **v2.1.274+**: background agent 알림이, 에이전트가 여전히 자신의 백그라운드 작업을 기다리며 재개 예정인데도 "실행 중인 백그라운드 작업 없음"으로 보고하던 결함이 수정되었습니다. 재개된 background agent가 인터럽트된 도구 배치 중 하나가 메시지와 함께 승인됐을 때 배치의 절반을 유실하던 결함도 수정되었습니다. "unexpected tool_use_id" 400 오류를 끝없이 재시도하며 멈추던 세션도 수정되어, 손상된 트랜스크립트는 가능하면 자가 복구하고 그렇지 않으면 `/rewind` 힌트가 붙은 명확한 오류로 루프를 끝냅니다. compaction을 거친 세션을 `--continue`/`--resume`으로 재개할 때 활성 `/goal`이 유실되던 결함과, 훅 기반 세션(활성 `/goal`)이 2차 overflow에서 compaction 대신 "Prompt is too long"으로 종료되던 결함도 모두 수정되었습니다 — `/goal`을 감싸는 `/fsd`에서, 구버전의 재개 후 goal 유실은 수렴 신호가 아니라 플랫폼 결함이었습니다. 같은 릴리즈에서 서브에이전트의 진행 요약이 폭주하는 다단락 응답으로 대체되던 결함도 수정되었습니다.
|
|
438
|
+
|
|
433
439
|
### CI Publish-Step Error vs Published-Artifact Ground Truth
|
|
434
440
|
|
|
435
441
|
> Origin: #1332 — `npm publish --provenance` emitted a Sigstore `TLOG_CREATE_ENTRY_ERROR` 409, but the publish step's `|| npm view <pkg>@<ver>` fallback recovered (the package WAS published) and release.yml succeeded on all jobs. A subagent read the tlog error in the logs and prematurely declared the run "failed", recommending a re-run; deterministic ground-truth (`npm view`, `gh release view`) showed the release had fully succeeded.
|
|
@@ -51,6 +51,12 @@ oh-my-customcode uses an **advisory-first enforcement model**. Most rules are en
|
|
|
51
51
|
|
|
52
52
|
> **v2.1.261/265/267+**: resume 시 훅 컨텍스트 무결성 결함 3건이 수정되었습니다. (261) 세션 재개 시 **병렬 도구 호출 주변**의 훅 출력 등 컨텍스트가 유실되어 재개된 요청이 달라지던 결함이 수정되었습니다. (267) 대용량 세션(트랜스크립트 5MB 초과) 재개 시 병렬 도구 호출과 그 훅 출력이 누락되던 결함이 수정되었습니다. (265) agent teammate와 재개된 서브에이전트가 이후 턴에서 `SubagentStart` 훅 컨텍스트와 preload된 스킬을 prompt prefix 밖으로 이동시켜 prompt-cache 재사용을 깨뜨리던 결함이 수정되었습니다. 함의: 구버전에서 재개된 세션의 대화에 어떤 훅의 출력이 보이지 않는다고 해서 그 훅이 **발화하지 않았다**는 증거는 아닙니다 — 「배선 확인 ≠ 전달 확인 ≠ 발화 확인 ≠ 로드 확인」4층 구분에 5번째 각도(**발화 ≠ 재개 후 보존**)가 추가됩니다. 또한 (267) managed `allowedHttpHookUrls`/`httpHookAllowedEnvVars`가 읽을 수 없을 때 아무것도 허용하지 않도록(fail-closed) 변경되었습니다.
|
|
53
53
|
|
|
54
|
+
> **v2.1.268+**: 훅 발화·타임아웃 결함 두 건과 auto mode 차단 메시지 개선 한 건이 수정되었습니다. `PermissionRequest` 훅이 `--print` 모드에서 발화하지 않던 결함이 수정되어, v2.1.268 이전 `-p` 실행에서는 이 이벤트 계열의 훅이 무음으로 부재했습니다(향후 `PermissionRequest` 배선 시 참고). `CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS`가 per-hook `timeout`이 없는 `SessionEnd` 훅에는 적용되지 않아 여전히 1.5초 만에 취소되던 결함도 수정되었습니다 — 이 저장소는 R011 세션 종료 시 메모리 저장을 훅 경로로 수행하므로, 구버전에서 명시적 `timeout` 없는 SessionEnd 훅은 env var와 무관하게 1.5초 상한이었다는 뜻이며, 과거 세션의 메모리 저장 누락을 이 상한으로 재해석할 여지가 있습니다(단정 금지 — R011 `[hypothesis]` 태그로만 취급). auto mode 거부 메시지가 이제 차단한 규칙을 명시하고 더 안전한 방법 시도와 무관한 작업 마무리를 요청합니다 — R010 Scope-Creep STOP 관점에서 거부가 이제 특정 규칙에 귀속 가능합니다.
|
|
55
|
+
|
|
56
|
+
> **v2.1.271+**: 훅 실행 자체가 처음으로 **가시화**되었습니다 — `SessionStart`/`UserPromptSubmit`/`PreToolUse`/`SessionEnd` 훅이 도는 동안 스피너에 경과 시간과 함께 표시되고, `SessionStart` 훅을 기다리는 프롬프트는 Esc로 취소 가능합니다. 이는 「배선 확인 ≠ 전달 확인 ≠ 발화 확인 ≠ 로드 확인」4층 구분에 **훅이 지금 실행 중임이 화면에 보인다**는 인터랙티브 신호를 더합니다. 또한 세션 밖에서 발생한 settings 파일 변경이 macOS의 파일-이벤트 서비스 포화 시 감지되지 않던 결함이 수정되어 watcher가 폴링으로 폴백합니다 — 위 「훅 배선 경로」의 settings 재생성 흐름에서, fs-event 포화 상황에서도 재생성된 settings.json이 이제 반영됩니다.
|
|
57
|
+
|
|
58
|
+
> **v2.1.274+**: Stop prompt 훅이 대화 중 매 block마다 **전체 프롬프트를 통째로 재전송**하던 결함이 수정되어, 반복 block은 이제 500자 라벨로 조건만 명시합니다. R020 8항·메모리 v1.1.53~56에 기록된 "Stop 훅 잠식" 패턴에 직접 관련됩니다 — 구버전에서는 Stop 훅이 반복 block될 때마다 전체 프롬프트 텍스트가 모델 컨텍스트에 재주입됐으므로, 당시 관측된 토큰/턴 소모의 **기계적으로 충분한 원인**입니다(가설 등급 귀속 — 관측과 정합하나 이것으로 확정되지는 않음, R020 hypothesis 규율). 또한 플러그인 `hooks/hooks.json` 최상위의 `$schema` 키에 대해 "unknown key" 통지가 더 이상 뜨지 않게 되었습니다 — 이 저장소의 `.claude/hooks/hooks.json` 소스 파일에 향후 `$schema`를 추가할 때 관련됩니다.
|
|
59
|
+
|
|
54
60
|
## Why Advisory-First
|
|
55
61
|
|
|
56
62
|
1. **Agent flexibility**: Hard blocks can trap agents in unrecoverable states
|
|
@@ -260,6 +260,8 @@ When a subagent trips the safety classifier (R001/R002) **2 times**, the orchest
|
|
|
260
260
|
|
|
261
261
|
> **v2.1.225+**: auto mode가 **자기 권한 검사에 대한 safety-filter refusal**을 consecutive-block 한도에 계상하던 결함이 수정되었습니다 — 동작은 여전히 거부되나 모델에는 재시도 대신 진행하라고 지시됩니다. 이 표의 trip 계수는 **서브에이전트가 실제 작업에서 유발한 classifier trip**만을 대상으로 하며, 플랫폼 내부 권한 검사에서 발생한 refusal은 계수 대상이 아닙니다 — 구버전에서 이 둘이 섞여 계상되었으므로, 과거 세션의 trip 횟수를 근거로 STOP 판정을 소급하지 않습니다.
|
|
262
262
|
|
|
263
|
+
> **v2.1.273+**: 서브에이전트·백그라운드 에이전트가 최종 스트리밍 응답에 토큰 사용량이나 model id가 빠졌을 때 **FAILED로 보고되고 결과가 전달되지 않던** 결함이 수정되었습니다. 이 표의 trip 계수에 대한 함의: 273 이전의 FAILED 통지는 서브에이전트가 실제로 작업에서 classifier에 걸렸다는 증거가 아니고, 침묵도 정지의 증거가 아닙니다 — R020 ground-truth(`git status`/`grep`)만이 유일한 판정 수단이며, 잘못 전달된 FAILED를 이 표의 trip으로 계상하지 않습니다. 같은 릴리즈에서 bypass 모드의 subshell 안에 숨긴 위험한 `rm`이 프롬프트를 우회하던 결함도 수정되었습니다(R001 위험한 `rm` 프롬프트 확장 계열과 동일 수정) — v2.1.274에서는 워크트리 격리 세션이 특정 중첩 셸 확장을 포함한 Bash 명령을 **거부**하므로(v2.1.257 완화의 반대 방향), 격리 세션에서 복합 확장 명령이 거부되면 classifier trip으로 계상하기 전에 명령 단순화를 먼저 시도합니다.
|
|
264
|
+
|
|
263
265
|
### Pre-Decomposition Mandate
|
|
264
266
|
|
|
265
267
|
Broad single-task scopes (e.g. "migrate + backfill") MUST be pre-decomposed by domain before delegation, so an agent cannot silently expand from its named task into adjacent privileged domains (secret rotation, tunnel creation, infra deletion, dashboard changes). See R009 (pre-decomposition) and R018 (domain-split).
|
|
@@ -538,6 +540,10 @@ Before spawning any agent:
|
|
|
538
540
|
|
|
539
541
|
> **v2.1.259/265+**: (259) 중첩(nested) 백그라운드 서브에이전트의 결과가 이제 **부모 서브에이전트의 트랜스크립트**에 저장되어, resume된 서브에이전트가 결과를 유지하고 공유 트랜스크립트에서 전달이 드러납니다 — 이는 CC의 기본 nested-spawn 능력을 서술할 뿐이며, 위 flat-delegation **정책**(Core Rule)은 그대로 불변입니다. (259) remote-control 세션에서 `Stop`이 백그라운드 에이전트·워크플로우를 실제로 멈추지 못하던 결함이 수정되어, kill된 작업이 프로세스가 실제로 종료될 때까지 계속 보이고 재중지 가능합니다(cross-ref R020 역방향 노트 — "실패/중단 보고 ≠ 실제 실패"). (265) foreground로 스폰한 서브에이전트를 resume하면 도구 목록과 시스템 프롬프트 prefix가 바뀌어(prompt-cache 파손) 있던 결함이 수정되었고, non-interactive 세션(`-p` stream-json / SDK / cloud)이 사용자 메시지마다 셸 cwd를 초기화하던 결함도 수정되어 이제 `cd`가 턴 사이에 유지됩니다 — 턴별로 명령을 연쇄하는 `-p` 위임 스크립트에 직접 영향을 줍니다.
|
|
540
542
|
|
|
543
|
+
> **v2.1.268/269+**: (268) auto mode가 어떤 action을 거부할 때 이제 **그 거부를 유발한 규칙 이름**을 함께 표시합니다 — 위 Subagent Scope-Creep STOP Protocol의 trip 계수가 "차단됨"이라는 모호한 신호가 아니라 **어느 규칙이 걸렸는지** 결정론적으로 확인 가능해지고, R015의 allow rule vs classifier 구분도 거부 텍스트에서 바로 읽을 수 있습니다. (269) `/goal`이 일시적 API 오류를 backoff로 재시도하고 goal을 조용히 종료하지 않도록 수정되었습니다 — `/goal`을 감싸는 `/fsd`가 일시적 5xx로 죽지 않으며, 269+에서 `/goal`이 갑자기 끝났다면 그것은 네트워크 순간 장애가 아니라 실제 중단입니다(cross-ref R004 Retryable).
|
|
544
|
+
|
|
545
|
+
> **v2.1.274+**: (274) 멀티세션 에이전트 뷰인 `claude agents`가 auto-update 이후 `--permission-mode` 플래그를 잃어, 그 뷰로 착수한 세션이 시작 당시와 다른 permission mode로 돌아올 수 있던 결함이 수정되었습니다. 이는 실행 모드를 실행 플래그로 가정하지 말고 **실측**해야 한다는 위 ★ v2.1.257 프로젝트-scope `defaultMode` 노트를 확장하는 또 다른 사례입니다 — `claude agents`로 위임한 무인 실행은 auto-update 이후 유효 모드를 원래 지정한 `--permission-mode`가 아니라 다시 확인합니다.
|
|
546
|
+
|
|
541
547
|
> **cross-ref (v1.1.50 실측)**: R018의 `maxTurns` partial 표시(v2.1.246)가 R020 「Verification-Delegation Non-Termination」 mid-step 종료 패턴의 **실재 원인 중 하나로 확정**되었다 — 위임 프롬프트에 종료 금지 clause를 아무리 강화해도, 절단 주체가 플랫폼 turn 한도이면 에이전트에 닿지 않는다. 위임 경계를 단일 목표로 분할하는 것(R020 해당 조항)이 여전히 1차 방어선인 이유다. 상세는 R018 (MUST-agent-teams.md) Member Completion Verification 섹션.
|
|
542
548
|
|
|
543
549
|
## Agent Capability Pre-Check
|
|
@@ -625,7 +631,8 @@ After restart/compaction: re-read CLAUDE.md, all delegation rules still apply. N
|
|
|
625
631
|
| Kotlin/Spring | lang-kotlin-expert / be-springboot-expert |
|
|
626
632
|
| Architecture docs | arch-documenter |
|
|
627
633
|
| Test strategy | qa-planner |
|
|
628
|
-
| CI/CD, GitHub config | mgr-gitnerd |
|
|
634
|
+
| CI/CD workflow files, GitHub config (branch protection, secrets) | mgr-gitnerd — `gh run rerun` is GitHub metadata, see next row |
|
|
635
|
+
| GitHub metadata only (issue create/comment/label/milestone, `gh run rerun`, read-only `gh` queries) | Orchestrator (direct) or mgr-gitnerd — see Rules bullet below |
|
|
629
636
|
| Docker/Infra | infra-docker-expert |
|
|
630
637
|
| Server deployment (docker, scp) | infra-docker-expert |
|
|
631
638
|
| Server state changes (restart, env) | infra-docker-expert |
|
|
@@ -638,6 +645,7 @@ After restart/compaction: re-read CLAUDE.md, all delegation rules still apply. N
|
|
|
638
645
|
- Use specialized agents, not general-purpose, when one exists
|
|
639
646
|
- general-purpose only for truly generic tasks (file moves, simple scripts)
|
|
640
647
|
- No exceptions for "small" or "quick" changes
|
|
648
|
+
- GitHub 메타데이터 작업(이슈 생성·코멘트·라벨·마일스톤, `gh run rerun`, 읽기 전용 `gh` 조회)은 프로젝트 파일 쓰기가 아니므로 오케스트레이터 직접 실행이 허용됩니다 — 위임도 허용되며, PR 생성·머지와 로컬 git 상태 변경은 계속 mgr-gitnerd 소유입니다 (Origin: #1683 찐빠 #6 — CI 재실행 4회·이슈 2건·코멘트 1건을 직접 실행했으나 소유 에이전트가 미명시였던 경계 모호).
|
|
641
649
|
|
|
642
650
|
### Protected Paths (mgr-creator Required)
|
|
643
651
|
|
|
@@ -135,6 +135,10 @@ Reference: #1320 (fix), #1321 (session 113 retrospective 찐빠 #1), `feedback_l
|
|
|
135
135
|
|
|
136
136
|
> **v2.1.265/267+**: 병렬/백그라운드 배치의 비용 모델에 영향을 주는 prompt-cache 안정성 수정 다수입니다. (265) 전경(foreground)으로 스폰된 subagent를 재개(resume)하면 그 에이전트의 tool 목록과 system prompt prefix가 바뀌어 prompt-cache 재사용이 깨지던 결함이 수정되었습니다. (267) 대화에서 fork된 background worker가 세션 도중 대화의 tool 블록에 `EnterWorktree`를 추가하던 결함(cache 단절), `ToolSearch`가 없는 세션에서 세션 도중 추가된 MCP/plugin tool이 tool 목록에 즉시 실려 cache가 단절되던 결함(지원 모델은 이제 deferred definition으로 전달받음), `/model`로 모델을 전환하면 모든 tool 정의를 다시 전송해 cache miss가 발생하던 결함이 수정되었습니다. 이 규칙의 비용 모델에 대한 함의: 구버전에서는 fork/resume이 prefix를 바꿀 때마다 위 v2.1.229 prefix-stagger 이점이 조용히 소실됐으므로, 그 시기 버전에서 측정된 "병렬 신규 스폰"과 "long-lived 재사용"(아래 Fable 5 노트) 간 비용 차이는 현행 동작과 비교 불가합니다. 또한 (261) background agent가 재개(resume)되지 못하고 wake-up이 tight loop로 재시도되며 CPU가 지속 고점유되던 결함이 수정되었습니다 — 구버전에서는 병렬 배치 중 CPU 포화가 배치 자체가 아니라 재개 불가한 background agent에서 비롯될 수 있었습니다(「파일 disjoint ≠ 자원 disjoint」 CPU 행과 교차 참조).
|
|
137
137
|
|
|
138
|
+
> **v2.1.269/271+**: (269) `CLAUDE_CODE_WORKFLOW_MAX_CONCURRENT_AGENTS`가 신설되어 Workflow 스크립트가 한 번에 실행하는 agent 수를 상한할 수 있습니다. (271) dynamic workflow는 usage limit에 도달하면 이제 agent를 실패시키는 대신 **일시정지 후 한도 리셋 시 재개**합니다. 이 규칙의 "Max instances 5 concurrent (soft default 4)" cap과의 관계: 플랫폼 env var는 **Workflow-tool fan-out에만** 적용되므로, R009의 cap은 Agent-tool 스폰을 규율하고 이 env var는 Workflow 스크립트 내부의 `parallel()`/`pipeline()`을 규율합니다 — 둘 다 일관되게 설정합니다. 또한 (269) 응답이 output-token 절단에 걸린 뒤 prompt cache가 무효화되어 이어지는 턴이 전체 prefix 비용을 다시 지불하던 결함이 수정되었습니다 — 위 v2.1.229 stagger 노트와 결합하면, 병렬 형제는 이제 절단된 응답 이후에도 캐시 재사용을 유지합니다.
|
|
139
|
+
|
|
140
|
+
> **v2.1.273+**: (273) `scheduled_tasks.json`이 worktree-isolated 실행에 복사되어, 예약 작업이 **엉뚱한(worktree) 세션에서** 발동할 수 있던 결함이 수정되었습니다. worktree 병렬 위임(`isolation: "worktree"`)에 대한 함의: 273 이전에는 메인 세션에서 armed한 cron/예약 작업이 형제 worktree 에이전트의 컨텍스트에서 실행될 수 있었는데, 이는 이 규칙의 "Instance independence — Isolated context, no shared state" 행이 전제하지 않은 숨은 공유 상태 채널입니다 — 273+에서는 예약 작업에도 이 격리가 적용됩니다. ground-truth 원칙(R020)은 그대로 유지합니다 — 273 이전 버전에서 worktree 에이전트의 "예약 작업이 실행됐다"는 보고는 잘못 라우팅된 메인 세션 작업일 수 있습니다.
|
|
141
|
+
|
|
138
142
|
> **Fable 5 long-lived subagent reuse (Origin: #1435)**: Fable 5는 long-lived subagent 재사용(단일 subagent가 여러 단계를 이어서 수행)에 강함 — 현행 R009 병렬 실행 원칙과 상충하지 않으며, Fable 5 실행 시 short-lived 병렬 다수 대신 long-lived 재사용도 유효한 선택지. 상세는 `guides/claude-code/16-fable5-prompting.md`.
|
|
139
143
|
|
|
140
144
|
## Adaptive Parallel Splitting
|
|
@@ -110,6 +110,14 @@ Use a `"*"` deny rule in `settings.json` to enforce a deny-by-default posture, t
|
|
|
110
110
|
|
|
111
111
|
> **v2.1.265/267+**: (265) `.claude` 폴더 권한 옵션의 설명 문구가 실제 동작과 일치하도록 수정되었습니다 — 프로젝트의 `.claude` 폴더(또는 `~/.claude`) 파일을 해당 세션 동안 편집 허용한다는 뜻입니다. 또한 백슬래시가 포함된 플러그인 경로가 macOS/Linux에서 symlink containment 검사를 우회할 수 있던 결함이 수정되었습니다. (267) managed `allowedHttpHookUrls`, `httpHookAllowedEnvVars`, `allowedChannelPlugins` 설정이 읽기 불가 상태일 때 이제 **아무것도 허용하지 않도록**(이전에는 전부 허용) fail-closed로 바뀌었습니다 — 위 (259) managed-settings 파싱 실패 시 시작 거부 방향과 같은 계열입니다. fetched marketplace 항목 경로에 백슬래시가 포함되어 containment를 우회하던 결함도 함께 수정되었습니다. HTTP hook allowlist 항목은 R021(훅) 교차 참조.
|
|
112
112
|
|
|
113
|
+
> **v2.1.268 → 273 (도입 후 롤백, 네 번째)**: (268) `env -C`, `eval` 등 권한 검사기가 분석할 수 없는 명령이 같은 줄에 있으면 Read/Edit deny 규칙이 적용되지 않던 결함이 수정되었으나, **273이 이를 롤백**했습니다 — `time -p make build` 같은 명령이 거부되는 대신 다시 프롬프트됩니다. 이 파일에서 네 번째로 관측되는 "도입 후 롤백" 사례입니다(v2.1.232/233, v2.1.259→260에 이어). 또한 (268) macOS의 `/etc`, `/tmp`, `/var`, Linux의 `/bin`처럼 symlink된 디렉토리에 대한 deny/ask 규칙이 경로를 실제 위치(real location)로 표기했을 때 적용되지 않던 결함, 그리고 Bash 명령이 symlink 경로 표기로 작성된 deny 규칙을 무시하던 결함이 수정되었습니다(경로 표기 우회 계열 — 위 v2.1.233 `\??\`, v2.1.251 (c)(d)와 동류). 이 저장소 관련성: 이 저장소의 훅은 `/tmp` 아래에 PPID 스코프 마커를 씁니다(R010 carve-out) — macOS에서 `/tmp`는 symlink이므로, 268 이전에는 `/tmp/...`로 적은 deny 규칙이 `/private/tmp/...`를 커버하지 못했습니다.
|
|
114
|
+
|
|
115
|
+
> **v2.1.269/270+**: (269) `!`로 시작하는 deny/ask permission rule이 그 규칙을 작성한 settings 소스 범위를 넘어 적용되던 결함이 수정되어, 이제 **자기 소스 내에서만** 적용되고 단독 `!` 부정은 무시됩니다. `Edit()` deny 규칙과 write-path 검사가 Bash `tee`가 쓰는 파일에는 적용되지 않던 결함, `Bash(tee:*)` allow 규칙이 작업 디렉토리 밖 목적지까지 커버하던 결함도 수정되었습니다. `--output-format stream-json`의 `permission_denials`가 경로-스코프 deny 규칙에 막힌 Read/Edit/Write 호출을 누락하던 결함도 수정되었습니다(`-p` 실행의 거부 텔레메트리가 과소 계상되고 있었습니다). (269) **회귀**: 세션이 한동안 실행된 뒤 Bash의 read-only git 명령이 예상치 못하게 권한을 요청하던 결함이 270에서 수정되었습니다 — 269 단독 세션에서 갑자기 git 권한 프롬프트가 뜬 것은 settings 변경이 아니라 플랫폼 회귀였습니다.
|
|
116
|
+
|
|
117
|
+
> **v2.1.271+**: Bash 권한 검사 하드닝 5건입니다 — (a) 검사기가 인식하지 못하는 옵션 뒤에 `fmt`, `column` 등의 명령이 읽는 파일이 누락되던 결함, (b) 와일드카드가 패턴이나 옵션 값 안에 있을 때(예: `grep -v dir/* file`) 그 와일드카드가 확장하는 파일들이 누락되던 결함, (c) 셸 변수 선언 플래그가 실행 중인 명령을 잘못 나타낼 수 있던 결함, (d) 디렉토리 변경 2회, 서브셸, 또는 `cd`+`git` 체인을 가진 명령이 bypass·auto 모드의 `permissions.blockReadsOutsideWorkingDirectories`에서 프롬프트를 건너뛰던 결함이 각각 수정되었습니다. (e) 신규 기능으로 auto mode의 샌드박스에서 Bash/PowerShell/Monitor에 대해 **명령 단위 `allowed_domains`**가 도입되어, 명령이 필요로 하는 호스트가 그 명령과 함께 검토되고 그 명령에만 열립니다. 위 v2.1.251/257의 5건 묶음 노트와 같은 계열입니다 — 한 릴리즈에 다수 우회가 몰려 있으므로, 권한 검사는 계속 defense-in-depth로만 취급합니다.
|
|
118
|
+
|
|
119
|
+
> **v2.1.273/274+**: (273) 권한 검사기가 완전히 분석할 수 없는 Bash 명령이 `permissions.blockReadsOutsideWorkingDirectories`에서 프롬프트를 건너뛰던 결함, bypass 모드에서 서브셸이 위험한 `rm`을 숨길 수 있던 결함이 수정되었습니다(R001 파괴적 명령 교차 참조). macOS에서 드래그 앤 드롭한 스크린샷이나 시스템이 두 번째 경로로 보고하는 파일에 대해 Read가 "symlink resolution changed after permission was checked"로 거부하던 결함도 수정되었습니다(위 v2.1.251 (c) TOCTOU 가드의 오탐이었지, 우회가 아니었습니다). (274) 특정 특수 셸 변수를 반복문에서 쓰거나 대입하는 Bash 명령이 이제 권한을 요청합니다(위 v2.1.251 (a) `OPTIND=`/`RANDOM=` 노트의 확장). 워크트리 격리 세션이 특정 중첩 셸 확장을 포함한 Bash 명령을 이제 **거부**합니다 — 위 v2.1.257 (e)의 완화와 반대 방향으로 움직였다는 점에 유의합니다. R009 워크트리 위임에서 복합 확장이 다시 거부될 수 있으니, 격리 결함으로 진단하지 말고 명령을 단순화합니다.
|
|
120
|
+
|
|
113
121
|
> **v2.1.238+**: Bash 도구의 permission 검사가 zsh 전용 조건문(shell conditional) 문법에 대해 추가로 개선되었습니다. 이는 위 v2.1.221 "zsh `[[ ]]` 정규식 조건문 안에서 숨겨진 명령이 권한 검사를 우회"의 **직접 연장선**입니다 — "개선"으로만 기술되어 있어 v2.1.221 수정이 완전 해결이 아니었거나 추가 우회 벡터가 있었음을 시사합니다. 이 저장소의 Bash 도구 실행 셸이 zsh이므로(R005 #1540 실측) 직접 관련됩니다.
|
|
114
122
|
|
|
115
123
|
> **v2.1.246/248+**: (246) 끝에 매달린 `&&`/`||`가 있는 손상된(malformed) 명령에 대해 Bash 권한검사가 이제 **항상 승인을 요구**합니다 — 구버전에서는 이런 형태가 검사를 우회할 수 있었습니다. (248) `--restricted`(또는 `CLAUDE_CODE_RESTRICTED=1`) 모드가 신설되어 명령/코드 실행 도구와 `WebFetch`를 제거하고(`--tools`에 명시 시 예외), 파일 도구를 작업 디렉토리 내부로 제한하며, `bypassPermissions`를 거부하고, user/project/local settings 파일을 무시합니다. 이 저장소는 프로젝트 settings에 `bypassPermissions`를 선언하지만 v2.1.257부터 그 선언은 무시되므로(R010 Universal bypassPermissions의 ★ v2.1.257 노트 — 2026-09-02 실측 유효 모드는 user settings `auto`), `--restricted`와의 상호 배타성은 **user/managed scope에서 bypass를 켠 경우에 한해** 성립합니다 — 이 저장소 워크플로우에는 적용하지 않되, 신규 안전 모드 옵션으로 존재를 기록합니다.
|
|
@@ -45,6 +45,10 @@ The following git commands have caused working tree loss in past sessions (#1146
|
|
|
45
45
|
|
|
46
46
|
> **v2.1.260/265/267+**: (260) `!` bash-mode 프롬프트에서 직접 입력한 명령은 strict sandbox mode에서도 샌드박스 **밖에서** 실행됩니다 — 즉 위 「Standing User-Deny + Classifier Block」섹션의 "`!`로 사용자에게 넘기는" 패턴은 설계상 **비샌드박스 경로**임을 명시적으로 인지해야 합니다. (265) macOS/Linux에서 백슬래시를 포함한 플러그인 경로가 symlink containment 검사를 우회하던 결함, (267) fetched marketplace entry 경로에 대한 동일 계열 결함이 각각 수정되었습니다 — 둘 다 v2.1.233 `\??\` device prefix 노트와 같은 **경로 표기 우회 계열**(같은 위치를 다르게 표기해 검사를 피함)입니다. 또한 (259) 동시 세션이 서로의 `~/.claude.json` 변경(workspace trust 초기화, MCP/project state 유실)을 조용히 되돌리던 결함도 수정되었습니다 — 공유 워크트리 다중 세션 실행 시 관련됩니다.
|
|
47
47
|
|
|
48
|
+
> **v2.1.268+**: 자격증명 노출 결함이 두 방향에서 수정되었습니다 — 플러그인/마켓플레이스 오류가 git 소스 URL에 담긴 토큰·비밀번호를 표시하던 결함, `/mcp`·`/plugin` 서버 상세·`claude mcp list`/`get`·MCP 로그인 오류가 MCP config의 `${VAR}` placeholder를 **해석된 값**으로 표시하던 결함(274에서 MCP connection 오류·MCP 로그인 도구 설명까지 동일하게 수정). 이 섹션의 "자격증명 저장소 덤프 금지"와 동일한 위협 클래스입니다 — 구버전에서는 MCP 오류 메시지를 트랜스크립트나 이슈에 붙여 넣는 것만으로 해석된 시크릿이 함께 노출될 수 있었으므로(위 v2.1.232 GitLab 토큰 redaction 노트와 동일 원칙), 과거 로그를 공유하기 전 이 점을 확인합니다. 또한 (268) Bash 샌드박스 안내 문구가 실제보다 격리를 과장 서술하던 결함 — filesystem isolation이 꺼진 상태에서 경로 목록을 표시하거나, strict mode가 "명령이 샌드박스 밖에서 절대 실행되지 않는다"고 주장하던 사례 — 이 수정되었습니다. 샌드박스 안내 문구를 보장으로 취급하지 않습니다(위 `!` bash-mode 비샌드박스 경로 노트 cross-ref).
|
|
49
|
+
|
|
50
|
+
> **v2.1.271/273/274+**: (273) bypass 모드에서 subshell 안에 숨긴 위험한 `rm`이 프롬프트를 우회하던 결함이 수정되었습니다(위험한 `rm` 프롬프트 계열: v2.1.261 positional parameter·`sh -c` 커버리지의 연장선). (274) 멀티바이트 문자가 포함된 파일에서 Edit 권한 프롬프트 미리보기가 실제 승인 대상과 **다른 위치**를 보여주던 결함이 수정되었습니다 — 이 파일 시리즈(v2.1.223/234/236/238/257)의 **여섯 번째** 승인 다이얼로그 무결성 결함이며, 멀티바이트 문자 전반에 대한 결함(한글 포함)이라 이 저장소의 룰·위키가 한글로 작성되므로 직접 영향을 받는 첫 사례입니다 — 구버전에서는 한글 파일의 Edit 미리보기가 엉뚱한 줄을 가리킬 수 있었습니다. Pre-Delegation Blast-Radius Enumeration(모델이 파괴 대상을 별도 열거)은 여전히 1차 방어선입니다. (271) 샌드박싱된 auto mode에 명령별 `allowed_domains`가 추가되어(cross-ref R002), 세션 전체 네트워크 허용보다 좁은 egress 승인이 가능해졌습니다.
|
|
51
|
+
|
|
48
52
|
### Pre-Delegation Blast-Radius Enumeration
|
|
49
53
|
|
|
50
54
|
> Origin: #1307 찐빠 #1 (High) — user chose "discard local changes and pull", and `git reset --hard origin/develop` was delegated immediately → user rejected (interrupt). The blast radius — that "discard local changes" included 18 files of *intended* uncommitted work (rule edits, new skills, new guides), not just a version downgrade — was never enumerated for the user.
|
|
@@ -85,11 +85,14 @@ Wiki verification is also enforced by CI (`.github/workflows/wiki-sync.yml`).
|
|
|
85
85
|
|
|
86
86
|
**(b) 누락 방지**: `bun run build` 실행 후 `git status --short`에 **tracked 변경(`^ M`)이 남아 있으면 스테이징 누락**이다. 커밋 직전 tracked 변경이 0인지 확인한다.
|
|
87
87
|
|
|
88
|
+
**(c) untracked 신규 산출물 실측 (Origin: #1660 찐빠 #3)**: 커밋 위임서를 작성하기 직전 `git status --short | grep '^??'`로 untracked 목록을 실측하고, 위임서에 **포함할 신규 파일과 제외할 파일을 경로로 명시**합니다. `git add -u`나 "변경분을 커밋하라"만 지시하면 서브에이전트가 만든 신규 테스트·스크립트·픽스처가 커밋에서 빠지고, 반대로 광범위 `git add`는 이전부터 존재하던 무관한 untracked 파일(계획 문서·로컬 캐시 등)을 끌어들입니다. (a)·(b)가 tracked/gitignored 경로를 다룬다면 (c)는 그 사이의 **untracked 경로**를 다룹니다.
|
|
89
|
+
|
|
88
90
|
| Anti-pattern | Required |
|
|
89
91
|
|--------------|----------|
|
|
90
92
|
| 빌드 후 광범위 `git add`로 커밋 → gitignored `dist/` force-add 위험 | 커밋 직전 `git diff --cached --name-only` 실측으로 빌드 산출물 부재 확인 |
|
|
91
93
|
| .gitignore에 있으니 안전하다고 가정 | force-add 경로는 .gitignore를 우회하므로 실측 필요 |
|
|
92
94
|
| `dist/` 미포함만 확인하고 커밋 → 빌드가 갱신한 tracked 산출물 누락 | `git status --short`로 tracked 변경 잔존 0 확인 |
|
|
95
|
+
| `git add -u`만 지시하거나 untracked 목록 미실측 → 신규 테스트 파일 누락 또는 무관 파일 혼입 | 위임 직전 `git status --short \| grep '^??'` 실측 → 포함/제외 경로를 위임서에 명시 |
|
|
93
96
|
|
|
94
97
|
Origin: #1512 (v1.1.28 커밋 staging에 dist/ 2파일 포함, 커밋 전 실측으로 정정; v1.1.12 dist/ untrack 회귀 방지); #1531 (`.omcustom.lock.json`이 v1.1.29 이후 4개 릴리즈 연속 누락 — 혼입 방지 단방향 조항의 반대편 공백). Cross-ref: R020 (완료 검증 — "실행됨 ≠ 성공").
|
|
95
98
|
|
|
@@ -190,6 +193,8 @@ Origin: #1492 (Session 132) — cc-release-monitor 워크플로우 삭제(#1454,
|
|
|
190
193
|
|
|
191
194
|
Origin: #1595 #1 (v1.1.48 세션 — 세션 시작 시 `develop @ 1b4973d5` 실측 후 진행했으나 다른 세션이 14:56·15:10에 `feat/agora-anonymous-consensus`를 만들고 커밋 2개를 쌓았고, wiki 재동기화 Phase 2까지 미탐지. 같은 세션에서 `git ls-files tests/fixtures/agora/`가 초반 0건 → 후반 6건으로 바뀌었다). Cross-ref: R010 「저장소 상태 기재도 같은 규율」(위임서 기재 각도), R011(Temporal Decay).
|
|
192
195
|
|
|
196
|
+
> **v2.1.269/271+**: (269) compaction 이후 시스템 컨텍스트에 표시되는 git status가 **세션 시작 시점 스냅샷이 아니라 현재 상태**로 바뀌었습니다 — 269 이전에는 compaction 후 세션이 stale한 branch/HEAD 스냅샷으로 추론할 수 있었고, 이는 정확히 위 「게이트는 분기 시점 1회가 아니라 상태변경 위임마다」가 경고하는 실패입니다. 상태변경 위임 직전마다 재실측하는 규범은 유지됩니다(이 수정은 staleness 원인 하나를 제거할 뿐, 공유 워크트리의 다른 행위자로 인한 staleness는 여전히 존재합니다). (271, Linux only) 샌드박스 명령이 시작에 실패한 뒤 남은 낡은 `.git/config.lock`이 세션 나머지 동안 `git checkout -b`/`git push -u`/`git config`를 깨뜨리던 결함이 수정되었습니다 — Darwin(이 저장소 기본 환경)은 미해당이며 Linux CI/컨테이너 실행에 관련됩니다; 271 이전 Linux에서 위임받은 git 에이전트가 "config.lock exists"를 만나면 `rm`으로 자체 우회하지 말고 보고해야 합니다(R001). (271) `/cd` 이후 `/reload-skills`가 슬래시 메뉴와 다른 스킬 개수를 보고하던 결함이 수정되었습니다 — 그래도 「Count Sync」의 권위 있는 스킬 카운트 소스는 여전히 `ls -1d .claude/skills/*/ | wc -l`이며, `/reload-skills` 메시지를 신뢰 가능한 카운트 ground-truth로 삼지 않습니다.
|
|
197
|
+
|
|
193
198
|
## Pre-Release Target Version Ground-Truth Gate (Origin: #1457)
|
|
194
199
|
|
|
195
200
|
새 릴리즈의 target 버전을 선정하거나 구현/구현-위임 프롬프트에 target 버전을 전달하기 전, 반드시 원격 실측으로 다음 버전을 확정한다: `git tag --sort=-v:refname | head -1`(최신 태그) + `npm view <pkg> version`(배포된 최신)의 **max에 patch를 더한 값**을 target으로 삼는다. 세션 메모리의 버전 스냅샷(예: "npm latest 1.1.6")은 **참고용이며 ground-truth가 아니다** — 직전 세션에서 릴리즈가 진행돼 stale일 수 있다. stale 버전으로 위임하면 이미 배포된 버전을 target으로 잡아 milestone-closed STOP에 걸리고 재타겟팅 왕복이 강제된다.
|
|
@@ -96,6 +96,10 @@ Active removal of irrelevant retrieved content from agent context. Complements o
|
|
|
96
96
|
|
|
97
97
|
> **v2.1.261+**: 컨텍스트 비용 진단 도구 2종이 추가되었습니다. `/skill-doctor`는 로드된 스킬 중 사용되지 않는 것과 그 컨텍스트 비용을 표시해 가지치기 대상을 알려줍니다 — 이 저장소의 115개 스킬 열거 블록과 `profile` 스킬의 플러그인 세트 전환에 직접 관련됩니다. `bashOutputMaxChars`/`taskOutputMaxChars` 설정은 command·background-task 출력이 파일로 저장되기 전 모델에 인라인 전달되는 상한을 올릴 수 있습니다(최대 128K자). 지침: 이 상한을 기본값으로 올리지 않습니다 — 이 규칙의 압축 원칙(파일 목록 → 개수, 오류 트레이스 → 앞/뒤 줄)이 작은 인라인 출력을 선호하므로, pass/fail 라인이 잘리는 특정 검증에 한해서만 올리고 그 외에는 독립적인 exit-code 조회(R005 #1492)를 우선합니다.
|
|
98
98
|
|
|
99
|
+
> **v2.1.269/273+**: (269) auto-compaction이 요약할 완전한 이전 대화 교환이 없을 때(주로 매우 큰 프롬프트를 쓰는 SDK 세션) "Prompt is too long"으로 세션이 영구적으로 멈추던 결함이 수정되었습니다. (273) context meter와 auto-compact가 advisor-tool 턴을 실제 컨텍스트 크기의 약 **2배**로 계산해 auto-compact가 실제 창의 약 **절반** 지점에서 발동하던 결함이 수정되었습니다 — 이 규칙의 백분율 임계값에 대한 함의: 273 이전 2.1.2xx에서 advisor tool을 쓴 세션은 CTX% 수치와 auto-compact 시점이 최대 2배 부풀려져, 그 수치에 근거한 예산 판단이 의도치 않게 보수적이었습니다; 273+에서는 미터를 다시 신뢰할 수 있습니다(cross-ref R012 statusline CTX 세그먼트).
|
|
100
|
+
|
|
101
|
+
> **v2.1.274+**: (274) 훅 주도 세션(활성 `/goal` 등)이 컨텍스트가 다시 넘칠 때 reactive compaction 후 compact 대신 "Prompt is too long"으로 종료되던 결함이 수정되었고, compact된 세션을 재개할 때 활성 `/goal`이 더 이상 소실되지 않습니다(둘 다 `/goal`을 감싸는 `/fsd`와 직결). (274) 메모리 사용량이 치명적일 때 메모리를 확보하거나 안전하게 재시작하는 절차와 함께 가시적 경고가 표시됩니다 — 위 v2.1.238 unbounded-memory 노트와 짝짓습니다: 이제 메모리 압박이 느려짐으로만 암시되지 않고 표면화됩니다. (274) headless/SDK 세션이 완료된 background task마다 별도 모델 호출을 하던 것이, 이제 이미 큐에 쌓인 완료분을 한 번의 호출로 응답합니다(`-p` 아래에서 도는 R009 fan-out의 직접적인 토큰 절감).
|
|
102
|
+
|
|
99
103
|
<!-- DETAIL: Context Budget Management
|
|
100
104
|
|
|
101
105
|
Task-type-aware context thresholds that trigger ecomode earlier for context-heavy operations.
|
|
@@ -95,6 +95,8 @@ Trade-offs: RS256 is ~10x slower than HS256 but enables asymmetric key managemen
|
|
|
95
95
|
|
|
96
96
|
> **v2.1.238+**: custom/project/plugin output style이 **세션 도중 default voice로 드리프트**하던 결함이 수정됐다. 이 저장소는 `korean-engineer` 커스텀 output style을 상시 활성화하므로 직접 해당한다 — 세션이 길어지면 격식체(R000 합쇼체)가 조용히 기본 voice로 돌아갈 수 있었다는 뜻이다. **회고적 함의**: 구버전에서는 세션 길이에 비례해 스타일 드리프트 위험이 있었으므로, 과거 세션에서 관측된 R000 합쇼체 이탈(feedback_honorific_register_drift 등)을 전부 모델의 규칙 위반으로만 귀속할 수 없다 — 일부 구간은 플랫폼 드리프트가 원인이었을 수 있다. **다만 이것을 면책으로 쓰지 말 것**: R000 준수 의무는 그대로이며, 이는 과거 관측의 재해석 근거일 뿐 향후 이탈을 정당화하지 않는다.
|
|
97
97
|
|
|
98
|
+
> **v2.1.269+**: `/output-style [name]`이 output style을 목록 조회·전환할 수 있게 되었으며, Remote Control과 cloud/headless 세션에서도 동작합니다. 이 저장소의 `korean-engineer` 커스텀 스타일을 세션 도중 `/output-style korean-engineer`로 재선택·재확인할 수 있게 되어, 위 v2.1.238-era 드리프트에 대한 직접 구제 수단이 생겼습니다 — `-p`/cloud 실행에서는 스타일이 실제로 활성 상태인지를 기본값에 의존하지 않고 보장하는 방법이기도 합니다. 참고로 (271) `--resume`/`/teleport` 관련 결함 수정은 R011 소관이므로 여기서 중복 서술하지 않습니다.
|
|
99
|
+
|
|
98
100
|
## Unverifiable External Product UI
|
|
99
101
|
|
|
100
102
|
> Origin: #1266 ② (High) — described Cloudflare Access "Add an application" Subdomain/Domain/Path fields as fact; the user found no such fields ("어디에도 없다").
|
|
@@ -348,6 +348,8 @@ Temporal Decay(시간 경과 기반)와 Attention-Weight Tiering(접근 빈도
|
|
|
348
348
|
- 세션 종료: 이번 세션 참조 여부 기반 tier 재평가 → archive 이동 실행
|
|
349
349
|
- archive 이동 시: `sessions_archive_*.md`에 append, MEMORY.md에 인덱스 라인 유지
|
|
350
350
|
|
|
351
|
+
**위임서 표준 문안 (Origin: #1660 하네스 제안)**: sys-memory-keeper에 세션 메모리 갱신을 위임할 때 위임서에 "**압축·정리·티어 재평가 불요 — 지시한 항목만 기록**"을 명시합니다(정리가 필요하면 별도 위임으로 분리). 명시하지 않으면 에이전트가 자체적으로 MEMORY.md 압축을 목표에 추가해 턴 예산을 소진합니다 — v1.1.63 반복(#1660)에서 이 원인으로 15턴 절단이 2회 발생했습니다(R020 「maxTurns 절단 실증」의 메모리 위임 각도). 위 Tier 승강·archive 이동은 세션 종료 시 **별도 단일 목표 위임**으로 수행합니다.
|
|
352
|
+
|
|
351
353
|
## Mid-Session Immediate Save
|
|
352
354
|
|
|
353
355
|
Save memory IMMEDIATELY upon surprising discovery — do not defer to session end.
|
|
@@ -491,4 +493,8 @@ References: #1226 (item 3), #1227.
|
|
|
491
493
|
|
|
492
494
|
> **v2.1.232+**: Cowork 세션이 **user-scope 메모리 파일의 외부 @-import를 인라인하지 않습니다**. 즉 `~/.claude/agent-memory/`의 MEMORY.md가 @-import로 외부 파일을 끌어오는 구조라면 세션 종류에 따라 그 내용이 컨텍스트에 없을 수 있으므로, 항상 로드되어야 하는 내용은 import 참조가 아니라 **MEMORY.md 본문**에 둡니다(위 200줄 예산 내 Hot/Warm 배치 원칙과 정합).
|
|
493
495
|
|
|
496
|
+
> **v2.1.268+**: (268) MEMORY.md truncation 경고가 이제 **몇 줄이 잘렸는지와 잘린 시작 위치**를 함께 표시합니다 — 위 「200줄 MEMORY.md 예산과의 연계」의 결정론적 트리거입니다: 이 경고가 뜨면 Cold 항목을 archive로 이동해야 합니다. (268) `/compact`와 auto-compact가 만드는 대화 요약이 `$` 시퀀스를 포함한 텍스트를 훼손하던 결함이 수정되었습니다 — 구버전에서 셸 스니펫(`$?`, `${PIPESTATUS[0]}`, `$PPID`)을 담은 compaction 요약은 손상됐을 수 있으므로, compact 이후의 요약을 근거로 "실제 실행된 명령"을 회상하는 것은 ground-truth가 아닙니다(cross-ref R005 zsh/`$?` 노트, R020). (268) `/compact`로 끝난 대화를 재개할 때 복원 파일 노트가 매 재개마다 동일한 순서로 로드되도록 수정되었습니다.
|
|
497
|
+
|
|
498
|
+
> **v2.1.271/273+**: (271) 대화가 compact된 뒤에도 계속 돌고 있던 백그라운드 명령(watch task, dev server)의 **중복 사본**이 새로 시작되던 결함이 수정되었습니다 — 구버전에서 post-compact 중복 프로세스는 지시가 아니라 compaction 아티팩트였습니다(cross-ref R010 dev-server tmux hard block). (271) `/resume`·`/teleport`가 이전 대화의 파일-읽음 추적을 그대로 유지해, 재개된 대화가 **한 번도 읽지 않은 파일**을 편집할 수 있던 결함이 수정되었습니다(cross-ref R005 v2.1.228 read-before-write 노트). (271) claude.ai에서 동기화된 스킬이 로그아웃 후에도 디스크에 남아있던 결함이 수정되어, `cleanupPeriodDays` 내 갱신되지 않은 사본은 이제 복구 가능한 휴지통으로 이동합니다. (273) `permissions.blockReadsOutsideWorkingDirectories`: 저장소 settings가 지정한 메모리 디렉토리는 더 이상 프롬프트에 로드·회상·색인·memory extraction에 사용되지 않습니다 — 이 규칙의 `autoMemoryDirectory`와 관련됩니다: 이 설정 하에서는 저장소가 지정한 메모리 디렉토리가 제외됩니다.
|
|
499
|
+
|
|
494
500
|
<!-- RETIRED (은퇴 릴리즈 v1.1.45, 보존 기준 v2.1.212 미만): > **v2.1.210+**: MEMORY.md 인덱스가 read limit을 초과하게 만드는 memory write는 이제 silent truncation 대신 명시적 오류를 반환합니다. write 실패는 여전히 non-blocking이지만, 오류 수신 시 log-warning으로 끝내지 말고 예산 초과 처리(Attention-Weight Tiering — Cold 항목 archive 이동)로 축소 후 재시도합니다 — 이전의 silent truncation을 가정하고 oversize write를 던지면 업데이트가 반영되지 않습니다. -->
|
|
@@ -176,6 +176,10 @@ Before invoking a Workflow script, deterministically verify:
|
|
|
176
176
|
|
|
177
177
|
> **v2.1.267+**: auto mode에서 **큰 출력 스키마**를 가진 Workflow `agent()` 호출이 safety classifier의 검토 대신 **거부**되던 결함이 수정되었습니다. 구버전에서 큰 스키마 `agent()` 호출의 거부는 classifier 판정이 아니라 플랫폼 크기 제약의 산물이었으므로, R010 Subagent Scope-Creep STOP Protocol의 trip 횟수에 계상하지 않습니다. 또한 (261) `bashOutputMaxChars`/`taskOutputMaxChars` 설정(최대 128K자)이 신설되어 명령/백그라운드 작업 출력이 파일로 저장되기 전 모델에 인라인으로 도달하는 양을 조정합니다 — Tier-1 검증 스크립트의 출력이 파일로 잘려 pass/fail 라인이 유실될 때 관련됩니다; 한도를 올리기보다 exit code를 단독으로 읽는 방식(R005 #1492)을 우선합니다.
|
|
178
178
|
|
|
179
|
+
> **v2.1.269+**: `claude plugin eval`이 플러그인의 eval suite를 Claude Code 자체로 실행해 점수화·재현 가능한 결과(JSON + HTML 리포트)를 냅니다 — 이 ladder에 스킬 품질 검증을 위한 새 Tier-1/2 도구가 추가된 것입니다(cross-ref `skill-creator`, R006). `CLAUDE_CODE_WORKFLOW_MAX_CONCURRENT_AGENTS`(1~256)가 신설되어 Workflow 도구의 실행당 동시 agent 한도를 조정할 수 있게 되었습니다 — 플랫폼 상한은 이제 설정 가능하지만, 이 저장소의 R009 정책 상한(동시 5, soft 4)은 그대로 적용됩니다. `--output-format stream-json`의 `permission_denials`가 경로 스코프 deny 규칙에 걸린 Read/Edit/Write 호출도 이제 포함합니다 — 구버전 `-p` 검증 실행에서는 이런 거부가 denial 계측에서 누락됐을 수 있습니다. `bashEditDiffEnabled`가 Bash 명령이 변경한 파일의 diff를 Bash 도구 결과에 함께 실어, 셸을 통한 편집을 Tier-1 결정론적으로 사후 점검할 수 있게 합니다.
|
|
180
|
+
|
|
181
|
+
> **v2.1.271/274+**: (271) `claude plugin install`/`update`에 `--accept-command <sha256>`이 추가되어, `-y`(blanket yes) 대신 이전 `--json` 실행이 표시한 명령을 정확히 그 sha256으로만 승인할 수 있습니다 — 콘텐츠 주소화된 결정론적(Tier 1) 승인이 blanket yes보다 우선됩니다. dynamic workflow가 usage limit에 도달하면 이제 agent를 드롭하는 대신 **일시정지 후 한도 리셋 시 재개**합니다(cross-ref 위 「Workflow Script Sanity Check」의 resume 관련 항목). (274) Monitor 도구 통지가 스크립트의 최종 출력과 exit을 **하나의 통지**로 묶어 전달합니다(모델 턴 절약). `CLAUDE_CODE_MCP_STARTUP_WAIT_MS`가 신설되어 첫 non-interactive 턴이 연결 중인 MCP 서버를 기다리는 시간을 제한합니다(`0`=대기 안 함) — Tier-1 검증용 `-p` 실행이 MCP 기동으로 지연되지 않아야 할 때 관련됩니다.
|
|
182
|
+
|
|
179
183
|
#### Common Violation (#1271)
|
|
180
184
|
Session 106 follow-up to #1266 ③: a Workflow authoring error recurred — the guardrail fact-sheet was concatenated onto the agent's RETURN VALUE instead of the prompt string, and a placeholder/assembly slip went uncaught because no pre-run sanity check existed. This check is the deterministic Tier-1 guard that catches such slips before the expensive run.
|
|
181
185
|
|
|
@@ -10,12 +10,14 @@ effort: high
|
|
|
10
10
|
|
|
11
11
|
# /omcustom:fsd — Full Self Driving
|
|
12
12
|
|
|
13
|
-
Autonomous release loop.
|
|
13
|
+
Autonomous release loop. Can be expressed as running:
|
|
14
14
|
|
|
15
15
|
```
|
|
16
16
|
/goal "모든 이슈가 처리될 때까지" /loop "/pipeline auto-dev -> /homework"
|
|
17
17
|
```
|
|
18
18
|
|
|
19
|
+
> The main conversation may also drive the same loop inline without invoking `goal`/`loop` — see 「인라인 실행 허용 — 계약과 실측의 정합 (#1683 #4)」 below.
|
|
20
|
+
|
|
19
21
|
This is a **thin alias / orchestrator skill**. It does not implement loop, issue-polling, release, or verification logic — it delegates entirely to existing skills.
|
|
20
22
|
|
|
21
23
|
## Usage
|
|
@@ -119,6 +121,19 @@ printf '%s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" > "/tmp/.claude-fsd-$PPID"
|
|
|
119
121
|
→ NO → next iteration (re-write marker first)
|
|
120
122
|
```
|
|
121
123
|
|
|
124
|
+
### 인라인 실행 허용 — 계약과 실측의 정합 (#1683 #4)
|
|
125
|
+
|
|
126
|
+
FSD의 루프 드라이버는 **메인 대화(오케스트레이터) 자신**입니다. `/goal`·`/loop`(ScheduleWakeup) 스킬 호출은 루프를 표현하는 한 방법일 뿐 필수 호출이 아니며, 오케스트레이터가 아래 최소 계약을 지키면 스킬 호출 없이 인라인으로 반복을 진행하는 것도 이 스킬의 정상 실행입니다. v1.1.64 반복이 인라인으로 실행된 것을 계약 이탈로 회고한 것(#1683 찐빠 #4)이 이 절의 기원이며, 같은 세션의 v1.1.65·v1.1.66 반복도 인라인으로 실행되었습니다(세션 실측, 이슈 범위 밖).
|
|
127
|
+
|
|
128
|
+
| 반복마다 지켜야 할 최소 계약 | 근거 |
|
|
129
|
+
|------------------------------|------|
|
|
130
|
+
| 반복 시작 시 무인 마커 갱신(`/tmp/.claude-fsd-$PPID`) | 위 「무인 모드 마커」 |
|
|
131
|
+
| `/pipeline auto-dev` 1회 → homework 아티팩트 1개 기록 → 열린 PR 처리 | 「Iteration Flow」 |
|
|
132
|
+
| 반복 끝에 수렴 판정(적격 이슈 0 AND 열린 PR 0)을 실측으로 수행 | R020 |
|
|
133
|
+
| 종료 경로와 무관하게 마커 제거(`command rm -f`) | 「무인 모드 마커」 |
|
|
134
|
+
|
|
135
|
+
`/goal`·`/loop`를 호출하는 경로는 여전히 유효하며, 세션이 무인(`claude -p`, 예약 실행)이라 자기 페이싱이 필요할 때 권장됩니다. 대화형 세션에서는 인라인 실행이 스킬 호출 오버헤드 없이 같은 계약을 만족합니다.
|
|
136
|
+
|
|
122
137
|
## Safety and Discipline
|
|
123
138
|
|
|
124
139
|
Each iteration operates under full project rules — no relaxation because FSD is autonomous:
|
|
@@ -209,6 +224,7 @@ This skill is intentionally a **thin alias**. It does NOT duplicate:
|
|
|
209
224
|
- Retrospective analysis (owned by `homework`)
|
|
210
225
|
- PR merge execution (owned by `mgr-gitnerd`)
|
|
211
226
|
- Completion verification (owned by R020 + `goal`)
|
|
227
|
+
- Loop driving itself — the main conversation may run the iteration inline (see 「인라인 실행 허용」); `goal`/`omcustom-loop` are optional expressions of the same contract
|
|
212
228
|
|
|
213
229
|
If any of those underlying skills evolve, FSD automatically benefits — its only responsibility is declaring the intent and forwarding to the right components.
|
|
214
230
|
|
|
@@ -50,19 +50,25 @@ Parse arguments:
|
|
|
50
50
|
|
|
51
51
|
Attempt deterministic transcript extraction. Preferred sources (in order):
|
|
52
52
|
|
|
53
|
-
1. **
|
|
53
|
+
1. **advisor 판정 재사용 계수 스크립트 (1순위, #1683 #2)** — 트랜스크립트 경로를 알 수 있으면 먼저 실행합니다:
|
|
54
|
+
```bash
|
|
55
|
+
bash scripts/count-r007-r008.sh "$TRANSCRIPT" --json
|
|
56
|
+
```
|
|
57
|
+
이 스크립트는 `.claude/hooks/scripts/r007-r008-drift-advisor.sh`를 턴 단위로 호출해 R007 헤더 누락·R008 접두사 누락 건수를 **훅과 동일한 판정식**으로 셉니다. 자체 정규식으로 재구현하지 않습니다 — v1.1.64 세션에서 자가 계수가 3회 연속 방법 오류(레코드 분리 미인지, 병합 키 불일치, 중첩 중복 계상)로 실패한 것이 기원이며, R020 「자가 계수는 advisor 판정식을 재현한다」가 규범입니다. 스크립트가 없거나 실패하면 아래 소스로 내려가되, 회고에 "advisor 재사용 계수 미수행"을 명시합니다.
|
|
58
|
+
|
|
59
|
+
2. **Grep for rule-violation markers** in the current conversation context:
|
|
54
60
|
- Safety classifier trip signals: `[Safety]`, `[R001]`, `[Warning]`, classifier denial messages
|
|
55
61
|
- Self-corrections: "sorry", "I made an error", "let me correct", "이전 답변 수정", "죄송합니다"
|
|
56
62
|
- Premature hypothesis signals: "I assume", "probably", "should be" followed by a contradiction in a later turn
|
|
57
63
|
- Interrupt + re-plan events: user corrections, "no", "wrong", "다시", "아니"
|
|
58
64
|
|
|
59
|
-
|
|
65
|
+
3. **Transcript files** (CC v2.1.x session JSONL):
|
|
60
66
|
```bash
|
|
61
67
|
find ~/.claude/projects -name "session-*.jsonl" -newer "$(date -v-1d +%Y-%m-%dT00:00:00)" 2>/dev/null | head -5
|
|
62
68
|
```
|
|
63
69
|
Parse `type: "error"`, `type: "correction"`, `type: "feedback"` events.
|
|
64
70
|
|
|
65
|
-
|
|
71
|
+
4. **Fallback**: Rely on the model's recall of the current conversation (impressionistic, lower confidence — mark findings as `[recall]` not `[transcript]`).
|
|
66
72
|
|
|
67
73
|
#### 2b. Linked Previous Sessions (when `--days` > 0)
|
|
68
74
|
|
|
@@ -224,7 +230,8 @@ This skill does NOT use `context: fork`. The fork cap is at 10/12; homework is a
|
|
|
224
230
|
|
|
225
231
|
## Limitations
|
|
226
232
|
|
|
227
|
-
- **Transcript availability**: CC `session-*.jsonl` schema may change; Phase 2a source (
|
|
233
|
+
- **Transcript availability**: CC `session-*.jsonl` schema may change; Phase 2a source (2) grep is more resilient than JSONL parsing.
|
|
228
234
|
- **Recall accuracy**: When transcript files are unavailable, findings are marked `[recall]` and confidence is lower.
|
|
229
235
|
- **episodic-memory dependency**: `--days` mode degrades gracefully when the plugin is unavailable (falls back to JSONL scan).
|
|
230
236
|
- **Scope**: This skill analyzes session behavior, not code quality. For code-quality retrospectives, use `dev-review` or `adversarial-review`.
|
|
237
|
+
- **Count fidelity**: only the advisor-reuse script (2a source 1) reproduces the hook verdict; sources 2–4 are approximations and must be labeled as such in the retrospective.
|
package/templates/manifest.json
CHANGED