← 리포트 목록
needs_evidence 71건 에이전트별·반려사유별 분포와 재발 방지안
2026-10-25
claude
[needs_evidence, completion-gate, guardian, cowork, 재발방지, 4블록]
needs_evidence 71건 분포 분석 (조회 2026-10-25 02:56 KST)
1. 결론
- 큐 상태: needs_evidence 71, failed 4, done 4, claimed 1 (bus_commands 전체 status 집계).
- 71건 중 guardian 52건(73%), cowork 9건, analyst-macro 5건, analyst-pm 4건, ron 1건.
- 차단 사유 필드 기준 인프라 지연(llm_infra_failure 계열)은 0건. 결과 본문(잘린 원본 요약)에 문자열이 나오는 건 19건인데, 대부분 에이전트가 "인프라 0건"이라고 쓴 문장이다. 예외 둘: #42310·#42042는 "차단 사유에 인프라가 든 건 1건(#42306)"이라고 적었고, #42316은 "llm_infra_failure 라벨 15건"이라고 적었다. 이 세 건의 근거가 된 #42306 등은 이미 failed 쪽이거나 원문이 잘려 있어 이번 71건 안에서는 확인하지 못했다(미확인). 이번 71건의 차단 사유 필드 자체에는 인프라 라벨이 없다.
- 제목이 needs_evidence/반려 분류 작업 자체인 건이 58건(81%) — "반려 분석 태스크가 다시 반려되어 새 분석 태스크를 만드는" 자기참조 루프가 적체의 최대 원인이다.
2. 에이전트별 상위 3개 사유 (차단 사유 필드의 라벨, 한 건에 여러 라벨 가능)
guardian (52건, CMD 40276~42454)
결과 확인 보류25건 — 대표 CMD #40825, #42412missing_verification_exit_code19건 — 대표 CMD #40276, #42332검증 근거 없음15건 — 대표 CMD #41233, #42412
cowork (9건, CMD 40691~42503)
invalid_verification_exit_code3건 — 대표 CMD #41348, #42503결과 확인 보류3건 — 대표 CMD #41495, #41782verification_command_unverifiable1건 — 대표 CMD #40691, #40691
analyst-macro (5건, CMD 40408~41900)
missing_result_or_verification5건 — 대표 CMD #40408, #41900
analyst-pm (4건, CMD 40874~41067)
missing_result_or_verification4건 — 대표 CMD #40874, #41067
ron (1건, CMD 40297~40297)
invalid_verification_exit_code1건 — 대표 CMD #40297, #40297
3. 반려 유형 분류 (건당 1유형, 우선순위 C>A>B>D>E)
| 에이전트 | A 검증 exit code 누락/비0 | B 검증 명령 미기재/재현불가 | C 산출물 경로 미기재/비실존 | D 결과·검증 일반 미비(하드블록) | E 일반 보류(세부 라벨 없음) |
|---|---|---|---|---|---|
| guardian | 20 (#40276) | 2 (#42111) | 5 (#40842) | 3 (#41623) | 22 (#40825) |
| cowork | 3 (#41348) | 1 (#40691) | 1 (#42083) | 1 (#40954) | 3 (#41495) |
| analyst-macro | 0 | 0 | 0 | 5 (#40408) | 0 |
| analyst-pm | 0 | 0 | 0 | 4 (#40874) | 0 |
| ron | 1 (#40297) | 0 | 0 | 0 | 0 |
| 합계 | 24 | 3 | 6 | 13 | 25 |
라벨 전체 합산(중복 포함): 결과 확인 보류 28, missing_verification_exit_code 20, 검증 근거 없음 15, missing_result_or_verification 13, 결과물과 검증 근거가 없음 12, invalid_verification_exit_code 10, missing_verification_command 6, completion_result_note_forces_rework 4
4. 4블록 표준(config/agent_completion_submission_standard.md)과의 대조
- 4블록 미준수(형식): 유형 A·B·D·E 합계 65건. 표준 §4 표(238~243행)의 missing_verification_value/missing_source 계열 대신 최근엔
검증:줄에 exit code 0 리터럴이 없어서 반려되는 비중이 가장 크다(A유형 24건). - 존재하지 않는 경로 인용: execution_artifact_path_not_found 3건 (CMD #41323, #42062, #42314). 인용 경로가
workspace/jobs.json,workspace/ne_agg.py,memory/tmp_ne_agg.py와 tmp_ne_agg2.py입니다등 에이전트가 만든 임시 스크립트이거나 조사(조사·한국어 문장)가 붙은 경로 문자열이다. 표준 248행(phantom path 규칙)과 같은 계열. - 인프라 지연: 0건 (위 결론 참조). 이 큐의 needs_evidence는 인프라가 아니라 완료보고 형식·게이트 문제다.
- 71건 모두 result_note가 게이트 템플릿("결론: 결과 확인 보류 / 근거: …차단 사유: …")으로 치환되어 있어, 원문은 "원본 요약:" 뒤 약 200자만 남아 있다. 이 때문에 CMD별 원문 4블록 유무는 사후 재판정할 수 없다(미확인 범위).
5. 원인 가설과 검증 상태
- 게이트 비대칭 (코드로 확인): 서버 게이트
scripts/server.py::_completion_storage_required_result_gaps(762행)는 모든 에이전트에 exit code 숫자 리터럴(_STORAGE_EXIT_CODE_RE, 733행)을 요구한다. 반면 워커scripts/agent_queue_worker.py::_completion_required_result_evidence_gaps(7388행, 7484~7498행 부근)는 codex 외 에이전트에 "통과/66 passed"만으로 통과시킨다. 워커를 통과한 보고가 서버에서missing_verification_exit_code로 재반려될 수 있는 구조. A유형 대부분이 guardian·cowork에 몰린 사실과 일치하나, 개별 CMD의 원문이 잘려 있어 인과는 가설이다. - 실패 정규식 오탐 가능성 (정규식 단독 실험으로 확인):
agent_queue_worker.py7119행_CODEX_PYTEST_FAILURE_RE([1-9]\d*\s+(?:failed|errors?))는 "needs_evidence 71건, 4 failed" 같은 큐 집계 문장에 매치된다(실험 결과 True). 큐 분석 작업의 검증 줄에 "4 failed"가 들어가면invalid_verification_exit_code가 될 수 있다. invalid_ 라벨 10건이 실제 이 경로인지는 원문이 잘려 있어 미확인*. - 경로 추출 오탐 (반려 사유 문자열로 확인):
server.py::_completion_storage_artifact_paths(739행)가 조사가 붙은 토큰("…tmp_ne_agg.py와 tmp_ne_agg2.py입니다")을 하나의 경로로 잡아execution_artifact_path_not_found를 낸다.memory/tmp_ne_agg.py,memory/tmp_ne_agg2.py는 실제 존재함을 확인했으므로 파서 오탐 사례(CMD #42314). 반면workspace/ne_agg.py,workspace/jobs.json(CMD #42062, #41323)은 실제로 없는 경로(진짜 phantom). - 자기참조 루프: 분석 태스크 58건이 같은 주제로 반복 생성됨. 이미 같은 주제 보고서가 400-reports에 5건 이상(261022~261024) 있다. 오케스트레이터
scripts/orchestrator.py::create_task(2310행)에 주제 중복 억제가 부족한 것으로 보임(가설). - 자동 보강 placeholder:
orchestrator.py1146행의[자동 보강: 완료보고 4블록 필수…]꼬리 블록이 예시 문장("수행한 일과 현재 상태를 완료형 한 문장으로 적는다")을 담고 있고, CMD #40276은 그 문장을 그대로 에코해 반려됐다(1건 확인).
6. 재발 방지안 (제안서)
- [1순위] 게이트 규칙 통일: 서버와 워커의 exit code 요건을 한쪽 기준으로 맞춘다(권고: 두 곳 모두 "검증 줄에 exit code 0 또는 N passed"로 동일). 기대효과: A유형 전 건 해소 가능성. 해소 규모는 변경 후 측정.
- [1순위] 분석 태스크 중복 억제: needs_evidence 분류 태스크는 24시간 내 1건만 허용. 기대효과: 신규 적체 증가 억제(현재 meta 비중 81%).
- [2순위] 오탐 정규식·경로 파서 보정(아래 코드 목록), [2순위] 에이전트용 완료 템플릿에 exit code 0 줄을 포함한 예시를
agent_registry.py프롬프트에 반영. - 운영: 기존 71건은 원문이 잘려 재처리 불가 — 재처리 대상 선별/종결 여부는 해리 확인 후 결정(상태 변경은 이번 작업에서 하지 않음).
7. 코드 수정 필요 항목 (codex 위임용, 이번 작업에서는 수정 안 함)
| # | 파일 | 함수/상수 | 내용 |
|---|---|---|---|
| 1 | scripts/server.py | _completion_storage_required_result_gaps (762) |
exit code 요건을 워커 비-codex 경로와 일치시키거나, 워커가 같은 요건을 사전 검사 |
| 2 | scripts/agent_queue_worker.py | _completion_required_result_evidence_gaps (7388), _codex_has_verification_result_field (7219) |
비-codex 경로 exit code 비대칭 정리 |
| 3 | scripts/agent_queue_worker.py | _CODEX_PYTEST_FAILURE_RE (7119) |
"N failed"가 큐 상태 집계 문장일 때 오탐 안 나게 제한(pytest 결과 줄에만 적용) |
| 4 | scripts/server.py | _completion_storage_artifact_paths (739), _STORAGE_PATH_TOKEN_RE |
한국어 조사/문장부호가 붙은 경로 토큰 절단 |
| 5 | scripts/orchestrator.py | create_task (2310) |
needs_evidence 분류류 태스크 24h 중복 억제 |
| 6 | scripts/orchestrator.py | 자동 보강 블록 생성부 (1146 부근) | placeholder 예시 문장 대신 구체적 형식 예시 제공 |
8. 검증방법
- 지표:
sqlite3 -readonly /Users/ron/.hermes/data/ops_multiagent.db "SELECT claimed_by,count(*) FROM bus_commands WHERE status='needs_evidence' GROUP BY 1"— 코드 수정 후 7일간 신규 유입 일 평균 비교(현 기준 최근 28일 71건 ≈ 2.5건/일). - 기대값: A유형 신규 0건, meta 태스크 일 1건 이하.
- 롤백: 게이트 통일 후 정상 완료 보고(done)의 오반려가 늘면 변경 되돌림.