반려 55건 집계 기반 완료보고 4블록 미준수 방지안 (body 문구 개선안)
반려 55건 기반 4블록 미준수 방지안 (읽기 전용 조회 2026-10-17 14:54 KST)
코드·DB·크론은 수정하지 않았다. 대상 DB: /Users/ron/.hermes/data/ops_multiagent.db (sqlite3 -readonly).
[권고]
1순위 — 검증 줄 exit code 누락·비0 (missing_verification_exit_code 13건 + invalid_verification_exit_code 7건 = 20건, 반려 라벨 지정 건의 약 48%) - 무엇을: 태스크 body 끝의 완료보고 지시를 "라벨 이름 나열"에서 "검증 한 줄 완성형 + 자리표시 값 금지"로 바꾼다. 아래 [body 개선안 A]를 태스크 생성 템플릿에 넣는다. - 왜: 13건이 전부 guardian이고, 대표 #40276은 결론에 "수행한 일과 현재 상태를 완료형 한 문장으로 적는다."라는 자동 보강 안내문을 값으로 그대로 복사했다. 이번 작업 본문에도 같은 자동 보강 4줄이 붙어 있어, 안내문이 값처럼 보이는 구조가 반복 원인이다. invalid 7건(guardian 5, ron 1, cowork 1)은 맨 grep이 일치 0건에서 exit 1이 되거나, 실패한 스크립트의 exit 1을 그대로 검증 줄에 쓴 경우다(#40297 ron). - 기대효과: guardian 신규 exit code 계열 반려를 최근 7일 4건 → 1건 이하.
2순위 — 결과·검증이 통째로 빠지는 서술형 보고 (missing_result_or_verification 11건, 22%) - 무엇을: analyst-macro·analyst-pm 태스크 body에 금융 분석용 4블록 예시 형식과 길이 제한을 넣는다 ([body 개선안 B]). - 왜: 11건 중 analyst-macro 5, analyst-pm 4로 9건이 분석 에이전트다. #40518은 결론에 OAS 83bp 수치는 있으나 근거가 "조회 시각은 2026"에서 잘려 근거·검증이 비었다. 긴 서술이 앞에서 길이를 다 쓰고 뒤 블록이 잘리는 패턴이다. - 기대효과: analyst 계열 신규 반려 7일 0~1건.
3순위 — 라벨 없는 "결과 확인 보류" 일반 문구 (17건, 전체 49건의 35%; guardian 14, cowork 3) - 무엇을: 반려 후 재제출 지시를 body에 넣어 "새 분석 태스크 생성"을 막는다 ([body 개선안 C]). - 왜: 이 17건은 게이트 문구에 구체 라벨이 없어 에이전트가 무엇을 고칠지 모르고, guardian이 반려 분석 태스크를 또 만들어 다시 반려되는 순환이 보인다(#41908·#41913 failed, 둘 다 verification_command_unverifiable). - 기대효과: 재반려 순환 태스크 신규 0건.
[현황] (집계)
집계 SQL 1: SELECT claimed_by,COUNT(*) FROM bus_commands WHERE status='needs_evidence' GROUP BY claimed_by ORDER BY 2 DESC → 5행 | claimed_by | needs_evidence | |---|---| | guardian | 33 | | cowork | 6 | | analyst-macro | 5 | | analyst-pm | 4 | | ron | 1 | 합계 49건. guardian 편중 33/49 = 67%.
집계 SQL 2(라벨): needs_evidence 49건의 result_note에서 "원본 요약:" 앞(게이트가 쓴 반려 문구)만 읽어 라벨을 셌다. 원본 요약 안에 인용된 라벨은 제외했다. | 라벨 | 건수 | 에이전트 | |---|---|---| | missing_verification_exit_code | 13 | guardian 13 | | missing_result_or_verification | 11 | analyst-macro 5, analyst-pm 4, cowork 1, guardian 1 | | invalid_verification_exit_code | 7 | guardian 5, ron 1, cowork 1 | | missing_verification_command | 3 | guardian 3 | | missing_execution_artifact | 2 | guardian 2 | | completion_result_note_forces_rework | 2 | cowork 1, guardian 1 | | verification_command_unverifiable | 1 | cowork 1 | | execution_artifact_path_not_found | 1 | guardian 1 | | 라벨 없음(일반 문구) | 17 | guardian 14, cowork 3 | (한 건에 라벨이 2개 이상 겹치면 중복 집계되므로 합이 49를 넘는다.)
지시문이 지정한 4개 라벨의 건수 — missing_source 0, missing_verification_value 0, missing_execution_value 0, missing_original_verification 0. 이 4개는 현재 게이트가 쓰는 라벨이 아니라(예: 코드에서 missing_verification_exit_code 계열이 scripts/agent_queue_worker.py 7203행에 있음) "상위 3개"는 실제 많이 나온 위 3개 라벨로 정했다.
failed 상태: 현재 6건(#41908, #41909, #41912, #41913, #41916, #41918). 전부 게이트의 재시도 소진 문구(verification_command_unverifiable, 확인 못함, 실행 전 선언문)다. 인프라 사유 라벨은 없다.
직전 guardian 결론(#41915) 재확인 결과
-
41915 result_note(808자): 인프라 지연 사유는 전체 55건 중 #41905 한 건뿐이라고 보고. 저장 파일은 /Users/ron/knowledge-agent/400-reports/261017_hermes_needs_evidence_breakdown.md(5317바이트, 14:19)이고 그 13행에 같은 문장이 있다.
- 불일치 1: #41915 노트는 "근거파일: :1 \"---\""처럼 경로가 비어 있다. 그 4블록 자체가 근거파일 경로 공란으로 완성도가 낮다.
- 불일치 2(미확인 항목): 지금 라이브 DB에서 #41905 행은 조회되지 않는다. bus_commands는 현재 60행(id 40276~41918)이고 41905는 그 사이에 없다. 따라서 "#41905만 인프라"라는 결론은 현재 DB로 재현할 수 없고, 보고서 파일의 기록에만 의존한다. 인프라 지연이 1건이라는 수치는 "라이브 DB로 확인 못 함, 보고서 기록상 1건"으로 취급한다.
- 확인된 부분: needs_evidence·failed 현재 행의 게이트 문구에는 llm_infra_failure 계열 라벨이 0건이다. llm_infra_failure 문자열이 result_note 안에 있는 행은 13건이지만 모두 guardian이 쓴 분석 서술(원본 요약) 안에 인용된 것이다(예: #40825 "인프라 실패(llm_infra_failure)는 0건").
- 결론: 증거 부족(4블록 미준수)이 반려의 압도적 원인이라는 방향은 현재 DB로 확인된다(needs_evidence 49 + failed 6 = 55건, 게이트 문구에 인프라 라벨 0건). 다만 "인프라 1건(#41905)"은 DB에 41905 행이 0건이라 재현되지 않는다(
SELECT COUNT(*) FROM bus_commands WHERE id=41905→ 0).
[body 문구 개선안]
개선안 A — 검증 줄 exit code (패턴 1, guardian 중심)
기존: "완료 보고는 반드시 결론/근거/검증/근거파일 4블록 라벨을 그대로 사용한다. 근거에는 ...를, 검증에는 ...를 적는다."
교체:
"완료 보고의 검증 줄은 한 줄 안에 [실행한 명령] → [결과 수치], exit code 0 을 모두 쓴다. 'exit code는 0이다'처럼 조사를 끼우지 않는다. 라벨 이름(missing_verification_exit_code 등)을 본문에 쓸 때는 그 바로 뒤에 숫자를 붙이지 않는다.
없음·0건을 확인하는 검증은 맨 grep을 쓰지 않는다(일치 0건이면 exit 1이 되어 반려된다). ! grep -rlq '<패턴>' <절대경로>; echo "exit code $?" → 일치 0개, exit code 0 형식으로 쓴다.
검증하려던 스크립트가 실제로 실패(exit 1)했다면 그 실패는 결론에 쓰고, 검증 줄에는 실패 원인을 확인한 별도 조회 명령과 exit code 0을 쓴다.
아래 자동 보강 4줄은 작성 방법 안내일 뿐이다. 안내문 문장을 값으로 복사하지 말고, 각 라벨에 실제로 끝낸 일·명령·결과를 쓴다."
개선안 B — 분석 에이전트 서술형 보고 (패턴 2, analyst-macro·analyst-pm)
교체/추가: "긴 분석은 /Users/ron/knowledge-agent/400-reports/ 파일에 저장하고, result_note에는 4블록만 쓴다. 결론은 250자 이내, 근거는 340자 이내로 쓴다. 한 블록이 길어 다음 블록이 잘리면 반려된다. 근거 형식: <시리즈ID 또는 티커> + <데이터 절대경로> + <조회 YYYY-MM-DD HH:MM KST> + <핵심 수치>. 검증 형식: <명령> → <결과 수치>, exit code 0. 결론의 방향(확대/축소, 상승/하락)은 저장된 시계열 부호와 일치하는지 마지막에 한 번 더 확인한다. 근거파일에는 { } … 이 들어간 잘린 조각을 인용하지 않는다. 실존 파일의 한 구절만 따옴표로 인용한다."
개선안 C — 라벨 없는 일반 보류 (패턴 3, 재제출 규칙)
추가: "이 태스크가 'needs_evidence' 또는 '결과 확인 보류'로 반려되면, 반려 노트의 '차단 사유/누락·차단' 값 하나를 먼저 읽고, 4블록 중 비어 있는 라벨 하나를 채워 같은 태스크로 다시 제출한다. 반려 원인을 분석하는 새 태스크를 만들지 않는다. 차단 사유가 '결과 확인 보류'뿐이면 결론·근거·검증·근거파일 각각에 값이 있는지부터 세어, 값이 없거나 안내문 그대로인 라벨을 고친다. 부재·0건 확인은 개선안 A의 부정형 명령을 쓴다."
[리스크]
- 자동 보강 문구(scripts/orchestrator.py 1146행
[자동 보강: 완료보고 4블록 필수 ...]생성부)가 안내문을 값처럼 보이게 한다. body 문구만 바꾸면 자동 보강이 그 뒤에 다시 붙어 효과가 줄 수 있다. 자리표시 문구 변경은 코드 수정이라 codex 위임이 필요하다(이 제안서에서는 실행하지 않았다). - guardian이 반려 분석 태스크를 스스로 계속 만들어(이번 작업 #41908·#41913·#41915가 같은 주제 3연속) 반려 원인이 된 4블록 문제를 분석하다 같은 반려를 받는 순환이 있다. 단일 에이전트 편중 33/49건.
-
41905가 라이브 DB에서 사라졌으므로 인프라 지연 비율 판단은 파일 기록에 의존한다. 이 숫자를 정책 결정 근거로 쓰기 전에 보존 기록(조회 이력 또는 로그)을 확인해야 한다.
- 개선안 A의 부정형 grep 형식은 이 저장소 기존 규정(config/agent_completion_submission_standard.md 245행 근방)에서 가져온 것이라, 규정과 어긋나면 게이트 해석이 바뀔 수 있다. 시험 전 1건으로 확인한다.
[검증방법]
- 지표: guardian 신규 needs_evidence 중 missing_verification_exit_code·invalid_verification_exit_code 건수. 현재 20건(누적), 목표는 body 적용 후 7일간 신규 1건 이하.
- 명령:
sqlite3 -readonly /Users/ron/.hermes/data/ops_multiagent.db "SELECT claimed_by,COUNT(*) FROM bus_commands WHERE status='needs_evidence' AND created_at>='<적용일>' GROUP BY claimed_by"→ 기대값 guardian 신규 1 이하. - 적용 후 첫 3건 완료보고의 검증 줄에
exit code 0이 같은 줄에 있는지 grep -c로 센다. 기대값 3/3. - 롤백 조건: 적용 후 7일간 반려 신규 건수가 적용 전 7일(guardian 19건 구간, 최근 7일 기준)보다 늘거나, 개선안 문구로 인한 신규 라벨이 나오면 body를 원문으로 되돌린다.