oh-my-customcode 2.0.5 → 2.0.7
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 +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/templates/.claude/hooks/scripts/auto-continue-guard.sh +1 -1
- package/templates/.claude/hooks/scripts/r007-r008-drift-advisor.sh +13 -1
- package/templates/.claude/hooks/scripts/session-reflection.sh +5 -0
- package/templates/.claude/hooks/scripts/stall-detection-advisor.sh +10 -1
- package/templates/.claude/hooks/scripts/subagent-failure-advisor.sh +7 -1
- package/templates/.claude/hooks/scripts/task-outcome-recorder.sh +8 -2
- package/templates/.claude/ontology/graphs/agent-skill.json +1 -1
- package/templates/.claude/ontology/graphs/full-graph.json +4 -4
- package/templates/.claude/ontology/graphs/routing.json +2 -2
- package/templates/.claude/rules/MUST-agent-design.md +1 -1
- package/templates/.claude/rules/MUST-enforcement-policy.md +3 -3
- package/templates/.claude/skills/claude-native/SKILL.md +3 -3
- package/templates/.claude/skills/fsd/SKILL.md +2 -2
- package/templates/.claude/skills/hada-scout/SKILL.md +5 -5
- package/templates/.claude/skills/omcustom-feedback/SKILL.md +3 -3
- package/templates/.claude/skills/omcustom-loop/SKILL.md +4 -4
- package/templates/.claude/skills/pipeline/workflows/auto-dev.yaml +1 -1
- package/templates/.claude/skills/post-release-followup/SKILL.md +9 -9
- package/templates/.claude/skills/research/SKILL.md +5 -5
- package/templates/.claude/skills/scout/SKILL.md +5 -5
- package/templates/guides/claude-code/04-agent-skills.md +4 -0
- package/templates/guides/claude-code/15-version-compatibility.md +7 -7
- package/templates/manifest.json +1 -1
- package/templates/workflows/auto-dev.yaml +1 -1
package/dist/cli/index.js
CHANGED
package/dist/index.js
CHANGED
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@ set -euo pipefail
|
|
|
4
4
|
# Auto-Continue Guard
|
|
5
5
|
# Trigger: SubagentStop
|
|
6
6
|
# Purpose: Count consecutive subagent completions and warn when auto-continue limit reached
|
|
7
|
-
# Protocol: stdin JSON -> count check -> stdout pass-through, exit 0
|
|
7
|
+
# Protocol: stdin JSON -> count check -> stdout pass-through, the only explicit exit is exit 0 (R021); under set -u a corrupt counter file can exit 1 (non-blocking for SubagentStop)
|
|
8
8
|
|
|
9
9
|
input=$(cat)
|
|
10
10
|
|
|
@@ -20,7 +20,10 @@
|
|
|
20
20
|
# This is the PROACTIVE complement to the retroactive session-reflection.sh (Stop hook, #1190).
|
|
21
21
|
# Detection patterns are shared with session-reflection.sh.
|
|
22
22
|
#
|
|
23
|
-
# Advisory-only:
|
|
23
|
+
# Advisory-only: NEVER blocks. Exit status (MEASURED, bash 3.2, `set -euo pipefail`): rc=0 in every
|
|
24
|
+
# probe (4 hook events x valid/corrupt/missing transcript, plus malformed JSON, empty stdin, array and
|
|
25
|
+
# scalar payloads); the final statement is `exit 0` but the script is not trap-protected, so rc=0 is
|
|
26
|
+
# observed, not proven for all inputs.
|
|
24
27
|
#
|
|
25
28
|
# Scope gate (#1650 D): the advisor judges the ORCHESTRATOR's turns only. When the hook fires
|
|
26
29
|
# from INSIDE a subagent session (the payload carries `agent_id`) it exits immediately — see
|
|
@@ -227,6 +230,15 @@ JQ_LAST_TURN='
|
|
|
227
230
|
split("\n")
|
|
228
231
|
| map(select(length > 0) | (fromjson? // empty))
|
|
229
232
|
| map(select((.isSidechain // false) != true))
|
|
233
|
+
# (#1876) api-request-blob records carry a copy of the request message (role=assistant/user,
|
|
234
|
+
# no isSidechain) — they are NOT conversation lines. Left in, a trailing assistant blob is picked
|
|
235
|
+
# as $last and double-counts tool_use/announce blocks, and a user blob acts as a turn boundary.
|
|
236
|
+
# Denylist (not an allowlist on .type): in the review corpus, records with `.message.role` were type
|
|
237
|
+
# user 10606 / assistant 19846 / api-request-blob 351, none lacking `.type` (#1882 review).
|
|
238
|
+
# NOTE: this filter runs AFTER `tail -n 200`, so blob lines occupy part of the 200-line window. Review
|
|
239
|
+
# measurement: no false positives, only #1628 saturation-guard silence (judgment skipped when the
|
|
240
|
+
# window has no boundary). Do not reorder without re-measuring.
|
|
241
|
+
| map(select((.type? // "") != "api-request-blob"))
|
|
230
242
|
| . as $L
|
|
231
243
|
| ($L | length) as $n
|
|
232
244
|
| [ range(0; $n) | select($L[.].message.role? == "assistant") ] as $ai
|
|
@@ -167,6 +167,11 @@ JQ_REFLECT='
|
|
|
167
167
|
split("\n")
|
|
168
168
|
| map(select(length > 0) | (fromjson? // empty))
|
|
169
169
|
| map(select((.isSidechain // false) != true))
|
|
170
|
+
# (#1876) api-request-blob records are request copies, not conversation lines — same filter as
|
|
171
|
+
# r007-r008-drift-advisor.sh (shared verdict; fixing one side only re-contaminates).
|
|
172
|
+
# Denylist chosen: in the review corpus, records with `.message.role` were type user 10606 /
|
|
173
|
+
# assistant 19846 / api-request-blob 351, none lacking `.type` (#1882 review).
|
|
174
|
+
| map(select((.type? // "") != "api-request-blob"))
|
|
170
175
|
| [ foreach .[] as $l (0;
|
|
171
176
|
(if ($l.message.role? == "user")
|
|
172
177
|
and ( (($l.message.content | type) == "string")
|
|
@@ -4,7 +4,16 @@ set -euo pipefail
|
|
|
4
4
|
# Stall Detection Advisor
|
|
5
5
|
# Trigger: SubagentStop
|
|
6
6
|
# Purpose: Detect stalled parallel agents and advise adaptive splitting (R009)
|
|
7
|
-
# Protocol: stdin JSON -> analyze durations -> stderr advisory, stdout pass-through,
|
|
7
|
+
# Protocol: stdin JSON -> analyze durations -> stderr advisory, stdout pass-through (R021: advisory, never intends to block)
|
|
8
|
+
# Exit status (MEASURED, bash 3.2, `set -euo pipefail`): only explicit exit is `exit 0`, not guaranteed.
|
|
9
|
+
# With no AGENT_START_FILE the early exit below gives rc=0 for any stdin. With a start file present
|
|
10
|
+
# (the normal runtime state, written by agent-start-recorder.sh on SubagentStart): malformed JSON and
|
|
11
|
+
# array/scalar payloads gave rc=5 (unguarded `jq` agent_type extraction); a well-formed payload with a
|
|
12
|
+
# 300KB `.description` gave rc=141 (5/5; 70KB rc=0; boundary near 81,920 bytes here, platform-dependent; `| head -c 80` SIGPIPE under pipefail). CC sends objects and
|
|
13
|
+
# SubagentStop has no `.description`, so these paths are not reached at runtime.
|
|
14
|
+
# Start-record `start_epoch`: "abc" gives rc=1 (`set -u`: "abc: unbound variable"); arithmetic-syntax
|
|
15
|
+
# values ("1792939922.5", "09") print an error and give rc=1 (`set -u`: "duration_seconds: unbound
|
|
16
|
+
# variable"); "" gives rc=0.
|
|
8
17
|
|
|
9
18
|
# ORDERING: This hook MUST run AFTER task-outcome-recorder.sh in hooks.json SubagentStop array.
|
|
10
19
|
# Reason: This script removes consumed entries from AGENT_START_FILE; task-outcome-recorder reads them first.
|
|
@@ -15,7 +15,13 @@ command -v jq >/dev/null 2>&1 || exit 0
|
|
|
15
15
|
# with no dedup, observed to repeat 8-10x per session before manual override.
|
|
16
16
|
# Fix: replace the blocking LLM judge with a plain stderr-only warning that never
|
|
17
17
|
# triggers the Stop-hook-feedback re-injection path. No block, no LLM call, no loop.
|
|
18
|
-
# Protocol: stdin JSON -> read tool_output.is_error -> stderr warning if failed -> pass through -> exit 0
|
|
18
|
+
# Protocol: stdin JSON -> read tool_output.is_error -> stderr warning if failed -> pass through -> exit 0
|
|
19
|
+
# Exit status (MEASURED, bash 3.2, `set -euo pipefail`): rc=0 in every probe (well-formed payload,
|
|
20
|
+
# is_error=true payload, malformed JSON, empty stdin, array/scalar payloads) except one synthetic case:
|
|
21
|
+
# the jq calls for is_error and agent_type are guarded with `|| echo`, but the error_summary pipeline
|
|
22
|
+
# (`jq ... | head -c 200`) is not; with is_error=true and a 300KB `tool_output.output` it gave rc=141
|
|
23
|
+
# (SIGPIPE under pipefail, 3/3). SubagentStop payloads have no `tool_output`, so is_error is always
|
|
24
|
+
# false there and that path is unreachable at runtime.
|
|
19
25
|
|
|
20
26
|
input=$(cat)
|
|
21
27
|
|
|
@@ -7,7 +7,12 @@ command -v jq >/dev/null 2>&1 || exit 0
|
|
|
7
7
|
# Task/Agent Outcome Recorder Hook
|
|
8
8
|
# Trigger: SubagentStop (settings.json wires this script to that event and no other)
|
|
9
9
|
# Purpose: Record agent outcomes for model escalation decisions
|
|
10
|
-
# Protocol: stdin JSON -> process -> stdout pass-through
|
|
10
|
+
# Protocol: stdin JSON -> process -> stdout pass-through
|
|
11
|
+
# Exit status (MEASURED, bash 3.2, `set -euo pipefail`): the only explicit exits are `exit 0`, but
|
|
12
|
+
# there is no trap, so it is NOT guaranteed. rc=0 for a well-formed payload, malformed JSON, empty
|
|
13
|
+
# stdin, array/scalar payloads and a corrupt AGENT_START_FILE, with start_epoch exceptions: "abc" gives
|
|
14
|
+
# rc=1 (`set -u`: "abc: unbound variable"); arithmetic-syntax values ("1792939922.5", "09") print an
|
|
15
|
+
# error but give rc=0 (bash 3.2 drops the line; duration stays 0); "" gives rc=0.
|
|
11
16
|
#
|
|
12
17
|
# MEASURED SubagentStop payload (CC 2.1.259 embedded hook schema; #1656 B):
|
|
13
18
|
# session_id, transcript_path, cwd, prompt_id?, permission_mode?, effort?,
|
|
@@ -61,7 +66,8 @@ description=$(printf '%s\n' "$input" | jq -r '
|
|
|
61
66
|
# Extract skill name from description or prompt
|
|
62
67
|
skill_name=""
|
|
63
68
|
# `|| true`: a no-match grep exits 1 and `set -euo pipefail` would abort the hook
|
|
64
|
-
# (
|
|
69
|
+
# (this line's guard: rc=1 when text passes the gate below but not the name pattern; the later guard: rc=1 on {"agent_type":"X"}).
|
|
70
|
+
# Empty stdin now exits at the non-object guard above.
|
|
65
71
|
if echo "$description" | grep -qiE '(skill:|routing|→.*skill)'; then
|
|
66
72
|
skill_name=$(echo "$description" | grep -oiE '[a-z]+-[a-z]+(-[a-z]+)*-?(routing|skill|practices|detection|decomposition|orchestration|pipeline|guards|cycle|plan|review|refactor|publish|version|audit|exec|analyze|bundle|report|setup|watch|lists|status|help|save|recall)' | head -1 || true)
|
|
67
73
|
fi
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"type": "Agent",
|
|
23
23
|
"class": "LanguageExpert"
|
|
24
24
|
},
|
|
25
|
-
"lang-
|
|
25
|
+
"lang-java-expert": {
|
|
26
26
|
"type": "Agent",
|
|
27
27
|
"class": "LanguageExpert"
|
|
28
28
|
},
|
|
@@ -693,7 +693,7 @@
|
|
|
693
693
|
},
|
|
694
694
|
{
|
|
695
695
|
"source": "dev-lead-routing",
|
|
696
|
-
"target": "lang-
|
|
696
|
+
"target": "lang-java-expert",
|
|
697
697
|
"relation": "routes_to"
|
|
698
698
|
},
|
|
699
699
|
{
|
|
@@ -883,7 +883,7 @@
|
|
|
883
883
|
"dev-lead-routing"
|
|
884
884
|
]
|
|
885
885
|
},
|
|
886
|
-
"lang-
|
|
886
|
+
"lang-java-expert": {
|
|
887
887
|
"requires": [],
|
|
888
888
|
"routed_by": [
|
|
889
889
|
"dev-lead-routing"
|
|
@@ -1389,7 +1389,7 @@
|
|
|
1389
1389
|
"lang-rust-expert",
|
|
1390
1390
|
"lang-kotlin-expert",
|
|
1391
1391
|
"lang-typescript-expert",
|
|
1392
|
-
"lang-
|
|
1392
|
+
"lang-java-expert",
|
|
1393
1393
|
"fe-vercel-agent",
|
|
1394
1394
|
"fe-vuejs-agent",
|
|
1395
1395
|
"fe-svelte-agent",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"lang-rust-expert",
|
|
23
23
|
"lang-kotlin-expert",
|
|
24
24
|
"lang-typescript-expert",
|
|
25
|
-
"lang-
|
|
25
|
+
"lang-java-expert",
|
|
26
26
|
"fe-vercel-agent",
|
|
27
27
|
"fe-vuejs-agent",
|
|
28
28
|
"fe-svelte-agent",
|
|
@@ -79,7 +79,7 @@
|
|
|
79
79
|
"lang-rust-expert": "dev-lead-routing",
|
|
80
80
|
"lang-kotlin-expert": "dev-lead-routing",
|
|
81
81
|
"lang-typescript-expert": "dev-lead-routing",
|
|
82
|
-
"lang-
|
|
82
|
+
"lang-java-expert": "dev-lead-routing",
|
|
83
83
|
"fe-vercel-agent": "dev-lead-routing",
|
|
84
84
|
"fe-vuejs-agent": "dev-lead-routing",
|
|
85
85
|
"fe-svelte-agent": "dev-lead-routing",
|
|
@@ -457,7 +457,7 @@ Optional per-agent identity layer. `soul: true` in frontmatter enables personali
|
|
|
457
457
|
|
|
458
458
|
## Artifact Output Convention
|
|
459
459
|
|
|
460
|
-
Skills persist output to `.claude/outputs/sessions/{YYYY-MM-DD}/{skill-name}-{HHmmss}.md`. Opt-in, git-untracked. Final subagent writes (R010). Observed (#1858, CC 2.1.296/2.1.310): a subagent Write of a report-named file (`report-*.md`) was refused; trigger unmeasured [가설]. On refusal the subagent returns the content as text and reports the refusal; if a downstream agent needs a file, the orchestrator delegates a separate writer with a filename outside report/summary/findings/analysis names [가설]. The orchestrator confirms every file deliverable with its own `ls -la
|
|
460
|
+
Skills persist output to `.claude/outputs/sessions/{YYYY-MM-DD}/{skill-name}-{HHmmss}.md`. Opt-in, git-untracked. Final subagent writes (R010). Observed (#1858, CC 2.1.296/2.1.310): a subagent Write of a report-named file (`report-*.md`) was refused; trigger unmeasured [가설]. On refusal the subagent returns the content as text and reports the refusal; if a downstream agent needs a file, the orchestrator delegates a separate writer with a filename outside report/summary/findings/analysis names [가설]. The orchestrator confirms every file deliverable with its own `ls -la`. <!-- DETAIL: #1858 measurement (CC 2.1.310, 2026-10-25, mgr-updater subagent, scratchpad dir): Write `report-probe.md` → refused "Subagents should return findings as text, not write report files. Include this content in your final response instead."; `homework-probe.md` and `result-probe.md` → created; `ls -la` showed only the latter two. Trigger observed for a report-named file; whether filename, path, or content decides is unmeasured [가설]. 2.1.296 also saw a subagent falsely report a refused write as success, hence the orchestrator `ls -la` check. -->
|
|
461
461
|
|
|
462
462
|
### Sensitive Path Handling
|
|
463
463
|
|
|
@@ -20,7 +20,7 @@ oh-my-customcode uses an **advisory-first enforcement model**. Most rules are en
|
|
|
20
20
|
| Soft Block | Stop hook prompt | R011 session-end saves | Auto-performs then approves |
|
|
21
21
|
| Conversation Block | PostToolUse hook + `continueOnBlock` (CC v2.1.139+), exit 2 | stuck-detector, context-budget-advisor, cost-cap-advisor | Feeds rejection reason into conversation; Claude continues with awareness |
|
|
22
22
|
| Advisory | PostToolUse hooks | R007, R008, R009, R010, R018 | Warns via stderr, never blocks |
|
|
23
|
-
| Advisory (proactive) | UserPromptSubmit + SubagentStop + PostToolUse hooks | R007, R008 (`r007-r008-drift-advisor.sh` — #1229 UserPromptSubmit, #1545 SubagentStop, #1553 PostToolUse) | Reads last assistant turn; emits advisory if header/prefix absent. SubagentStop wiring (#1545)
|
|
23
|
+
| Advisory (proactive) | UserPromptSubmit + SubagentStop + PostToolUse hooks | R007, R008 (`r007-r008-drift-advisor.sh` — #1229 UserPromptSubmit, #1545 SubagentStop, #1553 PostToolUse) | Reads last assistant turn; emits advisory if header/prefix absent. SubagentStop wiring (#1545) covers subagent stops in no-user-input loops (`/fsd`); PostToolUse (#1553) covers the orchestrator-only stretch before the first subagent spawn. Complements retroactive Stop-hook (`session-reflection.sh`, #1190). **v1.1.43부터 실제 발화**(파서 셀렉터 `.role`→`.message.role` 수정 — 상세는 Read 도구로 원문 주석 참조). v1.1.49부터 역방향(announce > tool_use) 신호 포함, 기본 off 옵트인 (#1595 #6). v1.1.73의 narration 채널 분리 옵션(`OMCUSTOM_R008_NARRATION`, #1701 #2)은 실 세션 5건(CC 2.1.233~2.1.274) 실측에서 narration 마커 매칭 0/354·판정 on/off 동일로 전제가 성립하지 않아 v1.1.74에서 은퇴했습니다(#1703) — R008 누락은 채널 오선택이 아니라 마커 미직렬화 형태입니다. **v1.1.62(#1650 D)부터 서브에이전트 세션에서는 침묵**: hook stdin의 `agent_id`(CC 스키마상 서브에이전트 내부 발화에만 존재)가 있으면 exit 0 — 단 `SubagentStart`/`SubagentStop`은 `agent_id`가 대상 식별자라 예외(판정 수행). 중첩 서브에이전트 안의 SubagentStop은 억제 못 함(R010 정책상 도달 불가 경로). 완료 보고가 advisory 응답으로 대체되던 훅 피드백 잠식(R020 8항, #1652 #3)의 advisory 계열 차단. |
|
|
24
24
|
| Advisory (telemetry) | PostToolUseFailure hook | — (계측 전용, 규칙 강제 없음) | `failure-ledger.sh` (#1561, v1.1.44) — 도구 실패를 JSONL 원장에 append. stdout/stderr 무출력이라 모델에 도달하지 않으며 절대 차단하지 않음 |
|
|
25
25
|
| Advisory (proactive) | UserPromptSubmit hook | R020 (원인 진단) | `fail-axis-cause-advisor.sh` (#1561, v1.1.44) — 원장에 실패 기록이 있는데 원인 진술 없는 재촉 프롬프트가 오면 `hookSpecificOutput.additionalContext`로 "원인 가설 되묻기" advisory 전달. 원장 부재 시 조용히 통과 |
|
|
26
26
|
| Prompt-based | CLAUDE.md + rules/ + `SessionStart` 재주입(matcher `*`; PostCompact 이벤트 배선은 유지되나 효과 미보장[^postcompact]) | All MUST rules | Behavioral guidance in context |
|
|
@@ -80,7 +80,7 @@ oh-my-customcode uses an **advisory-first enforcement model**. Most rules are en
|
|
|
80
80
|
3. **Composability**: External skills and internal rules can coexist without deadlocks
|
|
81
81
|
4. **Post-compact reinforcement**: R007/R008/R009/R010/R018 are re-injected after context compaction via `SessionStart`(matcher `*`/`compact`) — not via the PostCompact event itself[^postcompact]
|
|
82
82
|
|
|
83
|
-
## Hard Enforcement Candidates — R010 git-delegation-guard (conditional), R007/R008 advisory **implemented & firing** (#1229 UserPromptSubmit, proactive) + **#1545 SubagentStop** (
|
|
83
|
+
## Hard Enforcement Candidates — R010 git-delegation-guard (conditional), R007/R008 advisory **implemented & firing** (#1229 UserPromptSubmit, proactive) + **#1545 SubagentStop** (covers subagent stops) + **#1553 PostToolUse** + retroactive Stop-hook (#1190); `additionalContext` 전달 경로는 #1547(v1.1.40)에서 구현됐으나 파서 셀렉터 결함으로 v1.1.42까지 **양 계층 모두 미발화**였고, **v1.1.43에서 수정 완료·발화 확인**(#1553); hard-block variant still candidate if advisory insufficient (#1096). Promoted: rule-deletion-guard.sh (2026-04-08). See details via Read tool.
|
|
84
84
|
|
|
85
85
|
<!-- DETAIL: Hard Enforcement Candidates (Future)
|
|
86
86
|
If advisory enforcement proves insufficient for specific rules, these are candidates for promotion to hard-block:
|
|
@@ -88,7 +88,7 @@ If advisory enforcement proves insufficient for specific rules, these are candid
|
|
|
88
88
|
| Rule | Candidate Hook | Status | Condition for Promotion |
|
|
89
89
|
|------|---------------|--------|------------------------|
|
|
90
90
|
| R010 | git-delegation-guard.sh | Candidate | If orchestrator-direct-write violations exceed 3/session |
|
|
91
|
-
| R007/R008 | `r007-r008-drift-advisor.sh` (UserPromptSubmit #1229 + SubagentStop #1545 + PostToolUse #1553) | **Advisory implemented and firing** — proactive pre-response check wired to three trigger points; the SubagentStop leg (#1545)
|
|
91
|
+
| R007/R008 | `r007-r008-drift-advisor.sh` (UserPromptSubmit #1229 + SubagentStop #1545 + PostToolUse #1553) | **Advisory implemented and firing** — proactive pre-response check wired to three trigger points; the SubagentStop leg (#1545) covers subagent stops in no-user-input loops (`/fsd`), and the PostToolUse leg (#1553) covers the orchestrator-only stretch before the first subagent spawn. Retroactive: `session-reflection.sh` (Stop, #1190). Two-layer drift detection: proactive (#1229/#1545/#1553) + retroactive (#1190). **Historical defect (v1.1.40–v1.1.42): delivery path implemented but never fired** — #1547 (v1.1.40) switched delivery from stderr (never model-visible on exit 0) to `hookSpecificOutput.additionalContext` on JSON stdout, non-blocking (no top-level `decision`/`continue`/`stopReason`), but both scripts short-circuited BEFORE emitting: `jq -r '.role'` read a key absent at transcript top level (it is `.message.role`), so `last_assistant` was always empty and the script exited 0 silently. Measured then: 0 `"additionalContext":` occurrences across 771 transcripts; live probe emitted 0 bytes on both streams. **Resolved in v1.1.43** — parser fix on both layers + `PostToolUse` wiring, first fire confirmed by live probe (#1553). Follow-ups: v1.1.44 turn-level R008 prefix counting (#1563), v1.1.45 Skill-tool exemption (#1569), v1.1.49 reverse signal — announce > tool_use, own anchored regex, fires only when ALL tool_use blocks (Skill included) are 0, opt-in via `OMCUSTOM_R008_REVERSE=on` and NOT replicated into `session-reflection.sh` (#1595 #6). | Promote to hard-block if advisory proves insufficient (#1096) |
|
|
92
92
|
|
|
93
93
|
Promotion requires: (1) measured violation rate data, (2) user approval, (3) rollback plan.
|
|
94
94
|
|
|
@@ -89,9 +89,9 @@ byte_dump=$(mktemp /tmp/omcustom-gh-byte-dump.XXXXXX) || exit 1
|
|
|
89
89
|
trap 'command rm -f -- "$byte_dump"' 0
|
|
90
90
|
trap 'exit 1' HUP INT TERM
|
|
91
91
|
check_file() {
|
|
92
|
-
[ -f "$1" ] || return 1
|
|
93
|
-
command od -A n -v -t u1 "$1" > "$byte_dump" || return 1
|
|
94
|
-
command awk -v kind="$2" '
|
|
92
|
+
[ -f "${1}" ] || return 1
|
|
93
|
+
command od -A n -v -t u1 "${1}" > "$byte_dump" || return 1
|
|
94
|
+
command awk -v kind="${2}" '
|
|
95
95
|
{ for (i = 1; i <= NF; i++) {
|
|
96
96
|
b = $i + 0; n++;
|
|
97
97
|
if (b == 0) bad = 1;
|
|
@@ -183,7 +183,7 @@ Each iteration operates under full project rules — no relaxation because FSD i
|
|
|
183
183
|
| R015 (intent persistence) | If user explicitly defers a specific PR this session, honor that deferral — do not retry it. |
|
|
184
184
|
| R017 (sync verification) | mgr-sauron passes required before any commit. |
|
|
185
185
|
| R020 (completion verification) | Each release verified via `npm view`, `gh release view`, closed issues before `[Done]`. PR merges verified via `gh pr view` ground-truth before declaring iteration complete. |
|
|
186
|
-
| cost-cap advisory (`cost-cap-advisor.sh`, Conversation Block) | FSD는 사용자가 명시 호출한 다중 릴리즈 루프라 세션 비용이 상한(기본
|
|
186
|
+
| cost-cap advisory (`cost-cap-advisor.sh`, Conversation Block) | FSD는 사용자가 명시 호출한 다중 릴리즈 루프라 세션 비용이 상한(기본 USD 5)을 필연적으로 넘는다. advisory 발화는 루프를 멈추는 신호가 아니며, 오케스트레이터는 발화 사실과 누적 비용을 반복 경계(homework 게이트)에서 사용자에게 고지한다. 상한을 올리려면 `CLAUDE_COST_CAP`(v1.1.61 세션 실측: 착수 직후 USD 5.38에서 발화). |
|
|
187
187
|
|
|
188
188
|
`/homework` runs as a **retrospective gate** between iterations — findings go through `omcustom-feedback`'s Phase 4A confirmation gate. The loop does NOT skip homework on the grounds that it is "automated". If homework requires user confirmation (e.g., to file a feedback issue), the loop pauses and waits.
|
|
189
189
|
|
|
@@ -241,7 +241,7 @@ That session ran 2 iterations (v0.177.0 and v0.178.0) before converging with 0 e
|
|
|
241
241
|
| Skill / Rule | Role |
|
|
242
242
|
|--------------|------|
|
|
243
243
|
| `goal` | Disciplined goal-to-execution wrapper — objective parse, gap detection, R020 verification |
|
|
244
|
-
| `omcustom-loop` | SubagentStop command hooks (outcome recording and advisories only) — no orchestrator-workflow continuation; these hooks do not wake an idle model (no `asyncRewake` configured in `.claude/hooks/hooks.json` or `.claude/settings.json`) and `auto-continue-guard.sh` has no exit
|
|
244
|
+
| `omcustom-loop` | SubagentStop command hooks (outcome recording and advisories only) — no orchestrator-workflow continuation; these hooks do not wake an idle model (no `asyncRewake` configured in `.claude/hooks/hooks.json` or `.claude/settings.json`) and `auto-continue-guard.sh` has no `exit 2` statement (its only explicit exit is `exit 0`), echoes the payload, and the CC 2.1.310 SubagentStop payload has no top-level `decision`/`continue` key (CC 2.1.310 binary SubagentStop payload builder, inspected during the v2.0.6/v2.0.7 reviews), so it does not block |
|
|
245
245
|
| `pipeline` | `/pipeline auto-dev` — the core release pipeline per iteration |
|
|
246
246
|
| `homework` | Retrospective 찐빠 audit gate per iteration |
|
|
247
247
|
| `mgr-gitnerd` | PR merge operations — all open PR merges delegated here (R010) |
|
|
@@ -33,7 +33,7 @@ eliminating the external CronJob dependency for user-invoked runs.
|
|
|
33
33
|
2. Agent evaluates each title against oh-my-customcode's domain (see prompt template below)
|
|
34
34
|
3. Returns relevance score (0–100) and a 1-line reason for each item
|
|
35
35
|
4. Threshold: ≥ 60 passes to Phase 3 (configurable via `--threshold` or `HADA_SCOUT_THRESHOLD`)
|
|
36
|
-
5. Cost:
|
|
36
|
+
5. Cost: ~USD 0.01–0.05 for 50 items
|
|
37
37
|
|
|
38
38
|
### Phase 3 — Scout Dispatch
|
|
39
39
|
|
|
@@ -105,9 +105,9 @@ Items:
|
|
|
105
105
|
|
|
106
106
|
| Stage | Model | Estimated Cost |
|
|
107
107
|
|-------|-------|----------------|
|
|
108
|
-
| Pre-scout (Phase 2) | haiku |
|
|
109
|
-
| Full scout (Phase 3) | sonnet |
|
|
110
|
-
| Total max per invocation | — |
|
|
108
|
+
| Pre-scout (Phase 2) | haiku | ~USD 0.01–0.05 per run (50 items) |
|
|
109
|
+
| Full scout (Phase 3) | sonnet | ~USD 0.5–1.5 per item, max 5 per run |
|
|
110
|
+
| Total max per invocation | — | ~USD 8 |
|
|
111
111
|
|
|
112
112
|
## Environment Variables
|
|
113
113
|
|
|
@@ -135,7 +135,7 @@ Items:
|
|
|
135
135
|
| Filtering | Regex keyword match | LLM relevance scoring (haiku) |
|
|
136
136
|
| Invocation | External CronJob only | User-invocable `/hada-scout` + CronJob |
|
|
137
137
|
| Precision | Low (keyword false positives) | High (context-aware scoring) |
|
|
138
|
-
| Cost per scan |
|
|
138
|
+
| Cost per scan | USD 0 (regex) + USD 2.5–7.5 (/scout) | USD 0.05 (pre-scout) + USD 2.5–7.5 (/scout) |
|
|
139
139
|
| False positive rate | ~30–40% | ~5–10% |
|
|
140
140
|
| Scope | `package` | `core` |
|
|
141
141
|
|
|
@@ -151,9 +151,9 @@ byte_dump=$(mktemp /tmp/omcustom-gh-byte-dump.XXXXXX) || exit 1
|
|
|
151
151
|
trap 'command rm -f -- "$byte_dump"' 0
|
|
152
152
|
trap 'exit 1' HUP INT TERM
|
|
153
153
|
check_file() {
|
|
154
|
-
[ -f "$1" ] || return 1
|
|
155
|
-
command od -A n -v -t u1 "$1" > "$byte_dump" || return 1
|
|
156
|
-
command awk -v kind="$2" '
|
|
154
|
+
[ -f "${1}" ] || return 1
|
|
155
|
+
command od -A n -v -t u1 "${1}" > "$byte_dump" || return 1
|
|
156
|
+
command awk -v kind="${2}" '
|
|
157
157
|
{ for (i = 1; i <= NF; i++) {
|
|
158
158
|
b = $i + 0; n++;
|
|
159
159
|
if (b == 0) bad = 1;
|
|
@@ -15,19 +15,19 @@ When background subagents complete, `SubagentStop` command hooks record outcomes
|
|
|
15
15
|
## How It Works
|
|
16
16
|
|
|
17
17
|
1. When a background subagent completes, Claude Code fires the `SubagentStop` event
|
|
18
|
-
2. The command hooks run: `task-outcome-recorder.sh` (records an outcome entry, but SubagentStop exposes no failure signal, so entries are always outcome=success;
|
|
18
|
+
2. The command hooks run: `task-outcome-recorder.sh` (records an outcome entry, but SubagentStop exposes no failure signal, so entries are always outcome=success; see the "Outcome caveat" comment in the script), `stall-detection-advisor.sh` (stderr advisory on stalled parallel agents; stderr on exit 0 is visible to humans in transcript/debug, not fed to the model), `auto-continue-guard.sh` (counts consecutive completions), `r007-r008-drift-advisor.sh` (R007/R008 drift advisory), `subagent-failure-advisor.sh` (reads `.tool_output.is_error`, which is absent from the SubagentStop payload, so its warning can never trigger on this path until #1656 G (closed unfixed; tracked in #1775); the "Outcome caveat" comment in `task-outcome-recorder.sh` and the `is_error=` line of the advisor)
|
|
19
19
|
3. None of them continues the orchestrator's workflow; the orchestrator decides the next workflow step itself from the returned results. Exception: when `r007-r008-drift-advisor.sh` emits an advisory on SubagentStop, CC delivers the `additionalContext` to the stopping subagent, which continues its turn to respond (CHANGELOG 2.1.163).
|
|
20
20
|
4. If no steps remain, it reports results and waits for user input
|
|
21
21
|
|
|
22
22
|
## Consecutive-Completion Advisory
|
|
23
23
|
|
|
24
|
-
- **Consecutive-completion counter**: `auto-continue-guard.sh` counts SubagentStop events (counter resets after 60s idle); from the 4th completion onward within the window (count >= 4) it prints a stderr line "limit (3) reached. Pausing." (human-visible only, not a model-visible signal; among these five SubagentStop hooks only `r007-r008-drift-advisor.sh` uses `additionalContext`) and
|
|
24
|
+
- **Consecutive-completion counter**: `auto-continue-guard.sh` counts SubagentStop events (counter resets after 60s idle); from the 4th completion onward within the window (count >= 4) it prints a stderr line "limit (3) reached. Pausing." (human-visible only, not a model-visible signal; among these five SubagentStop hooks only `r007-r008-drift-advisor.sh` uses `additionalContext`) and its script contains no `exit 2` statement (its only explicit exit is `exit 0`); it echoes the input payload to stdout, and the CC 2.1.310 SubagentStop payload has no top-level `decision`/`continue` key (CC 2.1.310 binary SubagentStop payload builder, inspected during the v2.0.6/v2.0.7 reviews), so it does not block
|
|
25
25
|
- **stuck-detector integration**: If the same action repeats 3+ times, the independent PostToolUse stuck-detector hook intervenes
|
|
26
26
|
- **cost-cap-advisor**: Cost monitoring is independent of these hooks
|
|
27
27
|
|
|
28
28
|
## Configuration
|
|
29
29
|
|
|
30
|
-
The hooks are configured in `.claude/hooks/hooks.json` under `SubagentStop`. All five hooks are `type: command` and advisory (none
|
|
30
|
+
The hooks are configured in `.claude/hooks/hooks.json` under `SubagentStop`. All five hooks are `type: command` and advisory (none contains an `exit 2` statement or emits a `decision`/`continue` field outside comments, so none blocks; the grep pattern covered `exit 2`, `"decision"`, `decision:`, `"continue"` and `continue:` and hit only comments in `r007-r008-drift-advisor.sh`; the `continue:` form added no hits. Four of the five hooks echo the CC payload to stdout, which carries no top-level `decision`/`continue` key in CC 2.1.310. The drift advisor's `additionalContext` makes the stopping subagent continue its own turn; that continuation is not a block).
|
|
31
31
|
|
|
32
32
|
## Limitations
|
|
33
33
|
|
|
@@ -38,7 +38,7 @@ The hooks are configured in `.claude/hooks/hooks.json` under `SubagentStop`. All
|
|
|
38
38
|
## Usage
|
|
39
39
|
|
|
40
40
|
```bash
|
|
41
|
-
/omcustom-loop # Skill entry point (no status command exists; the consecutive-completion counter lives in
|
|
41
|
+
/omcustom-loop # Skill entry point (no status command exists; the consecutive-completion counter lives in /tmp/.claude-loop-count-${PPID})
|
|
42
42
|
```
|
|
43
43
|
|
|
44
44
|
The hooks are active by default: `.claude/hooks/hooks.json` is the source, and Claude Code loads the generated `.claude/settings.json` in this repo (R021); installed projects get the wiring merged into `.claude/settings.local.json` when the hooks component is installed (`src/core/installer.ts` returns early if `hooks.json` is absent). No explicit activation needed.
|
|
@@ -1009,7 +1009,7 @@ steps:
|
|
|
1009
1009
|
찐빠 #3).
|
|
1010
1010
|
- Delegations that create files, binaries, worktrees, or branches (artifact-creating
|
|
1011
1011
|
delegations only — text-only edits are excluded) MUST include measured output in their
|
|
1012
|
-
completion report — `file <bin>` for binaries, `ls -la <path>` for created paths, `git
|
|
1012
|
+
completion report — `file <bin>` for binaries, `ls -la <path>` for created paths (the orchestrator re-runs `ls -la` itself, R006 #1858), `git
|
|
1013
1013
|
worktree list` for worktrees, `git branch --list` for branches, as applicable — and the
|
|
1014
1014
|
orchestrator MUST confirm architecture/path from that measured output before using the
|
|
1015
1015
|
artifact, not from the agent's self-report alone (R020 Subagent Self-Report
|
|
@@ -97,9 +97,9 @@ byte_dump=$(mktemp /tmp/omcustom-gh-byte-dump.XXXXXX) || exit 1
|
|
|
97
97
|
trap 'command rm -f -- "$byte_dump"' 0
|
|
98
98
|
trap 'exit 1' HUP INT TERM
|
|
99
99
|
check_file() {
|
|
100
|
-
[ -f "$1" ] || return 1
|
|
101
|
-
command od -A n -v -t u1 "$1" > "$byte_dump" || return 1
|
|
102
|
-
command awk -v kind="$2" '
|
|
100
|
+
[ -f "${1}" ] || return 1
|
|
101
|
+
command od -A n -v -t u1 "${1}" > "$byte_dump" || return 1
|
|
102
|
+
command awk -v kind="${2}" '
|
|
103
103
|
{ for (i = 1; i <= NF; i++) {
|
|
104
104
|
b = $i + 0; n++;
|
|
105
105
|
if (b == 0) bad = 1;
|
|
@@ -231,9 +231,9 @@ byte_dump=$(mktemp /tmp/omcustom-gh-byte-dump.XXXXXX) || exit 1
|
|
|
231
231
|
trap 'command rm -f -- "$byte_dump"' 0
|
|
232
232
|
trap 'exit 1' HUP INT TERM
|
|
233
233
|
check_file() {
|
|
234
|
-
[ -f "$1" ] || return 1
|
|
235
|
-
command od -A n -v -t u1 "$1" > "$byte_dump" || return 1
|
|
236
|
-
command awk -v kind="$2" '
|
|
234
|
+
[ -f "${1}" ] || return 1
|
|
235
|
+
command od -A n -v -t u1 "${1}" > "$byte_dump" || return 1
|
|
236
|
+
command awk -v kind="${2}" '
|
|
237
237
|
{ for (i = 1; i <= NF; i++) {
|
|
238
238
|
b = $i + 0; n++;
|
|
239
239
|
if (b == 0) bad = 1;
|
|
@@ -285,9 +285,9 @@ byte_dump=$(mktemp /tmp/omcustom-gh-byte-dump.XXXXXX) || exit 1
|
|
|
285
285
|
trap 'command rm -f -- "$byte_dump"' 0
|
|
286
286
|
trap 'exit 1' HUP INT TERM
|
|
287
287
|
check_file() {
|
|
288
|
-
[ -f "$1" ] || return 1
|
|
289
|
-
command od -A n -v -t u1 "$1" > "$byte_dump" || return 1
|
|
290
|
-
command awk -v kind="$2" '
|
|
288
|
+
[ -f "${1}" ] || return 1
|
|
289
|
+
command od -A n -v -t u1 "${1}" > "$byte_dump" || return 1
|
|
290
|
+
command awk -v kind="${2}" '
|
|
291
291
|
{ for (i = 1; i <= NF; i++) {
|
|
292
292
|
b = $i + 0; n++;
|
|
293
293
|
if (b == 0) bad = 1;
|
|
@@ -34,7 +34,7 @@ Orchestrates 10 parallel research teams for comprehensive deep analysis of any t
|
|
|
34
34
|
|
|
35
35
|
## Pre-flight Guards
|
|
36
36
|
|
|
37
|
-
Before executing the 10-team research workflow, the agent MUST run these checks. Research is a high-cost operation (
|
|
37
|
+
Before executing the 10-team research workflow, the agent MUST run these checks. Research is a high-cost operation (~USD 8-15) — these guards prevent wasteful execution.
|
|
38
38
|
|
|
39
39
|
### Guard Levels
|
|
40
40
|
|
|
@@ -67,7 +67,7 @@ indicators_complex:
|
|
|
67
67
|
- Query references a repository or ecosystem for deep analysis
|
|
68
68
|
```
|
|
69
69
|
|
|
70
|
-
**Action (GATE)**: `[Pre-flight] GATE: Query appears to be a simple factual question. Use direct answer or single WebSearch instead. 10-team research (
|
|
70
|
+
**Action (GATE)**: `[Pre-flight] GATE: Query appears to be a simple factual question. Use direct answer or single WebSearch instead. 10-team research (~USD 8-15) would be wasteful. Override with /research --force if intended.`
|
|
71
71
|
|
|
72
72
|
### Guard 2: Single-File Review Detection
|
|
73
73
|
|
|
@@ -128,7 +128,7 @@ fi
|
|
|
128
128
|
├── Known solution: PASS
|
|
129
129
|
└── Context budget: WARN — context at 45%, research adds ~35%
|
|
130
130
|
Result: PROCEED WITH CAUTION (0 GATE, 1 WARN, 0 INFO)
|
|
131
|
-
Cost estimate:
|
|
131
|
+
Cost estimate: ~USD 8-15 for 10-team parallel research
|
|
132
132
|
```
|
|
133
133
|
|
|
134
134
|
If any GATE: block and suggest alternative. User can override with `--force`.
|
|
@@ -407,7 +407,7 @@ Before execution:
|
|
|
407
407
|
|
|
408
408
|
Estimated: {time} | Teams: 10 | Models: sonnet → opus
|
|
409
409
|
Stopping: max 30 verification rounds, convergence at 0 contradictions
|
|
410
|
-
Cost:
|
|
410
|
+
Cost: ~USD 8-15 (10 teams × sonnet + opus verification)
|
|
411
411
|
Execute? [Y/n]
|
|
412
412
|
```
|
|
413
413
|
|
|
@@ -464,7 +464,7 @@ Agent(
|
|
|
464
464
|
|
|
465
465
|
- Each Teams member running research still respects R009 (max 4 concurrent sub-agents)
|
|
466
466
|
- Batching order remains: T1-T4 → T5-T8 → T9-T10
|
|
467
|
-
- Cost is identical to orchestrator mode (
|
|
467
|
+
- Cost is identical to orchestrator mode (~USD 8-15 per research invocation)
|
|
468
468
|
- Multiple Teams members running research simultaneously will multiply costs proportionally
|
|
469
469
|
|
|
470
470
|
## Integration
|
|
@@ -74,7 +74,7 @@ Before execution, show the plan:
|
|
|
74
74
|
├── Phase 3: 적합성 분석 (sonnet)
|
|
75
75
|
└── Phase 4: 이슈 생성
|
|
76
76
|
|
|
77
|
-
예상: ~1분 | 비용:
|
|
77
|
+
예상: ~1분 | 비용: ~USD 0.5-1.5
|
|
78
78
|
실행하시겠습니까? [Y/n]
|
|
79
79
|
```
|
|
80
80
|
|
|
@@ -185,9 +185,9 @@ byte_dump=$(mktemp /tmp/omcustom-gh-byte-dump.XXXXXX) || exit 1
|
|
|
185
185
|
trap 'command rm -f -- "$byte_dump"' 0
|
|
186
186
|
trap 'exit 1' HUP INT TERM
|
|
187
187
|
check_file() {
|
|
188
|
-
[ -f "$1" ] || return 1
|
|
189
|
-
command od -A n -v -t u1 "$1" > "$byte_dump" || return 1
|
|
190
|
-
command awk -v kind="$2" '
|
|
188
|
+
[ -f "${1}" ] || return 1
|
|
189
|
+
command od -A n -v -t u1 "${1}" > "$byte_dump" || return 1
|
|
190
|
+
command awk -v kind="${2}" '
|
|
191
191
|
{ for (i = 1; i <= NF; i++) {
|
|
192
192
|
b = $i + 0; n++;
|
|
193
193
|
if (b == 0) bad = 1;
|
|
@@ -297,7 +297,7 @@ When verdict is `INTERNALIZE` and integration effort is M or L:
|
|
|
297
297
|
|--------|--------|-----------|
|
|
298
298
|
| Purpose | Quick fit evaluation | Deep multi-dimensional analysis |
|
|
299
299
|
| Teams | 1 agent | 10 teams |
|
|
300
|
-
| Cost |
|
|
300
|
+
| Cost | ~USD 0.5-1.5 | ~USD 8-15 |
|
|
301
301
|
| Duration | 1-2 min | 10-20 min |
|
|
302
302
|
| Output | Issue with verdict | Full report with ADOPT/ADAPT/AVOID |
|
|
303
303
|
| When | First contact with new link | Deep dive after scout recommends |
|
|
@@ -53,6 +53,10 @@ description: Brief description of what this Skill does and when to use it
|
|
|
53
53
|
- 비어 있지 않아야 함
|
|
54
54
|
- 최대 1024자
|
|
55
55
|
|
|
56
|
+
### 위치 인자 `$N` 치환 (#1879)
|
|
57
|
+
|
|
58
|
+
Claude Code 2.1.310에서 스킬을 인자 3개(`alpha beta gamma`)와 함께 호출해 관측한 결과, `SKILL.md` 안의 인자 범위 안의 인덱스(이번 관측 `$0`~`$2`)는 bash 펜스 코드 블록, 큰따옴표, 함수 본문, 산문에서 인자 값으로 치환되었습니다(`"$1"` → `"beta"`). `${1}` 표기는 치환되지 않았고, 두 번째 관측(스킬 도구로 omcustom-feedback을 인자 `alpha beta gamma`와 함께 로드, CC 2.1.310)에서도 `"${1}"`, `[ -f "${1}" ]`, `kind="${2}"`가 리터럴로 남았으므로, 스킬의 셸 코드에서는 위치 매개변수를 `${1}`로 쓰십시오. 범위를 벗어난 인덱스는 산문의 `$5`만 관측했고 리터럴로 남았으며, 인자 없는 호출도 치환되지 않았고, `$10`도 3개 인자 호출에서는 리터럴로 남았습니다(한 자리 숫자만 인식하는지는 확정하지 못했습니다 [가설]). 인자가 있는 호출에서는 산문의 `$5` 같은 금액 표기도 같은 규칙으로 치환될 수 있으므로, 금액은 `USD 5`처럼 쓰는 것을 권장합니다.
|
|
59
|
+
|
|
56
60
|
## 사용 가능한 Skills
|
|
57
61
|
|
|
58
62
|
### 사전 구축된 Agent Skills
|
|
@@ -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:
|
|
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:
|
|
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:457`, `user-prompt-preprocessor.sh:99`의 jq 출력 식 4곳이 출력 생성 지점이며 모두 `additionalContext` 전달에만 씁니다; `git grep -n hookSpecificOutput -- .claude/hooks`는 주석과 `.claude/hooks/hooks.json:239`의 description을 포함해 13줄을 반환합니다). 또한 이 저장소 실행 환경은 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"
|
|
@@ -2319,7 +2319,7 @@ 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:
|
|
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: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"
|
|
@@ -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:
|
|
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 기반 선택(`:
|
|
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` 또는 `$<숫자>`)이 있는 스킬 파일은
|
|
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"
|
|
@@ -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:
|
|
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
|
|
package/templates/manifest.json
CHANGED
|
@@ -1009,7 +1009,7 @@ steps:
|
|
|
1009
1009
|
찐빠 #3).
|
|
1010
1010
|
- Delegations that create files, binaries, worktrees, or branches (artifact-creating
|
|
1011
1011
|
delegations only — text-only edits are excluded) MUST include measured output in their
|
|
1012
|
-
completion report — `file <bin>` for binaries, `ls -la <path>` for created paths, `git
|
|
1012
|
+
completion report — `file <bin>` for binaries, `ls -la <path>` for created paths (the orchestrator re-runs `ls -la` itself, R006 #1858), `git
|
|
1013
1013
|
worktree list` for worktrees, `git branch --list` for branches, as applicable — and the
|
|
1014
1014
|
orchestrator MUST confirm architecture/path from that measured output before using the
|
|
1015
1015
|
artifact, not from the agent's self-report alone (R020 Subagent Self-Report
|