← 리포트 목록
needs_evidence 45건 사유 분포 기반 재발 방지안
2026-10-16
claude
[needs_evidence, completion-gate, guardian, prevention, task-body-template]
needs_evidence 45건 사유 분포 기반 재발 방지안
조회 2026-10-16 16:50 KST, 읽기 전용. 코드·DB·크론·정책 문서는 수정하지 않았다.
0. 먼저 알아둘 점 (요청서와 실측이 다른 부분)
- guardian #41813의
result_note는 분류표 경로가 잘려 있다(601바이트, 파일 경로 문자열 없음). 15:00~16:00 사이 수정된 파일을 찾아/Users/ron/.hermes/workspace/memory/needs_evidence_breakdown_20261016.md가 분류표임을 확인하고 읽었다(4,116바이트, 15:39 생성, 본문 "합계 | 45 | 100%"). - 요청서가 예로 든
missing_source_log_path는 이번 45건에서 0건이다.execution_artifact_path_not_found는 1건(guardian,/Users/ron/.hermes/workspace/jobs.json)이다. 즉 "경로 계열"이 아니라 "검증 값 계열"이 압도적이다. - 같은 방지안을 이미 3번 썼다:
memory/needs_evidence_34_proposal_20261012.md,memory/needs_evidence_top3_task_body_prevention_20261013.md,memory/2026-10-15_needs_evidence_41_prevention_plan.md. 건수는 34 → 41 → 45로 계속 늘었다. 이 문서는 새 분석을 되풀이하지 않고, 아직 적용되지 않은 항목을 정리한다.
1. [현황]
1-1. 상위 3개 사유 (guardian 분류표 기준, 한 건에 1개 배정)
| 순위 | 사유 | 건수 | 비율 |
|---|---|---|---|
| 1 | missing_verification_value 계열 | 34 | 75.6% |
| 2 | 라벨 없는 "결과 확인 보류"만 있는 건 | 8 | 17.8% |
| 3 | missing_execution_value 계열 | 2 | 4.4% |
| (참고) | execution_artifact_path_not_found 1, missing_source 0, llm_infra_failure 0 | 1 | 2.2% |
1-2. 1순위 34건 세부 (result_note "차단 사유" 라벨을 직접 다시 집계, 합 34)
| 세부 라벨 | 건수 |
|---|---|
| missing_verification_exit_code | 9 |
| invalid_verification_exit_code | 7 |
| 검증 근거 없음 (+결과 확인 보류 등) | 7 |
| missing_result_or_verification | 8 |
| completion_result_note_forces_rework 동반 | 2 |
| verification_command_unverifiable | 1 |
| exit code 계열(위 두 줄)만 16건, 47%다. 나머지는 "검증 줄 자체가 없거나 비어 있음"이다. |
1-3. 에이전트별 상위 사유
| 에이전트 | 건수 | 1위 | 2위 | 3위 |
|---|---|---|---|---|
| guardian | 30 (66.7%) | missing_verification_exit_code 9 | 보류 문구만 5 / invalid_verification_exit_code 5 / 검증 근거 없음 계열 5 (동수) | execution 계열 2, artifact_not_found 1 |
| cowork | 6 (13.3%) | 보류 문구만 3 | verification_command_unverifiable 1 / invalid exit code 1 / forces_rework 동반 1 | - |
| analyst-macro | 4 (8.9%) | missing_result_or_verification 4 | - | - |
| analyst-pm | 4 (8.9%) | missing_result_or_verification 4 | - | - |
| ron | 1 (2.2%) | invalid_verification_exit_code 1 | - | - |
1-4. 구조적 사실
- 제목에 needs_evidence/반려가 든 "반려 분류·방지안" 메타 과제가 31건(guardian 25, cowork 6) = 45건의 68.9%. 반려를 분류하는 과제가 다시 반려되는 순환이다.
- 인프라 지연(llm_infra_failure) 실증 0건. 45건 전부 형식·게이트 판정 문제다.
- 크레딧(IG/HY OAS) 반려 8건(analyst-macro 4, analyst-pm 4)은 전부 missing_result_or_verification. 10-15 문서가 "현재 디스크 코드로 재판정하면 통과"까지 확인했고, 당시 어느 규칙이 막았는지는 미확인이다. 이번에 다시 시험하지 않았다.
2. 사유별 원인: 어느 태스크 유형에서 4블록 중 무엇이 빠지나, 문서 대조
사유 A. 검증 값 계열 34건 (exit code 16건 + 검증 줄 부재 18건)
- 빠지는 블록:
검증:줄. 라벨은 있으나 "→ 결과, exit code 0" 형태의 숫자 리터럴이 없다. 태스크 유형은 guardian의 점검·집계형과 cowork 정책 검토형이다. - 대조 1 (정책 문서):
config/agent_completion_submission_standard.md187행 "결과값에는 게이트가 읽는 리터럴exit code 0을 그대로 쓴다"는 규칙이 있으나 §3-1-1(130행~)에 묻혀 있다. 같은 문서 §3-1 짧은 운영 문구 126행은 "<실제 결과값/건수/exit code>"라고만 써서 exit code가 선택처럼 읽힌다. AGENTS.md 대행 정책 절(64행~)의 4블록 틀에는검증:예시가pytest → 3 passed,health_check.py → exit 0처럼 두 가지 표기가 섞여 있고 "조사 없이exit code 0숫자"라는 문구가 없다. - 대조 2 (태스크 body 템플릿, 가장 큰 원인):
scripts/orchestrator.py1104, 1131, 1137, 1795행이 body에 "검증 문장 끝에 반드시 'exit code 0' 또는 '통과'를 적는다"를 자동으로 붙인다(방금 grep -n으로 4행 모두 재확인). '통과'만 써도 되는 것처럼 읽히지만 게이트는 숫자를 요구한다. 10-15 문서는 28/41건 body에 이 문구가 있다고 집계했다. - 이번 태스크 body 자체도 같은 결함이 있다: "검증에는 ls -l과 결과"만 요구하고 exit code 숫자는 요구하지 않는다.
사유 B. 보류 문구만 있는 8건 (guardian 5, cowork 3)
- 빠지는 블록: 4블록이 아니라 "결론" 해석. 전부 "needs_evidence N건 분류" 메타 과제로, 보고서 표와 결론 줄에 게이트 차단 구절("결과 확인 보류", "검증 근거 없음", "결과물과 검증 근거가 없음")을 그대로 인용해 게이트가 실제 결함으로 읽는다(자기참조).
- 대조: 정책 문서 어디에도 "차단 구절은 표 안에서만, 결론·검증 줄에는 풀어 쓴다"는 규칙이 없다.
agent_completion_submission_standard.md3-1(119행)은 "'결과 확인 보류'를 결과로 제출하지 않는다"고만 한다. 인용 문제는 미커버. - 이 8건은 완료 보고 규율로 막기 어렵다. 게이트 쪽 보강(아래 코드 후보 3)이 필요하다.
사유 C. missing_execution_value 2건 + artifact_not_found 1건 (전부 guardian)
- 빠지는 블록:
근거파일:과검증:의 명령. 3건 모두 missing_verification_command, missing_verification_exit_code 동반. 점검 대상이 실존하지 않는 경로(/Users/ron/.hermes/workspace/jobs.json)를 인용했다. - 대조: 같은 문서 §9-9 경로표(983행~)와 §8-1 "위반 사례 지목 전 선행 확인"(330행~)이 이미 있다. 건수가 3건이라 신규 규칙은 불필요하다. body 템플릿에
jobs.json의 실제 위치(/Users/ron/.hermes/cron/jobs.json)를 경로표에 한 줄 넣는 정도로 충분하다.
3. [권고]
1순위 (코드 없이, 오늘 적용 가능): 문서·템플릿 문구 3곳 수정
config/agent_completion_submission_standard.md§3-1 126행의 검증 줄을 "검증: <명령> → <결과값>, exit code 0형태로 쓰고, 조사 없이 숫자 0을 붙인다. '통과'만으로는 대체되지 않는다"로 교체한다. 같은 내용을 §0 TL;DR(7행~)의 30초 체크에 한 줄 추가한다. 대상 사유 A 16건 중 exit code 계열.- AGENTS.md "대행 태스크 완료보고 검증 근거 정책" 절(64행~)의 4블록 예시
검증:줄을→ N행 반환, exit code 0한 가지로 통일한다. - 같은 문서 §9-3-1 guardian 템플릿(570행~)에 "집계·분류형 과제는 표에서만 차단 구절을 인용하고 결론·검증 줄에는 '인프라 지연 계열 0건'처럼 풀어 쓴다"를 추가한다. 대상 사유 B. 기대효과: 신규 exit code 누락 반려 일 3~5건 → 0~1건(10-15 문서의 12건 계열 추정과 같은 방향, 이번에 재측정하지 않은 추정치).
2순위: 반려 분류 과제 자체의 발행 중단 (메타 순환 31건, 68.9%)
- 분류 정본을
memory/needs_evidence_breakdown_20261016.md하나로 두고, 건수가 바뀌면 SELECT 한 줄로 갱신한다. 새 분류·방지안 과제를 만들지 않는다. 지금 이 문서가 같은 주제의 4번째 방지안이다. - 기대효과: 신규 needs_evidence 중 메타 과제 비율 69% → 0%, memory의 needs_evidence 파일 35개 증가 중단.
3순위: 크레딧 8건 처리
- 분석 내용은 이미 있고 게이트 판정 문제로 보인다(10-15 문서). 같은 분석을 다시 시키지 않는다. 서버 재시작(해리 승인 필요) 후 #41067 1건 재제출로 확인한다. 이번에 시험하지 못했다(미확인).
4. codex 위임 후보 (코드 수정, 이 문서에서는 수정하지 않음)
- 대상:
scripts/orchestrator.py1104, 1131, 1137, 1795행 (body 자동 보강 상용구) 및scripts/shared/agent_task_quality.py의verification_bits,default_verification. 내용: "'exit code 0' 또는 '통과'" → "→ 결과값, exit code 0(조사 없이 숫자)". 1104행verification_tail_required상수와verification_tail_present판별식도 함께 바꿔야 기존 body가 재보강된다. 테스트scripts/tests/test_orchestrator_task_quality.py의 "exit code 0; 통과" 기대값도 동반 수정. - 대상:
scripts/agent_queue_worker.py의_RETRY_ITEM_BY_GAP(4172행 부근)missing_verification_exit_code항목. 내용: 재시도 안내문에 "→ 합계 N, exit code 0예시"를 넣어 같은 실수 반복 방지. - 대상:
scripts/agent_queue_worker.py의_completion_hard_block_phrase_reasons와scripts/shared/public_result_formatter.py의 같은 역할 함수. 내용: 표·백틱·따옴표 안의 인용 구절은 제외, 결론·검증 줄에 직접 쓴 구절만 차단. 반대 테스트(진짜 빈 보고는 계속 차단) 필수. - 대상:
scripts/orchestrator.py의create_task(). 내용: 제목에 needs_evidence/반려 분류가 든 과제를 24시간 안에 중복 발행하지 않고 정본 경로를 안내.
5. [리스크]
- 게이트가
public_result_formatter.py,agent_queue_worker.py,server.py3곳에 있어 문서만 고쳐도 body 상용구(orchestrator.py 4곳)가 "또는 통과"를 계속 복제하면 효과가 없다. 1순위와 코드 후보 1을 같이 진행해야 한다. - 이번 분류표는 라벨 우선순위 규칙으로 한 건에 1개만 배정한 값이다. 라벨이 겹치는 건이 있어 1-2의 세부 집계와 합이 같지만 다른 기준으로 세면 비율이 달라진다.
- 분류표의 failed 7건은 이 문서 범위 밖이다.
6. [검증방법]
- 지표: 적용 후 24시간 신규 needs_evidence 건수, exit code 계열 라벨 신규 건수, 제목에 needs_evidence가 든 신규 과제 수.
- 명령:
sqlite3 -readonly /Users/ron/.hermes/data/ops_multiagent.db "SELECT claimed_by,count(*) FROM bus_commands WHERE status='needs_evidence' AND updated_at>='<적용시각>' GROUP BY 1"기대값 0~2행. - 문서 반영 확인:
grep -n "조사 없이 숫자 0" /Users/ron/.hermes/workspace/config/agent_completion_submission_standard.md기대값 1건 이상. - 롤백 조건: 문구 교체 후 exit code가 없는 제출이 done으로 저장되는 사례가 1건이라도 나오면 되돌리고 게이트를 먼저 점검.