Skip to content

Commit d73d9f8

Browse files
파트라슈파트라슈
authored andcommitted
feat: add auto-approve visibility status and events APIs
1 parent 5114f05 commit d73d9f8

9 files changed

Lines changed: 532 additions & 11 deletions

.env.example

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,5 +49,8 @@ MAESTRO_AUTO_APPROVE_COOLDOWN_MS=0
4949
# true면 정책 매칭/이벤트만 수행하고 실제 git merge는 실행하지 않음
5050
MAESTRO_AUTO_APPROVE_DRY_RUN=false
5151

52+
# 자동승인 정책/실행 이벤트 로그 최대 저장 개수 (기본 500, 최소 50, 최대 5000)
53+
MAESTRO_AUTO_APPROVE_LOG_MAX_ITEMS=500
54+
5255
# 승인 이력 링버퍼 최대 저장 개수 (기본 300, 최소 40, 최대 2000)
5356
MAESTRO_HISTORY_MAX_ITEMS=300

README.md

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ Maestro는 AI 에이전트가 생성하거나 수정한 코드 변경을 "승인
3030
- 기본 `HOST=127.0.0.1` + `ALLOWED_ORIGINS` 화이트리스트 기반 CORS 적용
3131
- 승인 이력 악보뷰(`WP-009`): `GET /api/history` + `HISTORY_APPEND` 실시간 히스토리 패널
3232
- `function bach`: 상단 미니 플레이어에서 YouTube 기반 BGM 재생/일시정지/볼륨/채널 URL 등록
33-
- 조건부 자동승인(`WP-008`) 2차: explicit/cooldown/dry-run/중복승인 차단 가드레일 반영 (기본 `OFF`)
33+
- 조건부 자동승인(`WP-008`) 2~3차: explicit/cooldown/dry-run/중복승인 차단 + 운영 가시성 API(`GET /api/auto-approve/status`, `GET /api/auto-approve/events`) 반영
3434

3535
## 현재 개발 현황 (2026-03-04 기준)
3636

@@ -50,7 +50,7 @@ Maestro는 AI 에이전트가 생성하거나 수정한 코드 변경을 "승인
5050
- 원클릭 실행 경로(`npm run start:app`, `npm run check:env`) 제공
5151
- `start:app` 오류 조치 메시지/대시보드 URL 자동 감지 고도화
5252
- 확인된 개선 필요 항목
53-
- 조건부 자동승인(`WP-008`) 3차 운영 가시성(API/로그) 고도화 필요
53+
- 조건부 자동승인(`WP-008`) 운영 API 기반 대시보드 UI 가시화(후속)
5454
- `KI-001` `function bach` Hz 미노출 환경 원인 분석/재현 확보 필요
5555

5656
## 변경 필요 항목 및 작업계획
@@ -59,7 +59,7 @@ Maestro는 AI 에이전트가 생성하거나 수정한 코드 변경을 "승인
5959

6060
즉시 진행할 핵심 3가지:
6161

62-
1. P1 조건부 자동승인(`WP-008`) 3차: 운영 가시성 API/로그 확장
62+
1. P1 조건부 자동승인 운영 UI(운영 API 시각화) 고도화
6363
2. P2 승인 이력(`WP-009`) 3차: 악보 시각화 고도화 + 접근성 마감
6464
3. P2 문서/운영 동기화: 실행 표준 경로와 장애 대응 가이드 지속 업데이트
6565

@@ -110,6 +110,13 @@ curl -X POST http://localhost:8080/api/request \
110110

111111
조건부 자동승인에서 명시 플래그를 요구하도록 설정했다면(`MAESTRO_AUTO_APPROVE_REQUIRE_EXPLICIT=true`), 요청 본문에 `"autoApprove": true`를 포함해야 자동승인 대상이 됩니다.
112112

113+
운영 상태 확인 API 예시:
114+
115+
```bash
116+
curl -s http://localhost:8080/api/auto-approve/status | jq
117+
curl -s "http://localhost:8080/api/auto-approve/events?limit=20" | jq
118+
```
119+
113120
## 설치 가이드 (Installation)
114121

115122
자세한 설치/사용법은 [USER_GUIDE.md](USER_GUIDE.md)를 참고하세요.

