DOS Kernel

DOS es un kernel pequeño de código abierto que no confía en tus agentes de IA: verifica lo que realmente se envió a partir de evidencia de git, arbitra colisiones de archivos entre agentes paralelos y rechaza con razones estructuradas.

Documentación

DOS — el Sistema Operativo de Despacho

Atrapa a tus agentes de IA cuando mienten sobre lo que entregaron.

PyPI Python versions CI verified by DOS commit-claims License: MIT

📊 Míralo funcionar en repos reales: el marcador puntúa 15 repos populares construidos con IA (roborev, open-interpreter, crewAI, autogen, …) — cuánto escribieron los agentes, cuáles, y si la afirmación de cada commit está respaldada por su propio diff. Puntúa el tuyo: dos commit-audit --sweep --workspace . BASE..HEAD.

A terminal recording of the caught lie. The agent reports: Done! Shipped the login endpoint (AUTH1) and the password reset (AUTH2). git log shows one commit — AUTH1: ship the login endpoint. dos verify AUTH AUTH1 answers SHIPPED (exit 0); dos verify AUTH AUTH2 answers NOT_SHIPPED via none (exit 1) — caught. The exit code is the verdict: gate the agent's done on it and a false claim cannot land.
Toda la propuesta en una grabación: el agente afirma que dos funciones se entregaron; git respalda una. dos verify responde desde los commits, la mentira sale con 1, y una compuerta sobre ese código de salida rechaza el falso "hecho". Cada línea es la salida textual del CLI real — scripts/build_caught_lie_cast.py la vuelve a grabar cada vez que la salida cambia.

Two agent fleets side by side. Left, no referee: agents all report 'done!', every report is believed, and silent corruption (lies, collisions, spin) piles up into a codebase that 'sorta works' and can't be changed. Right, DOS adjudicates: dos verify reads git and the run branches to SHIPPED (exit 0, land it) or NOT_SHIPPED (exit 1, re-dispatch — caught), and that verdict steers the next step.
Ejecuta una flota de agentes en un solo repo. El bucle izquierdo solo parece progreso; el derecho puedes dirigirlo. La única diferencia es un veredicto que DOS lee del mundo real — aquí, git — nunca de la palabra del agente.

Un agente de IA te dirá que terminó. DOS verifica el mundo real en lugar de creerle a su palabra — y la pieza más cercana del mundo real es tu historial de git. Un agente dice que entregó el endpoint de login; ¿lo hizo? Ejecuta un comando, dos verify, y responde desde los artefactos que el trabajo dejó atrás, no desde lo que el agente escribió: un commit respalda la afirmación → SHIPPED, salida 0; nada aterrizó → NOT_SHIPPED, salida 1. La historia del agente nunca entra en juego. (Git es solo el primer testigo que DOS lee; el árbol de archivos, el reloj, un estado de CI, el estado propio de un entorno de prueba son otros — cualquier cosa que el agente no haya creado.)

dos verify AUTH AUTH1   # → SHIPPED      AUTH AUTH1 e62f74d   (exit 0)
dos verify AUTH AUTH2   # → NOT_SHIPPED  AUTH AUTH2           (exit 1)

Esa es la versión más pequeña. También escala: apunta a una docena de agentes a un solo repo — en CI, en una flota, compitiendo sobre los mismos archivos — y DOS también te dice cuáles se están pisando entre sí, cuál está girando en círculos, y qué afirmación de "hecho" es real. Cada respuesta viene de los artefactos (git, el árbol de archivos, el reloj), nunca de la narración. Funciona en un repo git simple con cero configuración y se vuelve más inteligente cuanto más le cuentas, y lo único que instalas es un pequeño paquete de Python.

Configuración — usa DOS en tu repo

DOS es un paquete de Python que instalas dentro del repo git existente donde tus agentes trabajan. No necesitas clonar ni bifurcar el código fuente de DOS a menos que planees desarrollar DOS tú mismo.

cd path/to/your-repo
pip install dos-kernel
dos init --hooks auto   # detects the agent runtime(s) already in this repo
dos doctor              # shows exactly what this workspace is using

