# Correção da confirmação transacional x FRASEOLOGIA — 2026-08-21

## Sintoma observado

Para a entrada `quero cancelar o serviço TIM Fashion`, o fluxo entrava corretamente em `AWAITING_CONFIRMATION`, e o guardrail `AOFERTA` permitia a resposta. Porém a confirmação determinística era montada a partir do nome técnico da tool:

`Você confirma cancelar vas avulso?`

O guardrail `FRASEOLOGIA` bloqueava essa saída porque `vas avulso` é nomenclatura interna.

## Causa raiz

`AgentRuntimeMixin.transaction_confirmation_message()` convertia o nome da tool com `tool_name.replace("_", " ")` quando não havia label explícito. Para `cancelar_vas_avulso`, isso vazava o identificador técnico para a resposta ao cliente.

## Correção

Quando a tool representa cancelamento (`cancelar_*`) e os argumentos pendentes possuem `subject`, a confirmação passa a ser construída com o nome comercial do item:

`Você confirma o cancelamento do serviço {subject}? Responda 'sim' para executar ou 'não' para cancelar.`

Exemplo:

`Você confirma o cancelamento do serviço TIM Fashion? Responda 'sim' para executar ou 'não' para cancelar.`

A correção preserva o comportamento anterior das demais confirmações, como devolução e troca de pedidos.

## Teste de regressão

Adicionado `agent_framework_oci/tests/test_transaction_confirmation_customer_facing.py`, garantindo que:

- `cancelar_vas_avulso` com `subject=TIM Fashion` nunca exponha `vas avulso` nem `cancelar_vas_avulso`;
- o nome comercial apareça na confirmação;
- confirmações existentes de varejo continuem idênticas.
