Codex가 서브에이전트 프롬프트 암호화를 시작함

4 hours ago 2
  • Codex CLI의 MultiAgentV2가 spawn_agent, send_message, followup_task 메시지를 암호화하면서, 부모 롤아웃·이력·추적에서 위임 내용을 사람이 읽을 수 없게 되는 감사 추적 회귀가 발생함
  • 2026년 6월 5일 병합된 PR #26210 이후 InterAgentCommunication.content는 비워지고 페이로드가 encrypted_content에만 저장되며, 수신자 이력과 통신 로그도 암호문을 기록함
  • 문제는 구독·모델·플랫폼과 무관하고 MultiAgentV2가 활성화된 0.137.0 이후 빌드에 해당하며, 암호화 도구 스키마의 요청 검증 실패를 다루는 #26753과는 별개임
  • 제안된 수정은 수신 모델용 암호화 message와 로컬 감사용 필수 평문 필드를 함께 보관하되, 전달 식별에는 암호문이나 ID를 사용하고 평문 감사 데이터에는 동일한 크기 제한을 적용하는 방식임
  • spawn_agent용 프로토타입은 별도 스냅샷 커밋에 구현됐지만 send_message와 followup_task, 이력·재생·디버그 화면까지 같은 계약을 적용하는 작업은 남아 있으며, 이슈는 아직 Open 상태

발생 범위와 회귀 조건

  • 암호화 변경 PR #26210은 2026년 6월 5일 병합됐으며, 이를 포함하고 MultiAgentV2를 활성화한 0.137.0 이후 빌드가 대상임
  • 영향받는 도구는 spawn_agent, send_message, followup_task이며 구독, 모델, 운영체제, 터미널 환경과는 무관함
  • 로컬 환경 상태가 아니라 병합된 코드 동작에서 확인되는 회귀이므로 Codex doctor 보고서는 해당하지 않음
  • 재현 절차는 다음과 같음
    1. PR #26210을 포함한 빌드에서 MultiAgentV2를 활성화함
    2. 모델이 spawn_agent, send_message, followup_task 중 하나를 호출하게 함
    3. 부모 롤아웃·이력·추적에서 서브에이전트 작업을 확인함
    4. 작업이나 메시지 본문 대신 암호문만 확인됨

사라진 로컬 감사 정보

  • 암호화된 전달 자체는 프라이버시 강화로 이해할 수 있지만, 현재 구현은 로컬 롤아웃 이력, 추적 축약, 부모 측 감사·디버그 화면에서도 사람이 읽을 수 있는 내용을 제거함
  • 그 결과 사후 롤아웃 검토에서 다음 질문에 답하기 어려움
    • spawn_agent가 자식 에이전트에 어떤 작업을 부여했는지
    • 서브에이전트에 어떤 메시지를 보냈는지
    • 특정 자식 스레드가 왜 생성됐는지
  • 이슈 #26753은 암호화 도구 스키마가 요청 검증 과정에서 400 오류를 반환하는 문제이며, 이번 이슈는 스키마가 승인된 뒤의 감사 가능성과 디버깅 가능성을 다룸
  • 목표는 암호화 전달을 반드시 되돌리는 것이 아니라, 암호화를 유지하면서 로컬에서 위임 내용을 읽을 수 있게 하는 것임

현재 코드의 데이터 흐름

  • InterAgentCommunication::new_encrypted()는 content를 빈 문자열로 초기화하고 페이로드를 encrypted_content에만 저장함
    • 일반 생성자 new()는 평문을 content에 저장하고 encrypted_content를 비워 둠
    • 암호화 생성자는 반대로 content를 비우고 encrypted_content에 값을 넣음
  • to_model_input_item()은 encrypted_content가 있으면 NEW_TASK 또는 MESSAGE 머리말과 암호화 페이로드만 ResponseItem::AgentMessage에 넣음
    • 따라서 런타임의 content만 채워도 읽을 수 있는 ResponseItem이 자동으로 영속화되지 않음
    • 별도의 로컬 감사 저장 경로가 필요함
  • communication_from_tool_message()는 도구의 message를 new_encrypted()에 직접 넘겨 평문 content가 없는 통신 객체를 만듦
  • send_message와 followup_task 인자 처리는 target과 암호화된 message만 역직렬화함
    • 빈 message는 거부하지만 별도의 평문 동반 필드가 없음
    • 공유 메시지 전달 경로는 이 값을 그대로 InterAgentCommunication 생성에 사용함