A partir de entonces, tu agente no puede decirte "hecho" a menos que el trabajo realmente haya aterrizado, dos agentes no pueden sobrescribir silenciosamente los archivos del otro, y una ejecución que se detiene se marca en lugar de girar silenciosamente. dos init imprime la configuración y las entradas de hook que escribió; eliminar esas entradas generadas deshace la configuración. Si no se detecta un runtime, lo dice y lista las opciones explícitas — nunca adivina.

Lo que quieresEmpieza aquí
Usar DOS en mi repoInstala el paquete, luego ejecuta dos init --hooks auto en ese repo (la configuración anterior).
Ver la demo de 60 segundosEjecuta uvx --from dos-kernel dos quickstart; crea y elimina un repo desechable.
Leer o cambiar DOS en síClona este repositorio y usa la instalación para contribuidores; la mayoría de los usuarios no necesitan el clon del código fuente.

v0.30.0 · más de 5,600 pruebas · CI: Python 3.11–3.13 en Linux + una ejecución de humo en Windows 3.13 · la única dependencia de runtime es PyYAML · MIT.

🧭 A dónde ir después: el porqué y la evidencia (la historia en palabras simples, la respuesta de 20 líneas de bash, lo que está probado), conéctalo a tu stack (MCP · hooks · instalación), la referencia de syscall + CLI, o, ¿lo lees como agente de IA?, AGENTS.md — build/test/check en tres líneas. El mapa completo es el router justo debajo.

🔤 Cinco palabras en las que se apoya el resto de esta página. Un plan es un objetivo con nombre (AUTH); una fase es un paso entregable de él (AUTH1); un carril es la porción del árbol de archivos que un agente puede tocar; el oráculo es la parte de DOS que lee la evidencia y dictamina; un sello es la marca que una fase entregada deja en el asunto de un commit (AUTH1: …) — lo que el oráculo busca con grep. Ese es todo el vocabulario.

En palabras simples

Un agente de codificación hace trabajo, luego te cuenta cómo fue. Normalmente la historia es verdadera; a veces es el alegre "¡todo el trabajo completado!" de un trabajador que no entregó nada. Con un agente lo detectas tú mismo al releer su salida — un impuesto real que ya pagas. Ejecuta veinte a la vez y ese impuesto deja de ser pagable: nadie lee todo, cada trabajador califica su propia tarea, y los problemas no verificados se acumulan silenciosamente hasta que el código más o menos funciona y nadie puede cambiarlo con seguridad. DOS es el árbitro que nunca lee la historia — lee lo que sucedió (el commit, el archivo, el reloj) y te entrega un veredicto que ninguna narración puede mover. Cuesta aproximadamente una tarde, tiene una dependencia de runtime, y se mantiene en su carril: te dice qué sucedió, nunca si el código es bueno — la calidad se queda con tus pruebas y revisiones. (La versión completa en palabras simples.)

Medido, no afirmado

Cada número aquí se puntúa contra un hecho que el agente no puede falsificar (el estado de la base de datos de un entorno de prueba, el historial de git). Una compuerta de DOS atrapó 15 mentiras de "lo entregué" en 258 tareas en dos modelos con cero falsas alarmas; el mismo árbitro detuvo 6 de 8 colisiones silenciosas en un registro compartido; terminar ejecuciones condenadas en el momento correcto ahorró ~11% del cómputo de la flota con 0 de 1,634 ganadores eliminados por error; y la etiqueta de admisión del conjunto de recompensas elevó la precisión de aceptación 60% → 100% al purgar el veneno que un recolector autocalificado mantiene. La metodología, las dos figuras del momento clave, y el gradiente de honestidad proyectado-vs-apostado están en lo que está probado y lo que sigue siendo una apuesta.

Dónde está el resto de la documentación

Esta página mantiene el gancho, la demo, y el fallo que corrige. Todo lo más profundo vive en una página enfocada — encuentra la pregunta con la que llegaste y salta:

