MagAudit vs CodeRabbit
Escrito por quienes hacemos uno de los dos. Léelo teniéndolo en cuenta.
Dónde nos gana CodeRabbit, y no es de cerca
CodeRabbit es mucho más grande y tiene mucho más dinero que nosotros, y su bot ha
comentado en más de 6,5 millones de pull requests públicos — una
cifra que cualquiera reproduce con una búsqueda en GitHub por
commenter:coderabbitai[bot], que es como la obtuvimos el 18 de septiembre de
2026. Ellos revisan el razonamiento y el diseño, no solo patrones. Si quieres una segunda
opinión sobre cómo está escrito el código, eso lo hacen ellos y nosotros no.
Quitamos otras tres cifras que estaban en este párrafo —número de clientes, facturación, volumen semanal—. Venían de informaciones que hoy no pudimos volver a verificar, y un número que no podemos comprobar no pinta nada en una página que nos compara con otro.
Pusimos a los dos sobre el mismo pull request
El 18 de septiembre de 2026 instalamos CodeRabbit en nuestro propio repositorio público y abrimos un pull request con un fichero que habíamos hecho defectuoso a propósito. Los dos revisores vieron el mismo diff en el mismo instante. CodeRabbit corrió con su configuración por defecto todo el rato —lo dice él mismo en su comentario— porque una comparativa en la que nosotros configuramos al otro no vale nada. Publicamos nuestro resultado esperado antes de abrir el pull request, como una huella SHA-256 registrada doce segundos antes, para que no se pudiera retocar después.
| Defecto plantado | MagAudit | CodeRabbit |
|---|---|---|
| Credencial escrita en el código | Lo encuentra | Se le escapa |
pickle.loads sobre datos externos | Lo encuentra | Se le escapa |
shell=True con un valor interpolado | Lo encuentra | Se le escapa |
| Verificación TLS desactivada | Lo encuentra | Lo encuentra |
| SQL construido con una variable | Lo encuentra | Lo encuentra |
| Doble reembolso — carrera entre comprobar y escribir | Se nos escapa | Lo encuentra |
| Comisión truncada a cero por división entera | Se nos escapa | Se le escapa |
| Tres trozos de código correcto con mala pinta | 0 falsas alarmas | 0 falsas alarmas |
Donde nos ganan, nos ganan en lo que no sabemos hacer. CodeRabbit detectó que una función de reembolso lee un saldo, lo comprueba y lo escribe sin transacción ni bloqueo de fila, de forma que el mismo apunte se puede devolver dos veces. Todas las líneas de esa función son Python válido y SQL válido; no hay patrón que casar. Además siguió un valor desde una función hasta otra, y ejecutó la consulta en un entorno aislado para demostrar el efecto. Esa es una clase de error que no detectamos ni decimos detectar.
Donde íbamos por delante era en gravedad: no levantó la credencial escrita en el código,
ni el pickle.loads, ni el shell=True. Los dos últimos son
ejecución de código a distancia de manual. Y el error de división entera que deja las
comisiones pequeñas a cero se nos escapó a los dos, que preferimos escribirlo a omitirlo.
Una asimetría que tenemos que declarar, porque nos favorece. CodeRabbit podía ver nuestros hallazgos y nosotros no veíamos los suyos: nuestro check publica anotaciones en el pull request, y su comentario las cita. Además ejecutó Ruff y OpenGrep. Nosotros corrimos solo sobre el diff. Sus tres hallazgos se alcanzaron con los nuestros cinco ya a la vista, y aun así no los repitió —pero las dos columnas no son estrictamente comparables, y decirlo sale más barato que que nos pillen no diciéndolo.
El primer intento de esta comparativa lo teníamos para perder y lo perdimos: el fichero de prueba se documentaba a sí mismo, CodeRabbit leyó el comentario que decía que era un examen deliberado y con buen criterio no reportó nada, y nosotros disparamos igual porque no leemos el contexto. Esa ronda también está publicada, incluido por qué no contaba. Las dos rondas, la hoja de respuestas y la huella están aquí — un fichero, una ejecución cada uno, así que léelo como una ilustración de en qué se diferencian dos herramientas, no como un marcador.
Lo que dice su propio mercado que falla
Estas no son cifras nuestras, y hoy no pudimos volver a verificar su fuente, así que léelas como informadas y no como medidas. Se informó de una auditoría ajena sobre 28 pull requests que encontró que el 15 % de los comentarios de CodeRabbit era ruido y el 21 % quisquilloso. Mantenemos la cifra porque es el tipo de número por el que pedimos que se nos juzgue a nosotros —pero no vamos a presentar la información de otro como si la hubiéramos medido.
Lo que sí podemos decir de nuestro lado: publicamos nuestra propia tasa de falsos positivos, derivada de las pruebas, en esta página. Ellos no publican la suya. La asimetría es el argumento; el 15 % no.
Las diferencias que salen de ahí
| CodeRabbit | MagAudit | |
|---|---|---|
| Configuración antes de que sirva | Un .coderabbit.yaml que cuidar |
Ninguna. Existe un .magaudit.yml opcional si quieres ajustarlo |
| Si se equivoca sobre tu código | Fichero de configuración, o @coderabbitai ignore |
Contestas @magaudit ignore <id>, un fichero de configuración, o el marcador que ya usa tu escáner actual — pragma: allowlist secret, nosec, nosemgrep, gitleaks:allow |
| Precio | Desde 24 $ por desarrollador y mes | Plano por organización. Diez personas: 69 €, no 240 $ |
| Vulnerabilidades conocidas en las dependencias que añades | Complemento, con precio por uso | Incluido. Contrastado con la GitHub Advisory Database, y solo se informa cuando la línea fija una versión exacta |
| Dockerfiles, workflows, Terraform, Kubernetes | Con linters que configuras tú | Incluido. Incluido pull_request_target con checkout de la rama de quien contribuye — el que entrega tus secretos a cualquiera que abra un pull request |
| Correcciones de un clic | Generadas por un modelo — potentes, y a veces equivocadas | Deducidas, no inventadas. Se ofrecen solo donde la corrección se deduce de la regla; donde no, no hay sugerencia |
| Ejecutarlo en local antes de subir | CLI, en los planes de pago | El mismo detector, sin conexión. Si aquí sale limpio, allí sale limpio |
| Su propia tasa de falsos positivos | No publicada | Publicada, y derivada de las pruebas |
| Lee el código que ya está en el repositorio | Revisa el diff | Sí, al instalar |
| Distintivo para el README | — | Sí |
Lo que NO estamos afirmando
No decimos que seamos más silenciosos que CodeRabbit. No los hemos medido a ellos, y el 15 % de arriba es información de un tercero que hoy no pudimos volver a verificar —así que la marcamos como informada y no la repetimos como nuestra. Hasta el 18 de septiembre este párrafo decía que enlazábamos esa auditoría. No la enlazábamos, y no había ningún enlace en la página. Eso estaba mal y se corrige aquí en vez de quitarlo en silencio. Lo que sí podemos decir es cuál fue nuestra tasa, porque la medimos y la publicamos: la primera ejecución automática produjo 150 hallazgos sobre 249 pull requests públicos, 79 de ellos críticos, y casi ninguno era real. Esto es lo que eran.
Los dos casos que nos costaron una disculpa pública
Estábamos preparando avisos de seguridad para repositorios públicos, y comprobamos cada uno a mano antes de enviarlo. Los dos estaban mal, y los dos están ahora fijados por una prueba de regresión escrita con la línea exacta:
1. Una variable forzada a vacío es el arreglo, no el fallo
...(command === "build"
? { "import.meta.env.VITE_OPENAI_API_KEY": '""' }
: {}),
Esa línea elimina la clave de todas las compilaciones de producción. Un
comentario de seis líneas encima explica que Vite incrusta las VITE_* en el
paquete. Le habríamos dicho a un equipo que entiende esto mejor que nuestro escáner que
tenía el fallo que ya había arreglado.
2. Leer una variable en Node no es publicarla
module.exports = {
openAIApiKey: process.env.VITE_OPENAI_API_KEY,
}
La configuración de una herramienta de traducción. Corre en Node en tiempo de
compilación. El prefijo VITE_ despista: el código de cliente nunca referencia
la variable, así que nada llega al navegador. Cualquier escáner que busque el prefijo va a
marcar esto, y se va a equivocar.
Lo que medimos, y publicamos
| Medición | Resultado |
|---|---|
| Primera ejecución automática sobre 249 pull requests públicos | 150 hallazgos, 79 CRÍTICOS — casi ninguno real |
| La misma población tras cuatro rondas de correcciones | 39 hallazgos, 0–1 CRÍTICO |
| Dependencias resueltas en vivo contra PyPI y npm | la cifra en vivo |
| Paquetes alucinados por IA confirmados | 0 |
Esa última fila juega en nuestra contra: construimos esto alrededor de los nombres de
paquete inventados, lo medimos, y el ataque resulta ser más raro de lo que sugiere el sector.
Un paquete que no existe hace que pip install falle y que el CI se ponga rojo,
gratis. Lo publicamos porque un proveedor al que puedes comprobar vale más que un proveedor
al que tienes que creer.
Última revisión: 21 de septiembre de 2026. Todas las cifras sobre nosotros son medición propia y reproducibles contra nuestro endpoint público y nuestro registro de errores. Las cifras sobre CodeRabbit o las puedes verificar tú en un paso —su precio, leído de su propia página de precios; su recuento de comentarios públicos, de una búsqueda en GitHub— o están marcadas explícitamente como informadas por un tercero. Si encuentras cualquier otra cosa en esta página que no se sostenga, dínoslo.