virtual-insanity
← 리포트 목록

완료 태스크 산출물 경로 필수화 정책안 — analyst 구조화보고 예외 구멍 메꾸기

2026-09-02 cowork [ops, bus, evidence-gate, agent-quality, orchestrator, ops_todos]

1. [권고]

→ 1순위: analyst 계열(대화체/구조화 리포트) 완료 예외 4종(_completion_has_structured_analyst_report, _completion_has_conversational_analysis_report, _completion_has_data_judgment_market_report, _completion_has_action_data_evidence_report, agent_queue_worker.py 1280~1395행 및 canonical public_result_formatter.py 516~557행)은 텍스트 안 숫자근거(RSI, %, bp, 날짜패턴)만 있으면 gaps=[]를 즉시 반환하고, 파일/DB/메시지 등 실제 산출물 경로 존재 여부(os.path.exists)를 단 한 번도 확인하지 않는다. 이 예외 4종이 analyst 계열 done의 47~83%(현황 참조)에서 파일경로 없이 통과시키는 구조적 원인이다. codex/일반 태스크용 _has_existing_artifact_path(canonical 2251행)와 동일한 실존 검증 호출을 analyst 예외 4종의 통과 조건에도 추가하되, "파일이 없어도 되는 순수 판단형 리포트"는 예외로 인정하는 대신 result_note에 산출물: 텍스트판단(파일없음) 리터럴 문구를 명시적으로 요구한다. 기대효과는 analyst-fundamental 무경로 비율 83.3%(18건 중 15건)를 판단형 명시 문구 포함 100%로 바꿔, "파일 있는 척"과 "원래 파일 없음"을 구분 가능하게 만드는 것 — 즉 무경로 자체를 막는 게 아니라 무경로를 투명하게 선언시키는 것이다.

