HaltProof
Verificaciones deterministas de fallo cerrado y recibos a prueba de manipulación para salidas de agentes de IA.
Documentación
HaltProof
Orquestación de apagado de emergencia para clústeres Slurm, Kubernetes e IPMI, con un registro de atestación encadenado por hash y firmado con Ed25519 de exactamente lo que se ejecutó.
Orquestación de apagado firmada, con simulación previa por defecto, para clústeres Slurm, Kubernetes e IPMI, con un rastro de auditoría a prueba de manipulaciones.

HaltProof es una capa de orquestación de apagado de emergencia y prueba criptográfica de auditoría para clústeres de computación. No implementa un nuevo mecanismo de apagado de bajo nivel. Coordina las primitivas de clúster en las que ya confías (Slurm, Kubernetes, IPMI/BMC) y produce un registro firmado y a prueba de manipulaciones de exactamente qué se objetivo, qué se ejecutó y quién lo autorizó.
pip install haltproof-cli
(Las opciones completas de instalación, incluido el envoltorio npm, están en Instalación a continuación).
Por qué
Los operadores ya tienen las herramientas para drenar una partición de Slurm, aislar un grupo de nodos de Kubernetes o apagar físicamente un host mediante IPMI. Lo que suele faltar es:
- Una interfaz consistente entre esas herramientas durante un incidente, en lugar de tres conjuntos de comandos diferentes bajo presión.
- Una barandilla de seguridad con simulación previa por defecto, para que un grupo objetivo mal escrito no derribe los nodos equivocados.
- Un registro firmado y a prueba de manipulaciones de lo que sucedió: quién lo ejecutó, qué comandos se emitieron, contra qué nodos, si cada paso tuvo éxito y si el registro en sí ha sido alterado o le falta una pieza.
HaltProof es esa capa. Llama a scontrol, kubectl y ipmitool (o equivalentes invocables mediante mcp) y envuelve cada invocación en una atestación encadenada por hash y firmada con Ed25519.
Instalación
pip install haltproof-cli
También se publica un envoltorio npm para herramientas y tiempos de ejecución de agentes basados en Node.js:
npm install -g haltproof-cli
[!ADVERTENCIA] El paquete npm requiere que el paquete Python
haltproof-cliya esté instalado y enPATH. Es un envoltorio delgado deexecFileSync, no una reimplementación. Si no puede encontrar la CLI de Python, imprime un error procesable y sale con código distinto de cero en lugar de hacer silenciosamente otra cosa.
Tabla de contenidos
- Características
- Inicio rápido
- Comandos
- Arquitectura
- Modelo de seguridad
- Servidor MCP (para agentes de IA)
- Comparación
- Qué es HaltProof y por qué existe
- Preguntas frecuentes
- Contribuciones
- Licencia
Características
- Simulación previa requerida por defecto.
haltproof haltimprime exactamente qué comandos ejecutaría, contra qué nodos, y aún así escribe una atestación firmada de ese plan, a menos que pases--confirm. La compuerta reside en un único punto de estrangulamiento (haltproof.backends.runner.run_step) por el que pasan los tres backends, por lo que no puede ser eludida silenciosamente por la ruta de código de un backend. - Una interfaz para tres backends reales.
kubernetes(víakubectl),slurm(víascontrol) yipmi(víaipmitool) implementan cada uno la misma interfaz de cuatro operacionesClusterBackend:drain,isolate_network,power_fence,status. Un backend que no soporta una operación, por ejemplo Kubernetes no tiene una primitiva física de apagado por energía, devuelve un resultadoSKIPPEDcon una explicación en lugar de lanzar una excepción, de modo que un apagado en un entorno mixto aún produce una atestación completa. - Atestaciones encadenadas por hash y firmadas con Ed25519. Cada apagado, simulado o ejecutado, agrega un registro firmado a un registro local NDJSON de solo agregar. Cada registro incorpora
prev_hash, el hash de contenido del registro anterior, de modo quehaltproof verify --chainpuede detectar una entrada eliminada o reordenada que la verificación de firma de un solo registro pasaría por alto. - Salida estructurada en cada comando.
--json(o--format json) está disponible enhalt,verify,statusykeygen, de modo que un script o un agente puede analizar el resultado sin extraer texto formateado para humanos. - Un servidor MCP real, construido para agentes.
haltproof mcp-serverexponehalt,verify,verify_chain,statusykeygencomo herramientas MCP sobre stdio, construido sobre el SDK oficial de Pythonmcp. Llama a las mismas funcioneshaltproof.coreque llama la CLI, de modo que un agente que invoca la herramienta MCP obtiene el comportamiento idéntico de simulación previa por defecto que un humano obtiene de la CLI. - Probado. 76 pruebas, 90% de cobertura general de líneas, ejecutadas y confirmadas en esta auditoría con
pytest -v --cov=haltproof --cov-report=term-missing. Las pruebas de backend simulan llamadassubprocess; ninguna requiere un clúster real.
Inicio rápido
[!IMPORTANTE]
haltproof haltes una no-operación sin--confirm. Imprime el plan y escribe una atestación de simulación previa firmada, pero nada destructivo se ejecuta hasta que pases--confirmexplícitamente.
# Generate a signing key for attestations (do this once).
haltproof keygen --output ~/.config/haltproof/ed25519_key
# See what backend HaltProof auto-detected on this host.
haltproof status
# Dry-run a halt against an explicit node list. Nothing runs yet.
haltproof halt gpu-pod-a --nodes node-1,node-2
# Same halt, actually executed.
haltproof halt gpu-pod-a --nodes node-1,node-2 --confirm
# Verify a past attestation's signature and print its timeline.
haltproof verify 1
# Verify the entire attestation log's hash chain instead of a single
# record: this catches a deleted or reordered entry that a
# single-record signature check alone would miss.
haltproof verify --chain --attestation-log ~/.local/share/haltproof/attestations.jsonl
Cada comando también admite --json para salida analizable por agentes:
haltproof status --json
haltproof halt gpu-pod-a --nodes node-1 --json
Archivo de configuración (opcional)
Los grupos objetivo, el backend preferido y las rutas predeterminadas pueden vivir en un archivo haltproof.toml (verificado en el directorio actual, luego ~/.config/haltproof/config.toml, o en una ruta dada por --config / HALTPROOF_CONFIG):
backend = "kubernetes"
operator_id = "ops-team"
attestation_log_path = "/var/log/haltproof/attestations.jsonl"
[groups]
gpu-pod-a = ["node-1", "node-2", "node-3"]
[kubernetes]
namespace = "training"
[ipmi]
user = "admin"
Cada valor de configuración tiene una bandera CLI correspondiente, y una bandera explícita siempre gana sobre el archivo de configuración.
Comandos
La referencia a continuación se regenera a partir de la salida real de --help de la CLI.
haltproof halt TARGET_GROUP
Drena, aísla y apaga físicamente TARGET_GROUP. La simulación previa es el valor predeterminado; nada destructivo se ejecuta sin --confirm.

