needs_evidence 81건 반려 사유 집계와 재발 방지 라우팅안
needs_evidence 81건 반려 사유 집계와 재발 방지 라우팅안 (CMD#42831)
- 조회: 2026-10-27 12:49~13:05 KST.
sqlite3 -readonly /Users/ron/.hermes/data/ops_multiagent.db(Python sqlite3mode=ro)로만 읽었다. 상태 변경, 코드 수정 없음. - 같은 날 이미 있는 문서:
261027_claude_needs_evidence_prevention.md,261027_hermes_needs_evidence_prevention.md,261027_claude_needs_evidence_backlog_policy.md. 이 문서는 그 문서들에 없는 두 가지, 즉 "81건 중 몇 건이 반려 자체를 다루는 태스크인가"와 "라벨별 원인 3분류(제출 미준수/오라우팅/인프라)"를 직접 집계해 라우팅 변경안으로 연결한다.
1. [권고]
1순위: 반려 집계·방지안 작성 태스크를 오케스트레이터가 더 이상 발행하지 않도록 막는다. 81건 중 63건(77.8%)이 제목에 needs_evidence/반려/failed가 들어간 "반려를 분석하는 태스크"이고, guardian 52건, cowork 11건이다. 이 63건은 59개 서로 다른 제목 계열이라 기존 재발행 루프 게이트(같은 agent+같은 제목 계열 3회 이상 + 본문 유사도 0.9)가 한 번도 걸리지 않았다(중복 계열은 4건뿐). 오늘만 해도 #42824, 42826, 42827, 42829, 42830, 42831이 같은 일을 6번 발행했고 앞의 5건이 failed다. 기대효과: 신규 needs_evidence 유입이 현재 일 평균 약 2.8건(81건/29일, 9/28~10/27)에서 집계류 63건분만큼 줄어, 이론상 약 78%가 원천 감소한다.
2순위: 제출 규율 문제인 검증값 누락(exit code, 검증 명령, 결과)은 에이전트별 지시문에 "조회 전용 작업도 마지막 줄에 검증: <명령> → <결과>, exit code 0"을 박는다. 대상은 guardian, cowork, analyst-macro/pm. 기대효과: A1군 45건(55.6%)이 재제출 없이 첫 제출에 통과.
3순위: 미국 IG OAS 파일 판독 태스크(analyst-macro/pm 10건)를 해리 관심사 태스크로 별도 표시하고, 완료 보고 전에 결과물 저장 경로(md 파일)와 파싱 명령 결과를 반드시 인용하게 한다. #40518처럼 "md 파일로 저장했습니다"라고만 쓰고 경로·exit code가 없어 반려된 사례가 있다.
2. [현황] 집계 결과
실행 명령과 반환 행 수:
- SELECT status,count(*) ... GROUP BY status → needs_evidence 81, failed 5 (2행)
- SELECT claimed_by,count(*) ... WHERE status='needs_evidence' GROUP BY claimed_by → 5행: guardian 58, cowork 12, analyst-macro 6, analyst-pm 4, ron 1. 합계 81.
- 전체 행 조회 SELECT id,title,claimed_by,... WHERE status IN ('needs_evidence','failed') → 86행(81+5).
- 날짜 범위: 2026-09-28 13:07 ~ 2026-10-27 04:11 KST. 81건 전부 requested_by=orchestrator.
반려 라벨별 건수 (result_note의 "차단 사유:" 필드 기준. 한 건에 여러 라벨 가능):
| 라벨 | 건수 | 에이전트 분포 |
|---|---|---|
| 라벨 없음, "결과 확인 보류" 고정 문구만 | 31 | guardian 27, cowork 4 |
| missing_verification_exit_code | 23 | guardian 20, cowork 3 |
| missing_result_or_verification | 14 | analyst-macro 6, analyst-pm 4, guardian 3, cowork 1 |
| invalid_verification_exit_code | 10 | guardian 6, cowork 3, ron 1 |
| missing_verification_command | 9 | guardian 6, cowork 3 |
| execution_artifact_path_not_found | 5 | guardian 3, cowork 2 |
| missing_execution_artifact | 4 | guardian 3, cowork 1 |
| verification_command_unverifiable | 3 | guardian 2, cowork 1 |
| llm_infra_failure | 0 | 차단 사유 필드에는 한 건도 없음 |
주의: result_note 본문 어디서든 llm_infra를 찾으면 20건이 잡히지만, 전부 "인프라 지연은 0건"이라는 설명 문장이 본문에 들어 있어서다. 차단 사유 필드만 보면 0건이다(rows 81, llm_infra mention anywhere 20을 필드 기준 0과 대조).
상위 3개 라벨별 대표 CMD 2건과 result_note 원문 한 줄: - 라벨 없음(31): #41101 guardian "결론: 결과 확인 보류 / 근거: 결과물과 검증 근거가 없음. 차단 사유: 결과 확인 보류. 보완 필요: 결과물 경로, 원문 확인, 검증 명령·결과." / #41151 guardian 동일 문구(원본 요약은 "needs_evidence 19건과 failed 3건, 합계 22건의 반려 사유를 라벨별로 집계했습니다"로 실제 집계를 한 상태). - missing_verification_exit_code(23): #40276 guardian "차단 사유: missing_verification_exit_code"(제출 본문 "결론: 수행한 일과 현재 상태를 완료형 한 문장으로 적는다."로 안내 문구가 그대로 남음) / #40346 guardian "차단 사유: missing_verification_exit_code"(원본 요약은 MCP 헬스서버 중복 기동 원인을 PID별로 정리). - missing_result_or_verification(14): #40408 analyst-macro(미국 IG 등급별 OAS 격차) "차단 사유: missing_result_or_verification"(원본 요약에 BBB-AA 39bp 등 수치는 있으나 검증 줄 없음) / #40518 analyst-macro(미국 IG OAS 추이, 주간 크레딧 리포트 입력용) 동일 라벨.
3. 원인 3분류 결과
이 분류는 사실(라벨, 제목 유형)과 추정을 나눠 적는다. 추정은 [추정]으로 표시한다.
A. 4블록 제출 미준수 (제출 규율): 81건 전부가 증거 게이트 반려이며 아래 A1+A2+A3=45+5+31=81건으로 겹치지 않게 나눴다
- A1 검증값(명령·exit code·결과) 누락·불량: 45건. 에이전트: guardian 다수, cowork, analyst-macro/pm, ron 1.
- A2 존재하지 않는 산출물 경로 인용(execution_artifact_path_not_found): 5건. 예: #41323 guardian이 /Users/ron/.hermes/workspace/jobs.json을 인용(주간 크레딧 크론 5c45c26045be 사전 점검), #42062 guardian이 /Users/ron/.hermes/workspace/ne_agg.py를 인용, #42314 guardian이 memory/tmp_ne_agg.py와 tmp_ne_agg2.py입니다처럼 파일명 뒤에 설명을 붙여 인용.
- A3 라벨 없는 "결과 확인 보류" 고정 문구: 31건(차단 사유 필드에 구체 라벨이 없는 건만 센 값). 전부 집계·방지안 작성 태스크다. [추정] 원본 요약에 실제 집계가 들어 있는데도 고정 문구로 덮이는 것은 게이트가 "방금 만든 반려 노트 자체"를 다시 재료로 삼는 구조 때문이다. agent_queue_worker.py 4668~4690행 주석(R7)이 같은 현상을 이미 한 번 고친 흔적이 있으나, 이번 31건이 R7 수정 이후에도 발생했는지는 미확인이다. codex가 재현해야 한다.
B. 코드 수정 태스크의 오라우팅: 1건(1.2%, #42778, A2와 중복 표시) - #40276 guardian("agent_queue_worker.py 모델 타임아웃 패치가 실행 중인 워커에 반영됐는지 확인")은 조회형이라 라우팅 자체는 맞다. 반려 원인은 라벨상 exit code 누락이므로 B가 아니라 A1이다. - #42778 cowork("상태 메시지에 '근거 섹션 미기재' 자기지시 placeholder가 들어가는 코드 경로 수정")가 실제 B에 해당한다. 소스 코드 수정을 cowork에 줬고 execution_artifact_path_not_found로 반려됐다. 이는 AGENTS.md 2026-09-21 라우팅 규칙(소스 수정은 codex)과 정확히 같은 위반이다. 나머지 79건은 코드 수정 태스크가 아니다(제목 키워드 수정/패치/구현/리팩 기준).
C. 인프라 지연: 0건 (차단 사유 필드 기준). failed 5건(#42824, 42826, 42827, 42829, 42830)도 note에 llm_infra 라벨이 없고 "확인 못함/확인 보류" 계열이다.
태스크 유형 집중도: - 반려 분석·집계·방지안 태스크: 63건(77.8%). guardian 52, cowork 11. - 미국 IG/HY OAS 판독: 10건(analyst-macro 6, analyst-pm 4). 아래 4절 참고. - 조회형 점검(크론·MCP·워커): guardian 3, analyst-macro 2 등 소수.
4. 해리 관심사 관련 반려 (별도 표시)
미국 IG 회사채와 주간 크레딧 관련 11건이 needs_evidence 상태다. - analyst-macro: #40408, #40518, #41769, #41780, #41900, #42671 (6건, 제목에 미국 IG OAS 판독·정리). 라벨은 대부분 missing_result_or_verification 또는 검증값 누락. - analyst-pm: #40874, #40960, #41035, #41067 (4건, IG·HY 스프레드 종합 판단). - guardian: #41323 (주간 크레딧 요약 크론 5c45c26045be 사전 점검). 라벨: execution_artifact_path_not_found:/Users/ron/.hermes/workspace/jobs.json, missing_verification_command, missing_verification_exit_code. 본문은 "enabled true"와 jobs.json:7965 인용까지 있었으나 존재하지 않는 경로 때문에 반려됐다. 실제 크론 점검 결과는 날아갔다. - Sell Axe 관련: 제목에 Sell/Axe가 들어간 반려는 0건(제목 키워드 조회). - 오늘 상태: #42825 analyst-macro(미국 IG·HY OAS 최신값, macro-timeseries JSON 기준)는 done으로 통과했다. 같은 유형이 통과하는 경로가 있다는 뜻이다. [추정] 통과 조건은 결과물 경로와 exit code를 같이 적은 것이나, #42825 note 원문과의 대조는 하지 않았다(미확인).
5. [리스크]
- 자기순환: 반려 분석 태스크의 반려를 분석하는 태스크가 다시 반려된다. 오늘 12:15 이후 #42830까지 5건 연속 failed. 같은 일이 계속되면 큐 슬롯만 소모하고 해리 관심 업무(IG OAS, 주간 크레딧)가 뒤로 밀린다.
- 단일 장애점: guardian이 58건(71.6%)을 차지한다. guardian 집계·점검 프롬프트 한 곳의 결함이 대부분을 만든다.
- 허구 경로 인용: ne_agg.py, tmp_ne_agg.py처럼 /tmp에서 만든 스크립트를 workspace 경로로 인용하면 execution_artifact_path_not_found가 된다(A2 5건 중 최소 3건). 증거 파일은 반드시 실제 저장 위치로 인용해야 한다.
- 판정 구조 불투명: A3 31건은 라벨이 없어 에이전트가 무엇을 고쳐야 하는지 알 수 없다. 재제출해도 같은 고정 문구가 나올 위험이 있다.
- 숫자 불일치 주의: 오늘 다른 문서들은 "결과 확인 보류 33건"으로 적었다. 내 집계는 31건이다. 차이 2건은 "차단 사유" 필드를 못 찾은 failed 상태 건이나 정규식 경계 차이로 추정되며, 확정하지 못했다(미확인).
6. 라우팅·지시문 개선안
라우팅:
1. 제목/본문에 needs_evidence|반려|재발 방지|failed 가 있는 태스크는 최근 72시간 내 같은 키워드 태스크가 이미 done이 아닌 상태로 1건 이상이면 신규 발행하지 않는다. 계열 판별을 에이전트 단위가 아니라 키워드 단위로 넓혀 agent 간 우회(guardian→cowork→ron 재라우팅)를 막는다.
2. 소스 파일 수정을 요구하는 제목은 cowork가 아니라 codex로 보낸다(#42778 재발 방지). 기존 2026-09-21 규칙을 CB 재라우팅 경로에도 적용.
3. 반려 집계는 한 번만 guardian이 아니라 DB 조회 결과를 workspace/ 아래 영구 파일로 저장하는 단일 스크립트 호출로 대체한다. 에이전트 LLM이 매번 임시 스크립트를 만들면 A2가 반복된다.
지시문(에이전트 프롬프트 말미에 추가할 문구):
- 조회 전용 작업 공통: "마지막에 반드시 검증: <실제 실행한 명령> → <결과값>, exit code 0 한 줄을 쓴다. 조회만 했어도 생략하지 않는다."
- 파일 경로 인용 공통: "근거파일에는 실제 저장 경로만 쓰고 경로 뒤에 설명을 붙이지 않는다. 설명은 다음 줄에 쓴다. /tmp에서 만든 임시 파일은 인용하지 않는다."
- analyst-macro/analyst-pm: "결과물을 md/json으로 저장했으면 그 절대경로와 python3 -c ... 파싱 명령의 출력값을 근거와 검증에 그대로 적는다."
7. codex 위임 후보 (코드 수정 필요 항목, 이번 작업에서는 수정하지 않음)
- scripts/orchestrator.py
_reissue_family_key(4301행),_is_needs_evidence_reissue_loop_tripped(4330행): 반려 분석 키워드 계열을 agent와 무관하게 묶고 유사도 조건을 완화. - scripts/orchestrator.py CB 재라우팅 분기(
create_task()): 코드 수정형 제목을 cowork로 재라우팅하지 않도록 codex_task_has_code_change_anchor 판정 유지 확인. - scripts/agent_queue_worker.py
_completion_evidence_block_note(4196행),_completion_report_has_result_and_verification(2194행): "결과 확인 보류" 고정 문구만 남는 31건을 재현하고, 구체 라벨(missing_*)이 노트에 반드시 남도록 보강. - scripts/agent_queue_worker.py
_CODEX_VERIFICATION_EXIT_CODE_RE(7121행)와 scripts/shared/public_result_formatter.py 동일 정규식(3300행): 조회 전용 작업의 exit code 표기 허용 형태 점검. - scripts/agent_registry.py
AGENT_ROLE_PROMPTS: guardian, analyst-macro, analyst-pm에 위 6절 지시문 삽입.
8. [검증방법]
- 측정 지표: (a) 신규 needs_evidence 일 건수, 현재 약 2.8건/일. 목표 1건/일 이하. (b) guardian의 needs_evidence 비율, 현재 71.6%(58/81). (c) 반려 분석 태스크 제목 비율, 현재 77.8%. (d) 해리 관심 태스크(IG OAS, 주간 크레딧) 반려 11건 중 신규 발생 0건.
- 검증 명령:
sqlite3 -readonly /Users/ron/.hermes/data/ops_multiagent.db "SELECT claimed_by,count(*) FROM bus_commands WHERE status='needs_evidence' AND created_at>='2026-10-28' GROUP BY claimed_by" - 기대값: 1주 후 신규 합계 7건 이하, 반려 분석 제목 태스크 신규 2건 이하.
- 롤백 조건: 라우팅 변경 후 반려 분석이 정말 필요한 태스크(예: 해리 직접 요청)가 차단되어 24시간 이상 처리되지 않으면 키워드 계열 확장을 원복하고 기존 72시간·유사도 0.9 조건으로 되돌린다.