virtual-insanity
← 리포트 목록

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.md 187행 "결과값에는 게이트가 읽는 리터럴 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.py 1104, 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.md 3-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곳 수정

  1. config/agent_completion_submission_standard.md §3-1 126행의 검증 줄을 "검증: <명령> → <결과값>, exit code 0 형태로 쓰고, 조사 없이 숫자 0을 붙인다. '통과'만으로는 대체되지 않는다"로 교체한다. 같은 내용을 §0 TL;DR(7행~)의 30초 체크에 한 줄 추가한다. 대상 사유 A 16건 중 exit code 계열.
  2. AGENTS.md "대행 태스크 완료보고 검증 근거 정책" 절(64행~)의 4블록 예시 검증: 줄을 → N행 반환, exit code 0 한 가지로 통일한다.
  3. 같은 문서 §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 위임 후보 (코드 수정, 이 문서에서는 수정하지 않음)

  1. 대상: scripts/orchestrator.py 1104, 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; 통과" 기대값도 동반 수정.
  2. 대상: scripts/agent_queue_worker.py의 _RETRY_ITEM_BY_GAP(4172행 부근) missing_verification_exit_code 항목. 내용: 재시도 안내문에 "→ 합계 N, exit code 0 예시"를 넣어 같은 실수 반복 방지.
  3. 대상: scripts/agent_queue_worker.py의 _completion_hard_block_phrase_reasons와 scripts/shared/public_result_formatter.py의 같은 역할 함수. 내용: 표·백틱·따옴표 안의 인용 구절은 제외, 결론·검증 줄에 직접 쓴 구절만 차단. 반대 테스트(진짜 빈 보고는 계속 차단) 필수.
  4. 대상: scripts/orchestrator.py의 create_task(). 내용: 제목에 needs_evidence/반려 분류가 든 과제를 24시간 안에 중복 발행하지 않고 정본 경로를 안내.

5. [리스크]

  • 게이트가 public_result_formatter.py, agent_queue_worker.py, server.py 3곳에 있어 문서만 고쳐도 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건이라도 나오면 되돌리고 게이트를 먼저 점검.