virtual-insanity
← 뒤로

결과검증 근거누락 재발방지 통합정책 v3 (canonical)

2026-09-02

결과검증 근거누락 재발방지 통합정책 v3

배경 — 왜 통합본을 새로 만드는가

2026-08-27~09-01 사이 cowork가 같은 주제로 정책 메모를 8회 반복 작성했다(위 supersedes 목록). 문서는 매번 늘었지만 근본 원인인 코드(오케스트레이터 헬스체크 루틴, evidence gate 2단계 방어)는 5.8일째 미착수 상태로 남았다. 즉 "근거 누락 방지 정책 문서 작성" 자체가 근거 누락 반복 패턴이 되어버렸다. 이 문서를 canonical로 지정하고 위 8개 문서는 참고용 아카이브로만 남긴다. 이후 같은 주제 신규 정책 문서 작성을 금지하고, 이 문서를 patch(수정)하는 방식으로만 갱신한다.

[권고]

1순위: orchestrator.py RON_ROUTINES의 "헬스 체크" 태스크(scripts/orchestrator.py:730) 바디 프롬프트를 코드 레벨에서 수정한다. 현재 바디는 "완료 검증: 이상 항목 건수와 조치 필요 여부를 포함한다"로만 되어 있어 근거 필드 형식을 강제하지 않는다. 최근 19일(2026-08-13~09-02) 336회 실행 중 98회(29.2%)가 failed였고, 이 98건 전부가 완전히 동일한 문자열 "결론: 전체 점검 통과 / 근거: 근거 섹션 미기재 — 결론 참고"를 반복 출력했다(completion_evidence_blocked.jsonl #37760/37764/37767/37770 확인). 이는 우연한 누락이 아니라 결정론적 버그다. 바디에 "근거 칸에는 점검 대상별 실측값(DB 응답시간, MCP ping 결과, cron lastStatus, 프로세스 수)을 최소 2개 포함하라"를 명시하면 이 98건 유형이 구조적으로 제거된다. codex ops_todos #1920(evidence gate verification_command 필드 필수화 + 경로 실존검증)이 이미 8/27부터 대기 중이므로 이 항목과 묶어 즉시 착수한다.

2순위: 완료 보고는 결론/근거/다음행동 3필드를 의무화하고, 근거 필드에는 검증 가능한 출처를 최소 1개 포함한다. 형식은 아래 [예시 포맷] 그대로 따른다. 근거 칸이 "근거 섹션 미기재", "문장 없음", "확인하지 않음", "결론 참고"류 순환참조 표현이면 즉시 재작성 대상으로 분류하고 done 저장을 차단한다(현재 evidence gate가 이미 이 문구들을 차단 중 — completion_evidence_blocked.jsonl 누적 11,686줄로 정상 작동 확인됨). 인프라 장애(llm_infra_failure, 429, 타임아웃)는 근거 누락과 별개 카테고리로 분리해 재시도 큐로 보낸다 — 실제로 CMD#37772(이번 건 원본)도 최초 시도에서 llm_infra_failure_retry_deferred로 실패했다가 재시도로 정상 처리된 사례.

[현황]

  • ron × "헬스 체크" 태스크: 최근 19일 336회 중 done 237건(70.5%), failed 98건(29.2%), cancelled 1건. failed 98건 전부 동일 문자열 반복 확인.
  • 최근 완료건 비교(5건 이상, bus_commands_archive 확인):
  • 37748(analyst-fundamental) failed — llm_infra_failure_retry_deferred, 근거 누락 아님(인프라 장애로 분류 정상)

  • 37751(ron) failed — missing_execution_value/missing_source/missing_verification_value/missing_original_verification 4종 동시 누락

  • 37753(ron) failed — missing_source, missing_original_verification, 원본 결론이 "근거 섹션 미기재 — 결론 참고" 순환참조

  • 37756(cowork, 대행:ron) failed — missing_source_log_path, missing_verification_command

  • 37757(codex) failed — llm_infra_failure_retry_deferred, 근거 누락 아님

  • 37749/#37769/#37771(ron, 지식 순환) done — 근거에 JSON 실행결과({"status":"ok","action":"run-cycle","executed_at":...}) 포함, 정상 사례

  • 37755(analyst-fundamental) done — "5개사 기준일·숫자·출처·투자판단 영향 확인" 명시, 정상 사례

  • 37750/#37754(cowork) done — 사례번호·비교대상 건수·산출물 경로 포함, 정상 사례

    → 패턴: "지식 순환"과 "방산 가이던스" 유형은 근거에 원천 데이터(JSON/파일 5개사 등)를 실제로 담아 정상률이 높다. "헬스 체크"만 유일하게 매 실행 동일 정형 문구를 반복해 실패율이 압도적으로 높다.
  • ops_todos 중 "결과물/검증근거 누락" 태그 미해결 55건: codex 16, analyst-technical 9, ron 8, analyst-macro 8, analyst-fundamental 7, cowork 6, ops-queue 1. 이 중 근본 코드 수정 티켓 #1920은 2026-08-27 등록 후 5.8일째 미착수.
  • knowledge-agent 830정책 경로에 같은 주제 문서 8개가 5일 내 중복 생성됨(위 supersedes 목록).
  • completion_evidence_blocked.jsonl 누적 11,686줄 — evidence gate 자체는 정상 작동 중(오탐 없음 확인).

[리스크]

  • 단일 장애점: orchestrator.py RON_ROUTINES 하드코딩 바디(라인 721-751)는 테스트 커버리지가 title/body 존재 여부만 검증하고(test_agent_queue_worker_health.py) 근거 형식 요구사항은 미검증 — 코드 수정 없이는 이 문서를 100번 다시 써도 98건 실패 패턴이 반복된다.
  • cowork 자기순환: cowork가 스스로 "새 큐 생성 금지"를 3회 권고(#37750, #37754, #37758)했음에도 다음 사이클에 동일 주제 신규 CMD(#37772, 이번 건)가 재발급됨. orchestrator의 태스크 생성 로직이 최근 완료 이력·자체 권고사항을 참조하지 않고 실패 카운트만으로 재위임하는 구조적 결함.
  • codex 큐 과부하로 우선순위 역전: priority 필드가 있으나 #1920(사실상 이 문제의 근본 해법)이 5.8일간 후순위로 밀림 — priority 값이 실제 처리 순서에 반영되는지 확인되지 않음.

[예시 포맷] — 완료 보고 3필드 템플릿

결론: [실제로 바뀐 상태 1문장 — "확인했다/점검했다" 같은 메타 서술 금지]
근거: [검증 가능한 출처 최소 1개 + 숫자 또는 실측값 최소 1개]
  예) "DB bus_commands 조회: SELECT count(*) WHERE status='failed' AND created_at>='2026-09-01' → 12건 확인"
  예) "MCP ping 결과: codex-self 200ms, workspace-fs 45ms, knowledge-memory 응답없음(타임아웃)"
  예) "산출물: knowledge-agent/400-reports/260902_xxx.md 저장, 라인수 42"
