needs_evidence 40건 반려 라벨별 집계와 재발 방지안 (guardian #41636 실패 대체)
needs_evidence 40건 반려 라벨 집계 (cowork 대행, CMD#41637)
조회: 2026-10-14 01:32 KST, /Users/ron/.hermes/data/ops_multiagent.db bus_commands, status='needs_evidence' 40행 (코드 수정 없음, 읽기 전용).
[권고]
1순위: guardian의 "반려 집계·원인 분류" 계열 태스크(24건, 전체의 60%)는 지시문 끝 "자동 보강" 블록과 별개로, 완료보고 "검증:" 줄에 verification_command: 리터럴과 exit code 0 숫자를 한 줄로 쓰게 한다. 근거: guardian 29건 중 exit code 계열(missing_/invalid_verification_exit_code)이 주 원인으로 13건(45%)이다. 기대효과: guardian 반려가 신규 유입 기준 절반 이하로 감소(현재 최근 24시간 신규 3건 전부 guardian).
2순위: analyst-pm/macro의 "파일 기반 OAS·스프레드 판단" 계열(6건)에 "검증:" 줄 문구를 넣는다. 4블록 중 "결론:"과 "근거:"는 있으나 "검증:"/"근거파일:"이 잘려서 missing_result_or_verification으로 반려됐다(동반 포함 8건 중 analyst 6건). 기대효과: 해당 8건 유형 재발 0건.
3순위(코드, codex 몫): 아래 [재발 방지안] 5)번 참고. 자동 보강 블록과 반려 템플릿 문구가 에이전트의 자기복제를 유발한다.
[현황] 에이전트별 건수 (명령 1)
sqlite3 -readonly ... "SELECT claimed_by, COUNT(*) FROM bus_commands WHERE status='needs_evidence' GROUP BY claimed_by" → 5행 반환:
| 에이전트 | 건수 | 비율 |
|---|---|---|
| guardian | 29 | 72.5% |
| analyst-pm | 4 | 10% |
| cowork | 4 | 10% |
| analyst-macro | 2 | 5% |
| ron | 1 | 2.5% |
| 합계 | 40 | 100% |
에이전트 x 반려 라벨 표 (명령 2)
result_note는 40건 모두 같은 틀("결론: 결과 확인 보류 / 근거: ... 차단 사유: <라벨>. 보완 필요: ...")이며, "차단 사유:" 뒤 문구를 추출해 집계했다. 한 행에 라벨이 여러 개일 수 있어 "차단 사유:"에 가장 먼저 나온 게이트 라벨을 주 원인으로 분류한다(합 40, 스크립트로 재계산).
| 주 원인 라벨 | guardian | analyst-pm | cowork | analyst-macro | ron | 계 |
|---|---|---|---|---|---|---|
| missing_verification_exit_code | 8 | 0 | 0 | 0 | 0 | 8 |
| invalid_verification_exit_code | 5 | 0 | 1 | 0 | 1 | 7 |
| missing_result_or_verification | 0 | 4 | 0 | 2 | 0 | 6 |
| missing_execution_artifact | 2 | 0 | 0 | 0 | 0 | 2 |
| completion_result_note_forces_rework | 1 | 0 | 1 | 0 | 0 | 2 |
| verification_command_unverifiable | 0 | 0 | 1 | 0 | 0 | 1 |
| execution_artifact_path_not_found | 1 | 0 | 0 | 0 | 0 | 1 |
| 게이트 라벨 없이 일반 문구만("결과 확인 보류"/"검증 근거 없음"/"결과물과 검증 근거가 없음") | 12 | 0 | 1 | 0 | 0 | 13 |
| 합계 | 29 | 4 | 4 | 2 | 1 | 40 |
보조 라벨(같은 행에 동반): missing_verification_command 3행(#40842, #41431, #41323), missing_verification_exit_code는 주 원인 8행 외 동반 포함 시 guardian 10행, missing_result_or_verification은 동반 포함 시 8행(#40954, #41623 포함). execution_artifact_path_not_found는 #41323(인용 경로 /Users/ron/.hermes/workspace/jobs.json 미실존) 1행. 요청서가 예시로 든 missing_source, missing_execution_value, missing_original_verification 라벨은 result_note의 "차단 사유:"에 0건이다(#41494 본문도 같은 확인을 적었으나, 이는 에이전트 서술이라 위 집계로 직접 재확인했다). llm_infra_failure는 "차단 사유:" 라벨로 0건이다.
제목 기준 보조 사실: 40건 중 28건의 제목이 "needs_evidence/반려"를 다루는 집계·방지안 태스크다(제목에 needs_evidence 포함은 26건). 이 중 guardian 24건, cowork 4건(#40691, #40954, #41348, #41495)이다. 즉 반려를 분석하라는 태스크가 다시 반려되는 재귀 구조가 누적을 키웠다.
상위 라벨 실사례와 표준 문서 대응 (명령 3)
상위 1: missing_verification_exit_code (주 원인 8건, 동반 포함 10건; 인접 invalid_verification_exit_code 7건과 합치면 exit code 계열 15건). 표준 문서 대응: §0 TL;DR 2번("검증: 값 안의 수치/exit code가 그 줄에서 바로 읽히는가")과 §3 "검증:" 줄 서식, §9-4 신설 조항 1(analyst-fundamental용 exit code 0 리터럴). §4 반려 판정표에는 이 라벨 전용 행이 없다(문서 641행, 664행에서만 언급). 즉 자가진단표 공백이다.
- #40994 (guardian, 지식사랑방 인사이트 실패 원인 분류) 원문: 차단 사유: missing_verification_exit_code ... 원본 요약: 결론: #40990(과 직전 #40993)의 실패는 ... 검증: - grep -n "40990\|40993" /Users/ron/.hermes/logs/agent-queue-guardian.log 는 189873행과 189909행을 반환했다. → 검증 명령과 결과는 있으나 exit code 숫자가 없다.
- #40276 (guardian, 워커 타임아웃 패치 반영 확인) 원문: 원본 요약: 결론: 수행한 일과 현재 상태를 완료형 한 문장으로 적는다. 근거: /Users/ron/.hermes/workspace/scripts/agent_queue_worker.py, ...tests/test_agent_queue_worker_model_timeout.py → 결론 줄이 자동 보강 블록의 설명 문구를 그대로 복사한 것이다(40건 중 이 복사가 note에 남은 건 1건).
상위 2: missing_result_or_verification (주 원인 6건, 동반 포함 8건). 표준 문서 대응: §3 "검증:" + "근거파일:" 줄, §9-2 금융/시장분석용 템플릿(문서 418행), §9-3-2 analyst-pm 템플릿(590행), §9-4 신설 조항 5(memory/macro-timeseries 파일 인용, 805행). §4 판정표에 전용 행 없음.
- #40408 (analyst-macro, 미국 IG 등급별 OAS 격차) 원문: 차단 사유: missing_result_or_verification ... 결론: us-ig-weekly-latest.json을 직접 파싱해 AAA/AA/A/BBB OAS와 BBB-AA(39bp), ... 근거: → 결론은 훌륭하나 "근거:" 값이 비어 잘렸고 "검증:"/"근거파일:" 줄 없음.
- #41067 (analyst-pm, BAMLC0A0CM.json 기반 IG 현황) 원문: 결론: BAMLC0A0CM.json을 직접 읽어 최신값, 5영업일 변화, 1개월 고저, IG-HY 차이를 계산했습니다. ... 근거: 최신값(기준일 2026-10-02): IG 0.85%(85bp) ... → 수치 서술만 있고 검증 명령·exit code·근거파일 경로가 없다.
원인 구분 결론 (명령 4)
세 가지 가설을 40건에 대어 본 결과:
- 4블록 미준수(검증·근거파일 줄 누락/서식 미달): 27건(67.5%). 게이트 라벨이 붙은 행 전부(missing_verification_exit_code 8, invalid_verification_exit_code 7, missing_result_or_verification 6, missing_execution_artifact 2, completion_result_note_forces_rework 2, verification_command_unverifiable 1, execution_artifact_path_not_found 1)가 여기에 속한다. 원본 요약에 "결론:" 단독 또는 "결론:+근거:"만 있는 행이 대부분이다(검증:까지 있는 행은 #40994 1건).
- 일반 템플릿 반려("결과 확인 보류"만 표시): 13건(32.5%). 게이트 라벨 없이 sanitizer 기본 문구로 저장된 행이다. 원본 요약 앞부분은 4블록 흉내가 있으나 exit code/경로 근거가 없다. 성격상 1번과 같은 4블록 미준수에 가깝지만, 어느 항목이 빠졌는지 result_note에서 식별되지 않아 에이전트가 자가수정하지 못한다(진단 정보 부재).
- llm_infra_failure 계열 인프라 지연: 0건. "차단 사유:"에 해당 라벨이 있는 행이 없다. 같은 날 failed로 끝난 #41633, #41636의 note에
llm_infra_failure(429/timeout/empty)가 보이는 것은 sanitizer 템플릿이 가능한 사유 후보를 한꺼번에 나열한 문구이며, #41636은 claimed 01:16:53 → 종료 01:18:48(약 2분)로 타임아웃형이 아니다. 따라서 이 문구를 실제 인프라 장애 증거로 읽으면 오분류다. - 존재하지 않는 경로 인용: 1건(#41323,
/Users/ron/.hermes/workspace/jobs.json; 실제 크론 장부는/Users/ron/.hermes/cron/jobs.json, §9-9 경로표 영역). 부차 원인이다.
결론: 주원인은 "4블록 미준수 + 반려 note가 빠진 항목을 알려주지 않는 진단 공백"이다. 인프라 지연과 가짜 경로는 각각 0건, 1건이다. guardian #41636이 반려된 직접 원인도 note에 "결과물과 검증 근거가 없음 / 실행 전 선언문 / verification_command_unverifiable"만 나열되고 실제 결과가 적히지 않은 것이다(note에 원본 요약이 아예 없다 = 보고 본문 자체가 비어 저장됨, 본문 소실 가능성은 코드 확인이 필요하며 미확인).
[리스크]
- 재귀 누적: 40건 중 28건이 "반려를 분류하라"는 태스크다. guardian이 이를 받아 다시 4블록을 못 채우면 건수가 늘어난다(제목 숫자가 25→39건으로 증가한 흐름: #41348 25건, #41494 33건, #41628 39건, 이번 40건). 같은 지시문 재발행은 해결책이 아니다.
- 자동 보강 블록 부작용: 40건 중 37건의 body에 "[자동 보강: 완료보고 4블록 설명형 라벨 보충]"이 붙는다. 이 블록의 "결론: 수행한 일과 현재 상태를 완료형 한 문장으로 적는다." 같은 설명문이 정답처럼 복사된다(#40276).
scripts/orchestrator.py1146행이 이 블록을 생성한다. - 진단 정보 부재: note의 "보완 필요: 결과물 경로, 원문 확인, 검증 명령·결과"가 모든 행에서 동일해 에이전트가 무엇을 고칠지 모른다.
- 단일 장애점: guardian 한 에이전트가 72.5%를 차지하고 모두 같은 DB를 읽는 집계 태스크다. DB 잠금(
database is locked, #41631 사례)이 나면 보고도 같이 깨진다.
[재발 방지안] (명령 5)
1) guardian × "반려/failed 건 원인 분류·집계" 태스크: 지시문 말미(자동 보강 블록 위)에 아래 한 줄을 추가한다. "검증: 줄은 verification_command: <실행한 sqlite3 명령> → N행, exit code 0 한 줄로 쓴다. 건수는 합계 일치 확인 명령 결과로 적는다." 근거 문서 §9-3-1(570행) 템플릿에 이미 같은 구조가 있다.
2) guardian × "크론/스크립트 사전 점검" 태스크: 인용 경로를 쓰기 전 ls -l로 확인하라는 문구를 넣는다. 크론 장부는 /Users/ron/.hermes/cron/jobs.json을 쓰고 workspace/jobs.json은 존재하지 않는다(#41323).
3) analyst-pm/macro × "OAS·스프레드 판단(파일 기반)" 태스크: "검증:" 줄에 python3 -c 'import json;...'처럼 실행한 파싱 명령과 exit code 0을 쓰고, "근거파일:" 줄에 memory/macro-timeseries/<파일>.json:<줄> "<원문 1줄>"을 쓰라는 두 줄을 추가한다(§9-4 조항 5 연결). 결론이 먼저 길게 나와 "근거:" 값이 잘리는 패턴(#40408)이 있으니 "근거:" 줄을 결론 바로 다음에 짧게 쓰라고 한다.
4) cowork × "반려 방지안/제안서" 태스크: 비코딩 보고 4블록에서 "검증:"은 방금 저장한 문서에 grep -c '^결론:' <경로> 등을 돌린 결과와 exit code 0을 쓰게 한다(invalid_verification_exit_code 1건, #41348).
5) codex 위임(구현은 codex 몫): (a) scripts/orchestrator.py 1146행 근처 자동 보강 블록 생성부에서 설명문 대신 <> 자리표시자를 쓰거나 "이 줄은 예시이며 그대로 복사 금지" 문구를 추가. (b) scripts/agent_queue_worker.py(또는 scripts/shared/public_result_formatter.py)의 needs_evidence note 조립부에서 "보완 필요:"에 실제 누락 항목(예: 검증 줄 없음, exit code 없음)을 개별 표기하고 원본 요약을 항상 보존. (c) guardian 계열의 동일 제목 "반려 N건 집계" 태스크 재발행 억제(orchestrator.py 태스크 생성부, 제목 숫자 정규화 후 중복 판정).
6) 문서(cowork 후속): config/agent_completion_submission_standard.md §4 판정표에 missing_verification_exit_code와 missing_result_or_verification 전용 행을 추가한다. 현재 두 라벨이 §4에 없다.
[검증방법]
- KPI: needs_evidence 신규 유입(일 단위). 현재 최근 24시간 신규 3건(전부 guardian). 목표: 지시문 반영 후 7일간 guardian needs_evidence 신규 0~1건.
- 명령:
sqlite3 -readonly /Users/ron/.hermes/data/ops_multiagent.db "SELECT claimed_by, COUNT(*) FROM bus_commands WHERE status='needs_evidence' AND updated_at>='2026-10-15' GROUP BY claimed_by"→ 기대값: guardian 1 이하, 그 외 0. - 라벨 재집계: 위 40행에서 missing_verification_exit_code(주 원인 8건)가 7일 후 신규 0건이어야 함.
- 롤백 조건: 문구 추가 후에도 같은 라벨이 3건 이상 신규로 나오면 문구 효과 없음으로 보고 5)(b) 진단 개선 코드 작업을 1순위로 올린다.
- 미확인: 3건의 body에 자동 보강 블록이 없는 이유, #41636 note에 원본 요약이 없는 원인(본문 소실 여부). 코드 확인 필요.
완료 보고 4블록
결론: bus_commands의 needs_evidence 40건을 에이전트별·반려 라벨별로 집계하고, 상위 2개 라벨 실사례 4건(#40994, #40276, #40408, #41067)을 표준 문서에 대응시켜 재발 방지안을 작성했다.
근거: /Users/ron/.hermes/data/ops_multiagent.db bus_commands, sqlite3 -readonly ... GROUP BY claimed_by 5행 반환, status='needs_evidence' 40행 전수 python sqlite3(mode=ro) 조회, 조회 2026-10-14 01:32 KST.
검증: 에이전트별 합계 29+4+4+2+1=40, 라벨표 합계 8+7+6+2+2+1+1+13=40으로 일치, 보고서 존재는 ls -l /Users/ron/knowledge-agent/400-reports/261014_claude_needs_evidence_triage.md → 파일 확인, exit code 0, 통과.
근거파일: /Users/ron/knowledge-agent/400-reports/261014_claude_needs_evidence_triage.md (라인 번호는 저장 후 grep -n으로 재확인한 값을 완료 보고에 기재), 표준 문서 /Users/ron/.hermes/workspace/config/agent_completion_submission_standard.md:121 "\"결과 확인 보류\"를 다시 결과로 제출하지 않는다."