Estás preguntando…Ve a
"¿Qué es esto en palabras simples, y por qué debería importarle a mi equipo? ¿Es real?"Por qué un árbitro — la historia en palabras simples, las respuestas de 20 líneas de bash / Temporal, y la evidencia completa de probado/apuesta
"Muéstramelo funcionando, rápido."Demo opcional, justo debajo — un comando en un repo desechable
"Ya ejecuto agentes — ¿cómo conecto el veredicto a mi stack?"Conéctalo — MCP, hooks de runtime, el nivel de código de salida, frameworks de flota, y la matriz de instalación
"¿Cuál es la superficie completa de comandos / syscalls?"La referencia ABI de syscall y CLI — cada verbo, las tres pantallas en vivo, el diario de veredictos
"Ejecuto una flota a diario — ¿cómo la observo, la triaje, la depuro?"Operar una flota + Depurar una flota atascada
"¿Cómo la adapto a mi organización sin bifurcarla?"Extenderla — los siete ejes, el índice de documentación, los playbooks
"¿Qué está realmente probado, y puedo re-ejecutarlo?"Para investigadores — afirmaciones → invariantes → reproducción
"Soy un agente de IA orientándome en este repo."AGENTS.md — qué es DOS en tres líneas, build/test/check, los ~5 archivos que vale la pena leer
"¿Qué superficies son estables y cuál es la ventana de deprecación?"docs/STABILITY.md — la promesa de compatibilidad, qué significa el número de versión, y qué nunca se romperá

Demo opcional — pruébalo en 60 segundos

¿Tienes una terminal? Esto ejecuta todo en un repo desechable — un comando lo prepara, hace un commit real, lo verifica, y limpia después de sí mismo:

pip install dos-kernel      # PyYAML is the only runtime dep
dos quickstart              # → SHIPPED AUTH AUTH1 … then NOT_SHIPPED AUTH AUTH2

Un SHIPPED, un NOT_SHIPPED: el primero es una afirmación que git puede respaldar, el segundo es una afirmación para la que nada aterrizó. Ese contraste es el producto. La demo cierra con un router hacia donde ya ejecutas agentes — una pestaña de Claude Code / Cursor (dos init --hooks), un host MCP, un paso de CI, o una flota — para que tu próximo movimiento sea una línea, no una búsqueda en la documentación. (Agrega --keep ./demo para conservar el repo y explorarlo. ¿Ni siquiera quieres la instalación? uvx --from dos-kernel dos quickstart ejecuta la misma demo de forma efímera — no deja nada atrás.) Lo mismo a mano, en cinco líneas, está en docs/QUICKSTART.md.

The dos verify money-moment. Two equally-confident agent claims, checked against git. Left, what the agent claims (forgeable): 'Shipped AUTH1 — the login endpoint is done' and 'AUTH2 is done too — all work completed!'. Right, what git actually records: one real commit e389e8b 'AUTH1: ship the login endpoint', and no commit anywhere mentions AUTH2. The two verdicts: dos verify AUTH AUTH1 finds the token in a real commit subject → SHIPPED, exit 0, via grep-subject; dos verify AUTH AUTH2 finds it nowhere → NOT_SHIPPED, exit 1, via none. The confident AUTH2 claim collapses the instant no commit backs it.
Dos afirmaciones igualmente confiadas, un veredicto para cada una — SHIPPED para la que git puede respaldar, NOT_SHIPPED para la que nada aterrizó. Cada cadena es la salida textual de examples/demo/verify_demo.sh. Recórrelo localmente paso a paso para la versión clicable (es un archivo HTML — clona el repo y ábrelo en un navegador; GitHub muestra su fuente, no la página en ejecución).

La victoria real más pequeña: en un paso de CI o un bucle de despacho, reemplaza la línea que confía en el "hecho" de un agente con dos verify PLAN PHASE y ramifica según su código de salida (0 entregado / 1 no). Sin análisis, sin plan, sin configuración — el libro de cocina de integración con CI lo recorre de principio a fin. Para ejecutarlo en un repo con la forma del tuyo, comienza con Integra un repo en 10 minutos.

