Codex comienza a cifrar los prompts de subagentes
(github.com/openai)- MultiAgentV2 de Codex CLI cifró los mensajes
spawn_agent,send_messageyfollowup_task, lo que provocó una regresión en la traza de auditoría donde el contenido delegado deja de ser legible para humanos en el rollout padre, el historial y el rastreo - Desde el PR #26210, fusionado el 5 de junio de 2026,
InterAgentCommunication.contentqueda vacío y el payload se guarda solo enencrypted_content, mientras que el historial del receptor y los logs de comunicación también registran texto cifrado - El problema es independiente de la suscripción, el modelo o la plataforma, y afecta a los builds posteriores a la 0.137.0 con MultiAgentV2 activado; es distinto de #26753, que trata fallas de validación de solicitudes en el esquema de herramientas cifradas
- La corrección propuesta consiste en conservar tanto el
messagecifrado para el modelo receptor como un campo obligatorio en texto plano para auditoría local, usando el cifrado o un ID para identificar la entrega y aplicando el mismo límite de tamaño a los datos de auditoría en texto plano - Ya existe un prototipo para
spawn_agenten un commit snapshot separado, pero aún falta aplicar el mismo contrato asend_message,followup_tasky a las pantallas de historial, reproducción y depuración; el issue sigue abierto
Alcance del problema y condiciones de la regresión
- El PR de cambio de cifrado #26210 se fusionó el 5 de junio de 2026, y afecta a los builds posteriores a la 0.137.0 que lo incluyan y tengan MultiAgentV2 activado
- Las herramientas afectadas son
spawn_agent,send_messageyfollowup_task, y no depende de la suscripción, el modelo, el sistema operativo ni el entorno de terminal - Como es una regresión observable en el comportamiento del código ya fusionado, y no en el estado del entorno local, el reporte de Codex doctor no aplica
- Los pasos de reproducción son los siguientes
- Activar MultiAgentV2 en un build que incluya el PR #26210
- Hacer que el modelo invoque
spawn_agent,send_messageofollowup_task - Revisar la tarea del subagente en el rollout padre, el historial o el rastreo
- En lugar del cuerpo de la tarea o del mensaje, solo aparece texto cifrado
Información de auditoría local que desapareció
- El cifrado de la entrega en sí puede entenderse como una mejora de privacidad, pero la implementación actual también elimina el contenido legible por humanos del historial local de rollout, los resúmenes de rastreo y las pantallas de auditoría y depuración del lado padre
- Como resultado, en una revisión posterior del rollout se vuelve difícil responder preguntas como estas
- Qué tarea le asignó
spawn_agental agente hijo - Qué mensaje se envió al subagente
- Por qué se creó un hilo hijo específico
- Qué tarea le asignó
- El issue #26753 trata un problema donde el esquema de herramientas cifradas devuelve errores 400 durante la validación de solicitudes, mientras que este issue se enfoca en la auditabilidad y depurabilidad después de que el esquema ya fue aprobado
- El objetivo no es necesariamente revertir la entrega cifrada, sino mantener el cifrado y al mismo tiempo permitir leer localmente el contenido delegado
Flujo de datos en el código actual
InterAgentCommunication::new_encrypted()inicializacontentcomo cadena vacía y guarda el payload solo enencrypted_content- El constructor normal
new()guarda el texto plano encontenty dejaencrypted_contentvacío - El constructor cifrado hace lo contrario: vacía
contenty coloca el valor enencrypted_content
- El constructor normal
to_model_input_item()pone enResponseItem::AgentMessagesolo el encabezadoNEW_TASKoMESSAGEy el payload cifrado cuando existeencrypted_content- Por eso, aunque en runtime se complete
content, no se persiste automáticamente unResponseItemlegible - Se necesita una ruta de almacenamiento de auditoría local separada
- Por eso, aunque en runtime se complete
communication_from_tool_message()pasa directamente elmessagede la herramienta anew_encrypted(), creando un objeto de comunicación sincontenten texto plano- El procesamiento de argumentos de
send_messageyfollowup_tasksolo deserializatargety elmessagecifrado- Un
messagevacío se rechaza, pero no existe un campo complementario aparte para texto plano - La ruta compartida de entrega de mensajes usa ese valor tal cual para crear
InterAgentCommunication
- Un
Por qué el historial y los logs conservan texto cifrado
- La ruta de registro del lado receptor guarda en el historial de conversación y en el rollout el
ResponseItempara el modelo que generato_model_input_item()- En una comunicación cifrada, ese elemento contiene el payload de entrega cifrado y no un texto de auditoría legible
- En el rollout se persisten juntos
InterAgentCommunicationMetadatay eseResponseItem
- El log estructurado de comunicación también sustituye
contentporencrypted_contentcomocontentdel evento cuandocontentestá vacío - En esta estructura, incluso los campos que deberían mostrarse como mensajes legibles terminan conteniendo texto cifrado, así que no se separa el requisito de mantener el cifrado de entrega del de conservar datos de auditoría local
Contrato de doble contenido propuesto
- El
messagecifrado existente se mantiene como payload de entrega para el modelo receptor - Se añade un campo obligatorio de auditoría en texto plano a cada herramienta de comunicación de MultiAgentV2
spawn_agent:task_messagesend_message,followup_task: un nombre consistente comotask_messageomessage_text
- En el límite del handler, se rechazan valores vacíos para esa auditoría en texto plano
InterAgentCommunicationalmacena ambos valoresencrypted_content: elmessagecifradocontent: una copia legible para auditoría
to_model_input_item()no cambia, de modo que al modelo receptor se le sigue entregando solo el texto cifrado, no la copia local de auditoría- Las invocaciones de herramientas padre y los rollouts persisten el campo en texto plano, y también lo conservan en las aristas de interacción del rastreo estructurado y en los logs locales de comunicación
- La correlación entre la invocación de la herramienta y los elementos de entrega al hijo se determina por texto cifrado o ID, no por coincidencia de texto plano
- El campo en texto plano es metadato de auditoría y no reemplaza el identificador de la entrega cifrada
- Al nuevo campo de auditoría en texto plano se le aplica el mismo límite de tamaño que al mensaje delegado correspondiente, para evitar que el rollout o los elementos de contexto crezcan sin límite
Prototipo de spawn_agent y trabajo pendiente
- El commit snapshot
ignatremizov@df9a7c4implementa la estructura propuesta paraspawn_agent - El esquema v2 de
spawn_agentdefinetask_messagecomo campo obligatorio - Después de realizar la validación de
task_message, se construyen juntos el texto plano y el cifradocontentcontiene la copia de auditoría en texto planoencrypted_contentmantiene el payload cifrado para el modelo receptor
- En el resumen de rastreo del rollout también se separan el contenido de auditoría y el contenido de coincidencia de entrega y se vincula la entrega mediante el cifrado mientras se aplica el contenido de auditoría en texto plano
- El trabajo pendiente es aplicar este mismo contrato de doble contenido a
send_messageyfollowup_task, y hacer que todas las pantallas de historial, reproducción y depuración orientadas al usuario lean la copia de auditoría en lugar del texto cifrado
Criterios de finalización y estado actual
- En el rollout padre y el historial debe poder leerse el texto plano de
spawn_agent,send_messageyfollowup_taskv2 - Incluso con el cifrado activado, el modelo hijo debe recibir solo el payload cifrado de entrega
- Las aristas estructuradas del rastreo de rollout deben incluir
message_contenten texto plano con tamaño limitado - Los logs de comunicación deben usar el contenido de auditoría en texto plano cuando exista, y no sustituir los campos de mensaje legible con texto cifrado
- La reanudación y reproducción deben conservar la copia de auditoría, pero no inyectarla en el contexto del modelo hijo
- El comportamiento existente de comunicación v1 en texto plano no debe cambiar
- Se necesitan pruebas de regresión para las tres herramientas v2 que validen tanto los datos locales de auditoría legibles como la entrada cifrada al modelo receptor
- En la página proporcionada, el issue sigue en estado Open y no hay indicios de que la corrección ya haya sido fusionada en el repositorio principal
1 comentarios
Opiniones en Hacker News
Este título se presta a malentendidos. Más precisamente, significa que Codex empezó a cifrar los prompts de los subagentes para ocultárselos al usuario.
El título original era “Codex starts encrypting prompts, uses ciphertext for inference instead”.
ultrade GPT-5.6 distribuye el trabajo entre varios subagentes. Antes, este modo solo estaba disponible en la UI web, y probablemente correspondía al antiguo modo pro.Si lo entrenaron con rollouts completos de aprendizaje por refuerzo en los que los agentes interactúan entre sí, parece que OpenAI quiere tratar estos prompts como rastros de razonamiento en bruto, para impedir que otros los usen directamente para entrenar.
También hay indicios de que el blob de compresión opaco que devuelve el endpoint dedicado de compresión podría no ser texto, sino una representación en el espacio latente de la conversación; y el hecho de que la fidelidad de compresión de OpenAI sea mucho mayor que la de otros proveedores refuerza esta suposición. Podrían haber aplicado una técnica similar a los prompts de subagentes, y me da curiosidad si también usan blobs cifrados al generar subagentes de distintos tipos de modelo.
Al revisar subagentes y flujos de trabajo de Claude, alguna vez llegué a la conclusión de que “esto no debió ejecutarse en primer lugar”; en cambio, los usuarios de Codex tienen que gastar tokens a ciegas en instrucciones de delegación cifradas y tareas de shell que el orquestador les pasa a los subagentes.
Nosotros también intentamos permitir que las empresas eligieran su proveedor de IA preferido u obligatorio y sus propias claves de API, además de ofrecer un plan de precios simple, pero pronto nos dimos cuenta de que los prompts del backend podían filtrarse a los clientes. Si alguien conseguía rastros de ejecución detallados, podía hacer ingeniería inversa de lo que hacemos con relativa facilidad, así que finalmente abandonamos esa idea.
Ahora entiendo por qué mi herramienta local para inspeccionar sesiones de agentes de programación dejó de funcionar en algunas situaciones.
Es una decisión de diseño interesante: me pregunto cuánta gente aceptará comandos externos cifrados que se ejecutarán en la computadora del usuario.
Ocultar el contenido al usuario mediante cifrado es la misma estrategia que usaba la RIAA con el DRM por miedo a la infracción de copyright; me pregunto si esto también es una decisión hostil hacia el usuario.
Por este tipo de comportamiento sigo usando el endpoint de Chat Completions. OpenAI ha estado empujando sutilmente a los usuarios a salir de Chat Completions y pasar a la Responses API, que es más fácil de ofuscar.
En Chat Completions puedes controlar directamente el procedimiento de razonamiento; si activas funciones experimentales y configuras algunas opciones algo confusas, incluso puedes crear un agente personalizado de búsqueda de árbol de Monte Carlo (MCTS) con el modelo GPT-5.6 actual.
En VS Copilot se puede usar hasta gpt5.5 con el token de API del usuario y la configuración del modelo, pero la familia gpt5.6 no funciona actualmente. Supongo que es porque no fuerza
reasoning_effortanonepara satisfacer el nuevo comportamiento de aumento de barreras de entrada.Todos los modelos nuevos que están saliendo hoy son modelos de razonamiento, así que, según las recomendaciones, hay que usar Responses API.
Me pregunto si podrían bloquear el uso de las suscripciones de GPT en herramientas de ejecución alternativas. Si no lo hacen, no sería un gran problema, y
codex clien sí es una herramienta de ejecución sorprendentemente común y corriente.app-serverexiste justamente para soportar ese tipo de integración, así que para quitarlo de Codex tendrían que desarmar una parte enorme.Yo también uso Codex más que nada porque es muy fácil integrarlo con la API RPC de
app-server, y ahora lo uso casi todo a través de una integración propia, más que mediante la TUI pública de Codex.Pero si cifran en el disco local el input real de inferencia, como los prompts, para que solo el backend de OpenAI pueda verlo, aunque la integración siga siendo fácil, ya no se podrá entender qué está ocurriendo. Me cuesta entender por qué el equipo consideró que esto era una buena opción.
Si OpenAI toma el mismo camino, pienso volver a Claude o comprar otro Spark para ejecutarlo localmente.
https://github.com/openai/codex/blob/main/codex-rs/responses...
El título anterior en HN era muy engañoso, porque sonaba como si se estuviera haciendo inferencia directamente sobre texto cifrado. Para eso haría falta cifrado homomórfico mucho más avanzado que lo que se conoce actualmente.
Antes, el agente enviaba prompts en texto claro al subagente, y también quedaban tal cual en los logs y datos de sesión, así que incluso al usar la función experimental de subagentes se podían abrir los datos y ver el funcionamiento interno.
Ahora, si usas Sol o Terra, se le pasa al subagente un texto cifrado creado por el backend, y el subagente lo vuelve a usar para la inferencia en el backend de OpenAI. Luna no parece estar afectado, y no se cifra toda la sesión, sino solo los mensajes delegados entre agentes.
La inferencia interna de OpenAI no ocurre sobre el texto cifrado, pero para el usuario local solo se ve texto cifrado en vez de texto en claro. Para aclararlo, cambié el título a “Codex starts encrypting sub-agent prompts”.
Recientemente hubo un reporte en Twitter de que un subagente GPT-5.6 borró por error el directorio home de un usuario.
Me pregunto si, al impedir ver qué intenta hacer el subagente, también terminaron fallando las salvaguardas.
https://x.com/mattshumer_/status/2076794038456385546?s=20
Esto es una forma de pasar claves de caché a través del cliente para reducir el uso de tokens. Como se puede eludir fácilmente usando otras herramientas de subtareas, no puede ser una defensa contra la destilación de modelos.
Me pregunto exactamente dónde ocurre el cifrado. Yo pensaba que el agente principal llamaba localmente al subagente, pero me queda la duda de si Codex está estructurado para llamar al subagente desde los servidores de OpenAI antes de llegar al entorno local.
En Sol o Terra, en lugar del prompt se entrega un texto cifrado generado por el backend de OpenAI, y el subagente lo vuelve a usar para la inferencia en el backend. Luna no parece estar afectado, y como no se cifra toda la sesión sino solo los mensajes delegados entre agentes, ahora ese contenido solo puede descifrarlo el backend de OpenAI.
Me preguntaba por qué desde ayer no funcionaba el servicio de reventa del mercado negro chino; probablemente se deba a este cambio.
El objetivo principal parece ser dificultar los intentos de proxyear grandes volúmenes de solicitudes y respuestas de usuarios para usarlos en el entrenamiento de modelos competidores.
Pero es una implementación pésima, porque los usuarios pagos no tienen ninguna forma de averiguar la causa cuando algo sale mal, lo que hace difícil usar bien la función multiagente.