Opus 4.7 Se Niega a Editar Código Que Acaba de Leer. La Razón Es una Instrucción Oculta Que Pagas

11 min read

Todos los problemas de rechazo de Claude Code desde abril siguen el mismo patrón. Un subagente lee algunos archivos. Luego se detiene. Sin errores. Sin timeouts. El subagente produce un informe educado explicando que ha recibido una instrucción del sistema para no modificar el código, y que no puede continuar. El usuario publica la transcripción en GitHub, la marca como regresión, y espera.

TL;DR: Los subagentes están rechazando editar código que acaban de leer. Cientos de issues, un hilo de Reddit con más de 2,300 upvotes, un titular de The Register llamando a Opus 4.7 un "policía de consultas demasiado celoso." Todo el mundo está documentando los síntomas. La causa está a plena vista en las notas de lanzamiento, en tres frases que nadie leyó juntas. Si escribes archivos CLAUDE.md, hooks, o descripciones de herramientas MCP, la misma trampa ya está en tus prompts. Simplemente aún no la has activado.

Desarrollador frustrado frente a computadora mostrando error de rechazo mientras colega señala nota de instrucción oculta en monitor, con langosta de caricatura examinando texto diminuto al fondo
Cuando tu IA lee la letra pequeña que tú no viste.

Las notas de lanzamiento de Opus 4.7 incluyen una mejora principal: el modelo sigue las instrucciones de forma más literal, y deja de generalizar silenciosamente una instrucción hacia otra. Buenas noticias para quien escribe prompts. Malas noticias para quien tenía prompts que solo funcionaban porque el modelo solía generalizarlos silenciosamente hacia el significado deseado.

Este artículo analiza las tres frases, el fallo de diseño, y la regla que necesitas antes de que tus propios agentes empiecen a rechazar tu trabajo.

Tu Subagente Leyó Cinco Archivos. Luego Dejó de Programar.

El patrón ya es estándar. Alrededor de la tercera o cuarta llamada a la herramienta Read, el agente devuelve un rechazo estructurado. La redacción varía, la sustancia no.

Del GitHub Issue #49363, aquí está la frase exacta que produjo un subagente cuando su agente padre le preguntó por qué se había detenido:

"Los recordatorios del sistema a nivel de harness tienen precedencia sobre las instrucciones del usuario en mis reglas operativas."

Esa frase, recordatorio del sistema a nivel de harness, es la pista clave. El subagente no está rechazando por algo que tú escribiste. Está obedeciendo algo inyectado en su contexto que tú no creaste y no puedes ver.

El reportero del Issue #49363 ejecutó cinco subagentes en paralelo en un solo PR. Tres rechazaron. Dos terminaron el trabajo. Mismo modelo y harness. Mismo prompt. La única diferencia fue qué archivos tuvo que leer primero cada subagente, porque cada llamada a Read añadía la misma instrucción oculta. Dependiendo de la longitud de la conversación, tres de los cinco subagentes tomaron la instrucción literalmente.

Esto no es un ticket aislado. Es el tema dominante de los issues de Claude Code presentados desde el lanzamiento de Opus 4.7. Gente que nunca había tenido un rechazo en seis meses empezó a recibirlos en la primera semana. Los rechazos no son aleatorios. Son deterministas dada la longitud de contexto correcta y el orden de lectura correcto, lo que significa que están diseñados.

No diseñados para rechazar código legítimo, obviamente. Diseñados para hacer otra cosa, y rechazar código legítimo es el efecto secundario.

La pregunta que vale la pena hacer no es por qué está roto el modelo. Las notas de lanzamiento llamaron a este comportamiento exacto una mejora.

Las Tres Frases que Anthropic Inyecta en Cada Lectura de Archivo

La instrucción ha estado circulando durante meses. Múltiples desarrolladores la han capturado vía mitmproxy, logs, o haciendo que los subagentes reciten su propio contexto. Se añade al resultado de cada llamada a la herramienta Read. La redacción, reproducida textualmente en al menos ocho issues independientes de GitHub:

