virtual-insanity
← 리포트 목록

needs_evidence 반복 반려 사유별 정책 개선안 (최근 7일 16건 + 오래된 37건)

2026-10-19 claude [needs_evidence, 완료보고, 4블록, 종결후보, 정책제안]

needs_evidence 반복 반려 사유별 정책 개선안 (cowork, 코드 수정 없음)

조회: sqlite3 -readonly /Users/ron/.hermes/data/ops_multiagent.db + python sqlite3(mode=ro)로 status='needs_evidence' 전수 조회 → 53행, 2026-10-19 10:36~10:39 KST. DB·코드·크론·설정은 수정하지 않았다.

[권고]

→ 1순위: 코드 3곳을 codex에 위임한다. (a) 반려 문구가 "결과 확인 보류" 껍데기만 남기고 진짜 사유를 숨기는 문제(53건 중 차단 사유:에 구체 missing_*·invalid_* 라벨이 하나도 없는 건 18건: 40825, 41101, 41151, 41233, 41316, 41387, 41435, 41485, 41494, 41495, 41504, 41627, 41628, 41715, 41782, 41902, 41911, 41992) — scripts/shared/public_result_formatter.py의 guarded_completion_result_note, scripts/agent_queue_worker.py의 _completion_evidence_block_note. (b) 자동 보강 지시문을 값으로 베끼는 문제 — scripts/shared/agent_task_quality.py의 _supplement_bare_completion_evidence_description와 scripts/shared/public_result_formatter.py의 is_empty_evidence_placeholder_text. (c) "needs_evidence N건 집계" 태스크의 자기증식 — scripts/orchestrator.py의 create_task. 기대효과: 53건 중 집계성 guardian 21건(오래된 37건 안), 최근 7일 안 guardian 10건 모두 같은 유형이라 신규 발행이 멈추면 주당 약 10건의 반려가 사라진다. → 2순위: 문서 3곳을 보강한다(아래 [대조]). exit code 계열이 22건(41.5%)으로 가장 크고, agent_completion_submission_standard.md §9-3-1 예시(579행)가 아직 → exit 1을 정답처럼 보여 준다. 이 한 줄이 guardian의 invalid_verification_exit_code 반려와 모순된다. → 종결 정리: 오래된 37건 중 33건은 종결 후보, 4건(40276, 40346, 40408, 40691)은 재작업 후보다. 삭제는 하지 않고 상태 변경만 한다(삭제는 해리 확인 대상).

[현황]

0. 건수 정정

  • 전체 53건. 7일 기준선(조회 시각 10-12 10:36) 안은 16건, 밖은 37건이다. guardian이 말한 17/36과 1건 차이는 기준 시각이 다르기 때문이다. #41504(10-12 10:28 갱신)가 조회 시각이 늦을수록 7일 밖으로 넘어간다. 이 문서는 내 조회 시각 기준 16/37로 쓴다.
  • 최근 7일 16건 ids: 41623, 41627, 41628, 41640, 41715, 41769, 41780, 41782, 41897, 41900, 41902, 41911, 41917, 41992, 42042, 42062.

1. 4블록 미비 vs llm_infra_failure 구분

  • 53건 모두 차단 사유: 목록에 llm_infra_failure가 없다. 인프라 지연이 실제 원인인 건은 0건이다. 53건 전부 제출 규율(4블록 미비) 문제다.
  • 단순 문자열 검색으로는 llm_infra_failure가 최근 16건 중 3건에 걸리지만, 이는 guardian이 "인프라 원인은 0건"이라고 쓴 문장을 인용한 것이다. 사유가 아니다.
  • 최근 16건 모두 결론: 결과 확인 보류로 시작하는 게이트 껍데기 문구다. 진짜 원문은 원본 요약: 뒤에 잘려서 들어 있다.

2. 최근 7일 16건 — 에이전트 × 반려 라벨 (한 건에 라벨 여러 개 가능)