Apunta al mismo testigo a una cola de revisión cuando los commits se acumulan más rápido de lo que alguien puede leerlos. Revisión residual pliega el veredicto por commit de commit-audit en tres bandas — CLEARED (el diff fue testigo de la afirmación, así que gasta ~0 atención en volver a preguntar "¿hizo lo que dijo?"), RESIDUAL (una afirmación que git no pudo respaldar — el 100% del humano), y el resto sin afirmación. En los últimos 200 commits de este propio repo, despejó 170 de 171 afirmaciones verificables: esa es la re-revisión que te saltas, probada por git en lugar de la puntuación de confianza de un modelo. (CLEARED significa que la forma del cambio coincidió con su afirmación — no que el código sea correcto; la revisión de corrección aún aplica a cada commit. La banda solo puede pedir más ojos, nunca menos.)

Siguiente nivel — conecta el veredicto a tu propio stack: Conéctalo.

Qué sale mal en una flota

Ejecuta un montón de agentes a la vez sin nadie que arbitre, y así es como va: cada trabajador reporta su propio éxito, y crees los reportes, porque ¿qué más hay para guiarte? Los problemas no verificados se acumulan silenciosamente — una mentira aquí, dos agentes pisando el mismo archivo allá, un poco de expansión de alcance, un trabajador girando en círculos — hasta que el código más o menos funciona y nadie puede cambiarlo con seguridad.

El problema es que lanzaste los agentes y luego los dejaste calificar su propia tarea. DOS te da la señal que falta — un veredicto desde la verdad del terreno — para que el bucle se cierre. Aquí está la misma flota bajo ambos regímenes:

Los dos regímenes como diagrama de flujo — SIN ÁRBITRO: crees la narración; DOS ADJUDICA: diriges según un veredicto
flowchart LR
  subgraph OPEN["NO REFEREE — you believe the narration"]
    direction TB
    A1["agent: 'done!'"] --> B1[["believed"]]
    A2["agent: 'done!'"] --> B1
    A3["agent: 'done!'"] --> B1
    B1 --> C1["silent corruption piles up<br/>(lies · collisions · spin)"]
    C1 --> D1["'sorta works' — can't be changed"]
  end
  subgraph CLOSED["DOS ADJUDICATES — you steer on a verdict"]
    direction TB
    A4["agent: 'done!'"] --> V{{"dos verify<br/>reads git"}}
    V -->|in git ancestry| S["SHIPPED (exit 0)"]
    V -->|found nowhere| N["NOT_SHIPPED (exit 1)"]
    S --> L["land it"]
    N --> R["re-dispatch / flag — caught"]
    R -.verdict steers the loop.-> A4
  end

Aquí están los fallos que una flota realmente produce, cada uno junto a la verdad del terreno que contradice silenciosamente la historia del trabajador — y el veredicto que DOS devuelve:

Un trabajador……pero la verdad de fondo esVeredicto de DOS
dice que envió una unidad de trabajoningún commit llegó a registrarseverifymentira detectada
lo intentó, pero el commit falló silenciosamenteningún commit llegó a registrarseverify (el fallo intermitente — indistinguible de una mentira sin git)
edita archivos que otro trabajador poseedos agentes, un archivo compartidoarbitraterechazar al segundo
excede la región de archivo que reclamóel alcance llega más allá del árbol declaradoscope-gateRECHAZAR (antes de que la escritura se materialice)
reporta "avanzando"0 commits, solo un latido recientelivenessGIRANDO

La primera fila es la más común. La señal clásica es una línea alegre de una sola frase, "¡todo el trabajo completado!", de un trabajador que hizo poco o nada. DOS nunca lee esa línea; lee la verdad de fondo, así que la afirmación se derrumba en el instante en que ningún artefacto la respalda (más en docs/108). Eso también es lo que lo hace barato de adoptar: verify no necesita plan, ni registro, ni configuración, y el código de salida es el veredicto — cualquier shell o paso de CI puede ramificar según él sin analizar una palabra.

¿Prefieres verlo en movimiento? Los dos bucles también son una animación autocontenida que recorres fotograma a fotograma — clona el repositorio y abre docs/assets/loop_visual.html en un navegador. (Es un archivo HTML, así que GitHub muestra su fuente en lugar de ejecutarlo — ábrelo localmente).

