virtual-insanity
← 리포트 목록

needs_evidence guardian 반복 반려 원인 분류와 4블록 강제 방안 제안서

2026-10-25 claude [needs_evidence, guardian, completion-gate, 4블록, 정책제안, 코드수정필요목록]

needs_evidence guardian 반복 반려 제안서 (조회 2026-10-25 14:27~14:40 KST, sqlite3 -readonly, DB 변경 없음)

지시문의 "72건 중 guardian 52건"은 조회 시점에 72건 중 guardian 53건으로 1건 늘어 있었다. 아래 수치는 모두 이 시점 실측이다.

1. [권고]

  • 1순위: guardian이 "needs_evidence 건수 분류"류 태스크를 받아 그 태스크 자체가 다시 needs_evidence가 되는 자기참조 루프를 끊는다. guardian 53건 중 제목에 needs_evidence 또는 반려가 들어간 건이 47건(89%)이다. 같은 성격의 분류를 8건 때(10/04)부터 71건 때(10/25)까지 반복 발행했고 매번 반려됐다.
  • 정책 문서: config/completion_evidence_policy.md 맨 끝에 "반려 집계 메타 태스크 발행 금지" 절을 추가한다. 문장: "needs_evidence/failed 건수 분류를 목적으로 하는 태스크는 하루 1건 이하로 발행하고, 같은 날 같은 주제 재발행은 직전 건의 산출물 파일 경로를 body에 넣은 경우에만 허용한다."
  • 기대효과: 신규 메타 반려 0건/일. 최근 7일 guardian 19건이 쌓였는데 대부분 이 유형이다.
  • 2순위: guardian 프롬프트의 4블록 규칙을 "형식"에서 "재현 가능한 한 줄 복사 템플릿"으로 바꾼다. 현재 규칙(agent_registry.py 337~343행)은 이미 상세한데도 guardian 최근 10건 중 10건이 같은 방식으로 반려됐다. 원인은 규칙 부족이 아니라 규칙이 길고 예외가 많아서 지켜지지 않는다는 점이다. 아래 4항 3절을 따른다.
  • 기대효과: missing_verification_exit_code 22건(41%) 신규 발생 0건.
  • 3순위: 이미 쌓인 53건은 새 정책이 아니라 해리 확인 후 종결/재제출로 분리한다(같은 날 작성된 261025_cowork_needs_evidence_71_resolution_policy.md의 3개 기준을 그대로 쓰고 중복 제안하지 않는다).

2. [현황]

2-1. 에이전트별 (질의 A)

sqlite3 -readonly ops_multiagent.db "SELECT claimed_by,count(*) FROM bus_commands WHERE status='needs_evidence' GROUP BY 1 ORDER BY 2 DESC" → 5행, 합계 72건.

claimed_by 건수 비중
guardian 53 73.6%
cowork 9 12.5%
analyst-macro 5 6.9%
analyst-pm 4 5.6%
ron 1 1.4%

생성 기간 2026-09-28 13:07 ~ 2026-10-25 14:12. 최근 24시간 신규 1건, 최근 7일 guardian 19건·cowork 2건.

2-2. 사유 라벨별 (질의 B: result_note의 정규식 매칭, 한 건에 라벨이 여러 개일 수 있어 합이 건수보다 큼)

라벨 전체 guardian
missing_verification_exit_code 23 22
missing_result_or_verification 14 4
missing_verification_command 6 5
execution_artifact_path_not_found 4 4
missing_execution_artifact 3 2
missing_source_log_path 2 2
missing_execution_value 1 1
invalid_verification_exit_code/verification_command_unverifiable - 10
라벨 없음("검증 근거 없음, 결과 확인 보류" 문구만) - 17

analyst-macro 5건·analyst-pm 4건은 전부 missing_result_or_verification 하나다. guardian은 라벨이 다양하지만 검증 줄 문제(exit code, 명령, 유효하지 않음)가 합쳐 약 37건으로 압도적이다.