이력과 로그에 암호문이 남는 이유

  • 수신 측 기록 경로는 to_model_input_item()이 만든 모델용 ResponseItem을 대화 이력과 롤아웃에 저장함
    • 암호화 통신에서는 이 항목에 읽을 수 있는 감사 문구가 아니라 암호화 전달 페이로드가 포함됨
    • 롤아웃에는 InterAgentCommunicationMetadata와 해당 ResponseItem이 함께 영속화됨
  • 구조화 통신 로그도 content가 비어 있으면 encrypted_content를 이벤트의 content로 대체함
  • 이 구조에서는 사람이 읽는 메시지로 표시되는 필드에도 암호문이 들어가므로, 단순히 전달 암호화를 유지하는 것과 로컬 감사 데이터를 보존하는 요구가 분리되지 않음

제안된 이중 콘텐츠 계약

  • 기존 암호화 message는 수신 모델 전달용 페이로드로 유지함
  • 각 MultiAgentV2 통신 도구에 필수 평문 감사 필드를 추가함
    • spawn_agent: task_message
    • send_message, followup_task: task_message 또는 message_text처럼 일관된 이름
  • 핸들러 경계에서 빈 평문 감사 값을 거부함
  • InterAgentCommunication에는 두 값을 함께 저장함
    • encrypted_content: 암호화된 message
    • content: 사람이 읽을 수 있는 감사 사본
  • to_model_input_item()은 변경하지 않아 수신 모델에는 로컬 감사 사본이 아닌 암호문만 전달
  • 부모 도구 호출과 롤아웃에는 평문 필드를 영속화하고, 구조화 추적의 상호작용 간선과 로컬 통신 로그에도 이를 유지함
  • 도구 호출과 자식 전달 항목의 상관관계는 평문 일치가 아니라 암호문 또는 ID로 판별함
    • 평문 필드는 감사 메타데이터이며 암호화 전달의 식별자를 대체하지 않음
  • 새 평문 감사 필드에는 대응하는 위임 메시지와 동일한 강제 크기 제한을 적용해 롤아웃이나 컨텍스트 항목이 무제한으로 커지지 않게 함

spawn_agent 프로토타입과 남은 작업

완료 조건과 현재 상태

  • 부모 롤아웃과 이력에서 v2 spawn_agent, send_message, followup_task의 평문을 읽을 수 있어야 함
  • 암호화가 활성화된 경우에도 자식 모델은 암호화된 전달 페이로드만 받아야 함
  • 구조화된 롤아웃 추적 간선에는 크기가 제한된 평문 message_content가 들어가야 함
  • 통신 로그는 평문 감사 콘텐츠가 있으면 이를 사용하고, 읽을 수 있는 메시지 필드에 암호문을 대신 넣지 않아야 함
  • 재개·재생은 감사 사본을 보존하되 이를 자식 모델 컨텍스트에 주입하지 않아야 함
  • 기존 평문 v1 통신 동작은 바뀌지 않아야 함
  • 세 가지 v2 도구 모두에 대해 읽을 수 있는 로컬 감사 데이터암호화된 수신 모델 입력을 함께 검증하는 회귀 테스트가 필요함
  • 제공된 페이지에서는 이슈가 Open 상태이며, 상위 저장소에 수정이 병합됐다는 결과는 없음
Read Entire Article