needs_evidence 20건 완료보고 누락 패턴과 지시문 보완안 (codex용 제안서)
[권고]
1순위 (codex): scripts/shared/agent_task_quality.py 의 _completion_evidence_supplement_lines 가 만드는 "[자동 보강]" 줄이 검증 줄에 exit code 0 리터럴을 항상 넣도록 보완. 근거: guardian missing_verification_exit_code 7건 중 4건(#40276 #40854 #40902 #40994)은 태스크 본문에 exit code 요구 자체가 없었고(나머지 3건 #40346 #40633 #40842는 요구가 있었는데도 반려), 비코딩(조회·집계) 분기는 "검증: 실제로 실행한 조회 명령..." 문구만 넣는다. 기대효과: missing_verification_exit_code 7건(전체 23라벨의 30%) 제거.
1순위 (codex): scripts/server.py _completion_storage_required_result_gaps 와 scripts/agent_queue_worker.py _completion_required_evidence_gaps 의 exit code 요건을 일치시킬 것. 워커 쪽 주석은 "exit code 숫자 요구는 codex 전용"이라 하지만 서버 쪽은 모든 에이전트에게 _STORAGE_EXIT_CODE_RE 를 요구한다. 두 게이트가 다르면 워커 통과 후 서버에서 반려된다.
2순위 (codex): scripts/shared/public_result_formatter.py completion_report_has_result_and_verification 의 실패 사유를 세분화. 현재 analyst-macro 2건·analyst-pm 4건·cowork 1건이 전부 뭉뚱그린 missing_result_or_verification 하나로 나와 에이전트가 무엇을 채울지 모른다.
2순위 (cowork/ron, 문서): config/agent_completion_submission_standard.md 에 missing_result_or_verification 항목을 신설(현재 문서 전체에 0건).
[현황] (조회 2026-10-08 08:5x KST, needs_evidence 20행)
- 에이전트별 태스크: guardian 11, analyst-pm 4, analyst-macro 2, cowork 2, ron 1 = 20.
- 라벨별(복수 라벨 포함 23): missing_verification_exit_code 7, missing_result_or_verification 7, 결과 확인 보류(라벨 불명) 3, invalid_verification_exit_code 2, 그 외 4종 각 1.
- 20건 모두 본문에 4블록 요구 + "[자동 보강]" 줄이 들어 있었음(4블록 요구 누락 아님). 즉 지시 누락이 아니라 "지시는 있으나 에이전트가 자유서술로 제출"이 주 패턴.
- 반려 최다 2곳: guardian 11건(55%), analyst-pm 4건(20%).
- guardian: 7건이 missing_verification_exit_code. 본문 exit code 문구 없는 건 #40276 #40854 #40902 #40994, 있었는데도 반려 #40346 #40633 #40842(+ #40842는 라벨 3종 동시). 역할 프롬프트(agent_registry.py 333행)에는 exit code 요구가 있다.
- analyst-pm: 4건 전부 missing_result_or_verification. 본문은 "문장 끝에 exit code 0 또는 통과"를 요구했으나 제출은 "결론: ... " 뒤 불릿 자유서술(#40960, #41035)이거나 결론/근거만(#41067, 원본 요약이 272자에서 잘려 검증·근거파일 유무는 미확인).
- US IG·HY OAS 반려 6건(30%): analyst-macro #40408 #40518, analyst-pm #40874 #40960 #41035 #41067. 전부 missing_result_or_verification. 해리 크레딧 리포트 입력이므로 최우선.
- 분류 중복 방지: guardian #41168 이 라벨별·에이전트별 분류표를 이미 작성함(done). 단 그 보고의 "최근 24시간 20건"은 실제로는 큐 누적 20건이며 최근 24시간 needs_evidence는 2건(DB 재조회).
[4블록 요구가 빠진 태스크 유형 확정]
- 본문 자체에 4블록 요구가 빠진 유형: 없음(20/20 포함). 빠진 것은 "exit code 0" 리터럴을 명시한 본문(guardian 조회·집계형 5건)이다.
- 지시문이 상충하는 유형: analyst-pm #41067 본문은 "결론, 근거(숫자와 기준일), 판단, 행동 순서"를 지정하면서 4블록은 뒤에 붙였다. AGENT_ROLE_PROMPTS analyst-pm(agent_registry.py 476~504행)도 5개 도메인 섹션을 먼저 두고 4블록은 "별도 추가"다. 도메인 형식을 따르면 4블록이 밀린다.
- 비코딩 조회·집계형:
_completion_evidence_supplement_lines가 검증 줄을 "조회 명령을 적고 출력값을 붙인다"로만 보강하고 exit code 0 을 요구하지 않는다.
[코드 수정 지점] (파일/함수명만, codex 위임)
- scripts/shared/agent_task_quality.py::_completion_evidence_supplement_lines — 비코딩 검증 줄에 exit code 리터럴 요구 추가.
- scripts/server.py::_completion_storage_required_result_gaps ↔ scripts/agent_queue_worker.py::_completion_required_evidence_gaps — exit code 요건 정합화.
- scripts/shared/public_result_formatter.py::completion_report_has_result_and_verification — 사유 세분화(결과 마커 없음/검증 명령 없음/검증 결과 없음).
- scripts/agent_registry.py::AGENT_ROLE_PROMPTS (analyst-pm, analyst-macro) — 도메인 출력 5섹션을 4블록 "결론/근거" 안에 넣는 구조로 순서 명시.
[지시문 보완안 — 문구 수준]
- analyst-pm/macro 태스크 본문: "도메인 판단(포지셔닝·행동)은 '결론:' 줄 안에 한 문단으로 쓰고, 그 뒤 근거/검증/근거파일을 각각 별도 줄로 쓴다. 불릿 자유서술로 시작하지 않는다."
- guardian 조회·집계 태스크 본문: "검증: sqlite3 -readonly ... → N행, 합계 N건 일치, exit code 0" 형태를 예시로 포함.
[리스크]
- 게이트 이중화(워커/서버)로 같은 노트가 한쪽만 통과하는 구조적 불일치: 지시문만 고쳐서는 재발한다.
- 사유 라벨이 뭉뚱그려지면 에이전트가 같은 실수를 반복(analyst-pm 4연속).
- 본 분석의 한계: result_note 원본 요약이 272자로 잘려 있어 #41067 등의 검증·근거파일 유무는 확정하지 못함. 원문은 logs/completion_evidence_blocked.jsonl 의 note_preview(역시 잘림)뿐.
[검증방법]
- KPI: 수정 후 24시간 needs_evidence 신규 건수 중 missing_verification_exit_code 0건, missing_result_or_verification 중 analyst-pm 0건.
- 명령: sqlite3 -readonly /Users/ron/.hermes/data/ops_multiagent.db "select claimed_by,count(*) from bus_commands where status='needs_evidence' and updated_at>=datetime('now','localtime','-24 hours') group by 1"
- 롤백: 수정 후 done 정상 처리율이 떨어지거나 오반려(done 대신 needs_evidence) 증가 시 되돌림.