oh-my-customcode 1.1.73 → 1.1.75
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/README.md +19 -6
- package/dist/cli/index.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/templates/.claude/hooks/scripts/r007-r008-drift-advisor.sh +1 -43
- package/templates/.claude/rules/MUST-completion-verification.md +11 -1
- package/templates/.claude/rules/MUST-continuous-improvement.md +2 -2
- package/templates/.claude/rules/MUST-enforcement-policy.md +1 -1
- package/templates/.claude/rules/MUST-orchestrator-coordination.md +3 -1
- package/templates/.claude/rules/MUST-tool-identification.md +3 -1
- package/templates/.claude/rules/SHOULD-verification-ladder.md +10 -0
- package/templates/.claude/skills/pipeline/workflows/auto-dev.yaml +14 -3
- package/templates/CLAUDE.md.en +2 -1
- package/templates/CLAUDE.md.ko +2 -1
- package/templates/README.md +3 -2
- package/templates/manifest.json +1 -1
- package/templates/workflows/auto-dev.yaml +14 -3
package/README.md
CHANGED
|
@@ -109,6 +109,8 @@ Agent(qa-engineer):sonnet │
|
|
|
109
109
|
Agent(arch-documenter):haiku ┘
|
|
110
110
|
```
|
|
111
111
|
|
|
112
|
+
Soft default is 4 concurrent agents, hard cap 5. Agent Teams (shared task list, peer messaging) is used instead of plain parallel agents when it's available — but it requires Claude Code to expose a `TeamCreate` tool, which is not present on a stock install today. Until then, oh-my-customcode's standard Agent-tool parallel model above is what actually runs.
|
|
113
|
+
|
|
112
114
|
---
|
|
113
115
|
|
|
114
116
|
### Agents (50)
|
|
@@ -170,6 +172,9 @@ All commands are invoked inside the Claude Code conversation.
|
|
|
170
172
|
| `/adversarial-review` | Attacker-mindset security code review |
|
|
171
173
|
| `/pipeline` | Execute YAML-defined pipelines |
|
|
172
174
|
| `/pipeline resume` | Resume a halted pipeline from last failure point |
|
|
175
|
+
| `/omcustom:fsd` | Full Self Driving — autonomous release loop: repeats `/pipeline auto-dev` (issue → implement → verify → release) then `/homework` (retrospective audit) until no eligible issues remain |
|
|
176
|
+
| `/homework` | Retrospective audit of the current session, surfacing process gaps as feedback/issues |
|
|
177
|
+
| `/agora` | Anonymized multi-round, multi-vendor consensus review (independent CLI reviewers + rotating judge) for decisions that need adversarial scrutiny |
|
|
173
178
|
|
|
174
179
|
### Agent Management
|
|
175
180
|
|
|
@@ -217,7 +222,9 @@ All commands are invoked inside the Claude Code conversation.
|
|
|
217
222
|
| **SHOULD** | 8 | Interaction, error handling, memory, HUD, ecomode, ontology routing, wiki sync, verification ladder |
|
|
218
223
|
| **MAY** | 1 | Optimization |
|
|
219
224
|
|
|
220
|
-
Key rules: R010 (orchestrator never writes files), R009 (parallel execution mandatory), R017 (sauron verification before push), R020 (completion verification before declaring done), R021 (advisory-first enforcement model).
|
|
225
|
+
Key rules: R010 (orchestrator never writes files), R009 (parallel execution mandatory), R017 (sauron verification before push), R020 (completion verification before declaring done), R021 (advisory-first enforcement — most rules are prompt-based, not hard-blocked), R016 (continuous improvement — violations update the rule, and stale clauses are retired into HTML comments rather than accumulating forever), R023 (verification ladder — cheapest check first: deterministic hooks/linters, then cheap-model review, then expensive-model review, then human).
|
|
226
|
+
|
|
227
|
+
R018 (Agent Teams) is conditional: it only takes effect when both `CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1` is set AND the `TeamCreate` tool is present in the tool list. On a stock Claude Code install today, `TeamCreate` is not registered, so R018 is dormant and R009/R010 (the standard Agent-tool parallel-execution model) govern instead.
|
|
221
228
|
|
|
222
229
|
---
|
|
223
230
|
|
|
@@ -229,16 +236,20 @@ Reference documentation covering best practices, architecture decisions, and int
|
|
|
229
236
|
|
|
230
237
|
## Safety
|
|
231
238
|
|
|
232
|
-
oh-my-customcode
|
|
239
|
+
oh-my-customcode ships 42 lifecycle hook scripts covering security, drift detection, and rule reinforcement. A few examples:
|
|
233
240
|
|
|
234
241
|
| Hook | Trigger | Action |
|
|
235
242
|
|------|---------|--------|
|
|
236
243
|
| secret-filter | Bash, Read output | Detects AWS keys, API tokens, private keys, bearer tokens |
|
|
237
244
|
| audit-log | Edit, Write, Bash, Agent | Append-only JSONL at `~/.claude/audit.jsonl` |
|
|
238
245
|
| schema-validator | Write, Edit, Bash input | Validates tool inputs, flags dangerous patterns |
|
|
239
|
-
|
|
|
246
|
+
| claude-md-reinject | SessionStart (fresh session, resume, or compact) | Reinjects CLAUDE.md and the enforced rule set — prevents rule amnesia after context compaction |
|
|
247
|
+
| stuck-detector | PostToolUse, repeated edits | Flags an agent looping on the same file/edit without progress |
|
|
248
|
+
| r007-r008-drift-advisor | UserPromptSubmit, SubagentStop, PostToolUse | Advisory check that the last turn carried the required agent/tool identification headers |
|
|
240
249
|
|
|
241
|
-
|
|
250
|
+
Most hooks are advisory (exit 0) — they warn but never block. A small number of hard-block hooks (e.g. `stage-blocker`, `rule-deletion-guard`) reject the tool call outright (exit 2). oh-my-customcode's own governance rules (`.claude/rules/`) follow an **advisory-first enforcement model**: prompt-based guidance is the default, and a rule is only promoted to a blocking hook after repeated, observed violations. Rules also retire — clauses tied to since-fixed platform bugs or that go unused for two minor releases are wrapped in HTML comments (still readable via the source file, invisible to the agent's context) rather than left to accumulate indefinitely.
|
|
251
|
+
|
|
252
|
+
The hook source of truth is `.claude/hooks/hooks.json`; `omcustom init` compiles it into the `hooks` block of `.claude/settings.json` (via `src/core/hooks-settings.ts`), which is the file Claude Code actually loads.
|
|
242
253
|
|
|
243
254
|
---
|
|
244
255
|
|
|
@@ -273,7 +284,7 @@ your-project/
|
|
|
273
284
|
│ ├── agents/ # 50 agent definitions
|
|
274
285
|
│ ├── skills/ # 115 skill modules
|
|
275
286
|
│ ├── rules/ # 23 governance rules (R000-R023)
|
|
276
|
-
│ ├── hooks/ #
|
|
287
|
+
│ ├── hooks/ # 42 lifecycle hook scripts (hooks.json source; compiled into settings.json)
|
|
277
288
|
│ ├── schemas/ # Tool input validation schemas
|
|
278
289
|
│ ├── specs/ # Extracted canonical specs
|
|
279
290
|
│ ├── contexts/ # 4 shared context files
|
|
@@ -306,7 +317,9 @@ bun test # Run tests
|
|
|
306
317
|
bun run build # Production build
|
|
307
318
|
```
|
|
308
319
|
|
|
309
|
-
Requirements: Node.js >= 18.0.0, Claude Code CLI.
|
|
320
|
+
Requirements: Node.js >= 18.0.0, Claude Code CLI (developed and tested against Claude Code v2.1.277).
|
|
321
|
+
|
|
322
|
+
Releases are two-stage automation: a merged `release/vX.Y.Z` PR triggers `auto-tag.yml`, which creates the git tag; the tag push then triggers `release.yml`, which builds, verifies, and publishes to npm. The project's own contributor knowledge base — the in-repo wiki at `wiki/` (278 pages covering agents, skills, rules, and workflows) — is CI-verified on every PR against a source-hash manifest, so wiki pages cannot silently drift from the code they document.
|
|
310
323
|
|
|
311
324
|
---
|
|
312
325
|
|
package/dist/cli/index.js
CHANGED
package/dist/index.js
CHANGED
package/package.json
CHANGED
|
@@ -125,9 +125,6 @@
|
|
|
125
125
|
# OMCUSTOM_TRANSCRIPT_BASE — transcript 디렉토리 경로 override (설정 시 최우선)
|
|
126
126
|
# OMCUSTOM_R007_MARKER_DIR — dedup 마커 디렉토리 override (기본 ${TMPDIR:-/tmp})
|
|
127
127
|
# OMCUSTOM_R008_REVERSE=on — 역방향 신호(예고했으나 도구 미호출) 활성화. 기본 off.
|
|
128
|
-
# OMCUSTOM_R008_NARRATION=on — narration(thinking 직렬화) 채널도 announce 정규식으로 스캔해
|
|
129
|
-
# "그중 narration 채널에만 존재 M건"을 문구에 덧붙임. 기본 off —
|
|
130
|
-
# 꺼진 상태에서는 판정/문구가 기존과 바이트 동일(#1701 하네스 제안 2).
|
|
131
128
|
|
|
132
129
|
set -euo pipefail
|
|
133
130
|
|
|
@@ -329,32 +326,7 @@ split("\n")
|
|
|
329
326
|
| ([ $lines[] | select(test("^\\[[^\\]]+\\]\\[[^\\]]+\\] ?(→|->|—>) ?Tool:")) ] | length) as $an_anchored
|
|
330
327
|
# $nall_tools는 위 forward r008 가드에서 이미 바인딩됨 — 재바인딩하지 않고 재사용한다.
|
|
331
328
|
| (if $nall_tools == 0 and $an_anchored > 0 then $an_anchored else 0 end) as $r008rev
|
|
332
|
-
|
|
333
|
-
# 기본 판정($r008)은 `$blocks`(thinking 제외)만 본다 — 이 절은 그 판정을 바꾸지 않고,
|
|
334
|
-
# 같은 announce 정규식을 thinking(narration) 블록의 `.thinking` 텍스트에도 적용해
|
|
335
|
-
# "누락으로 계상된 건 중 narration 채널에만 존재하는 건수"를 부가 필드로만 산출한다.
|
|
336
|
-
# #1654가 확정한 대로 narration ≠ text이므로 기본 판정은 그대로 위반으로 남는다 —
|
|
337
|
-
# 이 필드는 진단 정보(어느 채널에 있었는지)만 덧붙인다. OMCUSTOM_R008_NARRATION=on일
|
|
338
|
-
# 때만 bash 쪽에서 문구에 반영하고, 기본(off)에서는 아래 tsv 6번째 필드가 계산은 되지만
|
|
339
|
-
# bash가 0으로 강제해 문구·판정 바이트가 기존과 동일하게 유지된다.
|
|
340
|
-
| ([ $turn[] | .message.content[]? | select(.type? == "thinking") | (.thinking? // "") ]
|
|
341
|
-
| join("\n") | split("\n")) as $nlines
|
|
342
|
-
| ([ $nlines[] | select(test("\\[.+\\]\\[.+\\] ?(→|->|—>) ?Tool:")) ] | length) as $an_tool_narr
|
|
343
|
-
| ([ $nlines[] | select(test("\\[.+\\]\\[.+\\] ?(→|->|—>) ?Tool: ?Agent")) ] | length) as $an_tool_agent_narr
|
|
344
|
-
| ([ $nlines[] | select(test("^[[:space:]]*\\[[0-9]+\\][[:space:]].*(→|->|—>)")) ] | length) as $an_spawn_item_narr
|
|
345
|
-
| ([ $nlines[] | select(test("^[[:space:]]*[a-z][a-z0-9-]*:(haiku|sonnet|opus|fable|inherit)[[:space:]]*(→|->|—>)")) ]
|
|
346
|
-
| length) as $an_spawn_single_narr
|
|
347
|
-
| ([ $nlines[] | select(test("\\[.+\\]\\[.+\\] ?(→|->|—>) ?Spawning:")) ] | length) as $an_spawn_hdr_narr
|
|
348
|
-
| (if $an_spawn_item_narr > 0 then $an_spawn_item_narr
|
|
349
|
-
elif $an_spawn_single_narr > 0 then $an_spawn_single_narr
|
|
350
|
-
else $an_spawn_hdr_narr end) as $an_spawn_narr
|
|
351
|
-
| ($an_tool_narr + (if $an_spawn_narr > $an_tool_agent_narr then $an_spawn_narr - $an_tool_agent_narr else 0 end))
|
|
352
|
-
as $announce_narr
|
|
353
|
-
# 부가 필드는 $r008(기존 판정)을 상한으로 bound한다 — narration에 announce가 더 많아도
|
|
354
|
-
# "누락으로 계상된 건수"를 초과해 보고하지 않는다(과대 서술 방지).
|
|
355
|
-
| (if $r008 > 0 then (if $announce_narr < $r008 then $announce_narr else $r008 end) else 0 end) as $r008narr
|
|
356
|
-
| [$tuuid, ($r007 | tostring), ($r008 | tostring), ($r008rev | tostring), ($tool_names_list | join(",")),
|
|
357
|
-
($r008narr | tostring)] | @tsv
|
|
329
|
+
| [$tuuid, ($r007 | tostring), ($r008 | tostring), ($r008rev | tostring), ($tool_names_list | join(","))] | @tsv
|
|
358
330
|
)
|
|
359
331
|
end
|
|
360
332
|
end
|
|
@@ -380,18 +352,10 @@ r008_violations=$(printf '%s' "$result" | cut -f3)
|
|
|
380
352
|
r008_reverse=$(printf '%s' "$result" | cut -f4)
|
|
381
353
|
# 미접두 도구 이름 목록 (#1687) — $ntools와 동일 필터의 순서 보존 목록, "," join.
|
|
382
354
|
tool_names=$(printf '%s' "$result" | cut -f5)
|
|
383
|
-
# narration 채널 분리 카운트 (#1701 하네스 제안 2) — $r008(기존 판정)의 부분집합, 상한 bound.
|
|
384
|
-
r008_narration=$(printf '%s' "$result" | cut -f6)
|
|
385
355
|
|
|
386
356
|
: "${r007_violations:=0}"
|
|
387
357
|
: "${r008_violations:=0}"
|
|
388
358
|
: "${r008_reverse:=0}"
|
|
389
|
-
: "${r008_narration:=0}"
|
|
390
|
-
|
|
391
|
-
# narration 분리 신호는 OPT-IN, 기본 off — 켜지지 않으면 문구/판정은 기존과 바이트 동일.
|
|
392
|
-
if [ "${OMCUSTOM_R008_NARRATION:-off}" != "on" ]; then
|
|
393
|
-
r008_narration=0
|
|
394
|
-
fi
|
|
395
359
|
|
|
396
360
|
# 역방향 신호는 OPT-IN, 기본 off.
|
|
397
361
|
# 측정 정밀도는 3/3이지만 표본이 3건뿐이고, 배선 구조상 "예방"이 불가능하다:
|
|
@@ -439,12 +403,6 @@ if [ "$r008_violations" -gt 0 ]; then
|
|
|
439
403
|
violation_desc="R008 도구 식별 접두사 누락 ${r008_violations}건"
|
|
440
404
|
instruction="모든 도구 호출에 [agent][model] → Tool: 접두사를 포함하십시오."
|
|
441
405
|
fi
|
|
442
|
-
# narration 채널 분리 (#1701 하네스 제안 2, OPT-IN): 판정 자체는 그대로 위반으로 남기고,
|
|
443
|
-
# 그중 몇 건이 narration(thinking 직렬화)에만 존재했는지를 문구에 덧붙인다. 기본 off에서는
|
|
444
|
-
# r008_narration이 위에서 0으로 강제되어 이 블록이 문구를 바꾸지 않는다.
|
|
445
|
-
if [ "$r008_narration" -gt 0 ]; then
|
|
446
|
-
violation_desc="${violation_desc} (그중 narration 채널에만 존재 ${r008_narration}건)"
|
|
447
|
-
fi
|
|
448
406
|
# 미접두 도구 이름 귀속 (#1687): announce는 턴 단위로 매칭되므로, $tool_names(순서 보존,
|
|
449
407
|
# non-Skill tool_use)의 마지막 r008_violations개를 부족분으로 귀속한다. 카운트 문구
|
|
450
408
|
# "R008 도구 식별 접두사 누락 N건"은 위에서 이미 확정되어 바이트 동일 유지 — 이 접미사는
|
|
@@ -75,9 +75,19 @@ Subagents often report failures as "pre-existing", "baseline", or "unchanged". T
|
|
|
75
75
|
Never accept "pre-existing" without direct base-branch evidence. A false "pre-existing" claim can mask a regression introduced by the current change.
|
|
76
76
|
-->
|
|
77
77
|
|
|
78
|
+
### 보유 실측값과 어긋나는 서브에이전트 서술은 즉시 정정 (Origin: #1704 #2)
|
|
79
|
+
|
|
80
|
+
오케스트레이터가 이미 보유한 실측값(예: 커밋 제목)과 서브에이전트의 서술이 어긋나면, 그 불일치를 리뷰 단계로 이월하지 않고 **즉시 정정 위임**하거나 판정을 가르는 **읽기 전용** 명령 1개를 직접 실행합니다(`git show` / `gh … view` 등 — 파일 수정·상태 변경은 계속 위임, R010). 원인은 「절단된 에이전트의 산출물을 "실측상 완결"로 받아들이며 내용 검증을 리뷰 단계에 위탁 — R020 Read-Before-Characterize의 역방향(읽고도 특성화 보류)」입니다.
|
|
81
|
+
|
|
82
|
+
| Anti-pattern | Required |
|
|
83
|
+
|--------------|----------|
|
|
84
|
+
| 보유 실측값과 어긋나는 서브에이전트 서술을 "리뷰 항목으로 넘깁니다"라며 이월 | 즉시 정정 위임 또는 판정을 가르는 **읽기 전용** 명령 1개를 직접 실행(`git show` / `gh … view` 등 — 파일 수정·상태 변경은 계속 위임, R010) |
|
|
85
|
+
|
|
86
|
+
Origin: #1704 #2 (v1.1.73 세션 — sauron FAIL + 적대적 리뷰 F3 동시 적발, 인용 오류 계열 4회째. 오케스트레이터는 위임서에 "제가 실측한 커밋 메시지(#1688)와 어긋날 수 있어 리뷰 항목으로 넘깁니다"라고 적어 판정 가능한 사실을 판정하지 않았습니다). Cross-ref: R020 Read-Before-Characterize, R010 「출처 인용과 인접 문구 점검도 같은 규율」.
|
|
87
|
+
|
|
78
88
|
### 원인 분석도 완료 보고와 같은 등급의 검증 대상 (Origin: #1595 #3)
|
|
79
89
|
|
|
80
|
-
|
|
90
|
+
「Subagent Self-Report Verification」의 주장 표는 서브에이전트의 **상태 주장**("pre-existing", "unchanged")을 다루지만, 서브에이전트의 **원인 진단**도 동일 등급의 검증 대상이다. 오류 메시지 하나가 **여러 시나리오에서 동일하게 출력**될 때, 오케스트레이터와 서브에이전트가 같은 메시지를 읽고 각자 그럴듯하지만 **양립 불가능한** 원인을 구성한다. 서브에이전트의 원인 분석은 **결론이 아니라 가설**로 접수하고, 결정론적 명령으로 정정한다.
|
|
81
91
|
|
|
82
92
|
| 서브에이전트의 원인 진단 | 필요한 실측 |
|
|
83
93
|
|---|---|
|
|
@@ -32,7 +32,7 @@ Update the relevant rule rather than just acknowledging the violation.
|
|
|
32
32
|
|--------------|----------|
|
|
33
33
|
| 규칙 조항만 추가하고 커밋 → 자동화 경로에 발동 지점이 없어 동일 결함 재발 | 발동 실행 경로 명시 + 반영 확인; 대상 없으면 "배선 불요" 명시 |
|
|
34
34
|
|
|
35
|
-
**신설 조항의 동일 반복 self-check (Origin: #1691 #4·#5·#7 — v1.1.71)**: 위임서 규율을 신설·보강한 반복에서는, 그 조항을 **같은 반복에서 오케스트레이터가 작성하는 이후 위임서에 즉시 적용**한 뒤 다음 단계로 넘어갑니다. v1.1.69에서 R010 「출처 인용과 인접 문구 점검도 같은 규율」을 신설한 바로 그 반복의 위임서가 이슈 문장을 인용하지 않고 같은 파일 grep을 요구하지 않아 자기 위반 3건(High 1건 포함)이 적대적 리뷰에서 적발되었습니다 — 텍스트가 룰에 실렸다는 사실은 오케스트레이터 자신의 행동이 바뀌었다는 증거가
|
|
35
|
+
**신설 조항의 동일 반복 self-check (Origin: #1691 #4·#5·#7 — v1.1.71)**: 위임서 규율을 신설·보강한 반복에서는, 그 조항을 **같은 반복에서 오케스트레이터가 작성하는 이후 위임서에 즉시 적용**한 뒤 다음 단계로 넘어갑니다. v1.1.69에서 R010 「출처 인용과 인접 문구 점검도 같은 규율」을 신설한 바로 그 반복의 위임서가 이슈 문장을 인용하지 않고 같은 파일 grep을 요구하지 않아 자기 위반 3건(High 1건 포함)이 적대적 리뷰에서 적발되었습니다 — 텍스트가 룰에 실렸다는 사실은 오케스트레이터 자신의 행동이 바뀌었다는 증거가 아닙니다(배선: auto-dev.yaml implement 스텝 bullet — 신설·보강 조항의 Anti-pattern 표를 위임서와 1:1 대조, 4사본 — v1.1.75).
|
|
36
36
|
|
|
37
37
|
| Anti-pattern | Required |
|
|
38
38
|
|--------------|----------|
|
|
@@ -42,7 +42,7 @@ Origin: #1533 (v1.1.35에서 R017 (b) 조항 추가했으나 auto-dev.yaml versi
|
|
|
42
42
|
|
|
43
43
|
Cross-reference: R021(Enforcement Policy — advisory 규칙의 발동 지점), R017(구조 검증).
|
|
44
44
|
|
|
45
|
-
**적용 범위 확장 (Origin: #1698 #1 — v1.1.72)**: 이 self-check는 서브에이전트에 **요구하는** 규율뿐 아니라 오케스트레이터가 **스스로 작성하는 산문(룰 문안·요약·수치)**에도 대칭 적용됩니다. 상세·인용은 R010 「출처 인용과 인접 문구 점검도 같은 규율」 보강
|
|
45
|
+
**적용 범위 확장 (Origin: #1698 #1 — v1.1.72)**: 이 self-check는 서브에이전트에 **요구하는** 규율뿐 아니라 오케스트레이터가 **스스로 작성하는 산문(룰 문안·요약·수치)**에도 대칭 적용됩니다. 상세·인용은 R010 「출처 인용과 인접 문구 점검도 같은 규율」 보강 항목 참조.
|
|
46
46
|
|
|
47
47
|
## Integration
|
|
48
48
|
|
|
@@ -16,7 +16,7 @@ oh-my-customcode uses an **advisory-first enforcement model**. Most rules are en
|
|
|
16
16
|
| Soft Block | Stop hook prompt | R011 session-end saves | Auto-performs then approves |
|
|
17
17
|
| 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 |
|
|
18
18
|
| Advisory | PostToolUse hooks | R007, R008, R009, R010, R018 | Warns via stderr, never blocks |
|
|
19
|
-
| 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) closes the no-user-input autonomous-loop gap (`/fsd`); PostToolUse (#1553) covers the orchestrator-only stretch before the first subagent spawn. Complements retroactive Stop-hook (`session-reflection.sh`, #1190). **v1.1.43부터 실제 발화 — 아래 각주 참조.** v1.1.49부터 역방향(announce > tool_use) 신호 포함, 기본 off 옵트인 (#1595 #6). v1.1.73
|
|
19
|
+
| 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) closes the no-user-input autonomous-loop gap (`/fsd`); PostToolUse (#1553) covers the orchestrator-only stretch before the first subagent spawn. Complements retroactive Stop-hook (`session-reflection.sh`, #1190). **v1.1.43부터 실제 발화 — 아래 각주 참조.** 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 계열 차단. |
|
|
20
20
|
| Advisory (telemetry) | PostToolUseFailure hook | — (계측 전용, 규칙 강제 없음) | `failure-ledger.sh` (#1561, v1.1.44) — 도구 실패를 JSONL 원장에 append. stdout/stderr 무출력이라 모델에 도달하지 않으며 절대 차단하지 않음 |
|
|
21
21
|
| Advisory (proactive) | UserPromptSubmit hook | R020 (원인 진단) | `fail-axis-cause-advisor.sh` (#1561, v1.1.44) — 원장에 실패 기록이 있는데 원인 진술 없는 재촉 프롬프트가 오면 `hookSpecificOutput.additionalContext`로 "원인 가설 되묻기" advisory 전달. 원장 부재 시 조용히 통과 |
|
|
22
22
|
| Prompt-based | CLAUDE.md + rules/ + `SessionStart` 재주입(matcher `*`; PostCompact 이벤트 배선은 유지되나 효과 미보장[^postcompact]) | All MUST rules | Behavioral guidance in context |
|
|
@@ -375,7 +375,7 @@ Origin: #1646 (v1.1.58 세션 — 커밋 위임서 `12e74a76` vs 실제 `e101a0b
|
|
|
375
375
|
| 인용 대상 코드를 보지 않고 제안 문안을 룰로 승격 | 인용문이 가리키는 코드·파일과 대조 후 기재 |
|
|
376
376
|
| 오케스트레이터의 함의를 확정형으로 위임서에 기재 | `[가설 — 실측이 반대면 반대로 기재]` 표기 + 판정 기준 동봉 |
|
|
377
377
|
|
|
378
|
-
**보강
|
|
378
|
+
**보강 항목 (Origin: #1698 #1·#2(#3은 #1로 흡수), #1701 #1, #1704 #1, #1707 #2 — v1.1.72~75)**: [#1698 #1] 오케스트레이터는 룰·문서에 커밋될 **최종 문안**을 완성문으로 위임서에 붙여 넣지 않습니다 — 서브에이전트가 이슈 본문에서 사실·수치를 직접 뽑아 작성하고, 오케스트레이터는 제안 포인터·삽입 위치·제약을 지정합니다. 단 인용 원문, 실측 사실(HEAD/브랜치/카운트), 승인·금지 작업 목록, 표준 금지 문구, `[가설]` 표기 함의, 검증 재실행 금지 목록은 계속 오케스트레이터가 기재합니다 — 이들은 "최종 문안"이 아니라 위임 전제입니다(배선: `auto-dev.yaml` implement 스텝 description, 4사본). 원인은 "오케스트레이터가 위임서에 룰 문안 전체를 직접 작성하면서 수치를 기억으로 옮김 — 서브에이전트에는 `gh issue view` 인용을 요구했으나 오케스트레이터 자신의 산문은 같은 규율을 받지 않음"이며, "인용 정확성이 주제인 반복에서 같은 계열 3회째(v1.1.69 세션번호 → v1.1.70 "and marketplace" → v1.1.71 "High 2건")"가 재발 근거입니다. "리뷰에서 오류가 난 문장은 전부 오케스트레이터 작성분이었음"이며, "인용 대조 14건 중 오케스트레이터 작성 수치 1건 외 전부 원문 일치"가 실증됩니다. [#1698 #2] 인접 점검은 "같은 주제 키워드 grep"에만 의존하지 않고, 삽입 지점 앞뒤 섹션(±1 heading)의 Anti-pattern 표를 전수 대조하는 이원화를 적용합니다 — "인접성 점검을 키워드 grep에만 의존"했다가 12줄 아래 조항과의 모순을 놓친 사례가 원인입니다. [#1707 #2] 이 ±1 heading 대조는 인접 섹션과의 모순 여부뿐 아니라, 그 섹션 안의 상대 위치 참조(위 표·아래 표·직전 조항 등)가 삽입 후에도 원래 의도한 대상에 여전히 재바인딩되는지도 함께 확인합니다 — 원인은 "서브에이전트의 ±1 heading 점검이 "모순 여부"에만 초점, 상대 참조("위/아래 표")의 재바인딩은 점검 항목에 없음"입니다(배선: auto-dev.yaml implement 스텝 표준 제약 블록, 형제 위임이 같은 릴리즈에서 추가). [#1701 #1] 위임서에 적는 오케스트레이터 자신의 **요구사항 요약**(예: "…만 지정"과 같은 범위 문구)도 최종 문안과 동일하게 취급합니다 — 단 위 예외 목록(승인·금지 작업 목록·표준 금지 문구·실측 사실 등)은 이 취급에서 제외합니다. 원인은 "위임서가 이슈 원문 대신 오케스트레이터가 요약한 요구 문구("…만")를 전달 — 룰 문안은 서브에이전트가 썼지만 범위 규정은 오케스트레이터 산문이었음"이며, 이슈 제안 문장을 `gh issue view` 출력에서 복사해 전달하고 오케스트레이터의 범위 요약에는 `[요약 — 원문 우선]`을 표기합니다(배선: auto-dev.yaml implement 스텝 bullet 확장, 4사본 — R016 Rule Wiring Check). [#1704 #1] 위임서에 적는 오케스트레이터 자신의 **배선 판정**(예: "기존 implement 스텝 bullet이 커버" 류)도 같은 취급을 받습니다 — 위임서는 배선 대상 후보 파일·앵커만 제시하고, 커버 여부는 서브에이전트가 해당 문장을 인용해 판정합니다. 원인은 "배선 대상을 grep 실측 없이 오케스트레이터가 요약해 확정형으로 기재 — Iteration 1 찐빠 #1("…만 지정" 요약)과 같은 클래스의 재발(요약이 룰 문안 대신 배선 판정으로 자리만 옮김)"입니다(배선: auto-dev.yaml implement 스텝 bullet 확장, 4사본 — 기존 bullet은 `constraints`를 오케스트레이터 제공 항목으로 **허용**하므로 이 조항을 커버하지 않습니다).
|
|
379
379
|
|
|
380
380
|
> **#1700 판정 (v1.1.72)**: 이 인용의 "v1.1.69 세션번호"는 발생 시점이 아니라 조항 작성 시점으로 보입니다 — 오류 발생·적발은 Iteration 4/v1.1.67(#1688 찐빠 #1), 조항 초안은 커밋 448143c7(PR #1690 = release/v1.1.69) 실측입니다.
|
|
381
381
|
|
|
@@ -384,6 +384,8 @@ Origin: #1646 (v1.1.58 세션 — 커밋 위임서 `12e74a76` vs 실제 `e101a0b
|
|
|
384
384
|
| 룰 문안 **최종 문안**을 오케스트레이터가 직접 작성해 위임서에 기재 | 서브에이전트가 이슈 본문에서 사실·수치를 직접 뽑아 작성; 오케스트레이터는 포인터·삽입 위치·제약만 지정 — 인용 원문·실측 사실·승인/금지 목록·표준 금지 문구·`[가설]` 표기·재실행 금지 목록은 오케스트레이터가 계속 기재 |
|
|
385
385
|
| 위임서의 "요구사항 요약"을 오케스트레이터가 산문으로 재구성해 확정형으로 기재 (예: "…만 지정") | 이슈 제안 문장을 `gh issue view` 출력에서 복사해 전달; 오케스트레이터의 범위 요약에는 `[요약 — 원문 우선]` 표기 |
|
|
386
386
|
| 같은 주제 키워드 grep만으로 인접성 점검 완료 판정 | 키워드 grep + 삽입 지점 ±1 heading의 Anti-pattern 표 전수 대조를 병행 |
|
|
387
|
+
| ±1 heading 대조를 모순 여부에만 국한 → 인접 문구의 "위 표"·"아래 표"·"직전 조항" 참조가 삽입 후 다른 대상으로 재바인딩된 것을 놓침 | ±1 heading 대조에 상대 위치 참조 재바인딩 확인을 포함 |
|
|
388
|
+
| 위임서에 오케스트레이터의 배선 판정("기존 bullet이 커버")을 확정형으로 기재 | 배선 대상 후보 파일·앵커만 제시하고 커버 여부는 서브에이전트가 해당 문장을 인용해 판정 |
|
|
387
389
|
|
|
388
390
|
#### 참인 전제 ≠ 참인 함의 — 브랜치 전환 위임 (Origin: #1595 #2)
|
|
389
391
|
|
|
@@ -134,7 +134,9 @@ Origin: #1595 #5 (v1.1.48 세션 — R008 위반 3건이 단일 턴에 집중. t
|
|
|
134
134
|
| 도구 호출 턴을 짧은 요약 산문만으로 시작(narration 채널로 흐름) | 헤더(`┌─ Agent:` 또는 단축 헤더)와 Core Rule 접두사를 **text 블록**으로 명시 — 산문 요약은 그 뒤에 |
|
|
135
135
|
| "announce를 썼다"는 기억으로 advisory를 오탐으로 가정 | 트랜스크립트의 `text` 블록에서 마커를 실측(R020 Self-Violation Counting) |
|
|
136
136
|
|
|
137
|
-
Iteration 1(Agent 스폰 15메시지 전부 narration)과 Iteration 2(7메시지 text)의 대비는 계수 도구 결함이 아니라 출력 채널 선택의
|
|
137
|
+
Iteration 1(Agent 스폰 15메시지 전부 narration)과 Iteration 2(7메시지 text)의 대비는 계수 도구 결함이 아니라 출력 채널 선택의 차이로 서술했으나, 이 귀속은 아래 v1.1.75 보강으로 대체되었다.
|
|
138
|
+
|
|
139
|
+
**원인 귀속 보강 (Origin: #1703·#1706 — v1.1.75)**: 실 세션 6건·tool_use 응답 1008건(아티팩트 Part B 표 5건 860건 + 각주 인용 2.1.251 세션 148건, 재계산)을 재측정한 결과, text 블록이 없는 tool_use 응답의 비율이 CC 2.1.233에서 0%(0/256)였다가 2.1.251에서 39.2%(58/148)로 급증하고 2.1.258~2.1.275 구간에서 53.6~61.8%로 유지되는 것을 확인했습니다. 이 경계는 CHANGELOG v2.1.251의 "Fixed conversations getting stuck on \"text content blocks must be non-empty\" errors after a turn where the model produced only thinking" 항목과 일치합니다. narration 채널 옵션은 thinking 본문 354건 전수에서 마커가 0건 매칭되어 은퇴했으므로(#1703), R008 누락 턴은 마커가 narration으로 옮겨간 것이 아니라 thinking과 tool_use만 있고 text 블록이 없는 형태로 기록된 것입니다. `[가설]` 2.1.251 이전의 thinking-only 턴이 클라이언트 측 text 강제 주입으로 감춰졌는지 API 재시도로 트랜스크립트에서 탈락했는지, 그리고 thinking 내용이 announce 정규식과 왜 불일치하는지는 API 원본 스트리밍 로그 대조 없이는 미확정입니다.
|
|
138
140
|
|
|
139
141
|
## Tier-3 Interaction Tool Prefix (MANDATORY)
|
|
140
142
|
|
|
@@ -111,6 +111,14 @@ staleness/audit 검증은 model ID·placeholder·TBD뿐 아니라 **폐기된
|
|
|
111
111
|
|
|
112
112
|
Origin: #1455 #1 (Session 127 회고 찐빠 #1) — cc-release-monitor PR #1449 머지 후 workflow_dispatch 실검증에서 issue_body의 `<details>`·릴리즈 요약에 12칸 리터럴 들여쓰기 발견 → PR #1451 재작업. 첫 위임이 문법 검증만 지시하고 샘플 값 출력 조립 검증을 누락. `textwrap.dedent` + 멀티라인 변수 함정이 문법 검증만으로는 미노출. R020(문법 통과 ≠ 출력 정상)과 정합.
|
|
113
113
|
|
|
114
|
+
**리서치 위임의 결론 수치는 표에서 재계산해 병기 (Origin: #1707 #4 — v1.1.75)**: 리서치·계측 위임의 완료 조건에는 결론 문장에 등장하는 모든 수치를 산출물 자체의 표에서 jq/awk 등으로 재계산하고, 그 값을 결론 옆에 병기하도록 명시합니다. 원인은 "리서치 에이전트가 표를 먼저 쓰고 결론을 별도 산술로 작성(표에서 재계산하지 않음)"이며, 결론 문장의 합계(697)가 표(354)와 불일치한 산술 모순 사례가 실증입니다.
|
|
115
|
+
|
|
116
|
+
| Anti-pattern | Required |
|
|
117
|
+
|--------------|----------|
|
|
118
|
+
| 결론 문장의 수치를 표와 별도로 산술해 기재 | 결론 수치를 표에서 jq/awk로 재계산하고 결론 옆에 병기하도록 완료 조건에 명시 |
|
|
119
|
+
|
|
120
|
+
배선: auto-dev.yaml deep-plan 스텝 description (4사본) — 「Delegated Verification Floor」 상한선 조항과 같은 방식입니다.
|
|
121
|
+
|
|
114
122
|
## Delegated Verification Floor — CI 잡 목록에서 도출 (Origin: #1574)
|
|
115
123
|
|
|
116
124
|
위임 프롬프트의 검증 항목은 "변경 파일의 영향 범위"만으로 정하면 부족하다. **하한선은 CI가 실제로 돌리는 잡 전체**다 — 워크플로 YAML의 잡 목록을 읽어 대응하는 로컬 명령(`lint` / `test` / `validate-docs` / sync 검사)을 열거하고, 그중 로컬 실행 가능한 것을 위임 완료 조건에 포함한다. 로컬에서 통과시키지 않은 CI 잡은 병합 시점에 halt로 돌아와 수정 에이전트 추가 발주를 강제한다.
|
|
@@ -139,6 +147,8 @@ Origin: #1563 찐빠 #2 — R007/R008 advisor 발화 검증에 단일 "0바이
|
|
|
139
147
|
|--------------|----------|
|
|
140
148
|
| 래퍼 스크립트 위임서에 경계 규칙만 지정하고 원본의 전처리 필터 미열거 | 원본 제외 계열 전수 열거 + 계열별 적용/미적용 판정과 사유 + 계열별 음성 픽스처 요구 |
|
|
141
149
|
|
|
150
|
+
**훅 옵션 검증은 합성 픽스처 + 실 트랜스크립트 1건 (Origin: #1703 권장 2, #1704 #4 — v1.1.74)**: 트랜스크립트 블록 형상을 읽는 훅/advisor 옵션 변경을 위임할 때는, R023 양성/음성 합성 픽스처 짝 외에 이 프로젝트의 실 트랜스크립트 최소 1건에서의 계수 실측(건수만)을 완료 조건에 포함합니다. 합성 픽스처는 평문 `thinking` 텍스트로 통과했으나 실 트랜스크립트에서는 `thinking` 블록 86건 중 본문 있는 38건 가운데 announce 마커 매칭이 **0건**이었습니다(`scripts/count-r007-r008.sh --json`, env on/off 동일 결과) — 합성 픽스처만으로는 형상 불일치를 잡지 못합니다. 배선: auto-dev.yaml deep-verify 스텝 description.
|
|
151
|
+
|
|
142
152
|
## Detection Guard Delegation Standard (Origin: #1438 #3)
|
|
143
153
|
|
|
144
154
|
Tier-1 shift-left 검출 가드(예: deprecated-pattern grep 가드)의 설계·수정을 서브에이전트에 위임할 때, 위임 프롬프트는 **positive-match(genuine defect mandate — `MUST`/`MANDATORY` 인접 문맥)와 negative-context(deprecation note — "no longer"/"deprecated"/"불필요"/"폐기됨" 설명 문구)를 구분**하도록 명시해야 한다. 이를 누락하면 올바르게 수정된 파일의 폐기-설명 문구까지 과잉매칭하여 자기모순 BLOCK을 유발한다.
|
|
@@ -348,7 +348,7 @@ steps:
|
|
|
348
348
|
|
|
349
349
|
- name: deep-plan
|
|
350
350
|
skill: deep-plan
|
|
351
|
-
description: "Research-validated implementation plan (research → plan → verify) — skipped if docs-only, integrated-analysis allowed if lite. MULTI-PHASE: 스킬을 그대로 spawn하지 말고 R020 「위임 경계를 Phase 개수로 설계」에 따라 단일 목표 위임으로 분할해 순차 발주한다 (#1595 #4)."
|
|
351
|
+
description: "Research-validated implementation plan (research → plan → verify) — skipped if docs-only, integrated-analysis allowed if lite. MULTI-PHASE: 스킬을 그대로 spawn하지 말고 R020 「위임 경계를 Phase 개수로 설계」에 따라 단일 목표 위임으로 분할해 순차 발주한다 (#1595 #4). 리서치·계측 위임의 완료 조건에는 결론 수치를 산출물 표에서 jq/awk로 재계산해 병기하도록 명시한다(#1707 #4)."
|
|
352
352
|
depends_on: plan
|
|
353
353
|
|
|
354
354
|
- name: implement
|
|
@@ -386,7 +386,18 @@ steps:
|
|
|
386
386
|
- Mid-run scope additions (a new issue added via user interrupt AFTER implement began) MUST re-enter the verify-build gate before release — do NOT let a late-added scope item ride to release on a prior verify-build pass. Critical for code changes; benign for docs-only (#1301).
|
|
387
387
|
- When an implement-stage delegation edits rule/skill/guide TEXT, the orchestrator MUST NOT author the final committed wording — the subagent writes it directly from the issue body (`gh issue view <N> --json body`); the delegation prompt supplies pointers, insertion anchors, constraints, verbatim tool-output quotations, and measured facts only
|
|
388
388
|
(R010 「출처 인용과 인접 문구 점검도 같은 규율」 보강 2항목, #1698 #1). The orchestrator's own requirement/scope summary counts as final wording too — copy the issue's proposal sentence from `gh issue view` output verbatim, and tag any orchestrator paraphrase "[요약 — 원문 우선]"
|
|
389
|
-
(#1701 #1).
|
|
389
|
+
(#1701 #1). The orchestrator's own wiring judgement (which file/anchor already covers a
|
|
390
|
+
new clause) counts as final wording too — the prompt supplies candidate files/anchors
|
|
391
|
+
only, and the subagent decides coverage by quoting the covering sentence (R010 [#1704 #1]).
|
|
392
|
+
- Before dispatching any delegation prompt in an iteration that created or reinforced a rule
|
|
393
|
+
clause, the orchestrator MUST compare that clause's Anti-pattern table rows 1:1 against the
|
|
394
|
+
delegation prompt's sentences and rewrite any match (cause: the R016 「신설 조항의 동일
|
|
395
|
+
반복 self-check」 was known as text but not executed as a procedure, #1707 #1).
|
|
396
|
+
- Every rule/skill/guide TEXT-editing delegation prompt MUST include this fixed constraint
|
|
397
|
+
block: (a) Korean 합쇼체 for new sentences, do not imitate adjacent 반말; (b) locate by anchor
|
|
398
|
+
strings, never line numbers; (c) copy quotations from `gh issue view --json body` output and
|
|
399
|
+
verify with `grep -F`; (d) ±1 heading check including re-binding of relative references (위
|
|
400
|
+
표/아래 표/직전 조항); (e) copy to `templates/` mirror and confirm `md5 -q` equality (#1707 #3).
|
|
390
401
|
|
|
391
402
|
|
|
392
403
|
## Sensitive Path Handling (CC v2.1.121+)
|
|
@@ -447,7 +458,7 @@ steps:
|
|
|
447
458
|
|
|
448
459
|
- name: deep-verify
|
|
449
460
|
skill: deep-verify
|
|
450
|
-
description: "Multi-angle release quality verification — self-review checklist if docs-only; mgr-sauron R017 + core self-check if lite. MULTI-PHASE: 스킬을 그대로 spawn하지 말고 R020 「위임 경계를 Phase 개수로 설계」에 따라 단일 목표 위임으로 분할해 순차 발주한다 (#1595 #4). lite 분할 표준(#1652 #3-4): (1) mgr-sauron R017 구조 검증 단일 목표 위임 1건 + (2) 변경 성격별 적대적 리뷰 단일 목표 위임 1건 — 스크립트 변경이면 실행 재현 기반 adversarial-review, 룰/스킬/yaml 텍스트 변경이면 문구 정합·배선 리뷰. 근거: v1.1.59/60 두 반복 연속 적대적 리뷰가 신규 회귀(M-3/M-4, heredoc 위조)를 실행 재현으로 포착. 검증 위임 표준 문안: 오케스트레이터가 이미 실측한 항목(bun test·lint·typecheck·template-sync·wiki-sync·validate-docs·미러 md5)은 위임서에 재실행 금지 목록으로 열거하고 재실측 대상만 지정한다 — v1.1.61 세션에서 금지 목록 없는 sauron 위임이 bun test를 재실행하다 25턴 절단됐고, 금지 목록을 명시한 재위임은 16 tool_uses로 완주했다(R020 maxTurns 절단 누적 7건째). Ordering: any wiki resync/manifest reseed for the changed rules/skills is dispatched after this step's findings are applied, not alongside it (#1688)."
|
|
461
|
+
description: "Multi-angle release quality verification — self-review checklist if docs-only; mgr-sauron R017 + core self-check if lite. MULTI-PHASE: 스킬을 그대로 spawn하지 말고 R020 「위임 경계를 Phase 개수로 설계」에 따라 단일 목표 위임으로 분할해 순차 발주한다 (#1595 #4). lite 분할 표준(#1652 #3-4): (1) mgr-sauron R017 구조 검증 단일 목표 위임 1건 + (2) 변경 성격별 적대적 리뷰 단일 목표 위임 1건 — 스크립트 변경이면 실행 재현 기반 adversarial-review, 룰/스킬/yaml 텍스트 변경이면 문구 정합·배선 리뷰. 훅·advisor 옵션 변경이면 합성 픽스처 외에 이 프로젝트 실 트랜스크립트 1건 계수 실측을 완료 조건에 포함(#1703 권장 2). 근거: v1.1.59/60 두 반복 연속 적대적 리뷰가 신규 회귀(M-3/M-4, heredoc 위조)를 실행 재현으로 포착. 검증 위임 표준 문안: 오케스트레이터가 이미 실측한 항목(bun test·lint·typecheck·template-sync·wiki-sync·validate-docs·미러 md5)은 위임서에 재실행 금지 목록으로 열거하고 재실측 대상만 지정한다 — v1.1.61 세션에서 금지 목록 없는 sauron 위임이 bun test를 재실행하다 25턴 절단됐고, 금지 목록을 명시한 재위임은 16 tool_uses로 완주했다(R020 maxTurns 절단 누적 7건째). Ordering: any wiki resync/manifest reseed for the changed rules/skills is dispatched after this step's findings are applied, not alongside it (#1688)."
|
|
451
462
|
depends_on: verify-build
|
|
452
463
|
|
|
453
464
|
- name: release
|
package/templates/CLAUDE.md.en
CHANGED
|
@@ -47,7 +47,7 @@ NO EXCEPTIONS. NO EXCUSES.
|
|
|
47
47
|
|------|------|-------------|
|
|
48
48
|
| R007 Agent ID | Every response starts with `┌─ Agent:` header | Add header immediately |
|
|
49
49
|
| R008 Tool ID | Every tool call prefixed with `[agent][model] → Tool:` | Add prefix immediately |
|
|
50
|
-
| R009 Parallel | 2+ independent tasks → parallel agents (max
|
|
50
|
+
| R009 Parallel | 2+ independent tasks → parallel agents (soft default 4, max 5) | Stop sequential, switch to parallel |
|
|
51
51
|
| R010 Orchestrator | Orchestrator never modifies files → delegate to subagents | Stop direct modification, delegate |
|
|
52
52
|
|
|
53
53
|
---
|
|
@@ -174,6 +174,7 @@ This is the core oh-my-customcode philosophy: **"No expert? CREATE one, connect
|
|
|
174
174
|
| QA Team | 3 | qa-planner, qa-writer, qa-engineer |
|
|
175
175
|
| Manager | 6 | mgr-creator, mgr-updater, mgr-supplier, mgr-gitnerd, mgr-sauron, mgr-claude-code-bible |
|
|
176
176
|
| System | 4 | sys-memory-keeper, sys-naggy, tracker-checkpoint, wiki-curator |
|
|
177
|
+
| Agora | 1 | agora-runner |
|
|
177
178
|
| **Total** | **50** | |
|
|
178
179
|
|
|
179
180
|
## Agent Teams (MUST when enabled)
|
package/templates/CLAUDE.md.ko
CHANGED
|
@@ -47,7 +47,7 @@ oh-my-customcode로 구동됩니다.
|
|
|
47
47
|
|------|------|--------|
|
|
48
48
|
| R007 에이전트 식별 | 모든 응답은 `┌─ Agent:` 헤더로 시작 | 즉시 헤더 추가 |
|
|
49
49
|
| R008 도구 식별 | 모든 도구 호출에 `[에이전트명][모델] → Tool:` 접두사 | 즉시 접두사 추가 |
|
|
50
|
-
| R009 병렬 실행 | 독립 작업 2개 이상 → 병렬 에이전트 (최대
|
|
50
|
+
| R009 병렬 실행 | 독립 작업 2개 이상 → 병렬 에이전트 (권장 4, 최대 5) | 순차 실행 중단, 병렬로 전환 |
|
|
51
51
|
| R010 오케스트레이터 | 오케스트레이터는 파일 수정 금지 → 서브에이전트에 위임 | 직접 수정 중단, 위임 |
|
|
52
52
|
|
|
53
53
|
---
|
|
@@ -174,6 +174,7 @@ project/
|
|
|
174
174
|
| QA Team | 3 | qa-planner, qa-writer, qa-engineer |
|
|
175
175
|
| Manager | 6 | mgr-creator, mgr-updater, mgr-supplier, mgr-gitnerd, mgr-sauron, mgr-claude-code-bible |
|
|
176
176
|
| System | 4 | sys-memory-keeper, sys-naggy, tracker-checkpoint, wiki-curator |
|
|
177
|
+
| Agora | 1 | agora-runner |
|
|
177
178
|
| **총계** | **50** | |
|
|
178
179
|
|
|
179
180
|
## Agent Teams (MUST when enabled)
|
package/templates/README.md
CHANGED
|
@@ -80,11 +80,12 @@ CI의 `verify-template-sync.sh`가 소스와 templates/ 간 일치를 검증합
|
|
|
80
80
|
| DE Engineer | 6 |
|
|
81
81
|
| SW Engineer / Database | 4 |
|
|
82
82
|
| Security | 1 |
|
|
83
|
-
| SW Architect |
|
|
83
|
+
| SW Architect | 2 |
|
|
84
84
|
| Infra Engineer | 2 |
|
|
85
85
|
| QA Team | 3 |
|
|
86
86
|
| Manager | 6 |
|
|
87
87
|
| System | 4 |
|
|
88
|
+
| Agora | 1 |
|
|
88
89
|
|
|
89
90
|
### Skills (115)
|
|
90
91
|
|
|
@@ -115,7 +116,7 @@ CI의 `verify-template-sync.sh`가 소스와 templates/ 간 일치를 검증합
|
|
|
115
116
|
|
|
116
117
|
각 디렉토리는 단일 토픽에 대한 best practices, 튜토리얼, 또는 설계 가이드를 담습니다. 에이전트가 작업 중 참조합니다 (R006 관심사 분리).
|
|
117
118
|
|
|
118
|
-
### Hooks (
|
|
119
|
+
### Hooks (42)
|
|
119
120
|
|
|
120
121
|
`.claude/hooks/scripts/*.sh` — 라이프사이클 훅 스크립트.
|
|
121
122
|
|
package/templates/manifest.json
CHANGED
|
@@ -348,7 +348,7 @@ steps:
|
|
|
348
348
|
|
|
349
349
|
- name: deep-plan
|
|
350
350
|
skill: deep-plan
|
|
351
|
-
description: "Research-validated implementation plan (research → plan → verify) — skipped if docs-only, integrated-analysis allowed if lite. MULTI-PHASE: 스킬을 그대로 spawn하지 말고 R020 「위임 경계를 Phase 개수로 설계」에 따라 단일 목표 위임으로 분할해 순차 발주한다 (#1595 #4)."
|
|
351
|
+
description: "Research-validated implementation plan (research → plan → verify) — skipped if docs-only, integrated-analysis allowed if lite. MULTI-PHASE: 스킬을 그대로 spawn하지 말고 R020 「위임 경계를 Phase 개수로 설계」에 따라 단일 목표 위임으로 분할해 순차 발주한다 (#1595 #4). 리서치·계측 위임의 완료 조건에는 결론 수치를 산출물 표에서 jq/awk로 재계산해 병기하도록 명시한다(#1707 #4)."
|
|
352
352
|
depends_on: plan
|
|
353
353
|
|
|
354
354
|
- name: implement
|
|
@@ -386,7 +386,18 @@ steps:
|
|
|
386
386
|
- Mid-run scope additions (a new issue added via user interrupt AFTER implement began) MUST re-enter the verify-build gate before release — do NOT let a late-added scope item ride to release on a prior verify-build pass. Critical for code changes; benign for docs-only (#1301).
|
|
387
387
|
- When an implement-stage delegation edits rule/skill/guide TEXT, the orchestrator MUST NOT author the final committed wording — the subagent writes it directly from the issue body (`gh issue view <N> --json body`); the delegation prompt supplies pointers, insertion anchors, constraints, verbatim tool-output quotations, and measured facts only
|
|
388
388
|
(R010 「출처 인용과 인접 문구 점검도 같은 규율」 보강 2항목, #1698 #1). The orchestrator's own requirement/scope summary counts as final wording too — copy the issue's proposal sentence from `gh issue view` output verbatim, and tag any orchestrator paraphrase "[요약 — 원문 우선]"
|
|
389
|
-
(#1701 #1).
|
|
389
|
+
(#1701 #1). The orchestrator's own wiring judgement (which file/anchor already covers a
|
|
390
|
+
new clause) counts as final wording too — the prompt supplies candidate files/anchors
|
|
391
|
+
only, and the subagent decides coverage by quoting the covering sentence (R010 [#1704 #1]).
|
|
392
|
+
- Before dispatching any delegation prompt in an iteration that created or reinforced a rule
|
|
393
|
+
clause, the orchestrator MUST compare that clause's Anti-pattern table rows 1:1 against the
|
|
394
|
+
delegation prompt's sentences and rewrite any match (cause: the R016 「신설 조항의 동일
|
|
395
|
+
반복 self-check」 was known as text but not executed as a procedure, #1707 #1).
|
|
396
|
+
- Every rule/skill/guide TEXT-editing delegation prompt MUST include this fixed constraint
|
|
397
|
+
block: (a) Korean 합쇼체 for new sentences, do not imitate adjacent 반말; (b) locate by anchor
|
|
398
|
+
strings, never line numbers; (c) copy quotations from `gh issue view --json body` output and
|
|
399
|
+
verify with `grep -F`; (d) ±1 heading check including re-binding of relative references (위
|
|
400
|
+
표/아래 표/직전 조항); (e) copy to `templates/` mirror and confirm `md5 -q` equality (#1707 #3).
|
|
390
401
|
|
|
391
402
|
|
|
392
403
|
## Sensitive Path Handling (CC v2.1.121+)
|
|
@@ -447,7 +458,7 @@ steps:
|
|
|
447
458
|
|
|
448
459
|
- name: deep-verify
|
|
449
460
|
skill: deep-verify
|
|
450
|
-
description: "Multi-angle release quality verification — self-review checklist if docs-only; mgr-sauron R017 + core self-check if lite. MULTI-PHASE: 스킬을 그대로 spawn하지 말고 R020 「위임 경계를 Phase 개수로 설계」에 따라 단일 목표 위임으로 분할해 순차 발주한다 (#1595 #4). lite 분할 표준(#1652 #3-4): (1) mgr-sauron R017 구조 검증 단일 목표 위임 1건 + (2) 변경 성격별 적대적 리뷰 단일 목표 위임 1건 — 스크립트 변경이면 실행 재현 기반 adversarial-review, 룰/스킬/yaml 텍스트 변경이면 문구 정합·배선 리뷰. 근거: v1.1.59/60 두 반복 연속 적대적 리뷰가 신규 회귀(M-3/M-4, heredoc 위조)를 실행 재현으로 포착. 검증 위임 표준 문안: 오케스트레이터가 이미 실측한 항목(bun test·lint·typecheck·template-sync·wiki-sync·validate-docs·미러 md5)은 위임서에 재실행 금지 목록으로 열거하고 재실측 대상만 지정한다 — v1.1.61 세션에서 금지 목록 없는 sauron 위임이 bun test를 재실행하다 25턴 절단됐고, 금지 목록을 명시한 재위임은 16 tool_uses로 완주했다(R020 maxTurns 절단 누적 7건째). Ordering: any wiki resync/manifest reseed for the changed rules/skills is dispatched after this step's findings are applied, not alongside it (#1688)."
|
|
461
|
+
description: "Multi-angle release quality verification — self-review checklist if docs-only; mgr-sauron R017 + core self-check if lite. MULTI-PHASE: 스킬을 그대로 spawn하지 말고 R020 「위임 경계를 Phase 개수로 설계」에 따라 단일 목표 위임으로 분할해 순차 발주한다 (#1595 #4). lite 분할 표준(#1652 #3-4): (1) mgr-sauron R017 구조 검증 단일 목표 위임 1건 + (2) 변경 성격별 적대적 리뷰 단일 목표 위임 1건 — 스크립트 변경이면 실행 재현 기반 adversarial-review, 룰/스킬/yaml 텍스트 변경이면 문구 정합·배선 리뷰. 훅·advisor 옵션 변경이면 합성 픽스처 외에 이 프로젝트 실 트랜스크립트 1건 계수 실측을 완료 조건에 포함(#1703 권장 2). 근거: v1.1.59/60 두 반복 연속 적대적 리뷰가 신규 회귀(M-3/M-4, heredoc 위조)를 실행 재현으로 포착. 검증 위임 표준 문안: 오케스트레이터가 이미 실측한 항목(bun test·lint·typecheck·template-sync·wiki-sync·validate-docs·미러 md5)은 위임서에 재실행 금지 목록으로 열거하고 재실측 대상만 지정한다 — v1.1.61 세션에서 금지 목록 없는 sauron 위임이 bun test를 재실행하다 25턴 절단됐고, 금지 목록을 명시한 재위임은 16 tool_uses로 완주했다(R020 maxTurns 절단 누적 7건째). Ordering: any wiki resync/manifest reseed for the changed rules/skills is dispatched after this step's findings are applied, not alongside it (#1688)."
|
|
451
462
|
depends_on: verify-build
|
|
452
463
|
|
|
453
464
|
- name: release
|