Alcance del arrendamiento — un solo sistema de archivos hoy. La mitad de verificación (verify, commit-audit, liveness) viaja entre máquinas libremente porque lee el historial de git. La mitad de admisión (arbitrate, arrendamientos de carril) es solo de sistema de archivos local: el WAL vive en un disco, y los trabajadores en máquinas separadas no comparten ningún punto de serialización. Una flota que ejecuta todos sus trabajadores en una máquina o en un sistema de archivos compartido está completamente cubierta; una flota que abarca múltiples hosts debería tratar dos arbitrate como consultivo (no como un mutex estricto) hasta que un controlador de arrendamiento remoto se publique. Ver docs/366 para el diseño.

Hasta dónde lo llevas

Funciona en un git init simple con cero configuración, y se vuelve más inteligente cuanto más le cuentas. No adoptas un marco y eliges un nivel; empiezas en el extremo superficial y sigue dando frutos a medida que te adentras — el mismo núcleo en todo el camino:

  • Cero configuración. Apunta dos verify PLAN PHASE a un repositorio git simple — sin plan, sin registro, sin dos.toml. Responde solo desde el historial de commits (via grep-subject / via none). Esto es todo el QUICKSTART y la victoria de CI del primer día mencionada arriba.
  • Cuéntale tu estructura. dos init escribe un dos.toml (carriles, rutas, gramática de envío como datos); añade un documento de plan y dos plan coloca la afirmación de cada fase junto al veredicto del oráculo. Aquí está exactamente cómo se ve un archivo de plan (copiable, con ida y vuelta con el lector integrado), y cuatro ejemplos de espacios de trabajo trabajados.
  • Enséñale tus propios tipos. Declara tus propias razones de bloqueo, veredictos de compuerta, renderizadores de salida, predicados de admisión, un juez respaldado por modelo, un dialecto de plan personalizado, o un controlador de host completo — todo como política del espacio de trabajo, nunca un fork. El mapa es docs/HACKING.md (siete ejes de extensión) + el copiable examples/dos_ext/.

Cómo lo conectas

Esa pendiente es cuán profunda llega tu configuración. El otro eje es cómo llamas al árbitro en absoluto — y adoptas a través de la superficie que coincida con cómo ya trabajas, no reestructurando tu pila. Los mismos veredictos del núcleo son alcanzables a través de cada fila aquí, de menor fricción primero:

SuperficieAdóptalo cuando…El movimiento
Servidor MCPconduces un agente a través de un host MCP (Claude Desktop, Cursor, Cline, una app de Agent-SDK)añade una línea a la configuración del host ({ "command": "dos-mcp" }) y pide al agente que dos_verify su propia última afirmación — cero código. La ruta consultiva (el agente pregunta). Ver Dale a tu agente un detector de mentiras.
Hooks de tiempo de ejecuciónejecutas un bucle de agente (Claude Code, Cursor, Codex CLI, Gemini CLI) y quieres que el veredicto actúe, no solo esté disponibledos init --hooks <runtime> conecta el veredicto en la configuración de hooks de ese host — una llamada rechazada es denegada antes de ejecutarse, un "hecho" falso es rechazado. La ruta de cumplimiento (el host deniega). Un comando, sin YAML editado a mano. Ver QUICKSTART + docs/221.
Código de salida CLItienes cualquier entorno que ejecute comandos — un paso de CI, un hook de pre-push, o una CLI agéntica como aider cuyo comando de lint/test confía en un "hecho"ramifica según el código de salida de un verbo de dos (dos verify: 0 enviado / 1 no; dos commit-audit: 0 limpio / 1 sobre-reclamación) — el veredicto es el código de salida, sin adaptador de hook y sin cliente MCP. El nivel honesto para hosts sin hooks (Windsurf, Warp, Zed). El recetario del nivel de código de salida.
API de Pythontu despachador/orquestador ya es Pythonimport dos y llama a las syscalls puras (dos.oracle.is_shipped, dos.arbiter.arbitrate, …) — estado-entrada / veredicto-salida, sin subproceso. El recetario de Python.
Marco de flotatu flota ya se ejecuta en LangGraph, CrewAI, AutoGen, o los SDK de Agentes de OpenAI/Claudeatornilla el árbitro en la propia costura del marco — un nodo árbitro, una condición de terminación que solo git puede satisfacer, una barrera de salida con un disparador de git. Una función, sin reescritura; cada costura ejecutada contra el marco real. El recetario de marco de flota.
Runtime de enjambretus agentes se ejecutan en Hermes, OpenClaw, o un enjambre autónomo estilo SwarmClaw — herramientas privilegiadas, documentos de memoria compartida / tableros de tareas, y sin administrador de bloqueos para ningunocoloca un adaptador de dos funciones en el bucle de ejecución de herramientas: guard_action rechaza un comando de ejecución arbitraria antes de que se ejecute, y acquire_lease / release_lease encierran cada escritura de estado compartido para que la actualización perdida nunca se materialice. Sin import dos — ejecuta la CLI; el hook de pre_tool_call de Hermes también habla DOS nativamente (dos hook pretool --dialect hermes). El ejemplo trabajado y medido con A/B de Hermes / OpenClaw + docs/278.
Paquete de habilidadesejecutas agentes en Claude Code y quieres el flujo de trabajo, no solo el veredictodos init --skills coloca guiones editables de SKILL.md que conectan las syscalls en un bucle de instantánea → auditoría → compuerta → toma-un-carril. Ver QUICKSTART §2.
Controladortus carriles deben ser calculados, o añades un juez respaldado por proveedorescribe un dos/drivers/<host>.py (un LaneTaxonomy + una fábrica de configuración), cargado por nombre, nunca importado por el núcleo. El mapa es HACKING.md.

