Arquitectura y decisiones

Cómo está pensado Kanb

Kanb coordina varios agentes de IA trabajando sobre un proyecto real. Esta página explica cómo funciona por dentro y, más importante, por qué cada pieza es como es. No hace falta saber programar para leerla: cada sección abre con la idea en una frase y después baja al detalle.

Qué es Kanb

La idea en una frase Un tablero que planifica y reparte trabajo entre varios agentes de IA, observa lo que hacen y guarda evidencia de todo — funcionando en tu computadora, sin que tus credenciales salgan de ella.

Cuando alguien trabaja con agentes de IA en serio, aparecen tres problemas que ninguna herramienta de tareas resuelve. El primero es que no se sabe qué está pasando: un agente corre en una terminal, otro en otra, y no hay un lugar que muestre el estado real. El segundo es que el gasto es invisible hasta que la cuota se agota. El tercero es que nada queda registrado: cuando el trabajo termina, no hay rastro verificable de qué se decidió ni por qué.

Kanb existe para eso. Es un plano de control: no ejecuta la inteligencia, la coordina. Los agentes siguen siendo Claude, Codex o el que prefieras; Kanb es quien reparte el trabajo, mira lo que ocurre, mide el consumo y guarda la evidencia.

Tres compromisos que no se negocian

  • Local primero. La base de datos vive en tu máquina y es la autoridad. Los servicios en la nube son opcionales y nunca mandan sobre lo local.
  • Neutral entre proveedores. Ningún agente es especial. Agregar uno nuevo no debería tocar el núcleo.
  • La aprobación humana es final. Un agente puede proponer, ejecutar y reportar. No puede aprobar su propio trabajo ni saltarse un límite.

El modelo de ejecución

La idea en una frase Kanb separa qué se quiere lograr de qué se pidió ejecutar y de qué proceso realmente arrancó, porque confundirlos es lo que hace que un sistema pierda trabajo o lo duplique.

La mayoría de las herramientas tienen un solo concepto: «la tarea». Kanb tiene cuatro niveles, y la distinción no es burocracia — cada uno responde una pregunta distinta que el sistema necesita poder contestar después de un reinicio, un corte de luz o un proceso que murió sin avisar.

Session Alcance de control durable · quién manda ahora mismo Task DAG Objetivos y sus dependencias · qué hay que lograr Dispatch Petición de ejecución inmutable · qué se pidió, una sola vez ProcessIncarnation Un intento exacto de arrancar un proceso externo · qué corrió de verdad ADR-0010
Cada nivel contiene al siguiente. Un Dispatch puede tener varias encarnaciones —si el primer intento falló— sin dejar de ser la misma petición.

El nivel que más cuesta entender es el último, y es el más importante. Un Dispatch es lo que pediste: «resolvé este bug con Claude». Una ProcessIncarnation es un arranque concreto de un proceso del sistema operativo. Si el proceso muere y hay que reintentar, nace una encarnación nueva — pero la petición sigue siendo la misma. Sin esa separación, un reintento parece trabajo nuevo, y el consumo se cuenta dos veces.

Por qué importa para quien no programa: es la diferencia entre «pedí una pizza» y «el repartidor salió». Si el repartidor se accidenta y sale otro, no pediste dos pizzas. Un sistema que confunde ambas cosas te cobra dos veces.

Arquitectura

La idea en una frase Una sola aplicación de escritorio manda; el teléfono solo mira y aprueba; la nube es opcional y nunca es la fuente de verdad.

Escritorio — la autoridad Tauri 2 · React · Rust Interfaz tablero, revisión, aprobación — sin privilegios propios Núcleo comandos estrechos, uno por operación · aquí vive la autoridad SQLite — base canónica del workspace procesos hijos, argumentos fijos CLIs de los proveedores — en tu máquina anthropic-claude openai-codex …los que agregues El CLI guarda tu credencial. Kanb nunca la lee, ni la almacena, ni la renueva. Móvil acompañante ver · aprobar · pausar cancelar · reintentar NUNCA EJECUTA Sync / Vault opcional y de pago eventos con bandeja de salida, no copia JAMÁS ES AUTORIDAD ADR-0003 · ADR-0006 · ADR-0009
Un solo código compartido apunta hoy a escritorio y mañana a móvil. Lo que cambia no es el código: es cuánta autoridad tiene cada plataforma.