Options:
--nodes TEXT Comma-separated explicit node list, overrides
config group lookup.
--backend TEXT Backend to use: kubernetes, slurm, or ipmi.
--confirm Actually execute the halt. Without this, dry-run
only.
--reason TEXT Reason recorded for drain operations.
--operator-id TEXT Operator identity to record. Defaults to OS user.
--config TEXT Path to a haltproof.toml config file.
--attestation-log TEXT Path to the attestation log file.
--attestation-key TEXT Path to the Ed25519 private key used to sign the
attestation.
--no-sign Skip signing (not recommended); still logs the
record unsigned.
--remote-collector TEXT Optional URL to POST the signed attestation to.
--format [human|json] Output format.
--json Shorthand for --format=json.
haltproof verify [ATTESTATION_REF]
Verifica la firma de un registro de atestación, o toda la cadena de hash de un registro. ATTESTATION_REF es una ruta a un archivo de registro, o un id de atestación / número de secuencia para buscar en el registro. Pasa --chain en lugar de ATTESTATION_REF para verificar un --attestation-log completo: la firma de cada registro se mantiene, y ninguno ha sido eliminado o reordenado.
| Bandera | Descripción |
|---|---|
--attestation-log TEXT | Registro a buscar cuando ATTESTATION_REF es un id/número de secuencia, o para verificar con --chain. |
--trusted-key TEXT | Ruta a una clave pública Ed25519 de confianza; si se da, la clave de firma del registro debe coincidir. |
--chain | Verifica la cadena de hash completa de --attestation-log en lugar de un solo registro. |
--format [human|json] | Formato de salida. |
--json | Abreviatura de --format=json. |
haltproof status
Muestra los resultados de auto-detección del backend y, opcionalmente, la salud del grupo objetivo.
| Bandera | Descripción |
|---|---|
--backend TEXT | Backend para verificar el estado; por defecto es el backend auto-detectado/configurado. |
--nodes TEXT | Lista de nodos separada por comas para informar la salud. |
--group TEXT | Grupo objetivo nombrado (desde la configuración) para informar la salud. |
--config TEXT | Ruta a un archivo de configuración haltproof.toml. |
--format [human|json] | Formato de salida. |
--json | Abreviatura de --format=json. |
haltproof keygen
Genera un par de claves Ed25519 para la firma de atestaciones. La clave privada se escribe con permisos 0600 y nunca se imprime ni se registra.

