adding ABANDON in multi-intent/intent-shift

This commit is contained in:
2026-09-17 00:05:54 -03:00
parent f293dd9d4b
commit 3b03bdbdab
46 changed files with 2039 additions and 92 deletions

View File

@@ -184,7 +184,7 @@ stateDiagram-v2
[*] --> COLLECTING_PARAMETERS: faltam dados
COLLECTING_PARAMETERS --> COLLECTING_PARAMETERS: dado parcial ou correção
COLLECTING_PARAMETERS --> AWAITING_CONFIRMATION: contrato completo + pre-validation OK
COLLECTING_PARAMETERS --> CANCELLED: abandono explícito / intent shift autorizado
COLLECTING_PARAMETERS --> CANCELLED: ABANDON explícito ou interrupção autorizada da ação ativa
AWAITING_CONFIRMATION --> EXECUTING: confirmação SIM
AWAITING_CONFIRMATION --> CANCELLED: confirmação NÃO
@@ -288,41 +288,73 @@ Mas stickiness **não pode aprisionar a conversa**. Uma nova solicitação expl
---
## P.7. Intent shift
## P.7. Intent shift e ABANDON
Intent shift é o mecanismo usado quando o cliente abandona ou interrompe explicitamente o assunto corrente e inicia outro.
Durante uma transação ativa, o `EnterpriseRouter` passa a distinguir três decisões semânticas:
Exemplo:
| Decisão | Significado | Efeito operacional |
| --- | --- | --- |
| `CONTINUE` | a fala ainda pertence à transação atual | mantém coleta/confirmação atual |
| `SHIFT` | o cliente iniciou outro objetivo, sem desistir explicitamente da ação atual | muda o foco de roteamento; `pending_topics` de outros objetivos permanecem disponíveis |
| `ABANDON` | o cliente desistiu explicitamente da ação/transação atual | encerra a transação ativa como `CANCELLED`; não apaga `pending_topics` não relacionados |
`ABANDON` é uma **decisão do router**, não um novo valor persistente de `transaction_status`. O estado terminal operacional continua sendo `CANCELLED`. Para abandono puro, sem novo objetivo, o router usa o intent técnico `state:TRANSACTION_ABANDONED` com `mcp_tools=[]`, evitando que a mesma tool seja selecionada novamente no próprio turno.
Exemplo de `ABANDON` com novo objetivo:
```text
Agente: Qual cobrança deseja contestar?
Cliente: Esquece isso. Quero ver minha fatura.
```
O comportamento esperado é:
Comportamento esperado:
```text
transação anterior
COLLECTING_PARAMETERS
↓
detecção de abandono / mudança explícita
ABANDON
↓
CANCELLED
transaction_interruption = explicit_abandonment
↓
limpeza de next_state / parâmetros / latches
transação ativa = CANCELLED
↓
limpeza de next_state / parâmetros / latches da ação abandonada
↓
novo routing
↓
contas_invoice_query
billing_invoice_explanation
```
O router registra metadados como:
Exemplo de abandono puro:
```text
transaction_interruption = intent_shift
Agente: Informe o número do pedido que deseja cancelar.
Cliente: Não quero mais cancelar.
```
e o runtime encerra corretamente o contrato anterior.
Resultado esperado:
```text
decision = ABANDON
intent = state:TRANSACTION_ABANDONED
mcp_tools = []
transaction_interruption = explicit_abandonment
transaction_status = CANCELLED
```
O runtime registra `tool_policy_result.action = cancelled_by_explicit_abandonment`.
Um `SHIFT` continua separado de `ABANDON`. Exemplo:
```text
Agente: Informe o número do pedido que deseja devolver.
Cliente: Antes disso, quero consultar os serviços que contratei.
```
Nesse caso, a nova solicitação pode ser executada sem apagar automaticamente as ações presentes em `pending_topics`. A fila multi-intent permanece uma estrutura de trabalho autorizado; mudar o foco não equivale a desistir de todas as ações anteriores.
> Importante: nem `SHIFT` nem `ABANDON` limpam globalmente `pending_topics`. `ABANDON` encerra a ação/transação **ativa**. Outras operações pendentes continuam correlacionadas ao plano e podem ser retomadas conforme a política de multi-intent.
### Intent shift não é qualquer frase diferente