반려 라벨(차단 사유: 기준) guardian cowork analyst-macro 합계
결과 확인 보류(껍데기 문구만) 7 2 0 9
검증 근거 없음(껍데기 문구) 6 0 0 6
missing_result_or_verification 2 0 3 5
결과물과 검증 근거가 없음(껍데기 문구) 4 0 0 4
missing_verification_exit_code 3 0 0 3
completion_result_note_forces_rework 2 0 0 2
invalid_verification_exit_code 0 1 0 1
missing_verification_command 1 0 0 1
execution_artifact_path_not_found 1 0 0 1
건수(에이전트별) 10 3 3 16

3. 오래된 37건 — 에이전트 × 반려 라벨

반려 라벨 guardian cowork ron analyst-macro analyst-pm 합계
missing_verification_exit_code 11 0 0 0 0 11
결과 확인 보류(껍데기) 10 1 0 0 0 11
invalid_verification_exit_code 5 1 1 0 0 7
missing_result_or_verification 0 1 0 2 4 7
결과물과 검증 근거가 없음(껍데기) 5 0 0 0 0 5
검증 근거 없음(껍데기) 5 0 0 0 0 5
missing_verification_command 3 0 0 0 0 3
missing_execution_artifact 2 0 0 0 0 2
verification_command_unverifiable / forces_rework / artifact_not_found 각 1 1 2 0 0 0 3
건수(에이전트별) 26 4 1 2 4 37

4. 53건 전체 합산 (3건 이상 반복 라벨)

라벨 최근 16 오래된 37 합 비율(53건 중)
결과 확인 보류(껍데기만) 9 11 20 37.7%
missing_verification_exit_code 3 11 14 26.4%
missing_result_or_verification 5 7 12 22.6%
검증 근거 없음(껍데기) 6 5 11 20.8%
결과물과 검증 근거가 없음(껍데기) 4 5 9 17.0%
invalid_verification_exit_code 1 7 8 15.1%
missing_verification_command 1 3 4 7.5%
completion_result_note_forces_rework 2 1 3 5.7%

에이전트별 전체: guardian 36(67.9%), cowork 7, analyst-pm 4, analyst-macro 5, ron 1. 합계 53.

[대조] 3건 이상 반복 라벨 × 두 정책 문서

대조 방법: grep -c "<라벨>"로 두 문서의 언급 횟수를 센 뒤 해당 줄을 읽었다.

라벨 standard.md (1162줄) evidence_policy.md (4697줄) 빠진 항목
결과 확인 보류 / 검증 근거 없음 / 결과물과 검증 근거가 없음 (껍데기 40건 겹침) §3-1(121줄) "결과 확인 보류를 다시 결과로 제출하지 않는다"는 있음. §4 표에는 이 껍데기 문구 행이 없음 v19(2507줄)에 운영 문구 있음 껍데기 문구는 진짜 라벨이 아니라 게이트 래퍼(guarded_completion_result_note, public_result_formatter.py:3981)다. §4에 "껍데기만 보이면 원본 요약:의 마지막 missing_* 라벨을 보라"는 판독 행이 없다.
missing_verification_exit_code (14) 641, 664줄에 analyst-fundamental 전용 조항만 있음. §4 표(236~248줄)에 행 없음. §3-1(121~128줄) "검증:" 줄에 exit code 0 리터럴 의무 문장이 없음 17회 언급 모든 에이전트(guardian 포함)에 적용되는 §4 행과 §3-1 "검증:" 줄 끝 exit code <숫자> 리터럴 규칙. guardian이 14건 중 14건이다.
invalid_verification_exit_code (8) §4 245행에 행 있음(grep 부정형 안내). 그러나 §9-3-1 579행 예시가 → exit 1, cron_ok=True, worker_ok=False로 비0 코드를 정답처럼 보여 줌 4회 언급 guardian 점검 예시를 exit 0을 만드는 형태로 교체. 비0 결과는 "검증"이 아니라 "결과 수치"에 적고 검증 명령의 종료코드는 0으로 만드는 방법(; echo "exit code $?")이 §9-3-1에 없음.
missing_result_or_verification (12) 0회 언급 273, 286줄에 라우팅 계열 구분용으로만 나옴 라벨 정의 자체가 없다. 코드는 scripts/agent_queue_worker.py:4109~4110에서 _completion_report_has_result_and_verification이 거짓일 때 붙인다. "결론만 있고 근거·검증 블록이 없는 서술형"이 원인이며 analyst-pm 4건, analyst-macro 5건이 해당. §9-2(분석가용 템플릿)에 "서술형 단독 금지" 문장이 약하다.
completion_result_note_forces_rework (3) 0회 0회 양쪽 모두 정의 없음. 코드는 public_result_formatter.py:3602 completion_result_note_forces_rework(하드블록 정규식). 집계·반려 분석 보고서가 과거 반려 문구를 따옴표 없이 서술하면 걸린다. "반려 문구를 인용할 때는 따옴표로 감싸고, 구체 근거 2개 이상을 같은 보고에 넣는다"는 규칙이 문서에 없다.
missing_verification_command (4) 5회 언급, §4 243행 있음 24회 문서는 충분하다. 코드 쪽 문제로 보인다(4건 모두 guardian의 집계 태스크).
(라벨 아님) 자동 보강 지시문 복사 0회 언급 0회 지시문을 값으로 베낀 사례는 #40276, #40902, #42062이다. 다른 별도 문서(config/needs_evidence_27_agent_policy_20261010.md:41)에는 있으나 standard·policy 본문에는 없다.

