fix(squad): auditor para de poder alegar arquivo persistido sem evidência - #42
Merged
Conversation
…ncia Diagnóstico de um run real (forge squad pedindo um .html que nunca apareceu no disco) apontou corretamente que o squad não tem executor de ferramentas hoje (RunTool ainda Unimplemented) — mas generalizou demais ao dizer que o auditor nunca vê a saída do developer. Conferido contra o código: validate_results (fim de execute_complex_task) já recebia execution_results reais, incluindo final_output. A cegueira genuína era só a chamada per-step audit() (ação "validate" explícita no plano), cujo step_task carregava só description/action/step. - auditor.py: os dois prompts (_AUDIT_SYSTEM_PROMPT, _VALIDATE_RESULTS_SYSTEM_PROMPT) proíbem explicitamente alegar que um arquivo foi criado/salvo/persistido — nenhum caminho tem evidência de filesystem enquanto RunTool não existir, então nenhum dos dois pode honestamente afirmar isso, mesmo vendo o final_output real. - orchestrator.py: _execute_plan_steps passa prior_results (resultados reais acumulados, não sintéticos) no step_task; auditor.py::audit() repassa isso ao gateway como prior_agent_results quando presente. - Testes deterministicos (ScriptedGatewayClient/RoutingGatewayClient, sem LLM real): prompt proíbe a alegação, prior_results chega ao payload só quando presente, e um plano real de 2 passos prova que só a chamada per-step do auditor carrega os resultados do passo anterior. - pendencias.md: registra o achado, as duas correções ao diagnóstico externo (auditor não é cego na forma generalizada; run_tool não é "herdado", é hardcoded no impl do CoreService) e o gap remanescente (RunTool + loop ReAct, PRs futuras). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016kDm3viu7mJm6n5zphKwAF
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Onda 0 de um parecer de engenharia maior sobre o squad não materializar artefatos em disco (
forge squad "crie uma calculadora científica... gere um .html"não produziu arquivo nenhum numa VPS real). O parecer diagnosticou corretamente a causa raiz —CoreService::RunToolaindaUnimplemented(core_server.rs:99), o developer faz uma única chamada de LLM sem tocar disco — mas generalizou demais ao afirmar que "o auditor nunca vê a saída do developer". Conferi contra o código antes de implementar:validate_results(chamado incondicionalmente ao fim deexecute_complex_task,orchestrator.py:155) já recebiaexecution_resultsreais, incluindo ofinal_outputdo developer — o veredito que decideoverall_successnão era cego ao conteúdo.audit()(quando o plano inclui uma ação"validate"explícita, mapeada pro auditor via_select_agent_for_step) —step_task(orchestrator.py:248-252) carregava sódescription/action/step, sem nenhum resultado anterior.Isso mudou o escopo desta Onda 0 de "rotear resultados pro auditor" (já acontecia) para dois pontos mais específicos:
auditor.py—_AUDIT_SYSTEM_PROMPTe_VALIDATE_RESULTS_SYSTEM_PROMPTganham proibição explícita de alegar que um arquivo foi criado/salvo/persistido. Nenhum caminho tem evidência de filesystem hoje (semRunTool, nada escreve disco) — nenhum dos dois pode honestamente afirmar isso, mesmo vendo ofinal_outputreal.orchestrator.py::_execute_plan_steps—step_taskganhaprior_results(resultados reais acumulados até aquele passo, não um resumo sintético).auditor.py::audit()repassa isso ao gateway comoprior_agent_resultsquando presente (a proposta inicial em_get_squad_proposals, semprior_results, continua sem essa chave).Fora desta entrega (registrado em
pendencias.mdcomo trabalho futuro): Onda 1 (RunToolreal no Rust — o contrato já existe no proto, zero breaking) e Onda 2 (loop ReAct no developer). São a peça que faz um arquivo aparecer de verdade no disco; esta PR só impede o auditor de fingir que isso já acontece.Test plan
uv run pytest packages/forge-squad -q— 125/125 (5 testes novos: proibição textual dos 2 prompts,audit()repassa/omiteprior_agent_resultscorretamente, fluxo real de 2 passos viaUnifiedOrchestratorprovando que só a chamada per-step do auditor carrega os resultados do passo anterior)uv run pytest -q(workspace Python completo) — 157/157ScriptedGatewayClient/RoutingGatewayClient— nenhuma chamada de LLM realGenerated by Claude Code