El reparto de autoridad es deliberado. El escritorio ejecuta porque es donde están los CLIs y los archivos. El móvil nunca ejecuta — puede aprobar lo que el escritorio propone, pero no puede iniciar trabajo. Y la sincronización, si la contratás, intercambia eventos versionados con bandeja de salida, identificadores globales y resolución explícita de conflictos. Copiar filas entre bases en las dos direcciones está prohibido: es la receta clásica para que dos dispositivos se peleen por quién tiene razón.

Conexión con proveedores

La idea en una frase Kanb usa tu CLI ya instalado y autenticado, en vez de pedirte credenciales para guardarlas él.

La decisión más importante de seguridad del producto es una que no se tomó: Kanb no custodia tus credenciales de suscripción. Cuando ejecuta a Claude, lanza el CLI de Claude que ya tenés instalado y autenticado. El token nunca pasa por Kanb.

Tipo de conexiónCómo funcionaDónde vive la credencial
subscription-cli
camino principal
Kanb lanza el CLI del proveedor como proceso hijo, con argumentos fijos y entorno mínimo. En el CLI. Kanb nunca la lee, guarda, reenvía ni renueva.
api-key
secundario
Solo para proveedores sin CLI usable, o si preferís facturación por uso. En el llavero del sistema operativo. Nunca en SQLite, ni en el disco del proyecto, ni en la interfaz.
local
tercero
Modelos que corren en tu propia máquina. No hay credencial, ni cuota, ni costo.

La consecuencia práctica: si Kanb fuera comprometido mañana, quien entre no encuentra tus tokens de suscripción, porque nunca estuvieron ahí.

Ciclo de vida de un trabajo

La idea en una frase Un trabajo atraviesa estados explícitos, y cuando Kanb no sabe qué pasó lo dice — en vez de adivinar.

prepared nace start_requested se pidió arrancar running trabajando stopping se pidió parar settling cerrando cuentas settled terminado start_unknown ¿arrancó o no? stop_unknown ¿murió o sigue? abandoned se dio por perdido Camino feliz De arriba: lo que pasa cuando todo sale bien. Abajo, en ámbar: los estados donde Kanb perdió certeza. No se saltan — se resuelven. ADR-0010
Los estados en ámbar son la parte interesante: un proceso puede morir sin avisar, o el acuse de recibo puede perderse. Kanb registra esa incertidumbre como un estado real en vez de asumir un final.

La regla que gobierna todo el diagrama es una sola: nunca se sintetiza certeza desde una señal ausente. Si Kanb pidió arrancar un proceso y no recibió confirmación, el estado no es «falló» ni «corrió» — es start_unknown, y alguien tiene que reconciliarlo. Un sistema que adivina en ese punto es un sistema que algún día mata un proceso que estaba trabajando bien, o cobra dos veces el mismo trabajo.

Toda transición deja un recibo: un registro que solo se agrega, nunca se edita. Si algo estuvo mal, se agrega un recibo que lo corrige; la historia no se reescribe. Eso es lo que hace que el historial sirva como evidencia.

Propiedad y cerebro dividido

La idea en una frase Si dos instancias de Kanb creen mandar sobre el mismo proceso al mismo tiempo, pueden destruir trabajo. Hay una barrera diseñada exactamente para eso.

El problema se llama cerebro dividido y no es teórico: pasa cuando la aplicación se reinicia mientras un agente sigue corriendo, o cuando alguien abre Kanb dos veces. Si ambas creen ser dueñas del proceso, una puede matarlo mientras la otra le manda trabajo.

Dueño anterior generación 4 quedó obsoleto Dueño actual generación 5 Barrera 1 — base de datos compara-y-cambia atómico sobre versión + generación gen 4 → rechazado gen 5 → pasa Barrera 2 — supervisor vuelve a comparar la marca contra el proceso real si cambió entre medio, rechaza también ✕ Proceso del agente Solo una generación puede actuar sobre el proceso ADR-0010
Dos verificaciones independientes. Un dueño vencido no pasa la primera; y si la propiedad cambia entre la primera y la segunda, tampoco pasa la segunda.

Cada vez que la propiedad cambia de manos, un contador —la generación— sube. Toda operación lleva ese número escrito. Una orden emitida por un dueño vencido llega con un número viejo y se rechaza, tanto en la base de datos como al borde del proceso real. Y hay una regla adicional que evita el error opuesto: tomar la propiedad no borra lo que hizo el dueño anterior. Un trabajo que quedó en estado incierto hay que reconciliarlo o abandonarlo explícitamente; no se puede ignorar.

Y si Kanb encuentra un agente que no lanzó él