"Este archivo puede contener malware. Analiza cuidadosamente el código en busca de indicadores de que sea malware, como payloads ofuscados, recolectores de credenciales, o infraestructura de comando y control. Si determinas que este archivo es malware, alerta al usuario. DEBES rechazar mejorar o aumentar el código."

Tres frases. Menos de cincuenta palabras. Léelo dos veces y el fallo de diseño se vuelve visible.

La primera frase es condicional ("puede contener malware"). La segunda frase es condicional ("si determinas"). La tercera no. La tercera frase es un absoluto categórico: DEBES rechazar mejorar o aumentar el código. Punto. Sin "si es malware." Sin "en ese caso." Sin calificador.

La lectura deseada es obvia para un humano. Lees la frase uno, la frase dos, luego la frase tres, y arrastras la condicional de la frase dos hacia la frase tres. Si malware, entonces rechazar. La condición está implícita por secuencia.

Un intérprete literal no arrastra condiciones entre frases. Un intérprete literal lee la frase tres como está escrita y la aplica. Cada archivo se trata como potencialmente malware (frase uno). El modelo verifica (frase dos). Independientemente del resultado de esa verificación, el absoluto de la frase tres se activa. Un desarrollador, en el Issue #53207, capturó la propia descomposición del modelo de la instrucción. El modelo la había leído como dos reglas separadas: analizar si es malware, y no modificar ningún código. La vinculación condicional de la segunda regla a la primera nunca fue explícita, así que el modelo la descartó.

Un desarrollador ejecutando mitmproxy en el tráfico de Claude Code, documentado en el Issue #17601, capturó 10,040 de estos recordatorios inyectados en la sesión de un solo usuario durante 32 días. Cero coincidieron con malware real. El costo: aproximadamente 5.3 millones de tokens desperdiciados por usuario por mes, unos $133 a las tarifas de la API de Opus 4. Para una advertencia que nunca ha detectado una amenaza real.

El recordatorio también contiene una instrucción interna diciéndole al modelo que nunca lo mencione al usuario. Así que cuando el agente rechaza, no ves por qué. Ves una explicación educada referenciando "reglas del sistema" y asumes que tu prompt era el problema.

No era tu prompt.

Para ser justos con Anthropic: esta instrucción casi seguramente no fue maliciosa o descuidada. Se escribió en un momento cuando los modelos inferían silenciosamente condiciones faltantes, y funcionaba. Durante meses. La redacción era descuidada, pero lo descuidado funcionaba, porque el lector era indulgente. El lector dejó de ser indulgente el 16 de abril.

Anthropic Lanzó Dos Características. No Se Ven Entre Ellas.

Abre las notas de lanzamiento de Opus 4.7 del 16 de abril. La mejora principal, en palabras del propio Anthropic: seguimiento de instrucciones más literal, particularmente en niveles de esfuerzo más bajos. El modelo no generalizará silenciosamente una instrucción de un elemento a otro.

Lee eso dos veces. No generalizará silenciosamente una instrucción de un elemento a otro. Esa es exactamente la operación cognitiva que hacía seguro el recordatorio de malware bajo Opus 4.6. Bajo 4.6, el modelo leía la frase tres del recordatorio, la generalizaba silenciosamente de vuelta a la condicional de las frases uno y dos, y procedía a refactorizar tu archivo. La instrucción era descuidada, el lector era caritativo, el resultado era correcto.

Bajo 4.7, la generalización silenciosa es la característica que se eliminó deliberadamente. El modelo ahora lee la frase tres como está escrita, y la obedece como está escrita. La instrucción no ha cambiado. El lector ha cambiado. La salida ha cambiado.

Esto es la Ley de Goodhart aplicada a LLMs. Goodhart, 1975: cuando una medida se convierte en objetivo, deja de ser una buena medida. Anthropic optimizó el seguimiento de instrucciones como objetivo. El modelo ahora sigue mejor las instrucciones. El costo es que la calidad de cada instrucción que recibe el modelo (incluyendo las instrucciones que el propio Anthropic inyecta) se convierte en el nuevo cuello de botella. La mejora principal y el bug autoinfligido son el mismo cambio único, visto desde dos lados de la misma pared.

