Risk Scanner & 리스크 점수
근거: 요구사항서 8.5(위험 경로 자동 스캐너), 8.12(프로젝트 리스크 점수). 스캐너의 패턴, 결정적 점수 함수, 추천 워크플로를 확정한다.
1. 스캐너 동작
프로젝트 열기 시 파일 트리를 스캔해 민감/허용 후보를 분류하고, 탐색기에 Recommended Deny / Recommended Allow 배지로 표시한다(요구사항서 8.2 상태 8종).
- 스캔은 lazy 트리와 별개로 백그라운드에서 수행하고 event로 결과를 흘린다.
- 제외 폴더(
node_modules,.git,.venv,dist,build)는 스캔에서 건너뛴다(요구사항서 9.2). - 결과는
known_sensitive_paths에 저장, 사용자는 일괄 적용 또는 개별 무시(dismiss) 가능. - 추천 적용 전 Diff 제공(요구사항서 8.5 수용 기준).
2. Deny 추천 패턴 (요구사항서 8.5)
.env .env.*
*.pem *.key *.p12 *.pfx
id_rsa id_ed25519
secrets/ secret/ credentials/ credential/ keys/
certs/ certificates/
raw/ data/ dataset/ datasets/
exports/ export/ backup/ backups/ dump/ dumps/
logs/ private/ confidential/ personal/
3. Allow 추천 패턴 (요구사항서 8.5)
src/ source/ tests/ test/ docs/ doc/
README.md CLAUDE.md AGENTS.md
package.json pyproject.toml Cargo.toml
패턴은 대소문자 무시, 디렉터리 패턴(
raw/)은 폴더에만, 확장자 패턴(*.pem)은 파일에만 매칭. 패턴 목록은app-config.json또는 코드 상수로 관리하고, Custom 프로필에서 사용자 편집 가능(후속).
4. 리스크 점수 (결정적 함수)
요구사항서 8.12 표를 순수 함수로 확정한다. 각 조건은 프로젝트당 한 번만 가산.
score = 0
if exists(".env" 계열) score += 20
if exists("secrets/") score += 30
if exists("raw/") score += 20
if exists("data/") score += 15
if exists(인증서/키: *.pem|*.key|*.p12|*.pfx|id_rsa|id_ed25519) score += 30
if (src/ 존재 AND 위 민감 항목 ≥1 존재) score += 20 # 민감 데이터 혼재
if not exists(".claude/settings.local.json") score += 5
if (모든 경로가 Allow 상태 == 사실상 무제한) score += 50
if exists(hooks 설정: 임의 셸 실행) score += 15
if exists(MCP 서버 설정: 권한 모델 밖 동작) score += 10
score = min(score, 100) # 표시상 상한
등급 (요구사항서 8.12)
| 점수 | 등급 |
|---|---|
| 0–20 | Low |
| 21–60 | Medium |
| 61+ | High |
"모든 경로 Allow(+50)"는 현재 유효 정책이 사실상 무제한일 때만 가산한다 (예: deny/ask가 비어 있으며 루트 allow가 있는 경우). 이 항목은 열람 시점의 effective policy(effective-policy.md)에서 판정한다.
5. 추천 워크플로 (요구사항서 시나리오 1·2)
- 프로젝트 열기 → 스캐너가 Deny/Allow 후보 표시 + 리스크 점수 계산.
- 사용자가 프로필 선택(예: Conservative) → 추천이 프로필 규칙과 결합.
- "추천 일괄 적용" 또는 개별 선택 → 중립 모델 규칙 생성.
- Effective Preview로 결과 확인 → 저장 전 Diff → 백업 후 저장.
- 재열기 시(시나리오 2) 이전 기록과 비교해 새로 생긴 민감 폴더(예:
exports/)를 신규 Deny 추천.
6. 점수 예시 (요구사항서 8.11 pixel-tools)
raw/, data/, secrets/, .env, exports/ 존재 + src/ 혼재 가정:
.env(+20) + secrets/(+30) + raw/(+20) + data/(+15) + 혼재(+20) = 105 → min 100 → High
요구사항서의 "Risk: High"와 일치.