Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
57 changes: 57 additions & 0 deletions .agents/skills/_shared/review-protocol.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
# Review Protocol

`/self-review`, `/security-review`가 공유하는 절차. 각 스킬은 분석 렌즈(무엇을 볼지)만
자기 파일에 두고, 대상 수집부터 보고까지의 절차는 이 문서를 따른다.

## 1. 변경 사항 수집

- 인자가 전달되면 (`/<skill> <base-branch>`) 해당 브랜치를 기준점으로 사용한다.
- 인자가 없으면: `git fetch`로 remote를 최신화하고(실패 시 경고 후 local ref로 진행)
`git rev-parse --abbrev-ref @{upstream}`로 tracking branch를 찾는다. 없으면
`git remote show origin | grep 'HEAD branch'`의 결과를 `origin/<branch>`로 쓴다.
둘 다 실패하면 사용자에게 base branch를 요청한다.
- `git log <base>..HEAD --oneline`으로 unpushed commit을 확인한다. 없으면
"리뷰 대상 없음"을 보고하고 즉시 종료한다.
- `git diff <base>..HEAD`로 전체 변경 범위를 파악한다.
- uncommitted 변경이 있으면 리뷰 범위에 포함할지 사용자에게 확인한다. 포함하면
`git diff`와 `git diff --staged`도 수집한다. 커밋할 때는 리뷰 수정분만 staging하여
사용자의 작업이 섞이지 않게 한다.
- 변경된 파일은 전체를 읽는다 — diff만 보면 주변 컨텍스트를 놓친다. 바이너리,
lockfile, 자동 생성물은 제외한다.

## 2. 평가 기준

발견 항목을 세 갈래로 분류한다. 각 갈래의 판단 경계는 스킬별 정의를 따른다.

- **즉시 반영** — 코드를 직접 수정한다.
- **사용자 판단 필요** — 수정하지 않고 보고만 한다.
- **무시** — 개별 내용은 보고하지 않고, 건수와 대표 사유만 보고에 포함한다.

## 3. 수정 적용

- 수정 후 프로젝트의 빌드와 테스트를 실행해 다른 것이 깨지지 않았는지 확인한다.
- 테스트가 실패하면 원인을 먼저 분류한다.
- 수정이 원인: 수정을 되돌리고 **사용자 판단 필요**로 재분류한다.
- 기존 flaky 또는 환경 문제: 수정을 유지하고 실패 원인을 보고한다.
- 확인이 끝나면 수정 사항을 commit한다.

## 4. 중단 기준

다음에 해당하면 push를 진행하지 않고 사용자에게 보고한다. 스킬별 추가 기준도 함께 적용한다.

- 수정 적용 후 빌드 또는 테스트가 실패하고 단순 수정으로 해결되지 않는 경우
- 동일한 지적이 수렴하지 않고 계속 발생하는 경우 (순환 판단)

## 5. 보고 형식

### 즉시 반영한 항목
(각 항목: 파일, 변경 내용, 발견 근거. 없으면 `없음`)

### 사용자 판단이 필요한 항목
(각 항목: 파일, 지적 내용, 판단을 미룬 이유. 없으면 `없음`)

### 무시한 항목
(건수와 대표 사유. 없으면 `없음`)

### 리뷰 요약
(1-2문장 평가)
File renamed without changes.
63 changes: 63 additions & 0 deletions .agents/skills/security-review/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
---
name: security-review
description: 구현 완료 후 보안 관점 심층 리뷰 — 즉시 반영 항목을 수정하고 결과를 보고한다. clean pass까지 반복이 필요하면 ralph를 통해 실행한다
user-invocable: true
---

# Security Review

구현 완료 후 변경 사항을 보안 관점에서 심층 분석하고, 타당한 보안 개선을 코드에 반영한다.
반복 실행이 필요하면 `/ralph /security-review`로 ralph에 위임한다.

대상 수집, 수정 적용, 중단, 보고 절차는 `.agents/skills/_shared/review-protocol.md`를
읽고 그대로 따른다. 이 문서는 무엇을 볼지만 정한다.

추가로 읽을 것: `.agents/rules/security.md` — 프로젝트가 이미 정한 보안 규칙.

## 분석 렌즈 (extended thinking)

`security.md`가 정한 규칙의 준수 여부를 변경된 코드에서 확인하고, 그 위에 다음을 본다.

### 입력 검증
- 시스템 경계(사용자 입력, 외부 API 응답, 파일, URL 파라미터, 헤더)의 검증 여부.
- SQL/Command Injection, XSS, Path Traversal 등 OWASP Top 10 노출 경로.
- 신뢰할 수 없는 입력의 역직렬화.

### 인증 및 권한
- 인증 로직의 우회 가능성.
- 권한 검사가 누락된 엔드포인트나 기능.
- 세션/토큰의 만료, 무효화, 저장 방식.
- 권한 상승 경로.