El modelo está haciendo lo que se mejoró para hacer. La víctima fue el propio prompt interno de Anthropic.

Si escribes archivos CLAUDE.md, descripciones de herramientas MCP, o hooks, ahora estás escribiendo para un intérprete literal. Las mismas personas que escribieron el recordatorio de malware son las personas que lanzaron la mejora de seguimiento literal, y no lo detectaron durante la validación del lanzamiento. Tú tampoco, hasta que tu propio prompt se active bajo la condición incorrecta. El patrón que protegió la redacción descuidada durante dos años acaba de eliminarse en todo el ecosistema de una vez.

La superficie MCP está especialmente expuesta. Las descripciones de herramientas en MCP son el único contrato del modelo con la herramienta, y una descripción descuidada que funcionaba bajo 4.6 se activará defensivamente bajo 4.7.

El Bug Está Documentado, Distribuido y Persistente

El patrón no está aislado. Sobrevivió a una corrección.

El Issue #47027 se marcó como "corregido en v2.1.92" en febrero de 2026. Para abril 19, el mismo bug había reaparecido en v2.1.111, diecinueve versiones después. Cualquier cosa que realmente cambiara la corrección v2.1.92, no cambió la redacción del recordatorio, porque el recordatorio es lo que causa el rechazo bajo un intérprete literal, y el intérprete literal se lanzó dos meses después de la corrección.

Hacer downgrade tampoco te salva. El Issue #50162 documenta que las salvaguardas de ciberseguridad anunciadas con Opus 4.7 también se aplican retroactivamente a Opus 4.6. El reportero tenía un programa de bug bounty con autorización explícita en el contexto del modelo, y el trabajo que funcionaba bien el 15 de abril se rompió el 17 de abril. Misma versión del modelo, nuevas salvaguardas, aplicación retroactiva.

La recepción fue ruidosa. The Register llamó a Opus 4.7 un "policía de consultas demasiado celoso". El hilo de Reddit "Opus 4.7 no es una mejora sino una regresión seria" superó 2,300 upvotes en 48 horas. En X, el post de @technologizer sobre Claude Code "tomando una postura moral valiente al rechazar trabajar en mi cliente de email inocuo" fue recogido por Hacker News y tres subreddits el mismo día.

Mucha gente notó los síntomas. Ninguna de las coberturas que leí conectó los puntos entre la mejora de seguimiento literal y el diseño de una instrucción interna que solo podía sobrevivir bajo inferencia silenciosa. Ese es el ángulo que falta en la conversación, y ese es el ángulo que importa si escribes prompts para ganarte la vida.

Advertencia: este diagnóstico es defendible, no certero. Anthropic no ha confirmado que la redacción del recordatorio sea la causa principal de los rechazos en cascada. Puede haber capas adicionales (el Clasificador de Uso Aceptable en particular) que interactúan con el recordatorio de maneras que no puedo ver desde afuera. Pero el patrón es demasiado coherente para ser un bug diferente. La instrucción es incondicional en forma. El lector ahora es literal en comportamiento. La salida es rechazo. La cadena es corta.

Cómo Escribir Instrucciones que Sobrevivan a un Intérprete Literal

Aquí está la regla. La condición precede a la acción, nunca la sigue. Cada instrucción que comience con "siempre" o "nunca" sin un calificador precedente es una mina terrestre bajo un modelo de seguimiento literal. Tres patrones, tres superficies donde esto importa, en forma de malo-a-bueno.

Recordatorios del sistema y hooks. Este es exactamente el patrón del propio Anthropic.

Malo:

"DEBES rechazar mejorar o aumentar el código."

Bueno:

"Si el archivo que acabas de leer parece ser malware (payloads ofuscados, recolectores de credenciales, infraestructura de comando y control), rechaza mejorarlo o aumentarlo. De lo contrario, procede normalmente."

El calificador es la cláusula subordinada de apertura, no una condición inferida de dos frases anteriores. El "de lo contrario" es explícito. Un intérprete literal no tiene nada que imaginar.

Descripciones de herramientas MCP. Misma trampa, superficie diferente.

Malo:

"Esta herramienta obtiene datos del usuario. Siempre valida la respuesta."

