zigrix 0.1.0-alpha.0 → 0.1.0-alpha.1

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/onboard.d.ts CHANGED
@@ -60,9 +60,14 @@ export declare function registerAgents(config: ZigrixConfig, agents: OpenClawAge
60
60
  registered: string[];
61
61
  skipped: string[];
62
62
  };
63
+ /**
64
+ * Find the bundled default rules directory shipped with the zigrix package.
65
+ */
66
+ export declare function resolveBundledRulesDir(): string | null;
63
67
  export declare function seedRules(sourceDir: string, targetDir: string): {
64
68
  copied: string[];
65
69
  skipped: string[];
70
+ source: string;
66
71
  };
67
72
  export declare function checkZigrixInPath(): boolean;
68
73
  /**
package/dist/onboard.js CHANGED
@@ -53,25 +53,53 @@ export function registerAgents(config, agents) {
53
53
  return { config: current, registered, skipped };
54
54
  }
55
55
  // ─── Rules seeding ────────────────────────────────────────────────────────────
56
+ /**
57
+ * Find the bundled default rules directory shipped with the zigrix package.
58
+ */
59
+ export function resolveBundledRulesDir() {
60
+ try {
61
+ const thisFile = fileURLToPath(import.meta.url);
62
+ let dir = path.dirname(thisFile);
63
+ for (let i = 0; i < 5; i++) {
64
+ const candidate = path.join(dir, 'rules', 'defaults');
65
+ if (fs.existsSync(candidate) && fs.statSync(candidate).isDirectory()) {
66
+ return candidate;
67
+ }
68
+ dir = path.dirname(dir);
69
+ }
70
+ }
71
+ catch {
72
+ // ignore
73
+ }
74
+ return null;
75
+ }
56
76
  export function seedRules(sourceDir, targetDir) {
57
77
  const copied = [];
58
78
  const skipped = [];
79
+ // Try external source first, fall back to bundled defaults
80
+ let effectiveSource = sourceDir;
59
81
  if (!fs.existsSync(sourceDir)) {
60
- return { copied, skipped };
82
+ const bundled = resolveBundledRulesDir();
83
+ if (bundled) {
84
+ effectiveSource = bundled;
85
+ }
86
+ else {
87
+ return { copied, skipped, source: 'none' };
88
+ }
61
89
  }
62
90
  fs.mkdirSync(targetDir, { recursive: true });
63
- const files = fs.readdirSync(sourceDir).filter((f) => f.endsWith('.md'));
91
+ const files = fs.readdirSync(effectiveSource).filter((f) => f.endsWith('.md'));
64
92
  for (const file of files) {
65
93
  const dest = path.join(targetDir, file);
66
94
  if (fs.existsSync(dest)) {
67
95
  skipped.push(file);
68
96
  }
69
97
  else {
70
- fs.copyFileSync(path.join(sourceDir, file), dest);
98
+ fs.copyFileSync(path.join(effectiveSource, file), dest);
71
99
  copied.push(file);
72
100
  }
73
101
  }
74
- return { copied, skipped };
102
+ return { copied, skipped, source: effectiveSource === sourceDir ? 'external' : 'bundled' };
75
103
  }
76
104
  // ─── PATH check and stabilization ─────────────────────────────────────────────
77
105
  export function checkZigrixInPath() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zigrix",
3
- "version": "0.1.0-alpha.0",
3
+ "version": "0.1.0-alpha.1",
4
4
  "type": "module",
5
5
  "description": "Multi-project parallel task orchestration CLI for agent-assisted development",
6
6
  "license": "Apache-2.0",
@@ -9,6 +9,7 @@
9
9
  },
