# Correção cirúrgica — status transacional e VAS pré-validado ## Escopo Esta correção parte da versão estável anterior à expansão de `terminal outcomes` e altera apenas dois contratos já existentes. ### 1. `active_transaction` e `transaction_status` não podem divergir `AgentRuntimeMixin._set_active_transaction()` agora atualiza também `state["transaction_status"]` com o mesmo `status` da transação instalada. Isso evita que um status terminal da operação anterior (`COMPLETED`, por exemplo) sobreviva à criação de uma nova transação em `AWAITING_CONFIRMATION`. Sem essa invariável, o boundary do turno seguinte pode interpretar a nova confirmação como resíduo da transação encerrada e limpar seus latches antes do roteamento. Não foi criada regra para a palavra `sim`, nem bypass de roteamento. ### 2. VAS estratégico reutiliza resolução já validada `validar_vas_subject` já é o resolver autoritativo side-effect-free na fronteira transacional. Quando ele resolve um VAS e redireciona a ação para `tratar_vas_estrategico`, os `resolved_arguments` agora carregam: - `subject` canônico; - `_vas_subject_prevalidated=true`; - `type` quando conhecido (`bundle`/`estrategico`). Na execução da tool estratégica, `_preflight_subject()` não executa uma segunda resolução por `invoice_evidence` quando esse marcador está presente. Isso evita o caso em que `Aya Audiobooks Premium` era `ELIGIBLE` na pré-validação e depois virava `NEEDS_PARAMETER / subject_not_resolved` ao executar a tool efetiva. ## O que não foi alterado - `agent_graph` e reset global de contexto; - route stickiness; - confirmation classifier; - estados terminais globais; - idempotência; - guardrails; - fluxo de múltiplos VAS. ## Testes - testes direcionados novos + relacionados: 16 PASS; - VAS/transação/cancelamento/conversation policy: 420 PASS; - suíte `tests/migration`: 833 PASS / 2 FAIL históricos já existentes e não relacionados.