Piloto automático
El piloto automático
Un interruptor en la barra superior (✈️). Con él encendido JMAX hace la tarea entera sin pedir permiso, y solo se detiene ante algo de lo que no se vuelve.
Para qué
Una tarea larga —revisar cien archivos, montar un despliegue, recorrer un sitio— muere si cada paso abre un cuadro de confirmación. Con voz es todavía peor: nadie va a contestar veinte veces «sí».
Qué levanta
| Sin piloto | Con piloto | |
|---|---|---|
| Acciones con efecto (escribir, borrar, enviar, ejecutar) | pregunta | no pregunta |
| Ratón y teclado | según el modo control | no pregunta |
Carpetas permitidas (fs_write_roots) | acota | no acota |
| Lista blanca de la consola | acota | no acota |
| Encadenar órdenes (` | , >, &&`) | prohibido |
Se decidió así a propósito: autonomía completa. Las carpetas y la lista blanca no son un cuadro de diálogo, pero sí son un límite, y con el piloto encendido dejan de estarlo.
Qué NO levanta: el peligro vital
jmax/security/peligro.py. Son las acciones que pueden dejar a JMAX
inservible. Si JMAX se apaga a mitad de una tarea, no queda nadie para
terminarla ni para contarlo.
| Motivo | Qué caza |
|---|---|
apagar_o_reiniciar | shutdown, reboot, Restart-Computer, logoff, systemctl poweroff |
borrar_lo_suyo | cualquier ruta bajo la instalación, o con nombre propio de JMAX (config, data, secrets.env, master.key, licencias…) |
borrar_del_sistema | C:/Windows, /etc, C:/Users/<alguien>, la raíz de una unidad |
borrado_masivo | rm -rf, Remove-Item -Recurse, del /s, comodines |
formatear_disco | diskpart, mkfs, format c:, Clear-Disk |
matar_su_propio_proceso | taskkill/Stop-Process sobre python, jmax o uvicorn |
registro_critico | claves de HKLM\System y reg delete |
Se clasifica por lo que la acción HACE, no por cómo se llama. Los
conectores MCP traen herramientas con nombres que nadie conoce de antemano,
y pc_powershell es inofensivo o letal según lo que lleve dentro. Se miran
el nombre y los argumentos: la orden de consola, y las rutas, tanto en
los parámetros como escritas dentro del propio comando.
Este peligro manda sobre todo lo demás, incluida la válvula never_confirm y
los permisos concedidos a un agente.
Cuando pregunta, dice por qué
Con el piloto encendido nadie espera una pregunta, así que el cuadro lleva el motivo en la misma frase: «ATENCIÓN: va a apagar o reiniciar el equipo.» Un «¿seguro?» a secas no deja decidir nada.
Reiniciar pasó de «ni pidiéndolo» a «con tu permiso»
_POWERSHELL_BLOQUEADO rechazaba de plano apagar y reiniciar. Eso hacía que
JMAX pidiera permiso y luego se negara igual —lo peor de las dos cosas—.
Ahora son peligro vital: se detienen, preguntan, y decides tú.
Lo que sigue prohibido de plano, porque no es «la vida de JMAX» sino un
control de seguridad, y ninguna tarea legítima lo necesita a mitad de camino:
formatear un volumen, borrar un usuario local, abrir la política de ejecución
y descargar-y-ejecutar (Invoke-WebRequest -OutFile, Start-BitsTransfer).
Por eso no se pregunta por ellas: un cuadro de confirmación sobre algo ya
decidido solo sirve para hacer creer al usuario que manda él.
Arranca siempre apagado
Y no se guarda en ningún ajuste. Un piloto que sobreviviera al reinicio dejaría a JMAX trabajando solo desde el primer segundo de un arranque que nadie está mirando, quizá días después de haberlo encendido. Si hace falta, se enciende.
Se ve desde la puerta
El botón encendido va en ámbar con un latido suave, no con el cambio de color discreto de los demás. No darse cuenta de que está activo es exactamente lo que no puede pasar. Quien tenga desactivadas las animaciones del sistema ve el fondo ámbar sin el latido.
El estado lo manda el servidor, no la ventana. El botón no se pinta al pulsarlo: envía el mensaje y espera la respuesta. Antes se pintaba primero, y si el socket no estaba abierto —al arrancar, tras una reconexión— el envío fallaba en silencio y el botón se quedaba encendido con el guardián apagado. Un interruptor de seguridad que miente sobre su estado es peor que no tenerlo. Sin conexión, avisa y no cambia nada.
Alcance
Vale para toda la casa —ventana y canales—: es un interruptor de la máquina, no de una conversación.
Lo que esto NO es
No es un aislamiento. No detecta un borrado destructivo disfrazado: un script que JMAX escribe y luego ejecuta, una orden ofuscada, un comando que llama a otro. Es una red que caza lo evidente, y con el piloto apagado no hace falta porque entonces todo pregunta.
Probarlo
python -m pytest tests/test_piloto_automatico.py -q
32 casos: que con el piloto lo corriente no pregunta, que el peligro vital pregunta siempre, y —tan importante como lo anterior— que el trabajo corriente no se marca como peligro. Un piloto que pregunta por todo no sirve para nada.