Pasa: reiniciás la aplicación y quedó un proceso corriendo, o algo se ejecutó por fuera. Kanb clasifica lo que encuentra en categorías explícitas —instalado, mío y activo, mío y retomable, ajeno observado, desconocido— y actúa distinto en cada caso.

La regla dura es esta: un proceso que Kanb no lanzó no se adopta nunca automáticamente. Retomar uno propio exige que esté asentado y que haya evidencia de que efectivamente era suyo. Para los ajenos no hay ruta de adopción en absoluto — no es que esté desactivada por configuración, es que no existe el camino en el código.

La razón de ser tan estricto: un identificador de proceso se recicla y el nombre de un ejecutable se falsifica sin esfuerzo. Cualquier sistema que adopte procesos basándose en esas señales termina, tarde o temprano, mandándole trabajo a algo que no es lo que cree.

Consumo y cuota

La idea en una frase Kanb mide lo que gastás leyendo el sistema de otro, así que trata ese dato como una observación —con su fecha y su nivel de confianza— y nunca como una verdad.

Ningún proveedor publica un contador oficial de cuota para herramientas externas. Lo que hay son señales indirectas. Kanb las usa, pero es explícito sobre lo que son: toda medición lleva de dónde salió, cuánta confianza merece y cuándo se observó.

CanalQué mideConfiabilidad
run_usageConsumo atribuible a una ejecución que Kanb lanzó.Alta — Kanb la presenció.
quota_observationFoto del estado de cuota de una cuenta o ventana.Mejor esfuerzo. Puede estar vieja.
usage_estimateHeurística versionada, visiblemente etiquetada como estimación.Aproximada por diseño.

Los tres canales nunca se mezclan en un solo número. Sumar una medición real con una estimación produce una cifra que parece precisa y no lo es — y sobre esa cifra alguien tomaría decisiones de gasto.

Cuatro reglas que se siguen de ahí

  • La utilización siempre significa consumido, normalizada entre 0 y 1. Un proveedor que reporta «lo que queda» se invierte en el borde, una sola vez.
  • Una lectura vieja se marca como vieja. No se presenta como fresca.
  • Si el formato del proveedor cambia y el lector falla, falla cerrado: reporta desconocido, no un número inventado.
  • Ante la duda, el respaldo son los datos de las ejecuciones propias, no una exploración más agresiva del sistema ajeno.

De dónde sale el dato, y qué no se hace para conseguirlo

Kanb obtiene consumo por tres vías, y las tres están acotadas a propósito.

  • Lo que Kanb presencia. Cuando lanza un agente, lee el consumo del flujo que ese proceso emite. Es la vía más confiable porque no depende de interpretar el sistema de nadie.
  • Sondeo por línea de comandos. Kanb puede preguntarle al CLI del proveedor por sus ventanas de cuota, con argumentos fijos, tope de salida y un intervalo mínimo entre consultas. Sin ninguna llamada de red propia — hay una prueba automática que falla si alguien agrega un cliente HTTP a ese módulo.
  • Importar histórico, solo si vos lo autorizás. Kanb puede leer transcripciones locales para recuperar consumo anterior a su instalación. Requiere consentimiento explícito y por ruta: no explora tu disco buscando nada.

Del histórico se extraen únicamente contadores y marcas de tiempo. El contenido de las conversaciones no se lee, ni se guarda, ni se registra — y no por disciplina, sino porque no existe un campo ni una columna donde pueda entrar.

Qué modelos y cuentas hay disponibles

Kanb también enumera qué modelos y cuentas expone cada runtime instalado, para no tener que preguntártelo. De una cuenta guarda una referencia opaca, nunca la identidad ni la credencial. Y distingue explícitamente entre lo que un proveedor declara y lo que Kanb verificó: hoy, para los dos proveedores incluidos, la información es declarada y así aparece marcada.

Control de admisión

La idea en una frase Antes de gastar, Kanb decide si el trabajo puede correr — y esa decisión es una función pura, sin red, sin reloj y sin base de datos, para poder probarla entera.

Esta es la lógica más consecuente del sistema: es lo que impide que un agente consuma tu cuota del mes sin freno. Por eso está diseñada como una función pura: recibe la política, las ventanas de consumo, la petición y la hora, y devuelve un veredicto. No hace llamadas de red, no lee el reloj —el tiempo se le inyecta— y no sabe nada de proveedores. Se puede probar exhaustivamente sin conexión ni subprocesos.

