Se completo la capa de politicas de herramientas del AI-LAB. Las reglas de tools salen del codigo y se vuelven declarativas en runtime/policies/tools/.

runtime/policies/tools/
├── blocked_tools.json # Lista maestra global (nunca se sobreescribe)
├── manifest_tools.json # Mapeo perfil -> politica
├── disabled_policy.json # Sin tools (rutas ligeras)
├── readonly_policy.json # Solo lectura (coding)
├── agent_policy.json # Tools completas con confirmacion
└── policy_loader.py # Loader con apply_tool_policy()
ModoComportamientoUso
disabledTodas las tools eliminadasminimal, casual, greeting, observe, chat, analysis
readonlySolo herramientas en allowed_namescoding
agenticTools preservadas (solo master bloqueadas)tool_use, tool_fastpath
blocked_tools.json (GLOBAL MASTER)
-> politica.blocked_names (override por perfil)
-> politica.allowed_names (filtro positivo)
-> guard hardcoded (tool_call_is_dangerous, qwen2.5 pop)

Un solo punto de inyeccion: apply_profile() en profile_loader.py. No se toco router_api.py ni openai_gateway.py.

Se mantiene "tools": {"allowed": false} en los perfiles como fallback legacy.

GuardMotivo
_DANGEROUS_COMMAND_MARKERSCircuit breaker global
tool_call_is_dangerous()Validacion post-respuesta
GOVERNANCE_BLOCKEDMetrica de seguridad
qwen2.5-coder-14b pop toolsProteccion de modelo

Cada payload recibe:

  • _tool_policy = nombre de la politica ("disabled", "readonly", "agent")
  • _tool_mode = modo ("disabled", "readonly", "agentic")
  • _tool_source = "manifest_tools"
RutaModoResultado
minimal con toolsdisabledtools eliminadas
general con toolsdisabledtools eliminadas
casual con toolsdisabledtools eliminadas
coding con read+bash+writereadonlysolo read preservada
agent con bash+read+writeagentictodas preservadas (master none blocked)
Terminal window
cp /opt/ai-lab/snapshots/fase22a-backup/profile_loader.py /opt/ai-lab/runtime/profiles/
sudo systemctl restart ailab-router ailab-gateway

FASE 22B — Shell sandboxing, bash_allowed_commands, parsing de comandos y ejecucion segura.