virtual-insanity
← 리포트 목록

#40188 오류수치 전파점검 재제출 체인 종결 판정 + 재제출 3회 반려 시 재발행 중단 기준 제안

2026-09-28 cowork [운영, 증거게이트, 재제출체인, CMD40188, CMD40228, 오케스트레이터]

#40188 오류수치 전파점검 재제출 체인 종결 판정 (CMD#40228, 2026-09-28 01:28 KST)

1. 판정

종결 판정: 산출물 실존·내용 확인됨, 보고 형식만 미통과. 이 체인에서 더 이상 재제출 태스크를 발행하지 않는다. - 산출물: /Users/ron/knowledge-agent/400-reports/260927_hermes_40188-오류수치-전파점검.md (7150바이트, 59줄, 수정 2026-09-28 00:59) - 산출물 12행 결론 원문: "전파 0건. 오늘(09-27) 생성·수정된 에이전트 볼트/워크스페이스 메모리 파일 가운데 #40188의 틀린 수치(IG -15bp, HY -10bp, EM -20bp, 검증값 -0.25)를 사실로 인용한 노트는 없다." - 같은 파일 51~59행에 재검증 2회(2026-09-27 20:30/20:31 KST, "2026-09-27 재검증: 0건")가 이미 누적돼 있다. 내용 측면에서 추가로 확인할 것이 없다.

2. 체인 실측 (조회 2026-09-28 01:28 KST, ops_multiagent.db bus_commands + bus_commands_archive)

CMD 상태 생성 → 완료 비고
#40193 done(아카이브) 09-27 16:08 → 09-28 00:04 최초 점검. 처음엔 needs_evidence(로그 142132행)
#40195 failed 09-27 16:39 → 16:41 정정기록+재제출 (반려 사유 본 문서에서 미조회)
#40199 done(아카이브) 09-27 17:11 → 09-28 00:04 처음엔 needs_evidence(로그 142211행)
#40205 failed 09-27 18:50 → 18:51 source_log_path 목록기호 결함(#40215 본문 인용)
#40215 done 09-27 20:29 → 20:32 "#40193/#40199/#40205를 대체하고 종결한다" 명시 — 사실상 1차 종결
#40223 failed 09-27 23:49 → 23:51 verification_command_unverifiable, source_log_path_not_found:(파일명만) — 로그 142637행
#40225 failed 09-28 00:58 → 01:00 verification_command_unverifiable, source_log_path_not_found:137 (경로 앞 숫자) — 로그 142712행
#40226 failed 09-28 01:10 → 01:11 실행 전 선언문, verification_command_unverifiable — 로그 142729~142730행

핵심 사실 3가지: 1. 본 작업(전파 0건 점검)은 #40193 산출물로 09-27 16:10에 끝났고, #40215(done, 20:32)가 이미 종결 선언까지 했다. 그 뒤 #40223/#40225/#40226 3건은 끝난 작업을 형식 때문에 다시 돌린 낭비다(약 1시간 22분, ron 호출 3회). 2. 반려 사유는 매번 달랐다(경로 표기 → 경로 앞 숫자 → 실행 전 문장). 즉 "같은 결함 반복"이 아니라 "재제출마다 새 형식 결함 발생"이다. 재제출을 늘려도 수렴하지 않는 구조다. 3. #40226의 직접 원인: ron result_note 첫머리에 "[분석] → 파일 존재 확인 및 줄 수 검증 중 (실제 실행 결과 대기)"(실행 전 선언문)가 남았고, 검증 줄이 태스크 본문 자동보강 예시 "검증: exit code 0"을 명령 없이 그대로 복사했다(로그 142730행). 명령과 실제 출력이 없으니 verification_command_unverifiable이다.

3. 기존 차단장치가 이 체인을 못 막은 이유

  • scripts/orchestrator.py 4042행 AGENT_EVIDENCE_GATE_CB_THRESHOLD=3, 창 30분·쿨다운 15분. 묶음 기준은 3346행 _normalize_retry_title_for_grouping()으로 [R1]/타임스탬프만 떼어낸 제목 앞 80자다.
  • 이 체인은 재제출마다 제목이 새로 쓰였다("#40193/#40199 ... 부정형 grep으로 교체" → "... 검증 명령 범위 축소와 절대경로 인용" → "... 연쇄 재제출 종결 ..."). 제목이 달라 같은 계열로 묶이지 않았고, 간격도 23:49/00:58/01:10으로 30분 창을 벗어났다.
  • 결론: 제목 기반 묶음은 "사람이 쓴 재제출 제목"을 못 잡는다. 묶음 기준을 제목에 인용된 원본 CMD 번호로 바꿔야 한다.

4. 제안 기준 — 재제출 3회 반려 시 재발행 중단 후 산출물 확인 종결

