analise de duplo comando de decisão praxium / praxium web
analise de duplo comando de decisão praxium / praxium web
Ação Corretiva Imediata: Centralizar Execuções no run.py
Como você escolheu (A), vamos focar em fazer o run.py o único ponto oficial de entrada para tarefas, garantindo validação pelo schema e registro no ledger para tudo (CLI e Web). Isso elimina bypass, reforça a modularidade e alinha com o padrão Kaizen do PRAXIUM (incremental, auditável, sem duplicação).
Passo 1: Restaurar e Atualizar o WEB/app.py para Delegar (não Executar Direto)
O app.py atual usa simple_executor.py, que quebra o padrão. Vamos revertê-lo para o modelo do seu app.py.backup2 (que enfileira em INPUT/COMMANDS), mas com melhorias para segurança e consistência.
Salve isso como WEB/app.py (substitua o atual; backup o antigo primeiro):
from flask import Flask, request, jsonify, render_template
import os
import json
import uuid
from datetime import datetime
app = Flask(__name__, template_folder='templates')
# Paths padronizados (alinhado com o PRAXIUM core)
INPUT_COMMANDS_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'INPUT', 'COMMANDS')
SCHEMA_PATH = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'SCHEMAS', 'command_full.v1.schema.json')
# Carrega schema para validação básica no Web (mas run.py faz a pesada)
with open(SCHEMA_PATH, 'r') as f:
COMMAND_SCHEMA = json.load(f)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/api/run', methods=['POST'])
def run_command():
data = request.json
if not data or 'cmd_id' not in data:
return jsonify(success=False, stderr="Comando inválido (faltando cmd_id)"), 400
# Validação mínima no Web (full no run.py)
required_fields = COMMAND_SCHEMA.get('required', [])
missing = [field for field in required_fields if field not in data]
if missing:
return jsonify(success=False, stderr=f"Campos obrigatórios ausentes: {missing}"), 400
# Gera arquivo JSON em INPUT/COMMANDS (o run.py processa)
cmd_file = os.path.join(INPUT_COMMANDS_DIR, f"cmd_{uuid.uuid4()}_{datetime.now().isoformat()}.json")
try:
with open(cmd_file, 'w') as f:
json.dump(data, f, indent=2)
return jsonify(success=True, stdout=f"Comando enfileirado em {cmd_file}. Aguardando processamento pelo core."), 200
except Exception as e:
return jsonify(success=False, stderr=str(e)), 500
if __name__ == '__main__':
app.run(host='127.0.0.1', port=8787, debug=True)- Por quê isso corrige? Web vira só "ingestor" (cria CMD JSON). Execução real fica no run.py (que lê, valida schema, executa via executor.py, e registra no ledger). Sem shell=True no Web, sem whitelist duplicada.
- Teste rápido: Rode o Flask (python WEB/app.py), envie um POST para /api/run com {"cmd_id": "list_ws"}, verifique se cria arquivo em INPUT/COMMANDS (sem executar na hora). Depois rode python run.py --once para processar e checar ledger.
Passo 2: Desativar Bypass Existentes
- Mova WEB/simple_executor.py para WEB/deprecated/simple_executor.py (ou delete se não precisa mais).
- No TEMP/execute_command.py, adicione um check: se chamado direto (não via executor.py), logue warning e redirecione para run.py.
- Atualize docs/README: "Todas execuções devem enfileirar em INPUT/COMMANDS e rodar via run.py."
Passo 3: Métricas Iniciais para Verificar Conformidade
Adicione ao executor.py (fim da função principal) um log simples de métrica:
# ... após execução
metrics = {"duration_sec": time.time() - start_time, "status": "ok" if success else "fail", "has_evidence": bool(evidence)}
with open(ledger_path, 'a') as f:
f.write(json.dumps({"metrics": metrics}) + '\n')Isso permite auditar: taxa de fail, tempo médio, % com evidência (alinhado com Verdade/Bem/Justo).
Pergunta 3 (próxima, linear): Com o run.py como único entry point, como tratar exceções/erro no pipeline (ex.: comando inválido no schema)? (A) Rejeitar e logar no ledger como fail (conservador, auditável). (B) Tentar reparo automático (útil, mas risco de deriva). (C) Pedir confirmação manual via Web/CLI (seguro, mas lento). Responda só com A, B ou C.
Comentários
Postar um comentário