virtual-insanity
← 리포트 목록

needs_evidence 반복 반려 원인 분류와 방지안

2026-10-05 claude [ops, completion-gate, needs_evidence, guardian]

needs_evidence 반복 반려 원인 분류와 방지안 (2026-10-05 00:47 KST 조회)

[권고]

1순위 (지시문): 반려 분류 태스크 지시문 템플릿에서 "검증:" 줄에 실행 명령을 같은 줄에 쓰게 못박는다. 지금 지시문과 자동 보강 문구는 "검증에는 합계 일치 결과와 exit code 0"만 쓰라고 해서 guardian이 명령을 근거 줄 아래 불릿으로 내려 적는다. 게이트는 같은 줄에 명령어 시작 토큰이 있어야 인정한다. 기대효과: 오늘 6건 중 verification_command_unverifiable 계열 3건(40839, 40843, 40845) 재발 0건. 2순위 (코드, codex 위임): 게이트 하드블록 정규식이 "반려 사유를 분석하는 보고서"를 오탐한다. 40843 보고서에서 "검증 근거 없음", "차단됨", "확인하지 못" 3개 문구가 걸려 forces_rework=True로 판정됐다. 기대효과: 반려 분석 태스크의 오탐 반려 1건 → 0건.

[현황]

조회 명령 (2026-10-05 00:46 KST): 해리 지정 SQL 그대로 → 6행. 상태 합계 10-04 이후 전체: done 4, failed 4, needs_evidence 2, claimed 1(이번 태스크 #40846). 태스크 문구의 "needs_evidence 9건"은 날짜 필터 없이 센 누적 건수(40842, 40825, 40691, 40633, 40518, 40408, 40346, 40297, 40276 = 9행)이고, 오늘 생성분은 2건이다. 이전 태스크 지시문의 "11건·12건" 전제도 DB 오늘분과 맞지 않는다(guardian이 #40843 보고에서 같은 지적을 함).

건별 분류 (원본 제출문은 DB에 게이트가 다시 쓴 노트만 남아 있어 40825·40839는 원문 미확인):

id 담당 상태 사유 라벨 4블록 미비 vs 인프라 원인 확정
40825 guardian needs_evidence missing_verification_value 계열(노트에 코드 없음, "결과 확인 보류" 템플릿) 4블록 미비 지시문+코드
40839 guardian failed verification_command_unverifiable 4블록 미비 지시문 (본문에 "ops_multiangent.db 가 아니라 ops_multiagent.db"라는 오타 정정문이 그대로 남음)
40841 guardian failed execution_artifact_path_not_found (/Users/ron/.hermes/workspace/errors.log) 4블록 미비 에이전트 규율 (ls 결과: No such file or directory. 실제 errors.log는 ~/.hermes/logs/ 아래에 있음)
40842 guardian needs_evidence missing_execution_artifact + missing_verification_command + missing_verification_exit_code (missing_execution_value 계열) 4블록 미비 에이전트 규율 (검증 명령을 DB 경로 없이 sqlite3 -readonly "SELECT ... FROM bus_co로 축약)
40843 guardian failed verification_command_unverifiable + 하드블록 문구 3종 4블록 미비 코드(오탐)+지시문
40845 guardian failed verification_command_unverifiable 4블록 미비 지시문+게이트 형식

집계: guardian 6건 전부. 라벨별: verification_command_unverifiable 계열 3~4건, execution_artifact_path_not_found 1, missing_execution_value 계열 1, missing_source 0, llm_infra_failure 0. 에이전트별로 ron/cowork/analyst는 오늘 반려 0건(ron 4건 done). 인프라 구분: result_note 6건에 llm_infra_failure 문구는 0건이다. 다만 guardian 로그(agent-queue-guardian.log 187320행 부근)에 RATE-LIMITED consecutive_failures 27, 대기 200~424초 기록이 있어 한도 압박은 존재한다. 이번 반려의 직접 원인은 아니다(40843, 40845 모두 본문 보고는 완성됨).

반복 건 원인 확정

verification_command_unverifiable (guardian 3건 이상 반복) → 지시문 문제가 1순위, 코드 문제가 2순위, 에이전트 규율은 40841·40842 두 건에 한정.

근거 실측: - 40845 보고를 로그(agent-queue-guardian.log 187345행)에서 꺼내 현재 게이트에 재투입: completion_required_evidence_gaps → ['verification_command_unverifiable']. 검증 줄 값이 "합계 9+1+1+1+0+0=12로 ... exit code 0입니다"로 명령 시작 토큰(sqlite3/python3/grep/ls 등)이 없다. - 같은 노트의 검증 줄을 "검증: sqlite3 -readonly /Users/ron/.hermes/data/ops_multiagent.db '...' → 12행"으로 바꿔 재투입하면 completion_verification_command_gap → None(통과). 즉 보고 내용이 아니라 명령의 위치와 형식이 사유다. - 40843 보고(187329행)는 completion_result_note_forces_rework=True. 하드블록 정규식 매치: '검증 근거 없음', '차단됨', '확인하지 못'. 반려 사유를 분석하는 태스크는 이 문구를 인용할 수밖에 없고, 표 셀 안의 문구는 strip_quoted_citations가 면제하지 않는다. - 지시문 쪽: #40843, #40845 본문이 "검증에는 건수 합계가 일치함과 exit code 0"만 요구하고, 자동 보강 문구(shared/agent_task_quality.py:1004 부근)는 "검증: 결과값(exit code 0 또는 통과)"만 안내한다. 명령을 검증 줄에 쓰라는 문장이 없다.

guardian 'placeholder 근거' 문구 생성 지점 (읽기 전용)

명령: grep -rn '근거 섹션 미기재' /Users/ron/.hermes/workspace/scripts → 운영 소스(.bak 제외) 매치: - scripts/shared/public_result_formatter.py:417 _EVIDENCE_PLACEHOLDER_TEXT = "근거 섹션 미기재 — 결론 참고." - scripts/shared/public_result_formatter.py:1183 "근거: 근거 섹션 미기재 — 결론 참고.", (_default_strict_public_brief, 1169행 정의) - scripts/shared/public_result_formatter.py:2227 evidence_source = "근거 섹션 미기재 — 결론 참고." (format_harry_public_brief 안, 근거를 못 뽑았을 때 기본값), 2238·2258은 같은 기본값 - scripts/agent_queue_worker.py:457, 4000 (금지 문구 감지 정규식), 4128 (재시도 항목 매핑) - scripts/orchestrator.py:810 (헬스체크 지시문이 이 문구를 근거로 인정하지 않는다고 명시) 오늘 10-04 이후 result_note 중 이 문구가 들어간 행: 0건(sqlite3 LIKE 조회, 본문에만 지시문 인용으로 40840·40846 2건). 오늘 guardian 반려 노트는 이 placeholder가 아니라 agent_queue_worker.py:4158 결론: {prefix}결과 확인 보류 템플릿이다. 즉 해리 태스크가 말한 placeholder 문구는 오늘분 DB에서는 재현되지 않았고, 생성 지점은 위 public_result_formatter.py 3곳이다.

[리스크]

  • 단일 장애점: 완료 게이트 판정이 agent_queue_worker.py:322와 shared/public_result_formatter.py:2898·2909 두 곳에 중복 구현되어 한쪽만 고치면 대시보드 경로와 워커 경로가 다르게 판정한다.
  • 반려 분석 태스크는 구조적으로 자기 오탐을 만든다. 같은 지시문을 재발행하면 40825→40839→40843→40845로 4연속 같은 반려가 이미 확인됐다.
  • guardian 한도 압박(consecutive_failures 27)이 계속되면 재시도마다 200~424초가 소요돼 반려 루프 비용이 커진다.
  • 미확인: 40825·40839의 원본 제출문(DB에 게이트가 덮어쓴 노트만 남음).

[검증방법]

  • KPI: 같은 유형 태스크 재발행 2회에서 verification_command_unverifiable 0건, 하드블록 오탐 0건.
  • 명령: sqlite3 -readonly /Users/ron/.hermes/data/ops_multiagent.db "SELECT id,status,substr(result_note,1,80) FROM bus_commands WHERE claimed_by='guardian' AND id>40846 ORDER BY id"
  • 기대값: done, 노트에 "결과 확인 보류" 없음. 롤백 조건: 정상 완료 노트가 1건이라도 오탐 차단되면 정규식 변경을 되돌린다.

codex 위임 태스크 초안 (직접 수정 금지, 제안만)

태스크 A: scripts/shared/public_result_formatter.py 의 completion_result_note_forces_rework() 에서 _COMPLETION_HARD_BLOCK_RE 검사 전에, "반려·차단 사유를 분석하는 보고서"(건별 표/목록에 #ID와 sqlite3 조회 결과가 2개 이상)면 표·불릿 안의 인용 문구를 면제한다. 같은 로직을 scripts/agent_queue_worker.py 로컬 카피에도 동기화. 검증: python3 -m pytest scripts/tests/test_agent_queue_worker_codex_quality.py scripts/tests/test_completion_evidence_line_quote_gate.py -q → 전부 통과, 그리고 로그 187329행 노트를 재투입해 forces_rework=False 확인. 정상 반려 케이스(근거: 근거 섹션 미기재)는 계속 True여야 한다. 태스크 B: scripts/shared/agent_task_quality.py 1004행 부근 "검증:" 안내문을 "검증: 실행한 명령을 같은 줄에 쓰고(sqlite3/grep/python3/ls 등으로 시작) → 결과값 + exit code 0"으로 바꾼다. 코드 수정이므로 codex 전담. 검증: grep -n "같은 줄" scripts/shared/agent_task_quality.py → 1건 이상, pytest scripts/tests -k agent_task_quality -q 통과.