Gostei do jeito como você colocou a fronteira entre o LLM e o código que realmente executa a ação. Para mim, esse é o ponto que separa demo de produção.
Uma coisa que eu adicionaria nesse desenho é versionar o contrato do JSON junto com as regras determinísticas. Quando o prompt muda, às vezes a saída continua válida no schema, mas muda a intenção em detalhes pequenos.
Ter schema_version, motivo de rejeição e alguns exemplos reais congelados ajuda a descobrir se o agente melhorou de verdade ou só aprendeu a “passar no validador”.
Você chegou a montar alguma suite de casos reais, incluindo casos rejeitados, para evoluir essas regras?