Los dos ejes son independientes: un repositorio de cero configuración puede adoptar a través de cualquier superficie, y uno profundamente configurado aún responde a través de las mismas herramientas CLI y MCP. Empieza en la fila superior — es la que no cuesta nada probar. Las dos primeras filas también se componen: MCP aconseja (el agente verifica su propio trabajo), los hooks hacen cumplir (el host detiene una mala acción) — conecta ambas para el bucle completo.

Esas superficies son la mitad aguas arriba de la cadena de valor — quién llama al árbitro. Los mismos veredictos también fluyen aguas abajo, hacia los sistemas que actúan sobre ellos: cada adjudicación aterriza en un diario de veredictos que dos export drena hacia tu pila de observabilidad (Datadog / Honeycomb / Grafana — docs/266), dos notify empuja lo-que-necesita-un-humano a Slack, dos reward compuerta lo que un ajuste fino puede entrenar, y dos attest acuña un recibo firmado que un escéptico puede verificar sin acceso al bucle (docs/246). Un núcleo, un vocabulario de veredictos, desde la llamada de herramienta del agente hasta tu panel.

Siguiente nivel — ejecútalo todos los días: Operando una flota.

Del mismo equipo

DOS es una de tres herramientas abiertas de Anthony Chaudhary para ejecutar agentes de IA en los que realmente puedes confiar — en tres momentos diferentes:

  • fak — el núcleo de agente — DOS lee lo que un agente ya hizo (después del hecho, desde git y otros testigos que no puede falsificar); fak gobierna lo que un agente tiene permitido hacer mientras sucede. Un único binario estático de Go que se sitúa frente a tu motor de tokens y adjudica cada llamada de herramienta en el límite — compuerta de capacidad, cuarentena de resultados de herramientas, rastro de auditoría — la compuerta en línea al árbitro fuera del bucle de DOS. go install github.com/anthony-chaudhary/fak/cmd/fak@latest · docs.
  • Diffgram — el almacén de datos de IA para la supervisión humana de datos de IA (etiquetado, flujo de trabajo, catálogo). Donde DOS y fak supervisan a los agentes, Diffgram supervisa los datos de los que aprenden y que producen.

Cita

Las ideas aquí están escritas en un artículo — "Verification Is All You Need — But Not Where You Think" — sobre el árbitro fuera del bucle para flotas de agentes. Un PDF construido vive en paper/releases/; la preimpresión de arXiv está en preparación. Hasta que el ID de arXiv se publique, cita el repositorio:

@misc{dos_kernel,
  title        = {Verification Is All You Need --- But Not Where You Think},
  author       = {Chaudhary, Anthony},
  howpublished = {\url{https://github.com/anthony-chaudhary/dos-kernel}},
  note         = {DOS --- the Dispatch Operating System; arXiv preprint in preparation},
  year         = {2026}
}

Licencia

MIT — ver LICENSE.