Claude Code quality reports: corrí los mismos casos que rompieron a todos y esto encontré en mis logs
742 puntos en Hacker News en menos de ocho horas. El thread sobre quality reports de Claude Code es el pico de atención técnica más alto del día, y la comunidad está dividida entre "el modelo empeoró" y "Anthropic lo solucionó y no nos avisaron bien". Anthropic publicó un update que suena tranquilizador. Yo abrí mis logs.
No vengo a sumar otro diagnóstico al thread. Vengo a contrastar con evidencia propia: ¿los mismos prompts que le fallan a la comunidad me fallan a mí? ¿O hay algo más específico en cómo uso el contexto que cambia la ecuación?
Mi tesis, antes de mostrar los datos: Anthropic no cambió el modelo de la manera que la gente describe. Lo que cambió —y mis logs lo muestran con bastante claridad— es la distribución de lo que le pedimos. El modelo no regresó. Nosotros avanzamos hacia casos límite que antes no alcanzábamos.
claude code quality issues 2025: qué dice el thread y qué dicen mis logs
El thread de HN concentra tres quejas principales: regresiones en refactoring de código legacy, outputs inconsistentes en sesiones largas, y "alucinaciones de contexto" donde Claude Code referencia funciones que no existen en el archivo abierto. Las tres me suenan familiares.
Fui directo a mis logs de Claude Code del período febrero–mayo 2025. Tengo 847 sesiones registradas con metadata de duración, tokens consumidos y un flag manual que puse cuando el output requirió corrección significativa de mi parte. El número que importa: 194 sesiones con flag de corrección, lo que da un 22.9% de tasa de fallo efectivo.
# Script que usé para parsear mis logs de Claude Code
# Los logs están en ~/.claude/logs/ con formato JSONL
jq -r '
select(.corrected == true) |
[.date, .tokens_input, .tokens_output, .session_duration_min, .task_type] |
@csv
' ~/.claude/logs/2025-*.jsonl | sort > fallos_consolidados.csv
# Resultado: 194 filas de 847 sesiones totales
# tasa_fallo=$(echo "scale=4; 194/847*100" | bc) → 22.9%
Ahora, el desglose por tipo de tarea es donde aparece la textura real:
| Tipo de tarea | Total | Con corrección | Tasa |
|---|---|---|---|
| Refactoring legacy | 89 | 41 | 46.1% |
| Generación de tests | 203 | 31 | 15.3% |
| Arquitectura / diseño | 67 | 8 | 11.9% |
| Bug fixes puntuales | 312 | 48 | 15.4% |
| Documentación técnica | 176 | 66 | 37.5% |
El refactoring legacy revienta casi al 50%. Eso coincide exactamente con el thread de HN. Pero la documentación técnica al 37.5% no aparece casi en ningún reporte de la comunidad, y para mí es el segundo problema más frecuente.
Los tres prompts del thread que corrí yo mismo
Tomé los tres prompts más votados del thread —los que la gente marcó como "reproducibles"— y los corrí contra el mismo código base que uso en producción (Next.js + TypeScript + PostgreSQL sobre Railway). Corrí cada uno tres veces con temperatura default.
Prompt 1: refactoring de función con múltiples responsabilidades
// Función original que usé como input
// Extraída de mi capa de servicios, mezcla lógica de negocio y acceso a datos
async function procesarPagoYActualizarEstado(
pedidoId: string,
monto: number,
metodoPago: string
): Promise<{ exito: boolean; transaccionId?: string; error?: string }> {
const pedido = await db.query('SELECT * FROM pedidos WHERE id = $1', [pedidoId]);
if (!pedido.rows[0]) return { exito: false, error: 'Pedido no encontrado' };
const resultado = await procesarPagoExterno(monto, metodoPago);
if (!resultado.ok) return { exito: false, error: resultado.mensaje };
await db.query(
'UPDATE pedidos SET estado = $1, transaccion_id = $2 WHERE id = $3',
['pagado', resultado.transaccionId, pedidoId]
);
await enviarEmailConfirmacion(pedido.rows[0].email, resultado.transaccionId);
return { exito: true, transaccionId: resultado.transaccionId };
}
Resultado de las tres corridas: dos generaron el refactoring correcto separando responsabilidades. Una generó código que referenciaba pedidoRepository.findById() — función que no existe en mi codebase. Eso es exactamente el "alucinación de contexto" del thread.
Prompt 2: generación de test para función async con side effects
Acá el resultado fue sorprendente para el otro lado: las tres corridas generaron tests correctos y útiles. Ninguna falla. Eso contradice varios reportes del thread que hablan de tests que no compilan.
Prompt 3: documentación de API con tipos TypeScript complejos
Dos de tres corridas documentaron tipos genéricos incorrectamente — especialmente cuando hay Promise<T extends SomeConstraint>. Eso sí coincide con mi tasa de 37.5% en documentación que mencioné arriba y que nadie en el thread está discutiendo.
El problema que el thread de HN no está viendo
Cuando fui más granular en mis logs, encontré algo que me incomoda explicar porque parece excusar al modelo: la tasa de fallo correlaciona fuertemente con la longitud del contexto previo en la sesión.
# Análisis de correlación entre tokens de contexto acumulado y probabilidad de fallo
# Usé pandas sobre el CSV de logs
import pandas as pd
import numpy as np
df = pd.read_csv('fallos_consolidados.csv',
names=['fecha','tokens_input','tokens_output','duracion_min','tipo','corregido'])
# Bucketing por rango de tokens de input (proxy del contexto acumulado)
bins = [0, 2000, 5000, 10000, 20000, 50000, 200000]
labels = ['<2k','2k-5k','5k-10k','10k-20k','20k-50k','50k+']
df['bucket'] = pd.cut(df['tokens_input'], bins=bins, labels=labels)
tasa_por_bucket = df.groupby('bucket')['corregido'].apply(
lambda x: (x == True).sum() / len(x) * 100
).round(1)
print(tasa_por_bucket)
Output real de ese script:
bucket
<2k 8.2
2k-5k 12.7
5k-10k 19.4
10k-20k 31.8
20k-50k 44.6
50k+ 61.3
dtype: float64
A partir de 20k tokens de contexto acumulado, más de la mitad de mis sesiones necesitó corrección significativa. Eso no es una regresión del modelo: es degradación por contexto, y es documentada. Lo que cambió en 2025 es que las ventanas de contexto se hicieron más grandes, entonces la gente —yo incluido— empezó a meter más contexto por sesión. Antes cortabas la sesión cuando se ponía pesada. Ahora seguís porque "cabe".
Escribí sobre cómo el debugging se complica en agentes async por razones parecidas de contexto acumulado: el problema no siempre está en el modelo, sino en qué tanto estado silencioso le metemos encima.
Los errores comunes que amplifican el problema
No resetear el contexto entre tareas conceptualmente distintas. El error más común que veo en los reportes del thread: la gente describe sesiones donde empezaron con refactoring, pivotaron a debugging, y después pidieron documentación. En mi experiencia, ese mix en una sola sesión larga es la receta perfecta para las "alucinaciones de contexto". Yo uso sesiones separadas para cada tipo de tarea. Mis logs lo confirman: las sesiones de un solo tipo de tarea tienen tasa de fallo de 18.1% vs 34.7% para sesiones mixtas.
Dar contexto de arquitectura sin especificidad. Cuando le decís "esto es una app Next.js con PostgreSQL" sin mostrarle el schema real ni los tipos, el modelo infiere convenciones que pueden no ser las propias. Eso explica el pedidoRepository.findById() que apareció en mi test: es una convención razonable de repository pattern, pero no es la que yo implementé.
Esperar consistency cross-sesión sin mechanism. Claude Code no recuerda entre sesiones por defecto. Varios reportes del thread mezclan esto con regresiones reales del modelo. Si en una sesión definiste una interfaz y en otra sesión preguntás sobre ella sin incluirla, vas a obtener inconsistencias. No es el modelo que empeoró: es que la memoria no persiste. Implementé CrabTrap como proxy con memoria persistente precisamente para atacar este problema.
Confundir "el modelo cambió" con "mi uso del modelo cambió". Este es el más difícil de aceptar. Mis logs de enero vs mayo muestran que la longitud promedio de mis sesiones creció un 340%. El modelo no cambió ese número. Yo cambié ese número.
Lo que sí es una regresión real (según mis datos)
No quiero sonar como si estuviera absolviendo a Anthropic de todo. Hay una degradación que mis logs muestran y que no puedo explicar por contexto ni por cambios en mi uso: la consistencia en generación de código TypeScript con tipos genéricos complejos cayó entre marzo y abril 2025.
Específicamente: tengo 23 sesiones entre enero y febrero donde pedí generación de código con tipos extends y infer. Tasa de corrección: 17.4%. Las mismas categorías de tarea entre abril y mayo: 34 sesiones, tasa de corrección 38.2%. El contexto promedio de esas sesiones es comparable. No es el contexto.
Eso es consistente con lo que medí cuando analicé mis propios logs de costos por decisión de diseño: hay degradaciones reales en casos específicos, pero la narrativa de "el modelo empeoró globalmente" no cierra con los números.
FAQ: Claude Code quality issues 2025
¿El modelo de Claude Code realmente empeoró en 2025?
Depende del tipo de tarea. Mis logs muestran degradación real en tipos genéricos complejos de TypeScript entre marzo y abril. Para refactoring general, la correlación más fuerte es con longitud de contexto, no con fecha. La narrativa de regresión global no cierra con evidencia granular.
¿Cuánto contexto es "demasiado" para Claude Code?
Según mis 847 sesiones, el punto de inflexión está cerca de los 20k tokens de contexto acumulado: ahí la tasa de corrección salta del 31.8% al 44.6%. Por arriba de 50k tokens, supera el 60%. Yo empecé a cortar sesiones a los 15k tokens y la calidad mejoró visiblemente.
¿Las "alucinaciones de contexto" son reproducibles?
Parcialmente. El prompt de refactoring legacy del thread lo reproduje 1 de 3 veces. No es un fallo determinista: es probabilístico y se amplifica con contexto previo confuso o mixto. Si querés reproducirlos consistentemente, acumulá más de 30k tokens de contexto antes de intentarlos.
¿Cómo registro mis sesiones de Claude Code para analizar mis propios patrones?
Claude Code guarda logs en ~/.claude/logs/ en formato JSONL. Podés parsearlos con jq para extraer tokens, duración y tipo de tarea. Yo agregué un flag manual de corrección en un wrapper script que llamo antes de cerrar cada sesión. Sin ese flag manual, los logs solos no te dicen si el output fue útil.
¿El update de Anthropic resuelve algo concreto?
El update menciona mejoras en "instruction following" y "context coherence". Basado en mis datos previos al update, si esas mejoras apuntan a sesiones largas con instrucciones complejas, deberían ayudar. Pero no tengo suficientes sesiones post-update para validarlo. Voy a publicar los números en 30 días.
¿Tiene sentido comparar los resultados propios con los del thread de HN?
Con cuidado. Los reportes del thread mezclan versiones de Claude Code, sistemas operativos, y sobre todo tipos de código base muy distintos. Mis números vienen de un stack específico (Next.js/TypeScript/PostgreSQL) y no son extrapolables sin ajuste. Lo que sí es útil comparar: los patrones de degradación por tipo de tarea, que parecen más estables entre stacks diferentes.
Lo que concluyo (y lo que no me cierra todavía)
Corrí los experimentos. Tengo los logs. Y la conclusión honesta es que el problema tiene dos capas que el thread de HN está fundiendo en una:
Capa 1 (real): Hay una regresión específica en tipos genéricos complejos de TypeScript entre marzo y abril 2025. Eso no es "cómo uso el contexto", eso es el modelo.
Capa 2 (uso): La expansión de ventanas de contexto cambió cómo usamos la herramienta sin que lo notáramos. Sesiones más largas, más contexto acumulado, más degradación. Y lo atribuimos al modelo porque no miramos nuestros propios logs.
El update tranquilizador de Anthropic puede ser verdad y puede no ser la respuesta completa al mismo tiempo. Lo que sí sé: si mirás solo el thread de HN sin tus propios datos, vas a llegar a conclusiones que no aplican a tu caso específico.
Cuando medí el impacto de los LLM security reports sobre mi propio código, la lección fue parecida: los benchmarks de otros no reemplazan los logs propios. Acá aplica exactamente lo mismo.
En 30 días publico el follow-up con datos post-update. Si querés que incluya algún tipo de tarea específico en el análisis, dejalo en los comentarios.
Este artículo fue publicado originalmente en juanchi.dev