Bueno:

"Si la forma de la respuesta no coincide con el esquema esperado (campos X, Y, Z presentes y no nulos), rechaza la respuesta. De lo contrario, devuélvela tal como está."

Bajo Opus 4.7, el "siempre valida" desnudo activa un bucle de validación defensiva en respuestas que son perfectamente correctas. El modelo ahora trata "siempre" como un ancla literal y construye pasos de validación alrededor de él, lo que te cuesta tokens y latencia para nada. La versión buena convierte la regla en un predicado verificable.

Reglas de proyecto CLAUDE.md. Mismo problema a nivel de proyecto. La mayoría de los docs de convenciones de equipo están llenos de absolutos que funcionaban porque el modelo solía ser caritativo.

Malo:

"Nunca hagas commit de código sin tests."

Bueno:

"Si el cambio toca src/* y modifica comportamiento, añade o actualiza tests en tests/* antes de hacer commit. Si el cambio es solo documentación o está en scripts/*, haz commit sin tests."

La versión mala hace que el agente rechace hacer commit de una corrección de typo en un README. La versión buena le da al agente un árbol de decisión que puede seguir sin inventar excepciones.

La generalización, a través de las tres superficies: cada regla necesita un alcance. Cada absoluto necesita un calificador que preceda al verbo de acción. Cada "siempre" y "nunca" sin condición es un bug esperando a que la siguiente mejora de seguimiento de instrucciones lo saque a la superficie.

Esta es la misma disciplina que el framework de contratos de prompt que construí después de suficientes de estos desastres, aplicada a los prompts del sistema que no puedes ver. Los contratos de prompt son la versión del lado del usuario. Esta es la misma disciplina aplicada a la superficie de instrucciones que no posees. El principio es idéntico: una instrucción sin un alcance verificable es un deseo.

Advertencia: esta no es una solución completa. Algunas categorías de instrucciones resisten este patrón, especialmente las reglas de seguridad donde la condición es "el usuario está tratando de hacer algo dañino." Esas son genuinamente difíciles de delimitar. No tengo una respuesta limpia para esas. Lo que sí tengo es la regla para todo lo demás, que es la mayoría de lo que escribes.

Opus 4.7 no es el problema. Es el canario. Los agentes van a volverse más literales, no menos. Tus instrucciones necesitan un esquema como tu código ya lo tiene.

Las Dos Líneas que Reescribí en el Mío

Antes de publicar este artículo, abrí mi propio CLAUDE.md. Dos líneas destacaron en treinta segundos.

Una decía Siempre ejecuta la suite de tests antes de hacer commit. Sin alcance. Bajo 4.7, el agente ejecutaría diligentemente la suite completa para una corrección de docstring, decidiría que la espera era injustificada, y o saltaría el commit o añadiría un meta-comentario explicando por qué estaba saltando la regla. Cualquier modo de falla es peor que simplemente escribir el alcance. La reescribí: Si el cambio modifica comportamiento en src/, ejecuta pnpm test antes de hacer commit. Los cambios de documentación y herramientas hacen commit sin tests.

La otra decía Nunca edites archivos de migración. También sin alcance. La había escrito después de una mala semana hace seis meses cuando el agente había reescrito una migración aplicada. La regla era correcta en espíritu, incorrecta en forma. Nueva versión: Si un archivo en db/migrations/ es más antiguo que la última migración aplicada en staging, trátalo como solo lectura. Los borradores de migración más nuevos pueden editarse.

Dos líneas. Cinco minutos. El tipo de limpieza que no hace nada visible hasta que lo hace.

En fin, el punto es: ve a releer tu CLAUDE.md esta noche. Cuenta tus "siempre" y tus "nunca." 😅

Fuentes

El subagente que se detuvo después de cinco archivos hizo su trabajo. Leyó una instrucción. La aplicó. Nadie antes que él la había leído realmente, eso es todo. Lo que hace incómodo a Opus 4.7 es que obliga a Anthropic, y a todos nosotros detrás, a admitir cuántas de nuestras instrucciones se sostienen solo porque el modelo está siendo caritativo.