guardian 완료보고 4블록 미비 반려 재발 방지안 (#40850·#40852·#40854·#40856)
guardian 완료보고 4블록 미비 반려 재발 방지안
조사: 2026-10-05 03:36~03:45 KST, cowork(CMD#40857). 코드와 정책 문서는 수정하지 않았다. 수정이 필요한 곳은 6절 "codex 위임 요청서"에 파일·줄·변경 문구로 적었다.
1. [권고]
1순위 — guardian 프롬프트(scripts/agent_registry.py 334행)의 "근거파일" 안내를 고치고, 크론·DB 절대경로 표를 프롬프트에 넣는다.
- 왜: 현재 안내가 <워크스페이스 내 실존 경로>라서 guardian이 워크스페이스 밖 파일(/Users/ron/.hermes/cron/jobs.json)을 워크스페이스 밑 경로로 적는다. #40852가 그 사례다(execution_artifact_path_not_found:/Users/ron/.hermes/workspace/jobs.json, 실제 파일은 /Users/ron/.hermes/cron/jobs.json).
- 기대효과: 오늘 반려 3건 중 경로·검증명령 계열 2건(#40850, #40852, 67%)이 사라진다. 0건 목표.
2순위 — 09-28 방지안(260928_cowork_guardian-exit-code-rejection-prevention.md)의 G1~G4 규칙을 표준 문서와 정책 문서에 실제로 반영한다.
- 왜: 그 문서가 "문서 쪽 정정 필요"로 적은 두 곳이 일주일째 그대로고, G1~G4 규칙이 표준·정책 문서 어디에도 없다(6-B 참조, grep 0건). 같은 원인(missing_verification_exit_code)이 #40854로 재발했다.
- 기대효과: guardian의 missing_verification_exit_code 재발 0건(최근 7일 guardian 9건 중 완료 1건, 11% → 목표 60% 이상).
3순위 — 정직한 "확인 못함" 고지가 반려되는 규칙 점검(6-D). 먼저 재현만 하고, 필요하면 수정한다.
2. [현황] 실측 (조회 2026-10-05 03:36~03:41 KST)
명령 A: sqlite3 -readonly /Users/ron/.hermes/data/ops_multiagent.db "SELECT id,status,updated_at FROM bus_commands WHERE claimed_by='guardian' AND status IN ('needs_evidence','failed') AND updated_at>='2026-10-05 00:00:00' ORDER BY id;" → 3행(40850 failed 01:51, 40852 failed 02:35, 40854 needs_evidence 03:06), exit code 0.
명령 B: 같은 조건에서 claimed_by 조건 없이 created_at>='2026-10-05' → 같은 3행. 오늘자 반려는 전부 guardian이고 다른 에이전트는 0건.
의뢰서의 "4건"과 다른 점: 4번째로 꼽힌 #40856은 DB에서 status=done이다(SELECT id,status FROM bus_commands WHERE id=40856 → done|guardian|2026-10-05 03:21:57). 반려가 아니라 통과했다. 다만 저장된 result_note가 391자에서 "..."로 잘려 있고 검증: 블록이 아예 없으며 근거파일: - bus_commands...처럼 경로 자리가 비었다. 통과했어도 증거는 비어 있다(6-E).
반려 라벨별 건수 (출처: result_note + workspace/logs/completion_evidence_blocked.jsonl 18912~18914행)
| 라벨 | 건수 | 대상 id |
|---|---|---|
| verification_command_unverifiable | 2 | 40850, 40852 |
execution_artifact_path_not_found (/Users/ron/.hermes/workspace/jobs.json) |
1 | 40852 |
| 확인 못함(금지문구 검사) | 1 | 40850 |
| missing_verification_exit_code | 1 | 40854 |
| 합계(행 기준) | 3행, 라벨 5개(중복 포함) |
- 인프라 지연(
llm_infra_failure*) 0건. 전부 제출 형식·증거 문제다. - guardian 최근 7일(
created_at>=datetime('now','localtime','-7 day')): done 1, failed 2, needs_evidence 6 → 9건 중 완료 1건(11%). - 존재 확인:
ls -la /Users/ron/.hermes/cron/jobs.json실존(311,627바이트),/Users/ron/.hermes/workspace/jobs.json→No such file or directory. - 같은 날 #40850 → #40852로 같은 과제를 재발행했지만 같은 사유로 연속 실패했다(재시도 프롬프트에 경로 표가 없었다).
3. guardian 역할 프롬프트 대조 (scripts/agent_registry.py 311~336행)
| 요구 항목 | 프롬프트 현재 문구 | 판정 |
|---|---|---|
| 4블록 라벨 결론/근거/검증/근거파일 | 331~334행에 4줄 모두 있음 | 충족 |
검증에 exit code <숫자> |
333행 → <실제 결과값>, exit code <숫자> |
충족(09-28 이후 이미 수정됨) |
| 실존 경로 인용 | 334행 <워크스페이스 내 실존 경로>:<줄번호> |
부분 충족 — "워크스페이스 안"으로 한정해 밖의 파일을 잘못된 접두어로 적게 만든다 |
| 경로 존재 재확인 지시 | 없음 | 미충족 (표준 §9-3 신설조항 1번이 요구하는 ls/search_files 재확인이 프롬프트에 없음) |
| 점검 대상 경로 표(cron·DB·logs) | 없음 | 미충족 |
| 과제 본문 안내문 복사 금지 | 없음 | 미충족 (#40276 계열) |
| 못 한 것을 별도 라벨로 | 없음 | 미충족 (#40850 "확인하지 못했다" 반려) |
| 금지 문구 | 335행 '정상 확인함'/'이상 없음'/'처리됨' 단독 서술 |
충족 |
4. 원인 분해
- A. 경로 접두어 오류(#40852): 334행 문구와 경로표 부재. 표준 문서 §9-9 경로표는 외사 엔진용이라 크론 장부가 없다.
- B. 검증 명령 재현 불가(#40850, #40852): 점검 대상이 JSON·DB 값인데 "검증:"에 실행 명령 원문 대신 설명문을 적었다. 게이트(
scripts/agent_queue_worker.py322행verification_command_unverifiable)는 검증 필드나 근거파일 필드에서 실존 경로 토큰을 찾지 못하면 반려한다. - C. exit code 누락(#40854): 노트 원문에
exit code N숫자가 없다. 서버 저장 게이트(scripts/server.py814~823행)는 에이전트 구분 없이 숫자 또는 "검증 결과…통과" 문구를 요구한다. 과제 본문이 "합계 12건과 일치하는지"만 요구해 명령 종료코드를 빼먹게 유도했다. - D. "확인 못함" 금지문구(#40850): 노트가 "슬랙 message_id는 어떤 기록에도 남아 있지 않다… 확인하지 못했다"를 결론 단락에 적었고, 워커의 금지문구 목록(
scripts/agent_queue_worker.py4018행("확인 못함", …))이 이를 반려 사유로 잡았다. 09-27 정직 고지 예외(scripts/shared/public_result_formatter.py3582~3588행)는[리스크]/미확인 사항:단락에만 적용되며, 워커 쪽 4018행 검사에 같은 예외가 연결돼 있는지는 이번에 확인하지 못했다(6-D에서 재현 요청). - E. 노트 잘림·경로 소실(#40856): 근거파일 자리가
로 비어 있다. 09-28 문서 5-4(공개용 정리 함수가 절대경로를 지우는지 재현 확인)가 아직 미해결로 보인다. 재현은 하지 못했다. - F. 문서 미반영:
grep -n 'G1\|규칙 G2\|40260\|260928_cowork_guardian' config/agent_completion_submission_standard.md config/completion_evidence_policy.md→ 0건. 표준 문서 579행은 여전히→ exit 1,(서버 게이트가invalid_verification_exit_code로 막는 값), 643행은 여전히 "analyst-fundamental만의 가중 요건".
5. [리스크]
- 단일 장애점: 워커 게이트(
agent_queue_worker.py)와 서버 게이트(server.py)의 exit code 기준이 다르다. 프롬프트만 고쳐도 둘 중 하나는 계속 다른 이유로 막을 수 있다. 그래서 프롬프트 수정 후에도 3일 관찰이 필요하다. - 재시도 루프: 반려된 과제를 같은 프롬프트로 재발행하면 같은 실패가 반복된다(#40850→#40852). 큐 점유와 LLM 호출 비용이 겹친다.
- 문서가 반려되는 예시를 주고 있다(표준 579행). 프롬프트를 고쳐도 문서를 읽고 따라 쓰는 경로가 있으면 재발한다.
- 경로가 정리 단계에서 지워진다면(6-E) 절대경로 규칙이 오히려 빈 칸을 늘릴 수 있다. 재현 결과에 따라 순서가 바뀐다.
- 이번 조사에서 확인하지 못한 것: 워커 4018행과 3582행 예외의 연결 여부, 노트 잘림이 발생하는 단계.
6. codex 위임 요청서 (코드·문서 수정은 codex가 한다. cowork는 수정하지 않았다)
6-A. scripts/agent_registry.py guardian 항목(311~336행) — 우선순위 1
- 대상 줄: 334행
"근거파일: <워크스페이스 내 실존 경로>:<줄번호> \"<원문 인용 1줄>\"\n" - 변경 문구(334행 교체):
근거파일: <점검 대상 실존 경로>:<줄번호> "<원문 인용 1줄>" — 워크스페이스 밖 파일(/Users/ron/.hermes/cron/, data/, logs/)은 반드시 /Users/ron/... 절대경로로 쓴다 - 변경 문구(334행 바로 뒤에 새 줄 추가, guardian 항목 안에서만):
경로 대응: 크론 장부=/Users/ron/.hermes/cron/jobs.json, 실행 이력=/Users/ron/.hermes/cron/executions.db, 큐 DB=/Users/ron/.hermes/data/ops_multiagent.db, 게이트 로그=/Users/ron/.hermes/workspace/logs/completion_evidence_blocked.jsonl(이 로그는 근거파일로 인용하지 않는다). 인용 전 ls -la로 존재를 확인하고 No such file이 있으면 제출하지 않는다. - 변경 문구(같은 위치 새 줄 추가):
검증: 줄에는 이번 세션에서 실제 실행한 명령 원문과 그 명령의 exit code 숫자를 쓴다(예: exit code 0). 과제 본문의 안내문("수행한 일과 현재 상태를…", "exit code 0; 통과")은 결과가 아니므로 복사하지 않는다. 확인하지 못한 것은 결론 단락이 아니라 별도 "미확인:" 줄에 적는다. - 주의: 333행
예: python3 scripts/health_check.py → 전체 통과, exit code 0예시 줄은 8개 에이전트 항목에 같은 문구가 있으므로(240/268/301/333/382/427/472/503행) guardian 항목만 수정한다. - 검증:
python3 -m py_compile scripts/agent_registry.pyexit code 0,python3 -c "from scripts.agent_registry import AGENT_ROLE_PROMPTS as P; print('경로 대응' in P['guardian'])"→ True,grep -n '경로 대응' scripts/agent_registry.py→ 1건.
6-B. config/agent_completion_submission_standard.md — 우선순위 2
- 579행
예) python3 scripts/health_check.py --brief --cron-check → exit 1,→→ exit code 0,로 교체. 이대로 베끼면 서버 게이트가invalid_verification_exit_code로 막는다(scripts/server.py814~820행). - 640~643행 "analyst-macro/technical/pm에는 적용되지 않는 analyst-fundamental만의 가중 요건이다" → "서버 저장 게이트는 전 에이전트에
exit code N숫자 또는 '검증 결과…통과' 문구를 요구한다. 워커 게이트의 숫자 엄격 검사는 codex·analyst-fundamental 한정이다." - §9-3-1 guardian 템플릿 뒤에 §9-3-3 신설: 09-28 문서의 G1(검증 한 줄 형식), G2(경로 표), G3(안내문 복사 금지), G4(제출 전 4항목 점검)를 그대로 옮기고 6-A의 "미확인:" 줄 규칙을 추가.
- 검증:
grep -n 'exit 1,' config/agent_completion_submission_standard.md→ 0건,grep -n '^### 9-3-3' config/agent_completion_submission_standard.md→ 1건.
6-C. config/completion_evidence_policy.md — 우선순위 2
- 마지막 절(v34, 4639행 시작) 뒤에 v35 추가: 이 문서의 2절 표(guardian 오늘 3행, 라벨 5개)와 4절 원인 A~F, 6-A 프롬프트 반영 여부를 기록.
- 검증:
grep -n '^## v35' config/completion_evidence_policy.md→ 1건.
6-D. scripts/agent_queue_worker.py 4018행 "확인 못함" 검사 — 우선순위 3(재현 먼저)
- 재현: #40850 노트(
sqlite3 -readonly /Users/ron/.hermes/data/ops_multiagent.db "SELECT result_note FROM bus_commands WHERE id=40850"은 반려 후 안내문으로 덮여 있으므로 원문은workspace/logs/completion_evidence_blocked.jsonl18912행note_preview)를 금지문구 검사 함수에 넣어,미확인:줄로 옮긴 같은 내용이 통과하는지 확인. - 통과하지 않으면: 3582~3588행
_DISCLOSURE_SECTION_RE예외를 4018행 검사 앞에 연결. 이미 연결돼 있으면 변경 없이 "연결 확인됨"만 보고. - 검증: pytest 신규 케이스 2개(예외 적용/비적용) 통과, exit code 0.
6-E. 노트 잘림·경로 소실 재현 — 우선순위 2(6-A와 병행)
- 재현: #40856 같은 노트(391자, "..." 종료,
근거파일: -`)가 어느 단계에서 만들어지는지 확인. 후보:format_harry_public_brief()/contains_internal_trace()(표준 §9-3 "필수 주의" 지목 함수),server.close_bus_command()(scripts/server.py` 3006행). - 산출: 소실 지점의 파일·함수·줄, 재현 명령과 결과. 지워지는 것이 확인되면 절대경로 보존 수정.
7. [검증방법]
- KPI 1: guardian 반려 비율 — 명령:
sqlite3 -readonly /Users/ron/.hermes/data/ops_multiagent.db "SELECT count(*), sum(status IN ('needs_evidence','failed')) FROM bus_commands WHERE claimed_by='guardian' AND created_at>=datetime('now','localtime','-3 day')"→ 기준(2026-10-05 03:40 조회) 7건 중 6건 반려(86%), 목표 6-A 반영 후 72시간 내 30% 이하. - KPI 2: 경로 오류 —
SELECT count(*) FROM bus_commands WHERE claimed_by='guardian' AND result_note LIKE '%workspace/jobs.json%' AND created_at>=datetime('now','localtime','-3 day')→ 목표 0. - KPI 3:
completion_evidence_blocked.jsonl에서"agent": "guardian"의reasons중verification_command_unverifiable·missing_verification_exit_code→ 반영 후 72시간 0건. - 롤백/재조사 조건: 6-A 반영 후에도 guardian이 같은 사유로 2회 이상 반려되면 프롬프트 문제가 아니라 게이트 코드 문제로 보고 6-D·6-E를 우선 실행한다. 프롬프트 변경으로 다른 에이전트 프롬프트가 바뀌었다면(
git diff또는grep -c비교) 즉시 되돌린다.
8. 근거 목록
- DB 조회:
/Users/ron/.hermes/data/ops_multiagent.dbbus_commands, 조회 2026-10-05 03:36~03:41 KST. - 게이트 로그:
/Users/ron/.hermes/workspace/logs/completion_evidence_blocked.jsonl18912~18914행. - 프롬프트:
/Users/ron/.hermes/workspace/scripts/agent_registry.py311~336행. - 선행 문서:
/Users/ron/knowledge-agent/400-reports/260928_cowork_guardian-exit-code-rejection-prevention.md(G1~G4, 5-4). - 표준·정책:
config/agent_completion_submission_standard.md579행·643행,config/completion_evidence_policy.md4639행(v34).