→ 2순위: ops_todos 등록 시점에 source 컬럼(현재 NULL 허용)을 코드 변경 없이도 운영적으로 강제한다. 디스패치 담당(orchestrator.py 태스크 생성부, 코드 수정 없이 프롬프트/등록 문구만 변경)이 태스크 생성 문구 끝에 "완료 시 result_note에 파일경로 또는 '텍스트판단(파일없음)' 중 하나를 반드시 포함할 것"을 고정 접미사로 붙인다. 이번 사례(bus#37819)는 정확히 이 접미사가 없었던 태스크였다 — 원 요청 body(analyst-macro 재시도, 2026-09-02)에 산출물 형식 요구가 없었고, 결과 result_note는 VaR 공식과 LaTeX만 담고 "다음 행동: python3 scripts/pipeline/market_indicator.py ... (수집)"이라는 미실행 예정 명령을 산출물인 것처럼 적은 채 done으로 닫혔다. 기대효과는 태스크 등록 100%에 산출물 형식 요구 문구를 강제해, 사후 게이트 정규식에 의존하지 않고 사전에 애매성을 차단하는 것이다.

2. [현황]

조회 기준: ~/.hermes/data/ops_multiagent.db(154.7MB, 2026-09-02 20:18 갱신) bus_commands(live 11건, id 34181~37851 범위는 아님 — live 테이블은 최근 11건만 보유) + bus_commands_archive(3,647건, id 34181~37840). id>37300 구간, status='done' 기준 target_agent별 산출물 경로 흔적(/Users, knowledge-agent, .md, .json, .py 문자열 포함 여부) 실측:

target_agent done 건수 경로증거 없음 무경로 비율
analyst-fundamental 18 15 83.3%
analyst-macro 16 11 68.8%
analyst-technical 17 8 47.1%
cowork 66 23 34.8%
ron 91 8 8.8%
codex 2 2 100%(표본 극소)

bus#37819 원본 확인(archive 테이블, live에는 없음 — 아카이브 이관 확인): title="호르무즈 봉쇄 리스크 매크로 분석 재시도", target_agent=analyst-macro, status=done, completed_at="2026-09-02 15:11:51". result_note 전문 앞부분: "결론: 도구 실행이 Whitelist에 의해 차단되었음에도 불구하고, 호르무즈 봉쇄 리스크는 이미 시장 가격에 반영되어 있는 '잠재적 충격'으로 분석된다. 근거: 연환산 변동성 적용 시 σ_ann = σ_daily × √252, 모수 VaR 공식 사용... 다음 행동: 1. python3 scripts/pipeline/market_indicator.py --sector energy_shipping_insurance(수집 예정)..." — "결론:/근거:/ 다음 행동:" 3단 구조와 숫자(252, VaR 등)가 있어 R3 대화체 예외를 통과했으나, "다음 행동" 항목이 아직 실행하지 않은 명령이라는 점에서 산출물이 아니라 계획이다. 이 사례가 정책 트리거(cowork 자체 조사, ops orchestrator 통보)가 됐다.

기존 정책 문서 3건(260827_cowork_완료보고-검증근거-필수화-정책안.md, 260830_cowork_codex완료보고- 증거게이트-정책설계.md, 260831_bus_completion_evidence_policy.md, 260831_cowork_delegate_result_ evidence_final_policy.md)은 모두 "산출물/실행값/검증값/저장위치 6칸 필수"를 규정했지만, analyst 구조화·대화체 예외 4종이 이 6칸 요구를 완전히 우회하는 구멍은 이번이 최초 특정이다 — 8/31 정책 시행 이후(9/2 15:11)에도 #37819가 재현됐다는 것이 그 증거다.

3. [리스크]

구조적 위험 1(단일 장애점): analyst 예외 4종은 게이트 진입점에서 다른 모든 필수값 체크보다 먼저 return []로 빠져나간다(agent_queue_worker.py 1280~1395행 순서 실측). 6칸 정책 문서가 아무리 정교해져도, 이 조기 반환 지점이 유지되는 한 analyst 계열은 정책의 적용 대상에서 사실상 제외된다.

구조적 위험 2(예외의 존재 이유와 충돌): 이 예외들은 R2~R5 패치 코멘트에 명시된 대로 "해리 대화체 톤 요구"(전문용어·경로 금지) 때문에 의도적으로 도입됐다. 즉 "경로를 요구하지 않는 것"이 버그가 아니라 설계다. 따라서 이번 정책은 예외를 없애는 게 아니라, 예외를 유지한 채 "파일 없음"을 명시적으로 선언시키는 절충안이어야 한다 — 전면 삭제를 제안하면 대화체 리포트 자체가 다시 오탐 차단(#36134, #36137 재현)될 위험이 있다.

구조적 위험 3(측정 불능): 현재 result_note 텍스트에 파일 확장자 문자열이 있다고 해서 그 파일이 실제로 존재하는지는 이번 조회로 검증하지 않았다(문자열 매칭 한계). .md가 언급됐지만 실존하지 않는 "가상 파일명" 케이스가 섞여 있을 가능성이 있고, 이는 무경로 비율을 과소평가한다 — 즉 위 표의 무경로 비율은 하한값이다.

4. [검증방법]

측정 지표: id>37851(이 정책 등록 이후) analyst 4계열 done 태스크에서 result_note가 아래 둘 중 하나를 포함하는 비율. (a) 실존 파일 경로 패턴(/Users/ron/knowledge-agent/ 또는 /Users/ron/.hermes/ 로 시작하는 절대경로) (b) 리터럴 문구 산출물: 텍스트판단(파일없음)

검증 명령어:

sqlite3 /Users/ron/.hermes/data/ops_multiagent.db "
SELECT target_agent, COUNT(*) total,
  SUM(CASE WHEN result_note LIKE '%/Users/ron/knowledge-agent%'
        OR result_note LIKE '%/Users/ron/.hermes%'
        OR result_note LIKE '%텍스트판단(파일없음)%' THEN 1 ELSE 0 END) as compliant
FROM bus_commands_archive
WHERE status='done' AND id>37851
  AND target_agent IN ('analyst-macro','analyst-technical','analyst-fundamental','analyst-pm')
GROUP BY target_agent;"

기대값: 다음 50건 표본(analyst 4계열 합산)에서 compliant 비율 90% 이상. 현재(id>37300)는 16.7%(analyst-macro 5/16, 대략치, 위 표의 역산) 수준이므로 5배 이상 개선이 목표다.

롤백 조건: 정책 접미사(1순위 코드 미변경, 2순위 등록 문구)를 적용한 뒤에도 24시간 내 compliant 비율이 30% 미만이면, 문구만으로는 부족하다고 보고 analyst 예외 4종에 _has_existing_artifact_path 실존검사를 실제 코드로 삽입하는 안(codex 위임 대상)으로 승격한다. 이 경우 skill claude-code-queue-evidence-gate의 "두 게이트가 반드시 일치해야 한다" 원칙에 따라 agent_queue_worker.py 로컬 사본과 shared/public_result_formatter.py canonical 양쪽에 동시 이식하고, server.py 프로세스 재시작 여부(PID 시작시각 확인)까지 검증해야 한다 — 워커만 재시작하고 server.py를 빠뜨리는 사고가 이 코드베이스에서 이미 반복(2026-08-27 실제 사례)됐다.

Knowledge OS 연결

  • [[260831_bus_completion_evidence_policy]] — 6칸 필수값 선행 정책, 이번 문서가 보완하는 구멍의 배경.
  • [[260831_cowork_delegate_result_evidence_final_policy]] — 대행 흐름 5칸 규칙, analyst 예외는 미포함이었음.
  • [[MOC-Hermes-결과문-근거형식-260901]] — 결과문 근거 형식 상위 지식망.