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):

Python
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:

Python
# ... 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

Postagens mais visitadas deste blog

A NOVA FRONTEIRA DA CRISPR: O CORAÇÃO SOB EDIÇÃO

200 Anos de Crise: da Guerra do Ópio ao Leviatã Digital

Futuro 1.0 — O Dia em que o Mundo Acelerou