virtual-insanity
← 리포트 목록

needs_evidence 21건·failed 5건 반려 상위 3개 라벨별 재발 방지안

2026-10-09 hermes [hermes, needs_evidence, completion-evidence-gate, cowork, 재발방지, 오케스트레이터]

[권고]

1순위 — missing_verification_exit_code (7건, guardian 전부): "검증:" 줄의 exit code 숫자를 body가 명시하도록 오케스트레이터 body 마지막 문단을 고정한다. - 바꿀 문장(guardian 조회·집계형 body의 "완료 검증:" 문단 끝에 항상 붙인다): "검증: 줄은 '<실행한 sqlite3/grep 명령> → <반환 건수>, exit code 0' 형식으로 한 줄에 쓰고, 'exit code' 뒤 숫자를 생략하지 않는다." - 근거: 7건 중 4건(#40276 #40854 #40902 #40994)은 body 본문에 "exit code" 문구 자체가 없었다(규칙 부재가 아니라 body 누락). 나머지 3건(#40346 #40633 #40842)은 body가 요구했는데도 숫자가 빠졌다. - 기대효과: body 누락분 4건(전체 26건의 15.4%)을 body 수정만으로 제거. 나머지 3건은 2순위 체크리스트로 줄인다.

2순위 — missing_result_or_verification (7건, analyst-pm 4 · analyst-macro 2 · cowork 1): 분석 판단형 body에서 "도메인 서술"과 "4블록"이 충돌하지 않게 한 문장으로 정리한다. - 바꿀 문장: "result_note 첫 줄은 반드시 '결론:'으로 시작하고, 포지션·확신도·트리거는 모두 결론 줄 안에 쓴다. '근거:' 줄에는 읽은 JSON 경로와 기준일을, '근거파일:' 줄에는 경로:줄번호 \"원문 1줄\"을 쓰며, 산출물(저장한 md/파일) 경로를 근거파일에 반드시 포함한다." - 근거: 7건 중 6건은 body가 이미 "문장 끝에 exit code 0 또는 통과"를 요구했는데도 반려됐다. 즉 규칙 부재가 아니라 준수 실패다. 제출문은 "결론:" 뒤 자유서술이거나 결론·근거만 있는 형태였다(원본 요약 앞부분 기준, 뒷부분은 DB에서 잘려 미확인). - 기대효과: analyst-pm 4건 + analyst-macro 2건(23.1%)의 같은 라벨 재발 0건 목표.

3순위 — "결과 확인 보류"(코드 없는 문구, 4건, guardian 전부 #40825 #41101 #41151 #41233): 게이트가 구체 코드를 안 남기고 일반 문구로 덮는 경로. 같은 guardian 분류 태스크가 반복 발행되는 것이 구조 원인이다. - 바꿀 문장(오케스트레이터 태스크 생성 규칙): "동일 주제(needs_evidence 분류·집계)의 태스크는 3일 안에 재발행하지 않는다. 먼저 /Users/ron/knowledge-agent/400-reports/ 에 같은 주제 파일이 있는지 ls로 확인하고, 있으면 'N건 갱신, 변경분만 1표'로 body를 짧게 쓴다." - 근거: 400-reports에 needs_evidence 계열 파일이 이미 10개 있다(이 문서 저장 전 ls | grep -c needs_evidence → 10, 조회 2026-10-09 12:29 KST). 4건 모두 body에 exit code 문구가 있었으므로 body 문제가 아니다. - 기대효과: guardian 분류형 태스크 발행 자체를 줄여 이 유형 반려 최대 4건(15.4%) 제거.

참고(차순위): verification_command_unverifiable 3건(cowork #40691, analyst-macro #41241 #41246 — 후자 2건은 failed). "검증:" 값 안에 워크스페이스 경로 토큰이 없으면 발생한다.

[현황]

조회 2026-10-09 12:2x KST, sqlite3 -readonly /Users/ron/.hermes/data/ops_multiagent.db bus_commands status IN ('needs_evidence','failed') → 26행(needs_evidence 21, failed 5). guardian이 이미 만든 분류 md(/Users/ron/knowledge-agent/400-reports/261009_hermes_needs_evidence_classification.md, 태스크 #41245 결과)는 범위가 달라 라벨 집계를 이 문서에서 result_note의 "차단 사유:/누락·차단:" 필드로 다시 계산했다.

에이전트별(26행): guardian 13(needs_evidence 12 + failed 1), analyst-macro 4(needs_evidence 2 + failed 2), analyst-pm 4, cowork 3(needs_evidence 2 + failed 1), ron 2(needs_evidence 1 + failed 1) = 26.

라벨별 건수(한 건에 라벨이 여러 개일 수 있음, result_note 필드 파싱): | 순위 | 라벨 | 건수 | 에이전트 | 실제 CMD | |---|---|---|---|---| | 1 | missing_verification_exit_code | 7 | guardian 7 | #40276 #40346 #40633 #40842 #40854 #40902 #40994 | | 1 | missing_result_or_verification | 7 | analyst-pm 4, analyst-macro 2, cowork 1 | #40408 #40518 #40874 #40954 #40960 #41035 #41067 | | 3 | 결과 확인 보류(코드 없음) | 4 | guardian 4 | #40825 #41101 #41151 #41233 | | 4 | verification_command_unverifiable | 3 | cowork 1, analyst-macro 2(failed) | #40691 #41241 #41246 | | 5 | invalid_verification_exit_code | 2 | ron 1, guardian 1 | #40297 #40869 | | 기타 1건씩 | execution_artifact_path_not_found(#41241), missing_next_action_section(ron #41247), completion_result_note_forces_rework(#40954), missing_source·llm_infra_failure 문구(#41243) 등 | | | |

실패 5건(failed): #41241 analyst-macro, #41243 guardian, #41246 analyst-macro, #41247 ron, #41250 cowork. #41250은 이 방지안과 같은 주제의 선행 태스크였고 "확인 보류, 확인·검증 미완료"로 반려됐다.

라벨별 근거 (태스크 유형 · 규칙 부재 vs 준수 실패)

1) missing_verification_exit_code (guardian 7건)

  • 발생 유형: guardian의 DB 조회·집계·원인분류 태스크. 예) #40854 "needs_evidence 9건·failed 3건 반려 사유 분류", #40902 "needs_evidence 12건 반려 사유·에이전트별 분포 집계", #40994 "지식사랑방 인사이트 생성(#40990) 원인 분류 재수행", #40276 "agent_queue_worker.py 모델 타임아웃 패치 반영 확인".
  • 게이트 위치: scripts/agent_queue_worker.py:7150 return False, "missing_verification_exit_code" 및 scripts/server.py:823 gaps.append("missing_verification_exit_code"). 판정 정규식은 exit code|exit_code|return code|returncode|rc 뒤에 숫자가 있어야 한다(scripts/agent_queue_worker.py:7031, scripts/server.py:734). "통과"만 쓰면 server.py 쪽 보조 정규식(검증 결과/pytest + 통과)이 아니면 인정되지 않는다.
  • 기존 규칙과 대조: 규칙은 있다. config/agent_completion_submission_standard.md:126 검증: <실행한 검증 명령 또는 계산> → <실제 결과값/건수/exit code>를 쓴다., 같은 문서 :194 "일치 파일 0개, exit code 0"처럼 숫자로 적는다., :640 검증:" 값 안에 exit code 0 리터럴이 있는지까지 확인하고(analyst-fundamental·codex 한정 서술). 따라서 규칙 부재는 아니다.
  • 판정: 4건(#40276 #40854 #40902 #40994)은 body에 exit code 문구가 없어서 지시문 누락(오케스트레이터 body 템플릿의 부재), 3건(#40346 #40633 #40842)은 body 요구가 있었는데 숫자가 빠진 준수 실패다. 단 submission_standard의 exit code 리터럴 "필수" 조항(:640~:653)은 analyst-fundamental 전용이고 guardian용 필수 조항은 없다. 이 부분은 문서 쪽 공백이다.
  • 한계: DB의 result_note는 게이트가 재작성한 360~440자 문구라 원래 제출문 전체는 없다. 숫자를 아예 안 썼는지 정규식에 안 맞는 표기를 썼는지는 구분하지 못했다(미확인).

2) missing_result_or_verification (analyst-pm 4 · analyst-macro 2 · cowork 1)

  • 발생 유형: 미국 IG·HY OAS 계산·종합판단(analyst-pm #40874 #40960 #41035 #41067, analyst-macro #40408 #40518), cowork 정책 제안서(#40954).
  • 게이트 위치: scripts/agent_queue_worker.py:4063 reasons.append("missing_result_or_verification")는 앞선 사유가 없을 때 _completion_report_has_result_and_verification() 실패로만 붙는 최후 라벨이다. 이 라벨은 구체 누락 항목을 알려주지 않는 포괄 사유다.
  • 기존 규칙과 대조: 규칙은 있다. config/agent_completion_submission_standard.md:723~732에 analyst-pm 4블록 예시(검증: sqlite3 ... → ... exit code 0, 근거파일: memory/analyst-pm/latest.json:3 ...)가 이미 있다. 6건의 body는 "문장 끝에 exit code 0 또는 통과"를 요구했다(#40960 body: 문장 끝에 exit code 0 또는 통과를 명시한다).
  • 판정: 준수 실패가 6건. 제출문이 "결론:" 뒤 포지션 서술로 시작해 근거·검증·근거파일 블록이 없거나 짧다. 예외는 #40954(cowork)로 body에 exit code 문구가 없었고 completion_result_note_forces_rework가 같이 붙어 body 누락과 준수 실패가 섞여 있다.
  • 부가 관찰: 이 body들에는 오케스트레이터 자동 보강 문단이 붙어 있고, 그 "검증: exit code 0; 통과" 같은 고정 문구가 템플릿처럼 그대로 보인다(#40960 body 끝). 에이전트가 이를 채울 양식이 아니라 이미 작성된 값으로 읽을 가능성이 있으나, 실제 제출문 전체가 DB에 없어 확정하지 못했다(미확인).

3) 결과 확인 보류 — 코드 없는 일반 문구 (guardian 4건)

  • 발생 유형: guardian의 needs_evidence 반복 분류 태스크 4건 연속 — #40825(11건), #41101(24시간 7건), #41151(19건), #41233(20건+2건). 건수만 바뀌고 주제가 같다.
  • 기존 규칙과 대조: config/agent_completion_submission_standard.md:121 "결과 확인 보류"를 다시 결과로 제출하지 않는다.로 규칙은 있다. 4건 모두 body에 exit code 문구와 4블록 지시가 있었다(body 대조 완료).
  • 판정: 준수 실패이자 발행 구조 문제. 같은 분류 태스크가 10-04~10-08 5일 사이 4번 발행되어 매번 같은 마찰을 낸다. 코드가 없는 이유(게이트가 구체 사유를 안 남김)는 이번 조사로 특정하지 못했다(미확인).

[리스크]

  • body에 exit code 문구를 넣어도 guardian 제출이 "통과"만 쓰면 scripts/agent_queue_worker.py:7031 정규식에 안 맞는다. body에 "숫자 생략 금지"를 명시해야 한다.
  • missing_result_or_verification은 포괄 라벨이라 지시문을 고쳐도 원인이 다른 항목(근거파일 줄번호 누락 등)이면 재발한다. 반려 노트에 게이트의 구체 누락 항목이 남도록 코드 개선이 별도로 필요하다(제안만, codex 위임 대상: scripts/agent_queue_worker.py:4063 부근).
  • 자동 보강 문단이 body 안에서 값처럼 보이는 문제는 오케스트레이터 body 생성부(scripts/orchestrator.py)의 별도 개선이 필요하다. 이번 문서에서는 코드를 수정하지 않았다.
  • 원본 제출문이 DB에 전체 보존되지 않아 라벨 원인 판정 일부는 게이트 코드 기준 추정이다.

[검증방법]

  • 측정 지표: 다음 7일 신규 needs_evidence 중 위 3개 라벨 비율. 현재 26건 중 18건(69.2%)이 1~3순위 라벨.
  • 검증 명령: sqlite3 -readonly /Users/ron/.hermes/data/ops_multiagent.db "SELECT claimed_by,count(*) FROM bus_commands WHERE status IN ('needs_evidence','failed') AND created_at>='2026-10-10' AND (result_note LIKE '%missing_verification_exit_code%' OR result_note LIKE '%missing_result_or_verification%' OR result_note LIKE '%결과 확인 보류%') GROUP BY claimed_by;"
  • 기대값: 7일간 guardian missing_verification_exit_code 0건, analyst-pm/macro missing_result_or_verification 1건 이하.
  • 롤백 조건: body 문구 변경 후 7일 내 같은 라벨이 3건 이상이면 문구 변경 효과 없음으로 보고, 원인을 게이트 코드 쪽(구체 사유 미기록)으로 옮겨 codex에 조사 위임한다.