문서 보강안(이번에는 수정하지 않았다): 1. standard §4에 행 3개 추가: 껍데기 문구 판독, missing_result_or_verification, completion_result_note_forces_rework. 2. standard §3-1 "검증:" 줄 설명에 "끝에 exit code 0을 숫자로 쓴다. 맨 grep·health_check의 비0 종료코드는 그대로 적지 않는다"를 추가. 3. standard §9-3-1 579행 예시를 exit 0 형태로 교체. 4. standard §3-1 아래에 "[자동 보강] 아래 문장은 지시문이다. 값으로 복사하면 결론: 수행한 일과 현재 상태를...처럼 지시문이 결론이 되어 반려된다" 한 단락 추가.

[코드 수정이 필요한 항목] (대상 파일·함수만, 직접 수정 안 함)

  1. scripts/shared/public_result_formatter.py → guarded_completion_result_note (3981행 정의): 차단 사유:에 구체 missing_* 라벨을 넣고 원본 요약: 잘림(노트 길이가 360~486자에 고정) 해소.
  2. scripts/agent_queue_worker.py → _completion_evidence_block_note (4195행): 1번과 같은 문제의 다른 경로.
  3. scripts/shared/agent_task_quality.py → _supplement_bare_completion_evidence_description (1039행)와 scripts/shared/public_result_formatter.py → is_empty_evidence_placeholder_text (2663행): 지시문 복사 탐지.
  4. scripts/orchestrator.py → create_task (2310행): 열린 needs_evidence 집계 태스크가 있으면 같은 유형 신규 발행 차단.
  5. scripts/agent_queue_worker.py → _completion_report_has_result_and_verification (2193행): missing_result_or_verification 판정이 서술형 분석 보고에서 어느 슬롯이 비었는지 알려 주지 않는다.

[오래된 37건 분류]

원칙: 결과가 시점 값이라 시간이 지나면 가치가 없고 같은 일을 다시 해도 쌓이기만 하는 건은 종결. 아직 가치가 있는 일을 담은 건은 재작업.

재작업 후보 (4건)

  • 40276 guardian: 모델 타임아웃 패치가 실행 중 워커에 반영됐는지 확인 — 실행 확인 태스크. 결론 줄에 자동 보강 지시문을 그대로 복사한 건이라 실제로 확인한 적이 없다. 새로 실행.

  • 40346 guardian: 옛 경로 mcp_health_server.py·stealth-browser 중복 기동 조회 — 현재 프로세스 상태 재조회가 필요한 읽기 전용 점검. 새로 실행.

  • 40408 analyst-macro: 미국 IG 등급별(AAA/AA/A/BBB) OAS 격차 — 다른 건은 IG·HY 총괄이지만 이 건은 등급 분해라 최신 건이 대체하지 않는다. 해리의 크레딧 관심사와 직접 연결. 최신 파일로 새 실행.

  • 40691 cowork: missing_next_action_section 반려 방지안 — 이 라벨은 두 정책 문서 모두 0회 언급이라 실제 문서 공백이다. 위 보강안 1번에 합쳐서 처리하면 된다.

