Skip to content

Commit 5504e13

Browse files
serithemageclaude
andcommitted
Add OpenClaw 5-layer gatekeeping architecture blog post
Analyze OpenClaw's automated quality gates: pre-commit hooks, pnpm check pipeline, CI smart routing with 15 parallel jobs, PR lifecycle automation (auto-labeling, noise filtering, stale management, evidence-based templates), and release gates with CODEOWNERS and environment approvals. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent b8aaf9f commit 5504e13

1 file changed

Lines changed: 271 additions & 0 deletions

File tree

Lines changed: 271 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,271 @@
1+
---
2+
title: "OpenClaw의 5계층 게이트키핑: AI 에이전트 시대의 품질 관리"
3+
date: 2026-03-27T10:00:00+09:00
4+
draft: false
5+
toc: false
6+
images:
7+
tags:
8+
- vibe-coding
9+
- agentic-dev
10+
- openclaw
11+
- gatekeeping
12+
- ci-cd
13+
---
14+
15+
> 31만 스타 프로젝트에 쏟아지는 수천 건의 PR과 8개 AI 에이전트의 병렬 커밋. 이 혼돈 속에서 품질이 무너지지 않는 비결은 5계층의 자동화된 게이트키핑에 있다.
16+
17+
{{< figure src="/posts/images/Dohyun.png" title="정도현 - 로보코 수석 컨설턴트" style=".author-image">}}
18+
19+
---
20+
21+
이전 글에서 OpenClaw의 [AGENTS.md가 담고 있는 생산성의 원칙](/posts/openclaw-agents-md-productivity-secrets/)을 분석했다. 그 글의 핵심은 "규칙을 쓰는 것"이었다. 하지만 규칙을 쓰는 것과 규칙을 **강제하는 것**은 완전히 다른 문제다.
22+
23+
OpenClaw는 GitHub에서 가장 많은 스타를 받은 저장소(31만+)이자, 바이브 코딩의 대표 사례다.[^1] 이 프로젝트는 두 가지 극단적 압력을 동시에 받는다. 하나는 메인테이너 Peter Steinberger가 3~8개의 AI 에이전트를 동시에 돌리며 쏟아내는 **내부 변경**이고, 다른 하나는 전 세계 컨트리뷰터가 AI 보조로 만들어 제출하는 **수천 건의 외부 PR**이다.
24+
25+
AGENTS.md에 "이것을 하지 마라"고 쓰는 것은 소프트 가드레일이다. AI 에이전트는 대개 따르지만, 항상 따르지는 않는다. 외부 컨트리뷰터는 그 규칙의 존재조차 모를 수 있다. 그래서 OpenClaw는 규칙 위에 **5계층의 자동화된 강제 메커니즘**을 쌓았다. 이 글은 그 메커니즘을 해부한다.
26+
27+
---
28+
29+
## 1계층: 커밋 전에 잡는다 — 로컬 프리커밋
30+
31+
OpenClaw의 첫 번째 방어선은 코드가 저장소에 도달하기도 전에 작동한다. [`git-hooks/pre-commit`](https://github.com/openclaw/openclaw/tree/main/git-hooks)`package.json``prepare` 스크립트를 통해 자동 활성화되며, 커밋할 때마다 실행된다.
32+
33+
동작 순서가 흥미롭다:
34+
35+
1. 스테이지된 파일을 타입별로 필터링
36+
2. **oxlint** `--type-aware --fix` — 린트 오류를 **자동 수정**
37+
3. **oxfmt** `--write` — 포매팅을 **자동 수정**
38+
4. 수정된 파일을 다시 스테이징
39+
5. `pnpm check` — 전체 품질 게이트 실행
40+
41+
핵심 설계는 **자동 수정과 차단의 분리**다. 포맷이나 린트 오류처럼 기계적으로 고칠 수 있는 문제는 훅이 알아서 고치고 통과시킨다. 하지만 타입 오류나 아키텍처 경계 위반처럼 판단이 필요한 문제는 커밋 자체를 차단한다. 이 구분이 없으면 에이전트는 사소한 포맷 오류 때문에 멈추거나, 구조적 결함을 그냥 통과시키거나, 둘 중 하나가 된다.
42+
43+
여기에 더해 [`.pre-commit-config.yaml`](https://github.com/openclaw/openclaw/blob/main/.pre-commit-config.yaml)은 CI의 `security-fast` 잡에서도 실행되는 17개의 보안/품질 훅을 정의한다. `detect-private-key``detect-secrets`로 시크릿 유출을 차단하고, `zizmor`로 GitHub Actions 워크플로의 보안을 감사하며, `pnpm-audit-prod`로 프로덕션 의존성의 알려진 취약점을 검사한다.
44+
45+
---
46+
47+
## 2계층: 하나의 명령어로 10가지를 검증한다 — `pnpm check`
48+
49+
`pnpm check`는 로컬 훅과 CI 모두에서 실행되는 **단일 품질 게이트**다. 하나의 명령어 뒤에 10개 이상의 체크가 체이닝되어 있다.
50+
51+
```
52+
pnpm check =
53+
check:no-conflict-markers # 머지 충돌 마커 없음
54+
check:host-env-policy:swift # Swift 호스트 환경 보안 정책
55+
check:base-config-schema # 설정 스키마 드리프트 체크
56+
check:bundled-plugin-metadata # 플러그인 메타데이터 일관성
57+
check:bundled-provider-auth-env-vars # 프로바이더 인증 환경변수 일관성
58+
format:check (oxfmt) # 포매팅 검증
59+
tsgo # TypeScript 네이티브 타입 체킹
60+
plugin-sdk:check-exports # 플러그인 SDK 익스포트 일관성
61+
lint (oxlint --type-aware) # 타입 인식 린팅
62+
+ ~15개 커스텀 아키텍처 경계 린트 스크립트
63+
```
64+
65+
여기서 가장 주목할 부분은 마지막 줄이다. 일반적인 린터는 "사용하지 않는 변수"나 "누락된 세미콜론" 같은 코드 수준 문제를 잡는다. 하지만 OpenClaw의 커스텀 경계 가드 스크립트는 **아키텍처 수준 위반**을 잡는다. Extension이 코어 `src/**`를 직접 임포트하거나, 플러그인 SDK의 내부 경로를 참조하거나, 패키지 루트 밖으로 상대 경로를 뻗는 것을 감지한다.
66+
67+
이것은 [이전 글에서 분석한 AGENTS.md의 임포트 경계 규칙](/posts/openclaw-agents-md-productivity-secrets/#2-경계를-코드가-아닌-규칙으로-강제하라)이 코드로 구현된 것이다. 규칙 문서에 "하지 마라"고 쓴 것을 CI가 실제로 검증하고 차단한다. **규칙과 검증의 이중 장벽**이다.
68+
69+
---
70+
71+
## 3계층: 15개 병렬 잡이 모든 변경을 검사한다 — CI 워크플로
72+
73+
OpenClaw의 [`ci.yml`](https://github.com/openclaw/openclaw/blob/main/.github/workflows/ci.yml)은 PR과 main 푸시에서 실행되는 메인 게이트키퍼다. ~15개의 병렬 잡으로 구성되며, Draft PR은 건너뛴다.
74+
75+
### 스마트 라우팅: 속도와 철저함의 양립
76+
77+
모든 변경에 모든 테스트를 돌리면 철저하지만 느리다. 관련 테스트만 돌리면 빠르지만 놓칠 수 있다. OpenClaw는 **preflight 잡**으로 이 딜레마를 해결한다.
78+
79+
preflight 잡은 변경된 파일의 스코프를 감지해 CI 매니페스트를 생성한다. 문서만 변경했다면 문서 체크만, Swift 파일을 건드렸다면 macOS 빌드+테스트를 추가하고, 특정 Extension만 변경했다면 해당 Extension 테스트만 실행한다. 이 스마트 라우팅이 "느리지만 철저한" CI와 "빠르지만 불완전한" CI 사이의 균형을 만든다.
80+
81+
### CI 잡 전체 구조
82+
83+
| 카테고리 || 체크 내용 |
84+
|---------|-----|---------|
85+
| **보안** | security-fast | private key 감지, Actions 보안 감사, 의존성 감사 |
86+
| **품질** | check | pnpm check 전체 + strict smoke build |
87+
| **아키텍처** | check-additional | 15개+ 경계 가드, 스키마 드리프트, SDK API 베이스라인 |
88+
| **빌드** | build-artifacts | pnpm build + UI 빌드 |
89+
| **테스트 (Linux)** | checks (샤딩) | vitest 유닛 테스트, 채널 테스트, Node 22 호환 |
90+
| **테스트 (Windows)** | checks-windows (샤딩) | 전체 테스트 스위트 |
91+
| **테스트 (macOS)** | macos-node (샤딩) | 전체 테스트 스위트 |
92+
| **Extension** | checks-fast, extension-fast | 컨트랙트 테스트, 변경 Extension 타겟 테스트 |
93+
| **네이티브 앱** | macos-swift, android | Swift/Kotlin 빌드+테스트+린트 |
94+
| **문서** | check-docs | 포매팅, 링크 감사, i18n 용어집 |
95+
| **스모크** | build-smoke | CLI --help/--version, 시작 메모리 체크 |
96+
| **릴리스** | release-check (main만) | 릴리스 콘텐츠 검증 |
97+
98+
특히 인상적인 것은 [`check-additional`](https://github.com/openclaw/openclaw/blob/main/.github/workflows/ci.yml) 잡의 아키텍처 경계 가드다. 플러그인→Extension 임포트 위반, Extension SDK 내부 경로 참조, `raw window.open` 사용, 게이트웨이 watch 회귀 등을 커스텀 스크립트로 감지한다. 일반적인 CI 파이프라인에서는 볼 수 없는, **바이브 코딩 환경에 특화된 가드레일**이다.
99+
100+
---
101+
102+
## 4계층: 수천 건의 PR을 사람 없이 분류한다 — PR 수명주기 자동화
103+
104+
31만 스타 프로젝트에는 수천 건의 이슈와 PR이 쏟아진다. 메인테이너가 하나하나 분류하는 것은 불가능하다. OpenClaw는 세 가지 자동화 워크플로로 이 문제를 해결한다.
105+
106+
### 자동 라벨링: 변경 파일이 곧 라벨이다
107+
108+
[`labeler.yml`](https://github.com/openclaw/openclaw/blob/main/.github/labeler.yml) 워크플로는 PR이 열리면 변경된 파일 경로를 분석해 라벨을 자동 부여한다. 21개 채널 라벨(`channel: discord`, `channel: telegram` 등), 4개 앱 라벨(`app: ios`, `app: android` 등), 8개 영역 라벨(`gateway`, `agents`, `security` 등), 30개 이상의 Extension 라벨이 정의되어 있다.
109+
110+
거기에 **PR 크기 라벨**(XS/S/M/L/XL)을 줄 수 기반으로 자동 부여하고, **메인테이너 라벨**을 팀 멤버십으로 판별하며, **beta-blocker 라벨**을 PR 제목에서 자동 감지한다. 이 라벨들이 다음 단계의 자동 응답 시스템을 트리거한다.
111+
112+
### 자동 응답: 노이즈를 자동으로 걸러낸다
113+
114+
[`auto-response.yml`](https://github.com/openclaw/openclaw/blob/main/.github/workflows/auto-response.yml)은 라벨 기반으로 PR과 이슈를 자동 처리한다. 이 워크플로의 규칙들은 실제 운영 경험에서 축적된 것이다.
115+
116+
**스팸/노이즈 차단**:
117+
- `r: spam` 또는 `r: moltbook` 라벨 → 자동 닫기 + 잠금
118+
- `dirty` 라벨 또는 라벨 20개 초과 PR → "noisy PR" 메시지와 함께 닫기
119+
120+
**커뮤니티 행동 제한**:
121+
- 비메인테이너의 오픈 PR이 **10개를 초과**하면 → `r: too-many-prs` 라벨 부여 후 자동 닫기
122+
- 이슈/PR에서 메인테이너 **3명 이상을 멘션**하면 → 스팸 핑 경고 메시지
123+
124+
**적절한 채널 안내**:
125+
- `r: skill` → 스킬 관련 질문은 ClawHub으로 안내 후 닫기
126+
- `r: support` → 지원 요청은 Discord로 안내 후 닫기
127+
- `r: no-ci-pr` → CI 설정만 변경하는 PR 거절
128+
129+
**인당 PR 10개 상한**은 특히 바이브 코딩 시대에 중요하다. AI 도구로 PR을 대량 생산하기 쉬워진 환경에서, 한 사람이 리뷰 큐를 독점하는 것을 방지한다. CONTRIBUTING.md도 이를 명시한다: *"Keep PRs focused (one thing per PR; do not mix unrelated concerns)"*[^2]
130+
131+
### 수명 관리: 방치된 PR은 자동 정리한다
132+
133+
[`stale.yml`](https://github.com/openclaw/openclaw/blob/main/.github/workflows/stale.yml)은 매일 실행되며 방치된 이슈와 PR을 정리한다. 이슈는 7일 후 stale 표시 → 5일 후 닫기, PR은 5일 후 stale → 3일 후 닫기. 닫힌 이슈는 48시간 후 잠금. `enhancement`, `maintainer`, `pinned`, `security` 라벨이 붙은 항목은 면제된다.
134+
135+
PR의 수명이 이슈보다 짧은 것이 눈에 띈다(5+3일 vs 7+5일). 코드 변경은 시간이 지날수록 컨텍스트와 멀어지고 충돌 가능성이 커지기 때문이다.
136+
137+
### PR 템플릿: 증거를 구조적으로 요구한다
138+
139+
OpenClaw의 [PR 템플릿](https://github.com/openclaw/openclaw/blob/main/.github/pull_request_template.md)은 일반적인 "무엇을 했는가" 수준을 넘어서 **증거 기반 리뷰**를 강제한다.
140+
141+
필수 섹션 중 특히 주목할 부분:
142+
143+
- **What did NOT change (scope boundary)**: 변경하지 않은 범위를 명시적으로 선언. AI 에이전트가 만든 변경은 스코프가 넓어지기 쉬운데, 의도적 경계를 선언하게 해서 리뷰어가 스코프 크리프를 감지할 수 있게 한다.
144+
- **Security Impact**: 권한, 시크릿, 네트워크, 도구 실행, 데이터 접근 변경 여부를 **각각 Yes/No로 체크**. "보안에 영향이 있나요?"라는 모호한 질문 대신, 구체적 표면을 하나씩 점검하게 한다.
145+
- **Evidence**: 실패→성공 테스트, 트레이스/로그, 스크린샷 중 **최소 1개** 첨부 필수.
146+
- **Human Verification**: 검증한 시나리오, 엣지 케이스, 그리고 **검증하지 않은 것**을 명시.
147+
148+
마지막 항목이 특히 중요하다. "무엇을 테스트했는가"만 물으면 PR 작성자는 성공한 케이스만 나열한다. "무엇을 테스트하지 않았는가"를 물으면 리뷰어가 위험 영역을 즉시 파악할 수 있다.
149+
150+
---
151+
152+
## 5계층: 되돌릴 수 없는 행동 앞에서 멈춘다 — 릴리스 게이트
153+
154+
CI는 완전 자동이지만, 릴리스는 절대 자동이 아니다. OpenClaw의 릴리스 파이프라인은 **수동 트리거 + 환경 승인 + 다단계 검증**으로 구성된다.
155+
156+
### NPM 릴리스: 19단계 시퀀스
157+
158+
[`openclaw-npm-release.yml`](https://github.com/openclaw/openclaw/blob/main/.github/workflows/openclaw-npm-release.yml)`workflow_dispatch`로만 트리거된다. 자동 릴리스는 없다. 실행되면 다음 검증을 순서대로 거친다:
159+
160+
1. 태그 포맷 검증
161+
2. `pnpm check` + `pnpm build` + `pnpm release:check`
162+
3. npm 버전 유일성 확인
163+
4. **`npm-release` 환경 승인**`@openclaw/openclaw-release-managers` 팀원의 명시적 승인 필수
164+
5. main 브랜치에서만 실행 강제
165+
6. 이후 19단계 시퀀스: 태그 생성 → npm preflight → mac preflight (공개+비공개) → 실제 퍼블리시 → 에셋 검증 → appcast 업데이트
166+
167+
### CODEOWNERS: 보안 표면을 물리적으로 잠근다
168+
169+
[`CODEOWNERS`](https://github.com/openclaw/openclaw/blob/main/.github/CODEOWNERS)는 GitHub가 강제하는 하드 가드레일이다. AGENTS.md의 "보안 파일을 건드리지 마라"가 소프트 가드레일이라면, CODEOWNERS는 해당 팀의 리뷰 승인 없이는 **머지 자체가 불가능**하게 만든다.
170+
171+
**`@openclaw/secops`** 가 보호하는 표면:
172+
- 보안 코드: `src/security/`, `src/secrets/`, 게이트웨이 인증/시크릿, 에이전트 샌드박스
173+
- 보안 인프라: dependabot, CodeQL, `SECURITY.md`
174+
- 보안 문서: 인증, 샌드박싱, 시크릿 관련 문서 전체
175+
176+
**`@openclaw/openclaw-release-managers`** 가 보호하는 표면:
177+
- 릴리스 워크플로, 퍼블리시 스크립트, 릴리스 문서
178+
179+
CODEOWNERS 파일 자체는 `@steipete`(창시자)만 수정할 수 있다. 게이트키퍼를 보호하는 게이트키퍼다.
180+
181+
### AI 에이전트용 스킬 게이트
182+
183+
릴리스와 PR 관리를 위한 AI 에이전트 스킬에도 게이트가 있다.
184+
185+
[`$openclaw-pr-maintainer`](https://github.com/openclaw/openclaw/tree/main/.agents/skills/openclaw-pr-maintainer) 스킬은 버그 수정 PR에 대해 **증거 기준**을 강제한다. 이슈 텍스트나 AI의 추론만으로는 머지할 수 없다. 증상 증거, 검증된 근본 원인(파일/라인 수준), 관련 코드 경로 수정, 회귀 테스트가 필요하다. 일괄 닫기/재오픈이 5건을 초과하면 반드시 사용자 확인을 받아야 한다.
186+
187+
[`$openclaw-release-maintainer`](https://github.com/openclaw/openclaw/tree/main/.agents/skills/openclaw-release-maintainer) 스킬은 버전 번호 변경과 npm publish 모두 **매 단계마다 운영자 승인**을 요구한다. 스킬이 자동화를 돕지만, 비가역적 행동은 여전히 인간이 최종 결정한다.
188+
189+
---
190+
191+
## 5계층이 만드는 방어 깊이
192+
193+
이 5계층을 하나의 그림으로 보면, 코드가 프로덕션에 도달하기까지 거치는 **방어 깊이(defense in depth)** 가 드러난다.
194+
195+
```
196+
[개발자/에이전트]
197+
198+
1계층: 프리커밋 ─── 포맷/린트 자동수정, 타입/경계 위반 차단
199+
200+
2계층: pnpm check ─ 10+ 체크 체이닝, 15+ 아키텍처 경계 가드
201+
202+
3계층: CI ────────── 15개 병렬 잡, 크로스 플랫폼, 보안 스캔
203+
204+
4계층: PR 자동화 ── 라벨 분류, 노이즈 필터, 증거 기반 템플릿, stale 정리
205+
206+
5계층: 릴리스 ───── 수동 트리거, 환경 승인, CODEOWNERS, 19단계 검증
207+
208+
[프로덕션]
209+
```
210+
211+
각 계층은 독립적이다. 프리커밋이 실패해도 CI가 잡고, CI를 우회해도 PR 리뷰가 걸리고, PR이 통과해도 릴리스 게이트가 막는다. 하나의 계층이 뚫려도 다음 계층이 방어한다.
212+
213+
---
214+
215+
## 설계 원칙 7가지
216+
217+
OpenClaw의 게이트키핑에서 추출한 설계 원칙을 정리한다.
218+
219+
### 1. 자동 수정과 차단을 분리하라
220+
221+
포맷/린트 오류는 자동 수정, 타입/경계 위반은 하드 차단. 에이전트의 플로를 불필요하게 끊지 않으면서도 구조적 결함은 통과시키지 않는다.
222+
223+
### 2. 스마트 라우팅으로 속도를 유지하라
224+
225+
모든 변경에 모든 테스트를 돌리지 않는다. 변경 스코프를 감지해 관련 잡만 실행한다. 빠른 피드백과 철저한 검증은 양립할 수 있다.
226+
227+
### 3. 규칙 문서와 자동 검증을 겹쳐라
228+
229+
AGENTS.md에 "하지 마라"고 쓰고, CI에서 실제로 위반을 감지한다. 소프트 가드레일과 하드 가드레일의 이중 장벽이 방어 깊이를 만든다.
230+
231+
### 4. PR에 증거를 구조적으로 요구하라
232+
233+
"무엇을 했는가"뿐 아니라 "무엇을 하지 않았는가", "어떤 증거가 있는가", "보안 영향이 있는가"를 구조적으로 물어라. 리뷰어가 판단해야 할 정보를 작성자가 미리 제공하게 만든다.
234+
235+
### 5. 커뮤니티 노이즈를 자동으로 필터링하라
236+
237+
인당 PR 10개 상한, stale 자동 닫기, 라벨 기반 자동 닫기/안내, 메인테이너 핑 스팸 감지. 메인테이너의 어텐션은 유한한 자원이다. 자동 트리아지가 그 자원을 보호한다.
238+
239+
### 6. 비가역적 행동 앞에서는 멈춰라
240+
241+
CI는 완전 자동이지만 릴리스는 수동 트리거 + 환경 승인. AI 에이전트 스킬도 버전 변경과 퍼블리시는 매 단계 승인. "빠르게 움직이되, 되돌릴 수 없는 행동 앞에서는 멈춘다."
242+
243+
### 7. 게이트키퍼를 보호하는 게이트키퍼를 두라
244+
245+
CODEOWNERS 파일은 창시자만 수정할 수 있다. 릴리스 워크플로는 릴리스 매니저 팀만 수정할 수 있다. 보안 코드는 secops 팀의 승인 없이 머지할 수 없다. 게이트키핑 시스템 자체를 보호하는 메타 계층이 있다.
246+
247+
---
248+
249+
## 당신의 프로젝트에 적용하려면
250+
251+
OpenClaw의 5계층 전체를 한 번에 도입할 필요는 없다. 난이도 순으로 정리하면:
252+
253+
| 단계 | 도입 항목 | 효과 |
254+
|------|---------|------|
255+
| **즉시** | pre-commit 훅 (lint+format 자동 수정) | 사소한 오류로 CI가 실패하는 낭비 제거 |
256+
| **즉시** | PR 템플릿에 증거/보안 섹션 추가 | 리뷰 품질 즉시 향상 |
257+
| **1주** | CI에 타입 체크 + 테스트 게이트 | 기본 품질 바닥선 확보 |
258+
| **1주** | CODEOWNERS로 보안 민감 파일 보호 | 보안 표면 하드 잠금 |
259+
| **2주** | stale 봇 + 자동 라벨링 | PR 큐 관리 자동화 |
260+
| **1개월** | 커스텀 아키텍처 경계 가드 스크립트 | 아키텍처 부식 방지 |
261+
| **1개월** | 스마트 라우팅 (변경 스코프 기반 CI 잡 선택) | CI 속도 최적화 |
262+
| **분기** | 릴리스 환경 승인 + 다단계 검증 | 릴리스 안전성 확보 |
263+
264+
가장 ROI가 높은 것은 **pre-commit 훅****PR 템플릿**이다. 둘 다 하루 안에 도입할 수 있고, 즉시 효과가 나타난다. 나머지는 프로젝트의 규모와 위험도에 맞춰 점진적으로 추가하면 된다.
265+
266+
바이브 코딩 시대의 품질 관리는 "AI가 나쁜 코드를 만들지 않게 하는 것"이 아니다. AI는 때로 나쁜 코드를 만든다. 사람도 마찬가지다. 핵심은 나쁜 코드가 **프로덕션에 도달하지 못하게 하는 것**이다. OpenClaw의 5계층 게이트키핑은 그 방법을 보여준다.
267+
268+
---
269+
270+
[^1]: [OpenClaw: 세계 최대 바이브 코딩 프로젝트에서 배우는 9가지 모범 사례](/posts/openclaw-vibe-coding-best-practices/)
271+
[^2]: [OpenClaw CONTRIBUTING.md](https://github.com/openclaw/openclaw/blob/main/CONTRIBUTING.md)

0 commit comments

Comments
 (0)