Seis veredictos posibles allow adelante warn avisa y sigue soft-block requiere que un humano apruebe explícitamente hard-block ningún agente puede saltárselo, nunca reroute probá con otro proveedor unknown sin datos suficientes Sin telemetría, el veredicto por defecto es permitir: una medición ausente no puede convertirse en un bloqueo fantasma. ADR-0008
soft-block es donde vive la promesa de que la aprobación humana es final. hard-block es el único que ningún agente puede sortear.

La decisión sutil está en el último recuadro. Si no hay telemetría —porque el proveedor no publica nada o porque la lectura falló— el veredicto por defecto permite. La alternativa sería bloquear ante la duda, y eso convertiría cualquier fallo de lectura en una parálisis total del producto por una medición que quizás nunca existió.

Seguridad

La idea en una frase La interfaz no tiene privilegios propios: cada operación es un comando estrecho que no sirve para otra cosa.

Kanb es una aplicación de escritorio con una interfaz web adentro. Ese diseño tiene un riesgo conocido: si alguien logra inyectar código en la interfaz, hereda todo lo que la interfaz pueda hacer. La respuesta habitual —habilitar complementos genéricos para base de datos o terminal— es exactamente lo que Kanb no hace.

EnfoqueQué le da a un atacanteDecisión
Complemento de SQL genérico Ejecutar cualquier consulta: control total de la base del workspace. descartado
Permiso de ejecutar en terminal Ejecutar cualquier programa local con tus permisos. descartado
Comandos estrechos, uno por operación Exactamente esa operación y nada más. No se puede reutilizar. adoptado

Un comando como «registrar esta observación de consumo» no se puede convertir en otra cosa. Comodidad para quien programa no vale entregarle a un atacante una herramienta de propósito general.

Lo que se sostiene alrededor

  • Los procesos se lanzan con argumentos fijos, sin terminal intermedia, con entorno mínimo y sin que la interfaz pueda influir en la ruta, los argumentos ni las variables.
  • Toda salida de un agente es dato no confiable. Se valida con lista blanca y tope de tamaño; lo que excede se rechaza sin siquiera intentar leerlo.
  • Los secretos no entran en la base, ni en registros, ni en recibos, ni en capturas, ni en la memoria del asistente. Se usan referencias, no valores.
  • Leer archivos tuyos requiere consentimiento explícito por ruta. Kanb no explora tu disco buscando nada.

Protocolo y sincronización

La idea en una frase Los comandos y eventos que cruzan entre dispositivos están versionados y son públicos, para que la app y cualquier servicio futuro no puedan interpretarlos distinto.

Kanb publica un protocolo versionado con los esquemas de comandos, eventos y recibos. No es documentación: es un contrato con suite de conformidad, y cualquier implementación tiene que pasarla para decir que lo cumple.

Esa decisión salió de un problema real. Dos partes del sistema —una en Rust, otra en TypeScript— implementaron la misma frase de una especificación escrita en prosa y la entendieron distinto. Las dos pasaban sus propias pruebas. Solo chocaron al integrarse. La conclusión fue que un contrato en prosa se interpreta; un contrato ejecutable se cumple o no.

Cómo llegaría una orden desde el teléfono

El transporte todavía no existe, pero el contrato sí, y define el camino que una orden remota tendrá que recorrer. Cada comando entrante se trata como no confiable y se revalida entero contra el contrato antes de tocar nada durable. Si llega con una generación de propiedad vencida, se rechaza — nunca se aplica «por las dudas».

El vocabulario de comandos es cerrado por construcción: aprobar, pausar, cancelar y reintentar. No hay forma de que llegue algo fuera de esa lista, y no incluye iniciar trabajo nuevo, porque el teléfono no ejecuta. Reusar una clave de idempotencia con un contenido distinto se rechaza, que es lo que impide que una orden repetida se aplique dos veces.

El protocolo tiene su propia licencia, y es más permisiva que la del resto de Kanb: Apache-2.0, mientras la aplicación es AGPL-3.0. Es deliberado. Un protocolo que nadie puede implementar sin adoptar obligaciones de copyleft no es un protocolo público — y como la suite de conformidad es el mecanismo con el que cualquier implementación demuestra que cumple, esa suite también tiene que poder correrla un tercero. Podés construir un cliente, un adaptador o un servicio compatible con Kanb bajo los términos que quieras.

Licencia y modelo

La idea en una frase Kanb es libre y su código es público. Lo que se cobra no es el programa: es una excepción a las obligaciones de su licencia, para las organizaciones que no pueden aceptarlas.