종결 후보 (33건)

  • 집계성 guardian 21건: 40825, 40842, 40854, 40869, 40902, 41101, 41151, 41233, 41274, 41295, 41316, 41377, 41385, 41387, 41420, 41431, 41435, 41485, 41494, 41498, 41504. 사유: 제목이 "needs_evidence N건 분류/집계"이고 N=8~36으로 그 시점 합계라 낡았다. 현재 53건 기준 집계는 이 문서와 261019_claude_needs_evidence_triage.md가 대체한다.
  • 지식사랑방·크론 사전점검 guardian 3건: 40633, 40994, 41323. 사유: 10-02·10-06 시점 실패 원인 분류와 10-10 크론 사전점검이라 시점 값. 지식사랑방 0건 처리 기준은 policy v34절이 이미 다룬다. 일요일 크레딧 크론은 10-18부터 사전점검 게이트가 따로 붙었다.
  • analyst-pm·analyst-macro 5건: 40518, 40874, 40960, 41035, 41067 . 사유: IG·HY OAS 계열이며 기준일이 달라 최신 관측(10-14)이 대체한다. 새로 필요하면 새 요청이 낫다. 단서: #41035(HY 비중 축소/IG 유지 판단)는 10-06 값이므로 해리가 지금 판단을 원하면 되살리지 말고 새로 요청.
  • cowork 정책 제안 3건: 40954, 41348, 41495. 사유: 이후 10-15~10-19의 41715, 41782, 41917과 이 문서가 같은 주제를 다룬다.
  • ron 1건: 40297 ETF 데이터 예열 — 일회성 예열 결과는 정기 작업이 매번 덮어쓴다. 최신 실행 결과는 이번 조사에서 확인하지 못했다(제목 검색에 10-12 이후 일치 없음).

합계 4 + 33 = 37. (21 + 3 + 5 + 3 + 1 = 33)

종결 처리 방법: 상태를 되돌릴 수 있게 바꾸고(삭제 금지) result_note 끝에 이 문서 경로를 한 줄 적는다. 실행은 codex 또는 해리 확인 후. 사용 가능한 상태값은 이번에 조회하지 않았다.

[리스크]

  • 종결은 반려가 해결된 게 아니라 숨겨진 것이다. 신규 발행을 막지 않고 종결하면 같은 집계가 다시 쌓인다(10-04 7건 → 10-19 53건). 코드 1~4번이 먼저다.
  • guardian이 67.9%를 차지하는 단일 편중이다. guardian 일반 점검 태스크가 4줄 규칙을 지키는지는 이번 53건으로는 측정되지 않는다(53건이 거의 집계 태스크이기 때문).
  • 최근 7일 기준선이 시각에 따라 움직여 16/17건이 오간다. 장기 KPI는 시각이 아닌 id 경계로 잡아야 한다.
  • 이번에 분류한 라벨은 차단 사유: 목록 기준이다. 껍데기 문구(18건)는 진짜 사유가 원본 요약: 안에 있을 수 있어 라벨 건수가 과소 집계될 수 있다.
  • 재작업 후보 4건의 최신 상태(예: 워커 현재 반영 여부)는 이번에 재확인하지 않았다. 미확인.

[검증방법]

  • 지표: SELECT count(*) FROM bus_commands WHERE status='needs_evidence' AND id>42062 신규 건수. 기대값 7일간 3건 이하(현재 주당 약 10건).
  • 지표: 신규 반려 중 차단 사유:에 구체 missing_* 라벨이 있는 비율. 기대값 100%(현재 53건 중 18건이 껍데기만).
  • 명령: grep -c "missing_result_or_verification" config/agent_completion_submission_standard.md 기대값 1 이상(현재 0).
  • 롤백: 종결 처리한 건 중 되살릴 건이 있으면 이전 상태값으로 복원. 코드 변경 후 반려율이 오히려 늘면 변경 되돌림.