← 리포트 목록
외사별일일 태스크 연속 실패(40152~40160) 반려 사유 분류와 재발 방지안
2026-09-27
hermes
[운영, 완료증거게이트, 오케스트레이터, 외사별일일, 재발방지]
외사별일일 태스크 연속 실패(40152~40160) 반려 사유 분류와 재발 방지안
작성 원칙: 이 문서에는 운영체제 시스템 경로 문자열을 한 글자도 인용하지 않는다. 필요할 때는 "시스템 파이썬 절대경로"라고 말로만 쓴다. 코드 수정은 하지 않았고, 코드 변경안은 codex 위임 제안으로만 남긴다.
1. 결론 요약
- 조사 대상 6건(40152, 40153, 40154, 40155, 40158, 40160)은 모두
status=failed다(조회 2026-09-27 10:08 KST, 40152·40153은 bus_commands_archive, 나머지는 bus_commands). - 실패 원인은 두 계열로 나뉜다.
- A. 입력 안전장치 거부: 태스크 본문에 시스템 경로 형태 문자열이 들어가 워커가 실행 전에 거부 — 4건(40152, 40154, 40158, 40160)
- B. 완료 증거 게이트 반려: 완료 보고의 검증/근거 문구가 실존하지 않는 경로로 해석되거나 재현 불가 검증 명령으로 판정 — 2건(40153, 40155)
- 합계 A 4건 + B 2건 = 6건.
- 산출물 자체는 문제가 없었다. 2026-09-27 외사별일일 md 9개(09:34~09:37 생성)와 PDF가
외사 리서치/2026-09-27/00_외사별일일/아래에, 엔진 출력 PDF가hermes-research-sales-engine/output/pdf/house-daily/20260927/아래에 실존한다. 즉 실패는 "작업 실패"가 아니라 "명령문/보고문 형식 실패"다.
2. 6건 A/B 분류표
| CMD | 담당 | 제목 요지 | 분류 | 반려 라벨(원문 요지) | 직접 원인 |
|---|---|---|---|---|---|
| 40152 | ron | 외사별일일 사전 생성(JP모건 144A 반영) | A | refused: payload references system path (시스템 파이썬 절대경로) | 본문 실행 명령을 시스템 파이썬 절대경로로 적음 |
| 40153 | ron | [재발행] 외사별일일 사전 생성 | B | verification_command_unverifiable | 검증란이 "exit code 0" 한 줄뿐, 재현 가능한 명령+결과값 쌍이 없음 |
| 40154 | ron | 사전 생성물 검증 및 완료보고(#40153 보완판) | A | refused: payload references system path (시스템 파이썬 절대경로) | 반려 사유를 설명하려고 본문에 거부된 경로 문자열을 그대로 재인용 |
| 40155 | ron | 기존 산출물 검증 완료보고 | B | execution_artifact_path_not_found: 워크스페이스 최상위의 가상 _외사별일일.md |
검증란의 "현재 폴더 기준 와일드카드 패턴" 명령이 게이트에서 워크스페이스 최상위 가상 파일로 해석됨 |
| 40158 | cowork | 4연속 실패 원인 정리와 재발 방지 정책안 | A | refused: payload references system path (시스템 파이썬 절대경로) | 원인 분석 본문에 거부 사유 문자열을 그대로 인용 |
| 40160 | cowork | 방지안 재작성(시스템 경로 인용 금지) | A | refused: payload references system path (시스템 경로 접두어 + 한글 조사) | "인용 금지" 대상을 설명하면서 시스템 경로 접두어 자체를 본문에 적음 — 접두어만으로도 걸림 |
집계: A = 4건(40152, 40154, 40158, 40160), B = 2건(40153, 40155), 합계 6건.
참고: 작업 지시문은 A를 3건(40154, 40158, 40160)으로 적었으나, 워커 로그 실측상 40152도 같은 사유로 거부됐고 40153은 B 계열(재현 불가 검증)이다. 이 표는 실측을 따른다.
3. 원인 구조
A. 입력 안전장치(워커 실행 전 거부)
- 위치:
scripts/agent_queue_worker.py7480행return False, f"refused: payload references system path {m}"(7475~7480행의 절대경로 검사 루프). - 동작: 태스크 본문에서 슬래시로 시작하는 토큰을 뽑아, 워크스페이스 밖이면서 운영체제 시스템 디렉터리 접두어로 시작하면 무조건 거부한다. 접두어 비교라 뒤에 한글 조사가 붙어도(40160) 걸린다.
- 악순환: 반려 사유를 설명하는 후속 태스크가 반려 문자열을 그대로 인용 → 같은 안전장치에 다시 걸림(40154 → 40158 → 40160, 3연속).
- 오케스트레이터는 이 거부를 재시도 대상에서 제외만 할 뿐(
scripts/orchestrator.py3427행 제외 키워드 목록), 본문 생성 단계에서 막지는 않는다.
B. 완료 증거 게이트(작업 후 저장 차단)
- 40155 위치:
scripts/agent_queue_worker.py6712행gaps.append("execution_artifact_path_not_found:" + ...)— 보고문에서 추출한 경로 중 실존하지 않는 것이 있으면 반려. - 40155 실측: 보고문 결론·근거·근거파일은 모두 실존 산출물(예: 2026-09-27 jpmorgan 외사별일일 md 21행)을 인용했으나, 검증란에 "현재 폴더 기준 와일드카드 패턴" 명령을 넣었고 게이트가 이를 워크스페이스 최상위의
_외사별일일.md라는 가상 파일로 해석했다(그 파일은 실존하지 않음, 10:08ls확인). - 40153 실측: 검증란이 "exit code 0" 단독 →
verification_command_unverifiable.
4. 재발 방지안
규칙 1 — 오케스트레이터 태스크 본문 작성 규칙(A 계열 차단)
- 실행 명령은 항상 상대 명령으로 쓴다:
python3 scripts/...또는cd <워크스페이스/볼트 경로> && python3 scripts/.... 시스템 파이썬 절대경로·시스템 디렉터리 경로는 본문에 쓰지 않는다. - 과거 반려 사유를 설명할 때도 거부된 경로 문자열을 재인용하지 않는다. "시스템 파이썬 절대경로 때문에 입력 안전장치에 걸렸다"처럼 말로만 쓴다. 슬래시로 시작하는 시스템 접두어는 한 글자라도 적지 않는다.
- 허용되는 절대경로는 워크스페이스 경로와 에이전트 볼트(
/Users/ron/knowledge-agent/...) 경로뿐이다. - codex 위임 제안(코드 변경, 이번 작업에서는 미실행):
- 제안 C1:
scripts/orchestrator.py의 태스크 생성 경로(create_task 직전)에 본문 사전 점검을 넣는다. 워커 7475~7480행과 같은 접두어 목록으로 검사하고, 걸리면 시스템 파이썬 절대경로를python3로 치환하거나 태스크 생성을 보류하고 ops 로그에 남긴다. 같은 접두어 목록을 한 곳(공유 모듈)에 두어 워커와 오케스트레이터가 함께 쓰게 한다. - 제안 C2: 워커 거부 문구에서 걸린 경로 원문을 그대로 되돌려주지 말고 "시스템 경로 1건" 같은 마스킹 문구로 바꾼다. 거부 문구가 result_note → 오케스트레이터 → 다음 태스크 본문으로 복제되는 연쇄(40154/40158/40160)를 끊는다.
- 제안 C3: 코드 수정 태스크이므로 라우팅은 codex로 고정한다(AGENTS.md 2026-09-21 라우팅 규칙).
규칙 2 — 완료 보고 근거파일 실존 산출물 인용 규칙(B 계열 차단)
- 근거파일에는 실제로 있는 산출물만 인용한다. 외사별일일은 다음 둘 중 하나를 쓴다.
- 엔진 출력 PDF:
/Users/ron/knowledge-agent/400-reports/hermes-research-sales-engine/output/pdf/house-daily/<YYYYMMDD>/<YYMMDD>_<house>_외사별일일.pdf - 볼트 md:
/Users/ron/knowledge-agent/400-reports/외사 리서치/<YYYY-MM-DD>/00_외사별일일/<YYMMDD>_<house>_외사별일일.md:<줄번호> - 검증란에는 와일드카드·현재 폴더 기준 상대 패턴을 쓰지 않는다. 대신 폴더 절대경로에 대한
ls -la <폴더>결과(파일 수·크기 범위)와 특정 파일 1개에 대한grep -c결과를 쓴다. - 검증란은 "명령 → 실제 결과값" 쌍으로 쓴다. "exit code 0" 단독은 금지(40153).
- 제출 직전 근거파일·검증에 적은 모든 경로를
ls로 한 번 더 확인한다(config/agent_completion_submission_standard.md18행 "근거파일에 적은 경로를 지금 search_files/find로 직접" 재확인 규칙과 동일). - codex 위임 제안(코드 변경, 미실행):
- 제안 C4:
scripts/agent_queue_worker.py6522행_reported_workspace_paths가 별표(와일드카드)를 포함한 토큰을 경로 후보에서 제외하거나, 와일드카드면 실제 매칭 결과가 1개 이상인지로 판정하도록 고친다. 40155는 실존 산출물을 정확히 인용했는데도 검증란 패턴 때문에 반려된 오탐 성격이 있다.
5. 검증 기준(적용 후)
- KPI 1: 향후 7일간 bus_commands에서 반려 라벨 "refused: payload references system path" 건수 0건(현재 2026-09-27 하루 4건).
- KPI 2: 외사별일일 관련 태스크의
execution_artifact_path_not_found·verification_command_unverifiable반려 0건(현재 하루 2건). - 확인 명령:
sqlite3 -readonly /Users/ron/.hermes/data/ops_multiagent.db "SELECT count(*) FROM bus_commands WHERE result_note LIKE '%payload references system path%' AND created_at >= date('now','-7 day')"→ 기대값 0. - 롤백 조건: 제안 C1 적용 후 정상 태스크가 오케스트레이터 단계에서 보류되는 오탐이 하루 1건 이상이면 사전 점검을 경고 전용(보류 없이 로그만)으로 되돌린다.
6. 근거 출처
- DB:
/Users/ron/.hermes/data/ops_multiagent.dbbus_commands(40154~40160), bus_commands_archive(40152, 40153), 조회 2026-09-27 10:08 KST - 워커 로그:
/Users/ron/.hermes/logs/agent-queue-ron.log141567행(40152), 141589~141590행(40153), 141605행(40154);/Users/ron/.hermes/logs/agent-queue-cowork.log177602행(40158), 177620행(40160) - 게이트 차단 로그:
logs/completion_evidence_blocked.jsonl18565행(40153), 18566행(40155) - 코드:
scripts/agent_queue_worker.py6522행·6712행·7480행,scripts/orchestrator.py3427행 - 정책:
config/agent_completion_submission_standard.md18행·115행·224행,config/completion_evidence_policy.md
관련: [[AGENTS]] [[agent_completion_submission_standard]] [[completion_evidence_policy]]