Options:
--output TEXT Path to write the private key to.
--force Overwrite an existing key at the output path.
--format [human|json] Output format.
--json Shorthand for --format=json.
haltproof mcp-server
Inicia el servidor MCP de HaltProof en stdio, exponiendo halt, verify, verify_chain, status y keygen como herramientas MCP. Sin banderas más allá de --help.
Cada subcomando también acepta --help directamente para la misma referencia mostrada arriba.
Arquitectura
HaltProof tiene tres capas:
-
Capa de transporte: la CLI basada en Click (
haltproof.cli) y el servidor MCP (haltproof.mcp_server). Ambos son envoltorios delgados sobre las mismas funciones centrales enhaltproof.core, de modo que un humano que ejecuta la CLI y un agente que llama a la herramienta MCP obtienen un comportamiento idéntico, incluida la compuerta de simulación previa por defecto enhalt. -
Capa de backend: una interfaz abstracta
ClusterBackend(haltproof.backends.base) con cuatro operaciones:ClusterBackend ├── drain(nodes, dry_run, reason) -> stop new work being scheduled ├── isolate_network(nodes, dry_run) -> cut nodes off from the workload network ├── power_fence(nodes, dry_run) -> hard power off └── status(nodes) -> current reachability/stateTres backends la implementan hoy:
Backend drenar aislar_red apagado_físico Herramienta subyacente kubernetescordon + drain deny-all NetworkPolicy no soportado (usa ipmi)kubectlslurmscontrol update state=drainstate=power_down(hook SuspendProgram)no soportado (usa ipmi)scontrolipmino soportado (usa slurm/kubernetes)no soportado ipmitool chassis power offipmitoolUn backend que no soporta una operación dada devuelve un resultado
SKIPPEDcon una explicación en lugar de lanzar una excepción, de modo que una secuencia de apagado contra un entorno mixto aún produce un registro de atestación completo y honesto. Agregar soporte para un nuevo programador o herramienta de aislamiento significa agregar un módulo de backend y registrarlo enhaltproof.backends.detect, sin tocar las capas de orquestación o atestación.Orden de selección del backend: una bandera explícita
--backend, luego la clavebackenddel archivo de configuración, luego auto-detección basada en cuál dekubectl/scontrol/ipmitoolse encuentra enPATH. -
Capa de atestación (
haltproof.attestation): cada operación de apagado, simulada o real, produce un registro firmado y encadenado por hash y lo agrega a un registro local NDJSON de solo agregar.
Modelo de seguridad
- Firma. Los registros de atestación se firman con Ed25519 (biblioteca
cryptography). La clave pública de firma está incrustada en el propio registro, de modo quehaltproof verifypuede verificar la validez interna de la firma por sí solo. Pasa--trusted-keypara requerir adicionalmente que el registro esté firmado por una clave de operador específica conocida. - Evidencia de manipulación, por registro. La firma cubre todo el registro, operador, nodos objetivo, el comando y estado de cada paso, marcas de tiempo y el enlace de la cadena debajo, excepto el campo de firma en sí. Cambiar cualquier campo, incluido ocultar un paso fallido, invalida la firma.
- Evidencia de manipulación, a través del registro. La firma de un registro solo prueba que el contenido de ese registro no está alterado; no dice nada sobre si un registro completo fue eliminado o reordenado. Cada registro incorpora
prev_hash, el hash de contenido del registro inmediatamente anterior, de modo quehaltproof verify --chainpuede confirmar que los números de secuencia no tienen huecos y que cada enlace de la cadena coincide. - Manejo de claves.
haltproof keygenescribe la clave privada con permisos0600y nunca imprime ni registra material de clave, en la salida de la CLI, la salida JSON o el resultado de la herramienta MCP. Cualquiera que tenga la clave puede firmar registros que se verifican como tuyos, así que trátala como una clave privada SSH. - Credenciales BMC. El backend IPMI lee la contraseña BMC de la variable de entorno
IPMI_PASSWORDy pasaipmitool -E, de modo que nunca aparece como argumento de línea de comandos, en la lista de procesos o en el comando registrado del registro de atestación. - Simulación previa por defecto.
haltproof haltrequiere un--confirmexplícito para ejecutar cualquier cosa destructiva, aplicado en un único punto de estrangulamiento (haltproof.backends.runner.run_step) por el que pasan todos los backends. - Identidad del operador. Registrada desde, en orden, un
--operator-idexplícito, una identidad de certificado SSH si el entorno expone una, o el usuario del sistema operativo que ejecuta el comando.
Servidor MCP (para agentes de IA)
haltproof mcp-server
Inicia un servidor MCP en stdio exponiendo halt, verify, verify_chain, status y keygen como herramientas, construido sobre el SDK oficial de Python mcp. Un agente conectado a través de MCP obtiene el mismo comportamiento de simulación previa por defecto de halt y los mismos resultados con forma JSON que el modo --json de la CLI, porque la CLI y el servidor MCP llaman a las mismas funciones subyacentes en haltproof.core.
Comparación
HaltProof no compite con Slurm, Kubernetes o IPMI. Se sitúa sobre las herramientas que los operadores ya usan para esta tarea y añade lo que ninguna de ellas proporciona por sí sola: una interfaz, una puerta de seguridad y un registro firmado.
| Capacidad | HaltProof | kubectl (nativo) | scontrol (nativo) | ipmitool (nativo) |
|---|---|---|---|---|
| Comando único en Slurm + Kubernetes + IPMI | Sí | No, solo Kubernetes | No, solo Slurm | No, solo IPMI |
| Puerta de dry-run consistente antes de que cualquier backend ejecute | Sí, una bandera --confirm para los tres backends | Parcial: --dry-run=client solo valida sintaxis, no la mutación real del clúster | Sin modo de simulación integrado; state=drain surte efecto de inmediato | Sin concepto de dry-run para comandos de energía |
| Registro criptográficamente firmado de lo que se ejecutó | Sí, Ed25519 | No | No | No |
| Detecta un registro eliminado o reordenado en la pista de auditoría | Sí, registro encadenado por hash | No | No | No |
| Salida JSON estructurada para cada acción | Sí, cada comando | Parcial: -o json cubre comandos de lectura/obtención, no el resultado de la acción drain/cordon | No, solo texto plano | No, solo texto plano |
| Servidor MCP para invocación directa por agentes de IA | Sí | No | No | No |
Una búsqueda en GitHub realizada para esta auditoría (agosto de 2026) no encontró ningún proyecto de código abierto existente que combine orquestación de clústeres multi-backend unificada, una puerta de dry-run por defecto y una pista de auditoría encadenada por hash y criptográficamente firmada. Los proyectos adyacentes más cercanos, como los proxies de políticas de llamadas a herramientas de agentes de IA, operan una capa más arriba: interceptan y auditan lo que las llamadas a herramientas de un agente de IA pueden hacer, no el apagado a nivel de infraestructura de la propia computación subyacente. Consulta las preguntas frecuentes a continuación para ver cómo se relaciona HaltProof con esa categoría.
Qué es HaltProof y por qué existe
HaltProof es una capa de orquestación y prueba de auditoría sobre las primitivas de apagado de clústeres que los operadores ya confían: scontrol para Slurm, kubectl para Kubernetes, ipmitool para IPMI/BMC. No reimplementa el drenaje, el aislamiento o el corte de energía de un nodo. Llama a la herramienta real, protege la llamada detrás de una verificación de seguridad de dry-run por defecto y firma un registro a prueba de manipulaciones de exactamente qué se apuntó, qué se ejecutó y quién lo autorizó.
Existe porque tres problemas separados tienden a aparecer juntos durante un incidente real:
- Tres conjuntos de comandos diferentes bajo presión. Los operadores ya saben cómo drenar una partición de Slurm, aislar un grupo de nodos de Kubernetes o cortar la energía de un host físico mediante IPMI, pero hacerlo de manera consistente en los tres durante un incidente significa tres herramientas diferentes, tres convenciones de banderas diferentes y tres modos de fallo diferentes que recordar en el peor momento posible.
- Sin riel de seguridad compartido.
kubectl drain --dry-run=clientsolo valida sintaxis; no simula la mutación real del clúster.scontrol update state=drainsurte efecto en el momento en que lo ejecutas. Un grupo de destino mal escrito no tiene una forma consistente e independiente de la herramienta de detectarse antes de que algo real suceda. - Sin prueba después del hecho. Ninguna de las tres herramientas nativas produce un registro firmado y a prueba de manipulaciones de qué se apuntó, qué se ejecutó realmente, si tuvo éxito y quién lo autorizó. Construir esa capa de registro y firma por tu cuenta, para evidencia de gestión de cambios o para un marco de cumplimiento como las disposiciones de supervisión humana de la Ley de IA de la UE, significa escribirlo desde cero.
HaltProof es la capa que responde a los tres a la vez: una CLI y una superficie MCP, una puerta --confirm por la que pasan todos los backends y un registro de atestación encadenado por hash y firmado con Ed25519.
Preguntas frecuentes
¿Qué hace realmente HaltProof y cuál es su diferencia más marcada con simplemente escribir scripts de kubectl/scontrol/ipmitool directamente?
HaltProof llama a las mismas herramientas que llamarías directamente, scontrol, kubectl, ipmitool, pero envuelve cada llamada en una puerta de dry-run por defecto y produce un registro de atestación encadenado por hash y firmado con Ed25519. Un script hecho a mano puede llamar a los mismos comandos subyacentes, pero no se niega a ejecutar sin --confirm y no produce un registro que demuestre, después del hecho, que nada fue alterado o eliminado del registro.
¿HaltProof realmente corta la energía o el acceso a la red por sí mismo?
No. Llama a scontrol, kubectl y ipmitool, herramientas que ya ejecutas y en las que confías, y envuelve cada invocación en una puerta de dry-run y un registro firmado. HaltProof añade orquestación y prueba, no un nuevo mecanismo de apagado de bajo nivel.
¿Qué sistemas operativos y versiones de Python soporta HaltProof?
El paquete PyPI publicado está dirigido a Python 3.10 y superior, en Linux y macOS (consulta sus clasificadores Operating System :: POSIX :: Linux y Operating System :: MacOS). Aún no hay un clasificador para Windows, y el backend de IPMI en particular depende de ejecutar comandos externos a ipmitool, que no es el objetivo principal en Windows. Si lo necesitas allí, abre un issue.
¿En qué se diferencia esto de escribir un runbook o un playbook de Ansible que llame a las mismas herramientas? Un runbook o un playbook de Ansible puede llamar a los mismos comandos subyacentes, pero no produce un registro criptográficamente firmado y a prueba de manipulaciones de lo que realmente se ejecutó por sí solo; necesitarías construir esa capa de registro y firma por tu cuenta. HaltProof lo incluye como comportamiento predeterminado, y también te da una única puerta de dry-run por defecto en los tres backends en lugar de tres playbooks separados con tres convenciones de seguridad separadas.
¿Es esto un "interruptor de seguridad para IA"? No. HaltProof es una herramienta de respuesta a incidentes de infraestructura y auditoría de cumplimiento para operadores de clústeres. No tiene opinión sobre el comportamiento de los modelos de IA y no hace afirmaciones sobre seguridad o alineación de IA. Las herramientas que interceptan y auditan las llamadas individuales a herramientas de un agente de IA operan en una capa completamente diferente; HaltProof orquesta el apagado de la computación subyacente en sí, de la misma manera que lo haría para una carga de trabajo no relacionada con IA.
¿Qué sucede si la herramienta subyacente de un nodo no está instalada?
El backend correspondiente informa ese paso como failed con el error real, por ejemplo executable not found, y el registro de atestación aún se escribe y firma, por lo que el fallo en sí mismo pasa a formar parte del historial auditable.
¿Puedo usar HaltProof sin firmar atestaciones?
Sí, --no-sign omite la firma pero aún escribe el registro en el registro. Esto está pensado para pruebas locales, no para respuesta a incidentes en producción, ya que un registro sin firmar no puede verificarse como auténtico.
¿El registro de atestación necesita un servidor central?
No. Es un archivo NDJSON local de solo añadido por defecto. --remote-collector opcionalmente envía cada registro firmado a una URL que configures, para equipos que quieran una copia central, pero la verificación no depende de que ese servidor sea accesible.
¿Qué sucede si dos operadores ejecutan halt al mismo tiempo contra el mismo registro de atestación?
Los añadidos están bloqueados por archivo (fcntl.flock en POSIX) para que las escrituras no se intercalen, pero los números de secuencia se asignan leyendo el registro en el momento en que cada comando comienza. Apunta a ambos operadores a archivos de registro específicos del backend o por incidente si necesitas serialización estricta por operación.
¿Bajo qué licencia está HaltProof y puedo usarlo comercialmente? MIT. Puedes usar, modificar y redistribuirlo, incluso comercialmente, siempre que el aviso de copyright y el texto de la licencia permanezcan adjuntos. Consulta LICENSE.
Contribuciones
Las contribuciones son bienvenidas. Lee CONTRIBUTING.md primero: cubre la configuración de un entorno de desarrollo, la ejecución de la suite de pruebas (pytest -v --cov=haltproof --cov-report=term-missing) y los pasos para añadir un nuevo backend implementando la interfaz ClusterBackend. Los cambios que toquen la firma/verificación de atestaciones o la puerta de dry-run/--confirm reciben revisión adicional, según CODEOWNERS. Consulta SECURITY.md para informar una vulnerabilidad de forma privada en lugar de abrir un issue público.
git clone https://github.com/RudrenduPaul/HaltProof.git
cd HaltProof
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytest -v --cov=haltproof --cov-report=term-missing
Licencia
MIT © Rudrendu Paul y Sourav Nandy