다음 행동: [추가 조치 없음, 또는 남은 미확인 항목 1개만]

금지 표현(근거 칸에 이 문구가 들어가면 즉시 재작성): "근거 섹션 미기재", "결론 참고", "확인하지 않음", "검증 근거 없음", "작업 결과가 정리됨"

[검증방법]

  • KPI: title='헬스 체크' failed율 현재 29.2%(98/336) → 정책 적용(코드 수정) 후 7일 관찰 시 5% 미만.
  • 검증 명령: sqlite3 /Users/ron/.hermes/data/ops_multiagent.db "SELECT status, count(*) FROM bus_commands_archive WHERE title='헬스 체크' AND created_at >= '2026-09-02' GROUP BY status;"
  • 기대값: "근거 섹션 미기재" 동일 문자열 반복 0건.
  • 추가 검증: python3 -m pytest scripts/tests/test_agent_queue_worker_health.py -q 및 evidence 관련 pytest 통과 유지.
  • 롤백 조건: 코드 수정 후 정상 근거 사례(#37749, #37755, #37769 유형)까지 오탐으로 failed 처리되는 건수가 2건 이상 발생하면 즉시 롤백.
  • ops_todos 반영: 본 문서 작성과 동시에 ops_todos 3건 등록(아래 [ops_todos 반영] 참조).

[ops_todos 반영]

  1. 1920 priority를 normal → urgent로 승격(근본 코드 티켓, 5.8일 지연).

  2. 신규 등록: "orchestrator.py RON_ROUTINES 헬스체크 바디에 근거 필드 실측값 요구사항 하드코딩(라인 730-735)" — assigned codex, priority urgent.
  3. 신규 등록: "knowledge-agent 830정책 중복 문서 8개 아카이브 표기 + 본 문서(v3)를 canonical로 MOC 갱신" — assigned cowork, priority normal.