needs_evidence 반복 반려 사유별 정책 개선안 (최근 7일 16건 + 오래된 37건)
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 아래에 "[자동 보강] 아래 문장은 지시문이다. 값으로 복사하면 결론: 수행한 일과 현재 상태를...처럼 지시문이 결론이 되어 반려된다" 한 단락 추가.
[코드 수정이 필요한 항목] (대상 파일·함수만, 직접 수정 안 함)
scripts/shared/public_result_formatter.py→guarded_completion_result_note(3981행 정의):차단 사유:에 구체missing_*라벨을 넣고원본 요약:잘림(노트 길이가 360~486자에 고정) 해소.scripts/agent_queue_worker.py→_completion_evidence_block_note(4195행): 1번과 같은 문제의 다른 경로.scripts/shared/agent_task_quality.py→_supplement_bare_completion_evidence_description(1039행)와scripts/shared/public_result_formatter.py→is_empty_evidence_placeholder_text(2663행): 지시문 복사 탐지.scripts/orchestrator.py→create_task(2310행): 열린 needs_evidence 집계 태스크가 있으면 같은 유형 신규 발행 차단.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). - 롤백: 종결 처리한 건 중 되살릴 건이 있으면 이전 상태값으로 복원. 코드 변경 후 반려율이 오히려 늘면 변경 되돌림.