uctm 1.5.2 → 1.5.4

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.
@@ -0,0 +1,267 @@
1
+ # 파일 내용 스키마
2
+
3
+ 파이프라인 산출물 파일 형식의 단일 정의 소스.
4
+
5
+ ## 준수사항
6
+
7
+ | 생성 파일 | 참조 섹션 | 위반 시 결과 |
8
+ |-----------|----------|-------------|
9
+ | `Requirement.md` | § 0 | |
10
+ | `PLAN.md` | § 1 | `parsePlanMd()` 파싱 실패, scheduler 작동 불가 |
11
+ | `TASK-XX.md` | § 2 | `parseTaskFilename()` DB 등록 누락 |
12
+ | `TASK-XX_result.md` | § 3 | context-handoff 누락 |
13
+ | `TASK-XX_result.md` (direct) | § 4 | result.md 인식 실패 |
14
+
15
+ ---
16
+
17
+ ## § 0. Requirement.md
18
+
19
+ 경로: `works/{WORK_ID}/Requirement.md`
20
+
21
+ ```markdown
22
+ # Requirement — WORK-NN
23
+
24
+ ## Original Request
25
+ > 사용자의 정확한 입력
26
+
27
+ ## Functional Requirements
28
+ - FR-01: ...
29
+ - FR-02: ...
30
+
31
+ ## Non-Functional Requirements
32
+ - NFR-01: ...
33
+
34
+ ## Acceptance Criteria
35
+ - [ ] 검증 가능한 기준
36
+ ```
37
+
38
+ 생성 주체: Specifier (모든 요청에 필수)
39
+
40
+ ---
41
+
42
+ ## § 1. PLAN.md
43
+
44
+ 경로: `works/{WORK_ID}/PLAN.md`
45
+
46
+ > 요구사항 수준에 따라 ## 설계 이하 간략화 가능
47
+
48
+ ```markdown
49
+ # WORK-01: {제목}
50
+
51
+ > Created: {YYYY-MM-DD}
52
+ > Requirement: {REQ-XXX | 사용자 요청 텍스트}
53
+ > Execution-Mode: {direct | pipeline | full}
54
+ > Project: {프로젝트 이름}
55
+ > Tech Stack: {스택}
56
+ > Language: {lang_code}
57
+ > Status: PLANNED
58
+
59
+ ## 목표
60
+ {1-2문장}
61
+
62
+ ## 설계
63
+
64
+ ### 1. 아키텍처 방향
65
+
66
+ - **접근 방식**: 신규 구축 / 기존 수정 / 확장
67
+ - **구조**: (계층형, 이벤트 기반, 마이크로서비스 등)
68
+ - **데이터 흐름**: (입력 → 처리 → 출력 경로 요약)
69
+
70
+ ### 2. 데이터 설계
71
+
72
+ | 항목 | 내용 |
73
+ |------|------|
74
+ | 스키마 변경 | 있음 / 없음 |
75
+ | 마이그레이션 필요 | 있음 / 없음 |
76
+ | 변경 내용 | |
77
+
78
+ ### 3. 인터페이스 설계
79
+
80
+ | 인터페이스 | 방식 | 엔드포인트/형식 | 관련 FR |
81
+ |-----------|------|---------------|--------|
82
+ | | REST / GraphQL / gRPC / 파일 | | |
83
+
84
+ ### 4. NFR 대응 설계
85
+
86
+ | NFR ID | 요구사항 | 대응 방안 |
87
+ |--------|---------|----------|
88
+ | NFR-01 | | |
89
+ | NFR-02 | | |
90
+
91
+ ## 작업 목록
92
+
93
+ | Task ID | 제목 | 의존관계 | Phase | 우선순위 | 매핑 FR/NFR | 예상 규모 |
94
+ |---------|------|---------|-------|---------|------------|----------|
95
+ | TASK-01 | | 없음 | 1 | Must | FR-01 | S/M/L |
96
+ | TASK-02 | | TASK-01 | 2 | Must | FR-02, NFR-01 | S/M/L |
97
+ | TASK-03 | | 없음 | 1 | Should | FR-03 | S/M/L |
98
+ | | | | | | | |
99
+
100
+
101
+ ## Task 의존성 그래프
102
+ {ASCII 다이어그램}
103
+
104
+ ## 리스크 및 대응
105
+
106
+ | # | 리스크 | 발생 가능성 | 영향도 | 대응 전략 | 비고 |
107
+ |---|--------|-----------|-------|----------|------|
108
+ | R-01 | | 높/중/낮 | 높/중/낮 | 회피 / 완화 / 수용 | |
109
+ | R-02 | | | | | |
110
+
111
+ ---
112
+
113
+ ## 추적성 매트릭스
114
+
115
+ | 원본 요청 | FR/NFR | Task | 인수 기준 | 검증 방법 |
116
+ |----------|--------|------|----------|----------|
117
+ | | FR-01 | TASK-01 | AC-01 | 단위테스트 / 수동확인 / 자동화 |
118
+ | | FR-02 | TASK-02 | AC-02 | |
119
+ | | NFR-01 | TASK-02 | AC-03 | |
120
+
121
+ ---
122
+
123
+ ## 자체 검증 체크리스트
124
+
125
+ - [ ] 모든 FR이 최소 1개 Task에 매핑됨
126
+ - [ ] 모든 NFR이 설계 또는 Task에 반영됨
127
+ - [ ] Task 간 순환 의존 없음
128
+ - [ ] 제약조건 내 실현 가능
129
+ - [ ] 각 Task에 완료 조건이 있음
130
+ - [ ] 리스크가 식별되고 대응 전략이 있음
131
+ - [ ] 실행 순서가 의존관계와 일치함
132
+
133
+ ---
134
+ ```
135
+
136
+ 제목 형식: `# WORK-NN: title` — `# PLAN WORK-NN:` 금지 (`parsePlanMd()` 오류)
137
+
138
+ ---
139
+
140
+ ## § 2. TASK-XX.md
141
+
142
+ 경로: `works/{WORK_ID}/TASK-XX.md`
143
+
144
+ > `parseTaskFilename()` regex: `/^TASK-(\d+)\.md$/` — WORK 접두사 금지
145
+
146
+ ```markdown
147
+ # TASK-XX: {제목}
148
+
149
+ ## WORK
150
+ {WORK_ID}: {WORK 제목}
151
+
152
+ ## Task 개요
153
+
154
+ | 항목 | 내용 |
155
+ |------|------|
156
+ | 목적 | (이 Task가 완료되면 무엇이 달라지는가) |
157
+ | 매핑 요구사항 | FR-{NN}, NFR-{NN} |
158
+ | 우선순위 | Must / Should / Could |
159
+ | 예상 규모 | S / M / L |
160
+ | 의존관계 | 없음 / TASK-{NN} 완료 후 |
161
+ | Phase | Phase {N} |
162
+
163
+ ## Scope
164
+ {설명}
165
+
166
+ ## Files
167
+ | Path | Action | Description |
168
+ |------|--------|-------------|
169
+ | `src/file.ts` | CREATE | 설명 |
170
+
171
+ ## Acceptance Criteria
172
+ - [ ] {기준}
173
+
174
+ ## Verify
175
+ ```bash
176
+ {검증 명령}
177
+ ```
178
+
179
+ ---
180
+
181
+ ## § 3. TASK-XX_result.md (full / pipeline)
182
+
183
+ 경로: `works/{WORK_ID}/TASK-XX_result.md`
184
+
185
+ ```markdown
186
+ # TASK-XX Result
187
+
188
+ > WORK: {WORK_ID} — {제목}
189
+ > Completed: {YYYY-MM-DD HH:MM}
190
+ > Status: **DONE**
191
+
192
+ {## Summary | ## 요약 | ## サマリー}
193
+ {1-2줄}
194
+
195
+ {## Completed Checklist | ## 완료 체크리스트 | ## 完了チェックリスト}
196
+ - [x] {항목}
197
+
198
+ {## Verification Results | ## 검증 결과 | ## 検証結果}
199
+ - Build: ✅
200
+ - Lint: ✅
201
+ - Tests: ✅ (N passed)
202
+
203
+ {## Files Changed | ## 변경 파일 | ## 変更ファイル}
204
+ ### Created
205
+ - `path` — {설명}
206
+
207
+ {## Issues Encountered | ## 발생 이슈 | ## 発生した問題}
208
+ None
209
+
210
+ {## Notes for Subsequent Tasks | ## 후속 TASK 참고사항 | ## 後続タスクへの注記}
211
+ None
212
+
213
+ {## Context Handoff | ## 컨텍스트 핸드오프 | ## コンテキスト引き継ぎ}
214
+
215
+ ### Builder Context (SUMMARY)
216
+ {builder what 필드 1-3줄}
217
+
218
+ ### Verifier Context (FULL)
219
+ {verifier context-handoff 4개 필드}
220
+ ```
221
+
222
+ | 섹션 | en | ko | ja |
223
+ |------|----|----|-----|
224
+ | Summary | `## Summary` | `## 요약` | `## サマリー` |
225
+ | Completed Checklist | `## Completed Checklist` | `## 완료 체크리스트` | `## 完了チェックリスト` |
226
+ | Verification Results | `## Verification Results` | `## 검증 결과` | `## 検証結果` |
227
+ | Files Changed | `## Files Changed` | `## 변경 파일` | `## 変更ファイル` |
228
+ | Issues Encountered | `## Issues Encountered` | `## 발생 이슈` | `## 発生した問題` |
229
+ | Notes for Subsequent Tasks | `## Notes for Subsequent Tasks` | `## 후속 TASK 참고사항` | `## 後続タスクへの注記` |
230
+ | Context Handoff | `## Context Handoff` | `## 컨텍스트 핸드오프` | `## コンテキスト引き継ぎ` |
231
+
232
+ ---
233
+
234
+ ## § 4. TASK-XX_result.md (direct 모드)
235
+
236
+ ```markdown
237
+ # TASK-00 Result
238
+
239
+ > WORK: WORK-NN — {제목}
240
+ > Completed: {YYYY-MM-DD HH:MM}
241
+ > Execution-Mode: direct
242
+ > Status: **DONE**
243
+
244
+ ## 요약
245
+ {1줄}
246
+
247
+ ## 변경 파일
248
+ - `{path}` — {설명}
249
+
250
+ ## 검증
251
+ - Build: PASS (self-check)
252
+ - Lint: PASS (self-check)
253
+ ```
254
+
255
+ ---
256
+
257
+ ## § 5. 파일 이름 규칙
258
+
259
+ | 유형 | 형식 | 생성 주체 |
260
+ |------|------|-----------|
261
+ | 요구사항 | `Requirement.md` | specifier |
262
+ | WORK 계획 | `PLAN.md` | planner / specifier |
263
+ | TASK 계획 | `TASK-NN.md` | planner / specifier |
264
+ | TASK 결과 | `TASK-NN_result.md` | committer |
265
+ | 활동 로그 | `work_WORK-NN.log` | 모든 에이전트 (추가) |
266
+
267
+ `WORK-NN-TASK-NN.md` 형식 금지 → `parseTaskFilename()`이 인식할 수 없음.
@@ -0,0 +1,31 @@
1
+ # ref-cache 프로토콜
2
+
3
+ ## 개요
4
+
5
+ ref-cache는 파이프라인 내 서브에이전트 호출 간 중복 파일 읽기를 방지하는 메커니즘입니다.
6
+ 레퍼런스 파일이 매번 디스크에서 다시 읽히는 대신 `<ref-cache>` XML 요소를 통해 에이전트 간에 전달됩니다.
7
+
8
+ ## 프로토콜 (4단계)
9
+
10
+ 1. 수신한 dispatch XML에 `<ref-cache>`가 있는지 **확인**
11
+ 2. 각 필수 레퍼런스 파일에 대해:
12
+ - ref-cache에 있으면 → **파일 읽기 건너뛰기**, 캐시된 내용 사용
13
+ - ref-cache에 없으면 → `{REFERENCES_DIR}/{filename}.md`에서 읽고 ref-cache에 추가
14
+ 3. 작업 완료 시, 반환하는 task-result XML에 병합된 `<ref-cache>` 포함
15
+ 4. **하위 호환성**: dispatch에 `<ref-cache>`가 없으면 모든 레퍼런스 파일을 정상적으로 읽기 (기존 동작)
16
+
17
+ ## ref-cache XML 형식
18
+
19
+ 전체 스키마는 `xml-schema.md` § 4 참조.
20
+
21
+ ```xml
22
+ <ref-cache>
23
+ <ref key="file-content-schema">...내용...</ref>
24
+ <ref key="shared-prompt-sections">...내용...</ref>
25
+ <!-- 로딩된 레퍼런스 파일당 하나의 <ref> -->
26
+ </ref-cache>
27
+ ```
28
+
29
+ ## 체인 전파
30
+
31
+ 파이프라인에서 ref-cache가 에이전트 간에 어떻게 흐르는지는 `agent-flow.md` § ref-cache Chain Propagation 참조.
@@ -0,0 +1,206 @@
1
+ # 공유 프롬프트 섹션
2
+
3
+ 각 에이전트가 `cache_control` 마커를 통해 참조하는 공통 재사용 섹션.
4
+
5
+ ---
6
+
7
+ ## § 1. 출력 언어 규칙
8
+
9
+ ```
10
+ 우선순위: PLAN.md > Language: → CLAUDE.md ## Language → en (기본값)
11
+
12
+ 디스패치 시: <context><language> 필드에 결정된 언어 코드 전달
13
+ 섹션 헤더(##)도 결정된 언어로 작성 (언어 매핑 표 참조)
14
+ ```
15
+
16
+ ---
17
+
18
+ ## § 2. 빌드 및 린트 명령
19
+
20
+ ```bash
21
+ # 빌드 자동 감지 (스크립트가 있을 때만 실행)
22
+ if [ -f "package.json" ]; then
23
+ if node -e "const p=JSON.parse(require('fs').readFileSync('package.json','utf8')); process.exit(p.scripts&&p.scripts.build?0:1)" 2>/dev/null; then
24
+ npm run build 2>&1 || bun run build 2>&1 || yarn build 2>&1
25
+ fi
26
+ elif [ -f "Cargo.toml" ]; then
27
+ cargo build 2>&1
28
+ elif [ -f "go.mod" ]; then
29
+ go build ./... 2>&1
30
+ elif [ -f "pyproject.toml" ] || [ -f "setup.py" ]; then
31
+ python -m py_compile $(find . -maxdepth 3 -name "*.py" -not -path "*/venv/*" 2>/dev/null) 2>&1
32
+ elif [ -f "Makefile" ]; then
33
+ make build 2>&1 || make 2>&1
34
+ fi
35
+
36
+ # 린트 자동 감지 (스크립트가 있을 때만 실행)
37
+ if [ -f "package.json" ]; then
38
+ if node -e "const p=JSON.parse(require('fs').readFileSync('package.json','utf8')); process.exit(p.scripts&&p.scripts.lint?0:1)" 2>/dev/null; then
39
+ npm run lint 2>&1 || bun run lint 2>&1 || true
40
+ fi
41
+ elif [ -f "pyproject.toml" ]; then
42
+ ruff check . 2>&1 || python -m flake8 . 2>&1 || true
43
+ fi
44
+ ```
45
+
46
+ - 빌드/린트 스크립트가 없으면 → **생략 (N/A로 처리)**.
47
+ - 빌드/린트 실패 시 보고 전에 항상 수정.
48
+
49
+ ---
50
+
51
+ ## § 3. WORK 및 TASK 파일 경로 패턴
52
+
53
+ ```
54
+ works/{WORK_ID}/
55
+ ├─ Requirement.md # Specifier가 생성 (필수)
56
+ ├─ PLAN.md
57
+ ├─ TASK-00.md # WORK 접두사 없음
58
+ ├─ TASK-00_result.md # 구분자: 언더스코어
59
+ └─ TASK-01.md ...
60
+ ```
61
+
62
+ - WORK ID: `WORK-NN` (예: `WORK-03`)
63
+ - TASK ID: `TASK-NN` (예: `TASK-00`) — WORK 접두사 포함 금지
64
+
65
+ ---
66
+
67
+ ## § 4. 파일 시스템 Discovery 스크립트
68
+
69
+ ```
70
+ # 미완료 TASK가 있는 최신 WORK 찾기
71
+ # Glob 도구 사용: pattern "works/WORK-*/" → 모든 WORK 디렉토리 목록 (정렬)
72
+ # 각 WORK (내림차순)에 대해 works/WORK-NN/work_WORK-NN.log 마지막 줄 읽기
73
+ # - 로그 파일 없음 → 시작 안 됨
74
+ # - 마지막 줄에 마지막 TASK 번호의 "COMMITTER_DONE" 포함 → 남은 TASK 확인
75
+ # 완전히 완료되지 않은 첫 번째 WORK가 활성 WORK
76
+
77
+ # 모든 WORK 목록
78
+ # Glob 도구 사용: pattern "works/WORK-*/"
79
+
80
+ # 활동 로그의 마지막 줄로 WORK/TASK 상태 파악
81
+ # works/${WORK_ID}/work_${WORK_ID}.log 마지막 줄 읽기
82
+ # 형식: [timestamp] EVENT — description
83
+ #
84
+ # 핵심 규칙: *_START에 대응하는 *_DONE이 없으면 = 중단됨, 해당 단계 재수행 필요
85
+ #
86
+ # COMMITTER_DONE — TASK-NN → TASK-NN 완료, 다음은 TASK-(NN+1)
87
+ # COMMITTER_START — TASK-NN → committer 중단됨, TASK-NN committer 재수행
88
+ # VERIFIER_DONE — TASK-NN → TASK-NN 검증됨, committer 필요
89
+ # VERIFIER_START — TASK-NN → verifier 중단됨, TASK-NN verifier 재수행
90
+ # BUILDER_DONE — TASK-NN → TASK-NN builder 완료, verifier 필요
91
+ # BUILDER_START — TASK-NN → builder 중단됨, TASK-NN builder 재수행
92
+ # PLANNER_DONE → 계획 완료, 첫 TASK 시작
93
+ # PLANNER_START → planner 중단됨, planner 재수행
94
+ # SPECIFIER_DONE → specifier 완료, planner 필요
95
+ # SPECIFIER_START → specifier 중단됨, specifier 재수행
96
+ # 로그 파일 없음 → 처음부터 시작
97
+ ```
98
+
99
+ ---
100
+
101
+ ## § 5. Task Result XML 형식
102
+
103
+ ```xml
104
+ <task-result work="{WORK_ID}" task="{TASK_ID}" agent="{agent}" status="{PASS|FAIL}">
105
+ <summary>{1-2줄 요약}</summary>
106
+ <files-changed>
107
+ <file action="{created|modified|deleted}" path="{path}">{설명}</file>
108
+ </files-changed>
109
+ <verification>
110
+ <check name="{type}" status="{PASS|FAIL|N/A}">{상세}</check>
111
+ </verification>
112
+ <notes>{다음 단계를 위한 메모}</notes>
113
+ </task-result>
114
+ ```
115
+
116
+ ---
117
+
118
+ ## § 7. PLAN.md 필수 메타 정보 — 7개 필드
119
+
120
+ → `{REFERENCES_DIR}/file-content-schema.md` § 1 참조
121
+
122
+ | 필드 | 필수 | 설명 |
123
+ |------|------|------|
124
+ | `> Created:` | ✅ | YYYY-MM-DD |
125
+ | `> Requirement:` | ✅ | `REQ-XXX` 또는 사용자 요청 텍스트 |
126
+ | `> Execution-Mode:` | ✅ | `direct` / `pipeline` / `full` |
127
+ | `> Project:` | ✅ | 프로젝트 이름 |
128
+ | `> Tech Stack:` | ✅ | 감지된 기술 스택 |
129
+ | `> Language:` | ✅ | 언어 코드 (`ko`, `en` 등) |
130
+ | `> Status:` | ✅ | 항상 `PLANNED`로 시작 |
131
+
132
+ ---
133
+
134
+ ## § 8. WORK-LIST.md 업데이트 규칙
135
+
136
+ 파일: `works/WORK-LIST.md`
137
+
138
+ **형식:**
139
+ ```
140
+ LAST_WORK_ID: WORK-XX
141
+
142
+ | WORK | 제목 | 상태 | 생성일 | 완료일 |
143
+ |------|------|------|--------|--------|
144
+ | WORK-NN | ... | IN_PROGRESS | YYYY-MM-DD | |
145
+ | WORK-MM | ... | DONE | YYYY-MM-DD | YYYY-MM-DD |
146
+ ```
147
+
148
+ | 상태 | 의미 | 트리거 |
149
+ |------|------|--------|
150
+ | `IN_PROGRESS` | WORK 실행 중 | specifier가 WORK 생성 |
151
+ | `DONE` | 모든 TASK 완료, 리뷰/push 대기 | committer가 마지막 TASK 완료 |
152
+ | `COMPLETED` | _COMPLETED/로 아카이빙됨 | push 머지 (Main Claude가 모든 DONE 일괄 처리) |
153
+
154
+ 규칙:
155
+ - `LAST_WORK_ID` 헤더는 지금까지 생성된 가장 높은 WORK ID를 추적
156
+ - **specifier**: WORK 생성 시 IN_PROGRESS 행 추가 + `LAST_WORK_ID` 업데이트
157
+ - **committer**: 마지막 TASK 완료 시 `IN_PROGRESS` → `DONE`으로 변경하고 완료일 기입 (폴더 이동이나 행 제거 금지)
158
+ - **Main Claude** (push 절차): 모든 DONE WORK를 `works/_COMPLETED/`로 이동, WORK-LIST.md에서 해당 행 제거
159
+
160
+ ---
161
+
162
+ ## § 9. 로케일 감지
163
+
164
+ ```
165
+ 1. Grep 도구 사용: pattern "Language:\s*[a-z]{2}" path="CLAUDE.md" → 언어 코드 추출
166
+ 2. 없으면 사용자에게 언어 확인
167
+ 3. 없으면 Bash로 시스템 로케일 자동 감지:
168
+ - Windows: powershell -c "[CultureInfo]::CurrentCulture.TwoLetterISOLanguageName"
169
+ - Linux/Mac: locale | grep LANG
170
+ - 폴백: "en"
171
+ ```
172
+
173
+ ---
174
+
175
+ ## § 12. Bash 명령 규칙
176
+
177
+ Bash 명령은 권한 호환성을 위해 다음 규칙을 반드시 따라야 합니다.
178
+
179
+ **필수:**
180
+ - Bash 호출당 단순 명령 하나 — 복합 명령 금지 (`&&`, `||`, `;`, `|`)
181
+ - `cd` 금지 — Bash 도구의 cwd는 항상 프로젝트 루트. `cd dir &&`, `cd dir ;`, `cd dir` 어떤 형태든 사용 금지. 프로젝트 루트 기준 상대 경로 사용
182
+ - 멀티라인 스크립트 금지 — 별도 Bash 호출로 분할
183
+ - 인수 내 서브셸 확장 금지 — 예: `printf` 안의 `$(date ...)`
184
+ - 프로젝트 루트 기준 상대 경로 사용 (예: `works/WORK-01/`) — 절대 경로 금지
185
+ - `git add file`, `git commit -m "msg"` 사용 — `git -C path` 플래그 금지
186
+
187
+ **파일 작업에는 Bash 대신 전용 도구를 우선 사용:**
188
+ - 파일 읽기 → `Read` 도구 (`cat` 아님)
189
+ - 파일 쓰기/추가 → `Write` 도구 (`echo >>` 또는 `printf >>` 아님)
190
+ - 파일 편집 → `Edit` 도구 (`sed -i` 아님)
191
+ - 파일 검색 → `Grep` 도구 (`grep` 아님)
192
+ - 파일 찾기 → `Glob` 도구 (`find` 아님)
193
+
194
+ **Git 예시:**
195
+ ```
196
+ 잘못됨: cd /path/to/project && git add file && git commit -m "msg"
197
+ 올바름: git add file (한 번의 호출)
198
+ git commit -m "msg" (다음 호출)
199
+ ```
200
+
201
+ ---
202
+
203
+ ## Version
204
+
205
+ - Created: 2026-03-10
206
+ - Updated: 2026-03-31
@@ -0,0 +1,26 @@
1
+ # 작업 활동 로그
2
+
3
+ `works/{WORK_ID}/work_{WORK_ID}.log`에 에이전트 시작/종료 이벤트를 기록.
4
+
5
+ ## 규칙
6
+
7
+ 1. **타임스탬프**: Bash로 `date -u +"%Y-%m-%dT%H:%M:%SZ"` 실행하여 실제 UTC 시간 획득. 더미 값 사용 금지.
8
+ 2. **기록 방법**: Bash `echo` 로 추가.
9
+ 3. **항목**: 에이전트 역할별 START와 DONE만. 중간 단계 없음.
10
+
11
+ ## 형식
12
+
13
+ ```
14
+ [YYYY-MM-DDTHH:MM:SSZ] AGENT_EVENT — description
15
+ ```
16
+
17
+ ## 필수 항목
18
+
19
+ | 에이전트 | START | DONE |
20
+ |----------|-------|------|
21
+ | specifier | `SPECIFIER_START — WORK-NN specifier started` | `SPECIFIER_DONE — WORK-NN specifier completed` |
22
+ | planner | `PLANNER_START — WORK-NN planner started` | `PLANNER_DONE — WORK-NN planner completed` |
23
+ | scheduler | `SCHEDULER_START — WORK-NN scheduler started` | `SCHEDULER_DONE — WORK-NN scheduler completed` |
24
+ | builder | `BUILDER_START — TASK-NN implement` | `BUILDER_DONE — TASK-NN complete` |
25
+ | verifier | `VERIFIER_START — TASK-NN verification` | `VERIFIER_DONE — TASK-NN verified` |
26
+ | committer | `COMMITTER_START — TASK-NN commit` | `COMMITTER_DONE — TASK-NN committed` |
@@ -0,0 +1,120 @@
1
+ # 에이전트 통신 XML 스키마
2
+
3
+ uc-taskmanager 에이전트용 XML 통신 형식 정의.
4
+
5
+ ---
6
+
7
+ ## 1. Dispatch 형식 (디스패처 → 수신자)
8
+
9
+ ```xml
10
+ <dispatch to="{receiver}" work="{WORK_ID}" task="{TASK_ID}" execution-mode="{direct|pipeline|full}">
11
+ <ref-cache> <!-- 선택사항 -->
12
+ <ref key="shared-prompt-sections">{파일 내용}</ref>
13
+ <ref key="file-content-schema">{파일 내용}</ref>
14
+ <ref key="xml-schema">{파일 내용}</ref>
15
+ <ref key="context-policy">{파일 내용}</ref>
16
+ <ref key="work-activity-log">{파일 내용}</ref>
17
+ </ref-cache>
18
+ <references-dir>{references 디렉토리 절대 경로}</references-dir>
19
+ <context>
20
+ <project>{프로젝트 이름}</project>
21
+ <language>{lang_code}</language>
22
+ <plan-file>works/{WORK_ID}/PLAN.md</plan-file>
23
+ </context>
24
+ <task-spec>
25
+ <file>works/{WORK_ID}/TASK-XX.md</file>
26
+ <title>{제목}</title>
27
+ <action>{implement|verify|commit|plan|route}</action>
28
+ <description>{선택사항}</description>
29
+ </task-spec>
30
+ <previous-results>
31
+ <result task="{TASK_ID}" status="{PASS|FAIL|SKIP}">{요약}</result>
32
+ </previous-results>
33
+ <cache-hint sections="{section1},{section2}"/>
34
+ </dispatch>
35
+ ```
36
+
37
+ | 속성 | 값 |
38
+ |------|-----|
39
+ | `to` | builder, verifier, committer, planner, scheduler, specifier |
40
+ | `task` | `TASK-NN` — WORK 접두사 포함 금지 |
41
+ | `execution-mode` | direct / pipeline / full (생략 시 full 기본값) |
42
+
43
+ ---
44
+
45
+ ## 2. Task Result 형식 (수신자 → 디스패처)
46
+
47
+ ```xml
48
+ <task-result work="{WORK_ID}" task="{TASK_ID}" agent="{agent}" status="{PASS|FAIL}">
49
+ <summary>{1-2줄 요약}</summary>
50
+ <files-changed>
51
+ <file action="{created|modified|deleted}" path="{path}">{설명}</file>
52
+ </files-changed>
53
+ <verification>
54
+ <check name="{type}" status="{PASS|FAIL|N/A}">{출력}</check>
55
+ </verification>
56
+ <notes>{메모}</notes>
57
+ <ref-cache> <!-- 선택사항 -->
58
+ <ref key="shared-prompt-sections">{파일 내용}</ref>
59
+ <ref key="file-content-schema">{파일 내용}</ref>
60
+ <ref key="xml-schema">{파일 내용}</ref>
61
+ <ref key="context-policy">{파일 내용}</ref>
62
+ <ref key="work-activity-log">{파일 내용}</ref>
63
+ </ref-cache>
64
+ </task-result>
65
+ ```
66
+
67
+ ---
68
+
69
+ ## 3. Context-Handoff 요소
70
+
71
+ ```xml
72
+ <context-handoff from="{agent}" detail-level="{FULL|SUMMARY|DROP}">
73
+ <what>{변경/검증 상세}</what>
74
+ <why>{결정 근거}</why> <!-- FULL만 -->
75
+ <caution>{주의사항}</caution> <!-- FULL만 -->
76
+ <incomplete>{미완료 항목}</incomplete> <!-- FULL만 -->
77
+ </context-handoff>
78
+ ```
79
+
80
+ | detail-level | 포함 필드 |
81
+ |:---:|---|
82
+ | `FULL` | what, why, caution, incomplete |
83
+ | `SUMMARY` | what만 (1-3줄) |
84
+ | `DROP` | 요소 생략 |
85
+
86
+ ---
87
+
88
+ ## 4. ref-cache 요소 정의
89
+
90
+ `<ref-cache>`는 dispatch 및 task-result XML 내에서 미리 로딩된 레퍼런스 파일 내용을 전달하는 선택적 컨테이너 요소입니다. 존재할 경우, 수신 에이전트는 디스크에서 파일을 읽는 대신 반드시 이 내용을 사용해야 합니다.
91
+
92
+ ### 구조
93
+
94
+ ```xml
95
+ <ref-cache>
96
+ <ref key="{확장자 없는 파일명}">{전체 파일 내용}</ref>
97
+ ...
98
+ </ref-cache>
99
+ ```
100
+
101
+ | 요소 | 필수 | 설명 |
102
+ |------|------|------|
103
+ | `<ref-cache>` | 선택 | 캐시된 레퍼런스 파일 컨테이너. 캐시가 없으면 전체 생략. |
104
+ | `<ref key="...">` | — | 개별 레퍼런스 파일. `key`는 확장자 없는 파일명 (예: `shared-prompt-sections`). |
105
+
106
+ ### 인식되는 키
107
+
108
+ | 키 | 대응 파일 |
109
+ |-----|-----------|
110
+ | `shared-prompt-sections` | `{REFERENCES_DIR}/shared-prompt-sections.md` |
111
+ | `file-content-schema` | `{REFERENCES_DIR}/file-content-schema.md` |
112
+ | `xml-schema` | `{REFERENCES_DIR}/xml-schema.md` |
113
+ | `context-policy` | `{REFERENCES_DIR}/context-policy.md` |
114
+ | `work-activity-log` | `{REFERENCES_DIR}/work-activity-log.md` |
115
+
116
+ ### 하위 호환성
117
+
118
+ - `<ref-cache>` 없는 dispatch 또는 task-result XML은 완전히 유효 — 에이전트는 `REFERENCES_DIR`에서 파일을 읽는 것으로 폴백.
119
+ - ref-cache를 아직 지원하지 않는 에이전트는 해당 요소를 무시하고 정상적으로 파일을 읽음.
120
+ - 부분적 ref-cache (일부 키만 존재)도 허용 — 없는 키는 디스크에서 읽음.