Un worktree por tarea
Cada tarea corre en su propio checkout, sobre su propia rama, así que nada de lo que escribe está en la tuya hasta que tú lo digas.
Una ventana en tu terminal para los CLI que escriben tu código: Claude Code, Codex, OpenCode, Antigravity. Le das una tarea a uno y Orbit la deja corriendo en su propio worktree, mientras tú sigues en lo tuyo. Cuando vuelves ya está escrito lo que hizo.
curl -fsSL https://getorbit.sh/install.sh | bash
Un modelo ayuda a definir una solución: te ordena las ideas y te propone por dónde cortar, y después va más rápido de lo que alcanzas a leer.
Me pasa seguido. La última vez fue con una funcionalidad complicada del propio Orbit, que terminó en una rama que dejé ahí sin integrar, porque llegamos a un punto donde ni el modelo ni yo sabíamos si el resultado cumplía con lo que habíamos definido.
Necesitas verlo mientras está pasando, y un lugar donde parar antes de que llegue a tu rama.
Claude Code, Codex, OpenCode, Antigravity. Le das la tarea, corre en su propio worktree, y queda escrito lo que hizo.
Cada tarea corre en su propio checkout, sobre su propia rama, así que nada de lo que escribe está en la tuya hasta que tú lo digas.
Entre fase y fase pones un gate: un comando que corre y deja pasar o devuelve el trabajo. Responde con un código de salida, no con una opinión.
Las tareas pendientes hacen cola y el autopilot las va tomando solo, hasta que se acumulan diez terminadas que nadie ha leído, y entonces deja de arrancar nuevas.
Una tecla le entrega la terminal, ya dentro del worktree de la tarea. Y tu CLI, por MCP, escribe tareas, las corre, y te lee de vuelta lo que pasó mientras no estabas.
Lee el resultado de una corrida, decide si hizo lo que se pidió, y arregla lo que falta, en un hilo en el que tú escribes.
Lo que Orbit ya sabe de tu repositorio, con su fuente y su alcance. Vive fuera del modelo, así que cambias de motor y sigue ahí.
Lo que gastó, qué corrió cada gate, qué negó el sandbox, la línea de tiempo evento por evento, los artefactos, el razonamiento que mostró y el diff.
orbit show lee una corrida seis meses después, y orbit export saca el registro completo.
La pestaña de impacto lee el historial del repositorio: si un archivo casi siempre cambia junto a otro, y esta vez el otro no cambió, te lo dice.
Reglas sobre tu código que llegan al prompt antes de que el agente trabaje, y que devuelven el trabajo cuando les pones un comando que responde sí o no. En la pantalla se llama lo que Orbit sabe. Yo le digo el cerebro.
El modelo olvida entre sesiones, y olvida cuando lo cambias. CLAUDE.md lo lee Claude y AGENTS.md lo lee Codex, así que el día que cambias de motor el nuevo no abre el archivo del otro. Lo que Orbit sabe vive afuera de los dos. Estrenas un CLI y sigue sabiendo que en este repositorio las migraciones se generan.
Cuatro entradas, una sola cola, y una regla que se puede echar para atrás. Nada que escribas tú llega a un prompt sin que lo hayas visto, y no pierdes una regla porque te molestó una vez. Lo que viene en el repositorio cuando clonas lo revisas en el diff, como cualquier otro cambio.
Las cuatro entradas
Le dices al supervisor "nunca subas un pull request sin que pasen los tests" y Orbit te la ofrece de vuelta como regla. Lo nota por cómo empieza la frase, con una lista corta de arranques escrita a mano, sin gastar modelo.
Un agente que se traba a mitad de tarea anota lo que aprendió con orbit_learn. Queda esperando tu aprobación.
Lo que repites tanto que ya ni te das cuenta de que lo pides. "Métele fuzz testing" dicho en la fase de test de seis tareas seguidas es una regla que nunca escribiste, y Orbit la junta y un modelo la redacta.
Un repositorio con dos años de historia ya tiene la mitad de sus reglas escritas en el CONTRIBUTING y el README. Y sus commits dicen cuáles siguen siendo verdad.
$ orbit rules read -with claude
process CONTRIBUTING.md:182 Corre make check y lee su código de salida antes de abrir un PR.
style CONTRIBUTING.md:122 Nunca escribas un color hex fuera de internal/ui/theme.
testing 362 commits leídos un cambio bajo internal viene con su test,
como en 264 de los 281 que lo tocaronCada regla que sale de un documento cita la línea exacta. Si el modelo no puede citar ninguna, la propuesta se descarta: pedirle que resuma dos años de CONTRIBUTING produce frases que suenan bien y nadie escribió nunca.
Las que salen de la historia traen su conteo. Y una regla que el documento pide y los commits contradicen ni te la ofrece: una frase que nadie sostuvo en un año no llegó a ser regla.
La primera vez que corres Orbit en un repositorio trae pocas y buenas, porque si te llegan cuarenta propuestas malas dejas de abrir la bandeja, y ahí pierdes también las otras tres entradas.
La bandeja
La única pregunta que tienes cuando te sientas es qué hay que decidir.
$ orbit rules
1 2026-09-13 18:52 ACME-1 · modelo internal/db las migraciones se generan
e2dada18 acme la cobertura se queda por encima de 75%
acme nunca ha pasado de 60, eso lo estamos arreglando primeroLas numeradas son frases que nadie ha contestado. Con identificador salen las reglas que se mandaron a mirar otra vez. Desde ahí la guardas con tus palabras, o acotada a una carpeta, o con un comando que detenga el trabajo.
Qué es una regla
--- id: 875c38ec scope: dir source: model path: internal/db --- las migraciones se generan, nunca se editan a mano
Corriges la frase, mueves el lugar, la apagas, y sigue siendo la misma regla.
Todo, un lenguaje, un repositorio, un directorio, un archivo, un símbolo. Se leen en ese orden, y la última palabra la tiene el más cercano a lo que está por tocar.
Tú, un motor a mitad de tarea, un documento con su línea, o los commits con su conteo. Lo que repites cuenta como dicho por ti. Una regla sin fuente no entra.
Rechazar necesita algo que responda sí o no sin opinión adentro. Si una regla manda a parar pero no trae comando, solo avisa.
Lo escribes tú, nunca un modelo. Corre en cada fase futura de ese repositorio, y uno lento es una hora de tarea que nadie aprobó.
Solo la activa entra al prompt. La pausada la frenaste tú con su razón escrita, y la apagada se queda guardada y no entra a ningún prompt.
Cuando una regla te frena
Estás en el medio de otra cosa, así que solo hay dos salidas, las dos baratas y reversibles.
Las dos la mandan a revisión, y solo la primera vez. Saltarla una vez no prueba nada, pero saltarla cuatro veces sí dice algo.
Por eso la pausa te pide una razón. Es lo que vas a leer cuando vuelvas.
Apagarla y reescribirla no aparecen ahí. Esas dos deciden si la regla sigue viva, y no las resuelves con una tarea a medias.
Sentarte a decidir
$ orbit rules review -rule e2dada18
e2dada18 acme la cobertura se queda por encima de 75%
acme nunca ha pasado de 60, eso lo estamos arreglando primero
la guardaste el 12 de agosto
detuvo el trabajo 4 veces en test, y te la saltaste todas
detuvo el trabajo 2 veces en build, y las dos se arreglaron
la pausaste el 9 de septiembre: acme nunca ha pasado de 60Una regla que el modelo obedece no aparece en esa lista. Así que verla vacía quiere decir dos cosas opuestas: que funciona, o que nunca le tocó nada. Una regla es buena hasta que te molesta, y solo la fricción queda escrita.
En acme pediste 75% de cobertura y ese repositorio nunca ha pasado de 60. La regla está bien, llegó temprano. Ningún número resuelve eso, y por eso Orbit te pone los datos delante y decides tú.
Acotarla resuelve casi todos los casos. Una regla que molesta en docs y sirve en payments se escribió muy general, y sin un alcance más chico lo único que puedes hacer con ella es borrarla.
Dónde vive cada regla
Dos lugares para las reglas, y la pregunta es una: ¿viaja? El registro es aparte.
<repo>/.orbit/knowledge/Reglas sobre ese checkout. Se van con el push, así que quien clona el proyecto las recibe, y una regla nueva entra por un diff, como cualquier cambio, y alguien la revisa antes.$ORBIT_HOME/knowledge/Reglas sobre todo, y sobre un lenguaje. No son de ningún checkout, así que se quedan en esta máquina, y si cambias de máquina no van contigo.Cada una tiene su demo corriendo en getorbit.sh.
Empezar
Cuatro comandos, y el único que tienes que pensar es el tercero: apuntar la cabina al directorio donde están tus repositorios.
Los menús
Presionas m sobre cualquier cosa y sale todo lo que le puedes hacer. Lo que no aplica sale en gris, con la frase que dice por qué.
Una corrida completa
Una lista de fases, cada una lo bastante pequeña para revisarla, con un veredicto escrito después de cada una.
Autopilot
Toma la siguiente pendiente y la lleva por su flujo. Con diez tareas terminadas sin leer, deja de arrancar nuevas.
Varias en paralelo
Tres corridas andando, en tres worktrees, en una sola ventana. Dos agentes en dos checkouts no se pisan, porque cada uno está en su rama.
Leer lo que hizo
El resumen, el reporte, el diff tarjeta por tarjeta, y lo que el agente dice que consideró y decidió no hacer.
El CLI
Veintidós herramientas MCP, así que tu CLI escribe tareas, las corre, lee lo que pasó y las dirige.
El supervisor
Le dices "la migración tiene que ser reversible" y sigue ahí la próxima sesión, y el mes que viene.
Lo que Orbit sabe
La pantalla donde vives con las reglas. Ahí las corriges, las acotas, las pausas con su razón, o las apagas.
Flujos que escribes tú
Un flujo es la lista de fases de una tarea. Cinco vienen incluidos. Los tuyos son JSON, y los nombres de las fases son tuyos.
Orbit existe para que le creas.
Ningún error se traga ni se cambia por una frase amable. Si un check falló, la ventana dice que falló, qué dijo, y en qué fase fue. Y cuando Orbit no sabe algo, lo dice.
Una acción que arranca algo avisa al arrancar y otra vez al terminar, y si la espera es larga la ventana dice qué está esperando. Y una tecla que no se puede presionar explica por qué, en tu idioma.
Cada falla y cada cambio de estado pasa por el log con su etiqueta. Nada escribe por detrás de la ventana, porque eso corrompe la terminal y pierde el registro a la vez.
Lo que dijo un motor queda escrito como lo dijo. Un resumen siempre va al lado del texto original.
A un modelo hay que decirle cómo se trabaja en tu repositorio. Parte va en un documento. El resto son límites que revientan la compilación si se los salta, y la mayoría de ellos son pruebas con nombre propio.
Donde una regla puede hacer fallar la compilación, la hace fallar, y donde no puede, la razón queda escrita al lado, para que el que venga discuta con la razón y no con la regla.
Los seis límites
Todos se corren con make check.
Pruebas de arquitectura
Una salta si un paquete exporta algo que no es una puerta de entrada, otra si aparece un import fuera del mapa de capas, otra si el go.mod suma una dependencia que nadie argumentó, y así trece más.
Líneas por archivo
Código y comentario, sin contar blancos. Un archivo por encima del techo son dos temas que todavía no se separaron, y se parte por la costura.
Columnas por línea
El límite son 100 columnas, y el trinquete anota cuántas líneas se pasan hoy. Ese número solo puede bajar, nunca subir. Una frase que lee una persona queda exenta, porque partirla para que entre la empeora.
De cobertura, como piso
Es un gate, y el comando sale en error si baja. Un número que se imprime y nadie mira se va cayendo de a poco, y el día que alguien lo ve en 60% ya nadie sabe quién se lo gastó.
Métodos por interfaz
La interfaz es de quien la necesita, y se declara donde se usa. Una que crece se marca como puerta de entrada, y la siguiente que la toque la deja más chica.
Un error se atiende una vez
Se envuelve y se pasa, o se registra y se detiene. Las dos cosas a la vez dejan el mismo problema contado dos veces en dos lugares distintos.
Seis tipos de prueba, cada uno con su cuándo
Cada cambio trae los que le tocan, casi siempre dos o tres. Y al que no trae ninguno no hay quién lo refactorice después.
Siempre. Un comportamiento, con nombre, en el paquete que lo tiene. El nombre dice el comportamiento: TestADeletedIdIsFreeAgain, en vez de TestDelete.
Aplica cuando algo tiene una ley en vez de una respuesta. Un ida y vuelta que no puede perder nada, un costo que solo sube, una fila que nunca sale más ancha que la terminal.
Cuando llegan bytes de afuera. No puede reventar con ninguna entrada, y el caso que encuentra queda guardado en el repositorio. Un crash encontrado una vez es un caso que la suite se queda.
El binario real, un repositorio git real con un módulo Go adentro, gates corriendo comandos reales. Solo el modelo es de mentira, porque un modelo no es gratis ni es igual dos veces.
Antes del pull request. Cambia el código por debajo de las pruebas y pregunta si se dan cuenta. Un mutante que sobrevive es una prueba que mira sin ver, y toca matarlo o escribir por qué da igual.
El caso que escribe alguien tratando de romperlo. La entrada vacía, la que llega dos veces, el archivo borrado entre listarlo y leerlo, el valor legal y absurdo. Casi todos los bugs que este proyecto ha soltado fueron uno de esos, y cada uno es hoy una prueba con su comentario.
v0.1.x. Lo uso todos los días, y es joven: el número de versión lo dice.
Y además
orbit join abre un segundo repositorio
orbit export saca el registro completo
orbit show lee una corrida vieja
$ORBIT_HOME, que por defecto es ~/.orbit
go install con Go 1.26+
Se aceptan issues y pull requests
y lo que vaya saliendo
Voy escribiendo cada parte de Orbit en el blog.
Apache 2.0. El código, las reglas de contribución y todo lo que Orbit sabe de sí mismo están en el repositorio.