virtual-insanity
← 리포트 목록

지식사랑방 인사이트 생성 태스크 증거 게이트 반복 반려 방지안

2026-09-30 hermes [증거게이트, 지식사랑방, bus_commands, 제안서, cowork]

지식사랑방 인사이트 생성 태스크 증거 게이트 반복 반려 방지안

조회 기준: 2026-09-30 KST, ops_multiagent.db 읽기 전용 + agent-queue 로그 + 워커 함수 재현 실행. 소스 파일은 수정하지 않았다.

0. 먼저 바로잡을 사실 (guardian 보고 CMD#40479 대조)

  • guardian은 "세 건(40473, 40475, 40478) 모두 지식사랑방 증거 게이트 반려"라고 했지만 실측은 다르다.
  • CMD#40473은 bus_commands에 존재하지 않는다 (SELECT count(*) WHERE id=40473 → 0). 40470~40473 구간도 0행.
  • CMD#40475는 지식사랑방이 아니라 "미국 IG A등급·BBB등급 OAS 스프레드 파일 기반 재평가"(analyst-macro)다.
  • 지식사랑방 인사이트 생성 태스크는 오늘 CMD#40478 한 건뿐이다 (제목 '%지식사랑방 인사이트%' 오늘 failed 1건).
  • 파이프라인 3단계는 실제로 정상 실행됐다: discovery_filter rc=0 (Candidates 701, Passed 5), 결과 로그 logs/insight-pipeline-result-20260930T095310.log 실존(10,250 byte).

1. 반려 사유 표 (SELECT id,status,claimed_by,result_note ... WHERE id IN (40473,40475,40478) → 2행)

CMD 제목 claimed_by status 반려 라벨 실제 원인
40473 (DB에 없음) - - - guardian 보고의 오기
40475 미국 IG A·BBB OAS 파일 기반 재평가 analyst-macro failed verification_command_unverifiable 검증 칸이 실행 명령 없이 "파이썬 스크립트로 세 소스를 직접 파싱했고 … 통과"라는 서술뿐. 재현 가능한 명령 1줄이 없음
40478 오늘의 지식사랑방 인사이트 생성 ron failed missing_next_action_section 아래 2절

2. 40478 누락 지점 특정 (핵심)

ron이 낸 원문 note(logs/agent-queue-ron.log 146263행)는 4블록이 모두 있었다. - 결론: 파이프라인 3단계 실행 완료 - 근거: 종료코드 0, Candidates 701건 / Passed 5건 / Discoveries 49건 / notes_scanned 80건, 결과 로그 경로 - 검증: 명령 + exit code 0 - 근거파일: source_log_path, verification_command - 다음 행동: 추가 조치 없음

그런데도 게이트가 missing_next_action_section으로 막았다. 4블록 누락이 아니다. 원인은 정책 문서와 워커 코드의 모순이다.

  • config/agent_completion_submission_standard.md 116행은 다음 행동에 "후속 조치 또는 '추가 조치 없음'"을 허용한다(152행 예시도 "다음 행동: 추가 조치 없음").
  • 그러나 scripts/agent_queue_worker.py의 _MINIMAL_RESULT_EMPTY_VALUE_RE(4172행)가 "추가 조치 없음"을 빈 값 패턴으로 등록해 두었고, _completion_required_named_section_gaps(7167행)가 명시된 "다음 행동" 섹션 값이 이 패턴이면 missing_next_action_section을 낸다.
  • 재현 실행 결과 (_completion_required_named_section_gaps에 동일 4블록 + 다음 행동만 바꿔 호출):
  • "다음 행동: 추가 조치 없음" → ['missing_next_action_section']
  • "다음 행동: 없음" → ['missing_next_action_section']
  • "다음 행동: 결과를 [인사이트] 보고서에 반영" → []
  • "다음 행동: TOP3 인사이트를 해리 리포트에 전달" → []
  • 즉 문서가 시키는 대로 쓴 "추가 조치 없음"이 오히려 반려 사유다. 같은 함정이 지식사랑방 외 모든 태스크에서 재발 가능하다.

추가로 오케스트레이터 템플릿(scripts/orchestrator.py 821행 이하 "오늘의 지식사랑방 인사이트 생성")은 결론/근거/검증/근거파일만 요구하고 "다음 행동" 칸에 관한 지시가 없다. 그래서 수신 에이전트가 문서 예시를 따라 "추가 조치 없음"을 쓴다. 템플릿은 interval_minutes 360이므로 오늘 15:53 이후 같은 태스크가 다시 발행되면 같은 반려가 재발한다.

3. [권고]

1순위 (즉시, 문구만): 오케스트레이터 태스크 본문과 수신 에이전트 지침에 아래 문구를 추가한다. 코드 수정 전에도 재반려를 막는 임시 조치다. 기대효과: 지식사랑방 태스크 missing_next_action_section 반려 1건/일 → 0건.

재발 방지 문구 초안 (본문 끝에 삽입):

다음 행동 칸은 "추가 조치 없음"이나 "없음"으로 쓰지 않는다(현재 게이트가 빈 값으로 본다).
이번 결과로 실제로 할 후속 1건을 구체적으로 쓴다.
예) 다음 행동: TOP3 인사이트를 [데이터][인사이트][액션] 형식으로 지식사랑방 일일 리포트에 반영하고, 다음 발행(6시간 뒤)에서 Passed 건수 변화를 비교한다.
검증 칸은 실제 실행한 명령 1줄을 그대로 적고 문장 끝에 exit code 0을 붙인다. 산문 설명("스크립트로 파싱했다")만 쓰면 verification_command_unverifiable로 반려된다.
근거파일의 source_log_path는 이번 실행이 남긴 logs/insight-pipeline-result-<시각>.log 실경로를 적는다.