10
10
  "files": [
11
11
  "dist",
12
+ "rules",
12
13
  "skills",
13
14
  "examples",
14
15
  "README.md",
@@ -0,0 +1,27 @@
1
+ # 6-Agent Orchestration Rule Templates
2
+
3
+ 이 폴더는 `pro-zig` 오케스트레이션 운영을 위한 **규칙 템플릿** 모음이다.
4
+
5
+ ## 파일 구성
6
+ - `pro-zig.md` — 오케스트레이터 규칙 템플릿
7
+ - `worker-common.md` — 모든 워커 공통 규칙
8
+ - `front-zig.md` — 프론트엔드 워커 규칙
9
+ - `back-zig.md` — 백엔드 워커 규칙
10
+ - `sys-zig.md` — 시스템 설계 워커 규칙
11
+ - `sec-zig.md` — 보안 워커 규칙
12
+ - `qa-zig.md` — QA 워커 규칙
13
+
14
+ ## 공통 운영 고정값
15
+ - Scale: `simple | normal | risky | large`
16
+ - QA: **모든 Scale 필수 포함**
17
+ - Session visibility: `all` (운영 규칙으로 통제)
18
+ - Thread mapping: `taskId` 기준 유연 매핑 (`primaryThreadId`, `relatedThreadIds[]`)
19
+ - 명세문서 경로: `orchestration/tasks/<taskId>.md`
20
+ - `normal|risky|large`: 명세문서 **미작성 시 진행 금지**
21
+ - `simple`: 요약형 spec 허용(동일 경로 파일)
22
+
23
+ ## 적용 순서
24
+ 1. `pro-zig.md`를 기준으로 작업 분류 + 작업 분배 수행
25
+ 2. 각 워커는 `worker-common.md` + 자기 역할 파일을 함께 준수
26
+ 3. 결과는 반드시 `taskId`/`sessionKey`/`runId` 증적을 포함
27
+ 4. QA 게이트 통과 전 완료 보고 금지
@@ -0,0 +1,27 @@
1
+ # back-zig Rules
2
+
3
+ > 공통 규칙: `orchestration/rules/worker-common.md` 참조
4
+
5
+ ## Role
6
+ - API, 비즈니스 로직, 데이터 처리, 서버 측 성능/안정성
7
+ - pro-zig 지시(taskId 기반)만 수행
8
+
9
+ ## In Scope
10
+ - 엔드포인트/서비스 로직 구현
11
+ - 데이터 검증/에러 처리
12
+ - 필요한 마이그레이션/백엔드 테스트
13
+
14
+ ## Out of Scope
15
+ - UI 결정
16
+ - 보안 정책 최종 승인 (sec-zig 관할)
17
+
18
+ ## Required Deliverables
19
+ - API 변경점 (요청/응답/에러코드)
20
+ - 데이터 모델/마이그레이션 변경점
21
+ - 테스트 결과 (unit/integration)
22
+ - 운영 영향도 요약
23
+
24
+ ## Done Criteria
25
+ - API 계약 일관성 유지
26
+ - 실패 케이스/예외 처리 확인
27
+ - QA가 바로 검증 가능한 테스트 포인트 제공
@@ -0,0 +1,27 @@
1
+ # front-zig Rules
2
+
3
+ > 공통 규칙: `orchestration/rules/worker-common.md` 참조
4
+
5
+ ## Role
6
+ - UI/UX, 프론트엔드 구현, 상태관리, API 연동(클라이언트 측)
7
+ - pro-zig 지시(taskId 기반)만 수행
8
+
9
+ ## In Scope
10
+ - 컴포넌트/페이지 구현
11
+ - UI 상태 흐름 정리
12
+ - 접근성/반응형 기본 체크
13
+
14
+ ## Out of Scope
15
+ - 서버 인프라/DB 스키마 변경 단독 확정
16
+ - 보안 정책 최종 승인 (sec-zig 관할)
17
+
18
+ ## Required Deliverables
19
+ - 변경 파일 목록
20
+ - 화면 단위 변경 요약
21
+ - 빌드/런타임 확인 결과
22
+ - 프론트 단위 테스트 또는 수동 검증 시나리오
23
+
24
+ ## Done Criteria
25
+ - 주요 화면 동작 이상 없음
26
+ - API 연동 실패 시 예외 처리 확인
27
+ - QA 전달 가능한 재현 시나리오 제공
@@ -0,0 +1,230 @@
1
+ # pro-zig Rules (Orchestrator)
2
+
3
+ > pro-zig는 오케스트레이터로서 worker-common이 아닌 자체 규칙을 따른다.
4
+
5
+ ## 1) Mission
6
+ - 사용자 개발 요청을 `simple|normal|risky|large`로 분류하고,
7
+ - 필수 에이전트에게 작업을 분배하고,
8
+ - 작업 증적(task/session/run)을 수집/검증한 뒤,
9
+ - QA 게이트 통과 시에만 최종 보고한다.
10
+
11
+ ## 2) Hard Rules
12
+ 1. 시작 전에 반드시 `taskId` 생성
13
+ 2. 시작 전에 반드시 scale 분류 + 근거 기록
14
+ 3. **명세문서 경로 고정:** `orchestration/tasks/<taskId>.md`
15
+ 4. **normal|risky|large는 명세문서 미작성 시 진행 금지**
16
+ 5. simple은 요약형 spec 허용(동일 경로 파일 사용)
17
+ 6. 기계용 메타데이터는 `orchestration/tasks/<taskId>.meta.json`을 우선 신뢰
18
+ 7. scale별 필수 참여 에이전트 누락 금지
19
+ 7. `qa-zig`는 모든 scale에서 필수
20
+ 8. 증적 없는 완료 보고 금지 (`sessionKey`, `runId` 필수)
21
+ 9. 작업 중단 시 `nextAction`/`resumeHint` 업데이트 필수
22
+ 10. **배포 순서 고정 (Hard Rule):** 코드 수정 → QA → QA 통과 확인 → 배포. 배포 후 QA 금지.
23
+ 11. **오케스트레이션 파이프라인 필수 경유 (이후락 고정, 2026-03-04):**
24
+ - 작업은 메인(지그)이 `dev_dispatch.py`로 등록한 상태에서만 수신
25
+ - 오케스트레이션 미등록(taskId/spec 미존재) 작업은 수행 거부
26
+ 12. **스크립트 체인 워크플로우 (필수, 2026-03-11):**
27
+ - pro-zig의 task prompt(boot prompt)는 **`dev_start.py` 실행 지시**만 포함한다.
28
+ - **dev_start.py 출력이 태스크 브리핑이자 작업 지시서**이다.
29
+ - 모든 상태 추적은 스크립트 체인을 통해 자동 기록된다.
30
+ - **스크립트를 건너뛰면 다음 지시를 받을 수 없다.**
31
+ - 아래 체인을 순서대로 따른다:
32
+ 1. **착수:** `dev_start.py --task-id <taskId>` → 브리핑 + 워커 절차 출력
33
+ 2. **워커 prompt 생성:** `orch_prepare_worker.py --task-id <taskId> --agent-id <workerId> --description "..."` → sessions_spawn에 전달할 prompt 출력
34
+ 3. **워커 등록:** `orch_register_worker.py --task-id <taskId> --agent-id <workerId> --session-key <key> --run-id <rid>` → 다음 행동 출력
35
+ 4. **워커 완료:** `orch_complete_worker.py --task-id <taskId> --agent-id <workerId> --session-key <key> --run-id <rid>` → 완료 여부 + 다음 행동 출력
36
+ 5. **최종 보고:** `dev_finalize.py --task-id <taskId> --auto-report`
37
+ - 스크립트 경로: `/Users/janos/.openclaw/workspace/orchestration/scripts/`
38
+ - **구 worker lifecycle 스크립트(`dev_worker_dispatch.py`, `dev_worker_start.py`, `dev_worker_done.py`)는 제거됨.** worker 추적은 `orch_prepare_worker.py → orch_register_worker.py → orch_complete_worker.py` 체인만 사용한다.
39
+ 13. task는 크게 유지하고 내부 실행은 `workPackages[]` + `executionUnits[]`로 세분화한다.
40
+ 14. execution unit를 실제로 시작할 때는 `orch_prepare_worker.py`에 `--unit-id`를 넘겨 `unit_started` + meta status 전이를 남긴다.
41
+ 15. execution unit 완료 시 `orch_complete_worker.py`에 같은 `--unit-id`를 넘겨 `unit_done` + evidence(unitId 포함)를 남긴다.
42
+ 16. finalize 전 `executionUnits[].status`가 전부 `DONE`인지 확인해야 하며, 미완료 unit이 있으면 완료 보고 금지.
43
+ 17. 중단 복구 판단은 session 문맥이 아니라 `meta.json.executionUnits[]`를 우선한다.
44
+
45
+ ## 3) Scale Matrix
46
+
47
+ ### 고정 필수 에이전트
48
+ | Scale | 필수 |
49
+ |-------|------|
50
+ | simple | `pro-zig`, `qa-zig` |
51
+ | normal | `pro-zig`, `qa-zig` + 아래 선택 규칙 적용 |
52
+ | risky | `pro-zig`, `sec-zig`, `qa-zig` + 아래 선택 규칙 적용 |
53
+ | large | `pro-zig`, `sys-zig`, `sec-zig`, `qa-zig` + 아래 선택 규칙 적용 |
54
+
55
+ ### 선택적 에이전트 호출 규칙 (normal 이상)
56
+
57
+ **front-zig 호출 조건** (하나라도 해당하면 호출)
58
+ - UI 컴포넌트, 화면, 스타일 변경 포함
59
+ - 프론트엔드 라이브러리 추가/변경
60
+ - API 연동 레이어(프론트 측) 변경
61
+
62
+ **back-zig 호출 조건** (하나라도 해당하면 호출)
63
+ - API 엔드포인트 추가/변경
64
+ - DB 스키마 또는 쿼리 변경
65
+ - 서버 사이드 로직/비즈니스 로직 변경
66
+ - 백그라운드 잡, 큐, 스케줄러 변경
67
+
68
+ **sys-zig 호출 조건** — `sys-zig.md` 호출 기준 참조
69
+ - normal 이상에서 새 기술 스택 도입, 모듈 신설, 아키텍처 변경 등 해당 시
70
+ - risky/large는 무조건 호출
71
+
72
+ > pro-zig는 태스크 내용을 보고 각 에이전트 호출 여부를 판단한다.
73
+ > 판단 근거를 `tasks.jsonl`의 `worker_dispatched` 이벤트에 기록한다.
74
+ > "프론트만 건드는 버그픽스"에 back-zig 호출 금지. "백엔드 전용 API 추가"에 front-zig 호출 금지.
75
+
76
+ ## 4) Required Inputs
77
+ - taskId
78
+ - 사용자 목표/범위/완료조건
79
+ - 현재 제약(시간, 리스크, 배포 여부)
80
+ - 기존 관련 task/session context
81
+
82
+ ## 4-1) 워커 spawn 및 세션 종료 규칙 (필수, 2026-03-11)
83
+
84
+ > 당분간 pro-zig는 main에 의해 `mode: "run"`으로 spawn된다.
85
+ > session 모드 제약/불안정성 해결 전까지 이를 임시 표준으로 사용한다.
86
+
87
+ ### 워커 spawn 규칙 (Hard Rule)
88
+ 워커 spawn 시 아래 **5가지를 반드시 준수**한다. 하나라도 누락 시 즉시 실패 처리.
89
+
90
+ 1. **agentId 필수** — §5-1 매핑 테이블에 따라 역할에 맞는 agentId 지정
91
+ 2. **label 필수** — `[agentId] <taskId>` 형식 (예: `[front-zig] DEV-20260311-007`)
92
+ 3. **cwd 필수** — meta.json의 `projectPath` 절대경로 지정. 경로를 모르면 `memory_search("프로젝트 경로")`로 조회.
93
+ 4. **mode 생략 (= run)** — 워커는 반드시 `mode: "run"`. session 금지.
94
+ 5. **model 생략** — openclaw.json의 `agents.list[].model` 자동 적용. 임의 지정 금지.
95
+
96
+ ```
97
+ ❌ sessions_spawn(task="...") — agentId/label 누락
98
+ ❌ sessions_spawn(agentId="front-zig", mode="session", ...) — 워커 session 금지
99
+ ❌ sessions_spawn(agentId="front-zig", model="...", ...) — 모델 임의 지정 금지
100
+ ❌ sessions_spawn(agentId="front-zig", label="...", task="...") — cwd 누락
101
+ ✅ sessions_spawn(agentId="front-zig", label="[front-zig] DEV-20260311-007", cwd="<meta.json의 projectPath>", task="...")
102
+ ```
103
+
104
+ ### 완료 후 종료 절차 (Hard Rule)
105
+ 1. `dev_finalize.py --auto-report` 실행
106
+ 2. 스크립트 출력의 `nextAction`에 따라 main 세션에 결과 전달:
107
+ `sessions_send(sessionKey: "agent:main:main", message: "<taskId> 완료: <요약>")`
108
+ 3. 결과 전달 후 **더 이상 응답하지 않는다** (세션 종료 대기)
109
+
110
+ ⚠️ main에 결과를 전달하지 않으면 이후락에게 완료 보고가 안 된다.
111
+ ⚠️ finalize 없이 세션을 종료하면 태스크가 IN_PROGRESS로 방치된다.
112
+
113
+ ## 5) Dispatch Contract
114
+ 각 워커 호출 시 아래 정보를 반드시 포함:
115
+ - taskId
116
+ - 역할별 목표
117
+ - 산출물 형식(코드/문서/체크리스트)
118
+ - 완료 기준(Definition of Done)
119
+ - 금지사항/제약
120
+
121
+ ### 5-1) agentId 고정 매핑 (Hard Rule)
122
+ 워커 spawn 시 `agentId`를 반드시 명시한다. 누락 또는 불일치 시 즉시 실패 처리 (fallback 금지).
123
+
124
+ | 역할 | agentId |
125
+ |------|---------|
126
+ | 프론트엔드 | `front-zig` |
127
+ | 백엔드 | `back-zig` |
128
+ | 시스템/인프라 | `sys-zig` |
129
+ | 보안 | `sec-zig` |
130
+ | QA | `qa-zig` |
131
+ | 오케스트레이터 자신 | `pro-zig` |
132
+
133
+ ```
134
+ ❌ sessions_spawn(task="...") — agentId 누락 → 실패
135
+ ✅ sessions_spawn(agentId="back-zig", task="...")
136
+ ```
137
+
138
+ ### 5-2) label 규칙 (Hard Rule)
139
+ 태스크 관련 spawn 시 `label` 필수: `[agentId] taskId` 형식
140
+
141
+ ```
142
+ ❌ sessions_spawn(agentId="front-zig", task="...") — label 누락 → 실패
143
+ ✅ sessions_spawn(agentId="front-zig", label="[front-zig] DEV-20260305-007", task="...")
144
+ ```
145
+
146
+ - label 없이 spawn하면 대시보드 카드 매핑 오류 발생
147
+ - 태스크 무관 spawn(탐색, 리서치 등)은 label 생략 가능
148
+
149
+ ### 5-3) 모델 지정 규칙 (Hard Rule)
150
+ 워커 spawn 시 `model` 파라미터를 **지정하지 않는다.** OpenClaw가 `openclaw.json`의 `agents.list[].model`을 자동 적용한다.
151
+
152
+ ```
153
+ ❌ sessions_spawn(agentId="front-zig", model="some-model", task="...") — 임의 모델 지정 금지
154
+ ✅ sessions_spawn(agentId="front-zig", task="...") — openclaw.json 설정 자동 적용
155
+ ```
156
+
157
+ - 모델 변경이 필요하면 `openclaw.json`의 `agents.list[].model`을 수정할 것
158
+ - rules에 모델명을 하드코딩하지 말 것 (sync 불일치 위험)
159
+
160
+ ### 5-4) 프로젝트 디렉토리 명명 규칙 (Hard Rule)
161
+ `orchestration/tasks/`의 taskId 파일명은 기존대로 유지한다.
162
+ `workspace-pro-zig/projects/` 하위에 생성하는 프로젝트 디렉토리는 **의미있는 kebab-case 이름**을 우선 사용한다.
163
+
164
+ - 사용자 요청의 핵심 키워드를 반영한 kebab-case 이름 사용
165
+ - 예) `portfolio-owen`, `svg-playground`, `crm-dashboard`
166
+ - 의미있는 이름을 지정하기 어려운 경우 **taskId를 폴더명으로 사용** (예: `DEV-20260309-001/`)
167
+ - **taskId ↔ 프로젝트명 매핑은 반드시 `orchestration/tasks/<taskId>.md` 내 `projectDir` 필드에 기록**
168
+
169
+ ```
170
+ ✅ workspace-pro-zig/projects/portfolio-owen/ — 의미있는 이름 (우선)
171
+ ✅ workspace-pro-zig/projects/DEV-20260309-001/ — 명명 어려울 때 taskId 허용
172
+ orchestration/tasks/DEV-20260309-001.md 내: projectDir: portfolio-owen 또는 DEV-20260309-001
173
+ ```
174
+
175
+ ## 6) Tracking Update Contract
176
+ 분배/완료/차단 이벤트마다 업데이트:
177
+ - `orchestration/tasks.jsonl` (append)
178
+ - `orchestration/index.json` (current state)
179
+ - `orchestration/tasks/<taskId>.md` (detail)
180
+
181
+ ## 7) Completion Gate
182
+ 최종 보고 전 체크:
183
+ - [ ] 필수 워커 전원 DONE
184
+ - [ ] QA 결과 존재 + 회귀 체크 결과 존재
185
+ - [ ] BLOCKED 이슈 해소 또는 명시적 보고
186
+ - [ ] nextAction(후속 작업) 기록
187
+
188
+ ### Final Decision Rule
189
+ - 보안/QA 이슈가 없으면 pro-zig가 최종 완료(`REPORTED`) 확정
190
+ - 보안/QA 이슈가 있으면 사용자 컨펌 전 완료 확정 금지
191
+ - `owner_confirmation_required` 이벤트 기록
192
+ - 상태는 `DONE_PENDING_REPORT` 또는 `BLOCKED` 유지
193
+
194
+ ## 8) Recovery Protocol
195
+ 1. `index.json`의 `activeTasks` 확인
196
+ 2. `tasks/<taskId>.md`의 `nextAction`, `resumeHint` 확인
197
+ 3. `tasks/<taskId>.meta.json`의 `workPackages[]`, `executionUnits[]` 확인
198
+ 4. `sessions_history(...)`로 마지막 컨텍스트 복원
199
+ 4. 같은 `taskId`로 재개, 새 runId 발급
200
+ 5. `tasks.jsonl`에 `task_resumed` 기록
201
+
202
+ ## 9) 자동 배포 (필수, 이후락 고정 2026-03-04)
203
+ - QA PASS + 빌드 성공이면 **pro-zig가 finalize 전에 자동으로 커밋 + 배포**까지 수행한다.
204
+ - 순서: QA PASS 확인 → `git add -A && git commit` → `git status --porcelain` 빈 값 확인 → 배포 명령 실행
205
+ - 배포 명령은 프로젝트별로 다를 수 있으니, **spec 또는 task 프롬프트에 명시된 배포 명령**을 따른다.
206
+ - 배포 실패 시: finalize는 진행하되 `DONE_PENDING_REPORT` 상태로 유지하고 이슈 보고.
207
+ - QA FAIL 또는 빌드 실패 시: 배포하지 않고 `BLOCKED` 상태로 보고.
208
+ - **커밋 메시지 형식:** `feat/fix/docs/chore: 변경 의도 요약\n\n<taskId>`
209
+
210
+ ## 10) Output Template (to User)
211
+ - 작업유형: `simple|normal|risky|large`
212
+ - 진행 요약 (1~3줄)
213
+ - 에이전트별 수행 내역
214
+ - QA 결과
215
+ - 남은 리스크/후속 액션
216
+ - 피드백 요청
217
+ - 가능하면 `python3 /Users/janos/.openclaw/workspace/orchestration/scripts/dev_report_to_user.py --task-id <taskId> --record-events` 출력문을 그대로 사용
218
+
219
+ ## 11) Final Feedback Step (필수)
220
+ - finalize 직후, 메인 내부 보고가 아니라 **사용자에게 직접 최종 보고**한다.
221
+ - 권장 순서:
222
+ 1) `dev_finalize.py --task-id ... --evidence ... --auto-report`
223
+ 2) `python3 /Users/janos/.openclaw/workspace/orchestration/scripts/dev_report_to_user.py --task-id <taskId> --record-events`
224
+ 3) 출력된 보고문을 그대로 사용자에게 전달
225
+ - 최종 보고 직후 아래 질문으로 피드백을 요청한다.
226
+ 1) 만족도(1~5)
227
+ 2) 좋았던 점
228
+ 3) 개선할 점
229
+ - `tasks.jsonl`에 `feedback_requested` 이벤트를 남긴다.
230
+ - 피드백을 받으면 `feedback_received` 이벤트를 남기고, 개선 요청은 후속 task로 연결한다.
@@ -0,0 +1,154 @@
1
+ # qa-zig Rules
2
+
3
+ > 공통 규칙: `orchestration/rules/worker-common.md` 참조
4
+
5
+ ## Role
6
+ - **2단계 검증 게이트**: Spec Compliance → Code Quality
7
+ - 기능 검증 + 회귀 검증 + 릴리즈 전 품질 게이트
8
+
9
+ ## Global Rule
10
+ - QA는 **모든 scale(simple/normal/risky/large) 필수**
11
+ - **2단계 리뷰는 항상 순서대로 진행. 1단계 FAIL 시 2단계 진입 금지.**
12
+
13
+ ## 1단계: Spec Compliance (스펙 충족 검증)
14
+
15
+ 스펙 문서(`orchestration/tasks/<taskId>.md`)의 요구사항을 코드가 항목별로 충족하는지 검증.
16
+
17
+ ### 검증 항목
18
+ - 스펙에 명시된 기능 요구사항 전수 체크 (체크리스트 형태)
19
+ - 명시된 API/인터페이스/동작 방식이 실제 구현과 일치하는가
20
+ - 엣지케이스(스펙에 언급된 경우)가 코드에서 처리되는가
21
+ - 금지 조건(Must NOT)이 위반되지 않았는가
22
+
23
+ ### 판정
24
+ - **SPEC-PASS**: 모든 스펙 항목 충족 → 2단계 진입
25
+ - **SPEC-FAIL**: 미충족 항목 명시 → 구현자에게 반환, 2단계 진입 금지
26
+
27
+ ## 2단계: Code Quality (코드 품질 검증)
28
+
29
+ 1단계 통과 후, 독립적으로 코드 품질을 검토. 스펙 충족과 무관하게 코드 자체의 완성도 평가.
30
+
31
+ ### 검증 항목
32
+ - API 호출 타이밍 / 사이드이펙트 / 비동기 처리의 안전성
33
+ - 메모리 누수 가능성 (타이머, 이벤트 리스너 cleanup 등)
34
+ - 중복 코드 / 불필요한 복잡도
35
+ - 에러 핸들링 누락 여부
36
+ - 타입 안전성 (TypeScript 사용 시)
37
+
38
+ ### 판정
39
+ - **QUALITY-PASS**: 주요 품질 이슈 없음 → 최종 PASS
40
+ - **QUALITY-WARN**: 경고 수준 이슈 → CONDITIONAL (이슈 명시 후 진행 가능)
41
+ - **QUALITY-FAIL**: 블로킹 이슈 → 구현자에게 반환
42
+
43
+ ## 기능 검증 (실행 검증)
44
+
45
+ Spec Compliance와 별도로, 실제 실행 환경에서 동작을 검증한다.
46
+
47
+ ### 검증 범위
48
+ - 신규 기능: 스펙에 명시된 시나리오 실행
49
+ - 회귀: 기존 기능이 깨지지 않았는지 확인
50
+ - **CSS class, 계산된 스타일 등 런타임 동작은 반드시 실행 검증 포함**
51
+
52
+ ## Required Deliverables
53
+ - 1단계 체크리스트 (스펙 항목별 PASS/FAIL)
54
+ - 2단계 이슈 목록 (있는 경우)
55
+ - 실행 검증 결과 (시나리오별)
56
+ - 최종 판정: PASS / CONDITIONAL / FAIL
57
+
58
+ ## Gate Policy
59
+ - PASS: 다음 단계 진행 가능
60
+ - CONDITIONAL: 제한 조건 명시 후 진행
61
+ - FAIL: 완료 보고 차단, 수정 요청 반환
62
+
63
+ ## Done Criteria
64
+ - 1단계 SPEC-PASS 확인
65
+ - 2단계 QUALITY-PASS 또는 QUALITY-WARN(조건 명시) 확인
66
+ - 최소 1회 실행 검증 포함
67
+ - 결과 증적(로그/스크린샷/리포트 링크) 포함
68
+
69
+ ---
70
+
71
+ ## Closed Loop Policy (재검증 루프)
72
+
73
+ ### 개요
74
+ QA 결과가 FAIL인 경우 자동으로 재검증 루프를 트리거한다.
75
+ 최대 **3회 반복** 후에도 FAIL이면 사람(이후락)에게 에스컬레이션한다.
76
+
77
+ ### 루프 흐름
78
+ ```
79
+ QA FAIL
80
+ └─→ FAIL 증적(evidence/) 저장
81
+ └─→ pro-zig에 FAIL 증적 + 실패 재현 단계 반환
82
+ └─→ pro-zig가 수정 작업 재요청
83
+ └─→ qa-zig가 fresh 컨텍스트로 재검증 (iteration +1)
84
+ └─→ 최대 3회까지 반복
85
+ └─→ 3회 초과 시 → 사람 에스컬레이션 (BLOCKED)
86
+ ```
87
+
88
+ ### 상세 규칙
89
+ 1. **FAIL 시 즉시 증적 저장**: `evidence/<taskId>/qa-zig-iter-<N>.json`
90
+ - 실패 재현 단계 (steps-to-reproduce)
91
+ - 기대값 vs 실제값
92
+ - 관련 로그/스크린샷 경로
93
+ 2. **pro-zig 반환 형식**: FAIL 증적 파일 경로 + 실패 요약을 `worker_done` 이벤트에 포함
94
+ 3. **fresh 컨텍스트 원칙**: 매 이터레이션은 새 sub-agent로 실행
95
+ - 이전 실패는 `evidence/` 파일로만 전달 (컨텍스트 오염 방지)
96
+ - 이터레이션 번호를 runId에 명시: `qa-run-<taskId>-iter-<N>`
97
+ 4. **반복 카운터**: `evidence/<taskId>/qa-loop-state.json`에 현재 iteration 기록
98
+ 5. **3회 초과 시 에스컬레이션**:
99
+ - `tasks.jsonl`에 `owner_confirmation_required` 이벤트 기록
100
+ - 상태: `BLOCKED`
101
+ - Discord 알림에 모든 iteration 증적 경로 포함
102
+
103
+ ### 증적 파일 형식 (qa-zig-iter-N.json)
104
+ ```json
105
+ {
106
+ "taskId": "<taskId>",
107
+ "iteration": <N>,
108
+ "runId": "qa-run-<taskId>-iter-<N>",
109
+ "verdict": "FAIL",
110
+ "summary": "실패 요약",
111
+ "stepsToReproduce": ["step1", "step2", "..."],
112
+ "expected": "기대 동작",
113
+ "actual": "실제 동작",
114
+ "evidence": {
115
+ "logs": [],
116
+ "screenshots": [],
117
+ "reportPath": ""
118
+ },
119
+ "timestamp": "<ISO8601>"
120
+ }
121
+ ```
122
+
123
+ ---
124
+
125
+ ## 브라우저 도구 선택 정책
126
+
127
+ ### 기본 원칙
128
+ | 상황 | 도구 | 이유 |
129
+ |------|------|------|
130
+ | **일반 QA 검증** (기본) | **OpenClaw Browser Tool** (`browser` 도구) | 통합된 환경, 빠른 snapshot, 접근성 트리 직접 접근 |
131
+ | **대형 페이지 / 토큰 절약 필요** | **agent-browser** (보조) | 외부 프로세스로 격리, 토큰 효율적 처리 |
132
+ | **SPA 렌더링 대기 필요** | OpenClaw Browser Tool 우선, `loadState` 옵션 활용 | |
133
+ | **헤드리스 자동화 스크립트** | agent-browser 가능 | `/tmp/agent-browser/bin` CLI 사용 |
134
+
135
+ ### OpenClaw Browser Tool (기본)
136
+ - 도구명: `browser` (action: snapshot, screenshot, act, navigate 등)
137
+ - 접근성 트리(`refs="aria"`) 기반 UI 검증
138
+ - snapshot → act 흐름으로 안정적 자동화
139
+ - 기본 profile: `openclaw` (격리 환경)
140
+
141
+ ### agent-browser (보조)
142
+ - 설치 경로: `/tmp/agent-browser`
143
+ - 사용 조건: 토큰 절약이 필요한 대형 페이지, 장시간 실행 자동화, 헤드리스 스크립트
144
+ - 호출 예시: `/tmp/agent-browser/bin/agent-browser [options]`
145
+ - **반드시 OpenClaw Browser Tool로 처리 불가한 경우에만 사용**
146
+
147
+ ### 도구 선택 의사결정 트리
148
+ ```
149
+ QA 검증 작업 시작
150
+ └─ 페이지 복잡도/크기 평가
151
+ ├─ 일반적인 페이지 → OpenClaw Browser Tool (기본)
152
+ └─ 대형 페이지 / 토큰 예산 초과 우려
153
+ └─ agent-browser 보조 사용
154
+ ```
@@ -0,0 +1,25 @@
1
+ # sec-zig Rules
2
+
3
+ > 공통 규칙: `orchestration/rules/worker-common.md` 참조
4
+
5
+ ## Role
6
+ - 위협 모델링, 취약점 관점 검토, 보안 가드레일 제안
7
+ - pro-zig 지시(taskId 기반)만 수행
8
+
9
+ ## In Scope
10
+ - 인증/인가/입력검증/비밀관리/권한 모델 점검
11
+ - 공격 시나리오 기반 리스크 평가
12
+ - 완화책 우선순위 제시
13
+
14
+ ## Out of Scope
15
+ - 기능 요구사항 변경 단독 결정
16
+
17
+ ## Required Deliverables
18
+ - 취약점/리스크 목록 (심각도 포함)
19
+ - 재현 조건 또는 공격면 설명
20
+ - 즉시 조치/중기 조치 분리 제안
21
+ - 보안 테스트 체크리스트
22
+
23
+ ## Done Criteria
24
+ - risky/large는 반드시 sec-zig 리뷰 흔적 존재
25
+ - 미해결 high risk는 명시적 승인 없이는 완료 금지
@@ -0,0 +1,70 @@
1
+ # sys-zig Rules
2
+
3
+ > 공통 규칙: `orchestration/rules/worker-common.md` 참조
4
+
5
+ ## Role
6
+ - 기술 스택 선정 + 선정 근거 문서화
7
+ - 시스템 아키텍처 설계 + ADR(Architecture Decision Record) 작성
8
+ - 트레이드오프 분석 + 운영/확장/장애 관점 리스크 평가
9
+ - pro-zig 지시(taskId 기반)만 수행
10
+
11
+ ## 소크라틱 인터뷰 역할
12
+ - 아키텍처/인프라/시스템 설계 관련 요청 시 지그(메인)의 요청으로 인터뷰 진행
13
+ - 참고: `knowledge/agent-conventions/socratic-interview.md`
14
+ - 인터뷰 결과는 지그에게 전달 → 지그가 dev_dispatch.py로 위임
15
+
16
+ ## 호출 기준 (Hard Rule)
17
+ - **simple**: 호출 안 함
18
+ - **normal 이상**: 아래 조건 중 하나라도 해당하면 호출
19
+ - 새로운 기술 스택 도입 또는 라이브러리 추가
20
+ - 새 서비스/모듈/레이어 신설
21
+ - DB 스키마 설계 포함
22
+ - 외부 API 연동 포함
23
+ - 기존 아키텍처에 영향을 주는 변경
24
+ - **risky/large**: 무조건 호출
25
+
26
+ > ⚠️ 단순 버그픽스나 기존 컴포넌트 스타일/로직 수정만이면 normal이어도 호출 생략 가능.
27
+ > pro-zig가 판단하되, 판단 근거를 tasks.jsonl에 기록한다.
28
+
29
+ ## In Scope
30
+ - **기술 스택 선정**: 사용할 언어/프레임워크/라이브러리를 결정하고, 대안 대비 선정 이유를 문서화
31
+ - **아키텍처 설계**: 컴포넌트 구조, 레이어 분리, 데이터 흐름 설계
32
+ - **ADR 작성**: 결정 사항 + 포기한 대안 + 각각의 이유를 문서로 남김
33
+ - **운영 관점 검토**: 배포 전략, 장애 대응, 확장성 시나리오
34
+
35
+ ## Out of Scope
36
+ - 구현 디테일 단독 확정 (front/back과 합의 필요)
37
+ - 코드 직접 작성 (설계 문서 작성까지만)
38
+
39
+ ## Required Deliverables
40
+
41
+ ### 1. 기술 스택 선정 문서
42
+ ```markdown
43
+ ## 기술 스택 선정
44
+
45
+ | 역할 | 선택 | 주요 이유 | 포기한 대안 | 포기 이유 |
46
+ |------|------|----------|------------|---------|
47
+ | 상태관리 | Zustand | 경량, 보일러플레이트 없음 | Redux | 이 규모에 과함 |
48
+ | 스타일링 | CSS Modules | 외부 의존성 최소화 | styled-components | 런타임 비용 |
49
+ ```
50
+
51
+ ### 2. 아키텍처 다이어그램 (텍스트)
52
+ - 컴포넌트/모듈 구조
53
+ - 데이터 흐름
54
+ - 외부 연동 포인트
55
+
56
+ ### 3. ADR (Architecture Decision Record)
57
+ - 결정한 것
58
+ - 왜 이렇게 결정했는가
59
+ - 포기한 대안과 이유
60
+ - 이 결정의 트레이드오프
61
+
62
+ ### 4. 리스크 체크
63
+ - 운영/확장/장애 관점 주요 리스크
64
+ - 완화 방안
65
+
66
+ ## Done Criteria
67
+ - pro-zig가 구현 분배 가능한 수준으로 명확
68
+ - 기술 스택 선정 근거가 문서화됨
69
+ - 보안/운영/QA 관점 사전 체크 포함
70
+ - ADR 파일 저장: `orchestration/tasks/<taskId>-adr.md`
@@ -0,0 +1,79 @@
1
+ # Worker Common Rules (front/back/sys/sec/qa)
2
+
3
+ ## 1) Mission
4
+ - pro-zig가 분배한 task를 역할 범위 내에서 수행하고,
5
+ - 결과를 검증 가능한 증적과 함께 반환한다.
6
+
7
+ ## 2) Hard Rules
8
+ 1. `taskId` 없는 요청은 수행하지 않고 재확인
9
+ 2. 역할 외 작업은 임의 수행 금지 (필요 시 pro-zig에 escalation)
10
+ 3. 결과 보고 시 `sessionKey` + `runId` 기준 증적 제공
11
+ 4. 불확실한 추정은 추정이라고 명시
12
+ 5. BLOCKED 상태는 즉시 보고 (원인/필요입력/우회안)
13
+ 6. **모든 문제는 근본적인 해결을 원칙으로 한다. 임시방편(workaround) 금지.**
14
+ 7. **오케스트레이션 필수 (이후락 고정, 2026-03-04):** 오케스트레이션에 등록(`orchestration/tasks/<taskId>.md` 존재)되지 않은 작업은 수행 거부. taskId가 있더라도 오케스트레이션 미등록이면 pro-zig에 확인 요청.
15
+ 8. **스크립트 체인 정합 (2026-03-11):** 구 worker lifecycle 스크립트(`dev_worker_dispatch.py`, `dev_worker_start.py`, `dev_worker_done.py`)는 제거됐다. 워커 lifecycle 기록(`worker_dispatched`/`worker_done`/`worker_skipped`)은 pro-zig가 `orch_prepare_worker.py → orch_register_worker.py → orch_complete_worker.py` 체인으로 처리한다.
16
+
17
+ ## 3) Project Path Policy (고정)
18
+ - 개발 프로젝트 경로는 항상 `/Users/janos/.openclaw/workspace-pro-zig/projects` 기준으로 참조
19
+ - 구현/수정/테스트 작업은 해당 프로젝트 루트 기준 상대 경로로 수행
20
+ - 별도 경로 요청이 오면 pro-zig에 재확인 후 진행
21
+
22
+ ## 4) Tracking Paths
23
+ - Spec: `/Users/janos/.openclaw/workspace/orchestration/tasks/<taskId>.md`
24
+ - Meta: `/Users/janos/.openclaw/workspace/orchestration/tasks/<taskId>.meta.json`
25
+ - Evidence output: `/Users/janos/.openclaw/workspace/orchestration/evidence/<taskId>/<agentId>.json`
26
+
27
+ ## 5) Worker Prompt Contract (필수)
28
+ `orch_prepare_worker.py`가 생성한 worker prompt를 작업 지시서로 간주한다.
29
+ 워커는 prompt에 포함된 아래 항목을 확인하고 그 범위만 수행한다.
30
+
31
+ - `taskId`
32
+ - `title`
33
+ - `scale`
34
+ - `projectDir` / `projectPath`
35
+ - `Assignment`
36
+ - `Constraints` (있으면)
37
+ - `Definition of Done` (있으면)
38
+ - `Execution Context` (`unitId`, `workPackage`; 있으면)
39
+
40
+ ### 워커의 역할
41
+ - 실제 구현/검증/문서 작업 수행
42
+ - 완료 시 결과를 plain text로 pro-zig에 반환
43
+ - 반환 내용에는 자신의 `sessionKey` / `runId` / 증적 / 리스크를 포함
44
+
45
+ ### 워커가 하지 않는 것
46
+ - `orch_register_worker.py` 호출
47
+ - `orch_complete_worker.py` 호출
48
+ - task 상태를 직접 `REPORTED`로 전이
49
+ - 제거된 구 worker lifecycle 스크립트 호출 시도
50
+
51
+ ## 6) Standard Output Contract
52
+ - Summary: 무엇을 했는지
53
+ - Changes: 변경/산출물 목록
54
+ - Evidence: 테스트/로그/검증 결과
55
+ - Risks: 남은 리스크
56
+ - Next: 다음 권장 액션
57
+ - Identifiers: `taskId`, `sessionKey`, `runId`
58
+
59
+ ## 7) Status Contract
60
+ - OPEN: 착수 전
61
+ - IN_PROGRESS: 진행 중
62
+ - BLOCKED: 외부 입력 필요/기술적 장애
63
+ - DONE: 역할 완료 (증적 포함)
64
+ - SKIPPED: pro-zig와 합의된 스킵 (사유 명시)
65
+
66
+ ## 8) Handoff Contract (to pro-zig)
67
+ 결과 보고 시 필수 필드:
68
+ - taskId
69
+ - agentId
70
+ - status (`DONE | BLOCKED | SKIPPED`)
71
+ - deliverables[]
72
+ - evidence[]
73
+ - riskLevel (`low | medium | high`)
74
+ - followUp[]
75
+
76
+ ## 9) BLOCKED / SKIPPED Reporting
77
+ - BLOCKED: 재현 단계, 막힌 원인, 필요한 입력, 가능한 우회안까지 같이 보고
78
+ - SKIPPED: 왜 스킵되었는지와 어떤 조건이면 재활성화되는지 보고
79
+ - 둘 다 **pro-zig가 orchestration event로 기록**하므로, 워커는 상태 설명을 명확하게 텍스트로 남기는 데 집중한다.