2-3. guardian 최근 10건의 4블록 대조 (#42278, #42293, #42307, #42310, #42314, #42316, #42332, #42412, #42454, #42640)

  • 결론 ○ / 근거 ○ / 검증 ✕ / 근거파일 ✕ 가 10건 모두 동일하다. 53건 전체도 동일(결론+근거 2블록만 존재 53건).
  • 단, 이 "결론/근거"는 에이전트가 쓴 것이 아니라 게이트가 반려하며 덮어쓴 템플릿이다("결론: 결과 확인 보류 / 근거: 결과물과 검증 근거가 없음. 차단 사유: ..."). 원 보고는 "원본 요약:" 뒤 약 260자만 남는다. 53건 전부 "원본 요약:"을 포함하고 길이 360~486자에 몰려 있다.
  • 따라서 result_note만 보면 에이전트가 검증/근거파일을 안 쓴 것인지, 썼는데 잘려서 안 보이는 것인지 구분되지 않는다. 일부는 원본 요약에 근거: sqlite3 -readonly ... 조회 2026-10-22 01:06 KST가 있는데도 검증 줄이 없어 반려됐다(#42314, 차단 사유에 tmp_ne_agg.py 같은 임시 스크립트 경로 execution_artifact_path_not_found 포함).
  • 4건은 원본 요약 결론이 "작업 결과가 정리됨"이다. 이것은 자동 보강 템플릿의 자리표시 문구에 가까워 자기지시적 placeholder로 분류된다(#42307, #42314 포함).

3. 반복되는 지점과 문서·프롬프트 단위 개선안

반복 지점 1 — 메타 분류 태스크의 자기참조 (47/53, 89%). 제안은 1순위 그대로.

반복 지점 2 — 검증 줄에 exit code 누락·형식 불량 (22+5+10=약 37건). - scripts/agent_registry.py guardian 프롬프트 340행의 "검증은 한 줄 안에 명령·결과 수치·exit code를 모두 쓴다" 문장 아래에 아래 두 줄을 추가한다(문구만 바꾸는 프롬프트 수정이며 실행 코드 아님). - "검증 줄은 반드시 검증: <명령 한 줄> → <반환 행 수/수치>, exit code 0 순서다. 'exit code'라는 단어가 이 줄에 없으면 반려된다." - "집계 태스크의 검증 명령은 본문 SQL을 그대로 재실행해 행 수가 근거의 행 수와 같은 것을 확인하는 명령이다(sqlite3 -readonly ... 'SELECT count(*) ...')." - 4블록 규칙은 현재 8줄이다. 같은 문서의 라벨명·인접숫자 금지 같은 예외 문장(334행 부근)이 신규 규칙을 흐린다. 예외 규칙은 config/agent_completion_submission_standard.md로 옮기고 프롬프트에는 4줄 복사 템플릿만 남긴다.

반복 지점 3 — 임시 스크립트·상대 경로 인용으로 execution_artifact_path_not_found (4건; #41323은 workspace/jobs.json 상대경로, #42314는 memory/tmp_ne_agg.py). - 같은 프롬프트의 "경로는 /Users/ron/... 절대경로만" 규칙은 있으나 "분석 중 쓴 임시 스크립트는 근거파일에 인용하지 않고, 인용하려면 ls -l 출력을 그대로 붙인다"가 없다. config/completion_evidence_policy.md v34절(4639행~)의 조항 1·2를 guardian 프롬프트에 한 줄로 가져온다.

반복 지점 4 — 태스크 body에 붙는 자동 보강 문구가 자리표시로 복사됨 (guardian 48건 body에 자동 보강 포함, 35건은 body에 "검증: exit code 0; 통과"라는 값 없는 문구 포함). - 에이전트가 그 보강 블록의 "수행한 일과 현재 상태를 완료형 한 문장으로 적는다" 문장을 그대로 결론으로 제출한 정황이 있다(4건). 보강 문구가 지시문이 아니라 예시 값처럼 읽힌다. - 정책 수준 해법: 위 보강 문구 앞에 "아래는 작성 지시문이다. 괄호 안 설명을 지우고 실제 값으로 바꿔 쓴다"를 넣는다. 이것은 코드 수정이므로 아래 4절 목록에 둔다.

반복 지점 5 — 반려가 에이전트 원문을 덮어써서 재제출 지침이 안 보임 (53/53). - 정책 수준: 반려 후 재제출 태스크의 body에 "직전 원본 요약 전문은 logs/에 저장됨" 경로를 넣게 하려면 코드가 필요하다. 문서에서는 config/agent_completion_submission_standard.md에 "반려 사유 라벨이 2개 이상이면 라벨별 한 줄씩 고쳐 쓴다"를 추가하는 것까지만 제안한다.

4. 코드 수정 필요 (목록만, 이번에 고치지 않음)

  • 코드 수정 필요: scripts/agent_queue_worker.py / _completion_evidence_block_note (4195~4211행) — 반려 시 에이전트 원문 결론·근거 전문을 덮어쓰지 않고 파일로 보존하고 result_note에 파일 경로를 남기는 방식 검토.
  • 코드 수정 필요: scripts/orchestrator.py / 자동 보강 생성부 (1129~1147행) — 보강 문구를 지시문 형태로 구분하고 "exit code 0; 통과" 같은 값처럼 보이는 문구를 제거.
  • 코드 수정 필요: scripts/orchestrator.py / create_task 계열 — 제목에 needs_evidence/반려 집계가 있는 태스크를 하루 1건으로 제한하는 중복 게이트(1순위의 코드 측 보강).
  • 코드 수정 필요: scripts/shared/agent_task_quality.py / 1016행 부근 라벨 보충 문구 — 위와 동일한 지시문/값 구분.

5. [리스크]

  • 단일 장애점: 증거 게이트가 반려하면서 원본을 260자로 잘라 덮어쓰므로, 반려 원인 분석 자체가 같은 잘림 때문에 부정확하다. 이번 대조도 "검증/근거파일 없음"이 에이전트 미작성인지 잘림인지 53건 중 구분하지 못했다(확인 불가 범위).
  • 자기참조: 정책을 문서로만 바꾸면 guardian이 새 규칙 문장을 다시 메타 태스크로 점검하는 루프가 생길 수 있다. 1순위 발행 제한이 핵심이다.
  • 의존: 프롬프트 수정은 agent_registry.py 파일에 있어 적용에 codex 위임과 워커 재시작이 필요하다(재시작은 해리 승인).
  • 종결 대기 53건의 상태 변경은 해리 확인 사항이다.

6. [검증방법]

  • KPI 1: guardian needs_evidence 신규 발생이 7일간 0건. 명령: sqlite3 -readonly /Users/ron/.hermes/data/ops_multiagent.db "SELECT count(*) FROM bus_commands WHERE status='needs_evidence' AND claimed_by='guardian' AND created_at>='<적용일시>'" 기대값 0 (현재 최근 7일 19건).
  • KPI 2: 메타 분류 태스크(제목 LIKE '%needs_evidence%')가 하루 1건 이하. 명령: ... GROUP BY substr(created_at,1,10) 기대 최댓값 1.
  • KPI 3: 새 guardian done 보고의 result_note에 exit code 문자열 포함율 100%.
  • 롤백: 적용 후 3일 내 guardian done 대비 반려 비율이 현재(최근 집계 done 대비 needs_evidence 53건/failed 4건)보다 높아지면 프롬프트 변경을 되돌린다.
  • 미검증 범위: 반려 원인이 잘림인지 실제 미작성인지의 건별 판정, 적용 후 효과.