Kanb se publica bajo AGPL-3.0. Es una licencia libre con una condición: quien modifique Kanb y lo ponga a disposición de otros por red está obligado a publicar sus modificaciones. Eso impide que alguien tome el trabajo, lo cierre y lo ofrezca como servicio sin devolver nada.

El código es abierto porque la inspeccionabilidad es parte del producto. Kanb corre en tu máquina, lanza procesos y —con tu consentimiento explícito— lee transcripciones. «Confiá en mí» no es vendible a código cerrado desde esa posición.

ParteLicenciaPor qué
La aplicación AGPL-3.0 Auditable por quien la instala; protegida contra ser cerrada por un tercero.
protocol/ Apache-2.0 Para que cualquiera implemente clientes o servicios compatibles sin adoptar copyleft.
El servicio gestionado cerrado Vive en un repositorio aparte. Nunca es requisito para usar Kanb en local.

Dónde está el negocio

Muchas organizaciones tienen políticas internas que prohíben usar software con licencia AGPL, incluso puertas adentro. Para ellas Kanb vende una licencia comercial: una excepción a esas obligaciones. Lo gratuito es el programa con copyleft; lo que se cobra es el derecho a usarlo sin él.

Lo que Kanb no vende, y no va a vender: acceso más barato a los modelos. Cada persona sigue necesitando su propia suscripción con su proveedor, exactamente igual que sin Kanb — compartir una cuenta entre varios empleados viola los términos de servicio de los proveedores y expone a quien lo haga a que le suspendan las cuentas. Lo que Kanb aporta es control, límites de gasto y evidencia sobre lo que un equipo consume y aprueba.

Estado de la implementación

La idea en una frase El marco de decisiones está cerrado; la construcción va por la mitad, y esta tabla dice honestamente por dónde.

PiezaEstadoDetalle
Decisiones de arquitecturacerradoTrece ADRs aprobados más un modelo de amenazas.
Persistencia durable y recibosconstruidoSesiones, dispatches, encarnaciones y recibos que solo se agregan.
Protocolo versionadoconstruidoCon suite de conformidad entre la persistencia y los contratos.
Ejecución de agentesparcialLanza, transmite y detiene. Falta conectar el ciclo de vida durable al ejecutor.
Aislamiento por trabajoparcialCada trabajo en su copia del repositorio; falta la interfaz.
Consumo y cuotaparcialSe observa y atribuye; el sondeo por CLI está construido, pero ningún proveedor expone hoy un subcomando documentado que lo alimente.
Import de consumo históricoconstruidoCon consentimiento por ruta y revocación; sin acceso al contenido de las conversaciones.
Modelos y capacidadesparcialSe enumeran y se distingue lo declarado de lo verificado; falta mostrarlo en la interfaz.
Clasificación de agentesparcialClasifica y gatea la re-adopción; no explora procesos del sistema todavía.
Control de admisiónpendienteLa semántica está decidida; falta implementarla completa.
Coordinación multiagentependienteEl grafo de dependencias entre trabajos.
Sincronización con móvilparcialEl contrato de comandos y su persistencia local existen y están probados; el transporte no.

Esta tabla se mantiene deliberadamente honesta. Un producto que promete lo que no tiene es exactamente lo que este diseño intenta evitar en la telemetría — sería raro hacerlo en su propia documentación.

Índice de decisiones

Cada decisión de esta página está registrada como ADR en el repositorio, con su contexto, sus alternativas descartadas y sus consecuencias.

ADRDecisión
0001Kanb es un plano de control local-first; la aprobación humana es final.
0002Cliente abierto y servicio gestionado en repositorios separados, con licencias distintas.
0003El escritorio manda, el móvil acompaña, la sincronización usa eventos y bandeja de salida.
0006Conectar a través del CLI del usuario, sin custodiar credenciales de suscripción.
0007La telemetría de cuota es observada y de mejor esfuerzo, nunca autoritativa.
0008El control de admisión es una función pura; sin telemetría, permite.
0009Comandos estrechos en vez de complementos de propósito general.
0010Propiedad y ciclo de vida durables para las sesiones de agentes.
0011Obtener consumo y descubrir runtimes locales sin heredar confianza.

Kanb es software libre bajo AGPL-3.0, con el directorio protocol/ bajo Apache-2.0 para que cualquiera pueda implementar clientes compatibles. El código, los ADRs completos y el modelo de amenazas están en el repositorio público.