oh-my-customcode 1.1.60 → 1.1.61
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/rules/MUST-completion-verification.md +4 -0
- package/templates/.claude/rules/MUST-orchestrator-coordination.md +2 -0
- package/templates/.claude/rules/MUST-sync-verification.md +4 -0
- package/templates/.claude/rules/MUST-tool-identification.md +11 -0
- package/templates/.claude/rules/SHOULD-memory-integration.md +3 -0
- package/templates/.claude/skills/fsd/SKILL.md +40 -2
- package/templates/.claude/skills/pipeline/workflows/auto-dev.yaml +38 -5
- package/templates/.claude/skills/post-release-followup/SKILL.md +8 -0
- package/templates/manifest.json +1 -1
- package/templates/workflows/auto-dev.yaml +38 -5
package/dist/cli/index.js
CHANGED
package/dist/index.js
CHANGED
package/package.json
CHANGED
|
@@ -271,10 +271,14 @@ This is the interrupt-intent extension of Read-Before-Characterize ("actual inte
|
|
|
271
271
|
| 에러 원인 추정 | 첫 가설로 워크플로우/설정 영구 수정 | 가설을 좁은 범위에서 검증 후 변경 |
|
|
272
272
|
| CI/publish 실패 | 추정 기반 우회 커밋 머지 | 에러 메시지/로그로 실제 원인 확정 |
|
|
273
273
|
| 권한/토큰 오류 | 플래그/옵션 변경으로 우회 시도 | 권한 범위·토큰 종류 직접 확인 |
|
|
274
|
+
| 트랜스크립트·로그 통계로 원인 추정 | 통계적 상관(예: "첫 레코드 thinking 13/21")만으로 코드 경로의 인과를 "확정"해 이슈 코멘트·메모리에 기록 | 해당 코드 경로를 읽고 판정 로직을 1:1 재현(jq/스크립트)해 인과를 확인한 뒤 기록; 그 전에는 R011 `[hypothesis]` 태그로만 저장 |
|
|
274
275
|
|
|
275
276
|
### Common Violation (#1217 item #4)
|
|
276
277
|
npm publish E403을 `--provenance` attestation 충돌로 오진단 → release workflow에서 `--provenance` 제거 커밋 머지 → 2차 시도 동일 실패 → 실제 원인은 NPM_TOKEN 권한(Automation token 필요). 잘못된 추정으로 릴리즈 워크플로우를 영구 변경.
|
|
277
278
|
|
|
279
|
+
### Common Violation (#1652 #1) — 통계적 상관 ≠ 코드 인과
|
|
280
|
+
v1.1.59 세션에서 #1643(advisor "R007 헤더=0" 오탐) 원인을 트랜스크립트 통계만으로 "advisor가 thinking 전용 첫 레코드를 병합하지 못함"이라 이슈 코멘트·feedback 메모리에 확정 기록 → triage가 현행 코드(이미 병합·thinking 제외)와의 불일치를 지적 → 진단 에이전트가 jq로 판정 로직을 1:1 재현해 반박 — 실제 원인은 레이블 문구 모호성(값은 위반 건수인데 "헤더=0"으로 읽힘). 같은 세션 2회째: `gh pr merge --delete-branch` 로컬 부수효과를 reflog 3건으로 "확정" 저장했으나 4번째 머지(PR #1651)에서 재현되지 않아 "원인 미확정"으로 정정. 두 건 모두 상관을 인과로 승격한 Read-Before-Characterize 자기 위반이며, R011 즉시 저장과 결합해 틀린 전제가 영속화될 뻔했다. Cross-ref: R011 「Mid-Session Immediate Save」 `[hypothesis]` 행, R010 「저장소 상태 기재도 같은 규율」, 아래 「Self-Violation Counting Is Also Diagnosis」.
|
|
281
|
+
|
|
278
282
|
### Self-Check (영구 변경 전)
|
|
279
283
|
1. 가설을 뒷받침하는 직접 증거(로그/에러 코드/문서)가 있는가?
|
|
280
284
|
2. 비파괴적 방법으로 가설을 검증할 수 있는가?
|
|
@@ -690,6 +690,8 @@ Subagent NOT required for:
|
|
|
690
690
|
|
|
691
691
|
"Simple" means READ-ONLY operations. If the task involves any file creation, modification, or deletion, it must be delegated. There is no "too small to delegate" exception for write operations.
|
|
692
692
|
|
|
693
|
+
**Carve-out — PPID 스코프 `/tmp` 런타임 상태 마커 (Origin: #1650 C, v1.1.61)**: 프로젝트 트리 **밖**의 `/tmp` 아래에 세션 프로세스 ID로 스코프된 1줄짜리 런타임 마커(예: `/tmp/.claude-fsd-$PPID`)를 만들거나 지우는 것은 프로젝트 파일 쓰기가 아니므로 오케스트레이터가 Bash 한 줄로 직접 수행할 수 있다. 조건: (1) 경로가 `/tmp` 하위이고 프로세스 ID로 스코프됨, (2) 내용이 타임스탬프 등 1줄 신호에 불과함, (3) 프로젝트 트리·홈 디렉토리·설정 파일을 건드리지 않음. 구조화된 파이프라인 상태(`/tmp/.claude-pipeline-{name}-{PPID}.json`)는 이 carve-out 대상이 아니며 기존대로 `tracker-checkpoint`에 위임한다 — 마커와 상태 파일의 차이는 내용 구조(1줄 신호 vs 검증이 필요한 JSON 상태)다. 위임 비용(스폰 30초 이상)이 작업(1줄 touch)보다 큰 경우를 위한 좁은 예외이며, "작아서" 예외가 아니라 **프로젝트 파일이 아니라서** 예외다.
|
|
694
|
+
|
|
693
695
|
## Dynamic Agent Creation (No-Match Fallback)
|
|
694
696
|
|
|
695
697
|
When routing detects no matching agent for a specialized task:
|
|
@@ -131,6 +131,10 @@ Origin: #1521 (찐빠 #2 — v1.1.32 skills 118→114 동기화에서 파일 열
|
|
|
131
131
|
|
|
132
132
|
Any change to: agents, agent frontmatter, skills, guides, routing patterns, rules, wiki pages.
|
|
133
133
|
|
|
134
|
+
### auto-dev.yaml 압축 티어와의 양방향 참조 (Origin: #1650 C 부수)
|
|
135
|
+
|
|
136
|
+
이 소절은 R017 적용 범위 자체를 넓히지 않는다 — 위 범위 열거가 압축 파이프라인에서 어떻게 배선되는지를 기록한다. `.claude/skills/pipeline/workflows/auto-dev.yaml`의 compression-mode-eval은 docs-only 티어에서 deep-verify를 self-review로 대체하되, 변경 집합에 `.claude/rules/**`(또는 agents/skills frontmatter 등 구조 표면)가 포함되면 mgr-sauron R017 검증을 단일 목표 위임으로 **필수 실행**하는 carve-out을 둔다(v1.1.58 세션 — docs-only 티어였으나 sauron이 R002/R010 모순 advisory 1건을 포착). 이 절의 적용 조건과 그 carve-out은 같은 조건을 서로 가리킨다 — 한쪽을 바꾸면 다른 쪽도 같은 커밋에서 갱신한다(R016 Rule Wiring Check). 이전까지는 yaml → R017 단방향 인용만 있어 R017 쪽에서 carve-out의 존재를 알 수 없었다.
|
|
137
|
+
|
|
134
138
|
## Structural Migration Verification
|
|
135
139
|
|
|
136
140
|
디렉토리 재구조화, 템플릿 평탄화(flat templates), 브랜치 전략 변경 등 **구조 마이그레이션** 시, 경로 참조와 파일 존재성 회귀를 사전 검사해야 한다. 표준 5-round 검증이 콘텐츠 정합성에 집중하는 반면, 구조 마이그레이션은 경로·존재성 회귀를 별도로 점검한다.
|
|
@@ -78,6 +78,17 @@ Agent(description: "[2] Python code review", subagent_type: "lang-python-expert"
|
|
|
78
78
|
|
|
79
79
|
Single agent spawns do NOT use the `[N]` prefix.
|
|
80
80
|
|
|
81
|
+
**단일 스폰도 Core Rule 접두사 필수 (Origin: #1652 #3-3)**: 단일 Agent 스폰은 `[N]` 항목 형식 대신 Core Rule 형식의 접두사 라인(에이전트·모델 대괄호 + 화살표 + Tool 표기 + `Agent`)을 호출 직전에 출력한다. advisor(`.claude/hooks/scripts/r007-r008-drift-advisor.sh`)가 announce로 계수하는 것은 3종 — Tool 표기 라인, Spawning 헤더 라인(대괄호 번호 항목이 0개일 때 폴백으로 계수), 대괄호 번호가 붙은 spawn 항목 — 이며, **대괄호 번호 없이 에이전트타입:모델 다음에 화살표와 설명만 이어붙인 단독 라인은 계수하지 않는다** — Tool 표기 라인도 Spawning 헤더도 없이 그 단독 라인만 쓰면 규칙을 지킨 응답이 R008 누락 1건으로 계상된다(v1.1.60 세션 실측 — advisory가 반복돼 세션 중 접두사 형식을 바꿔야 했다; v1.1.61 적대적 리뷰가 합성 트랜스크립트 양성/음성 짝으로 재현). 정합 방향은 **규칙 문구 쪽**으로 확정한다. advisor 정규식 쪽 대안(번호 없는 단독 라인을 spawn 항목으로 계수)은 `.claude/hooks/**` 승인 사안이라 **#1650 E 항목**으로 이월했으며, 적용 시 이 조항의 advisor 동작 서술을 같은 커밋에서 갱신한다(R016 Rule Wiring Check).
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
[claude][opus] → Tool: Agent
|
|
85
|
+
[claude][opus] → Target: mgr-updater:sonnet → R008 clause update
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
| Anti-pattern | Required |
|
|
89
|
+
|--------------|----------|
|
|
90
|
+
| 단일 스폰을 번호 없는 에이전트타입:모델 화살표 설명 단독 라인으로만 announce | Core Rule 접두사 라인(Tool 표기 + Agent)을 호출 직전에 출력; 항목 라인은 Target 라인으로 병기 가능 |
|
|
91
|
+
|
|
81
92
|
This ensures the Running display:
|
|
82
93
|
```
|
|
83
94
|
⏺ Running 2 agents… (ctrl+o to expand)
|
|
@@ -358,6 +358,9 @@ Save memory IMMEDIATELY upon surprising discovery — do not defer to session en
|
|
|
358
358
|
| Unexpected tool behavior / workaround | Save `feedback_*.md` now | Session state defense |
|
|
359
359
|
| Subagent false-positive detected | Save `feedback_*.md` now | Prevent repeat in same session |
|
|
360
360
|
| User correction / feedback | Save `feedback_*.md` now | Honor correction immediately |
|
|
361
|
+
| Root-cause hypothesis (원인 진단) | Save `feedback_*.md` ONLY with a `[hypothesis: <unverified-basis summary>]` first-line tag until the code path has been read and the decision logic reproduced 1:1; promote to plain fact only after that verification | Statistical correlation from transcript counts is NOT code causation — an unverified cause saved as fact propagates to issues and future sessions (#1652 #1; R020 「통계적 상관 ≠ 코드 인과」) |
|
|
362
|
+
|
|
363
|
+
**`[hypothesis: …]` 태그 규약 (Origin: #1652 #1)**: 원인 진단을 메모리에 즉시 저장할 때는 본문 첫 줄에 `[hypothesis: <미검증 근거 요약>]`를 붙인다. 검증(코드 경로 대조·판정 로직 1:1 재현) 완료 시 태그를 제거하거나 파일을 정정한다. 태그가 남아 있는 항목은 후속 세션에서 전제로 쓰지 않고 **검증 트리거로만** 사용한다 — 위 「Safety-Related Feedback Memory Framing」과 같은 원리(결론형이 아니라 검증 의무형)다. 실증: v1.1.59 세션에서 #1643 원인을 트랜스크립트 통계(첫 레코드 thinking 13/21)만으로 "advisor가 thinking 전용 첫 레코드를 병합하지 못함"이라 확정 저장했다가 jq 1:1 재현으로 반박됐고(실제 원인은 레이블 문구 모호성), 같은 세션에서 `gh pr merge --delete-branch` 로컬 부수효과도 reflog 3건으로 "확정" 저장한 뒤 4번째 머지에서 재현되지 않아 "원인 미확정"으로 정정했다. 리터럴은 `[hypothesis:` 접두 하나로 통일하며, 검증 여부 조회는 `grep -l '^\[hypothesis:' <memory dir>`로 결정론적으로 수행한다. 최초 적용 대상: `feedback_gh_merge_delete_branch_local_side_effect.md`(v1.1.60 세션에서 "원인 미확정"으로 정정된 항목) — v1.1.61 세션 종료 시 sys-memory-keeper가 태그를 부착한다.
|
|
361
364
|
|
|
362
365
|
See rationale and cross-references via Read tool.
|
|
363
366
|
|
|
@@ -76,10 +76,37 @@ path pre-check(`auto-dev.yaml`)가 `.claude/hooks/**` 대상 이슈를 발견하
|
|
|
76
76
|
즉시 승인을 요청하지 않는다. 대신 그 이슈를 이번 스코프에서 **분리·이월**하고 나머지 적격 이슈로
|
|
77
77
|
계속 진행하며, `/homework` 반복 경계(게이트)에서 이월된 hooks 이슈들을 **1회 묶어** 승인 질문으로
|
|
78
78
|
제시한다. 승인을 받으면 R015 directive persistence로 세션 내 동일 카테고리에 지속 적용한다.
|
|
79
|
+
무인 여부의 판별 신호는 아래 「무인 모드 마커」 절이 정의한다.
|
|
80
|
+
|
|
81
|
+
### 무인 모드 마커 — 결정론적 판별 신호 (#1650 C)
|
|
82
|
+
|
|
83
|
+
`pipeline auto-dev`의 scope-selection Step 3가 요구하는 "무인 여부"는 산문 추론이 아니라 마커 파일로
|
|
84
|
+
판정한다. FSD 진입 시 오케스트레이터가 Bash로 아래 한 줄을 실행한다. 이 마커는 R010 「Exception:
|
|
85
|
+
Simple Tasks」의 carve-out(PPID 스코프 `/tmp` 런타임 상태 마커 — v1.1.61 신설)에 해당하므로
|
|
86
|
+
오케스트레이터가 직접 실행한다. 구조화된 파이프라인 상태(`/tmp/.claude-pipeline-*-{PPID}.json`)는 이
|
|
87
|
+
예외 대상이 아니며 기존대로 `tracker-checkpoint`에 위임된다.
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
printf '%s\n' "$(date -u +%Y-%m-%dT%H:%M:%SZ)" > "/tmp/.claude-fsd-$PPID"
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
- `$PPID`는 Bash 도구 셸의 부모, 즉 Claude Code 프로세스이며 호출 간 안정적이다(2026-09-03 실측: 두
|
|
94
|
+
호출 모두 동일 값).
|
|
95
|
+
- `claude -p`·예약 실행처럼 마커를 미리 만들 수 없는 경로는 env `OMCUSTOM_UNATTENDED=1`로 대체한다.
|
|
96
|
+
- `pipeline auto-dev` pre-triage Phase 0.6이 마커 존재 또는 env 값을 실측해 `unattended_mode` 상태를
|
|
97
|
+
산출하고, scope-selection Step 3는 그 상태로 `.claude/hooks/**` 이슈 분리·이월을 결정한다.
|
|
98
|
+
- 매 반복 시작 시 같은 명령으로 마커를 다시 써서 mtime을 갱신한다. Phase 0.6은 mtime이 6시간(360분)보다
|
|
99
|
+
오래된 마커를 **부재로 취급**한다 — 프로세스 크래시·PID 재사용으로 남은 마커가 이후 수동
|
|
100
|
+
`/pipeline auto-dev`를 무인으로 오판하지 않게 하는 가드다.
|
|
101
|
+
- 수렴(`[FSD Done]`), 릴리즈 cap 도달, safety classifier 차단으로 인한 중단, 사용자 인터럽트 — **어느
|
|
102
|
+
경로로 끝나든** `command rm -f "/tmp/.claude-fsd-$PPID"`로 마커를 제거한다 — 남겨두면
|
|
103
|
+
같은 세션의 이후 수동 `/pipeline auto-dev`가 무인으로 오판된다. `rm`이 alias(`trash`)로 셰이딩된
|
|
104
|
+
셸에서 `rm -f`는 거부되므로 `command`를 붙인다(R005, 2026-09-03 실측).
|
|
79
105
|
|
|
80
106
|
### Iteration Flow (per iteration)
|
|
81
107
|
|
|
82
108
|
```
|
|
109
|
+
[FSD Entry] write marker /tmp/.claude-fsd-$PPID
|
|
83
110
|
[FSD Iteration N]
|
|
84
111
|
├── /pipeline auto-dev → one release (PR create → merge → npm publish → milestone close)
|
|
85
112
|
├── /homework → extract 찐빠, confirm gate (or --dry-run if requested)
|
|
@@ -87,8 +114,9 @@ path pre-check(`auto-dev.yaml`)가 `.claude/hooks/**` 대상 이슈를 발견하
|
|
|
87
114
|
│ fix-then-merge (known CI failure pattern)
|
|
88
115
|
│ defer+surface (design decision needed)
|
|
89
116
|
└── Check convergence: eligible issues = 0 AND open PRs = 0 (merged or deferred)?
|
|
90
|
-
├── YES → [FSD Done] converged naturally
|
|
91
|
-
└── NO →
|
|
117
|
+
├── YES → [FSD Done] converged naturally → command rm -f /tmp/.claude-fsd-$PPID
|
|
118
|
+
└── NO → cap reached or classifier block? → YES → [FSD Stop] → command rm -f /tmp/.claude-fsd-$PPID
|
|
119
|
+
→ NO → next iteration (re-write marker first)
|
|
92
120
|
```
|
|
93
121
|
|
|
94
122
|
## Safety and Discipline
|
|
@@ -106,6 +134,16 @@ Each iteration operates under full project rules — no relaxation because FSD i
|
|
|
106
134
|
|
|
107
135
|
`/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.
|
|
108
136
|
|
|
137
|
+
**Homework 제출 게이트 묶음 (opt-in, #1652 #4)**: 기본 계약은 위와 같이 **반복마다** 게이트를
|
|
138
|
+
제시하는 것이다. 사용자가 세션 중 명시적으로 지시하거나(예: "homework 게이트는 수렴 시점에 1회로
|
|
139
|
+
묶어라") 무인 실행을 선언하며 묶음을 지정한 경우에만, homework 아티팩트(`homework-{HHmmss}.md`)는
|
|
140
|
+
반복마다 기록하되 `omcustom-feedback` Phase 4A 제출 게이트는 수렴 시점(또는 릴리즈 cap 도달 시점)에
|
|
141
|
+
**1회** 묶어 제시한다 — 이월된 `.claude/hooks/**` 승인 질문과 같은 자리에서 함께 제시한다. 묶음
|
|
142
|
+
여부는 사용자 결정 사항이며 오케스트레이터가 단독으로 선택하지 않는다(v1.1.59/60 세션에서
|
|
143
|
+
오케스트레이터가 단독 결정한 것이 스킬 계약 이탈로 회고됐다). 한 번 지시되면 R015 directive
|
|
144
|
+
persistence로 세션 내 유지된다. 묶음 여부는 `unattended_mode`(마커·env)에서 **도출하지 않는다** —
|
|
145
|
+
무인 판별은 hooks 이슈 분리·이월에만 쓰이고, 게이트 묶음은 사용자 지시가 유일한 트리거다.
|
|
146
|
+
|
|
109
147
|
If a release operation triggers the safety classifier, the current iteration stops and surfaces the block to the user before continuing.
|
|
110
148
|
|
|
111
149
|
## When to Use
|
|
@@ -78,6 +78,31 @@ steps:
|
|
|
78
78
|
4. Do NOT read, echo, or modify any credential material while checking settings — read the
|
|
79
79
|
single `permissions.defaultMode` field only (R001).
|
|
80
80
|
|
|
81
|
+
Phase 0.6 — Detect unattended mode deterministically (#1650 C).
|
|
82
|
+
|
|
83
|
+
Why: scope-selection Step 3 defers `.claude/hooks/**` issues in unattended runs. Until v1.1.60 the
|
|
84
|
+
signal was prose ("entered via /fsd or the session says autonomous"), which is not measurable.
|
|
85
|
+
`/fsd` now writes a marker at entry (fsd SKILL.md 「무인 모드 마커」) and removes it at convergence.
|
|
86
|
+
|
|
87
|
+
1. Measure (both signals; either one is sufficient):
|
|
88
|
+
marker="/tmp/.claude-fsd-$PPID"; unattended_mode=false; marker_state=absent
|
|
89
|
+
if [ -f "$marker" ]; then
|
|
90
|
+
if [ -n "$(command find "$marker" -mmin +360 2>/dev/null)" ]; then marker_state=stale; else marker_state=present; fi
|
|
91
|
+
fi
|
|
92
|
+
if [ "$marker_state" = "present" ] || [ "${OMCUSTOM_UNATTENDED:-}" = "1" ]; then unattended_mode=true; fi
|
|
93
|
+
echo "unattended_mode=$unattended_mode marker=$marker_state env=${OMCUSTOM_UNATTENDED:-unset}"
|
|
94
|
+
`$PPID` inside the Bash tool is the Claude Code process and is stable across calls, so the
|
|
95
|
+
marker written by `/fsd` in an earlier call is visible here.
|
|
96
|
+
A marker older than 360 minutes is treated as absent (stale guard — crash / PID reuse); `/fsd`
|
|
97
|
+
re-writes the marker at every iteration start. The snippet always exits 0 so a false result is
|
|
98
|
+
not mistaken for a measurement failure.
|
|
99
|
+
|
|
100
|
+
2. Report: "[pre-triage] unattended_mode=<true|false> (marker /tmp/.claude-fsd-$PPID: <present|stale|absent>; OMCUSTOM_UNATTENDED=<value|unset>)"
|
|
101
|
+
|
|
102
|
+
3. Output `unattended_mode` as pipeline state for scope-selection Step 3. Do NOT infer unattended
|
|
103
|
+
mode from prose or from the fact that this pipeline was invoked by a skill — only the two
|
|
104
|
+
measured signals above count.
|
|
105
|
+
|
|
81
106
|
Phase 1 — Ensure required labels exist, then scan issues.
|
|
82
107
|
|
|
83
108
|
1. Create labels if missing (idempotent):
|
|
@@ -167,9 +192,10 @@ steps:
|
|
|
167
192
|
무인 실행(`/fsd` 등 사용자가 실시간 응답할 수 없는 루프)에서는 `.claude/hooks/**` 대상 이슈를
|
|
168
193
|
이번 스코프에서 **분리·이월**하고 나머지 적격 이슈로 진행하며, 반복 경계(homework 게이트)에서
|
|
169
194
|
승인 질문을 **1회** 묶어 제시한다. 승인을 받으면 R015 directive persistence로 세션 내 동일
|
|
170
|
-
카테고리에 지속 적용. 유인 모드에서는 기존대로 즉시 승인 요청. 무인
|
|
171
|
-
|
|
172
|
-
|
|
195
|
+
카테고리에 지속 적용. 유인 모드에서는 기존대로 즉시 승인 요청. 무인 판별은 pre-triage Phase 0.6이 실측한
|
|
196
|
+
`unattended_mode` 상태를 사용한다(마커
|
|
197
|
+
`/tmp/.claude-fsd-$PPID` 또는 env `OMCUSTOM_UNATTENDED=1`; #1650 C). 산문 추론("/fsd로 진입한 것
|
|
198
|
+
같다")으로 무인 여부를 판정하지 않는다.
|
|
173
199
|
|
|
174
200
|
Output approval_required_paths (list, empty if none) as pipeline state.
|
|
175
201
|
|
|
@@ -224,7 +250,7 @@ steps:
|
|
|
224
250
|
- triage step: MAY replace professor-triage skill spawn with orchestrator integrated analysis
|
|
225
251
|
- plan step: MAY replace release-plan skill spawn with orchestrator integrated analysis
|
|
226
252
|
- deep-plan step: MAY replace deep-plan skill spawn with orchestrator integrated analysis
|
|
227
|
-
- deep-verify step: perform via mgr-sauron R017 structural verification + core self-check
|
|
253
|
+
- deep-verify step: perform via mgr-sauron R017 structural verification + core self-check (split standard: see the deep-verify step description — R017 spawn + change-type adversarial review, one single-goal delegation each)
|
|
228
254
|
(instead of full deep-verify skill spawn). If the change set has NO structural surface
|
|
229
255
|
(no agent/skill/guide/rule frontmatter changed — e.g. a workflow-yaml-only or docs-only change),
|
|
230
256
|
the mgr-sauron R017 spawn MAY be skipped and replaced by deterministic self-check
|
|
@@ -288,6 +314,13 @@ steps:
|
|
|
288
314
|
1. A scoped issue carries (in its body or a linked artifact) a CONVERGED research/plan output equivalent to the step's skill — e.g. a `/research` multi-team analysis that explicitly converged, a `/deep-plan` artifact, or a prior `professor-triage`/`release-plan` output.
|
|
289
315
|
2. The artifact covers the scoped issues' domain (not stale or unrelated).
|
|
290
316
|
3. The substitution is for a PLANNING/VERIFICATION step ONLY — never for implement, verify-build, release, or ci-check.
|
|
317
|
+
4. When the artifact is a SAME-SESSION triage/plan output substituting for `deep-plan` (or `plan`),
|
|
318
|
+
every implement-stage delegation prompt MUST instruct the agent to re-locate targets by ANCHOR
|
|
319
|
+
(function name / unique string) and treat any line numbers in the issue body or artifact as
|
|
320
|
+
reference only. Line numbers go stale across release commits — v1.1.60: #1647 cited lines
|
|
321
|
+
346-348 from v1.1.59, but the script had grown 608→733 lines and two agents had to re-search
|
|
322
|
+
(#1652 #3-1/#3-2). The justification log MUST name the artifact AND state that anchor-based
|
|
323
|
+
re-measurement was included in the delegation prompts.
|
|
291
324
|
|
|
292
325
|
If substituted, emit a MANDATORY justification log naming the artifact:
|
|
293
326
|
"[compression-mode] step '{step}' satisfied by converged artifact {ref} (substitution); skill spawn skipped"
|
|
@@ -408,7 +441,7 @@ steps:
|
|
|
408
441
|
|
|
409
442
|
- name: deep-verify
|
|
410
443
|
skill: deep-verify
|
|
411
|
-
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)."
|
|
444
|
+
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 위조)를 실행 재현으로 포착."
|
|
412
445
|
depends_on: verify-build
|
|
413
446
|
|
|
414
447
|
- name: release
|
|
@@ -79,6 +79,14 @@ gh issue create \
|
|
|
79
79
|
--body "## 출처\n\nv{version} 릴리즈 워크플로우에서 자동 등록.\n\n## 컨텍스트\n\n{상세 컨텍스트}\n\n## 권장 조치\n\n{권장 사항}" \
|
|
80
80
|
--label "professor"
|
|
81
81
|
```
|
|
82
|
+
|
|
83
|
+
**이슈 본문의 코드 위치 표기 — 행 번호 대신 앵커 (#1652 #3-2)**: `## 컨텍스트`에서 코드 위치는 행
|
|
84
|
+
번호가 아니라 **함수명·고유 앵커 문자열**(예: 함수명, 해당 위치의 고유 주석 문구)로 적는다. 행
|
|
85
|
+
번호는 다음 릴리즈 커밋에서 stale해진다 — v1.1.60 세션에서 #1647 본문의 행 346-348은 v1.1.59 시점
|
|
86
|
+
값이었고, 스크립트가 608→733행으로 성장해 구현 에이전트 2개가 재탐색해야 했다. 행 번호를
|
|
87
|
+
병기하려면 기준 커밋 SHA를 함께 적고 "참고용"임을 명시한다. 후속 위임서도 "행 번호는 참고, 앵커로
|
|
88
|
+
재탐색"을 전제로 작성된다(auto-dev.yaml substitution 조항 cross-ref).
|
|
89
|
+
|
|
82
90
|
Add priority label (`P3` default for defects surfaced here; escalate to `P2` if MEDIUM+ severity).
|
|
83
91
|
|
|
84
92
|
**Authority**: user directive (session 102) — genuine defects found during release workflows should be registered without prompting. See also R016 Defect Response Matrix: CI/infra defect and Process gap both require Issue registration.
|
package/templates/manifest.json
CHANGED
|
@@ -78,6 +78,31 @@ steps:
|
|
|
78
78
|
4. Do NOT read, echo, or modify any credential material while checking settings — read the
|
|
79
79
|
single `permissions.defaultMode` field only (R001).
|
|
80
80
|
|
|
81
|
+
Phase 0.6 — Detect unattended mode deterministically (#1650 C).
|
|
82
|
+
|
|
83
|
+
Why: scope-selection Step 3 defers `.claude/hooks/**` issues in unattended runs. Until v1.1.60 the
|
|
84
|
+
signal was prose ("entered via /fsd or the session says autonomous"), which is not measurable.
|
|
85
|
+
`/fsd` now writes a marker at entry (fsd SKILL.md 「무인 모드 마커」) and removes it at convergence.
|
|
86
|
+
|
|
87
|
+
1. Measure (both signals; either one is sufficient):
|
|
88
|
+
marker="/tmp/.claude-fsd-$PPID"; unattended_mode=false; marker_state=absent
|
|
89
|
+
if [ -f "$marker" ]; then
|
|
90
|
+
if [ -n "$(command find "$marker" -mmin +360 2>/dev/null)" ]; then marker_state=stale; else marker_state=present; fi
|
|
91
|
+
fi
|
|
92
|
+
if [ "$marker_state" = "present" ] || [ "${OMCUSTOM_UNATTENDED:-}" = "1" ]; then unattended_mode=true; fi
|
|
93
|
+
echo "unattended_mode=$unattended_mode marker=$marker_state env=${OMCUSTOM_UNATTENDED:-unset}"
|
|
94
|
+
`$PPID` inside the Bash tool is the Claude Code process and is stable across calls, so the
|
|
95
|
+
marker written by `/fsd` in an earlier call is visible here.
|
|
96
|
+
A marker older than 360 minutes is treated as absent (stale guard — crash / PID reuse); `/fsd`
|
|
97
|
+
re-writes the marker at every iteration start. The snippet always exits 0 so a false result is
|
|
98
|
+
not mistaken for a measurement failure.
|
|
99
|
+
|
|
100
|
+
2. Report: "[pre-triage] unattended_mode=<true|false> (marker /tmp/.claude-fsd-$PPID: <present|stale|absent>; OMCUSTOM_UNATTENDED=<value|unset>)"
|
|
101
|
+
|
|
102
|
+
3. Output `unattended_mode` as pipeline state for scope-selection Step 3. Do NOT infer unattended
|
|
103
|
+
mode from prose or from the fact that this pipeline was invoked by a skill — only the two
|
|
104
|
+
measured signals above count.
|
|
105
|
+
|
|
81
106
|
Phase 1 — Ensure required labels exist, then scan issues.
|
|
82
107
|
|
|
83
108
|
1. Create labels if missing (idempotent):
|
|
@@ -167,9 +192,10 @@ steps:
|
|
|
167
192
|
무인 실행(`/fsd` 등 사용자가 실시간 응답할 수 없는 루프)에서는 `.claude/hooks/**` 대상 이슈를
|
|
168
193
|
이번 스코프에서 **분리·이월**하고 나머지 적격 이슈로 진행하며, 반복 경계(homework 게이트)에서
|
|
169
194
|
승인 질문을 **1회** 묶어 제시한다. 승인을 받으면 R015 directive persistence로 세션 내 동일
|
|
170
|
-
카테고리에 지속 적용. 유인 모드에서는 기존대로 즉시 승인 요청. 무인
|
|
171
|
-
|
|
172
|
-
|
|
195
|
+
카테고리에 지속 적용. 유인 모드에서는 기존대로 즉시 승인 요청. 무인 판별은 pre-triage Phase 0.6이 실측한
|
|
196
|
+
`unattended_mode` 상태를 사용한다(마커
|
|
197
|
+
`/tmp/.claude-fsd-$PPID` 또는 env `OMCUSTOM_UNATTENDED=1`; #1650 C). 산문 추론("/fsd로 진입한 것
|
|
198
|
+
같다")으로 무인 여부를 판정하지 않는다.
|
|
173
199
|
|
|
174
200
|
Output approval_required_paths (list, empty if none) as pipeline state.
|
|
175
201
|
|
|
@@ -224,7 +250,7 @@ steps:
|
|
|
224
250
|
- triage step: MAY replace professor-triage skill spawn with orchestrator integrated analysis
|
|
225
251
|
- plan step: MAY replace release-plan skill spawn with orchestrator integrated analysis
|
|
226
252
|
- deep-plan step: MAY replace deep-plan skill spawn with orchestrator integrated analysis
|
|
227
|
-
- deep-verify step: perform via mgr-sauron R017 structural verification + core self-check
|
|
253
|
+
- deep-verify step: perform via mgr-sauron R017 structural verification + core self-check (split standard: see the deep-verify step description — R017 spawn + change-type adversarial review, one single-goal delegation each)
|
|
228
254
|
(instead of full deep-verify skill spawn). If the change set has NO structural surface
|
|
229
255
|
(no agent/skill/guide/rule frontmatter changed — e.g. a workflow-yaml-only or docs-only change),
|
|
230
256
|
the mgr-sauron R017 spawn MAY be skipped and replaced by deterministic self-check
|
|
@@ -288,6 +314,13 @@ steps:
|
|
|
288
314
|
1. A scoped issue carries (in its body or a linked artifact) a CONVERGED research/plan output equivalent to the step's skill — e.g. a `/research` multi-team analysis that explicitly converged, a `/deep-plan` artifact, or a prior `professor-triage`/`release-plan` output.
|
|
289
315
|
2. The artifact covers the scoped issues' domain (not stale or unrelated).
|
|
290
316
|
3. The substitution is for a PLANNING/VERIFICATION step ONLY — never for implement, verify-build, release, or ci-check.
|
|
317
|
+
4. When the artifact is a SAME-SESSION triage/plan output substituting for `deep-plan` (or `plan`),
|
|
318
|
+
every implement-stage delegation prompt MUST instruct the agent to re-locate targets by ANCHOR
|
|
319
|
+
(function name / unique string) and treat any line numbers in the issue body or artifact as
|
|
320
|
+
reference only. Line numbers go stale across release commits — v1.1.60: #1647 cited lines
|
|
321
|
+
346-348 from v1.1.59, but the script had grown 608→733 lines and two agents had to re-search
|
|
322
|
+
(#1652 #3-1/#3-2). The justification log MUST name the artifact AND state that anchor-based
|
|
323
|
+
re-measurement was included in the delegation prompts.
|
|
291
324
|
|
|
292
325
|
If substituted, emit a MANDATORY justification log naming the artifact:
|
|
293
326
|
"[compression-mode] step '{step}' satisfied by converged artifact {ref} (substitution); skill spawn skipped"
|
|
@@ -408,7 +441,7 @@ steps:
|
|
|
408
441
|
|
|
409
442
|
- name: deep-verify
|
|
410
443
|
skill: deep-verify
|
|
411
|
-
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)."
|
|
444
|
+
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 위조)를 실행 재현으로 포착."
|
|
412
445
|
depends_on: verify-build
|
|
413
446
|
|
|
414
447
|
- name: release
|