Desarrolla con varias IAs, con garantías. Tu agente escribe; Karajan gobierna: método TDD-first, revisión IA-cruzada en cada commit, gates de git — el falso verde es imposible.
Tu agente de IA (Claude Code, Codex, Gemini CLI, Cursor…) escribe el código — Karajan gobierna cómo ocurre. kj instala un método que tu agente sigue en cada tarea (RAG antes de suponer, card primero, tests primero) y lo hace cumplir con gates de git: cada commit exige el veredicto de una IA distinta, los hallazgos de seguridad no los anula nadie, y la rama base solo se mueve por PR. El que hace nunca se califica a sí mismo — y el falso verde es estructuralmente imposible.
El prompt engineering sacaba una buena respuesta de un buen prompt. El context engineering curaba lo que veía el modelo. La frontera de 2026 es el loop engineering: dejas de promptear al agente a mano y diseñas el sistema que lo promptea, lo verifica y decide qué pasa después — hasta que se cumple el objetivo o te lo devuelve a ti. Karajan se construyó alrededor de ese bucle antes de que el término calara:
Separación maker / checker — un coder contra roles independientes de reviewer, tester y security, con Solomon arbitrando los conflictos. El maker nunca corrige su propio trabajo.
Verificación determinista — TDD, tests de aceptación por HU, gates de SonarQube y guardarraíles deterministas. Verificar es tests, no intuición.
La escalera de autonomía L1 → L2 → L3 — el eje interactive | assisted | autonomous (v3.7.0). Informe, luego fixes asistidos, luego kj autorun desatendido — con default interactive, así que tú decides.
Un spine de estado duradero — sesiones, el HU Board, journals, el índice RAG y kj resume mantienen vivo el bucle entre runs.
El caveat que el loop engineering recalca — los bucles desatendidos cometen errores desatendidos — está diseñado de serie: los runs autónomos listan sus defectos residuales, cada historia aterriza tras una PR, y kj-trash hace snapshot de las operaciones destructivas. Lee el mapeo completo de building blocks →
Arranque en una línea
Dile a tu agente: “lee karajancode.com/start.md y haz lo que dice”. Instala el stack completo, detecta si el proyecto es nuevo o existente, activa el entorno — y PARA a esperarte cuando un paso necesita sudo o una cuenta. Instalación →
Tu agente, gobernado
El playbook aterriza en CLAUDE.md, AGENTS.md y GEMINI.md desde una única fuente: RAG primero, card primero (kj hu), TDD, ADRs en git (kj adr). Los briefs de rol (kj brief) dan a tu agente el método destilado de triage, planner, architect, tester, security y audit. Trabaja con tu agente →
Revisión IA-cruzada + gates de git
kj review --staged liga el veredicto de una IA distinta al diff exacto — cambia el código y hay que revisarlo de nuevo. ¿Discrepas? Una tercera IA arbitra (kj solomon); los hallazgos de seguridad no los anula nadie. El gate pre-commit lo convierte en ley. Los gates →
RAG sobre tu código
Se construye al instalar y se refresca solo: kj rag query responde qué hace el código para que ningún agente adivine. En proyectos existentes, kj onboard produce un Architecture Brief antes de tocar nada.
Ecosistema que se repara solo
¿Tu agente choca con un bug de kj? kj report-issue lo diagnostica y lo sube — sanitizado, deduplicado y solo con tu aprobación. Los fixes vuelven a todos. Referencia de comandos →
Modo headless
El pipeline multiagente clásico sigue vivo para CI y automatización: kj run orquesta roles coder/reviewer/tester en subprocesos sin humano delante, con los mismos gates. Modo headless →
Torneo gobernado (v4.15)
Una tarea, N coders en carriles worktree aislados: kj tournament reparte, --score construye un scoreboard determinista sin LLM, un juez cross-AI sin conflicto de interés elige al ganador, y --crown lo corona por el gate normal de review — ganar da candidatura, no bypass.
Minor en la que Karajan aprende a gobernar el ESTADO de un proyecto, no solo sus actos — porque la degradación ocurre precisamente en los días en los que nadie mira. Sale entero el Karajan Steward: cada garantía declarada responde UNA de cuatro cosas — ok, rota, desconocida (la evidencia caducó → refrescar) y no observable (nunca hubo dónde mirar → instrumentar), las dos respuestas honestas cuya ausencia dejó degradarse durante semanas a un proyecto real tras una fachada verde. kj steward sweep deja el veredicto versionado EN el repo (memoria compartida, nunca el registro de una máquina), sella cada barrido en la cadena de decisiones, y cardea cada rotura como trabajo PROPUESTO — evidencia, desde cuándo, y un plan de remedio que nada ejecuta sin revisión; el Sentinel dice lo roto al empezar a trabajar, una vez por sesión e imposible de ignorar, y bloquea casi nunca (solo seguridad y principal en rojo persistente, solo donde el proyecto lo adoptó). La cobertura fantasma gana sus dos detectores — grafo de llamadas para unitarios y CRUCE DE LITERALES para E2E, el caso que un grafo no ve: un spec buscando un aria-label que solo existía dentro de un método inalcanzable. Con ella aterriza la épica de credibilidad entera: alcanzabilidad de miembros dentro de un perímetro validado en campo con slots static/instancia y campos de constructor, informes de código muerto encabezados por la DERIVADA, diffs que solo borran sin deber tests, sonar vetando solo las líneas que la PR añade, presupuestos generados que ignoran lockfiles, y un escaneo de privacidad que sabe que un SHA de git no es un teléfono. Las afirmaciones con fuente llegan a los artefactos escritos: un cuerpo de PR con un dato desmentido por su propia fuente se rechaza antes de que la PR exista. Además: una contribución externa de seguridad — el token del HU Board comparado en tiempo constante (gracias, @ofri-peretz) — y tres fixes de campo: el escáner de Sonar respeta el sonar-project.properties del repo, kj board ya no arranca un servidor que el config mandó apagar, y las rutas de Windows llegan a ~/.codex/config.toml como TOML válido.
Minor en la que la familia gana su pieza más privilegiada y el método aprende a dudar de la propia IA. Nace la Karajan Console (@karajan-family/console, publicada 0.1.0 → 0.3.0 durante este ciclo): la consola web de administración de una instancia de la familia — salud de los corpus, accesos de personas como el binding IAM real del servicio, operaciones como runs de workflow con GitHub App, todo sellado en una cadena de auditoría hash-encadenada, con página estática sin build y dos proveedores de identidad: Google Sign-In, o Identity-Aware Proxy provisionado entero por terraform — y la consola verifica la aserción incluso detrás de IAP, porque una segunda capa que se fía de la primera es decoración. Guiada por una instancia real desde el primer día: sus informes de campo arreglaron una carrera de concurrencia en la cadena de auditoría y moldearon las notas de despliegue. Y afirmaciones con fuente (ADR aceptado): el transcript es el registro de fuentes, kj claims check cruza cada dato duro que la IA afirma contra lo que de verdad se ejecutó — respaldado, sin respaldo, o desmentido por su propia fuente, que es una alucinación probada. Además: un guard para un bug que JavaScript se niega a contar (un miembro de clase declarado dos veces: gana el último en silencio — 17 días de una pestaña vacía en producción de una instancia real), el parser de veredictos de kj review arreglado en el camino que de verdad recorre, dos fixes el mismo día para un reportero de campo en Windows, un agujero de inyección de shell cerrado en un workflow reusable, y las actions del propio repo fijadas a SHA de commit — lo que kj genera ya estaba fijado; lo que kj es no se había puesto al día.
Minor en la que dos reglas dejan de vivir en la memoria del agente y se convierten en gates. Identity lock: cada clon declara quién lo trabaja (kj identity set — cuenta de gh + email de git, por desarrollador, nunca trackeado; el siguiente kj harden lo pide, con un humano confirmando), y el Sentinel rechaza gh, git push y cualquier git que firme commits bajo otra cuenta ANTES de ejecutarlo — autoría resuelta por git var con el entorno del propio comando, shells envoltorio y sustituciones escaneados por dentro, jamás un auto-switch. Nació de un incidente real: un gh sin switch explícito publicó como la cuenta de un cliente en un repo público. Board-sync gate: una card mergeada debe quedar movida en el tablero antes de que nada avance — el Sentinel deja pendiente la card de la rama en un merge verificado y rechaza commit, push, nuevo PR, otro merge y el cierre del turno hasta que la llamada REAL al tracker la limpia (update_card vía MCP o kj hu move). Destapó tres huecos de producción en su primera hora y gobernó la card de su propia creación en su primer merge real. Más el fix de campo de la 4.20.1: kj start por fin ve el proyecto en el que está.
Minor nacida de un proyecto real de campo (una demo de kubernetes con el código en backend/): el método era agnóstico del lenguaje sobre el papel, pero tres piezas concretas seguían asumiendo código de aplicación — ahora el Sentinel cuenta los edits de terraform/k8s/shell/Docker como fuentes (card-first, Stop gate y push gate disparan exactamente igual que con un .js), la infra tiene suites de verdad (terraform validate, helm lint, kustomize build, ansible-lint, con checkov encadenado como deep scan aditivo — una tool ausente se declara con su comando de instalación, jamás un verde falso), y kj audit --security pasa checkov por el mismo canal best-effort que semgrep, porque los misconfigs SON superficie de seguridad. Además, tres fixes reportados desde el campo y publicados en horas: codex exec perdió --full-auto upstream (ahora --sandbox workspace-write con retry legacy), kj start pasaba el haiku de Claude a agy (los modelos se filtran por FAMILIA de provider en el chokepoint), y la escotilla de escape del propio Sentinel solo existía en su mensaje de error — todo prefijo KJ_ALLOW_X=1 funciona ya en comando simple, fail-closed en cadenas, probado la misma noche en que deadlockeó la release de su autor.
Minor donde el método deja de fiarse de una suite verde sin más: el pre-gate de mutación se une a la review — una suite puede pasar con asserts débiles, y los mutantes supervivientes lo demuestran. Opt-in (method_gates.mutation: warn|block, nunca corre sin declararse) y solo sobre el diff staged: warn entrega los supervivientes como aviso dentro de la tarea del reviewer, block rechaza ANTES de gastar un token de reviewer, listando cada superviviente con su remedio. kj doctor declara ahora su nivel de garantía por host — el acoplamiento a Claude Code no es un bug, es un gradiente DECLARADO: el tier A tool-time necesita los hooks síncronos del Sentinel, el tier B commit-time (los gates de git) es el suelo en CUALQUIER host, el tier C re-verifica en CI; ejecuta kj desde codex o gemini y te dice exactamente qué garantías conservas. Y una semana de hallazgos de campo aterriza arreglada: kj start ya no llama vacío a un proyecto de infra (el código anidado en backend/app/… y los yaml/tf/sh/Dockerfile cuentan como fuente), kj agents --help enumera sus roles y providers reales alimentados de las constantes, y el guard de carriles aprendió qué es un par de comillas después de bloquear a su propio autor. La migración de familia se hace real: @karajan-family/code publica los mismos bits que karajan-code — el primer dual-publish bajo el scope de la familia.
Minor donde la gobernanza deja de ser una feature de kj y se convierte en PAQUETE: @karajan-family/governance llega a npm — Política, Decisión y Excepción como objetos abstractos de primera clase (deterministas, locales, sin LLM), con karajan-code como primer consumidor, no como dueño. La capa de policy completa sus tres tiers: la regla dispara ANTES del daño en tool-time (con el rol del agente que actúa), el diff violador no entra en commit-time, y CI re-verifica el PR contra la misma policy — cubriendo hasta el hook local manipulado. Las excepciones llevan el modelo probatorio completo: quién (identidad), regla exacta, justificación escrita en el momento y caducidad OBLIGATORIA que ejecuta el sistema — la vencida vuelve a bloquear sola, y a la regla concedida tres veces se le dice a la cara que ya no es una excepción sino la política real pidiendo cambio. Cada decisión de chokepoint deja rastro hash-encadenado y anclado en git: reescribir el log de ayer exige reescribir el repo de ayer. Y kj policy add: dices la regla hablando, el motor la valida, y nada se escribe sin tu confirmación.
Minor donde toda la familia Karajan se muda bajo un mismo techo: radar, rag, watch y la propia landing se fusionan en el monorepo con sus historias COMPLETAS (reescritas bajo la ruta de cada paquete — git log packages/rag cuenta toda la historia; los repos origen quedan congelados como referencia inmutable, y cada autoría importada firma con la dirección noreply). El prerequisito de seguridad llegó primero: aislamiento de carril — cada sesión muta solo SU worktree, denegado por el gate PreToolUse del Sentinel ANTES del daño, con escape auditado (dos sesiones chocando en un árbol fue un incidente real; nunca más). Y el tercer pilar: policy as code — .karajan/policy.yml declara reglas por rol en un vocabulario cerrado y fail-loud (una regla que el motor no puede aplicar es error de carga, jamás una regla muerta en silencio) y kj policy check/eval las evalúan deterministas en modo warn; el cableado de deny llega después. La prueba del techo: esta misma release actualizó su landing en el mismo repositorio y el mismo PR — la danza de delegación release→landing ha muerto.