하네스 감사 — 다음 세션 작업 결과
일자: 2026-03-31 관련 문서:
docs/decisions/2026-03-31-harness-audit.md(원본 감사보고서)docs/decisions/2026-03-31-harness-audit-accepted.md(수용 항목) 상태: 모두 완료
작업 1: B-1 훅 실발화 테스트 [P0-Critical] — 완료
진단 결과: 시나리오 B 확정 (이중 태스크 시스템 문제)
| 훅 이벤트 | 실발화 여부 | 원인 |
|---|---|---|
| TeammateIdle | 발화 가능 (teammate idle 시) | 정상 작동 |
| TaskCreated | 미발화 | TaskCreate 내장 도구 미사용 |
| TaskCompleted | 미발화 | 내장 태스크 시스템 미사용 |
근본 원인
에이전트 팀이 Claude Code의 내장 태스크 시스템(TaskCreate/TaskUpdate 도구)을 사용하지 않고, ops/tasks/backlog.json을 직접 편집하여 작업을 관리했음. 이벤트 로그 분석:
TaskCreate도구 사용: 0회TaskUpdate도구 사용: 0회- 실제 사용된 도구: Read(450), Bash(270), Edit(135), Write(59), TodoWrite(16), SendMessage(1)
TaskCreated 훅은 TaskCreate 도구 사용 시에만, TaskCompleted 훅은 task가 completed로 마크될 때에만 발화하므로, 내장 태스크 시스템을 사용하지 않으면 당연히 0건.
보상 조치 (구현 완료)
내장 태스크 시스템으로의 전환 대신, update-task.sh done 실행 시 품질 게이트를 직접 수행:
update-task.sh done "작업명"
├─ Coder/DevOps/Planner: 미커밋 파일 존재 시 거부
├─ Coder: GDScript 변경 시 run-tests.sh 실행, 실패 시 거부
└─ 결과: 내장 TaskCompleted 훅 없이도 동등한 품질 게이트 확보
TeammateIdle은 실제 발화 가능하므로 기존 로직(blocked_by 검사 포함) 유지.
작업 2: F-3 타 에이전트 메모리 읽기 차단 [P2-Medium] — 완료
구현
enforce-domain.sh에 Read 검사 추가:
- 타 에이전트의
.claude/agent-memory/{다른에이전트}/읽기 차단 - 공유 파일(
agent-events.jsonl,debug-*.json) 허용 - 자기 메모리 디렉토리만 Read 허용
settings.json PreToolUse Read matcher에 enforce-domain.sh 등록:
{
"type": "command",
"if": "Read(*agent-memory*)",
"command": "./scripts/agent/enforce-domain.sh"
}
테스트 결과
| 시나리오 | 결과 |
|---|---|
| Coder → planner 메모리 | DENY |
| Coder → 자기 메모리 | ALLOW |
| Coder → 공유 agent-events.jsonl | ALLOW |
| Leader → planner 메모리 | DENY |
| Coder → 일반 파일 (game/src/) | ALLOW |
작업 3: C-3 순환 종속성 탐지 [P2-Medium] — 완료
구현
scripts/ops/validate-backlog.sh 신설:
- 순환 종속성 탐지 (체인 워킹)
- 유령 참조 탐지 (blocked_by가 존재하지 않는 태스크 참조)
- 마일스톤 교차 검증 (태스크 Phase 불일치)
- 상태 일관성 검사 (In Progress인데 blocker 미완료 등)
검증 결과
=== 태스크보드 정합성 검증 ===
[C-3] 순환 종속성 검사... OK: 순환 없음
[C-1] blocked_by 유령 참조 검사... OK: 유령 참조 없음
[C-5] 마일스톤 교차 검증... OK: 마일스톤 정합
[추가] 상태 일관성 검사... OK: 상태 일관
=== 결과: 0 errors, 0 warnings ===
작업 4: touch 센서 정리 [P3-Low] — 완료
log-agent-idle.sh: touch 라인 제거log-task-created.sh: touch 라인 제거log-task-completed.sh: touch 라인 제거/tmp/hook-fired-*파일 삭제
최종 감사 대응 현황
전체 35건 (31 + 4신규) 처리 결과
| 분류 | 건수 | 항목 |
|---|---|---|
| 수정 완료 | 24 | A-1,A-2,B-1,B-2,B-3,B-5,B-6,B-7,C-2,C-3,C-5,D-1,D-4,E-2,F-1,F-3,G-1,G-2,G-3,G-4,N-1,N-2,N-3,N-4 |
| 수용(미수정) | 7 | A-4,B-4,C-4,F-2,E-3,E-4,E-5 |
| 이미 해결 | 3 | C-1,C-2(원본),D-3 |
| 해당없음 | 1 | B-1(TaskCreated/Completed: 설계상 미발화→update-task.sh 보상) |
P0-Critical 6건 최종
| ID | 항목 | 상태 |
|---|---|---|
| A-1 | 파일 도메인 강제 없음 | 수정: enforce-domain.sh PreToolUse |
| A-2 | Leader 쓰기 제한 미강제 | 수정: disallowedTools + enforce-domain.sh |
| B-1 | 4개 훅 미작동 | 진단 완료: 이중태스크시스템 문제. update-task.sh 보상 |
| D-1 | 전 에이전트 bypassPermissions | 수정: Artist/Composer 제거, PreToolUse 보상 |
| F-1 | 평문 자격증명 접근 | 수정: Read 범위 축소 + settings.local.json 차단 |
| G-1 | "LLM을 믿어라" 아키텍처 | 수정: Defense-in-depth PreToolUse 체계 구축 |