### 비밀 정보와 데이터 보호
- 키/비밀번호/토큰의 하드코딩.
- 민감 정보가 로그, 에러 메시지, 응답 본문, 커밋 히스토리에 노출되는지.
- PII·금융 정보의 암호화/마스킹, 전송 채널(TLS).

### 의존성
- 새 의존성의 알려진 CVE, 유지보수 상태, 보안 이력.
- 불필요하게 넓은 권한을 요구하는 의존성.

### 최소 권한
- 파일, 네트워크, API 접근이 필요한 최소 범위인지.
- root/admin 권한을 요구하는 구현.
- CORS, CSP 등 브라우저 보안 정책 설정.

### 에러 처리와 정보 노출
- 에러 응답의 내부 세부사항(스택 트레이스, DB 스키마, 내부 경로) 노출.
- 에러 처리가 보안 검사를 우회하는 경로를 만드는지.

## 분류 경계

- **즉시 반영**: 보안 취약점, 민감 정보 노출, 인증/권한 우회, 입력 검증 누락.
- **사용자 판단 필요**: 보안-편의성 트레이드오프, 위협 모델에 따라 달라지는 항목,
대규모 리팩토링이 필요한 보안 개선.
- **무시**: 현재 위협 모델에서 위험도가 낮은 항목, 범위 밖 개선 제안.

보고 시에는 공통 형식의 각 항목에 **취약점 유형**을 함께 적는다.

## 추가 중단 기준

- 보안 취약점(인증 우회, 권한 상승, 데이터 유출)이 즉시 반영으로 해결되지 않은 경우
- 민감 정보가 소스 코드나 커밋 히스토리에 포함된 경우
- 알려진 CVE가 있는 의존성이 추가된 경우
51 changes: 51 additions & 0 deletions .agents/skills/self-review/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
---
name: self-review
description: 구현 완료 후 thinking mode 심층 리뷰 — 즉시 반영 항목을 수정하고 결과를 보고한다. clean pass까지 반복이 필요하면 ralph를 통해 실행한다
user-invocable: true
---

# Self Review

구현 완료 후 thinking mode로 변경 사항을 심층 분석하고 타당한 개선을 코드에 반영한다.
반복 실행이 필요하면 `/ralph /self-review`로 ralph에 위임한다.

대상 수집, 수정 적용, 중단, 보고 절차는 `.agents/skills/_shared/review-protocol.md`를
읽고 그대로 따른다. 이 문서는 무엇을 볼지만 정한다.

추가로 읽을 것: 현재 작업의 scope 문서가 있으면 함께 읽어 범위를 확인한다.

## 분석 렌즈 (extended thinking)

### 정합성
- 호출하는 함수, 의존하는 타입, 참조하는 상수가 실제로 존재하고 올바른지.
- 새 인터페이스/타입과 기존 구현체 간 계약이 맞는지.
- import 경로, export 누락, 순환 참조.

### 로직
- 분기의 완전성 (switch/if-else).
- 에러 경로에서의 리소스 정리와 상태 롤백.
- 경계 조건 (null, empty, 0, max).
- 비동기 코드의 await 누락, 에러 전파 누락.

### 설계 정합성
- `docs/architecture.md`의 계층 책임과 일치하는지.
- `.agents/rules/`의 규칙을 위반하지 않는지.
- scope 문서가 있으면 그 범위 내인지.
- 모듈 간 의존 방향이 설계 의도와 맞는지.
- 문서 간 충돌은 Architecture > Rules > Scope 우선순위로 해소한다.

### 테스트 충분성
- 변경된 로직의 주요 경로와 에러 경로에 대응하는 테스트가 있는지.
- 테스트가 구현 세부사항이 아니라 계약/동작을 검증하는지.

## 분류 경계

- **즉시 반영**: 버그, 누락된 에러 처리, 계약 불일치, 명확한 설계 위반.
- **사용자 판단 필요**: 설계 트레이드오프, 의도적일 수 있는 선택, scope 경계 항목.
- **무시**: 이전 리뷰에서 이미 다뤄진 항목, 스타일 선호, 범위 밖 개선 제안.

## 추가 중단 기준

- 심각도 높은 버그(보안, 데이터 손실, 인증/권한 우회)가 즉시 반영으로 해결되지 않은 경우
- 동일 변경에서 버그가 2개 이상 발견되고 즉시 반영으로 해결되지 않은 경우
- 설계 원칙 위반이 발견된 경우
1 change: 1 addition & 0 deletions .claude/rules
1 change: 1 addition & 0 deletions .claude/skills
109 changes: 0 additions & 109 deletions .claude/skills/security-review/SKILL.md

This file was deleted.

Loading
Loading