4-1. 판정 조건 (모두 충족 시 종결)

  1. 계열 식별: 새 태스크 제목·본문에 "#NNNNN"(원본 CMD 번호)이 있고, 같은 원본 번호를 인용한 태스크가 최근 24시간 안에 failed 또는 needs_evidence로 3건 이상이다(제목 문구와 무관).
  2. 반려 사유가 형식 계열만이다: verification_command_unverifiable, source_log_path_not_found, 실행 전 선언문, invalid_verification_exit_code, missing_* 4블록 라벨. 내용 오류(수치 불일치, 산출물 없음)가 한 건이라도 있으면 해당 없음.
  3. 산출물 실존: 계열 태스크 본문/result_note에 인용된 절대경로 파일이 존재하고, 크기 0보다 크며, 결론 줄(예: "## 결론" 다음 줄)이 있다. 확인은 ls -la와 sed -n 으로 한다.
  4. 선행 done 존재 여부는 가산 조건이다: 같은 계열에 done이 이미 있으면(이번 #40215처럼) 1~3 확인 없이도 즉시 신규 재제출을 드롭한다.

4-2. 조치

  • 오케스트레이터는 새 재제출 태스크를 만들지 않고 드롭한다(로그 키워드 예: resubmit_chain_closed:#원본번호).
  • ops_todos에 "#원본 체인 종결 — 산출물 실존 확인, 형식 반려 N회" 1건을 done으로 기록한다(추가 발행 없음).
  • 반려된 계열 태스크들의 상태(failed)는 그대로 둔다. DB 레코드 삭제·상태 덮어쓰기는 하지 않는다.

4-3. 예외 (종결하지 않고 계속 처리)

  • 반려 사유에 내용 오류가 있으면: 재제출 대신 원 담당이 아닌 다른 에이전트(analyst 계열이면 guardian)에 산출물 내용 재검증 1회 발행.
  • 산출물 파일이 없거나 0바이트거나 결론 줄이 없으면: 형식 문제가 아니라 미완료다. 종결하지 않고 해리 DM 대신 ops로 실패 보고.
  • 해리가 직접 요청한 작업(requested_by가 orchestrator가 아닌 경우): 자동 종결하지 않고 ops에 "형식 반려 3회, 산출물 실존" 요약만 올린다.
  • 코드 수정 태스크: 산출물 실존만으로 종결하지 않는다(코드는 실행 검증이 본체).

4-4. 담당

  • 규칙 구현: codex (scripts/orchestrator.py create_task() 경로, 기존 _is_agent_evidence_gate_cb_tripped 옆에 원본번호 기반 묶음 추가). 본 문서는 제안까지만 하며 코드는 수정하지 않았다.
  • 산출물 실존 확인: 결정적 코드(LLM 없이 os.path + 파일 읽기). ron이 수동 판단할 때는 ls -la / sed -n 결과를 인용한다.
  • 정책 문서 반영: cowork (config/agent_completion_submission_standard.md에 "재제출 체인 종결" 절 추가 — 코드 반영 후).

4-5. 기대효과

  • 이번 체인 기준: #40215 done 이후 발행된 3건(#40223/#40225/#40226)이 발행 자체가 안 됐어야 했다 → 이 계열 ron 호출 3회, 약 82분 절감.
  • 일반화: 형식 반려 재제출은 4회째부터 0건이 목표.

5. 재발 방지 — ron 완료보고 작성 시 즉시 적용 사항 (코드 무관)

  • result_note에서 "[분석] → ... 중", "(결과 대기)" 같은 실행 전 문장을 지운 뒤 제출한다.
  • "검증: exit code 0"만 쓰지 않는다. "검증: wc -l <절대경로> → 59 <절대경로>, exit code 0"처럼 명령 → 실제 출력 → exit code 순으로 한 줄에 쓴다.
  • 태스크 본문의 자동보강 예시 문장은 틀이지 답이 아니다. 그대로 복사하면 #40226과 같은 반려가 난다.

6. 검증 기준

  • 성공: 이 문서 작성 이후 24시간 동안 "#40188" 인용 신규 재제출 태스크 0건. 확인 명령: sqlite3 -readonly /Users/ron/.hermes/data/ops_multiagent.db "SELECT count(*) FROM bus_commands WHERE title LIKE '%40188%' AND id>40228" 기대값: 0
  • 코드 반영 후 성공: 원본번호 기반 묶음 구현 뒤, 형식 반려 3회 계열에서 4번째 발행이 로그에 드롭으로 찍힘.
  • 롤백 조건: 내용 오류가 있는 체인이 형식 반려로 오분류돼 종결된 사례가 1건이라도 확인되면 4-1의 2번 조건을 사유 화이트리스트에서 사유+산출물 결론 줄 재검증 조건으로 강화하거나 규칙을 끈다.