codex 완료 보고 증거 게이트 — 필수 필드 구조화 정책안
codex 완료 보고 증거 게이트 — 필수 필드 구조화 정책안
[권고]
1순위: codex 완료 보고를 4개 명명 필드(실행커맨드/실행로그발췌/변경diff/검증결과) 구조로 강제하고, 자동 반려 기준을 "필드 존재 여부"로 단순화한다.
근거 — agent_queue_worker.py(623행 _codex_four_evidence_gaps)와 public_result_formatter.py(2578행 codex_four_evidence_gaps, 2026-08-30 새벽 이식 완료)에 4대증거 정규식 게이트가 이미 코드로 존재한다. 그런데도 codex_result_rejected.jsonl 전체 34건 중 15건(44%)이 "보고된 파일이 실제로 없음"(경로 허위 기재), 18건(53%)이 "빈 근거/실행 전 선언문"으로 반려됐다 — 즉 게이트는 정상 작동 중이나, codex가 반복적으로 같은 두 유형의 미실행 보고를 계속 제출하는 것이 문제다. 지금은 이 4대증거를 자유서식 텍스트에서 정규식으로 "찾아내는" 방식이라 판정 로직이 5,000줄 넘는 파일에 예외가 계속 누적되는 구조(R1~R32 패치 이력, 회귀 1회 이미 발생 — R1-1)다. 대신 codex 완료 보고 템플릿 자체를 4개 라벨 필드로 강제하면(실행커맨드:, 실행로그:, 변경diff:, 검증결과:) 판정이 "라벨 존재 + 비어있지 않음 + 라벨 뒤 값이 플레이스홀더가 아님" 수준의 단순 파싱으로 축소되어, 정규식 완화 예외가 새로 추가될 때마다 발생하는 게이트 드리프트 위험(레퍼런스 문서 81건 중 다수가 "두 게이트 불일치" 진단)이 구조적으로 줄어든다. 기대효과: 신규 예외 패치 빈도(현재 8/27~8/30 사흘간 6건 이상)를 라벨 파싱 전환 후 목표 1건 이하로 감소.
2순위: 실행커맨드/변경diff 필드에 기재된 파일 경로는 완료 저장 전 os.path.exists()로 실존 여부를 검증하고, 실패 시 즉시 needs_evidence로 반려한다.
근거 — 오늘(08-30) #37288(08:24→08:26 실패, /Users/ron/.hermes/workspace/tests/unit/test_public_result_formatter.py 부재), #37284(08:06→08:09 실패, 동일 유형)가 정확히 이 패턴이다. 이미 4982행에 _completion_has_source_log_path 계열 경로실존 체크("보고된 파일이 실제로 없음: " + missing_paths)가 존재해 실제로 두 건 모두 정상 차단됐다 — 이 부분은 "만들 정책"이 아니라 "이미 작동 중인 방어선"이다. 다만 현재는 판정 후 결과가 codex_result_rejected.jsonl에만 남고 bus_commands.failed 행으로는 3건/7일만 잡혀(로그 34건 대비) 재시도 루프에서 대부분 소리 없이 재제출되고 있다 — 반려 즉시 재제출을 막는 duplicate_failed_guard(#37289에서 확인된 정상 동작: "최근 2시간 내 동일 title failed 이력 존재"로 자동 cancelled)를 모든 반려 사유에 예외 없이 적용해 동일 미실행 보고의 무한 재시도를 원천 차단해야 한다. 기대효과: 동일 사유 반복 재시도 건수(현재 #37288/#37284처럼 18분 간격 재발)를 duplicate guard 전면 적용 후 0건으로 축소.
[현황]
codex_result_rejected.jsonl(전체 기간, 34건): 빈근거/선언문 18건(53%), 파일부재 15건(44%), 질문패턴 1건(3%). 두 가지 유형이 97%를 차지 — 신규 게이트 유형이 아니라 기존 두 규칙만 정교화해도 대부분 커버 가능.bus_commands테이블 target_agent='codex', 최근 7일:failed2건(#37288, #37284),cancelled1건(#37289, duplicate_failed_guard). rejected 로그 34건 대비 DB 최종 실패행은 3건뿐 — 격차 31건은 재시도 루프 중 소리 없이 소멸(재제출 성공 또는 로그만 남고 상위 태스크가 다른 id로 재생성)한 것으로, 실패 이력이 bus_commands 단일 소스로 완전히 집계되지 않는 가시성 공백이 확인됨.- 코드 근거:
agent_queue_worker.py623행(로컬),public_result_formatter.py2578행(canonical) — 4대증거 게이트 이식은 2026-08-30 새벽에 이미 완료(레퍼런스:2026-08-30-codex-4-evidence-gate-ported-to-prf-plus-negated-class-line-bug.md). 단, 이식 시 발견된 정규식 개행 버그([^\n]→[\s\S])는 수정됐으나, "옛 3필드 표준 포맷(수정파일/검증명령/검증결과)이 stdout발췌·diff리터럴 부재로 정당하게 차단되는지"는 cowork/해리 정책 승인 대기 상태로 남아 있다(test_post_complete_allows_normal_evidenced_result여전히 FAILED). - 경로실존 체크(
_completion_has_source_log_path, agent_queue_worker.py 886행 / public_result_formatter.py 2172행)는 2026-08-27 1순위 정책 집행으로 이미 라이브 반영(pytest 36 passed, 8워커 kickstart 확인) — 이번 요청(#37290)의 "실행 로그/exit code 필수 첨부"는 상당 부분 기 구현 상태이며, 남은 것은 이를 "정책 문서로 명문화 + 라벨 구조화로 단순화"하는 작업이다.
[리스크]
- 단일 장애점: 4대증거 판정 로직이
agent_queue_worker.py(5,000줄+) 한 파일과public_result_formatter.py두 곳에 이중 유지되는 구조가 그대로 유지된다. 라벨 구조화로 전환해도 두 파일이 각자 파서를 갖는 한 "TWO GATES 드리프트" 위험(레퍼런스 81건 중 다수 사례)은 완전히 사라지지 않는다 — 파싱 함수도 반드시 한쪽이 다른 쪽을 호출하는 단일 정본화(canonical import) 원칙을 그대로 적용해야 한다. - 의존관계: 라벨 필드 강제는 codex 전용으로 한정해야 한다. 동일 게이트가 ron/cowork/analyst 4종의 완료 판정과 경로를 공유하므로, codex용 4개 라벨을 다른 에이전트 결과 포맷(결론/근거/다음행동 구조)에 그대로 적용하면 정상 완료 리포트가 오탐 차단될 위험이 있다 — target_agent 분기를 명시적으로 유지해야 한다(이미 623행 함수명이
_codex_four_evidence_gaps로 codex 전용임을 확인). - 행동 근본원인 미해결: 게이트가 정상 작동해도(44%+53%=97% 정탐) codex가 미실행 보고를 반복 생성하는 근본 원인(모델 환각/타임아웃 시 허위 완료 생성 경향)은 게이트만으로 해결되지 않는다. 반려율 자체를 낮추려면 codex 실행 타임아웃/재시도 정책(별도 스킬
hermes-orchestrator-circuit-breakers영역)과 연계 검토가 필요 — 이 정책안은 "반려 기준 명확화"까지만 다루고 "반려율 자체 감소"는 범위 밖임을 명시한다.
[검증방법]
- 측정 지표: (a)
codex_result_rejected.jsonl반려 사유 중 "빈근거/선언문"+"파일부재" 비중(현재 97%, 라벨 구조화 적용 후 1주일 목표 70% 이하로 감소 — 나머지는 라벨 자체 누락이라는 더 단순한 사유로 흡수), (b) 동일 title 반복 실패 간격(현재 #37288처럼 18분, 목표 duplicate_guard로 2시간 쿨다운 100% 적용). - 검증 명령:
python3 -c "import json,collections; c=collections.Counter(json.loads(l)['reason'] for l in open('/Users/ron/.hermes/workspace/logs/codex_result_rejected.jsonl'))"로 정책 적용 전/후 사유 분포 비교.sqlite3 ~/.hermes/data/ops_multiagent.db "select id,status,result_note from bus_commands where target_agent='codex' and created_at>=datetime('now','-7 day')"로 duplicate guard 적용률 확인. - 기대값: 정책 적용 2주 후 codex 대상 반려 로그 중 라벨 누락형 반려 비율 90% 이상(사유 판별이 정규식 추론에서 라벨 파싱으로 단순화됐다는 증거), 동일 title 2시간 내 재실패 0건.
- 롤백 조건: 라벨 구조화 도입 후 정상 완료된 codex 작업(diff는 있으나 stdout 발췌 형식이 라벨과 다른 legacy 포맷)이 48시간 내 5건 이상 오탐 차단되면 즉시 라벨 필수화를 "권장(warn)"으로 완화하고 기존 정규식 완화 규칙과 병행 운영으로 되돌린다.
작성: cowork | 근거 원본: ~/.hermes/workspace/logs/codex_result_rejected.jsonl(34건 전수), ~/.hermes/data/ops_multiagent.db bus_commands(id 37284/37288/37289/37290), ~/.hermes/workspace/scripts/agent_queue_worker.py(598~990행), ~/.hermes/workspace/scripts/shared/public_result_formatter.py(2172~2610행), skill claude-code-queue-evidence-gate 레퍼런스 81건 중 2026-08-27/29/30 3건