oh-my-customcode 1.1.47 → 1.1.49
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 +7 -6
- package/dist/cli/index.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/templates/.claude/agents/agora-runner.md +114 -0
- package/templates/.claude/hooks/scripts/agent-teams-advisor.sh +6 -1
- package/templates/.claude/hooks/scripts/r007-r008-drift-advisor.sh +41 -3
- package/templates/.claude/hooks/scripts/session-env-check.sh +29 -3
- package/templates/.claude/rules/MAY-optimization.md +6 -0
- package/templates/.claude/rules/MUST-agent-design.md +2 -0
- package/templates/.claude/rules/MUST-completion-verification.md +33 -2
- package/templates/.claude/rules/MUST-enforcement-policy.md +3 -3
- package/templates/.claude/rules/MUST-intent-transparency.md +7 -2
- package/templates/.claude/rules/MUST-orchestrator-coordination.md +50 -5
- package/templates/.claude/rules/MUST-parallel-execution.md +56 -7
- package/templates/.claude/rules/MUST-sync-verification.md +21 -2
- package/templates/.claude/rules/MUST-tool-identification.md +22 -4
- package/templates/.claude/skills/agora/SKILL.md +325 -0
- package/templates/.claude/skills/agora/scripts/agora.sh +761 -0
- package/templates/.claude/skills/agora/scripts/anonymize.sh +492 -0
- package/templates/.claude/skills/agora/scripts/judge.sh +427 -0
- package/templates/.claude/skills/agora/scripts/response-schema.json +26 -0
- package/templates/.claude/skills/agora/scripts/reviewers.sh +312 -0
- package/templates/.claude/skills/agora/scripts/verdict-schema.json +34 -0
- package/templates/.claude/skills/hada-scout/SKILL.md +1 -1
- package/templates/.claude/skills/help/SKILL.md +1 -1
- package/templates/.claude/skills/pipeline/workflows/auto-dev.yaml +47 -6
- package/templates/.claude/skills/sauron-watch/SKILL.md +1 -1
- package/templates/.claude/skills/status/SKILL.md +3 -3
- package/templates/.claude/skills/token-efficiency-audit/SKILL.md +1 -1
- package/templates/.github/workflows/wiki-sync.yml +1 -1
- package/templates/CLAUDE.md +3 -3
- package/templates/CLAUDE.md.en +3 -3
- package/templates/CLAUDE.md.ko +3 -3
- package/templates/README.md +5 -5
- package/templates/guides/agent-eval/README.md +1 -1
- package/templates/manifest.json +3 -3
- package/templates/workflows/auto-dev.yaml +47 -6
|
@@ -282,17 +282,21 @@ The Subagent Scope-Creep STOP Protocol (above) is REACTIVE — it halts an agent
|
|
|
282
282
|
|
|
283
283
|
Cross-reference: the Subagent Scope-Creep STOP Protocol (reactive halt after trips) and R001 (credential/privileged-scope guardrails, re-confirm scope before irreversible shared-infra actions).
|
|
284
284
|
|
|
285
|
-
#### 우회 플래그는 우회 대상과 근거를 명시 (Origin: #1584 #6)
|
|
285
|
+
#### 우회 플래그는 우회 대상과 근거를 명시 (Origin: #1584 #6, #1591)
|
|
286
286
|
|
|
287
|
-
|
|
287
|
+
**선행 실측 (신설, #1591)**: 우회 플래그(`--admin`, `--force`, `--no-verify` 등)를 위임 프롬프트에 지시하기 **전에**, 그 플래그가 실제로 필요한지 먼저 실측한다(`gh api repos/{owner}/{repo}/branches/{branch}/protection`). 불필요하면 정답은 **서술 보강이 아니라 플래그 제거**다 — 근거 서술은 플래그가 실제로 필요할 때에만 의미가 있다.
|
|
288
|
+
|
|
289
|
+
보호장치를 우회하는 플래그를 위임 프롬프트에 지시할 때는 **무엇을 우회하는지와 그것이 정당한 근거**를 함께 적는다. 플래그만 적으면 하니스·에이전트가 무권한 우회로 판정해 플래그하거나 거부한다.
|
|
288
290
|
|
|
289
291
|
| Anti-pattern | Required |
|
|
290
292
|
|--------------|----------|
|
|
291
|
-
| `
|
|
293
|
+
| 우회 플래그(`--admin` 등)만 지시하고 근거 없음 | 실측 branch protection과 대조 후, 플래그가 실제로 필요할 때만 우회 대상·근거를 명시 — 예: "required status check 6종 전부 pass 확인함. `enforce_admins=false`이므로 `--admin`이 우회하는 것은 **그 6종 CI 게이트**뿐이며, [사유]로 이를 승인한다" |
|
|
292
294
|
|
|
293
295
|
목적은 권한 확보가 아니라 **감사 추적**이다. 승인의 인용이 아니라 우회 범위의 사실 서술이므로 아래 「Delegation Prompt Framing — 승인 인용 금지」와 충돌하지 않는다.
|
|
294
296
|
|
|
295
|
-
|
|
297
|
+
**실측 기록 (2026-08-15, `gh api repos/{owner}/{repo}/branches/develop/protection`)**: required status checks **6종** — `Test`, `Lint`, `Template Sync`, `Version Sync`, `Dependency Security Audit`, `Rust Tests` (`strict=true`). **`enforce_admins=false`**. **`required_pull_request_reviews` 부재** — 리뷰어 승인 요건 자체가 없다. 다음 릴리즈가 재확인하지 않도록 이 값을 여기 고정 기록한다.
|
|
298
|
+
|
|
299
|
+
Origin: #1584 #6 — v1.1.45·v1.1.46 릴리즈 PR 머지에서 하니스가 "no visible user authorization naming that bypass"로 플래그했다. #1591 (v1.1.47 세션 실측) — v1.1.47이 신설한 위 표의 예시가 사실과 달랐다: "required status check **10종**"은 실제 **6종**이었고, "`--admin`이 우회하는 것은 **리뷰어 승인 요건**뿐"은 틀렸다 — 리뷰어 승인 요건 자체가 존재하지 않고 `enforce_admins=false`이므로 `--admin`이 실제로 우회하는 것은 **CI 게이트 6종**이었다. 기존 예시는 더 위험한 우회를 무해한 것처럼 서술하고 있었다. 근본 원인 진단 결과 develop 브랜치에는 `--admin`이 애초에 불필요했다 — 실측 없이 확정형 근거를 적으면 우회 범위 자체를 오판할 수 있다는 사례.
|
|
296
300
|
|
|
297
301
|
<!-- ARCHIVED CC version note (historical):
|
|
298
302
|
> **v2.1.178+**: Auto mode now evaluates subagent spawns with the safety classifier BEFORE launch, closing a gap where a spawned subagent could request a blocked action without prior review. This is the PLATFORM-level complement to the (advisory) Pre-Delegation Privileged-Scope Boundary above: the orchestrator still states the approved/forbidden scope in the delegation prompt (proactive, model-level), and CC now also gates the spawn itself (platform-level). The two are defense-in-depth — the prompt-stated boundary remains required because the classifier gates ACTIONS, not task SCOPE.
|
|
@@ -330,21 +334,50 @@ Origin: #1563 찐빠 #3 — `gh issue edit --assignee`가 gh 2.86.0에 없는
|
|
|
330
334
|
| Anti-pattern | Required |
|
|
331
335
|
|--------------|----------|
|
|
332
336
|
| 이전 턴에서 본 HEAD SHA를 위임서에 그대로 기재 | 위임 직전 `git rev-parse --short HEAD` 실측값 기재 |
|
|
337
|
+
| 브랜치 이름은 고정이라 보고 HEAD SHA만 재실측 | 브랜치 이름도 함께 재실측 — 공유 워크트리에서는 **브랜치 이름도 턴 단위 수명**이다(#1595 #1, R017 「게이트는 분기 시점 1회가 아니라 상태변경 위임마다」) |
|
|
333
338
|
|
|
334
339
|
Origin: #1584 #5 (v1.1.45 세션 — 커밋 위임서에 `develop @ 96ef8f85`로 적었으나 실측은 `f6d3f518`; #1572 머지 후 pull 미반영). R017 「메모리 TODO를 위임 전제로 쓸 때」의 **세션 내 축소판** — 스냅샷의 수명이 세션 간이 아니라 **턴 간**이라는 차이만 있다.
|
|
335
340
|
|
|
341
|
+
#### 참인 전제 ≠ 참인 함의 — 브랜치 전환 위임 (Origin: #1595 #2)
|
|
342
|
+
|
|
343
|
+
uncommitted 변경이 있는 상태의 브랜치 전환을 위임할 때, 위임서에 **전환의 결과를 확정형으로 예측해 적지 않는다**. "대상 브랜치에 그 파일이 없다"는 **사실**에서 "전환해도 안전하다"는 **함의**는 도출되지 않는다 — 파일이 **없기 때문에** checkout이 그 파일을 삭제해야 하고, modified 상태면 거부된다.
|
|
344
|
+
|
|
345
|
+
위임서에는 예측 대신 다음 두 가지를 적는다.
|
|
346
|
+
|
|
347
|
+
1. **대상 브랜치와의 파일 집합 차이를 먼저 열거**한다 — `git status --short`(로컬 변경분) + 각 경로에 대해 `git cat-file -e <target>:<path>`(대상 브랜치 존재 여부). 결과는 **관측값**으로만 기재하고 전환 가능 여부를 단정하지 않는다.
|
|
348
|
+
2. **표준 문구를 유지**한다 — "`stash`/`reset`/`clean`/force 일절 금지. 전환이 거부되면 **즉시 중단하고 오류 전문을 그대로 보고**하라." 부작용 없는 사전 확인 수단이 마땅치 않으므로, 이 금지 목록이 실질 방어선이다.
|
|
349
|
+
|
|
350
|
+
| Anti-pattern | Required |
|
|
351
|
+
|--------------|----------|
|
|
352
|
+
| "대상 브랜치에 없는 파일이므로 전환 후 untracked가 됩니다"처럼 전환 결과를 확정형으로 위임서에 기재 | 파일 집합 차이를 관측값으로만 열거; 결과 예측은 기재하지 않음 |
|
|
353
|
+
| 전환 거부 시 서브에이전트가 `stash`/`reset`/`clean`으로 자체 우회 | 위임서에 금지 목록 + "거부 시 즉시 중단, 오류 전문 보고"를 표준 문구로 포함 |
|
|
354
|
+
|
|
355
|
+
Origin: #1595 #2 (v1.1.48 세션 — `git checkout -b release/v1.1.48 develop`이 `tests/fixtures/agora/*.json` 6개 때문에 거부. `git cat-file -e develop:…` 실측은 "develop에 없음"으로 **참이었으나** 함의가 반대였다). **완화 실증**: 금지 목록이 작동해 mgr-gitnerd가 강제 전환을 시도하지 않았고 **손실 0**. Cross-ref: R020 Read-Before-Characterize, R001 Pre-Delegation Blast-Radius Enumeration.
|
|
356
|
+
|
|
336
357
|
### Parallel Delegation — Sibling-Agent Disclosure
|
|
337
358
|
|
|
338
359
|
2개 이상의 서브에이전트를 같은 메시지에서 병렬 스폰할 때, 각 위임 프롬프트는 **형제 에이전트의 존재와 각자의 담당 범위**를 고지해야 한다. 서브에이전트는 격리된 컨텍스트에서 실행되어 형제를 인지할 수 없으므로, 고지가 없으면 `git status` 같은 **저장소 전역 공유 뷰**의 출력을 자기 변경분으로 오독하거나 경합 원인을 "외부 세션/프로세스"로 오귀속한다.
|
|
339
360
|
|
|
340
361
|
고지에 포함할 것: 동시 실행 에이전트 수, 각 에이전트의 담당 파일/영역, 그리고 "공유 뷰에 타 에이전트 변경분이 함께 보이므로 **자기 담당 범위만 기준으로 보고**하라"는 지시.
|
|
341
362
|
|
|
363
|
+
**파일 소유권만으로는 부족하다 — 공유 자원도 고지 대상이다 (Origin: #1598).** 편집 대상 파일이 완전히 disjoint해도 형제 에이전트는 **검증 명령·CPU·`$TMPDIR`**을 공유한다. 위임서에 다음 셋을 함께 규정한다.
|
|
364
|
+
|
|
365
|
+
| 공유 자원 | 위임서에 규정할 것 |
|
|
366
|
+
|-----------|--------------------|
|
|
367
|
+
| 검증 명령 | 완료 조건에 **동일한 검증 명령**(`bun test` 등)이 들어가면 그 사실을 고지하거나, 검증을 오케스트레이터가 회수해 **직렬 1회**로 실행한다. 스위트가 저장소 tracked 파일을 이동·삭제·복구하면 동시 실행 시 한쪽이 다른 쪽의 픽스처를 지운다 |
|
|
368
|
+
| CPU | 초 단위 타임아웃 예산에 의존하는 테스트는 병렬 배치에서 제외하거나 그 예산을 고지한다 — CPU 포화 시 스텁조차 기동을 마치지 못한다 |
|
|
369
|
+
| `$TMPDIR` | 임시 파일을 쓰는 실험·계측은 **에이전트별 고유 경로**를 지정하고, "임시 파일 누수" 같은 측정은 그 격리 경로에서만 계수한다 |
|
|
370
|
+
|
|
342
371
|
| Anti-pattern | Required |
|
|
343
372
|
|--------------|----------|
|
|
344
373
|
| 병렬 스폰 프롬프트에 형제 에이전트 고지 없이 위임 → 공유 뷰 출력을 오독하거나 원인을 "외부 프로세스"로 오귀속 | 각 프롬프트에 동시 실행 에이전트 수 + 각자 담당 범위 + "자기 담당 범위만 기준으로 보고" 지시 명시 |
|
|
374
|
+
| 파일 소유권만 고지하고 동일 검증 명령을 각 에이전트 완료 조건에 넣어 병렬 발주 | 검증 명령 공유를 고지하거나 검증을 오케스트레이터가 직렬 1회로 회수 |
|
|
375
|
+
| 공유 `$TMPDIR`에 고정 경로로 임시 파일을 쓰고 그 디렉토리를 전수 계수 | 에이전트별 고유 경로 사용 + 그 경로만 계수 |
|
|
345
376
|
|
|
346
377
|
> Origin: #1518 (찐빠 #3 — 미고지 git 에이전트가 형제를 "외부 프로세스"로 오귀속; 같은 세션에서 고지한 4개 구현 에이전트는 전원 정확히 구분 보고 — 대조 실증). Cross-ref: R009 (병렬 실행 조건).
|
|
347
378
|
|
|
379
|
+
> Origin 보강: #1598 — 파일이 완전 disjoint한 병렬 배치에서 위양성 4종 발생(judge.sh 테스트 7건 ENOENT: 두 테스트가 tracked `verdict-schema.json`을 cp→rm→복구 / reviewers.sh 타임아웃 테스트 간헐 실패: CPU 포화 / "임시 파일 누수 1건" 오측정: 형제 잔여물, 격리 셔임 재측정 시 0). **3종의 원인은 오케스트레이터가 위임서에 넣은 완료 조건 자체였다** — 형제 고지의 결함이 아니라 고지 항목의 누락이다.
|
|
380
|
+
|
|
348
381
|
#### 고지는 귀속 후보를 늘릴 뿐 증거 등급을 올리지 않는다
|
|
349
382
|
|
|
350
383
|
형제 고지를 받았더라도 **정황 귀속(형제 탓)은 여전히 오답을 낸다** — 오히려 고지가 그럴듯한 오귀속 대상을 제공한다. 공유 뷰의 이상 징후는 형제 고지 여부와 무관하게 **개입 실험**(캐시 제거·복원, `bash -x` 추적, 변경 되돌려 재현)으로 귀속해야 한다.
|
|
@@ -355,6 +388,16 @@ Origin: #1584 #5 (v1.1.45 세션 — 커밋 위임서에 `develop @ 96ef8f85`로
|
|
|
355
388
|
|
|
356
389
|
> Origin: #1574 (v1.1.44 세션 대조 실증 — 동일 고지를 받은 3개 병렬 에이전트 중 [1]은 `bun test` 11 fail을 "형제가 그 파일 편집 중"으로 정황 귀속해 오답, [2]/[3]은 개입 실험으로 정확히 귀속). Cross-ref: R020 (Read-Before-Characterize — 정황으로 특성화 금지).
|
|
357
390
|
|
|
391
|
+
##### "플래키"는 원인이 아니다 (Origin: #1598)
|
|
392
|
+
|
|
393
|
+
간헐 실패에 **"플래키"·"부하 의존"이라는 판정을 결론으로 쓰지 않는다** — 그것은 "재현 조건을 아직 못 찾았다"는 뜻이지 "원인이 무작위"라는 뜻이 아니다. 각 서브에이전트는 격리 컨텍스트라 **형제가 같은 스위트를 동시에 도는 것을 구조적으로 볼 수 없으므로**, 형제 경합이 원인인 실패에 대해 각자 합리적이지만 틀린 "부하 의존 플래키" 결론에 도달한다. 간헐 실패는 개입 실험(단독 재실행 / 격리 `$TMPDIR` 재측정 / 형제 완료 후 재현)으로 귀속하고, 귀속에 실패하면 **"원인 미귀속 — 재현 조건 미확보"로 보고**한다.
|
|
394
|
+
|
|
395
|
+
| Anti-pattern | Required |
|
|
396
|
+
|--------------|----------|
|
|
397
|
+
| 간헐 실패를 "플래키"·"부하 의존"으로 판정하고 종료 | 개입 실험으로 귀속; 실패 시 "원인 미귀속"으로 보고(무작위라 단정 금지) |
|
|
398
|
+
|
|
399
|
+
Origin: #1598 (형제 병렬 배치의 위양성 4종 중 3종이 각 에이전트에서 "부하 의존 플래키"로 결론났고, 실제 원인은 형제와의 검증 명령·CPU·`$TMPDIR` 경합이었다).
|
|
400
|
+
|
|
358
401
|
## Universal bypassPermissions
|
|
359
402
|
|
|
360
403
|
> **This section is the canonical single source for the bypassPermissions requirement.** R002 (MUST-permissions.md) and R006 (MUST-agent-design.md) reference this section rather than repeating it.
|
|
@@ -449,6 +492,8 @@ Before spawning any agent:
|
|
|
449
492
|
|
|
450
493
|
Before delegating a task to a subagent, MUST verify the target agent's tool capabilities against the task requirements. Failure to pre-check causes round-trip waste (delegation → failure → re-delegation).
|
|
451
494
|
|
|
495
|
+
> **표 조회 배선 (MUST, #1593 #1)**: 위임 프롬프트를 작성하기 **전에** 아래 "Known Limitations (Active Cache)" 표에서 대상 에이전트 이름을 조회한다. 표에 항목이 있으면 그 제약에 걸리는 완료 조건 항목을 제거하거나 대체 경로를 지정한다. **표가 존재해도 참조되지 않으면 무효**다 — R016 Rule Wiring Check의 "텍스트 ≠ 배선" 원칙이 위임 습관에도 그대로 적용된다.
|
|
496
|
+
|
|
452
497
|
### Required Checks
|
|
453
498
|
|
|
454
499
|
| Task involves | Verify in target agent frontmatter |
|
|
@@ -481,7 +526,7 @@ Before delegating a task to a subagent, MUST verify the target agent's tool capa
|
|
|
481
526
|
|
|
482
527
|
| Agent | Limitation | Workaround |
|
|
483
528
|
|-------|-----------|-----------|
|
|
484
|
-
| `arch-documenter` | `disallowedTools: [Bash]` — cannot run `gh`, shell scripts | Pre-collect data via orchestrator, pass as content; OR use `general-purpose` for the Bash-needing portion |
|
|
529
|
+
| `arch-documenter` | `disallowedTools: [Bash]` — cannot run `gh`, shell scripts, `diff`/`md5`/`verify-*.sh` | Pre-collect data via orchestrator, pass as content; OR use `general-purpose` for the Bash-needing portion. **Completion-condition guard (#1593 #1)**: do NOT put `diff` / `md5` / `verify-*.sh` execution into arch-documenter's completion criteria — the orchestrator must run these itself, or split off a `general-purpose` agent for the Bash-needing verification |
|
|
485
530
|
| `qa-engineer` | (verify each invocation) | — |
|
|
486
531
|
|
|
487
532
|
### Common Violation
|
|
@@ -25,6 +25,25 @@ Examples: creating multiple agents, reviewing multiple files, batch operations o
|
|
|
25
25
|
|
|
26
26
|
Origin: #1518 (찐빠 #1 — git 에이전트 2개 근접 실행으로 작업 브랜치 stale; 편집 파일은 disjoint였음).
|
|
27
27
|
|
|
28
|
+
#### 파일 disjoint ≠ 자원 disjoint (Origin: #1598)
|
|
29
|
+
|
|
30
|
+
git 상태 외에도 병렬 에이전트가 경합하는 공유 자원이 있다 — **검증 명령이 만지는 저장소 파일**, **CPU**, **`$TMPDIR`**. 편집 파일이 disjoint하다는 사실은 이 셋 중 어느 것도 보장하지 않는다.
|
|
31
|
+
|
|
32
|
+
| 자원 | 병렬 가능 조건 |
|
|
33
|
+
|------|----------------|
|
|
34
|
+
| 검증 명령(`bun test` 등) | 스위트가 저장소 tracked 파일을 이동·삭제·복구하지 않고, 초 단위 타임아웃 예산에 의존하지 않을 때만. 아니면 오케스트레이터가 **직렬 1회**로 회수 |
|
|
35
|
+
| CPU | 타임아웃 예산이 초 단위인 테스트는 동시 실행 금지 — 포화 시 프로세스 기동만으로 예산을 넘긴다 |
|
|
36
|
+
| `$TMPDIR` | 에이전트별 고유 하위 경로를 쓸 때만. 고정 경로를 공유하면 "누수 N건" 같은 측정이 형제 잔여물을 계상한다 |
|
|
37
|
+
|
|
38
|
+
**테스트가 tracked 파일을 이동시키지 않는다**: `cp` → `rm` → `finally` 복구 패턴은 병렬 경합 위양성뿐 아니라 **프로세스 중단 시 tracked 파일이 사라진 채 남는다**. 픽스처는 고유 임시 디렉토리에 사본을 만들어 조작하고 원본은 읽기만 한다.
|
|
39
|
+
|
|
40
|
+
| Anti-pattern | Required |
|
|
41
|
+
|--------------|----------|
|
|
42
|
+
| 편집 파일이 disjoint하므로 각 에이전트 완료 조건에 동일 `bun test`를 넣어 병렬 발주 | 검증을 직렬 1회로 회수하거나, 공유를 고지하고 결과 해석에서 형제 경합을 먼저 배제 |
|
|
43
|
+
| 테스트가 실제 저장소 tracked 파일을 `cp`→`rm`→`finally` 복구 | 고유 임시 디렉토리에 사본을 만들어 조작 — 원본은 읽기 전용 |
|
|
44
|
+
|
|
45
|
+
Origin: #1598. Cross-ref: R010 「Parallel Delegation — Sibling-Agent Disclosure」(고지에 담을 내용), R023(Delegated Verification Floor).
|
|
46
|
+
|
|
28
47
|
## Agent Teams Gate (R018)
|
|
29
48
|
|
|
30
49
|
> Before spawning 2+ parallel agents, evaluate Agent Teams eligibility.
|
|
@@ -187,26 +206,56 @@ Single agent spawns do NOT use the `[N]` prefix.
|
|
|
187
206
|
|
|
188
207
|
## Narrative Announcement Format (Before Spawn)
|
|
189
208
|
|
|
190
|
-
|
|
209
|
+
병렬 dispatch 산문 announce는 **줄 시작에 대괄호 숫자가 오는 리터럴 형식**을 쓴다. 마크다운 리스트 마커(`- `)나 백틱을 그 앞에 붙이지 않는다 — R008 판정 정규식이 줄 시작의 대괄호 숫자를 요구하므로, 리스트 형식은 **규칙을 지킨 응답이 위반으로 계상**된다.
|
|
210
|
+
|
|
211
|
+
```
|
|
212
|
+
[secretary][opus] → Spawning:
|
|
213
|
+
[1] mgr-updater:sonnet → Group A 룰 파일 갱신
|
|
214
|
+
[2] lang-typescript-expert:sonnet → Group B 테스트 보강
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
| Anti-pattern | Required |
|
|
218
|
+
|--------------|----------|
|
|
219
|
+
| 리스트 마커나 백틱을 번호 앞에 붙임 | 줄 시작에 대괄호 숫자 — 앞에 공백 외 문자를 두지 않음 |
|
|
220
|
+
| 헤더에 콜론 생략 | Spawning 뒤에 **콜론 필수** |
|
|
221
|
+
| 화살표 없이 콜론만으로 연결 | 에이전트타입:모델 다음에 화살표 필수 |
|
|
222
|
+
|
|
223
|
+
**정규식 정합 (Origin: #1595 #5)**: 위 코드 블록의 형식은 `.claude/hooks/scripts/r007-r008-drift-advisor.sh`의 판정식과 1:1 대응한다. 화살표는 U+2192, ASCII 하이픈-부등호, U+2014-부등호 3종만 인식된다. 규칙 문구와 탐지기 정규식이 어긋나면 **규칙 준수 응답이 위반으로 계상되고, 그 계수를 근거로 다시 규칙을 고치는 악순환**이 생긴다. 형식을 바꿀 때는 advisor 정규식을 같은 커밋에서 갱신한다(R016 Rule Wiring Check). 이 형식은 위 「Display Format」 섹션과 동일하다 — 두 섹션이 서로 다른 형식을 요구하지 않도록 유지한다.
|
|
191
224
|
|
|
192
225
|
<!-- DETAIL: Narrative Announcement Format (Before Spawn)
|
|
193
|
-
|
|
226
|
+
산문 announce(Agent 도구 호출 자체가 아니라 그 앞의 텍스트)는 advisor 정규식과 리터럴로 일치해야 한다.
|
|
194
227
|
|
|
195
228
|
### Correct
|
|
196
229
|
|
|
230
|
+
```
|
|
231
|
+
[secretary][opus] → Spawning:
|
|
232
|
+
[1] {agent-a}:{model} → {task-a}
|
|
233
|
+
[2] {agent-b}:{model} → {task-b}
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### Incorrect — 리스트 마커/백틱을 번호 앞에 붙임 (spawn-item 미매칭)
|
|
237
|
+
|
|
197
238
|
```
|
|
198
239
|
병렬 실행:
|
|
199
|
-
- [1] {agent-a}: {task-a}
|
|
200
|
-
- [2] {agent-b}: {task-b}
|
|
240
|
+
- [1] {agent-a}:{model} → {task-a}
|
|
241
|
+
- [2] {agent-b}:{model} → {task-b}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### Incorrect — 헤더 콜론 누락 (spawn-header 미매칭)
|
|
245
|
+
|
|
246
|
+
```
|
|
247
|
+
[secretary][opus] → Spawning 2 agents
|
|
248
|
+
[1] {agent-a}:{model} → {task-a}
|
|
201
249
|
```
|
|
202
250
|
|
|
203
|
-
### Incorrect
|
|
251
|
+
### Incorrect — 화살표 누락 (spawn-item 미매칭)
|
|
204
252
|
|
|
205
253
|
```
|
|
206
|
-
|
|
254
|
+
[secretary][opus] → Spawning:
|
|
255
|
+
[1] {agent-a}:{model}: {task-a}
|
|
207
256
|
```
|
|
208
257
|
|
|
209
|
-
|
|
258
|
+
세 Incorrect 변형 모두 advisor가 announce로 세지 못해, 규칙을 지킨 응답이 R008 위반으로 계상된다.
|
|
210
259
|
-->
|
|
211
260
|
|
|
212
261
|
## Result Aggregation
|
|
@@ -97,7 +97,7 @@ Origin: #1512 (v1.1.28 커밋 staging에 dist/ 2파일 포함, 커밋 전 실측
|
|
|
97
97
|
|
|
98
98
|
카운트(스킬/에이전트/룰/가이드 수) 동기화는 **파일 목록 열거가 아니라 저장소 전수 grep + 의미 판별**로 수행한다. 같은 카운트가 15곳 이상에 흩어져 있어 열거식 위임은 목록에서 빠진 곳을 구조적으로 놓친다.
|
|
99
99
|
|
|
100
|
-
절차: (a) 실제 개수 실측(`ls -1d .claude/skills/*/ | wc -l` 등) → (b) 이전 값을 저장소 전역 grep → (c) 각 히트가 **카운트를 의미하는지 판별** → (d) 카운트 의미인 것만 정정.
|
|
100
|
+
절차: (a) 실제 개수 실측(`ls -1d .claude/skills/*/ | wc -l` 등) → (b) 이전 값을 저장소 전역 `git grep -n`으로 조사 → (c) 각 히트가 **카운트를 의미하는지 판별** → (d) 카운트 의미인 것만 정정.
|
|
101
101
|
|
|
102
102
|
무관한 숫자는 건드리지 않는다 — 버전번호(`v0.118.x`, CC `v2.1.118`), 이슈 번호, 과거 이력 서술("skill-count correction 114→118"), 스크립트 예시 주석은 정정 대상이 아니며 판단 근거와 함께 보고한다. grep 필터 주의: `--include='*.md'`는 `CLAUDE.md.en`/`CLAUDE.md.ko` 같은 **이중 확장자 파일을 매칭하지 못하므로**, 확장자 필터 없이 훑거나 별도 패턴을 병행한다.
|
|
103
103
|
|
|
@@ -105,10 +105,13 @@ Origin: #1512 (v1.1.28 커밋 staging에 dist/ 2파일 포함, 커밋 전 실측
|
|
|
105
105
|
|--------------|----------|
|
|
106
106
|
| 카운트 동기화를 "갱신할 파일 목록" 열거로 위임 | 전수 grep으로 이전 값 히트를 모두 수집한 뒤 카운트 의미만 정정 |
|
|
107
107
|
| `--include='*.md'` 필터로 전수 grep 수행 | 확장자 필터 없이 훑거나 이중 확장자 패턴 병행 |
|
|
108
|
+
| 셸의 `grep -rn`으로 전수 조사 | `git grep -n` 사용 — tracked 기준이라 릴리즈 대상과 일치하고 셸 함수/alias 셰이딩에 면역 (#1590) |
|
|
108
109
|
|
|
109
110
|
위임 프롬프트에는 항상 **"실측값 기준으로 동기화하라, 추측으로 숫자를 바꾸지 말라"**를 명시해, 오케스트레이터의 잘못된 전제를 서브에이전트가 정정할 여지를 남긴다(#1443).
|
|
110
111
|
|
|
111
|
-
|
|
112
|
+
`git grep`은 **untracked 파일을 보지 못한다** — 조사 전 `git status --porcelain`으로 untracked 0을 확인하거나, untracked 가능성이 있으면 `command grep`을 병행한다.
|
|
113
|
+
|
|
114
|
+
Origin: #1521 (찐빠 #2 — v1.1.32 skills 118→114 동기화에서 파일 열거식 위임이 6곳만 갱신, CI 3곳 지적 + 전수 grep 9곳 추가 발견, 최종 15곳); #1590 (셸 `grep`이 shell function으로 shadow되어 tracked 파일을 재귀 탐색에서 누락 — `git grep` 표준화). Cross-ref: #1443 (실측값 기준 명시), #1287 (multi-copy 일관성).
|
|
112
115
|
|
|
113
116
|
## When Required
|
|
114
117
|
|
|
@@ -155,6 +158,20 @@ Origin: #1492 (Session 132) — cc-release-monitor 워크플로우 삭제(#1454,
|
|
|
155
158
|
|--------------|----------|
|
|
156
159
|
| 원격 머지 후 stale 로컬 develop에서 릴리즈 브랜치 분기 | 분기 전 `git pull origin develop`; PR 생성 후 mergeStateStatus 확인 — CONFLICTING이면 `git merge origin/develop`+both-유지 해결 후 재CI |
|
|
157
160
|
|
|
161
|
+
### 게이트는 분기 시점 1회가 아니라 상태변경 위임마다 (Origin: #1595 #1)
|
|
162
|
+
|
|
163
|
+
위 게이트는 "브랜치 **분기 전** pull"을 규정하지만, 공유 워크트리에서는 **세션 도중 다른 행위자가 브랜치 자체를 바꾼다**. 따라서 git 상태를 바꾸는 위임(브랜치 생성·전환, 커밋, 머지, push) **직전마다** 브랜치 이름과 HEAD SHA를 재실측하고 세션 초반 값과 대조한다 — `git rev-parse --abbrev-ref HEAD` 와 `git rev-parse --short HEAD` 두 줄이면 충분하다.
|
|
164
|
+
|
|
165
|
+
값이 달라졌으면 위임을 중단하고 **원인을 먼저 실측**한다(`git reflog`로 전환·커밋 주체와 시각 확인). #1584 #5가 "SHA의 수명은 턴 단위"를 규정했는데, 공유 워크트리에서는 **브랜치 이름조차 턴 단위 수명**이다.
|
|
166
|
+
|
|
167
|
+
| Anti-pattern | Required |
|
|
168
|
+
|--------------|----------|
|
|
169
|
+
| 세션 초반에 실측한 브랜치·HEAD를 세션 내내 유효한 사실로 사용 | 상태변경 위임 직전마다 브랜치 이름 + HEAD SHA 재실측·대조 |
|
|
170
|
+
| 파일 목록·`git ls-files` 결과를 "확인된 사실"로 저장하고 재확인 트리거 없이 재사용 | 실측값에 **측정 시각**을 함께 기록하고, 위임 전제로 쓰기 전 재실측 |
|
|
171
|
+
| 대조 불일치를 발견하고도 원인 규명 없이 위임 강행 | `git reflog`로 전환·커밋 주체와 시각을 실측한 뒤 재계획 |
|
|
172
|
+
|
|
173
|
+
Origin: #1595 #1 (v1.1.48 세션 — 세션 시작 시 `develop @ 1b4973d5` 실측 후 진행했으나 다른 세션이 14:56·15:10에 `feat/agora-anonymous-consensus`를 만들고 커밋 2개를 쌓았고, wiki 재동기화 Phase 2까지 미탐지. 같은 세션에서 `git ls-files tests/fixtures/agora/`가 초반 0건 → 후반 6건으로 바뀌었다). Cross-ref: R010 「저장소 상태 기재도 같은 규율」(위임서 기재 각도), R011(Temporal Decay).
|
|
174
|
+
|
|
158
175
|
## Pre-Release Target Version Ground-Truth Gate (Origin: #1457)
|
|
159
176
|
|
|
160
177
|
새 릴리즈의 target 버전을 선정하거나 구현/구현-위임 프롬프트에 target 버전을 전달하기 전, 반드시 원격 실측으로 다음 버전을 확정한다: `git tag --sort=-v:refname | head -1`(최신 태그) + `npm view <pkg> version`(배포된 최신)의 **max에 patch를 더한 값**을 target으로 삼는다. 세션 메모리의 버전 스냅샷(예: "npm latest 1.1.6")은 **참고용이며 ground-truth가 아니다** — 직전 세션에서 릴리즈가 진행돼 stale일 수 있다. stale 버전으로 위임하면 이미 배포된 버전을 target으로 잡아 milestone-closed STOP에 걸리고 재타겟팅 왕복이 강제된다.
|
|
@@ -201,6 +218,8 @@ R017 게이트(mgr-sauron) 통과 선언 후 신규 결함 발견 등으로 스
|
|
|
201
218
|
|
|
202
219
|
Origin: #1584 #4 (v1.1.45 세션) — R021 자기 서술 staleness 반영을 R017 통과 **후** 수행해 위키 재동기화 1회 + 게이트 전량 재실행 발생. 포함 판단 자체는 옳았고 **시점**이 결함이었다.
|
|
203
220
|
|
|
221
|
+
> **v2.1.233+**: `claude plugin validate`가 **bare `.claude/skills` 디렉토리**(플러그인 매니페스트 없는 스킬 트리)도 검사해, frontmatter 파싱에 실패하는 `SKILL.md`를 보고합니다. 이 저장소의 `.claude/skills/**/SKILL.md`는 아래 Quick Verification Commands가 **개수만** 세고 frontmatter 유효성은 세지 않으므로, 스킬 추가·수정 후 `claude plugin validate`를 개수 대조와 **함께** 실행해 파싱 실패를 결정론적으로 잡습니다(구버전에서는 이 경로가 검사 대상이 아니어서 깨진 frontmatter가 런타임 미로드로만 드러났습니다). Cross-ref: R023(Tier 1 결정론적 검증).
|
|
222
|
+
|
|
204
223
|
## Quick Verification Commands — agent/skill/guide/wiki counts via ls/find/wc. See commands via Read tool.
|
|
205
224
|
|
|
206
225
|
<!-- DETAIL: Quick Verification Commands
|
|
@@ -37,7 +37,7 @@ R008 prefix(announce)와 실제 도구 호출은 분리된 단계다. prefix 를
|
|
|
37
37
|
|
|
38
38
|
| Anti-pattern | Required |
|
|
39
39
|
|--------------|----------|
|
|
40
|
-
|
|
|
40
|
+
| AskUserQuestion 호출 앞에 Core Rule 형식의 prefix 라인(에이전트·모델 대괄호 다음 화살표와 Tool 표기)만 출력하고 `questions` 파라미터 없이/빈 배열로 호출 | prefix + `questions` 배열(최소 1개) 모두 채워 호출 |
|
|
41
41
|
| announce 후 payload 의 required 필드 누락 (announce-payload separation gap) | announce 와 동일 메시지에서 required 필드 완비 호출 |
|
|
42
42
|
|
|
43
43
|
Cross-reference: R020 (action-completeness precondition — invoke 전에 required 파라미터 확인). Reference issue: #1324 (찐빠: AskUserQuestion `questions`-missing recurrence).
|
|
@@ -92,17 +92,35 @@ matches the spawn announcement:
|
|
|
92
92
|
[2] lang-python-expert:sonnet → Python code review
|
|
93
93
|
```
|
|
94
94
|
|
|
95
|
+
### Spawn Announce 리터럴 — advisor 정규식 정합 (Origin: #1595 #5)
|
|
96
|
+
|
|
97
|
+
위 예시는 `.claude/hooks/scripts/r007-r008-drift-advisor.sh`의 판정식과 리터럴로 일치한다. 다음 변형은 **미매칭**되어, 규칙을 지킨 응답이 R008 위반으로 계상된다.
|
|
98
|
+
|
|
99
|
+
| 금지 변형 | 미매칭 이유 |
|
|
100
|
+
|-----------|-------------|
|
|
101
|
+
| 번호 앞에 리스트 마커(`- `)나 백틱을 붙임 | spawn-item 정규식은 **줄 시작의 대괄호 숫자**를 요구하며, 선행 공백만 허용한다 |
|
|
102
|
+
| Spawning 뒤 콜론 생략 (예: "Spawning 4 agents") | 헤더 정규식이 **콜론**을 요구한다 |
|
|
103
|
+
| 에이전트타입:모델 뒤에 화살표 없이 설명만 이어붙임 | spawn-item 정규식이 **화살표**를 요구한다 (U+2192 / ASCII 하이픈-부등호 / U+2014-부등호 3종만 인식) |
|
|
104
|
+
|
|
105
|
+
규칙 문구와 탐지기 정규식이 어긋나면 오탐 계수가 다시 규칙 개정의 근거가 되는 악순환이 생긴다. 형식을 바꿀 때는 advisor 정규식을 같은 커밋에서 갱신한다(R016 Rule Wiring Check).
|
|
106
|
+
|
|
107
|
+
**문서 작성 주의**: advisor의 announce 정규식에는 줄 시작 앵커가 없어, 표 셀·인라인 백틱 안에 완전한 리터럴을 넣으면 **그 문서를 인용하는 응답 턴이 announce로 오계상**된다(482턴 실측에서 실제 발생). 형식 예시는 코드 펜스 안에 줄 시작으로만 두고, 표에서는 산문으로 서술한다.
|
|
108
|
+
|
|
109
|
+
Cross-ref: R009 「Narrative Announcement Format」(같은 리터럴을 산문 announce에 적용), R020 「자가 계수는 advisor 판정식을 재현한다」.
|
|
110
|
+
|
|
111
|
+
Origin: #1595 #5 (v1.1.48 세션 — R008 위반 3건이 단일 턴에 집중. tool_use=5 / announce=2로 계산됐고, 실제 announce는 리스트 마커와 백틱이 앞에 붙은 형식이라 전부 미매칭. 헤더도 콜론이 없었다).
|
|
112
|
+
|
|
95
113
|
<!--
|
|
96
114
|
> **v2.1.174+**: Fixed the Workflow tool's `agent()` subagents missing per-agent attribution headers. Workflow-spawned subagents now carry attribution consistent with R008 — when authoring Workflow scripts, each `agent()` call is attributed like a direct Agent tool spawn. Align Workflow orchestration with the R008 `[agent][model] → Tool:` identification discipline: a Workflow `agent()` fan-out should still be reasoned about with the same per-agent identification model as parallel Agent tool spawns.
|
|
97
115
|
-->
|
|
98
116
|
|
|
99
117
|
## Tier-3 Interaction Tool Prefix (MANDATORY)
|
|
100
118
|
|
|
101
|
-
R008 "every tool call" applies to Tier-3 interaction tools too — NOT only file/exec tools. Applying the
|
|
119
|
+
R008 "every tool call" applies to Tier-3 interaction tools too — NOT only file/exec tools. Applying the Core Rule prefix form (에이전트·모델 대괄호 다음 화살표와 Tool 표기) to Agent/Bash/Read while omitting it on `AskUserQuestion`, `TodoWrite`, `EnterPlanMode`, etc. is a violation.
|
|
102
120
|
|
|
103
121
|
| Tool | R008 prefix required? |
|
|
104
122
|
|------|----------------------|
|
|
105
|
-
| AskUserQuestion | YES —
|
|
123
|
+
| AskUserQuestion | YES — Core Rule 형식의 prefix(에이전트·모델 대괄호 + 화살표 + Tool 표기 + 도구명)를 호출 앞에 출력 |
|
|
106
124
|
| TodoWrite | YES |
|
|
107
125
|
| EnterPlanMode / ExitPlanMode | YES |
|
|
108
126
|
| Skill | NO separate R008 prefix — identified via R007 `claude → {skill-name}` integrated header instead |
|
|
@@ -128,7 +146,7 @@ Agent(description: "[2] Python code review", subagent_type: "lang-python-expert"
|
|
|
128
146
|
|
|
129
147
|
매 도구 호출 직전, 이전 호출이 prefix 를 가졌는지에 의존하지 말고 다시 자가 점검:
|
|
130
148
|
|
|
131
|
-
1. 이 호출 위에
|
|
149
|
+
1. 이 호출 위에 Core Rule 형식의 prefix 라인(에이전트명·모델 대괄호 + 화살표 + Tool 표기 + 도구명)이 있는가?
|
|
132
150
|
2. agent-name 과 model 이 현재 컨텍스트와 일치하는가?
|
|
133
151
|
3. 이 호출에 도구 스키마상 required 파라미터가 모두 채워져 있는가? (예: AskUserQuestion 는 `questions` 배열이 비어 있지 않아야 함) prefix(announce)만 출력하고 실제 호출 payload 의 required 필드를 누락하면 안 된다.
|
|
134
152
|
|