trapline
Un binario, un fichero SQLite y cuatro clientes de la misma API: REST, panel web, CLI y MCP. Diseñado para que un agente lea el error, parchee el código, corra los tests y lo cierre para la próxima release sin salir de tu máquina.
Sentry self-hosted pide 16 GB de RAM. trapline hace el trabajo con 19,7 MB.
Error tracking, tracing, uptime, crons y status page en un binario de 18 MB. Los SDKs oficiales de Sentry siguen igual: cambias el DSN y funciona.
Un error viaja del SDK al agente sin cambiar de proceso
Pulsa los pasos o deja que avance. Cada paso ilumina la pieza de la que habla.
La versión mínima que funciona: no instalas un SDK nuevo, cambias una variable.
Del throw al issue cerrado
Un caso inventado con números pequeños, para ver qué pasa en cada tramo antes de hablar de arquitectura.
TypeError: Cannot read properties of undefined (reading 'id') en checkout.js:42. El SDK oficial lo manda tal cual.trapline issues bundle -project 1 -issue 17 devuelve un markdown: excepción, stacktrace symbolicado con contexto, breadcrumbs, tags agregados, frecuencia a 24 h y 14 d, y los commits sospechosos con la razón de la sospecha.Cinco veces en que la solución obvia estaba mal
Cada reto sigue el mismo patrón: lo que cualquiera haría primero, por qué no sirve, lo que se hizo y el número que lo demuestra. El detalle técnico queda plegado.
Cada cifra pública del producto tiene un script que la mide y un gate que la vuelve a medir: huella, tamaño de binario, eventos por segundo, compatibilidad con cada SDK, paridad de los cuatro clientes y hasta los bloques de código de la documentación, que se ejecutan contra un servidor real.
Un solo filtro: ¿esto añade un proceso, una dependencia o memoria en reposo?
Si la respuesta era sí, se buscó la alternativa. Si no la había, se midió y se publicó con su gate.
Profundizar
DuckDB o ClickHouse son la elección correcta si se mira solo el perfil de queries. DuckDB queda diferido, no descartado: el puerto de storage permite añadir un adapter columnar sin tocar dominio (ADR 01, ADR 04, ADR 10).
La medición ordena prioridades: con un evento realista de 14,6 KB, decodificar el JSON cuesta más que toda la transacción de SQLite (421,9 µs contra 790,0 µs por cuatro sentencias más de las que había). El escritor único convierte la concurrencia en cola: 8 clientes dan 667 a 1 090 ev/s frente a 705 a 747 con uno solo.
curl | sh en amd64 y arm64. Con CGO la compilación cruzada exige toolchains C por arquitectura y el binario deja de ser estático. Es más lento en microbenchmarks y el diseño lo absorbe: lecturas contra agregados, no sobre millones de filas.Profundizar
Una librería C en el proceso es además superficie de memoria no gestionada en un servicio cuyo endpoint de ingesta es público. modernc.org/sqlite con CGO_ENABLED=0; el gate de benchmark en CI es el juez. Los adapters se prueban contra SQLite real, nunca contra mocks de base de datos (ADR 09).
Profundizar
El scheduler ofrece cada job junto con la pregunta de si su subsistema tiene trabajo y solo existen los que responden que sí; la pregunta se repite al cambiar la configuración, sin reinicio (ADR 05, ADR 14). Para la ingesta, donde el trabajo lo inicia el SDK, se usa el propio protocolo: categoría apagada devuelve 429 con X-Sentry-Rate-Limits y el SDK deja de enviarla.
internal/engine no importa nada del repositorio y será una librería aparte bajo Apache-2.0, porque es código pensado para reutilizarse.Profundizar
Esa frontera, junto con internal/domain (solo stdlib) y cinco paquetes puros más, la verifica un test en internal/arch en cada go test y depguard en el lint. La duplicación es intencional: el test corre aunque no tengas golangci-lint instalado.