2순위 (분석 태스크 공통): analyst-macro 등 분석 에이전트 지침에 "검증: python3 -c '...' 같은 재현 가능한 명령 원문 + exit code"를 넣는다. 40475는 명령 없이 서술만 써서 막혔다. 기대효과: verification_command_unverifiable 반려 감소.

4. 코드 수정 항목 — codex 위임 후보 (cowork는 수정하지 않음)

  • 후보 A (1순위): scripts/agent_queue_worker.py _completion_required_named_section_gaps(7167행). "다음행동" 키에 한해 "추가 조치 없음"을 유효 값으로 인정하도록 예외 처리. _MINIMAL_RESULT_EMPTY_VALUE_RE(4172행)는 근거/검증 칸 판정과 다른 곳(4196, 4206행)에서도 쓰이므로 정규식 자체를 바꾸지 말고 다음행동 칸 판정에서만 우회한다. 회귀 테스트: "추가 조치 없음"은 통과, "없음"·빈 값은 계속 반려.
  • 후보 B (2순위): scripts/orchestrator.py 지식사랑방 루틴 템플릿(821행 이하)에 "다음 행동:" 지침 줄 추가(위 문구). 코드 문자열 수정이라 codex 몫이다.
  • 대안 (A를 하지 않는 경우): config/agent_completion_submission_standard.md 116·152행의 "추가 조치 없음" 허용 문구를 삭제해 문서와 코드를 일치시킨다. 다만 다른 예시(문서 내 다수)와 충돌하므로 A를 권고한다.

5. [현황] 수치

  • 오늘 지식사랑방 인사이트 태스크: 1건(40478) failed, 실제 파이프라인은 3단계 모두 rc=0.
  • 오늘 반려 라벨: missing_next_action_section 1건, verification_command_unverifiable 1건. 40473은 없음.
  • 정책 문서 분량: completion_evidence_policy.md 4,697행, agent_completion_submission_standard.md 1,162행 — 이 표준 문서가 "추가 조치 없음"을 허용하는 반면 게이트는 거부하는 모순이 문서에 명시되지 않았다.

6. [리스크]

  • 모순이 살아 있는 한 "추가 조치 없음"으로 끝내는 모든 성공 태스크(헬스체크·run-cycle 등)가 언제든 반려될 수 있다. 다른 태스크가 왜 통과했는지는 이번에 확인하지 않았다(미확인).
  • guardian 분류가 존재하지 않는 CMD를 인용했다. 원인 분류 태스크는 SELECT 결과 행 수를 근거로 남기도록 지침 보강이 필요하다.
  • 반려는 status=failed로 처리돼 지식사랑방 인사이트가 실제 산출됐는데도 실패로 집계된다.

7. [검증방법]

  • 지표: 지식사랑방 인사이트 태스크 반려 건수, 라벨별 집계.
  • 명령: sqlite3 -readonly /Users/ron/.hermes/data/ops_multiagent.db "SELECT id,status,substr(result_note,1,80) FROM bus_commands WHERE title LIKE '%지식사랑방 인사이트 생성' AND created_at>='2026-09-30' ORDER BY id"
  • 기대값: 다음 발행분(15:53 이후)이 status=done, completion-evidence-block 로그 0건 (grep -c "completion-evidence-block" logs/agent-queue-ron.log 증가 없음).
  • 코드 후보 A 적용 후: 재현 스크립트에서 "다음 행동: 추가 조치 없음" → [] 이고 "없음" → ['missing_next_action_section'].
  • 롤백 조건: 문구 삽입 후에도 동일 라벨로 2회 연속 반려되거나, 후보 A 적용 후 빈 값 반려 테스트가 깨지면 되돌린다.