virtual-insanity
← 리포트 목록

needs_evidence 반복 반려 상위 3개 원인별 방지안 (guardian 51건 분류 재확인 기반)

2026-10-18 claude [needs_evidence, completion-gate, guardian, cowork, prevention, orchestrator]

needs_evidence 반복 반려 상위 3개 원인별 방지안

조회: 2026-10-18 18:21~18:35 KST, sqlite3 -readonly /Users/ron/.hermes/data/ops_multiagent.db (읽기 전용). 코드·DB·크론 수정 없음. 대상: guardian CMD#42016(2026-10-18 17:01 완료) "needs_evidence 51건 반려 사유·에이전트별 분류".

0. guardian 분류 재확인 결과

  • SELECT ... FROM bus_commands WHERE status IN ('needs_evidence','failed') ORDER BY id → 55행 (needs_evidence 51 + failed 4). 건수 51은 guardian 값과 일치.
  • 사유군 재집계(result_note의 "차단 사유:" 구간 라벨, 한 건당 1군): exit code 계열 21 / 일반 보류 템플릿 18 / missing_result_or_verification 11 / verification_command_unverifiable 1 = 51.
  • guardian 문서(memory/needs_evidence_51_breakdown_20261018.md)는 exit code 20건, 내 재집계와 cowork 제안서(memory/2026-10-18_needs_evidence_51_prevention_plan.md)는 21건이다. 차이 1건은 #41323(차단 사유에 execution_artifact_path_not_found와 missing_verification_exit_code가 함께 있음)을 guardian은 경로 누락으로, 나는 exit code 쪽으로 센 우선순위 차이다. 상위 3개 순위는 어느 쪽이든 동일하다.
  • 에이전트별: guardian 34, cowork 7, analyst-macro 5, analyst-pm 4, ron 1.
  • 제목에 needs_evidence/반려가 든 메타 과제: 36건(70.6%) = guardian 29 + cowork 7.
  • 인프라 지연(llm_infra_failure) 때문에 needs_evidence가 된 건: 0건. 51건 전부 증거 게이트의 제출 규율 문제.
  • guardian이 말한 "최근 failed 5건"(#42009~42012, #42015) 중 #42009~42012는 현재 DB에 행이 없다(select ... where id between 42009 and 42013 → 0행). 현재 failed는 4건(#42015, #42017, #42019, #42021)이며 새로 생긴 3건은 analyst-macro다(아래 4절).

1. 상위 3개 반려 원인 표

순위 원인 건수(%) 에이전트 반복되는 태스크 유형 대표 CMD
1 검증 줄 exit code 누락/형식오류 (4블록 미비) 21 (41.2%) guardian 18, cowork 2, ron 1 반려 집계·분류 메타 과제, ETF 예열 점검 #40276, #40346, #41295, #41377, #41917 (ron: #40297)
2 일반 "결과 확인 보류/검증 근거 없음" 템플릿 (세부 라벨 없음, 차단 구절 자기인용) 18 (35.3%) guardian 15, cowork 3 needs_evidence N건 집계·방지안 메타 과제 (건수만 바꿔 반복 발행) #41992, #41902, #41504, #41782, #41715
3 결과·검증 쌍 판정 실패(missing_result_or_verification) = 결과물 경로·검증 근거 누락 11 (21.6%) analyst-macro 5, analyst-pm 4, guardian 1, cowork 1 미국 IG/HY OAS JSON 파일 판독·종합 판단 #41900, #41780, #41769, #41067, #41035
기타 verification_command_unverifiable 1 / execution_artifact_path_not_found 1(#41323, 일부 분류에선 별도) 1~2 cowork, guardian 방지안 제안서, 크론 사전점검 #40691, #41323

보강 관찰 3가지: - 상위 1·2순위는 사실상 guardian·cowork의 메타 집계 과제 한 유형(36건)에 몰려 있다. 반려되면 건수가 늘고, 늘어난 건수로 새 집계 과제가 발행되는 순환 구조다(제목에 "50건→51건"처럼 숫자만 바뀜). - 3순위의 analyst 9건은 분석 수치가 보고에 실제로 있는데도 막혔다. 10-18 현재 analyst-macro 신규 3건(#42017 확인 못함, #42019 verification_command_unverifiable, #42021 source_log_path_not_found:BAMLC0A0CM.json:707-708)은 모두 failed로 넘어갔다. #42021은 파일명만 인용하고 실존 전체 경로가 아니라서 걸렸다. 즉 3순위는 "분석 부재"가 아니라 "근거 경로 표기"가 원인이다. - 반려 원문이 게이트 교체 문구로 덮여 있어 원본 제출 전체의 결함은 일부 미확인이다(guardian 문서도 같은 한계를 밝힘).

2. 방지안 — 세 부류

A. 오케스트레이터 body 템플릿 변경 (원인 1·3)

  1. 검증 줄 상용구 통일: 현재 scripts/orchestrator.py 1104, 1131, 1137, 1795행이 "'exit code 0' 또는 '통과'를 적는다"로 지시한다(grep 확인). 이 지시를 "검증: <명령> → <결과 수치>, exit code 0 (숫자 0 리터럴 필수, '통과'는 대체 아님)"으로 고친다. 에이전트 프롬프트(guardian 340행 등)는 이미 exit code를 요구하므로 body가 프롬프트와 충돌하는 구조다.
  2. 분석 태스크(IG/HY OAS) body에 근거 경로 문장 고정: "근거파일은 파일명이 아니라 /Users/ron/.hermes/workspace/memory/macro-timeseries/<파일>.json:<줄> "원문 1줄" 형식의 절대경로로 적는다" + 결과물 저장 경로를 body가 미리 지정(memory/ 아래 md 1개).
  3. 메타 집계 과제 body에 "결론·검증 줄에는 '결과 확인 보류', '검증 근거 없음', 라벨명을 쓰지 말고 풀어 쓴다. 차단 구절은 저장한 표 파일 안에서만 사용" 한 줄 추가.

B. 에이전트 프롬프트 변경 (scripts/agent_registry.py AGENT_ROLE_PROMPTS, 181행~)

  1. cowork·analyst-macro·analyst-pm 프롬프트에 guardian 340~342행의 규칙(검증은 한 줄 안에 명령·결과 수치·exit code 모두 표기, 표 전체를 result_note에 붙이지 않음)을 이식. 현재 라벨 인접 금지 문장은 일부 에이전트에만 있다(cowork 제안서 기준).
  2. analyst-* 프롬프트: "근거 인용은 절대경로+줄번호+원문 1줄. 파일명만 인용하면 source_log_path_not_found로 failed 처리됨" 명시.
  3. guardian·cowork 공통: "동일 주제 집계 과제를 받으면 최신 집계 문서(memory/needs_evidence_51_breakdown_20261018.md)를 먼저 읽어 건수만 갱신하고 새 분석을 만들지 않는다."

C. 코드 수정 필요 — codex 위임 후보 (이 작업에서는 수정하지 않음)

  1. scripts/orchestrator.py 1104/1131/1137/1795행 상용구 교체(A-1과 동일) + scripts/shared/agent_task_quality.py의 default_verification(1003~1025행)과 토큰 목록(822, 855, 996, 1004, 1268행의 "exit code 0 or 통과" 허용) 정합화 + scripts/tests/test_orchestrator_task_quality.py 기대 문자열 수정. 위험: 토큰 허용을 줄이면 기존 통과 사례가 막힐 수 있어 반대 테스트 필요.
  2. scripts/agent_queue_worker.py _RETRY_ITEM_BY_GAP(4138행~, 4172행 ("missing_verification_exit_code", "검증 결과의 exit code"))의 안내를 "검증 줄 끝에 숫자 0 리터럴로 exit code 0"으로 구체화해 재시도 반복을 줄임.
  3. scripts/agent_queue_worker.py _completion_hard_block_phrase_reasons(466행) 및 scripts/shared/public_result_formatter.py 사본: 표·백틱·인용 안의 차단 구절은 제외, 결론·검증 줄 직접 사용만 차단(진짜 빈 보고는 계속 차단하는 반대 테스트 포함). 게이트가 worker·formatter·server.py 3곳에 있어 함께 수정해야 하며 server.py는 재시작에 해리 승인 필요.
  4. scripts/orchestrator.py create_task(): 제목에 needs_evidence/반려가 든 과제가 24시간 내 이미 있으면 신규 발행 대신 정본 문서 경로 안내(메타 순환 차단).
  5. source_log_path_not_found 판정 시 상대·파일명 인용에 대해 워크스페이스 내 유일 매치가 있으면 경로를 보정하거나 반려 메시지에 후보 절대경로를 제시.

3. 우선순위와 기대효과

순위 조치 대상 원인 기대효과
1 C-1 + A-1 (body 상용구 5곳 교체) 원인 1 (21건) exit code 계열 신규 반려 일 1~3건 → 0건
2 C-4 + A-3 + B-3 (메타 집계 순환 차단) 원인 2 (18건) + 메타 36건 신규 needs_evidence 일 3~8건 감소
3 A-2 + B-2 (분석 태스크 근거 경로 고정) 원인 3 (11건) analyst 반려·failed 신규 0건

문서·프롬프트만 고치고 상용구 5곳을 두면 body가 다시 "또는 통과"를 가르쳐 효과가 없다(A와 C를 같이 적용해야 함).

4. 리스크

  • 게이트 3곳 불일치 시 판정이 갈린다. server.py는 장기 프로세스라 반영이 즉시 되지 않는다.
  • 원문이 게이트 교체 문구로 덮여 원인 일부는 추정이다.
  • 분석 9건은 이미 수치가 있는 업무 산출물이라 반려로 남으면 해리의 크레딧 업무 입력이 막힌다.

5. 검증방법

  • 적용 후 24시간 신규 건수: 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행.
  • exit code 계열: 위 쿼리에 AND result_note LIKE '%exit_code%' → 기대 0건.
  • 롤백: 상용구 교체 뒤 exit code 없는 제출이 done으로 저장되는 사례가 1건이라도 나오면 되돌리고 게이트부터 점검.