needs_evidence 반복 반려 상위 3개 원인별 방지안 (guardian 51건 분류 재확인 기반)
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)
- 검증 줄 상용구 통일: 현재
scripts/orchestrator.py1104, 1131, 1137, 1795행이 "'exit code 0' 또는 '통과'를 적는다"로 지시한다(grep 확인). 이 지시를 "검증: <명령> → <결과 수치>, exit code 0 (숫자 0 리터럴 필수, '통과'는 대체 아님)"으로 고친다. 에이전트 프롬프트(guardian 340행 등)는 이미 exit code를 요구하므로 body가 프롬프트와 충돌하는 구조다. - 분석 태스크(IG/HY OAS) body에 근거 경로 문장 고정: "근거파일은 파일명이 아니라
/Users/ron/.hermes/workspace/memory/macro-timeseries/<파일>.json:<줄> "원문 1줄"형식의 절대경로로 적는다" + 결과물 저장 경로를 body가 미리 지정(memory/아래 md 1개). - 메타 집계 과제 body에 "결론·검증 줄에는 '결과 확인 보류', '검증 근거 없음', 라벨명을 쓰지 말고 풀어 쓴다. 차단 구절은 저장한 표 파일 안에서만 사용" 한 줄 추가.
B. 에이전트 프롬프트 변경 (scripts/agent_registry.py AGENT_ROLE_PROMPTS, 181행~)
- cowork·analyst-macro·analyst-pm 프롬프트에 guardian 340~342행의 규칙(검증은 한 줄 안에 명령·결과 수치·exit code 모두 표기, 표 전체를 result_note에 붙이지 않음)을 이식. 현재 라벨 인접 금지 문장은 일부 에이전트에만 있다(cowork 제안서 기준).
- analyst-* 프롬프트: "근거 인용은 절대경로+줄번호+원문 1줄. 파일명만 인용하면 source_log_path_not_found로 failed 처리됨" 명시.
- guardian·cowork 공통: "동일 주제 집계 과제를 받으면 최신 집계 문서(memory/needs_evidence_51_breakdown_20261018.md)를 먼저 읽어 건수만 갱신하고 새 분석을 만들지 않는다."
C. 코드 수정 필요 — codex 위임 후보 (이 작업에서는 수정하지 않음)
scripts/orchestrator.py1104/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기대 문자열 수정. 위험: 토큰 허용을 줄이면 기존 통과 사례가 막힐 수 있어 반대 테스트 필요.scripts/agent_queue_worker.py_RETRY_ITEM_BY_GAP(4138행~, 4172행("missing_verification_exit_code", "검증 결과의 exit code"))의 안내를 "검증 줄 끝에 숫자 0 리터럴로exit code 0"으로 구체화해 재시도 반복을 줄임.scripts/agent_queue_worker.py_completion_hard_block_phrase_reasons(466행) 및scripts/shared/public_result_formatter.py사본: 표·백틱·인용 안의 차단 구절은 제외, 결론·검증 줄 직접 사용만 차단(진짜 빈 보고는 계속 차단하는 반대 테스트 포함). 게이트가 worker·formatter·server.py 3곳에 있어 함께 수정해야 하며 server.py는 재시작에 해리 승인 필요.scripts/orchestrator.pycreate_task(): 제목에 needs_evidence/반려가 든 과제가 24시간 내 이미 있으면 신규 발행 대신 정본 문서 경로 안내(메타 순환 차단).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건이라도 나오면 되돌리고 게이트부터 점검.