Nuestro programador estrella siempre resolvía las caídas del servidor de madrugada. El CEO lo adoraba y lo ponía de ejemplo de compromiso en cada reunión. Un día me tocó revisar el historial del código para una auditoría externa y encontré un patrón extraño en las actualizaciones...
90% of developers use these two files without knowing the real difference
package.json vs package-lock.json
Do you know what each file actually does?
And what breaks if you delete one of them?
THIS IS ACTUAL F*CKING GOLD
Anthropic just shared one of the best tricks for Claude Code.
The idea: run Sonnet, Haiku and Opus 5.5 together, each one doing only the job it's best at.
Opus-level judgment on every big call, without paying Opus rates for every routine turn.
You just launch Claude Code like this:
claude --model sonnet --advisor opus
here's the split:
→ Sonnet 5.5 runs the session and writes the code
→ Haiku 5.5 explores files and docs in parallel
→ Opus 5.5 stays on call as advisor for the big calls
→ you stop spending Opus on work that doesn't need it
Opus only steps in at three moments:
→ before a plan locks
→ when the same error shows up twice
→ before calling it done
Sonnet builds. Haiku explores. Opus reviews.
JEV engineering is the same move one layer down: the forks that need no thinker (which file, which tool, retry or stop) go to JEV in milliseconds, and the big models only see the ones that split
the full tree
> Sonnet 5.5 runs the main session and edits code
> search maps the repo on Haiku 5.5
> grep finds call sites on Haiku 5.5
> docs pulls the API reference on Haiku 5.5
> Opus 5.5 on call as advisor, reads the whole transcript when consulted
> JEV routes micro-forks in milliseconds
paste the tree and this prompt into Claude Code ↓
"Rebuild my Claude Code setup around this tree:
1. Run the main session on Sonnet 5.5 with Opus 5.5 as advisor.
2. Create three read-only Haiku 5.5 subagents: search (maps the repo), grep (finds call sites), docs (pulls the API reference).
3. Add one rule to CLAUDE.md: consult the advisor before locking a plan, after the same error twice, and before calling a task done.
4. Route fast deterministic forks (tool choice, path selection, retries) through JEV.
Show me every change as a diff first. No edits until I say go."
↳ https://t.co/xb2zLxajd4
save it, you'll use this every single day.
Interviewer:
A Linux server is running out of disk space.
Users are reporting errors.
You have 10 minutes to investigate.
Which commands do you run first?
Si estás vibecodeando, te puede servir saber esto.
Esta semana un desarrollador recibió una factura de $10.811 en Cloudflare por un proyecto de prueba que no tenía ni un solo usuario. Te explico qué pasó, porque es un error más fácil de cometer de lo que parece.
Primero, el contexto.
Cloudflare es una plataforma para correr tu código en la nube, y muchos de sus servicios se cobran por uso: pagas por cada operación que hace tu app.
Uno de esos servicios son los Durable Objects. Piensa en ellos como pequeños servidores con memoria propia: cada uno guarda sus datos en su propia base de datos. Cada vez que leen o escriben en esa base de datos se cobra. Es muy poco por operación, pero se cobra.
Los Durable Objects tienen algo llamado “alarm”, que funciona literalmente como un despertador. Le dices “despiértate a tal hora y ejecuta esta función”. Se usa para tareas en segundo plano, como limpiar datos, reintentar algo que falló o actualizar información cada cierto tiempo. Lo importante es que la alarma se ejecuta sola, aunque nadie esté usando tu app.
Por último, https://t.co/sIu4QR9PMe() es una función de JavaScript que devuelve la fecha y hora actual, la de este preciso instante.
Ahora sí, qué pasó.
El código tenía una alarma que, cada vez que terminaba su trabajo, volvía a poner el despertador para https://t.co/sIu4QR9PMe(). Es decir, para “ahora mismo”. Lo normal habría sido algo como https://t.co/sIu4QR9PMe() + 15 minutos.
Entonces la alarma sonaba, leía y escribía en la base de datos, se reprogramaba para ese mismo instante y volvía a sonar. Así unas 600 veces por segundo, más de 50 millones de veces al día, durante casi dos semanas. En total fueron billones de lecturas y escrituras, sin un solo usuario de por medio.
Lo más traicionero es que el bug estuvo dormido 23 días. La parte defectuosa del código solo se ejecutaba cuando ciertos datos guardados llegaban a esa antigüedad. Durante tres semanas todo funcionó normal, y por eso nadie lo notó.
Según la investigación del propio desarrollador, ese código lo generó Codex y no se revisó a fondo. Un cambio posterior hecho con Claude también contribuyó, aunque como factor secundario.
¿Tuvo que pagar? Sí, pagó los $10.811 para que no le cortaran el servicio. El soporte de Cloudflare primero le negó la devolución, porque el consumo venía de su propio código. Después de que el caso se escaló, Cloudflare aprobó un reembolso de $10.701. Pero fue una excepción, no algo con lo que puedas contar.
Lo que puedes aprender de esto:
- Una alerta de gasto no es un límite de gasto. La alerta te manda un correo; el límite apaga el servicio. Este desarrollador tenía configurada una alerta de $10 y aun así la factura llegó a $10.811. Cloudflare todavía no ofrece un tope duro para estos servicios (dice que está trabajando en ello para fin de año), y en nubes como AWS o Google Cloud los presupuestos también son, por defecto, solo avisos. Si tu plataforma tiene un tope real, actívalo. Si no lo tiene, configura alertas en varios niveles.
- Revisa todo lo que se ejecuta solo: alarmas, crons, colas, reintentos. Es el código que corre aunque nadie use tu app, y el que más caro te puede salir. Si no lo entiendes, pídele al agente que te explique exactamente qué se ejecuta, cada cuánto y cuándo se detiene.
- Ponle frenos al código: un tiempo mínimo entre ejecuciones (nunca “ahora mismo”), un número máximo de reintentos y un interruptor para apagarlo todo si algo sale mal. Después del incidente, este desarrollador añadió justamente un mínimo de 15 minutos entre ejecuciones y un límite de reintentos.
- Apaga los proyectos que ya no usas. Este era un experimento abandonado, pero seguía desplegado y corriendo.
Que la IA escriba el código está bien. Pero si ese código se va a ejecutar en una plataforma que cobra por uso, alguien tiene que saber qué hace.
Lambda: cuando quieres crear funciones anonimas, reutilizables con comportamiento seguro.
proc: cuando haces calculo donde la cantidad de parametros puede ser flexible o checar un retorno anticipado de metodo padre
bloque: cuando solo necesitas pasar codigo rapido y temporal
lambda: return solo finaliza la ejecución de la propia lambda y le devuelve el control a quien la llamo
proc: return interrumpe y retorna del metodo contenedor que encerraba alproc, lo cual da un LocalJumpError si no hay metodo alrededor