#40188 오류수치 전파점검 재제출 체인 종결 판정 + 재제출 3회 반려 시 재발행 중단 기준 제안
#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. 판정 조건 (모두 충족 시 종결)
- 계열 식별: 새 태스크 제목·본문에 "#NNNNN"(원본 CMD 번호)이 있고, 같은 원본 번호를 인용한 태스크가 최근 24시간 안에 failed 또는 needs_evidence로 3건 이상이다(제목 문구와 무관).
- 반려 사유가 형식 계열만이다: verification_command_unverifiable, source_log_path_not_found, 실행 전 선언문, invalid_verification_exit_code, missing_* 4블록 라벨. 내용 오류(수치 불일치, 산출물 없음)가 한 건이라도 있으면 해당 없음.
- 산출물 실존: 계열 태스크 본문/result_note에 인용된 절대경로 파일이 존재하고, 크기 0보다 크며, 결론 줄(예: "## 결론" 다음 줄)이 있다. 확인은 ls -la와 sed -n 으로 한다.
- 선행 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번 조건을 사유 화이트리스트에서 사유+산출물 결론 줄 재검증 조건으로 강화하거나 규칙을 끈다.