본문으로 건너뛰기

하네스 감사 — 다음 세션 작업 결과

일자: 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.jsonlALLOW
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신규) 처리 결과

분류건수항목
수정 완료24A-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
수용(미수정)7A-4,B-4,C-4,F-2,E-3,E-4,E-5
이미 해결3C-1,C-2(원본),D-3
해당없음1B-1(TaskCreated/Completed: 설계상 미발화→update-task.sh 보상)

P0-Critical 6건 최종

ID항목상태
A-1파일 도메인 강제 없음수정: enforce-domain.sh PreToolUse
A-2Leader 쓰기 제한 미강제수정: disallowedTools + enforce-domain.sh
B-14개 훅 미작동진단 완료: 이중태스크시스템 문제. update-task.sh 보상
D-1전 에이전트 bypassPermissions수정: Artist/Composer 제거, PreToolUse 보상
F-1평문 자격증명 접근수정: Read 범위 축소 + settings.local.json 차단
G-1"LLM을 믿어라" 아키텍처수정: Defense-in-depth PreToolUse 체계 구축