USER_GUIDE.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ cp .env.example .env
112112
| `MAESTRO_AUTO_APPROVE_REQUIRE_EXPLICIT` | `false` | `autoApprove=true` 명시 요청만 자동승인할지 여부 |
113113
| `MAESTRO_AUTO_APPROVE_COOLDOWN_MS` | `0` | 자동승인 시도 간 최소 간격(ms) |
114114
| `MAESTRO_AUTO_APPROVE_DRY_RUN` | `false` | 정책 매칭만 수행하고 실제 merge는 건너뜀 |
115+
| `MAESTRO_AUTO_APPROVE_LOG_MAX_ITEMS` | `500` | 자동승인 정책/실행 이벤트 로그 최대 저장 개수 (50~5000) |
115116
| `MAESTRO_HISTORY_MAX_ITEMS` | `300` | 승인 이력 링버퍼 최대 저장 개수 (40~2000) |
116117

117118
예시 `.env`:
@@ -130,6 +131,7 @@ MAESTRO_AUTO_APPROVE_MAX_DESC_LENGTH=180
130131
MAESTRO_AUTO_APPROVE_REQUIRE_EXPLICIT=false
131132
MAESTRO_AUTO_APPROVE_COOLDOWN_MS=0
132133
MAESTRO_AUTO_APPROVE_DRY_RUN=false
134+
MAESTRO_AUTO_APPROVE_LOG_MAX_ITEMS=500
133135
MAESTRO_HISTORY_MAX_ITEMS=300
134136
```
135137

@@ -222,6 +224,18 @@ sh hooks/notify-maestro.sh feature/test-branch "테스트 커밋" "실제 통신
222224
조건부 자동승인을 켠 경우(`MAESTRO_AUTO_APPROVE_ENABLED=true`), 정책에 일치하는 요청은 대시보드 수동 입력 없이 자동 병합 시도가 수행됩니다.
223225
`MAESTRO_AUTO_APPROVE_REQUIRE_EXPLICIT=true`를 함께 사용하면 요청 본문에 `"autoApprove": true`를 넣은 요청만 자동승인 대상으로 처리됩니다.
224226

227+
운영 가시성 API:
228+
229+
```bash
230+
# 자동승인 설정/런타임 상태 + 최근 이벤트
231+
curl -s http://localhost:8080/api/auto-approve/status | jq
232+
233+
# 자동승인 이벤트 로그 조회 (필터 가능)
234+
curl -s "http://localhost:8080/api/auto-approve/events?limit=20&decision=BLOCKED" | jq
235+
```
236+
237+
`MAESTRO_SERVER_TOKEN`을 설정한 경우 위 API도 `Authorization: Bearer <token>` 헤더가 필요합니다.
238+
225239
---
226240

227241
## 롤백(UNDO) 사용법

docs/DEV_LOG_2026-02-28.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
| 2026-03-01 09:30+ | (working tree) | `WP-008` 2차: explicit/cooldown/dry-run + 중복 승인 방지 + 서버 회귀 확장 |
3838
| 2026-03-04 20:50+ | (working tree) | `WP-009` 상세설계 + 전문가 관점 설계 검증 문서화 |
3939
| 2026-03-04 22:40+ | (working tree) | `WP-009` 1~2차 구현: history buffer/API/`HISTORY_APPEND` + 히스토리 패널/필터/`H` 토글 + 회귀/QA/E2E/스모크 통과 |
40+
| 2026-03-04 23:30+ | (working tree) | `WP-008` 3차 완료: `/api/auto-approve/status` + `/api/auto-approve/events` + 운영 로그 링버퍼 + 서버 회귀/QA/E2E/스모크 통과 |
4041

4142
## 3) 이번 구간 성과
4243

@@ -83,8 +84,8 @@
8384

8485
## 6) 다음 단계
8586

86-
1. 다음 우선순위: `WP-008` 3차 구현(운영 가시성 API/로그 고도화)
87-
2. 다음 우선순위: `WP-009` 3차 구현(악보 시각화 고도화/접근성 마감)
87+
1. 다음 우선순위: `WP-009` 3차 구현(악보 시각화 고도화/접근성 마감)
88+
2. 다음 우선순위: `WP-008` 운영 API UI 시각화(대시보드 통합)
8889
3. `KI-001`(`function bach` Hz 미노출 환경) 분리 추적 유지
8990

9091
## 7) 다음 회고에서 반드시 비교할 지표

docs/QA_AGENT.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ npm run smoke:integration
4343
- 토큰 비활성: `200`
4444
- 토큰 활성 + 미인증/오인증: `401`
4545
- 토큰 활성 + 정인증: `200`
46+
- 자동승인 운영 API 분기
47+
- `GET /api/auto-approve/status` 응답 구조/요약 값 검증
48+
- `GET /api/auto-approve/events` limit/filter(`requestId`, `decision`, `reason`) 검증
49+
- 토큰 활성 시 운영 API 미인증 요청 `401` 검증
4650
- CORS 정책 분기
4751
- 허용 Origin preflight: `204` + `Access-Control-Allow-Origin`
4852
- 비허용 Origin preflight/request: `403`

docs/WORK_PLAN.md

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
- `WP-005` 완료: 서버/UI/E2E + CI 게이트 + 통합 스모크(`npm run smoke:integration`) 반영
4242
- `WP-006` 완료: `check:env` preflight + `start:app` 원클릭 런처 + 가이드 반영
4343
- `WP-007` 진행중: 1차(상수/유틸 분리) + 2차(UI 컴포넌트 분해) + 3차(게임/입력/WebSocket 훅 분리) 완료
44-
- `WP-008` 진행중: 1차(정책 골격) + 2차(가드레일/중복승인 방지/운영스위치) 완료
44+
- `WP-008` 완료: 1차(정책 골격) + 2차(가드레일/중복승인 방지/운영스위치) + 3차(운영 가시성 API/로그) 완료
4545
- `WP-009` 진행중: 1차(서버 이력 버퍼/API) + 2차(히스토리 패널/필터/토글) 완료
4646
- QA 에이전트 설정 완료: `npm run qa` + 회귀 테스트 스위트 + QA 가이드 추가
4747
- `function bach` 1차 완료: 상단 미니 플레이어, 채널 URL 저장, 재생/일시정지/볼륨, 주파수(Hz) 시각화 반영
@@ -50,8 +50,8 @@
5050

5151
## 1-2) 다음 작업 포인트 (즉시 실행)
5252

53-
1. `WP-008` 3차 구현: 운영 가시성(자동승인 사유/상태 로그 API) 강화
54-
2. `WP-009` 3차 구현: 악보 시각화(레인/밀도 표현) 고도화 + 접근성 마무리
53+
1. `WP-009` 3차 구현: 악보 시각화(레인/밀도 표현) 고도화 + 접근성 마무리
54+
2. `WP-008` 운영 API UI화: 운영 지표를 대시보드에서 시각 확인 가능하도록 확장
5555
3. `KI-001` 분리 추적: `function bach` Hz 미노출 환경 재현/원인 수집
5656

5757
## 1-6) `WP-009` 상세설계/전문가 검증 상태 (2026-03-04)
@@ -72,7 +72,9 @@
7272
- 1, 2, 4 완료 (`npm run qa`, `npm run test:e2e`, `npm run smoke:integration` 통과)
7373
- 3은 다음 스프린트에서 시각화 고도화로 진행
7474

75-
## 1-5) `WP-008` 상세 실행계획 및 진행 상태 (2026-03-01)
75+
## 1-5) `WP-008` 상세 실행계획 및 진행 상태 (2026-03-04)
76+
77+
- 3차 상세계획 문서: [`docs/WP-008_PHASE3_OPERABILITY_PLAN.md`](./WP-008_PHASE3_OPERABILITY_PLAN.md)
7678

7779
고정 순서:
7880

@@ -88,6 +90,7 @@
8890
| 정책 조건 조합 | `trustedAgents`/`branchPrefix`/`maxDescriptionLength` + `requireExplicit` + `cooldown` 평가 | `/api/request` 응답의 `autoApprove.reason`으로 차단 사유 확인 가능 | 완료 |
8991
| 중복 승인 방지 | 요청 상태맵(`ready/approving/merged/rejected`) + 중복 `APPROVE` 차단 | 동일 `requestId` 재승인 시 `MERGE_SKIPPED` 반환 | 완료 |
9092
| 운영 스위치 | `dryRun` 모드에서 정책 매칭만 수행, merge 미실행 | `AUTO_APPROVE_SKIPPED` 이벤트 확인 가능 | 완료 |
93+
| 운영 가시성 API/로그 | `/api/auto-approve/status`, `/api/auto-approve/events` + 링버퍼 로그(`MAESTRO_AUTO_APPROVE_LOG_MAX_ITEMS`) | 정책 판정/실행 결과를 API로 추적 가능 | 완료 |
9194
| 회귀 테스트 | 서버 회귀에 explicit/cooldown/dry-run/duplicate 케이스 추가 | `npm run qa` 통과 | 완료 |
9295

9396
## 1-3) 즉시 실행 결과 (2026-02-28)
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
# WP-008 3차 상세계획: 조건부 자동승인 운영 가시성
2+
3+
기준일: 2026-03-04
4+
대상: Maestro Coding `WP-008` 3차
5+
6+
## 1) 목표
7+
8+
- 자동승인 정책 판정과 실행 결과를 운영자가 API만으로 추적할 수 있게 한다.
9+
- 기존 승인/반려/롤백/히스토리/function bach UX를 손상하지 않는다.
10+
- 보안 기준(`MAESTRO_SERVER_TOKEN`)과 동일한 접근제어를 유지한다.
11+
12+
## 2) 전문가 검토 요약
13+
14+
### A. Product/Ops 전문가
15+
16+
- 필요 최소 정보:
17+
- 현재 정책(활성화 여부, dry-run, cooldown, explicit)
18+
- 현재 런타임 상태(in-flight, 최근 성공/실패 시각, 요청 상태 분포)
19+
- 최근 이벤트 로그(왜 승인/차단됐는지 reason)
20+
- 결론: `status` + `events` 2개 API면 운영 추적 가능.
21+
22+
### B. Backend 전문가
23+
24+
- 메모리 링버퍼가 MVP+ 단계에서 가장 안전하고 빠름.
25+
- 이벤트 생성 지점:
26+
1. `/api/request` 정책 판정 직후
27+
2. `runConditionalAutoApprove` 실행 시작/스킵/성공/실패
28+
- 환경변수:
29+
- `MAESTRO_AUTO_APPROVE_LOG_MAX_ITEMS` (기본 500)
30+
31+
### C. Security 전문가
32+
33+
- 운영 API는 상태/정책 정보를 포함하므로 token 모드에서는 인증 필수.
34+
- 민감값(토큰, 절대 경로)은 응답에서 제외.
35+
- allowlist 필드로만 로그 저장.
36+
37+
### D. QA 전문가
38+
39+
- 서버 회귀 필수 케이스:
40+
- `GET /api/auto-approve/status` 응답 구조 검증
41+
- `GET /api/auto-approve/events` limit/filter 검증
42+
- token 설정 시 운영 API 401 검증
43+
- cooldown/dry-run 케이스 reason 로그 검증
44+
45+
## 3) 구현 범위
46+
47+
포함:
48+
- `GET /api/auto-approve/status`
49+
- `GET /api/auto-approve/events`
50+
- 자동승인 이벤트 링버퍼 및 append 로직
51+
- `.env.example`, README/가이드/워크플랜/QA 문서 동기화
52+
- 서버 회귀 테스트 보강
53+
54+
제외:
55+
- DB 영속 저장
56+
- 외부 로그 수집기 연동
57+
- 프론트 운영 대시보드 UI 추가
58+
59+
## 4) API 스펙
60+
61+
### GET `/api/auto-approve/status`
62+
63+
응답 예시:
64+
65+
```json
66+
{
67+
"config": {
68+
"enabled": true,
69+
"dryRun": false,
70+
"requireExplicit": true,
71+
"cooldownMs": 60000,
72+
"maxDescriptionLength": 180,
73+
"branchPrefix": "feature/",
74+
"trustedAgents": ["qa_agent"],
75+
"trustedAgentsCount": 1
76+
},
77+
"runtime": {
78+
"inFlightCount": 0,
79+
"trackedRequestCount": 3,
80+
"requestStateSummary": {
81+
"ready": 1,
82+
"approving": 0,
83+
"merged": 1,
84+
"rejected": 1
85+
},
86+
"lastAutoApproveAt": "2026-03-04T13:01:00.000Z",
87+
"autoApproveEventCount": 12
88+
},
89+
"recentEvents": [],
90+
"count": 12
91+
}
92+
```
93+
94+
쿼리:
95+
- `eventsLimit` (기본 40, 최대 300)
96+
97+
### GET `/api/auto-approve/events`
98+
99+
쿼리:
100+
- `limit` (기본 40, 최대 300)
101+
- `requestId` (선택)
102+
- `decision` (선택: `ELIGIBLE|BLOCKED|EXECUTING|SKIPPED|MERGED|FAILED`)
103+
- `reason` (선택)
104+
105+
응답:
106+
107+
```json
108+
{
109+
"items": [],
110+
"count": 0,
111+
"maxItems": 500
112+
}
113+
```
114+
115+
## 5) 검증 게이트
116+
117+
1. `npm run test:server`
118+
2. `npm run qa`
119+
3. `npm run test:e2e`
120+
4. `npm run smoke:integration`
121+
122+
## 6) 완료 기준
123+
124+
- 운영 API가 정책/실행 가시성을 제공한다.
125+
- 보안/회귀 테스트가 모두 통과한다.
126+
- 문서와 `.env.example`가 실제 코드와 일치한다.

0 commit comments

Comments
 (0)