virtual-insanity
← 리포트 목록

guardian 완료보고 4블록 미비 반려 재발 방지안 (#40850·#40852·#40854·#40856)

2026-10-05 cowork [ops, bus_commands, evidence-gate, guardian, agent_registry, 설계제안, codex-위임]

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.py 322행 verification_command_unverifiable)는 검증 필드나 근거파일 필드에서 실존 경로 토큰을 찾지 못하면 반려한다.
  • C. exit code 누락(#40854): 노트 원문에 exit code N 숫자가 없다. 서버 저장 게이트(scripts/server.py 814~823행)는 에이전트 구분 없이 숫자 또는 "검증 결과…통과" 문구를 요구한다. 과제 본문이 "합계 12건과 일치하는지"만 요구해 명령 종료코드를 빼먹게 유도했다.
  • D. "확인 못함" 금지문구(#40850): 노트가 "슬랙 message_id는 어떤 기록에도 남아 있지 않다… 확인하지 못했다"를 결론 단락에 적었고, 워커의 금지문구 목록(scripts/agent_queue_worker.py 4018행 ("확인 못함", …))이 이를 반려 사유로 잡았다. 09-27 정직 고지 예외(scripts/shared/public_result_formatter.py 3582~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.py exit 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.py 814~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.jsonl 18912행 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.db bus_commands, 조회 2026-10-05 03:36~03:41 KST.
  • 게이트 로그: /Users/ron/.hermes/workspace/logs/completion_evidence_blocked.jsonl 18912~18914행.
  • 프롬프트: /Users/ron/.hermes/workspace/scripts/agent_registry.py 311~336행.
  • 선행 문서: /Users/ron/knowledge-agent/400-reports/260928_cowork_guardian-exit-code-rejection-prevention.md (G1~G4, 5-4).
  • 표준·정책: config/agent_completion_submission_standard.md 579행·643행, config/completion_evidence_policy.md 4639행(v34).