Skip to content

fix(squad): auditor para de poder alegar arquivo persistido sem evidência - #42

Merged
danzeroum merged 1 commit into
mainfrom
claude/squad-auditor-honesty
Jul 7, 2026
Merged

fix(squad): auditor para de poder alegar arquivo persistido sem evidência#42
danzeroum merged 1 commit into
mainfrom
claude/squad-auditor-honesty

Conversation

@danzeroum

Copy link
Copy Markdown
Owner

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::RunTool ainda Unimplemented (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 de execute_complex_task, orchestrator.py:155) já recebia execution_results reais, incluindo o final_output do developer — o veredito que decide overall_success não era cego ao conteúdo.
  • A cegueira genuína era só a chamada per-step 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:

  1. auditor.py_AUDIT_SYSTEM_PROMPT e _VALIDATE_RESULTS_SYSTEM_PROMPT ganham proibição explícita de alegar que um arquivo foi criado/salvo/persistido. Nenhum caminho tem evidência de filesystem hoje (sem RunTool, nada escreve disco) — nenhum dos dois pode honestamente afirmar isso, mesmo vendo o final_output real.
  2. orchestrator.py::_execute_plan_stepsstep_task ganha prior_results (resultados reais acumulados até aquele passo, não um resumo sintético). auditor.py::audit() repassa isso ao gateway como prior_agent_results quando presente (a proposta inicial em _get_squad_proposals, sem prior_results, continua sem essa chave).

Fora desta entrega (registrado em pendencias.md como trabalho futuro): Onda 1 (RunTool real 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/omite prior_agent_results corretamente, fluxo real de 2 passos via UnifiedOrchestrator provando que só a chamada per-step do auditor carrega os resultados do passo anterior)
  • uv run pytest -q (workspace Python completo) — 157/157
  • Testes determinísticos via ScriptedGatewayClient/RoutingGatewayClient — nenhuma chamada de LLM real

Generated by Claude Code

…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
@danzeroum
danzeroum merged commit 7588cf4 into main Jul 7, 2026
9 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants